LLVM IR中的基本块在汇编代码中似乎已损坏

时间:2019-10-24 16:44:44

标签: llvm llvm-ir

我通过llvm pass将调试信息添加到基本块的第一条和最后一条指令中,然后我成功地找到了我在汇编代码中添加的信息。但是第一条指令和最后一条指令的信息数是不同的。

我想知道结果是否正确,如果正确,为什么数字不同以及如何正确获得汇编代码中块的边界?

我的通行证的代码

alter table myTable MODIFY Descr varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci not null default '';

它运行没有任何错误。一些结果:

  bool runOnFunction(Function &F) override {
    unsigned start = 2333;
    unsigned end = 23333;
    MDNode *N = F.getMetadata("dbg");
    for (BasicBlock &B : F) {
      errs() << "Hello: ";
      Instruction *I = B.getFirstNonPHI();
      DebugLoc loc = DebugLoc::get(start, 0, N);
      if (loc && I!=NULL) {
        I->setDebugLoc(loc);
      } else {
        errs() << "start error";
      }
      I = B.getTerminator();
      loc = DebugLoc::get(end, 1, N);
      if (loc && I!= NULL) {
        I->setDebugLoc(loc);
      } else {
        errs() << "end error";
      }
      errs() << "\n";
    }
    return true;
  }
};
} 

我发现 2333 23333 不匹配,而 2333 23333 的数量是不同架构的汇编代码不同。我使用opt来运行我的pass和llc以获取汇编代码。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我认为问题在于优化。通过之后,IR会进行其他几轮优化,从而改变了基本块并消除了一些说明。

您可能拥有LLVM page

中的以下注册功能
static llvm::RegisterStandardPasses Y(
    llvm::PassManagerBuilder::EP_EarlyAsPossible,
    [](const llvm::PassManagerBuilder &Builder,
       llvm::legacy::PassManagerBase &PM) { PM.add(new Hello()); });

尝试使用EP_OptimizerLast而不是EP_EarlyAsPossible。这将使您作为最后一个优化程序运行。

另一种选择是使用EP_EnabledOnOptLevel0并将opt与-O0一起使用。

您可以在此page

中查找标志

使用-emit-llvm*.ll中生成LLVM IR可能会有所帮助。可见您的代码对IR所做的事情