Only functions with external linkage can be resolved to function declarations.
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
diff --git a/lib/Transforms/IPO/FunctionResolution.cpp b/lib/Transforms/IPO/FunctionResolution.cpp
index 6cb901b..6835126 100644
--- a/lib/Transforms/IPO/FunctionResolution.cpp
+++ b/lib/Transforms/IPO/FunctionResolution.cpp
@@ -122,8 +122,11 @@
         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 @@
     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];