无法让“getelementptr”和“store”工作

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

我正在生成以下 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(...)

谢谢您的帮助!

llvm-ir
1个回答
0
投票

问题不在于

getelementptr
或如何访问内存 - 问题在于如何打印值。

printf("%f", ...)
期望一个双精度值,但您传递的是一个浮点数。如果您将字段的类型(以及对其进行操作的指令)更改为 double,或者在调用
fpext
之前使用
printf
将浮点数转换为 double,它将起作用。

© www.soinside.com 2019 - 2024. All rights reserved.