Compiler-RT 7.0.1 功能簡(jiǎn)介

? LLVM 7.0.1

LLVM中的Compiler-RT相當(dāng)于GCC中的libgcc,為目標(biāo)平臺(tái)提供其硬件不支持的低級(jí)功能的優(yōu)化實(shí)現(xiàn)。

Compiler-RT(RT指運(yùn)行時(shí))項(xiàng)目用于為硬件不支持的低級(jí)功能提供特定于目標(biāo)的支持。例如,32位目標(biāo)通常缺少支持64位除法的指令。Compiler-RT通過(guò)提供特定于目標(biāo)并經(jīng)過(guò)優(yōu)化的功能來(lái)解決這個(gè)問(wèn)題,該功能在使用32位指令的同時(shí)實(shí)現(xiàn)了64位除法。它提供相同的功能,因此是LLVM項(xiàng)目中l(wèi)ibgcc的替代品。

——《LLVM編譯器實(shí)戰(zhàn)教程》P17

在源碼的lib目錄下可以看到它的21個(gè)組件:

  • asan
  • BlockRuntime
  • builtins
  • cfi
  • dfsan
  • esan
  • fuzzer
  • hwasan
  • interception
  • lsan
  • msan
  • profile
  • safestack
  • sancov
  • sanitizer_common
  • scudo
  • stats
  • tsan
  • ubsan
  • ubsan_minimal
  • xray

官網(wǎng)的compiler-rt介紹頁(yè)只提及了其中部分,包括builttins、sanitizer runtimes、profile和BlocksRuntime。下面先介紹該四部分,再補(bǔ)充其余組件。

builtins

四則運(yùn)算、位運(yùn)算、類型轉(zhuǎn)換、大小比較等基礎(chǔ)功能,比如編譯32位target時(shí)將double轉(zhuǎn)換為64位無(wú)符號(hào)整型的__fixunsdfdi函數(shù)。這些功能的實(shí)現(xiàn)或多或少有所優(yōu)化,有些使用跨平臺(tái)的C代碼,有些直接使用匯編,后一種深度優(yōu)化執(zhí)行起來(lái)甚至比libgcc更高效。

sanitizer runtimes

Google推出的動(dòng)態(tài)分析工具集,在LLVM項(xiàng)目中維護(hù),GCC也擇優(yōu)使用了一部分。

包括:

  • asan
    AddressSanitizer,檢測(cè)內(nèi)存錯(cuò)誤,包括訪存越界、釋放后使用、重復(fù)釋放、內(nèi)存泄漏等。

  • dfsan
    DataFlowSanitizer,動(dòng)態(tài)數(shù)據(jù)流分析。

  • esan
    EfficiencySanitizer,通過(guò)規(guī)避冗余計(jì)算、緩存碎片等手段提高程序運(yùn)行效率。

  • hwasan
    Hardware-assisted AddressSanitizer,需要硬件支持的AddressSanitizer,比如將64位中的8位用作確保內(nèi)存安全的標(biāo)志位。

  • lsan
    LeakSanitizer,運(yùn)行時(shí)內(nèi)存泄漏檢測(cè),可以獨(dú)立使用,也可以和AddressSanitizer結(jié)合使用。

  • msan
    MemorySanitizer,檢測(cè)未初始化的變量使用,通常會(huì)把程序拖慢3倍。

  • sanitizer_common
    common Sanitiz runtime,為AddressSanitizer和ThreadSanitizer所共用。

  • tsan
    ThreadSanitizer,數(shù)據(jù)競(jìng)爭(zhēng)檢測(cè),通常會(huì)把程序拖慢5~15倍,內(nèi)存開(kāi)支增至5~10倍。

  • ubsan
    UndefinedBehaviorSanitizer,檢測(cè)未定義行為,包括使用空指針、有符號(hào)整型溢出、浮點(diǎn)型類型轉(zhuǎn)換造成的溢出等。

  • ubsan_minimal
    minimal UBSan runtime,UndefinedBehaviorSanitizer的基礎(chǔ)(簡(jiǎn)化)版本。

profile

用于Profile Guided Optimization(配置文件引導(dǎo)優(yōu)化),簡(jiǎn)稱PGO??梢栽贏ST層面(-fprofile-instr-generate)或IR層面(-fprofile-generate)定制更好的優(yōu)化,比如告知編譯器某個(gè)函數(shù)用得比較多,可以幫助它更好地處理內(nèi)聯(lián)。

BlocksRuntime

針對(duì)蘋果平臺(tái)Blocks運(yùn)行時(shí)。


下面為介紹頁(yè)未提到的其他組件:

cfi

控制流完整性(control flow integrity),在檢測(cè)到未定義行為時(shí)abort程序,放置控制流被惡意篡改和破壞,在release版本中使用,通過(guò)-fsanitize=cfi參數(shù)指定。

safestack

SafeStack,在保持運(yùn)行性能的前提下,保護(hù)程序免受棧緩沖溢出攻擊。

sancov

SanitizerCoverage,以形象化或報(bào)告的形式提供代碼覆蓋率信息。

fuzzer

LibFuzzer,以覆蓋率為導(dǎo)向的模糊測(cè)試引擎。

interception

替換或封裝系統(tǒng)函數(shù),供AddressSanitizer使用。

scudo

Scudo Hardened Allocator,一種基于Sanitizer內(nèi)存分配器(位于sanitizer_common)的用戶模式的分配器,旨在保持運(yùn)行性能的前提下,提高內(nèi)存安全。單詞scudo來(lái)自西班牙語(yǔ)和葡萄牙語(yǔ)中的escudo(盾牌)。

stats

SanitizerStats,收集Sanitizer運(yùn)行的統(tǒng)計(jì)數(shù)據(jù)(statistics),目前只支持cfi,啟用-fsanitize=cfi*參數(shù)的同時(shí)啟用-fsanitize-stats參數(shù)。

xray

XRay,函數(shù)調(diào)用跟蹤。

? XRay: A Function Call Tracing System

學(xué)習(xí)資料


2020年7月17日 無(wú)錫

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容