获取LLVM getelementptr的操作数名称

时间:2015-11-06 19:46:28

标签: c arrays llvm

我正在尝试获取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是全局的

1 个答案:

答案 0 :(得分:2)

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

因此,在第一种情况下,如果你得到StoreInst的指针操作数,你将获得GetElementPtrInst。在第二种情况下,您将获得getOpcode()方法返回Instruction::GetElementPtr的{​​{3}}。

您可以使用ConstantExpr在代码中统一处理这两种情况。您可以使用dyn_cast<GEPOperator>(I),它会为指令和constantexprs做正确的事。

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