2

运行 LLVM 通行证时出现分段错误。我需要在基本块的迭代“for”循环之外使用 BBterminators 数组。似乎 LLVMTerminatorInst *BasicBlock::getTerminator()在遍历循环时不保护地址(注意:),所以我需要将 BBterminators 保存在类型的变量中Instruction,而不是Instruction *. 我怎样才能将整个复制InstructionsBBterminators

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];

4

2 回答 2

4

我不确定您在这里所说的“保护”是什么意思。遍历 BB 并查看它们的终止符当然不会使指令指针无效,因此只要您可以安全地不删除任何内容,您就可以保留它们。在任何情况下,您也可以Instruction*通过调用来复制对象clone(请注意,Instruction通过设计,复制 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());
    }
  ...
  ...
}

完成后不要忘记发布您的副本矢量。

于 2012-12-19T22:44:33.150 回答
0

介绍一个条件

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

计算之前

于 2013-01-10T14:20:51.987 回答