使用 GCC i32 编译的 LLVM 被截断为 i8

问题描述 投票:0回答:1

编译这个简单的代码应该返回 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.

compiler-errors compilation llvm llvm-ir llvm-gcc
1个回答
0
投票

这修复了它,终端将结果截断为 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"
}
© www.soinside.com 2019 - 2024. All rights reserved.