首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取指令指针时出现LLVM断言错误

获取指令指针时出现LLVM断言错误
EN

Stack Overflow用户
提问于 2021-03-14 14:22:31
回答 1查看 130关注 0票数 0

我正在尝试获取指向每条指令的指针,这可以通过执行以下操作来实现:

代码语言:javascript
复制
Value* ptr = dyn_cast<Value>(&inst);

但是,在使用cmake运行编译后的C++程序时,我一直收到一个分段错误。在调试模式下,我得到以下错误消息:

代码语言:javascript
复制
opt-11: /usr/lib/llvm-11/include/llvm/IR/User.h:170: llvm::Value* llvm::User::getOperand(unsigned int) 
const: Assertion `i < NumUserOperands && "getOperand() out of range!"' failed.

LLVM doc中,下面是指向断言来源的代码块:

代码语言:javascript
复制
   Value *getOperand(unsigned i) const {
     assert(i < NumUserOperands && "getOperand() out of range!");
     return getOperandList()[i];
   }

我向程序中从getOperand()获取的每个变量添加了空检查,但错误仍然存在。有没有人知道它为什么会发生以及如何修复它?

EN

回答 1

Stack Overflow用户

发布于 2021-03-14 18:47:43

实际上,LLVM中的一些指令只有一个操作数,使用inst.getOperand(1)获取第二个操作数是没有意义的。因此,在继续操作之前,需要检查操作数的数量:

代码语言:javascript
复制
         for (auto& inst : bb) {
            Value* v1;
            Value* v2;
            if (inst.getNumOperands() >= 1) 
                v1 = inst.getOperand(0);
            if (inst.getNumOperands() == 2)
                v2 = inst.getOperand(1);
         }

或者简单地说

代码语言:javascript
复制
         for (auto& inst : bb) {
            Value* v1 = inst.getOperand(0);
            Value* v2;
            if (inst.getNumOperands() == 2)
                v2 = inst.getOperand(1);
         }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66621688

复制
相关文章

相似问题

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