2013-05-26 33 views
2

我可以通過更改其目標來插入新的邊緣,並通過其源和目標刪除另一條邊。換句話說,我是否可以用另一個替換邊緣的基本塊目標,以便在CFG中進行一些修改?如何在LLVM中插入/刪除邊緣?

ProfileInfo試圖getEdge()功能,但它沒有工作:

// to replace the basic block 
Bb->getTerminator()->replaceUsesOfWith((*SI), (*rit)); 

// trying to set the new basic block as a new destination 
xx = ProfileInfo::getEdge(Bb,(*rit)); 

回答

1

基本塊有一個終止指令。但是,這個終止符可以是one of several instructions,這是完全不同的。有些可以有多個邊緣。所以它不像你想象的那麼簡單。

可以做的是看塊的終止符和修改指令分支到不同的目的地。這取決於指導,並且(當然)取決於您的具體需求。

+0

因此,根據每種類型的終止符指令,都有添加新的基本塊來改變邊緣的功能。我該如何檢測終止符的類型並在LLVM中設置新的基本塊 –

+1

@ R.Omar:'BasicBlock :: getTerminator'爲您提供了終止符指令,並且可以使用通常的LLVM RTTI來測試它的子類型技術。請參閱圖表以查看「TerminatorInst」的可用子類:http://llvm.org/docs/doxygen/html/classllvm_1_1TerminatorInst.html –

+0

這真的幫助了我,謝謝 –