[ThinLTO] Handle previously imported and promoted locals in module linker
authorTeresa Johnson <tejohnson@google.com>
Tue, 24 Nov 2015 19:46:58 +0000 (19:46 +0000)
committerTeresa Johnson <tejohnson@google.com>
Tue, 24 Nov 2015 19:46:58 +0000 (19:46 +0000)
The new function import pass exposed an issue when we import references
to local values on multiple importing passes. They are renamed on each
import pass, and we need to ensure that the already promoted and renamed
references existing in the dest module are correctly identified and
updated so that they aren't spuriously renamed again (due to a perceived
conflict with the newly linked reference).

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

lib/Linker/LinkModules.cpp
test/Transforms/FunctionImport/funcimport.ll

index f97bbe5a8e50ecd267446101e3f302d7a68c6d39..8970fe4461386106701f3cc89c1c84a3f3425ea2 100644 (file)
@@ -517,11 +517,11 @@ private:
   GlobalValue *getLinkedToGlobal(const GlobalValue *SrcGV) {
     // If the source has no name it can't link.  If it has local linkage,
     // there is no name match-up going on.
-    if (!SrcGV->hasName() || SrcGV->hasLocalLinkage())
+    if (!SrcGV->hasName() || GlobalValue::isLocalLinkage(getLinkage(SrcGV)))
       return nullptr;
 
     // Otherwise see if we have a match in the destination module's symtab.
-    GlobalValue *DGV = DstM->getNamedValue(SrcGV->getName());
+    GlobalValue *DGV = DstM->getNamedValue(getName(SrcGV));
     if (!DGV)
       return nullptr;
 
index 8d790520e33379c0289817f1bd05dc2c4ffc3530..43b2fb7919d759ad786982a0cab18e294ad1c858 100644 (file)
@@ -43,6 +43,12 @@ declare void @setfuncptr(...) #1
 ; CHECK-DAG: define available_externally void @callfuncptr()
 declare void @callfuncptr(...) #1
 
+; Ensure that all uses of local variable @P which has used in setfuncptr
+; and callfuncptr are to the same promoted/renamed global.
+; CHECK-DAG: @P.llvm.2 = available_externally hidden global void ()* null
+; CHECK-DAG: %0 = load void ()*, void ()** @P.llvm.2,
+; CHECK-DAG: store void ()* @staticfunc2.llvm.2, void ()** @P.llvm.2,
+
 ; Won't import weak func
 ; CHECK-DAG: declare void @weakfunc(...)
 declare void @weakfunc(...) #1