我想在函數的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 RegisterPass
爲MachineFunctionPass
?我提到,如果我更改爲FunctionPass
,我沒有任何問題,所以確實可能是選擇性問題。
我已經爲CallGraph啓動了另一個通行證。我正在有效地使用CallGraph &CG = getAnalysis<CallGraph>();
。這是獲得CFG-s的類似方式?我到目前爲止發現的succ_iterator/succ_begin/succ_end
從CFG.h
,但我認爲我仍然需要以某種方式獲得CFG分析。
預先感謝您!
'MachineBasicBlock'如何與IR相關?除了succ_iterator或pred_iterator之外,您還需要什麼? IR已經是CFG。 – 2013-03-15 15:26:57
好的。所以我可以直接申請succ_iterator?我不需要以某種方式得到CFG分析,CFG的內部表示?如果它已經在那裏,我會嘗試使用它並更新我的問題(我嘗試這種方法時遇到了一些問題)。 – Alex 2013-03-15 15:35:08
不,你不需要單獨的分析通行證就可以獲得CFG。有獲得DominatorTree,DominanceFrontier等的專用通行證,但CFG已經在設計中。如果您想要了解如何遍歷CFG的示例,請查看「DominanceFrontier.cpp」。 – 2013-03-15 16:08:05