[llvm-dev] [BUG Report] -dead_strip, strips prefix data unconditionally on macOS
Moritz Angermann via llvm-dev
llvm-dev at lists.llvm.org
Mon Mar 6 01:40:04 PST 2017
Hi,
I just came across a rather annoying behavior with llvm 3.9. Assuming the following
samle code in test.ll:
; Lets have some global int x = 4
@x = global i32 10, align 4
; and two strings "p = %d\n" for the prefix data,
; as well as "x = %d\n" to print the (global) x value.
@.str = private unnamed_addr constant [8 x i8] c"x = %d\0A\00", align 1
@.str2 = private unnamed_addr constant [8 x i8] c"p = %d\0A\00", align 1
; declare printf, we'll use this later for printf style debugging.
declare i32 @printf(i8*, ...)
; define a main function.
define i32 @main() prefix i32 123 {
; obtain a i32 pointer to the main function.
; the prefix data is right before that pointer.
%main = bitcast i32 ()* @main to i32*
; use the gep, to cmpute the start of the prefix data.
%prefix_ptr = getelementptr inbounds i32, i32* %main, i32 -1
; and load it.
%prefix_val = load i32, i32* %prefix_ptr
; print that value.
%ret = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str2, i32 0, i32 0), i32 %prefix_val)
; similarly let's do the same with the global x.
%1 = alloca i32, align 4
store i32 0, i32* %1, align 4
%2 = load i32, i32* @x, align 4
%3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i32 0, i32 0), i32 %2)
ret i32 0
}
gives the following result (expected)
$ clang test.ll
$ ./a.out
p = 123
x = 10
however, with -dead_strip on macOS, we see the following:
$ clang test.ll -dead_strip
$ ./a.out
p = 0
x = 10
Thus I believe we are incorrectly stripping prefix data when linking with -dead_strip on macOS.
As I do not have a bugzilla account, and hence cannot post this as a proper bug report.
Cheers,
Moritz
More information about the llvm-dev
mailing list