summaryrefslogtreecommitdiff
path: root/lib/VMCore/SymbolTable.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-03-08 20:26:17 +0000
committerChris Lattner <sabre@nondot.org>2002-03-08 20:26:17 +0000
commite82f1c6cb715cea962b4aa25cf617fa9f9f85fa8 (patch)
tree7dd3a5a8fb1adf641f556d6dd42d4a6590c7648c /lib/VMCore/SymbolTable.cpp
parent34538145f4852b439438bd956d4bd8a67db1fab5 (diff)
downloadllvm-e82f1c6cb715cea962b4aa25cf617fa9f9f85fa8.tar.gz
llvm-e82f1c6cb715cea962b4aa25cf617fa9f9f85fa8.tar.bz2
llvm-e82f1c6cb715cea962b4aa25cf617fa9f9f85fa8.tar.xz
* 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.cpp18
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