Compiler-RT 7.0.1 功能简介

2020-07-17  本文已影响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个组件:

官网的compiler-rt介绍页只提及了其中部分,包括builttins、sanitizer runtimes、profile和BlocksRuntime。下面先介绍该四部分,再补充其余组件。

builtins

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

sanitizer runtimes

Google推出的动态分析工具集,在LLVM项目中维护,GCC也择优使用了一部分。

包括:

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

上一篇下一篇

猜你喜欢

热点阅读