diff options
| author | John Brawn <john.brawn@arm.com> | 2015-08-12 13:36:48 +0000 |
|---|---|---|
| committer | John Brawn <john.brawn@arm.com> | 2015-08-12 13:36:48 +0000 |
| commit | 0bef27d836f2021befadc786d44bab32f066ffbd (patch) | |
| tree | fb5d1aacb72963d3415e3c54942b82a385b2d0e8 | |
| parent | 90512d54406468325b6a5f69fabd5600a8d1996c (diff) | |
| download | bcm5719-llvm-0bef27d836f2021befadc786d44bab32f066ffbd.tar.gz bcm5719-llvm-0bef27d836f2021befadc786d44bab32f066ffbd.zip | |
[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.
llvm-svn: 244748
| -rw-r--r-- | llvm/lib/CodeGen/GlobalMerge.cpp | 13 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AArch64/global-merge-1.ll | 4 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AArch64/global-merge-3.ll | 2 |
3 files changed, 16 insertions, 3 deletions
diff --git a/llvm/lib/CodeGen/GlobalMerge.cpp b/llvm/lib/CodeGen/GlobalMerge.cpp index 3a7e2f47686..d8739c4aaac 100644 --- a/llvm/lib/CodeGen/GlobalMerge.cpp +++ b/llvm/lib/CodeGen/GlobalMerge.cpp @@ -459,9 +459,16 @@ bool GlobalMerge::doMerge(SmallVectorImpl<GlobalVariable *> &Globals, Globals[k]->replaceAllUsesWith(GEP); Globals[k]->eraseFromParent(); - // Generate a new alias... - auto *PTy = cast<PointerType>(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<PointerType>(GEP->getType()); + GlobalAlias::create(PTy, Linkage, Name, GEP, &M); + } NumMerged++; } diff --git a/llvm/test/CodeGen/AArch64/global-merge-1.ll b/llvm/test/CodeGen/AArch64/global-merge-1.ll index 304d0a78c2c..b93f41c07df 100644 --- a/llvm/test/CodeGen/AArch64/global-merge-1.ll +++ b/llvm/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/llvm/test/CodeGen/AArch64/global-merge-3.ll b/llvm/test/CodeGen/AArch64/global-merge-3.ll index a6a8a7e8a04..095fa4f7881 100644 --- a/llvm/test/CodeGen/AArch64/global-merge-3.ll +++ b/llvm/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 |

