【问题标题】:LLVM assertion error when getting the instruction pointer获取指令指针时发生 LLVM 断言错误
【发布时间】:2021-03-14 06:22:30
【问题描述】:

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

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() 获取的每个变量都添加了空检查,但错误仍然存​​在。有谁知道它为什么会发生以及如何解决它?

【问题讨论】:

  • 1.运行 Valgrind。 2.如果你想用 LLVM 做很多事情,构建一个带有调试符号的树。
  • 而 FWIW,使用 dyn_cast&lt;&gt; 转换为 Value 没有意义。 Value 是根类。如果您有Instruction*,那么您已经拥有Value*,那么dyn_cast&lt;&gt; 将无事可做。
  • 感谢 cmets!我是 C++ 调试的新手,您能详细说明一下使用调试符号构建树吗?
  • 你说得对,之前我认为问题的根源在于指令指针,但事实并非如此。

标签: c++ clang llvm llvm-ir llvm-c++-api


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-03-18
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多