LLVM Compiler-RT

本文深入探讨LLVM Compiler-RT的功能与组成,解释其如何为不同目标平台提供优化的低级功能实现,涵盖从基本运算到高级动态分析工具的21个组件,如asan、tsan和ubsan等Sanitizer运行时库。
摘要由CSDN通过智能技术生成

版本:LLVM 7.0.1

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。下面先介绍该四部分,再补充其余组件。

builtins

四则运算、位运算、类型转换、大小比较等基础功能,比如编译32位target时将double转换为64位无符号整型的__fixunsdfdi函数。这些功能的实现或多或少有所优化,有些使用跨平台的C代码,有些直接使用汇编,后一种深度优化执行起来甚至比libgcc更高效。

sanitizer runtimes

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

用于Profile Guided Optimization(配置文件引导优化),简称PGO。可以在AST层面(-fprofile-instr-generate)或IR层面(-fprofile-generate)定制更好的优化,比如告知编译器某个函数用得比较多,可以帮助它更好地处理内联。

BlocksRuntime

针对苹果平台Blocks运行时。


下面为介绍页未提到的其他组件:

cfi

控制流完整性(control flow integrity),在检测到未定义行为时abort程序,放置控制流被恶意篡改和破坏,在release版本中使用,通过-fsanitize=cfi参数指定。

safestack

SafeStack,在保持运行性能的前提下,保护程序免受栈缓冲溢出攻击。

sancov

SanitizerCoverage,以形象化或报告的形式提供代码覆盖率信息。

fuzzer

LibFuzzer,以覆盖率为导向的模糊测试引擎。

interception

替换或封装系统函数,供AddressSanitizer使用。

scudo

Scudo Hardened Allocator,一种基于Sanitizer内存分配器(位于sanitizer_common)的用户模式的分配器,旨在保持运行性能的前提下,提高内存安全。单词scudo来自西班牙语和葡萄牙语中的escudo(盾牌)。

stats

SanitizerStats,收集Sanitizer运行的统计数据(statistics),目前只支持cfi,启用-fsanitize=cfi*参数的同时启用-fsanitize-stats参数。

xray

XRay,函数调用跟踪。

☞ XRay: A Function Call Tracing System

学习资料


2020年7月17日 无锡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值