c – 获取LLVM getelementptr的操作数名称

我试图获取getelementptr指令引用的数组的名称.当数组被索引到实际c代码中使用中间变量时,这似乎有效

int a = 0;
i[a] = 3; 

在这种情况下,我得到以下bitcode

%arrayidx = getelementptr inbounds [2 x i32], [2 x i32]* @i, i64 0, i64 %idxprom
store i32 3, i32* %arrayidx, align 4

在这种情况下,我可以迭代getelementptr指令的操作数
并通过第一个操作数上的getName()方法找到数组的名称(i).

但是,如果在源代码中,数组直接索引,

i[0] = 3;

然后,生成的bitcode如下

store i32 3, i32* getelementptr inbounds ([2 x i32], [2 x i32]* @i, i64 0, i64 0), align 4

在这里,我不知道如何从bitcode获取数组名称(i).
存储指令的第二个操作数的类型设置为PointerTy.并且第二个操作数的包含类型是int.这两个都是预期的,因为操作数是i32 *.但是,在这种情况下,我不确定如何获取getelementptr指令的句柄来迭代其操作数.

编辑:我应该提到数组i是全局的

最佳答案 在第一个示例中,store指令的第二个操作数是getelementptr指令,但在第二个示例中,它是getelementptr常量表达式,因为指针和索引都是常量.

因此,在第一种情况下,如果你得到StoreInst的指针操作数,你将得到一个GetElementPtrInst.在第二种情况下,你将获得一个ConstantExpr,其getOpcode()方法返回Instruction :: GetElementPtr.

您可以使用GEPOperator在代码中统一处理这两种情况.您可以使用dyn_cast< GEPOperator>(I),它将对指令和constantexprs执行正确的操作.

(注意 – 运算符不是LLVM IR概念 – 它只是一个C抽象来帮助这样的情况,你可能正在处理一个指令或一个常量表达式(可能会发生强制转换,GEP或算术运算)但你不在乎这种区别.)

点赞