summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/ConstantMerge
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
commitc79155192d25a35cfbae5d9d474aa24713be8098 (patch)
tree85a4a55ea170929a7547ebc3ad26ddf1b567b114 /llvm/test/Transforms/ConstantMerge
parentd9e73937412e8f837a3113efab9d4863f1f2af60 (diff)
downloadbcm5719-llvm-c79155192d25a35cfbae5d9d474aa24713be8098.tar.gz
bcm5719-llvm-c79155192d25a35cfbae5d9d474aa24713be8098.zip
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> llvm-svn: 147899
Diffstat (limited to 'llvm/test/Transforms/ConstantMerge')
-rw-r--r--llvm/test/Transforms/ConstantMerge/linker-private.ll23
1 files changed, 23 insertions, 0 deletions
diff --git a/llvm/test/Transforms/ConstantMerge/linker-private.ll b/llvm/test/Transforms/ConstantMerge/linker-private.ll
new file mode 100644
index 00000000000..eba7880e8af
--- /dev/null
+++ b/llvm/test/Transforms/ConstantMerge/linker-private.ll
@@ -0,0 +1,23 @@
+; RUN: opt < %s -constmerge -S | FileCheck %s
+; <rdar://problem/10564621>
+
+%0 = type opaque
+%struct.NSConstantString = type { i32*, i32, i8*, i32 }
+
+; CHECK: @.str3 = linker_private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+
+@isLogVisible = global i8 0, align 1
+@__CFConstantStringClassReference = external global [0 x i32]
+@.str3 = linker_private unnamed_addr constant [1 x i8] zeroinitializer, align 1
+@_unnamed_cfstring_4 = private constant %struct.NSConstantString { i32* getelementptr inbounds ([0 x i32]* @__CFConstantStringClassReference, i32 0, i32 0), i32 1992, i8* getelementptr inbounds ([1 x i8]* @.str3, i32 0, i32 0), i32 0 }, section "__DATA,__cfstring"
+@null.array = weak_odr constant [1 x i8] zeroinitializer, align 1
+
+define linkonce_odr void @bar() nounwind ssp align 2 {
+entry:
+ %stack = alloca i8*, align 4
+ %call = call %0* bitcast (i8* (i8*, i8*, ...)* @objc_msgSend to %0* (i8*, i8*, %0*)*)(i8* null, i8* null, %0* bitcast (%struct.NSConstantString* @_unnamed_cfstring_4 to %0*))
+ store i8* getelementptr inbounds ([1 x i8]* @null.array, i32 0, i32 0), i8** %stack, align 4
+ ret void
+}
+
+declare i8* @objc_msgSend(i8*, i8*, ...) nonlazybind
OpenPOWER on IntegriCloud