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