在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的增量但结果错误时才会发出此错误
答案 0 :(得分:2)
首先应使用TI->getNumSuccessors()
验证此终结符是否支持所需的后继数。
另请注意,如果要在终结器中添加当前继承者数以外的后继者,则不能使用setSuccessor
- 这只能更改现有后继者,而不能添加新成员。要添加新的,您需要使用addCase
(如果是开关)或addDestination
(如果它是间接分支)。没有其他终结者类型支持无限数量的分支。
顺便说一下,从错误消息来看,您似乎试图在setSuccessor
上使用BranchInst
- 最多可以有两个后继者。如果您想修改CFG,我建议您先了解终结器的外观。