首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获取LLVM getelementptr的操作数名称。

获取LLVM getelementptr的操作数名称。
EN

Stack Overflow用户
提问于 2015-11-06 19:46:27
回答 1查看 2.2K关注 0票数 5

我正在尝试获取getelementptr指令所引用的数组的名称。当数组被索引为使用实际c++代码中的中间变量时,这似乎是可行的,如下所示

代码语言:javascript
运行
复制
int a = 0;
i[a] = 3; 

在本例中,我得到以下bitcode

代码语言:javascript
运行
复制
%arrayidx = getelementptr inbounds [2 x i32], [2 x i32]* @i, i64 0, i64 %idxprom
store i32 3, i32* %arrayidx, align 4

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

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

代码语言:javascript
运行
复制
i[0] = 3;

然后,生成的bitcode如下所示

代码语言:javascript
运行
复制
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是全局的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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或算术操作中),但您不关心区别。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33574522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档