[llvm] r189935 - Fix linking of unnamed_addr.

Rafael Espindola rafael.espindola at gmail.com
Wed Sep 4 07:05:10 PDT 2013


Author: rafael
Date: Wed Sep  4 09:05:09 2013
New Revision: 189935

URL: http://llvm.org/viewvc/llvm-project?rev=189935&view=rev
Log:
Fix linking of unnamed_addr.

This was regression from r134829. When linking we have to be conservative. If
one of the symbols has a significant address, then the result should have it
too.

Modified:
    llvm/trunk/lib/Linker/LinkModules.cpp
    llvm/trunk/test/Linker/unnamed-addr1-a.ll

Modified: llvm/trunk/lib/Linker/LinkModules.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Linker/LinkModules.cpp?rev=189935&r1=189934&r2=189935&view=diff
==============================================================================
--- llvm/trunk/lib/Linker/LinkModules.cpp (original)
+++ llvm/trunk/lib/Linker/LinkModules.cpp Wed Sep  4 09:05:09 2013
@@ -746,6 +746,7 @@ bool ModuleLinker::linkAppendingVarProto
 bool ModuleLinker::linkGlobalProto(GlobalVariable *SGV) {
   GlobalValue *DGV = getLinkedToGlobal(SGV);
   llvm::Optional<GlobalValue::VisibilityTypes> NewVisibility;
+  bool HasUnnamedAddr = SGV->hasUnnamedAddr();
 
   if (DGV) {
     // Concatenation of appending linkage variables is magic and handled later.
@@ -755,6 +756,7 @@ bool ModuleLinker::linkGlobalProto(Globa
     // Determine whether linkage of these two globals follows the source
     // module's definition or the destination module's definition.
     GlobalValue::LinkageTypes NewLinkage = GlobalValue::InternalLinkage;
+    HasUnnamedAddr = HasUnnamedAddr && DGV->hasUnnamedAddr();
     GlobalValue::VisibilityTypes NV;
     bool LinkFromSrc = false;
     if (getLinkageResult(DGV, SGV, NewLinkage, NV, LinkFromSrc))
@@ -768,10 +770,11 @@ bool ModuleLinker::linkGlobalProto(Globa
       if (GlobalVariable *DGVar = dyn_cast<GlobalVariable>(DGV))
         if (DGVar->isDeclaration() && SGV->isConstant() && !DGVar->isConstant())
           DGVar->setConstant(true);
-      
-      // Set calculated linkage and visibility.
+
+      // Set calculated linkage, visibility and unnamed_addr.
       DGV->setLinkage(NewLinkage);
       DGV->setVisibility(*NewVisibility);
+      DGV->setUnnamedAddr(HasUnnamedAddr);
 
       // Make sure to remember this mapping.
       ValueMap[SGV] = ConstantExpr::getBitCast(DGV,TypeMap.get(SGV->getType()));
@@ -797,6 +800,7 @@ bool ModuleLinker::linkGlobalProto(Globa
   copyGVAttributes(NewDGV, SGV);
   if (NewVisibility)
     NewDGV->setVisibility(*NewVisibility);
+  NewDGV->setUnnamedAddr(HasUnnamedAddr);
 
   if (DGV) {
     DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewDGV, DGV->getType()));

Modified: llvm/trunk/test/Linker/unnamed-addr1-a.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Linker/unnamed-addr1-a.ll?rev=189935&r1=189934&r2=189935&view=diff
==============================================================================
--- llvm/trunk/test/Linker/unnamed-addr1-a.ll (original)
+++ llvm/trunk/test/Linker/unnamed-addr1-a.ll Wed Sep  4 09:05:09 2013
@@ -10,15 +10,15 @@
 @c = common unnamed_addr global i32 0
 ; CHECK: @c = common unnamed_addr global i32 0
 @d = external global i32
-; CHECK: @d = unnamed_addr global i32 42
+; CHECK: @d = global i32 42
 @e = external unnamed_addr global i32
 ; CHECK: @e = unnamed_addr global i32 42
 @f = weak global i32 42
-; CHECK: @f = unnamed_addr global i32 42
+; CHECK: @f = global i32 42
 
 ; Other file has non-unnamed_addr definition
 @g = common unnamed_addr global i32 0
-; CHECK: @g = common unnamed_addr global i32 0
+; CHECK: @g = common global i32 0
 @h = external global i32
 ; CHECK: @h = global i32 42
 @i = external unnamed_addr global i32





More information about the llvm-commits mailing list