4

関数の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分析を取得する必要があると思います。

前もって感謝します !

4

1 に答える 1

3

いくつかの用語が混同されている可能性があると思います。各関数内の基本ブロックは、一種の CFG に既に配置されており、LLVM はそれをトラバースするためのツールを提供します。たとえば、この質問に対する私の回答を参照してください。

MachineFunctionあなたが特別なことをしていない限り、これはあなたが活動すべきレベルではありません。レベルが低すぎて、対象が限定的すぎます。ここにレベルの概要があります

于 2013-03-16T22:46:43.723 に答える