首页 > 解决方案 > 获取指令指针时发生 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()但错误仍然存​​在。有谁知道它为什么会发生以及如何解决它?

标签: c++clangllvmllvm-irllvm-c++-api

解决方案


实际上,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);
         }

推荐阅读