summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/GlobalMerge.cpp
diff options
context:
space:
mode:
authorJohn Brawn <john.brawn@arm.com>2015-08-12 13:36:48 +0000
committerJohn Brawn <john.brawn@arm.com>2015-08-12 13:36:48 +0000
commit0bef27d836f2021befadc786d44bab32f066ffbd (patch)
treefb5d1aacb72963d3415e3c54942b82a385b2d0e8 /llvm/lib/CodeGen/GlobalMerge.cpp
parent90512d54406468325b6a5f69fabd5600a8d1996c (diff)
downloadbcm5719-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
Diffstat (limited to 'llvm/lib/CodeGen/GlobalMerge.cpp')
-rw-r--r--llvm/lib/CodeGen/GlobalMerge.cpp13
1 files changed, 10 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++;
}
OpenPOWER on IntegriCloud