我想将浮点变量的值打印到屏幕上。我在LLVM IR代码中声明了
每当我打印整数、字符数据类型或字符串时,
当我编译LLVM IR代码时,输出如下:
printf()
函数,并且它成功链接。每当我打印整数、字符数据类型或字符串时,
printf()
会像在C代码中一样正常地将它们打印到屏幕上。然而,如果我将一个float
传递给printf()
,它会打印0.000000
而不是浮点数。我多次检查源代码,语法似乎是正确的。它应该打印出2.75
!我看着这段代码,完全不明白为什么代码的行为与我的写法不同。target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@obj1 = global {i32, float, i8} zeroinitializer
@format_string = constant [10 x i8] c"%i %f %c\0A\00"
declare i32 @printf(i8*, ...)
define i32 @main() {
entry:
%obj1 = load {i32, float, i8}, {i32, float, i8}* @obj1
%obj2 = insertvalue {i32, float, i8} %obj1, i32 44, 0
%obj3 = insertvalue {i32, float, i8} %obj2, float 2.75, 1
%obj4 = insertvalue {i32, float, i8} %obj3, i8 36, 2
store {i32, float, i8} %obj4, {i32, float, i8}* @obj1
%ptr.i32 = getelementptr {i32, float, i8}, {i32, float, i8}* @obj1, i32 0, i32 0
%0 = load i32, i32* %ptr.i32
%ptr.float = getelementptr {i32, float, i8}, {i32, float, i8}* @obj1, i32 0, i32 1
%1 = load float, float* %ptr.float
%ptr.i8 = getelementptr {i32, float, i8}, {i32, float, i8}* @obj1, i32 0, i32 2
%2 = load i8, i8* %ptr.i8
%format_ptr = getelementptr [10 x i8], [10 x i8]* @format_string, i64 0, i64 0
call i32 (i8*, ...) @printf(i8* %format_ptr, i32 %0, float %1, i8 %2)
ret i32 0
}
当我编译LLVM IR代码时,输出如下:
$ llvm-as code.ll -o code.bc
$ lli code.bc
44 0.000000 $
它成功地打印了整数和字符,但没有打印浮点数!
obj
,或者对obj4
执行GEP操作。我的假设是你正在处理“旧”的数据,但整数和字符值恰好被正确打印出来了。 - undefined