2013-03-15 43 views
3

我想在函數的CFG上應用DFS遍歷算法。因此,我需要CFG的內部表示。我需要有針對性的邊緣並且發現MachineBasicBlock::const_succ_iterator。有沒有辦法通過使用FunctionPass而不是MachineFunctionPass來獲得具有定向邊緣的CFG?我想要這個的原因是我有使用MachineFunctionPass的問題。我已經寫了幾個複雜的傳球直到現在,但我無法執行MachineFunctionPass傳球。LLVM遍歷CFG

我發現:「A MachineFunctionPass是LLVM代碼生成代碼發生器通行證登記,並由TargetMachine::addPassesToEmitFile和類似的例程專門初始化上程序中的每個LLVM功能的機器相關的表示執行的一部分,所以。他們通常不能從opt或bugpoint命令運行。「......那麼我如何運行MachineFunctionPass

當我試圖與選擇簡單MachineFunctionPass跑,我得到了錯誤:

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. 

所以我必須初始化通。但在我所有其他通行證我沒有任何初始化,我不想使用INITIALIZE_PASS因爲我必須重新編譯llvm文件,保持通過註冊...有沒有辦法繼續使用static RegisterPassMachineFunctionPass?我提到,如果我更改爲FunctionPass,我沒有任何問題,所以確實可能是選擇性問題。

我已經爲CallGraph啓動了另一個通行證。我正在有效地使用CallGraph &CG = getAnalysis<CallGraph>();。這是獲得CFG-s的類似方式?我到目前爲止發現的succ_iterator/succ_begin/succ_endCFG.h,但我認爲我仍然需要以某種方式獲得CFG分析。

預先感謝您!

+0

'MachineBasicBlock'如何與IR相關?除了succ_iterator或pred_iterator之外,您還需要什麼? IR已經是CFG。 – 2013-03-15 15:26:57

+0

好的。所以我可以直接申請succ_iterator?我不需要以某種方式得到CFG分析,CFG的內部表示?如果它已經在那裏,我會嘗試使用它並更新我的問題(我嘗試這種方法時遇到了一些問題)。 – Alex 2013-03-15 15:35:08

+0

不,你不需要單獨的分析通行證就可以獲得CFG。有獲得DominatorTree,DominanceFrontier等的專用通行證,但CFG已經在設計中。如果您想要了解如何遍歷CFG的示例,請查看「DominanceFrontier.cpp」。 – 2013-03-15 16:08:05

回答

3

我想你可能會混淆一些術語。每個函數中的基本塊已經安排在一種CFG中,而LLVM爲您提供了遍歷它的工具。例如,請參閱my answer to this question

MachineFunction生活在不同的層面上,除非你做的事情非常特殊,這不是你應該操作的層次。它太低級別,而且太特定目標。有一些水平的概述here