mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-29 22:50:47 +00:00
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:
parent
e7f3107772
commit
bc6836bbe3
@ -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: {
|
||||||
|
Loading…
Reference in New Issue
Block a user