From: John Brawn Date: Wed, 12 Aug 2015 13:36:48 +0000 (+0000) Subject: [GlobalMerge] Only emit aliases for internal linkage variables for non-Mach-O X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=1a5ed7be24acd9035006af4de59bb78d190bd0cc;p=oota-llvm.git [GlobalMerge] Only emit aliases for internal linkage variables for non-Mach-O On Mach-O emitting aliases for the variables that make up a MergedGlobals variable can cause problems when linking with dead stripping enabled so don't do that, except for external variables where we must emit an alias. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@244748 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/GlobalMerge.cpp b/lib/CodeGen/GlobalMerge.cpp index 3a7e2f47686..d8739c4aaac 100644 --- a/lib/CodeGen/GlobalMerge.cpp +++ b/lib/CodeGen/GlobalMerge.cpp @@ -459,9 +459,16 @@ bool GlobalMerge::doMerge(SmallVectorImpl &Globals, Globals[k]->replaceAllUsesWith(GEP); Globals[k]->eraseFromParent(); - // Generate a new alias... - auto *PTy = cast(GEP->getType()); - GlobalAlias::create(PTy, Linkage, Name, GEP, &M); + // When the linkage is not internal we must emit an alias for the original + // variable name as it may be accessed from another object. On non-Mach-O + // we can also emit an alias for internal linkage as it's safe to do so. + // It's not safe on Mach-O as the alias (and thus the portion of the + // MergedGlobals variable) may be dead stripped at link time. + if (Linkage != GlobalValue::InternalLinkage || + !TM->getTargetTriple().isOSBinFormatMachO()) { + auto *PTy = cast(GEP->getType()); + GlobalAlias::create(PTy, Linkage, Name, GEP, &M); + } NumMerged++; } diff --git a/test/CodeGen/AArch64/global-merge-1.ll b/test/CodeGen/AArch64/global-merge-1.ll index 304d0a78c2c..b93f41c07df 100644 --- a/test/CodeGen/AArch64/global-merge-1.ll +++ b/test/CodeGen/AArch64/global-merge-1.ll @@ -23,5 +23,9 @@ define void @f1(i32 %a1, i32 %a2) { ;CHECK: .type .L_MergedGlobals,@object // @_MergedGlobals ;CHECK: .local .L_MergedGlobals ;CHECK: .comm .L_MergedGlobals,8,8 +;CHECK: m = .L_MergedGlobals +;CHECK: n = .L_MergedGlobals+4 ;CHECK-APPLE-IOS: .zerofill __DATA,__bss,l__MergedGlobals,8,3 ; @_MergedGlobals +;CHECK-APPLE-IOS-NOT: _m = l__MergedGlobals +;CHECK-APPLE-IOS-NOT: _n = l__MergedGlobals+4 diff --git a/test/CodeGen/AArch64/global-merge-3.ll b/test/CodeGen/AArch64/global-merge-3.ll index a6a8a7e8a04..095fa4f7881 100644 --- a/test/CodeGen/AArch64/global-merge-3.ll +++ b/test/CodeGen/AArch64/global-merge-3.ll @@ -36,11 +36,13 @@ define void @f1(i32 %a1, i32 %a2, i32 %a3) { ;CHECK-APPLE-IOS: .zerofill __DATA,__bss,l__MergedGlobals.1,4000,4 +;CHECK: z = .L_MergedGlobals ;CHECK: .globl x ;CHECK: x = .L_MergedGlobals+4 ;CHECK: .globl y ;CHECK: y = .L_MergedGlobals.1 +;CHECK-APPLE-IOS-NOT: _z = l__MergedGlobals ;CHECK-APPLE-IOS:.globl _x ;CHECK-APPLE-IOS: _x = l__MergedGlobals+4 ;CHECK-APPLE-IOS:.globl _y