Skip to content

Commit fd9a941

Browse files
committed
Fix linking of unnamed_addr in functions.
llvm-svn: 189945
1 parent df814e9 commit fd9a941

File tree

3 files changed

+32
-1
lines changed

3 files changed

+32
-1
lines changed

llvm/lib/Linker/LinkModules.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -756,12 +756,12 @@ bool ModuleLinker::linkGlobalProto(GlobalVariable *SGV) {
756756
// Determine whether linkage of these two globals follows the source
757757
// module's definition or the destination module's definition.
758758
GlobalValue::LinkageTypes NewLinkage = GlobalValue::InternalLinkage;
759-
HasUnnamedAddr = HasUnnamedAddr && DGV->hasUnnamedAddr();
760759
GlobalValue::VisibilityTypes NV;
761760
bool LinkFromSrc = false;
762761
if (getLinkageResult(DGV, SGV, NewLinkage, NV, LinkFromSrc))
763762
return true;
764763
NewVisibility = NV;
764+
HasUnnamedAddr = HasUnnamedAddr && DGV->hasUnnamedAddr();
765765

766766
// If we're not linking from the source, then keep the definition that we
767767
// have.
@@ -817,6 +817,7 @@ bool ModuleLinker::linkGlobalProto(GlobalVariable *SGV) {
817817
bool ModuleLinker::linkFunctionProto(Function *SF) {
818818
GlobalValue *DGV = getLinkedToGlobal(SF);
819819
llvm::Optional<GlobalValue::VisibilityTypes> NewVisibility;
820+
bool HasUnnamedAddr = SF->hasUnnamedAddr();
820821

821822
if (DGV) {
822823
GlobalValue::LinkageTypes NewLinkage = GlobalValue::InternalLinkage;
@@ -825,11 +826,13 @@ bool ModuleLinker::linkFunctionProto(Function *SF) {
825826
if (getLinkageResult(DGV, SF, NewLinkage, NV, LinkFromSrc))
826827
return true;
827828
NewVisibility = NV;
829+
HasUnnamedAddr = HasUnnamedAddr && DGV->hasUnnamedAddr();
828830

829831
if (!LinkFromSrc) {
830832
// Set calculated linkage
831833
DGV->setLinkage(NewLinkage);
832834
DGV->setVisibility(*NewVisibility);
835+
DGV->setUnnamedAddr(HasUnnamedAddr);
833836

834837
// Make sure to remember this mapping.
835838
ValueMap[SF] = ConstantExpr::getBitCast(DGV, TypeMap.get(SF->getType()));
@@ -857,6 +860,7 @@ bool ModuleLinker::linkFunctionProto(Function *SF) {
857860
copyGVAttributes(NewDF, SF);
858861
if (NewVisibility)
859862
NewDF->setVisibility(*NewVisibility);
863+
NewDF->setUnnamedAddr(HasUnnamedAddr);
860864

861865
if (DGV) {
862866
// Any uses of DF need to change to NewDF, with cast.

llvm/test/Linker/unnamed-addr1-a.ll

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@
66
@global-b = common unnamed_addr global i32 0
77
; CHECK-DAG: @global-b = common unnamed_addr global i32 0
88

9+
define weak void @func-a() { ret void }
10+
; CHECK-DAG: define weak void @func-a() {
11+
define weak void @func-b() unnamed_addr { ret void }
12+
; CHECK-DAG: define weak void @func-b() unnamed_addr {
13+
914
; Other file has unnamed_addr definition
1015
@global-c = common unnamed_addr global i32 0
1116
; CHECK-DAG: @global-c = common unnamed_addr global i32 0
@@ -16,6 +21,13 @@
1621
@global-f = weak global i32 42
1722
; CHECK-DAG: @global-f = global i32 42
1823

24+
declare void @func-c()
25+
; CHECK-DAG: define weak void @func-c() {
26+
define weak void @func-d() { ret void }
27+
; CHECK-DAG: define weak void @func-d() {
28+
define weak void @func-e() unnamed_addr { ret void }
29+
; CHECK-DAG: define weak void @func-e() unnamed_addr {
30+
1931
; Other file has non-unnamed_addr definition
2032
@global-g = common unnamed_addr global i32 0
2133
; CHECK-DAG: @global-g = common global i32 0
@@ -25,3 +37,10 @@
2537
; CHECK-DAG: @global-i = global i32 42
2638
@global-j = weak global i32 42
2739
; CHECK-DAG: @global-j = global i32 42
40+
41+
declare void @func-g()
42+
; CHECK-DAG: define weak void @func-g() {
43+
define weak void @func-h() { ret void }
44+
; CHECK-DAG: define weak void @func-h() {
45+
define weak void @func-i() unnamed_addr { ret void }
46+
; CHECK-DAG: define weak void @func-i() {

llvm/test/Linker/unnamed-addr1-b.ll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,15 @@
66
@global-e = unnamed_addr global i32 42
77
@global-f = unnamed_addr global i32 42
88

9+
define weak void @func-c() unnamed_addr { ret void }
10+
define weak void @func-d() unnamed_addr { ret void }
11+
define weak void @func-e() unnamed_addr { ret void }
12+
913
@global-g = common global i32 42
1014
@global-h = global i32 42
1115
@global-i = global i32 42
1216
@global-j = global i32 42
17+
18+
define weak void @func-g() { ret void }
19+
define weak void @func-h() { ret void }
20+
define weak void @func-i() { ret void }

0 commit comments

Comments
 (0)