aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2009-09-13 23:45:39 +0000
committerNick Lewycky <nicholas@mxc.ca>2009-09-13 23:45:39 +0000
commitbc6836bbe364dfe6ac842d476fb61bb4244b8936 (patch)
tree410a5940e6106094d6b0b69c0fdeacad6431b8cf
parente7f3107772b1c8c2b9397ab19106b8451d31e8ab (diff)
Actually remove old types from the set.
Also break the type verification stuff into its own TypeSet to keep the Verifier pass from becoming an AbstractTypeUser. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81729 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/VMCore/Verifier.cpp42
1 files changed, 30 insertions, 12 deletions
diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp
index 6b70008aba..9f7be43b54 100644
--- a/lib/VMCore/Verifier.cpp
+++ b/lib/VMCore/Verifier.cpp
@@ -107,8 +107,33 @@ PreVer("preverify", "Preliminary module verification");
static const PassInfo *const PreVerifyID = &PreVer;
namespace {
- struct Verifier : public FunctionPass, public InstVisitor<Verifier>,
- public AbstractTypeUser {
+ struct TypeSet : public AbstractTypeUser {
+ SmallSet<const Type *, 16> Types;
+
+ /// Insert a type into the set of types.
+ bool insert(const Type *Ty) {
+ bool Inserted = Types.insert(Ty);
+ if (!Inserted)
+ return false;
+
+ if (Ty->isAbstract())
+ Ty->addAbstractTypeUser(this);
+ return true;
+ }
+
+ // Abstract type user interface.
+
+ /// Remove types from the set when refined. Do not insert the type it was
+ /// refined to because that type hasn't been verified yet.
+ void refineAbstractType(const DerivedType *OldTy, const Type *NewTy) {
+ Types.erase(OldTy);
+ OldTy->removeAbstractTypeUser(this);
+ }
+ void typeBecameConcrete(const DerivedType *AbsTy) {}
+ void dump() const {}
+ };
+
+ struct Verifier : public FunctionPass, public InstVisitor<Verifier> {
static char ID; // Pass ID, replacement for typeid
bool Broken; // Is this module found to be broken?
bool RealPass; // Are we not being run by a PassManager?
@@ -126,8 +151,8 @@ namespace {
/// an instruction in the same block.
SmallPtrSet<Instruction*, 16> InstsInThisBlock;
- /// CheckedTypes - keep track of the types that have been checked already.
- SmallSet<const Type *, 16> CheckedTypes;
+ /// Types - keep track of the types that have been checked already.
+ TypeSet Types;
Verifier()
: FunctionPass(&ID),
@@ -337,13 +362,6 @@ namespace {
WriteType(T3);
Broken = true;
}
-
- // Abstract type user interface.
- void refineAbstractType(const DerivedType *OldTy, const Type *NewTy) {
- CheckedTypes.erase(OldTy);
- }
- void typeBecameConcrete(const DerivedType *AbsTy) {}
- void dump() const {}
};
} // End anonymous namespace
@@ -1467,7 +1485,7 @@ void Verifier::visitInstruction(Instruction &I) {
/// VerifyType - Verify that a type is well formed.
///
void Verifier::VerifyType(const Type *Ty) {
- if (!CheckedTypes.insert(Ty)) return;
+ if (!Types.insert(Ty)) return;
switch (Ty->getTypeID()) {
case Type::FunctionTyID: {