【发布时间】:2016-03-13 21:29:29
【问题描述】:
我正在尝试调用 printf 从 LLVM 打印一个浮点数。虽然它适用于 int,但在使用 double 时会出现段错误。
这是代码(从 clang 生成,但稍作修改,以便与 llc 正常工作):
@.str = private unnamed_addr constant [3 x i8] c"%f\00", align 1
; Function Attrs: nounwind uwtable
define i32 @main() #0 {
%1 = alloca i32, align 4
store i32 0, i32* %1
%2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([3 x i8]* @.str, i32 0, i32 0), double 3.140000e+00)
ret i32 0
}
declare i32 @printf(i8*, ...) #1
attributes #0 = { nounwind uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
这是我生成可执行文件的方式:
llc main.ll --filetype=obj
ld -lc -e main -dynamic-linker /lib64/ld-linux-x86-64.so.2 main.o -o main
当我在valgrind 内运行main 时,我得到:
Process terminating with default action of signal 11 (SIGSEGV): dumping core
General Protection Fault
我在这个网站的某个地方读到我需要对齐堆栈以使用printf。
如果这是问题所在,我该如何在 LLVM 中做到这一点。
否则,是什么导致了这个段错误?
我运行的是 64 位 Linux。
【问题讨论】:
标签: llvm