我正在尝试获取getelementptr指令所引用的数组的名称。当数组被索引为在实际C代码中使用中间变量时,这似乎起作用
int a = 0;
i[a] = 3;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我得到以下位码
%arrayidx = getelementptr inbounds [2 x i32], [2 x i32]* @i, i64 0, i64 %idxprom
store i32 3, i32* %arrayidx, align 4
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我可以遍历getelementptr指令的操作数,并通过第一个操作数上的getName()方法找到array(i)的名称。
但是,如果在源代码中数组是直接索引的,
i[0] = 3;
Run Code Online (Sandbox Code Playgroud)
然后,生成的位码如下
store i32 3, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @i, i64 0, i64 0), align 4
Run Code Online (Sandbox Code Playgroud)
在这里,我不确定如何从位代码获取数组名称(i)。存储指令的第二操作数的类型设置为PointerTy。第二个操作数的包含类型为int。两者都符合预期,因为操作数是i32 *。但是,在这种情况下,我不确定如何获取getelementptr指令的句柄以迭代其操作数。
编辑:我应该提到的数组我是一个全局
在第一个示例中,store指令的第二个操作数是getelementptr 指令,但在第二个示例中,它是一个getelementptr 常量表达式,因为指针和索引都是常量。
因此,在第一种情况下,如果您获得 的指针操作数StoreInst,您将获得GetElementPtrInst. 在第二种情况下,您将得到一个ConstantExprwhogetOpcode()方法返回Instruction::GetElementPtr。
您可以使用GEPOperator. 你可以使用dyn_cast<GEPOperator>(I)它,它会为指令和常量表达式做正确的事情。
(注意——Operator这不是一个 LLVM IR 概念——它只是一个 C++ 抽象,可以帮助你处理指令或常量表达式(这可能发生在强制转换、GEP 或算术运算中)但你不在乎区别。)
| 归档时间: |
|
| 查看次数: |
1051 次 |
| 最近记录: |