1

私はLLVMの初心者です。BasicBlockの命令間を移動しようとしていますが、移動できません。この特定の例では、end命令の前の命令を取得しようとしています。私は2つの方法を試しています:

  1. 私は次のコードシーケンスを持っています:

    bool patternDC::runOnBasicBlock(BasicBlock &BB) {
    ...
    if (BB.getTerminator())
      {
                Instruction* current = BB.getTerminator();
                errs() << "\n LAST: "<<*current<<"\n";
    
            Instruction* prev = &BB.back();
            errs() << "\n PENULTIMATE: "<<*prev<<"\n";         
           ...
    

端末は同じ命令を出力します。back()がどのように機能するのかわかりません。(ファイルBasicBlock.hの199行目の定義。)

  1. 私も試しました:

    bool patternDC::runOnBasicBlock(BasicBlock &BB) {
    ...
    BasicBlock::const_iterator I = BB.begin();
    BasicBlock::const_iterator E = BB.end();
    BasicBlock::const_iterator prev_iter,last_iter;
    prev_iter = NULL; last_iter = NULL;
    for(;I!=E;I++){
        prev_iter = last_iter;
        last_iter = I;
    }
    if(prev_iter){
        errs() << "prev_iter: " << *(dyn_cast<Instruction>(prev_iter)) << "\n";
    }
    if(last_iter){
        errs() << "last_iter: " << *(dyn_cast<Instruction>(last_iter)) << "\n";
    }
     // not related to the main question: uncomment the next line for an unusual      
    //behavior: lastlast is DIFFERENT from last.lastlast=section(BasicBlock)
      // errs() << "lastlast: " << *(dyn_cast<Instruction>(I)) << "\n";
      ...
       Instruction* prev = *(dyn_cast<Instruction*>(prev_iter));
        errs() << "\n prev: "<<*prev<<"\n";
    

ターミナルはprevとlastをうまく出力しますが、Instruction * prevに割り当てようとすると、コンパイルエラーが発生します。Clangエラーは次のとおりです。 "..... /home/alex/llvm/include/llvm/Support/Casting.h: 51:28:エラー:「classof」は「llvm ::Instruction*」のメンバーではありません」

誰かが基本ブロックの要素を使用するためのより良い方法を知っているか、これらが機能しない理由を知っている場合は、私に知らせてください:)

ありがとう、アレックス

4

2 に答える 2

1

すべてのLLVMInstructionクラスもilist_nodeです。つまり、それらを保持するリスト(この場合は基本ブロック)内の次/前の命令を照会できます。より具体的にあなたの質問に:

Instruction* last = BB.getTerminator();
Instruction* prev = last->getPrevNode();

ilist_node関連するAPIを確認するには、LLVMのソースのの定義を参照してください。

于 2012-12-17T21:54:42.117 に答える
-1

要素のみの基本ブロックの場合(BB-> size()> 1)を確認して解決しました

于 2013-01-10T14:15:11.597 に答える