2013-05-08 19 views
5

我想在我的一個合格文件中在llvm中創建控制流程圖。我目前使用以下顯示CFGllvm將控制流程圖轉儲到合格文件中

block->getParent()->viewCFG(); //block is a basic block 

問題是它彈出一個窗口。我只想在特定節目點轉儲cfg,作爲點文件(如果可能,則爲jpg),而不是在窗口中顯示。我怎樣才能做到這一點?我正在使用llvm 3.1。

注意:我在修改程序點前的通行證中修改了cfg。因此我不能使用opt -view-cfg

更新:

感謝Mishr,我能畫到圖這個

WriteGraph(File, (const llvm::Function*) &fun, true, "test"); //I have also tired with false

顯示的CFG。但節點是空白的。我該如何顯示節點的內容

回答

3

看看這個,看看viewCFG()函數之前的註釋。

http://llvm.org/docs/doxygen/html/CFGPrinter_8cpp_source.html

viewCFG()功能用於在新窗口中打印所述CFG。要將CFG轉儲到文件中,您必須使用CFGPrinter通行證,該通行證可以由句柄dot-cfg調用。

+0

謝謝你的回覆。請給出一個關於如何使用它的參考。我無法在該課程中找到同樣的功能 – simpleuser 2013-05-08 16:20:57

+0

'CFGPrinter'是一個通行證,您可以通過'opt'使用它。 – shrm 2013-05-09 11:11:56

+0

但是,如何指定繪製圖形的程序點?如果你可以指出一些示例用法,那將是非常好的 – simpleuser 2013-05-09 13:07:48

1

您需要添加包括: #include <llvm\Analysis\CFGPrinter.h>

它getEdgeSourceLabel裏面執行提供正確的節點標籤。 同時,請確保你不要<llvm\Support\CFG.h>文件,因爲它默認提供空標籤。

2

讓我添加一些東西給ssubbotin的答案。 問題是關於

DOTGraphTraits<const Function*> 

由CFGPrinter提供。

在我來說,我不得不使用類似呼叫:

WriteGraph<const llvm::Function*>(...) 

,使其工作。

函數模板的定義是這樣的:

template<typename GraphType> 
raw_ostream &WriteGraph(raw_ostream &O, const GraphType &G, 
         bool ShortNames = false, 
         const Twine &Title = "") 

所以GraphType獲得非const與隱含調用模板。

+1

最好將此添加爲相關答案的評論,而不是單獨作出回答。 – SuperBiasedMan 2015-05-15 10:12:33

+0

是的,不幸的是,我沒有足夠的排名:\ – wvoquine 2015-05-15 12:44:33