BasicBlockList插入错误

时间:2013-08-05 09:49:00

标签: llvm

Function* NF= Function::Create(F->getFunctionType(), F->getLinkage());
BasicBlockListType& BList= NF->getBasicBlockList();
for(std::set<BasicBlock*>::iterator xit=BBsetArray[0].begin(); xit!=BBsetArray[0].end();xit++)
  {
    BList.push_back((*xit));
  }

这个代码将基本块插入到函数基本块列表中我得到了以下错误

opt: /home/rasha/llvm2/llvm/lib/IR/SymbolTableListTraitsImpl.h:68: void 
llvm::SymbolTableListTraits<llvm::BasicBlock,    
llvm::Function>::addNodeToList(ValueSubClass *) [ValueSubClass = llvm::BasicBlock, 
ItemParentClass = llvm::Function]: Assertion `V->getParent() == 0 && "Value already in 
a container!!"' failed.

1 个答案:

答案 0 :(得分:1)

错误消息看起来非常简单:您尝试插入函数的基本块已包含在另一个函数中。

要解决此问题,您可以先在这些块上调用removeFromParent(),但更好的方法是不移动这些基本块,而是将它们克隆到新函数中 - 这样也可以保持原始函数不变。为此,请查看“llvm / Transforms / Utils / Cloning.h”中的CloneFunction()函数。