在 rustc_codegen_cranelift 中的异常处理 - 博客 - 第二轮 如果上述内容不是你想要的,请提供更多背景信息或明确具体需求,以便我更准确地为你提供帮助。

主要内容总结:

  • Setup:通过示例代码展示 Rust 中不同的 panic 处理情况,包括无异常处理的do_panic、有异常处理的some_func和捕获异常的do_catch_panic,并介绍了编译和调试过程。

    • 编译代码时使用cg_clif并启用 unwind,生成linkmirllvm-ir文件,然后在调试器中设置断点进行分析。
  • Unwinding ABI crash course:介绍了 C++异常和 Rust 恐慌处理中仍在使用的两种主要 unwind ABI,即 Windows 上的 SEH 和大多数 Unix 系统上的 Itanium unwind ABI,它们都实现了两阶段 unwind,并通过 personality 函数和 LSDA 来处理异常。
  • Unwinding without exception handlers:以do_panic函数为例,展示了 Itanium unwind 支持在 cg_clif 中的实现,包括 personality 函数和 LSDA 的信息,以及在调试器中的验证。
  • Unwinding with an exception handler:对于有异常处理的some_func函数,clif ir 中使用try_call来处理异常,在调试器中可以看到 personality 函数如何设置 landingpad 和相关寄存器,以及执行流程的跳转。
  • Catching an exceptioncatch_unwind在 Cranelift IR 中的实现,通过try_call_indirecttag1来表示异常捕获,在 unwind 表中也有相应的表示,最后在调试器中进行了验证。
  • Conclusion:总结了 cg_clif 中异常处理的工作方式,目前该功能默认禁用,可通过跟踪问题了解进展。
  • Appendix:提供了一个 gdb 脚本,用于重现调试会话,包括设置断点、运行程序、查看寄存器等操作。
阅读 11
0 条评论