gpt4 book ai didi

LLVM 异常处理实现

转载 作者:行者123 更新时间:2023-12-03 14:19:53 25 4
gpt4 key购买 nike

请注意,我已阅读 the questions并阅读 blog posts我也引用了the ABI .

我完全不明白它是如何与 LLVM 的 EH 内在函数交互的。 LLVM EH 页面给出了一个非常模糊的概述——不完全是“实现 X、Y、Z”的 list 。

LLVM EH页面直接引用了 Itanium ABI。这对我来说意味着 LLVM 只支持 Itanium ABI 异常。但我已经知道 Clang 支持 ARM 并且正在开发对 Microsoft ABI 的支持。那么 LLVM 对 Itanium ABI 的 EH 实现到底有多具体?

在引用 Itanium ABI 定义的 _Unwind 内容时,是否必须由后端提供,还是我必须自己实现它?

我还注意到 Clang 生成的 LLVM IR 没有显示任何特定于语言的表、任何异常帧、异常表或类似的任何东西。在那种情况下,LLVM 如何知道如何生成特定于语言的数据?

简而言之,你究竟是如何从 LSDA、EH 上下文和 _Unwind_RaiseException 出发的?至landingpadresume ?

编辑:仅供引用,我将在 Windows 上 JITting 生成的代码。

最佳答案

如今,Itanium C++ ABI 是许多其他设备上使用的事实上的标准 C++ ABI
平台。 Itanium C++ ABI 支持零成本异常处理技术,
这是当今最广泛使用的技术。

为了支持异常处理,必须改变函数的语义
称呼。现在调用 fork 了执行流程。一个分支被采取时
一切都很好,如果出现异常,将采用第二个分支。
在 LLVM IR 中有 invoke调用可能抛出的函数的指令。

当采用第二个分支时,可能会执行几种操作:

  • 调用析构函数(清理)
  • 继续堆栈展开(恢复)
  • 强制 throw 规范(过滤器)
  • 恢复正常的控制流(catch)。

  • 很明显,必须生成一些额外的代码来执行这些操作。
    这就是为什么我们有 landingpad指令也是如此。这是第一个
    invoke 之后执行的指令以异常结束。

    但主要的魔法是在运行时执行的。抛出异常后,
    与语言无关的运行时展开堆栈,对于它找到语言的每一帧
    特定数据区 (LSDA) 并调用特定语言的个性例程。这
    个性例程检查程序计数器、LSDA 和当前异常。它
    确定是否需要进行任何清理,是否违反了任何抛出规范
    或者如果异常可以被这个框架捕获。

    您可能知道,所有这些数据(个性例程、捕获类型、抛出规范、清理操作)都已在 landingpad 中指定。
    指令,因此不应将额外的数据传递给后端来生成
    目标文件中与异常相关的部分。

    关于LLVM 异常处理实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20027156/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com