LLVM

LLVM

什么是LLVM?

官網(wǎng):https://llvm.org/

The LLVM Project is a collection of modular and reusable compiler and toolchain technologies.

LLVM項目是模塊化屡立,可重用的編譯器與及工具鏈技術的技術

美國計算協(xié)會(ACM)將其2012年軟件系統(tǒng)獎項頒給了LLVM念颈,之前曾經(jīng)獲得此獎項的軟件和技術包括:Java,Apache卵慰,Mosaic沙郭,the World Wide Web,Smalltalk,UNIX,Eclipse等等

傳統(tǒng)的編譯器架構

傳統(tǒng)編譯器

Frontend:前端

詞法分析,語法分析裳朋,語義分析病线,生成中間代碼

Optimizer:優(yōu)化器

中間代碼優(yōu)化

Backend:后端

生成機器碼

LLVM架構

LLVM架構

不同的前端后端使用統(tǒng)一的中間代碼LVM Intermediate Repressentation(LLVM IR);

如果需要支持一種新的變成語言鲤嫡,那額只需要實現(xiàn)一個新的前端送挑;

如果需要支持一種新的硬件設備,那額只需要實現(xiàn)一個新的后端暖眼;

優(yōu)化階段是一個通用的極端惕耕,它針對的是統(tǒng)一的LLVM IR,不論是支持新的變成語言罢荡,還是支持新的硬件設備赡突,都不需要對優(yōu)化階段做修改对扶;

相比之下,GCC的前端和后端沒分得太開惭缰,前端后端耦合在一起浪南,所以GCC為了支持一門新的語言或者為了支持一個新的目標平臺,就變得特別困難漱受;

LLVM現(xiàn)在被作為實現(xiàn)各種靜態(tài)和運行時編譯語言的通用基礎結構(GCC家族络凿,Java,.NET,Python,Ruby,Scheme,Haskell,D等)

Clang

什么是Clang昂羡?

LLVM項目的一個子項目絮记;

基于LLVM架構的C/C++/Objective-C編譯器前端;(官網(wǎng):http://clang/llvm.org)

相比于GCC虐先,Clang具有如下優(yōu)點

編譯速度快怨愤,在某些平臺上,Clang的編譯速度顯著快過GCC(Debug模式下OC速度比GCC塊3倍)蛹批;

占用內(nèi)存凶础:Clang生成的AST所占用的內(nèi)存是GCC的五分之一左右;

模塊化設計:Clang采用基于庫的模塊化設計腐芍,易于IDE繼承及其他用途的重用差导;

診斷信息可讀性強:在編譯過程中若河,Clang創(chuàng)建并保留了大量詳細的元數(shù)據(jù)(metadata),有利于調(diào)試和錯誤報告勺择;

設計清晰簡單躬它,容易理解蒸播,易于擴張增強;

Clang與LLVM

Clang與LLVM

OC源文件的編譯過程

clang -ccc-print-phases main.m

clang

查看preprocessor預處理的結果:$clang -E main.m

preprocessor替換

可以發(fā)現(xiàn)在預編譯階段茎活,就已經(jīng)將宏定義給替換了

詞法分析

詞法分析仍劈,生成Token: $clang -fmodules -E -Xclang -dump-tokens main.m

詞法分析

語法樹-AST

語法分析娄猫,生成語法樹(AST,AbstractSyntax Tree):$clang -fmodules -fsyntax-only -Xclang -ast-dump main.m

語法樹AST

LLVM IR

LLVM IR有3種表示形式(但本質(zhì)是等價的项玛,就好比水可以有氣體貌笨,液體,固體等3中形態(tài))

clang -S -emit-llvm main.m

text:便于閱讀的文本格式襟沮,類似于匯編語言,擴展名.II

IR基本語法

參數(shù)解釋:

1.注釋以分號昌腰;開頭

2.全局標志符以@開頭开伏,局部標識符以%開頭

3.alloca,在當前函數(shù)棧幀中分配內(nèi)存

4.i32,32bit,4個字節(jié)的意思

5.align遭商,內(nèi)存對齊

6.store固灵,寫入數(shù)據(jù)

7.load,讀取數(shù)據(jù)

官方語法參考

https://llvm.org/docs/LangRefhtml


memory:內(nèi)存格式

clang -c -emit-llvm main.m

bitcode:二進制格式劫流,擴展名為.bc

LLVM 源碼下載

下載LLVM

$ git clone https://git.llvm.org/git/llvm.git/

下載clang

cd llvm/tools

git clone https://git.llvm.org/git/clang.git

源碼編譯

安裝cmake和ninja(先安裝brew巫玻,https://brew.sh)

brew install cmake

brew install ninja

ninja如果安裝失敗丛忆,可以直接從github獲取release版放入[/usr/local/bin]中

https://github.com/ninja-build/ninja/releases

在LLVM源碼同級目錄下新建一個[llvm_build]目錄(最終會在[llvm_build]目錄下生成[build.ninja])

cd llvm_build

cmake -G Ninja ../llvm -DCMAKE_INSTALL_PREFIX=LLVM的安裝路徑

更多cmake相關選項,可以參考:https://llvm.org/docs/CMake.html

依次執(zhí)行編譯仍秤,安裝指令

ninja

編譯完畢后熄诡,【llvm_build】目錄大概21.05G(僅供參考)

ninja install

安裝完畢后,安裝目錄大概11.92G(僅供參考)

源碼編譯

也可以生成Xcode項目再進行編譯诗力,但是速度很慢(可能需要1個多小時)

在llvm同級目錄下新建一個[llvm_xcode]目錄

cd llvm_xcode

cmake -G Xcode ../llvm

應用與實踐

libclang凰浮、libTooling

官方參考:https://clang.llvm.org/docs/Tooling.html

應用:語法樹分析,語言轉換等

Clang插件開發(fā)

官方參考

https://clang.llvm.org/docs/ClangPlugins.html

https://clang.llvm.org/docs/ExternalClangExamples.html

https://clang.llvm.org/docs/RAVFontendAction.html

引用:代碼檢查(命名規(guī)范苇本,代碼規(guī)范)

Pass開發(fā)

官方參考:https://llvm.org/docs/WritingAnLLVMPass.html

應用:代碼優(yōu)化袜茧,代碼混淆等

開發(fā)新的編程語言

https://llvm-tutorial-cn.readthedocs.io/en/latest/index.html

https://kaleidoscope-llvm-tutorial-zh-cn.readthedocs.io/zh_CN/latest/

參考資料

?關于AST的資料

https://clang.llvm.org/doxygen/namespaceclang.htmlp https://clang.llvm.org/doxygen/classclang_1_1Decl.htmlp https://clang.llvm.org/doxygen/classclang_1_1Stmt.html

參考書籍:

《編譯原理》

《LLVM CookBook》

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市瓣窄,隨后出現(xiàn)的幾起案子笛厦,更是在濱河造成了極大的恐慌,老刑警劉巖俺夕,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裳凸,死亡現(xiàn)場離奇詭異,居然都是意外死亡啥么,警方通過查閱死者的電腦和手機登舞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來悬荣,“玉大人菠秒,你說我怎么就攤上這事÷扔兀” “怎么了践叠?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嚼蚀。 經(jīng)常有香客問我禁灼,道長,這世上最難降的妖魔是什么轿曙? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任弄捕,我火速辦了婚禮,結果婚禮上导帝,老公的妹妹穿的比我還像新娘守谓。我一直安慰自己,他們只是感情好您单,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布斋荞。 她就那樣靜靜地躺著,像睡著了一般虐秦。 火紅的嫁衣襯著肌膚如雪平酿。 梳的紋絲不亂的頭發(fā)上凤优,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機與錄音蜈彼,去河邊找鬼筑辨。 笑死,一個胖子當著我的面吹牛柳刮,可吹牛的內(nèi)容都是我干的挖垛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秉颗,長吁一口氣:“原來是場噩夢啊……” “哼痢毒!你這毒婦竟也來了?” 一聲冷哼從身側響起蚕甥,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤哪替,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后菇怀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凭舶,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年爱沟,在試婚紗的時候發(fā)現(xiàn)自己被綠了帅霜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡呼伸,死狀恐怖身冀,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情括享,我是刑警寧澤搂根,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站铃辖,受9級特大地震影響剩愧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜娇斩,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一仁卷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧犬第,春花似錦五督、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽副签。三九已至遥椿,卻和暖如春基矮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冠场。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工家浇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碴裙。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓钢悲,卻偏偏與公主長得像,于是被迫代替她去往敵國和親舔株。 傳聞我的和親對象是個殘疾皇子莺琳,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 一、什么是LLVM 1载慈、官網(wǎng):https://llvm.org/The LLVM Project is a col...
    迷心迷閱讀 2,847評論 0 2
  • 什么是LLVM LLVM項目是模塊化惭等、可重用的編譯器以及工具鏈技術的集合。 美國計算機協(xié)會 (ACM) 將其201...
    Coder_LRT閱讀 2,378評論 0 1
  • 什么是LLVM 官網(wǎng):https://llvm.org/ LLVM項目是模塊化办铡、可重用的編譯器以及工具鏈技術的集合...
    草原野馬閱讀 1,678評論 0 0
  • LLVM 簡介 LLVM 全稱是 Low Level Virtual Machine辞做,它是源自 the Unive...
    juniway閱讀 37,849評論 0 21
  • LLVM是什么? 官方如是說:The LLVM Project is a collection of modula...
    huxinwen閱讀 2,744評論 4 3