Fix bug: Assembler/2002-12-15-GlobalResolve.ll
authorChris Lattner <sabre@nondot.org>
Sun, 15 Dec 2002 16:41:52 +0000 (16:41 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 15 Dec 2002 16:41:52 +0000 (16:41 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5039 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/SymbolTable.cpp

index dab2645d292da307bf264a52fd12b8d26fec83e2..70f23c286d076f177cc09f6d44f36d51abc4a520 100644 (file)
@@ -229,17 +229,18 @@ void SymbolTable::refineAbstractType(const DerivedType *OldType,
         // No action
 
       } else if (TI != NewPlane.end()) {
-        // The only thing we are allowing for now is two method prototypes being
+        // The only thing we are allowing for now is two external global values
         // folded into one.
         //
-        Function *ExistM = dyn_cast<Function>(TI->second);
-        Function *NewM = dyn_cast<Function>(V.second);
+        GlobalValue *ExistGV = dyn_cast<GlobalValue>(TI->second);
+        GlobalValue *NewGV = dyn_cast<GlobalValue>(V.second);
 
-        if (ExistM && NewM && ExistM->isExternal() && NewM->isExternal()) {
-          // Ok we have two external methods.  Make all uses of the new one
-          // use the old one...
+        if (ExistGV && NewGV && ExistGV->isExternal() && NewGV->isExternal()) {
+          // Ok we have two external global values.  Make all uses of the new
+          // one use the old one...
           //
-          NewM->replaceAllUsesWith(ExistM);
+          assert(ExistGV->use_empty() && "No uses allowed on untyped value!");
+          //NewGV->replaceAllUsesWith(ExistGV);
           
           // Now we just convert it to an unnamed method... which won't get
           // added to our symbol table.  The problem is that if we call
@@ -254,12 +255,16 @@ void SymbolTable::refineAbstractType(const DerivedType *OldType,
           InternallyInconsistent = true;
 
           // Remove newM from the symtab
-          NewM->setName("");
+          NewGV->setName("");
           InternallyInconsistent = false;
 
-          // Now we can remove this method from the module entirely...
-          NewM->getParent()->getFunctionList().remove(NewM);
-          delete NewM;
+          // Now we can remove this global from the module entirely...
+          Module *M = NewGV->getParent();
+          if (Function *F = dyn_cast<Function>(NewGV))
+            M->getFunctionList().remove(F);
+          else
+            M->getGlobalList().remove(cast<GlobalVariable>(NewGV));
+          delete NewGV;
 
         } else {
           assert(0 && "Two planes folded together with overlapping "