LLVM分段错误/需要使用指令而不是指令*

时间:2012-12-19 16:17:07

标签: c++ llvm

运行LLVM传递时出现分段错误。我需要在基本块的迭代“for”循环之外使用BBterminators数组。在迭代循环时,似乎LLVM不保护地址(注意:TerminatorInst *BasicBlock::getTerminator()),因此我需要将BBterminators保留在Instruction类型的变量中,而不是Instruction *。如何将整个Instructions复制到BBterminators

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

2 个答案:

答案 0 :(得分: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());
    }
  ...
  ...
}

完成后,不要忘记发布副本。

答案 1 :(得分:0)

介绍条件

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

在计算之前