如何在llvm中读取本地数组

时间:2014-05-19 02:42:08

标签: llvm llvm-ir

我已经生成了以下bitcode。 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访问数组,但我不希望这样。

1 个答案:

答案 0 :(得分:1)

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

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