在文档[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
)?
答案 0 :(得分:1)
您有多个问题:
如果指令是终结符,为什么指令会以这种方式写入 指令?
它以这种方式编写,作为支持异常处理的手段。这是一种简单(非常方便)的方法来处理正常的结果流或异常捕获,而无需额外的机器。
是否可以使用
<result>
?
在以相应标签开头的基本块中,您应该能够访问结果。在尝试这样做时是否收到错误?
确实,调用后的任何指令都可以访问吗?
由于它是基本块的终止指令,因此一般答案为 否 。通常遵循的是对某些内容的标签,可以是invoke
中设置的标签,也可以是某些其他分支/开关标签。
是否可以访问返回的值(假设 从被调用的函数返回void?
这看起来像问题#2的重复。所以同样的答案也适用。