summaryrefslogtreecommitdiff
path: root/lib/Transforms/IPO/ConstantMerge.cpp
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2012-01-11 00:13:08 +0000
committerBill Wendling <isanbard@gmail.com>2012-01-11 00:13:08 +0000
commit37b94c6b4e605c522164bcafc58ea1e1afb50cc0 (patch)
tree70979afa0d13ea1f8c04a6dfea8a4b40e2cd2e67 /lib/Transforms/IPO/ConstantMerge.cpp
parentdcc296d420d064e4cedfc80abc8df6bfb0b35b03 (diff)
downloadllvm-37b94c6b4e605c522164bcafc58ea1e1afb50cc0.tar.gz
llvm-37b94c6b4e605c522164bcafc58ea1e1afb50cc0.tar.bz2
llvm-37b94c6b4e605c522164bcafc58ea1e1afb50cc0.tar.xz
If the global variable is removed by the linker, then don't constant merge it
with other symbols. An object in the __cfstring section is suppoed to be filled with CFString objects, which have a pointer to ___CFConstantStringClassReference followed by a pointer to a __cstring. If we allow the object in the __cstring section to be merged with another global, then it could end up in any section. Because the linker is going to remove these symbols in the final executable, we shouldn't bother to merge them. <rdar://problem/10564621> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147899 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/IPO/ConstantMerge.cpp')
-rw-r--r--lib/Transforms/IPO/ConstantMerge.cpp16
1 files changed, 10 insertions, 6 deletions
diff --git a/lib/Transforms/IPO/ConstantMerge.cpp b/lib/Transforms/IPO/ConstantMerge.cpp
index c3ecb7afff..268a281aae 100644
--- a/lib/Transforms/IPO/ConstantMerge.cpp
+++ b/lib/Transforms/IPO/ConstantMerge.cpp
@@ -140,18 +140,21 @@ bool ConstantMerge::runOnModule(Module &M) {
UsedGlobals.count(GV))
continue;
+ // Ignore any constants which may be removed by the linker.
+ if (GV->mayBeRemovedByLinker())
+ continue;
+
Constant *Init = GV->getInitializer();
// Check to see if the initializer is already known.
PointerIntPair<Constant*, 1, bool> Pair(Init, hasKnownAlignment(GV));
GlobalVariable *&Slot = CMap[Pair];
- // If this is the first constant we find or if the old on is local,
- // replace with the current one. It the current is externally visible
+ // If this is the first constant we find or if the old one is local,
+ // replace with the current one. If the current is externally visible
// it cannot be replace, but can be the canonical constant we merge with.
- if (Slot == 0 || IsBetterCannonical(*GV, *Slot)) {
+ if (Slot == 0 || IsBetterCannonical(*GV, *Slot))
Slot = GV;
- }
}
// Second: identify all globals that can be merged together, filling in
@@ -169,8 +172,9 @@ bool ConstantMerge::runOnModule(Module &M) {
UsedGlobals.count(GV))
continue;
- // We can only replace constant with local linkage.
- if (!GV->hasLocalLinkage())
+ // We can only replace constants with local linkage and which aren't
+ // removed by the linker.
+ if (!GV->hasLocalLinkage() || GV->mayBeRemovedByLinker())
continue;
Constant *Init = GV->getInitializer();