What is LLVM?
LLVM的全名是Low Level Virtual Machine,和一般所知的Virtual Machine(VMWare, VirtualBox等)不同,他是一種編譯器架構。主要分成
- 前端: Source Code -> BitCode
- 後端: BitCode -> Native Code
由於BitCode的獨立性,可以很容易的跨平台。
而LLVM主要有以下幾個特性:
- RISC Like的指令集
- 以SSA(Static Single-Assignment) 形式提供數目不設限的虛擬暫存器
- 以Load/store 指令存取型態定義的指標(Typed-Pointer)
- 基於SSA可明確資料在運作過程中的傳遞流程
- 提供跟語言無關的形態資訊
- 在exception的支援上提供 setjmp/longjmp實作的Exception機制,並提供 invoke指令可呼叫一個需要帶有Exception Handler的函式,與提供Unwind指令,能透過Stack Frame回推到上一個invoke指令位置.
如何使用LLVM
在這裡我們使用Clang
來當FrontEnd,將C語言轉換成BitCode。
依舊從Hello World開始
接著我們編譯此檔案
1 | $ clang -S -emit-llvm hello.c |
此時目錄下生成了hello.s,觀看其內容
1 | ; ModuleID = 'hello.c' |
注意,在這邊我們有加上 -emit-llvm
的選項,表示我們要使用LLVM的對應組件,如果沒加這命令的話,其作用跟一般的Native Complier相同,如下。
1 | $ clang -S hello.c |
一樣產生hello.s,但是內容完全不同
1 | .file "hello.c" |
如何產生 BitCode
1 | $ clang -emit-llvm hello.c -c -o hello.bc |
如何用 LLVM的JIT執行BitCode
1 | $ lli hello.bc |
如何看BitCode的Assembly Code
1 | $ llvm-dis < hello.bc | less |
如何用BitCode產生 Native Assembly Code
1 | $ llc hello.bc -o hello.s |
如何用BitCode產生Native Machine Code
可以直接從BitCode下手,或是從上一步驟產生出來的Assembly Code下手
1 | $ clang hello.bc -o hello_native |