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
This commit is contained in:
Nick Lewycky 2009-09-13 23:45:39 +00:00
parent e7f3107772
commit bc6836bbe3

View File

@ -107,8 +107,33 @@ PreVer("preverify", "Preliminary module verification");
static const PassInfo *const PreVerifyID = &PreVer; static const PassInfo *const PreVerifyID = &PreVer;
namespace { namespace {
struct Verifier : public FunctionPass, public InstVisitor<Verifier>, struct TypeSet : public AbstractTypeUser {
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 static char ID; // Pass ID, replacement for typeid
bool Broken; // Is this module found to be broken? bool Broken; // Is this module found to be broken?
bool RealPass; // Are we not being run by a PassManager? bool RealPass; // Are we not being run by a PassManager?
@ -126,8 +151,8 @@ namespace {
/// an instruction in the same block. /// an instruction in the same block.
SmallPtrSet<Instruction*, 16> InstsInThisBlock; SmallPtrSet<Instruction*, 16> InstsInThisBlock;
/// CheckedTypes - keep track of the types that have been checked already. /// Types - keep track of the types that have been checked already.
SmallSet<const Type *, 16> CheckedTypes; TypeSet Types;
Verifier() Verifier()
: FunctionPass(&ID), : FunctionPass(&ID),
@ -337,13 +362,6 @@ namespace {
WriteType(T3); WriteType(T3);
Broken = true; 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 } // End anonymous namespace
@ -1467,7 +1485,7 @@ void Verifier::visitInstruction(Instruction &I) {
/// VerifyType - Verify that a type is well formed. /// VerifyType - Verify that a type is well formed.
/// ///
void Verifier::VerifyType(const Type *Ty) { void Verifier::VerifyType(const Type *Ty) {
if (!CheckedTypes.insert(Ty)) return; if (!Types.insert(Ty)) return;
switch (Ty->getTypeID()) { switch (Ty->getTypeID()) {
case Type::FunctionTyID: { case Type::FunctionTyID: {