主要观点:作者尝试让 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 目前的设置不适合运行时可切换断言,要实现需付出巨大努力。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。