2017-08-25 249 views
1

在文档[1]中,invoke指令被列为终止指令,但在语法上它被写为:LLVM的'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

既然你正在阅读文档,为什么不检查'invoke'本身的引理? – harold

回答

1

您有多个问题:

  1. 为什么指令这样写的,如果它是一个终结者 指令?

它是用这种方式来支持异常处理的方式。这是一种处理正常结果流或异常捕捉的简便(非常方便)的方法,而无需额外的机器。

  • 是它曾经能够使用<result>

  • 在基本块中,它与相应的标签开始,你应该能够访问的结果。尝试这样做时是否出现错误?

  • 实际上,将一个invoke从那以后的任何指令可到达?

  • 由于它是一个基本块的终止指令的话,一般的答案是没有。通常遵循的是标签,可以是invoke中的设置或其他分支/开关标签。

  • 是有可能得到访问时返回被调用的函数(假设 不返回void)的值?

  • 这看起来喜欢的问题2#重演。所以相同的答案适用。

    +0

    啊 - 我的错误是认为寄存器只在一个基本块中可用(在这种情况下,由于调用是最后一条指令,所以不清楚如何使用结果)。谢谢! –

    +0

    @DanielPatterson - 是的,'范围'的概念会杀死'结果',否则。如果您正在生成LLVM-IR,则必须在您的注册命名约定中考虑这一点。 –