LLVM - compiler-rt

介紹

TL;DR: 將 LLVM IR 轉成對應的 CPU instruction 時,幫忙處理 CPU 沒實做的功能、歷史包袱或平台破碎化的 Library (加上 Sanitizer)

compiler-rt 是 LLVM 中負責針對不同平台的 codegen 輔助 library, rt 是 runtime 的縮寫。

LLVM backend 會負責把 LLVM IR 對應到特定平台的 CPU instruction, 在沒有 CPU instruction 可以直接對應時, 可以選擇直接換成一連串對應的 instruction 或是一個 function call 呼叫 compiler-rt 內的實做。

目前可以想像的使用情境有三種:

  • CPU 沒實做的功能

  • 歷史包袱

  • 平台破碎化

CPU 沒實做的功能: 例如 64 bits 數字的處理要跑在 32 bits 平台上, 或是 128 bits 的數字在 64 bits 平台上。

歷史包袱: 例如同樣是 x86 平台,但是有小地方不相容(FPU instruction 之類的), 因此需要一層抽象化才可以跑在每個 x86 平台。

平台破碎化: 例如不同的 ARM 平台可能有自己擴充的 instruction, 要同時跑在兩個 ARM 平台就只能使用指令集交集的部份, 但是如此一來就不能善用額外的擴充 instruction, 因此抽象化一層出來, 在特定平台使用擴充的 instruction。

對應到 GCC 的專案內就是 libgcc

compiler-rt 除了上面提到的功能外, 還有另一部份是 Instrumentation 用的, 包含 AddressSanitizer、ThreadSanitizer、MemorySanitizer 等等。

Build From Source

# http://clang.llvm.org/get_started.html

svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm

cd llvm/tools
svn co http://llvm.org/svn/llvm-project/cfe/trunk clang
cd ../..

cd llvm/projects
svn co http://llvm.org/svn/llvm-project/compiler-rt/trunk compiler-rt
cd ../..

mkdir build
cd build
cmake -G "Unix Makefiles" ../llvm
make -j8
make install

如果系統已經有 llvm-config 的話可以使用以下方式只編 compiler-rt 的部份:

# if you have llvm-config

git clone https://github.com/llvm-mirror/compiler-rt/
mkdir build
cd build
cmake ../compiler-rt -DLLVM_CONFIG_PATH=`which llvm-config`
make

LLVM Weekly

  • [2014-01-31][r200546] Compiler-rt’s CMake files will now compile the library for ARM. Give it a go and see what breaks. r200546.

  • [2014-01-21][r199729] In compiler-rt, support was added for intercepting and sanitizing arguments passed to printf functions in AddressSanitizer and ThreadSanitizer.

  • [2014-01-16][r199377] AddressSanitizer in compiler-rt gained the ability to start in 『deactivated』 mode. It can later be activated when __asan_init is called in an instrumented library.