我有三个问题:调用vs调用LLVM的IR代码
1)LLVM的IR代码中的Invoke和Call操作有什么区别?
2)为什么在BasicBlocks here中调用指令不被视为终结器操作?
3)Invoke和Call操作都可以用汇编语言生成间接调用吗?
谢谢你在前进,
我有三个问题:调用vs调用LLVM的IR代码
1)LLVM的IR代码中的Invoke和Call操作有什么区别?
2)为什么在BasicBlocks here中调用指令不被视为终结器操作?
3)Invoke和Call操作都可以用汇编语言生成间接调用吗?
谢谢你在前进,
1)R \ 调用是可以启动异常的函数的调用。如果你意识到,调用定义一个块来处理异常,另一个用于继续正常流程。
2)R \ 调用指令不被视为终止指令,因为控制流被转换为另一个函数。在LLVM中,终止符指令必须反映可以执行的下一个(或多个)基本块。
3)R \ 对不起,我不知道
关于3),目前还不清楚是否你问w.r.t.写a)自己的后端或b)关于现有的后端。
a)是的,很显然/如果你在后端实现这个功能,通常你可以生成任何你想要的东西。 b)哪个后端?即ARM的调用已经是是间接分支(即bl指令),而X86的CALL对X86 HW有副作用(即保存返回地址,也是非功能性副作用,如支持调用栈分支预测),因此不能只是被间接呼叫所取代,而不模拟CALL会做什么。 AFAIK使用间接分支的CALL仿真不属于X86的LLVM后端。