LLVM中的Compiler-RT相当于GCC中的libgcc,为目标平台提供其硬件不支持的低级功能的优化实现。
Compiler-RT(RT指运行时)项目用于为硬件不支持的低级功能提供特定于目标的支持。例如,32位目标通常缺少支持64位除法的指令。Compiler-RT通过提供特定于目标并经过优化的功能来解决这个问题,该功能在使用32位指令的同时实现了64位除法。它提供相同的功能,因此是LLVM项目中libgcc的替代品。
——《LLVM编译器实战教程》P17
在源码的lib目录下可以看到它的21个组件:
- asan
- BlockRuntime
- builtins
- cfi
- dfsan
- esan
- fuzzer
- hwasan
- interception
- lsan
- msan
- profile
- safestack
- sancov
- sanitizer_common
- scudo
- stats
- tsan
- ubsan
- ubsan_minimal
- xray
官网的compiler-rt介绍页只提及了其中部分,包括builttins、sanitizer runtimes、profile和BlocksRuntime。下面先介绍该四部分,再补充其余组件。
四则运算、位运算、类型转换、大小比较等基础功能,比如编译32位target时将double转换为64位无符号整型的__fixunsdfdi
函数。这些功能的实现或多或少有所优化,有些使用跨平台的C代码,有些直接使用汇编,后一种深度优化执行起来甚至比libgcc更高效。
Google推出的动态分析工具集,在LLVM项目中维护,GCC也择优使用了一部分。
包括:
asan
AddressSanitizer,检测内存错误,包括访存越界、释放后使用、重复释放、内存泄漏等。dfsan
DataFlowSanitizer,动态数据流分析。esan
EfficiencySanitizer,通过规避冗余计算、缓存碎片等手段提高程序运行效率。hwasan
Hardware-assisted AddressSanitizer,需要硬件支持的AddressSanitizer,比如将64位中的8位用作确保内存安全的标志位。lsan
LeakSanitizer,运行时内存泄漏检测,可以独立使用,也可以和AddressSanitizer结合使用。msan
MemorySanitizer,检测未初始化的变量使用,通常会把程序拖慢3倍。sanitizer_common
common Sanitiz runtime,为AddressSanitizer和ThreadSanitizer所共用。tsan
ThreadSanitizer,数据竞争检测,通常会把程序拖慢5~15倍,内存开支增至5~10倍。ubsan
UndefinedBehaviorSanitizer,检测未定义行为,包括使用空指针、有符号整型溢出、浮点型类型转换造成的溢出等。ubsan_minimal
minimal UBSan runtime,UndefinedBehaviorSanitizer的基础(简化)版本。
用于Profile Guided Optimization(配置文件引导优化),简称PGO。可以在AST层面(-fprofile-instr-generate
)或IR层面(-fprofile-generate
)定制更好的优化,比如告知编译器某个函数用得比较多,可以帮助它更好地处理内联。
BlocksRuntime
针对苹果平台Blocks运行时。
下面为介绍页未提到的其他组件:
控制流完整性(control flow integrity),在检测到未定义行为时abort程序,放置控制流被恶意篡改和破坏,在release版本中使用,通过-fsanitize=cfi
参数指定。
SafeStack,在保持运行性能的前提下,保护程序免受栈缓冲溢出攻击。
SanitizerCoverage,以形象化或报告的形式提供代码覆盖率信息。
LibFuzzer,以覆盖率为导向的模糊测试引擎。
interception
替换或封装系统函数,供AddressSanitizer使用。
Scudo Hardened Allocator,一种基于Sanitizer内存分配器(位于sanitizer_common)的用户模式的分配器,旨在保持运行性能的前提下,提高内存安全。单词scudo来自西班牙语和葡萄牙语中的escudo(盾牌)。
SanitizerStats,收集Sanitizer运行的统计数据(statistics),目前只支持cfi,启用-fsanitize=cfi*
参数的同时启用-fsanitize-stats
参数。
XRay,函数调用跟踪。
☞ XRay: A Function Call Tracing System
学习资料
- "compiler-rt" runtime libraries
- Clang 7 documentation
- Clang 7 documentation: Clang Compiler User’s Manual
2020年7月17日 无锡