我正在尝试获取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是全局的。
发布于 2015-11-06 22:12:17
在第一个示例中,store
指令的第二个操作数是getelementptr
指令,但在第二个示例中,它是一个getelementptr
常量表达式,因为指针和索引都是常量。
因此,在第一种情况下,如果您获得StoreInst
的指针操作数,您将得到一个GetElementPtrInst
。在第二个例子中,您将得到一个ConstantExpr
,它的getOpcode()
方法返回Instruction::GetElementPtr
。
您可以在代码中使用GEPOperator
统一处理这两种情况。您可以使用dyn_cast<GEPOperator>(I)
,它将为指令和constantexprs做正确的事情。
(注意-- Operator
不是LLVM概念--它只是一个C++抽象,在这种情况下,您可能需要处理指令或常量表达式(这可能发生在转换、GEP或算术操作中),但您不关心区别。
https://stackoverflow.com/questions/33574522
复制相似问题