llvm每日談之二 LLVM IR

做者:snsn1984
html

在介紹LLVM IR以前,咱們須要先了解下LLVM的結構。傳統的靜態編譯器分爲三個階段:前端、優化和後端。 前端

[Three Major Components of a Three-Phase Compiler]
LLVM的三階段設計是這樣的:
[LLVM's Implementation of the Three-Phase Design]
這樣作的優勢是若是須要支持一種新的編程語言,那麼咱們只須要實現一種新的前端。若是咱們須要支持一種新的硬件設備,那咱們只須要實現一個新的後端。而優化階段由於是針對了統一的LLVM IR,因此它是一個通用的階段,不管是支持新的編程語言,仍是支持新的硬件設備,這裏都不須要對優化階段作修改。因此從這裏能夠看出LLVM IR的做用。
LLVM IR主要有三種格式:一種是在內存中的編譯中間語言;一種是硬盤上存儲的二進制中間語言(以.bc結尾),最後一種是可讀的中間格式(以.ll結尾)。這三種中間格式是徹底相等的。

LLVM IR是LLVM優化和進行代碼生成的關鍵。根據可讀的IR,咱們能夠知道再最終生成目標代碼以前,咱們已經生成了什麼樣的代碼。並且根據IR,咱們能夠選擇使用不一樣的後端而生成不一樣的可執行代碼。同時,由於使用了統一的IR,因此咱們能夠重用LLVM的優化功能,即便咱們使用的是本身設計的編程語言。 編程

若是想直觀的看下llvm的IR究竟是什麼樣的,能夠先寫一個helloworld的程序,文件名字叫作hello.c。根據下列文檔的步驟配置llvm: 後端

http://clang.llvm.org/get_started.html 編程語言

而後根據文檔的內容使用下列命令能夠獲得二進制的.bc文件: 編輯器

clang -emit-llvm -c hello.c -o hello.bc 優化

而後使用下列命令能夠獲得對應的hello.ll文件,這個文件是可讀的,能夠經過文本編輯器打開。 spa

llvm-dis hello.bc .net

這樣咱們就能夠直觀的獲得IR的兩種格式了,至於在內存中的那種格式,咱們是沒法經過文件的形式獲得的。 設計

咱們通常都是查看.ll格式,由於這自己就是給人閱讀的IR格式。

關於LLVM IR的介紹,LLVM專門有一個文檔,文檔的地址爲:
相關文章
相關標籤/搜索