summaryrefslogtreecommitdiffstats
path: root/llvm/lib
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
commit9818bab2dc04edb1e1d4f1ed6974e276386d37c4 (patch)
tree1c0f41808507afc2fad50540a60ce5e5b887e01e /llvm/lib
parent108308aa91408010ca969a7b11227c9264b787f1 (diff)
downloadbcm5719-llvm-9818bab2dc04edb1e1d4f1ed6974e276386d37c4.tar.gz
bcm5719-llvm-9818bab2dc04edb1e1d4f1ed6974e276386d37c4.zip
* 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 llvm-svn: 1840
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/VMCore/SymbolTable.cpp18
1 files changed, 16 insertions, 2 deletions
diff --git a/llvm/lib/VMCore/SymbolTable.cpp b/llvm/lib/VMCore/SymbolTable.cpp
index ab15eb6eec6..80f8e100e83 100644
--- a/llvm/lib/VMCore/SymbolTable.cpp
+++ b/llvm/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
OpenPOWER on IntegriCloud