微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

获取指令指针时LLVM断言错误

如何解决获取指令指针时LLVM断言错误

我正在尝试获取指向每条指令的指针,据说可以通过以下方式实现:

Value* ptr = dyn_cast<Value>(&inst);

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

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 中,这里是指向断言源的代码块:

   Value *getoperand(unsigned i) const {
     assert(i < NumUserOperands && "getoperand() out of range!");
     return getoperandList()[i];
   }

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

解决方法

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

         for (auto& inst : bb) {
            Value* v1;
            Value* v2;
            if (inst.getNumOperands() >= 1) 
                v1 = inst.getOperand(0);
            if (inst.getNumOperands() == 2)
                v2 = inst.getOperand(1);
         }

或者干脆

         for (auto& inst : bb) {
            Value* v1 = inst.getOperand(0);
            Value* v2;
            if (inst.getNumOperands() == 2)
                v2 = inst.getOperand(1);
         }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。