ModulePass中的错误,设置BasicBlock的后继

时间:2013-07-15 13:43:27

标签: llvm llvm-ir

在LLVM中的以下代码中

   unsigned ii=0;
BasicBlock* Bb = &*i;
TerminatorInst *TI = i->getTerminator();
    for( std::set<BasicBlock*>::iterator rit=Result.begin(); rit!=Result.end();++rit,++ii)
      {
    TI->setSuccessor(ii,(*rit));
    errs() << "\n\tBasic block (name=" <<(*rit)->getName() << ")";

      }

在Module Pass

中实现时,代码给出了以下错误
    Basic block (name=if.then)opt: /home/rasha/llvm2/llvm/include/llvm/IR
/Instructions.h:2406: void llvm::BranchInst::setSuccessor(unsigned int, llvm::BasicBlock
 *): Assertion `idx < getNumSuccessors() && "Successor # out of range for Branch!"' failed.

0  opt             0x00000000018895be llvm::sys::PrintStackTrace(_IO_FILE*) + 46

我是否应该使用一个标准来将每个基本块的idx设置为后继 此外,只有在我删除ii的增量但结果错误时才会发出此错误

1 个答案:

答案 0 :(得分:2)

首先应使用TI->getNumSuccessors()验证此终结符是否支持所需的后继数。

另请注意,如果要在终结器中添加当前继承者数以外的后继者,则不能使用setSuccessor - 这只能更改现有后继者,而不能添加新成员。要添加新的,您需要使用addCase(如果是开关)或addDestination(如果它是间接分支)。没有其他终结者类型支持无限数量的分支。

顺便说一下,从错误消息来看,您似乎试图在setSuccessor上使用BranchInst - 最多可以有两个后继者。如果您想修改CFG,我建议您先了解终结器的外观。