【问题标题】:How to read local arrays in llvm如何在 llvm 中读取本地数组
【发布时间】:2014-05-19 02:42:08
【问题描述】:

我生成了以下位码。 fuelTank 是一个数组,我将它传递给一个名为 getEngineValue(int x[]) 的函数。

%fuelTank = alloca [5 x i32], align 4
call void @llvm.dbg.declare(metadata !{[5 x i32]* %fuelTank}, metadata !39), !dbg !40
%0 = bitcast [5 x i32]* %fuelTank to i8*, !dbg !40
call void @llvm.memcpy.p0i8.p0i8.i32(i8* %0, i8* bitcast ([5 x i32]* @_ZZ12checkFuelSysvE8fuelTank to i8*), i32 20, i32 4, i1 false), !dbg !40
call void @_Z17getFuelIndicationPi(i32* getelementptr inbounds ([5 x i32]* @piston, i32 0, i32 0)), !dbg !41
%arraydecay = getelementptr inbounds [5 x i32]* %fuelTank, i32 0, i32 0, !dbg !42
call void @_Z14getEngineValuePi(i32* %arraydecay), !dbg !42
ret void, !dbg !43

我想读取存储在fuelTank 数组中的值。我想我可以从alloca 指令中读取它,但找不到任何成功。

注意:我知道如何使用@llvm.memcpy 访问数组,但我不想要这个。

【问题讨论】:

  • “我想读取存储在fuelTank数组中的值”——你想在哪里读取它们?在您提供的代码中?在getEngineValue 里面?其他地方?
  • @Oak:在我提供的代码中。

标签: llvm llvm-ir


【解决方案1】:

要从%fuelTank 中获取[5 x i32] 类型的值,您可以使用load 指令来读取其内容。

如果您只想要存储在单个数组索引中的内容(i32 类型),您可以使用getelementptr 获取特定索引的地址,然后使用load 它,或者您可以使用load首先,然后通过extractvalue 指令获取单个值。

【讨论】:

  • 你能告诉我,如何加载值?加载指令在哪里?
  • @ConsistentProgrammer 如果您在进行位码操作,您应该与the language reference 密切合作。
  • 我搜索了很多。我尝试了不同的方法来提取值。我只是卡住了。这就是我问的原因。这个“加载”指令在哪里?
  • @ConsistentProgrammer 我链接的语言参考解释了它是什么。如果您手动编写 IR,它也有它的语法;如果您使用的是 IRBuilder,则可以使用它的 createLoad 方法之一;否则你可以构造一个新的LoadInst
  • 我使用 clang 生成了这段代码。这里的问题是,clang 总是为本地数组创建一个全局副本。因此,这里没有加载指令。也许,我的问题对你来说还很模糊。
猜你喜欢
  • 1970-01-01
  • 2021-09-05
  • 2021-08-12
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 2020-12-18
  • 1970-01-01
相关资源
最近更新 更多