LLVM是否会调用'指导终结者,如果是这样,为什么不在语法上?

时间:2017-08-25 18:01:16

标签: 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 <exception label>

在描述中它说它就像一个call(它也绑定了一个结果)。

如果指令是终结符指令,为什么这样写入指令,是否可以使用<result>?实际上,invoke之后的任何指令都可以到达吗?

在实验中,似乎在成功返回时,控制流向<normal label>。是否有一种特殊的返回方式,而是在invoke之后将控制权返回给指令?

与此相关,如果控制总是传递给<normal label>,是否可以从被调用的函数访问返回的值(假设不返回void)?

  1. http://llvm.org/docs/LangRef.html#terminator-instructions

1 个答案:

答案 0 :(得分:1)

您有多个问题:

  1.   

    如果指令是终结符,为什么指令会以这种方式写入   指令?

  2. 它以这种方式编写,作为支持异常处理的手段。这是一种简单(非常方便)的方法来处理正常的结果流或异常捕获,而无需额外的机器。

    1.   

      是否可以使用<result>

    2. 在以相应标签开头的基本块中,您应该能够访问结果。在尝试这样做时是否收到错误?

      1.   

        确实,调用后的任何指令都可以访问吗?

      2. 由于它是基本块的终止指令,因此一般答案为 。通常遵循的是对某些内容的标签,可以是invoke中设置的标签,也可以是某些其他分支/开关标签。

        1.   

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

        2. 这看起来像问题#2的重复。所以同样的答案也适用。