diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index f32211245f6..ab37b8b12fb 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -746,6 +746,7 @@ bool ModuleLinker::linkAppendingVarProto(GlobalVariable *DstGV, bool ModuleLinker::linkGlobalProto(GlobalVariable *SGV) { GlobalValue *DGV = getLinkedToGlobal(SGV); llvm::Optional NewVisibility; + bool HasUnnamedAddr = SGV->hasUnnamedAddr(); if (DGV) { // Concatenation of appending linkage variables is magic and handled later. @@ -755,6 +756,7 @@ bool ModuleLinker::linkGlobalProto(GlobalVariable *SGV) { // 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(GlobalVariable *SGV) { if (GlobalVariable *DGVar = dyn_cast(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(GlobalVariable *SGV) { copyGVAttributes(NewDGV, SGV); if (NewVisibility) NewDGV->setVisibility(*NewVisibility); + NewDGV->setUnnamedAddr(HasUnnamedAddr); if (DGV) { DGV->replaceAllUsesWith(ConstantExpr::getBitCast(NewDGV, DGV->getType())); diff --git a/test/Linker/unnamed-addr1-a.ll b/test/Linker/unnamed-addr1-a.ll index e9c03ee1424..1ddac9ccc02 100644 --- a/test/Linker/unnamed-addr1-a.ll +++ b/test/Linker/unnamed-addr1-a.ll @@ -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