diff options
author | Chris Lattner <sabre@nondot.org> | 2002-03-08 20:26:17 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-03-08 20:26:17 +0000 |
commit | e82f1c6cb715cea962b4aa25cf617fa9f9f85fa8 (patch) | |
tree | 7dd3a5a8fb1adf641f556d6dd42d4a6590c7648c /lib/VMCore/SymbolTable.cpp | |
parent | 34538145f4852b439438bd956d4bd8a67db1fab5 (diff) |
* Add new method localLookup
* SymbolTable::remove(Value *N) checks to see if we are internally
inconsistent before looking for a type plane (caused a crash)
* insertEntry now does a local lookup instead of a global lookup, which was
causing an infinite loop in the renamer logic.
* Added assertions to make sure stuff stays happy
* Now the linker correctly links the SPECINT2000 mcf benchmark
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1840 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/SymbolTable.cpp')
-rw-r--r-- | lib/VMCore/SymbolTable.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/lib/VMCore/SymbolTable.cpp b/lib/VMCore/SymbolTable.cpp index ab15eb6eec..80f8e100e8 100644 --- a/lib/VMCore/SymbolTable.cpp +++ b/lib/VMCore/SymbolTable.cpp @@ -73,7 +73,7 @@ string SymbolTable::getUniqueName(const Type *Ty, const string &BaseName) { // lookup - Returns null on failure... -Value *SymbolTable::lookup(const Type *Ty, const string &Name) { +Value *SymbolTable::localLookup(const Type *Ty, const string &Name) { iterator I = find(Ty); if (I != end()) { // We have symbols in that plane... type_iterator J = I->second.find(Name); @@ -81,13 +81,23 @@ Value *SymbolTable::lookup(const Type *Ty, const string &Name) { return J->second; } + return 0; +} + +// lookup - Returns null on failure... +Value *SymbolTable::lookup(const Type *Ty, const string &Name) { + Value *LV = localLookup(Ty, Name); + if (LV) return LV; return ParentSymTab ? ParentSymTab->lookup(Ty, Name) : 0; } void SymbolTable::remove(Value *N) { assert(N->hasName() && "Value doesn't have name!"); + if (InternallyInconsistent) return; iterator I = find(N->getType()); + assert(I != end() && + "Trying to remove a type that doesn't have a plane yet!"); removeEntry(I, I->second.find(N->getName())); } @@ -142,9 +152,11 @@ Value *SymbolTable::removeEntry(iterator Plane, type_iterator Entry) { // name... // void SymbolTable::insertEntry(const string &Name, const Type *VTy, Value *V) { + // Check to see if there is a naming conflict. If so, rename this value! - if (lookup(VTy, Name)) { + if (localLookup(VTy, Name)) { string UniqueName = getUniqueName(VTy, Name); + assert(InternallyInconsistent == false && "Infinite loop inserting entry!"); InternallyInconsistent = true; V->setName(UniqueName, this); InternallyInconsistent = false; @@ -243,6 +255,8 @@ void SymbolTable::refineAbstractType(const DerivedType *OldType, // that turns remove into a noop. Thus the name will get null'd // out, but the symbol table won't get upset. // + assert(InternallyInconsistent == false && + "Symbol table already inconsistent!"); InternallyInconsistent = true; // Remove newM from the symtab |