LLVM 中的自定义断言

主要观点:作者尝试让 LLVM 允许运行时可切换的断言但未成功,原因是维护上游的人不想增加维护代码路径,且启用断言会有 20%的运行时性能开销。作者因在 Epic Games 为 Verse 开发的自定义 clang 编译器中总是启用断言时遇到上游 clang 漏洞,决定让断言可在运行时切换,后通过修改 LLVM CMake 来实现。
关键信息:

  • 尝试让 LLVM 允许运行时可切换断言失败,维护者不想增加维护代码路径且启用断言有 20%运行时性能开销。
  • 为在 Epic Games 的自定义 clang 编译器中解决启用断言时的上游漏洞,决定让断言可在运行时切换。
  • 通过修改 LLVM CMake 加入add_definitions(-include AssertInjectoroo.h)等代码来实现自己的断言定义。
  • 新的断言定义会检查标志是否设置,再进行断言检查,若失败则调用llvm_unreachable
    重要细节:
  • 二进制大小方面,注入的断言使 release 版本的二进制文件增大 1.85 倍,与仅在 stock LLVM 中编译LLVM_ENABLE_ASSERTIONS相比增大 1.005 倍,说明 LLVM 中的断言对二进制大小代价较大。
  • 运行时成本方面,运行时切换且关闭的注入断言使编译时间比 stock LLVM 慢 14.00%,运行时切换且开启的比 stock LLVM 慢 20.61%,做断言调用本身导致 6%的性能损失,处理NDEBUG检查背后的其他数据结构是主要成本,导致 14%的性能损失。这与 Renato Golin 和 Reid Kleckner 在线程中所说相符,即 LLVM 目前的设置不适合运行时可切换断言,要实现需付出巨大努力。
阅读 23
0 条评论