是LLVM';s';调用&x27;指令是一个终止符,如果是,为什么不在语法上呢?

是LLVM';s';调用&x27;指令是一个终止符,如果是,为什么不在语法上呢?,llvm,llvm-ir,Llvm,Llvm Ir,在文档[1]中,invoke指令被列为终止符指令,但在语法上它被写为: <result> = invoke [cconv] [ret attrs] <ty>|<fnty> <fnptrval>(<function args>) [fn attrs] [operand bundles] to label <normal label> unwind label <

在文档[1]中,
invoke
指令被列为终止符指令,但在语法上它被写为:

<result> = invoke [cconv] [ret attrs] <ty>|<fnty> <fnptrval>(<function args>) 
              [fn attrs] [operand bundles] to label <normal label> 
              unwind label <exception label>
=调用[cconv][ret attrs]|()
要标记的[fn attrs][操作数束]
展开标签
在描述中,它说这就像一个
调用
(它也绑定一个结果)

如果指令是终止符指令,为什么要这样写?是否可以使用该指令?事实上,
调用之后的任何指令都可以访问吗

在实验中,似乎在成功返回时,控制流会流向
。是否有一种特殊的返回方法,可以在
调用后将控制权返回到指令

与此相关的是,如果控件始终传递给
,是否可以访问从调用的函数返回的值(假设不返回
void


  • 您有多个问题:

  • 如果指令是终止符,为什么要这样写 指令

  • 它以这种方式编写,作为支持异常处理的一种手段。这是一种处理正常结果流或异常捕获的简便方法,无需大量额外的机器

  • 是否有可能使用该

  • 在以相应标签开始的基本块中,您应该能够访问结果。尝试执行此操作时是否出现错误

  • 事实上,调用后的任何指令都是可访问的吗

  • 由于它是一个基本块的终止指令,因此一般答案是。下面通常是某个对象的标签,可以是
    invoke
    中的设置,也可以是其他分支/交换机标签

  • 是否可以访问返回的值(假设 是否不从调用的函数返回void


  • 这看起来像是问题2的重复。因此,同样的答案也适用。

    既然您正在阅读文档,为什么不检查
    invoke
    本身的引理呢?啊——我的错误是认为寄存器只在一个基本块中可用(在这种情况下,因为invoke是最后一条指令,所以不清楚如何使用结果)。谢谢@DanielPatterson-是的,“范围”的概念会扼杀获得
    结果
    。如果您正在生成LLVM IR,则必须在登记命名约定中考虑这一点。