我正在尝试获取getelementptr指令引用的数组的名称。当数组被索引到实际c代码中使用中间变量时,这似乎有效,如此
b
在这种情况下,我得到以下bitcode
c
在这种情况下,我可以遍历getelementptr指令的操作数 并通过第一个操作数上的getName()方法找到数组的名称(i)。
但是,如果在源代码中,数组直接索引为
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
这里我不知道如何从bitcode获取数组名称(i)。 存储指令的第二个操作数的类型设置为PointerTy。并且第二个操作数的包含类型是int。这两个都是预期的,因为操作数是i32 *。但是,在这种情况下,我不确定如何获取getelementptr指令的句柄来迭代其操作数。
编辑:我应该提到数组i是全局的
答案 0 :(得分:2)
在第一个示例中,store
指令的第二个操作数是getelementptr
指令,但在第二个示例中,它是getelementptr
常量表达式,因为指针和索引都是常量。
因此,在第一种情况下,如果你得到StoreInst
的指针操作数,你将获得GetElementPtrInst
。在第二种情况下,您将获得getOpcode()
方法返回Instruction::GetElementPtr
的{{3}}。
您可以使用ConstantExpr
在代码中统一处理这两种情况。您可以使用dyn_cast<GEPOperator>(I)
,它会为指令和constantexprs做正确的事。
(注意 - Operator
不是LLVM IR概念 - 它只是一个C ++抽象来帮助这样的情况,你可能正在处理一个指令或一个常量表达式(这可能发生在强制转换, GEP或算术运算)但你不关心区别。)