LLVM IR 代码中的调用与调用

问题描述 投票:0回答:3

我有三个问题:

1)LLVM IR 代码中的 Invoke 和 Call 操作有什么区别?

2) 为什么 Call 指令在 BasicBlocks here 中不被视为终结器操作?

3) Invoke 和 Call 操作是否都可以生成汇编语言的间接调用?

提前谢谢您,

llvm llvm-ir
3个回答
12
投票

1) R\ Invoke 是对可以启动异常的函数的调用。如果您意识到,请调用定义一个块来处理异常,另一个块来继续正常流程。

2)R\ 调用指令不被视为终止指令,因为控制流被传输到另一个函数。在 LLVM 中,终止符指令必须反映下一个(或多个)可以执行的基本块。

3)R\ 抱歉,我不知道


2
投票

关于3),不清楚你是否在问w.r.t。编写 a) 自己的后端或 b) 关于现有后端。

a)是的,显然/通常,如果您在后端实现的话,您可以生成任何您想要的东西。 b) 哪个后端?即 ARM 的调用已经是间接分支(即 bl 指令),而 X86 的 CALL 对 X86 硬件有副作用(即保存返回地址,还有非功能性副作用,例如支持调用堆栈分支预测),因此不能只是用间接调用代替,而不模拟 CALL 会做什么。 AFAIK 使用间接分支的 CALL 模拟不是 X86 的 LLVM 后端的一部分。


2
投票
    invoke 和 call 用于调用函数。 call 指令是普通的 C 风格调用,一旦函数返回,程序就会从函数调用后的下一条指令恢复。
  1. invoke 可用于处理异常,当函数未正常返回时,它将从不同的基本块(也称为着陆垫)“恢复”。着陆场将有处理异常的信息。
  2. 可以使用调用和调用指令 AIUI 生成间接调用。 更多详细信息请参见 llvm langref:
  3. https://llvm.org/docs/LangRef.html

© www.soinside.com 2019 - 2024. All rights reserved.