LLVM的'invoke'指令是一个终止符,如果是这样,为什么不用语法?
在文档[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
)?
您有多个问题:
-
为什么指令这样写的,如果它是一个终结者 指令?
它是用这种方式来支持异常处理的方式。这是一种处理正常结果流或异常捕捉的简便(非常方便)的方法,而无需额外的机器。
-
是它曾经能够使用
<result>
? -
实际上,将一个invoke从那以后的任何指令可到达?
-
是有可能得到访问时返回被调用的函数(假设 不返回void)的值?
在基本块中,它与相应的标签开始,你应该能够访问的结果。尝试这样做时是否出现错误?
由于它是一个基本块的终止指令的话,一般的答案是没有。通常遵循的是标签,可以是invoke
中的设置或其他分支/开关标签。
这看起来喜欢的问题2#重演。所以相同的答案适用。
啊 - 我的错误是认为寄存器只在一个基本块中可用(在这种情况下,由于调用是最后一条指令,所以不清楚如何使用结果)。谢谢! –
@DanielPatterson - 是的,'范围'的概念会杀死'结果',否则。如果您正在生成LLVM-IR,则必须在您的注册命名约定中考虑这一点。 –
既然你正在阅读文档,为什么不检查'invoke'本身的引理? – harold