2

LLVM パスの実行中にセグメンテーション違反が発生しました。基本ブロックの反復「for」ループの外で BBterminators 配列を使用する必要があります。TerminatorInst *BasicBlock::getTerminator()ループを反復するとき、LLVM はアドレス (注: ) を保護しないよう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];

4

2 に答える 2

4

ここでの「保護」の意味がわかりません。BB を反復処理してターミネータを確認しても、命令ポインターが無効になることはありません。そのため、何も削除しないことが安全である限り、それらを保持できます。いずれにせよ、Instruction*呼び出しによってオブジェクトをコピーすることもできます (設計上、コピー ctor と代入演算子ではコピーできないことにclone注意してください)。Instructionこのようなもの:

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 に答える