从索引处提取/插入元素 - LLVM

时间:2018-05-26 19:33:40

标签: compiler-construction llvm llvm-ir llvm-c++-api

有没有办法从值而不是int中提取或插入索引处的元素?我希望能够使用ExtractElementInst之类的东西,但是对于数组而不是向量。

现在我正在做

mBuilder.CreateExtractValue(refArray, index)

但是,我需要能够将Value *传递给它,因为我希望能够在变量值的索引处访问数组元素。例如:

array[i]

使用上面的代码,我仅限于:

array[0]

1 个答案:

答案 0 :(得分:1)

要使用任意非常量索引执行地址算术,您需要使用"Server=DESKTOP-BCQ6IAU\\CHATDB;Database=MultiRoomChat;Trusted_Connection=True;" 指令,该指令是使用getelementptr函数创建的。

请注意CreateGEP需要将其参数作为指针,因此您需要直接使用保存数组的全局变量或getelementptr,而不是先读取它。这也意味着您需要零作为跟随指针的第一个索引。总而言之,生成的读取alloca的代码应如下所示:

array[i]

这里我假设@array = global [3 x i32] [1,2,3] define void f() { %i = ; calculuate the index here %array_i_ptr = getelementptr [3 x i32], [3 x i32]* @array, i32 0, i32 %i %array_i_value = load i32, i32* array_i_ptr ; do something with %array_i_value ret } 是一个全局变量。对于局部变量,您可以使用array代替。对于动态分配的数组,您需要调用alloca,没有数组类型和只有一个索引的malloc指令(因为我们正在使用指向int的指针,而不是指针to array to int,所以零索引不是必需的。)