02.28 llvm之旅第一站 - 編譯及簡單使用

llvm介紹

llvm(low level virtual machine)是一個開源編譯器框架,最早的時候是Illinois的一個研究項目,主要負責人是Chris Lattner,他現在就職於Apple. Apple 目前也是llvm項目的主要贊助者之一。

llvm有一個表達形式很好的IR語言,高度模塊化的結構,因此它可以作為多種語言的後端,提供與編程語言無關的優化和針對多種CPU的代碼生成功能。

傳統編譯器分三個階段:

llvm之旅第一站 - 編譯及簡單使用


llvm也分三個階段,但是設計上略微的有些區別:

llvm之旅第一站 - 編譯及簡單使用


不同的前端後端使用統一的 LLVM IR ,如果需要支持新的編程語言或者新的設備平臺,只需要開發對應的前端和後端即可。同時基於 LLVM IR 我們可以很快的開發自己的編程語言。

目前llvm有很多的子項目,針對不同的需求進行了深入的擴展,具體參考llvm官方首頁。

其中的Clang子項目實現了支持C/C++/Objective-C的優秀編譯器前端,官方數據表明,在某些編譯環境下,其編譯速度要比gcc快三倍。

llvm下載及編譯

後續的系列文章我們都將以Clang作為前端,Mac系統上進行開發。(Linux 及Window系統上的下載及編譯過程與此相同)

1. 遷出LLVM

$ cd where-you-want-llvm-to-live

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

llvm之旅第一站 - 編譯及簡單使用


2. 遷出Clang

$ cd where-you-want-llvm-to-live

$ cd llvm/tools

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

llvm之旅第一站 - 編譯及簡單使用


3. 遷出編譯運行庫

$ cd where-you-want-llvm-to-live

$ cd llvm/projects

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

llvm之旅第一站 - 編譯及簡單使用


4.編譯源碼 (Release)

$ mkdir build

$ cd build

$ cmake -DCMAKE_BUILD_TYPE:String=Release ../llvm/

llvm之旅第一站 - 編譯及簡單使用


llvm之旅第一站 - 編譯及簡單使用


也可以:

$ cd llvm

$ ./configure

$ make

推薦使用cmake編譯。

build目錄下存放著編譯後的文件:

llvm之旅第一站 - 編譯及簡單使用


bin中存放著完整的工具鏈:

llvm之旅第一站 - 編譯及簡單使用


更詳細的編譯選項參考 Getting Started with the LLVM System

編譯鏈中工具的具體說明參考 LLVM Command Guide

工具鏈使用

編譯完成後,build/bin目錄下存放了完整的編譯工具鏈,使用這些工具就可以完成源碼的編譯。

創建簡單的c語言源碼文件test.c

#include <stdio.h>

int main() {

printf("hello llvm\\n");

return 0;

}

編譯可執行文件

./clang test.c -o test

生成LLVM 字節碼文件

./clang -O3 -emit-llvm test.c -c -o test.bc

生成LLVM 可視化字節碼文件

./clang -O3 -emit-llvm test.c -S -o test.ll

運行可執行文件

./test

運行字節碼文件

./lli test.bc

反彙編字節碼文件

./llvm-dis < test.bc | less

編譯字節碼為彙編文件

./llc test.bc -o test.s

參考文獻:

Getting Started with the LLVM Systemhttp://llvm.org/docs/GettingStarted.html

LLVM 官網http://llvm.org

Clang 官網 - http://clang.llvm.org


分享到:


相關文章: