0

在 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 的增量,它才不会发出此错误,但结果错误

4

1 回答 1

2

您应该首先使用TI->getNumSuccessors()来验证此终结器是否支持您想要的后继数量。

还要记住,如果你想在终结器中添加一个超出当前后继者数量的后继者,你不能使用setSuccessor- 那只能改变现有的后继者,而不是添加新的后继者。要添加新的,您需要使用addCase它是开关还是addDestination间接分支。没有其他终结器类型支持无限数量的分支。

顺便说一句,从错误消息来看,您似乎正在尝试setSuccessor在 a - 上使用BranchInst- 它最多可以有两个继任者。如果您想修改 CFG,我建议您先了解一下您的终结器应该是什么样子。

于 2013-07-15T14:37:31.473 回答