2016-02-12 87 views
6

我有三個問題:調用vs調用LLVM的IR代碼

1)LLVM的IR代碼中的Invoke和Call操作有什麼區別?

2)爲什麼在BasicBlocks here中調用指令不被視爲終結器操作?

3)Invoke和Call操作都可以用匯編語言生成間接調用嗎?

謝謝你在前進,

回答

7

1)R \ 調用是可以啓動異常的函數的調用。如果你意識到,調用定義一個塊來處理異常,另一個用於繼續正常流程。

2)R \ 調用指令不被視爲終止指令,因爲控制流被轉換爲另一個函數。在LLVM中,終止符指令必須反映可以執行的下一個(或多個)基本塊。

3)R \ 對不起,我不知道

1

關於3),目前還不清楚是否你問w.r.t.寫a)自己的後端或b)關於現有的後端。

a)是的,很顯然/如果你在後端實現這個功能,通常你可以生成任何你想要的東西。 b)哪個後端?即ARM的調用已經是間接分支(即bl指令),而X86的CALL對X86 HW有副作用(即保存返回地址,也是非功能性副作用,如支持調用棧分支預測),因此不能只是被間接呼叫所取代,而不模擬CALL會做什麼。 AFAIK使用間接分支的CALL仿真不屬於X86的LLVM後端。