2016-02-12 120 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后端。