我的目标是确定 LLVM 函数的所有可能的退出点。我知道终止符指令结束基本块,要么退出函数,要么分支到同一函数的另一部分。终结者指令中,大部分我都清楚:
ret
和 resume
退出功能br
、switch
、indirectbr
分支到同一功能中的其他块invoke
,catchswitch
与异常控制流程相关,也不应该退出该函数unreachable
)我想寻求有关
catchret
和 cleanupret
的澄清。我已经编译了示例异常处理代码(Mac 和 Ubuntu 上为 clang++
),但在编译的 LLVM IR 中没有看到这些指令。这些仅用于特定 ABI 吗?
根据此(https://github.com/llvm-mirror/llvm/blob/master/include/llvm/IR/Instruction.def#L127-L137),您有一个块终止指令列表。正如其他评论所述,这里有一个文档页面解释了异常处理说明https://llvm.org/docs/ExceptionHandling.html