Only functions with external linkage can be resolved to function declarations.
authorChris Lattner <sabre@nondot.org>
Thu, 18 Jul 2002 03:01:24 +0000 (03:01 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 18 Jul 2002 03:01:24 +0000 (03:01 +0000)
This change fixes programs that have multiple functions named the same thing,
where are least one of them is static/internal.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2954 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/FunctionResolution.cpp

index 6cb901b79fe0dacdc240e6ce27c8a8561c3f1862..683512689e31466e80d4362d665b621abf0135d2 100644 (file)
@@ -122,8 +122,11 @@ bool FunctionResolvingPass::run(Module &M) {
         SymbolTable::VarMap &Plane = I->second;
         for (SymbolTable::type_iterator PI = Plane.begin(), PE = Plane.end();
              PI != PE; ++PI) {
-          const string &Name = PI->first;
-          Functions[Name].push_back(cast<Function>(PI->second));          
+          Function *F = cast<Function>(PI->second);
+          assert(PI->first == F->getName() &&
+                 "Function name and symbol table do not agree!");
+          if (F->hasExternalLinkage())  // Only resolve decls to external fns
+            Functions[PI->first].push_back(F);
         }
       }
 
@@ -139,6 +142,7 @@ bool FunctionResolvingPass::run(Module &M) {
     Function *Concrete = 0;
     for (unsigned i = 0; i < Functions.size(); ) {
       if (!Functions[i]->isExternal()) {  // Found an implementation
+        if (Implementation != 0)
         assert(Implementation == 0 && "Multiple definitions of the same"
                " function. Case not handled yet!");
         Implementation = Functions[i];