関数の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 RegisterPassMachineFunctionPassFunctionPass
CallGraphの別のパスを開始しました。CallGraph &CG = getAnalysis<CallGraph>();効率よく使っています。これは、CFGを取得するのと同様の方法ですか?これまでに見つけsucc_iterator/succ_begin/succ_endたのはからのものCFG.hですが、それでもどういうわけかCFG分析を取得する必要があると思います。
前もって感謝します !