我正在生成以下 ir
%2 = getelementptr float, ptr %0, i32 1
store float 1.000000e+00, ptr %2, align 8
%3 = getelementptr float, ptr %0, i32 1
%4 = load float, ptr %3, align 4
%0 是指向类型 {i32, float} 的指针。我期望“1.000”存储在“float”字段中。
但是当我运行上面的代码时,“0.000”被打印到控制台。我想我在这里遗漏了一些小细节,但我无法弄清楚。
作为参考,这是完整的代码。
; ModuleID = 'tests/var.txt'
source_filename = "tests/var.txt"
%class.Int = type { i32, float }
@0 = private unnamed_addr constant [12 x i8] c"not object\0A\00", align 1
@1 = private unnamed_addr constant [3 x i8] c"%f\00", align 1
@2 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
define i32 @main() {
body:
%0 = alloca %class.Int, align 8
%1 = getelementptr i32, ptr %0, i32 0
store i32 2, ptr %1, align 1
%2 = getelementptr float, ptr %0, i32 1
store float 1.000000e+00, ptr %2, align 8
%3 = getelementptr float, ptr %0, i32 1
%4 = load float, ptr %3, align 4
%5 = call ptr (...) @printf(ptr @1, float %4)
%6 = call ptr (...) @printf(ptr @2)
ret i32 0
}
declare ptr @printf(...)
谢谢您的帮助!
问题不在于
getelementptr
或如何访问内存 - 问题在于如何打印值。
printf("%f", ...)
期望一个双精度值,但您传递的是一个浮点数。如果您将字段的类型(以及对其进行操作的指令)更改为 double,或者在调用 fpext
之前使用 printf
将浮点数转换为 double,它将起作用。