18

さらに使用したいため、関数内の基本ブロックのラベルを検出して出力するためのパスを作成しましたsplitBasicBlock()。私はそれを次のように書きました:

virtual bool runOnModule(Module &M)
{
    for(Module::iterator F = M.begin(), E = M.end(); F!= E; ++F)
    {
        errs()<<"Function:"<<F->getName()<<"\n";
        //for(Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB)
        for (iplist<BasicBlock>::iterator iter = F->getBasicBlockList().begin();
                    iter != F->getBasicBlockList().end();
                    iter++)
        {
          BasicBlock* currBB = iter;
          errs() << "BasicBlock: "  << currBB->getName() << "\n";   
        }
    }
    return true;
}

IR ファイルは次のようになります。

; <label>:63                                      ; preds = %43
  %64 = load i32* %j, align 4
  %65 = sext i32 %64 to i64
  %66 = load i8** %tempdst, align 8
  %67 = getelementptr inbounds i8* %66, i64 %65
  store i8 -1, i8* %67, align 1
  br label %73

; <label>:68                                      ; preds = %43
  %69 = load i32* %j, align 4
  %70 = sext i32 %69 to i64
  %71 = load i8** %tempdst, align 8
  %72 = getelementptr inbounds i8* %71, i64 %70
  store i8 0, i8* %72, align 1
  br label %73

; <label>:73                                      ; preds = %68, %63
  br label %74

ただし、ラベルについては何も知りませんでした:

Function:main
BasicBlock:
BasicBlock:
BasicBlock:

これらの「名前のない」基本ブロックの何が問題になっていますか? 私は何をすべきか?

4

5 に答える 5

15

BasicBlocks には (メソッドで示されるように) 名前がない場合がありますが、 の値にストリーミングする代わりに をhasName()使用して、一意の BasicBlock 識別子を出力できます。名前のない BasicBlock の場合、これは などの基本ブロックの数値表現を提供します。currBB->printAsOperand(errs(), false)errs()currBB->getName()%68

于 2016-04-03T14:26:32.033 に答える
11

LLVM IR の値に名前を付ける必要はありません。実際、これらの基本ブロックには名前がありません。そのため、 から空の文字列を取得しますcurrBB->getName()

LLVM IR プリントアウトに名前がある理由は、LLVM IR のテキスト形式 (.ll ファイルに表示される) に出力する場合、参照可能にするために名前を割り当てる必要があるためです。基本ブロック (およびその他の値) への連続した数値名。ただし、これらの数値名はプリンターによってのみ作成され、実際にはモジュールには存在しません。

于 2014-10-09T17:42:41.703 に答える
3

今のLLVMの振る舞いは違うと思います。同様のコード行を使用して、LLVM-4.0 でラベルの名前を取得できます。

for (auto &funct : m) {
            for (auto &basic_block : funct) {
            StringRef bbName(basic_block.getName());
                errs() << "BasicBlock: "  << bbName << "\n";
            }
}
于 2017-09-05T00:47:52.603 に答える