私はLLVMの初心者です。BasicBlockの命令間を移動しようとしていますが、移動できません。この特定の例では、end命令の前の命令を取得しようとしています。私は2つの方法を試しています:
私は次のコードシーケンスを持っています:
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行目の定義。)
私も試しました:
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*」のメンバーではありません」
誰かが基本ブロックの要素を使用するためのより良い方法を知っているか、これらが機能しない理由を知っている場合は、私に知らせてください:)
ありがとう、アレックス