美文网首页
Compiler-RT 7.0.1 功能简介

Compiler-RT 7.0.1 功能简介

作者: 逸之 | 来源:发表于2020-07-17 14:43 被阅读0次

    ☞ 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日 无锡

    相关文章

      网友评论

          本文标题:Compiler-RT 7.0.1 功能简介

          本文链接:https://www.haomeiwen.com/subject/mazuhktx.html