LLVM分割故障 /需要使用指令而不是指令*

LLVM segmentation fault / need use Instruction instead of Instruction*

本文关键字:指令 故障 分割 LLVM      更新时间:2023-10-16

我在运行LLVM通行证时具有分段故障。我需要在基本块之外使用迭代"循环"以外的bbterinators数组。似乎LLVM在循环中迭代时没有保护地址(注意:TerminatorInst *BasicBlock::getTerminator()),因此我需要将BBTerminators保持在Instruction类型的变量中,而不是Instruction *。如何将整个Instructions复制到BBterminators

for (Function::iterator II = F.begin(), EE = F.end(); II != EE; ++II, ++ii)
{
BasicBlock* BB = (dyn_cast<BasicBlock>(II));
if (BB->getTerminator())
{
    Instruction *current = BB->getTerminator();
    Instruction *previous = current->getPrevNode();
    if (current->getOpcode() == Instruction::Br) 
    {   
        BBterminators[ii] = current;

其中 Instruction **BBterminators = new Instruction *[100];

我不确定在这里"保护"您的意思。在BB上迭代并查看其终结者当然不会使指示指针无效,因此只要您安全地不删除任何东西,就可以保留它们。无论如何,您也可以通过调用clone来复制Instruction*对象(请注意,Instruction不可用COPY CTOR和分配操作员逐个设计)。这样的东西:

virtual bool runOnFunction(Function &F) {
  std::vector<Instruction*> terminators;
    for (Function::iterator bb = F.begin(), bb_e = F.end(); bb != bb_e; ++bb) {
      terminators.push_back(bb->getTerminator()->clone());
    }
  ...
  ...
}

完成后,不要忘记释放您的副本。

引入条件

if ( !(II->empty()) && II->back().isTerminator() )

计算之前