関数のCFGにDFSトラバースアルゴリズムを適用したいと思います。したがって、CFGの内部表現が必要です。方向付けられたエッジと斑点が必要MachineBasicBlock::const_succ_iterator
です。?FunctionPass
の代わりに、を使用して、方向付けられたエッジを持つCFGを取得する方法があります。MachineFunctionPass
これが必要な理由は、の使用に問題があるためですMachineFunctionPass
。これまでにいくつかの複雑なパスを作成しましたが、MachineFunctionPass
パスを実行できません。
「AMachineFunctionPass
は、プログラム内の各LLVM関数のマシン依存表現で実行されるLLVMコードジェネレーターの一部です。コードジェネレーターパスはTargetMachine::addPassesToEmitFile
、同様のルーチンによって特別に登録および初期化されるため、通常、から実行することはできません。 optまたはbugpointコマンド。"...では、どうすれば実行できますMachineFunctionPass
か?
opt a simpleMachineFunctionPass
で実行しようとすると、エラーが発生しました:
Pass 'mycfg' is not initialized.
Verify if there is a pass dependency cycle.
Required Passes:
opt: PassManager.cpp:638: void llvm::PMTopLevelManager::schedulePass(llvm::Pass*): Assertion `PI && "Expected required passes to be initialized"' failed.
したがって、パスを初期化する必要があります。しかし、他のすべてのパスでは、初期化を行わず、パス登録を保持しているllvmファイルを再コンパイルする必要があるため、使用したくありません...を使用しINITIALIZE_PASS
続ける方法はありますか?に変更しても問題はないので、確かにoptの問題かもしれません。static RegisterPass
MachineFunctionPass
FunctionPass
CallGraphの別のパスを開始しました。CallGraph &CG = getAnalysis<CallGraph>();
効率よく使っています。これは、CFGを取得するのと同様の方法ですか?これまでに見つけsucc_iterator/succ_begin/succ_end
たのはからのものCFG.h
ですが、それでもどういうわけかCFG分析を取得する必要があると思います。
前もって感謝します !