是LLVM';s';调用&x27;指令是一个终止符,如果是,为什么不在语法上呢?
在文档[1]中,是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 <
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,则必须在登记命名约定中考虑这一点。