编译这个简单的代码应该返回 2000 但它返回 208 因为它被截断为 i8.
define i32 @"main"()
{
entry:
%"x" = alloca i32
store i32 2000, i32* %"x"
%".3" = load i32, i32* %"x"
ret i32 %".3"
}
我是这样编译的:
llc -filetype=obj output.ll -o output.o
gcc output.o -o output -ggdb
调试器显示存储 0x7d0、2000 的正确值,但最终结果返回 208
-> 0x401110 <+0>: movl $0x7d0, -0x4(%rsp) ; imm = 0x7D0
0x401118 <+8>: movl $0x7d0, %eax ; imm = 0x7D0
0x40111d <+13>: retq
0x40111e: addb %al, (%rax)
Process 4869 exited with status = 208 (0x000000d0)
这是因为我正在使用终端吗? 或者我应该使用 llvm c printf 来使用 stdout?
提前谢谢你
编译这个简单的代码应该返回 2000 但它返回 208 因为它被截断为 i8.
这修复了它,终端将结果截断为 i8,我只是使用 printf:
@str_fmt = private unnamed_addr constant [3 x i8] c"%d\00"
declare i32 @printf(i8*, ...)
define i32 @"main"()
{
entry:
%"x" = alloca i32
store i32 2000, i32* %"x"
%".3" = load i32, i32* %"x"
call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @str_fmt, i32 0, i32 0), i32 %".3")
ret i32 %".3"
}