【LLVM】LLVM編譯流程

LLVM的編譯流程

在介紹編譯流程之前,首先回顧一下LLVM:
LLVM是一個(gè)模塊化的、可重用的編譯器和工具鏈技術(shù)的集合,Clang 是 LLVM 的子項(xiàng)目援制,是 C,C++ 和 Objective-C 編譯器丰刊,它的編譯速度比GCC快3倍隘谣,其中clang static analyzer主要進(jìn)行語法分析、語義分析以及生成中間代碼啄巧,在這個(gè)過程中會(huì)對(duì)代碼進(jìn)行檢查寻歧,對(duì)于出錯(cuò)以及警告的代碼會(huì)給與標(biāo)記。此外秩仆,LLVM核心庫(kù)還提供一個(gè)優(yōu)化器码泛,對(duì)流行的CPU做生成代碼的支持(如x86等機(jī)器)。lld是Clang/LLVM的內(nèi)置鏈接器澄耍,clang必須調(diào)用鏈接器來產(chǎn)生可執(zhí)行文件噪珊。

LLVM相對(duì)于其它編譯器的特殊性在于它提供一種代碼編寫良好的中間表示IR,這意味著它可以作為多種語言的后端齐莲,這樣它就可以在提供語言無關(guān)的優(yōu)化的同時(shí)還可以針對(duì)不同的硬件設(shè)備(CPU)生成對(duì)應(yīng)的機(jī)器代碼痢站。

在介紹LLVM的編譯流程之前,對(duì)于編譯器的編譯鏈接過程需要有一定的了解选酗,可以參閱這些文章

快速開始——介紹LLVM編譯流程

我們從一個(gè)例子開始阵难,觀察一次編譯過程是如何完成的。首先我們編寫如下的代碼:

#import <Foundation/Foundation.h>
#define DEFINEEight 8
int main(){
    @autoreleasepool {
        int eight = DEFINEEight;
        int six = 6;
        NSString* site = [[NSString alloc] initWithString:@"starming"];
        int rank = eight + six;
        NSLog(@"%@ rank %d", site, rank);
    }
    return 0;
}

可以看到這段代碼輸出一個(gè)字符串和相加后的數(shù)字芒填。將此代碼保存為main.m文件呜叫。然后使用clang對(duì)其進(jìn)行編譯:

clang -ccc-print-phases main.m

可以看到編譯過程輸出如下:


編譯流程
  • 0步驟獲得源代碼main.m空繁,是OC語言。
  • 1步驟是預(yù)處理階段朱庆,做相應(yīng)處理(后面會(huì)提到)
  • 2步驟是編譯階段
  • 3步驟通過后端進(jìn)行匯編前的處理
  • 4步驟匯編階段
  • 5步驟鏈接階段盛泡,做相應(yīng)處理
  • 6步驟綁定相應(yīng)變量(或常量等)到硬件機(jī)器上(如寄存器)
    通過如上步驟可以了解到整個(gè)過程以及過程中的一些信息。例如首先進(jìn)行的預(yù)處理操作可以使用如下命令查看具體信息:
clang -E main.m

執(zhí)行完后可以看到預(yù)處理后的樣子:


預(yù)處理后

這個(gè)過程包括宏的替換娱颊,頭文件的導(dǎo)入等等傲诵。在預(yù)處理完成后會(huì)進(jìn)行詞法分析,在此步驟會(huì)把代碼切成一個(gè)個(gè)Token维蒙,比如大小括號(hào)掰吕,等于號(hào)還有字符串等。通過如下命令可以看到詞法分析后的結(jié)果:

clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m

詞法分析結(jié)果如下:


詞法分析

接下來是語法分析颅痊,驗(yàn)證程序的語法是否正確,然后將所有的節(jié)點(diǎn)組成抽象語法樹AST:

clang -fmodules -fsyntax-only -Xclang -ast-dump main.m
AST

這些步驟完成之后就要開始進(jìn)行IR中間代碼的生成了局待,代碼生成器CodeGen會(huì)負(fù)責(zé)將語法樹自頂向下遍歷逐步翻譯成LLVM IR斑响,IR就是編譯過程的前端的輸出以及后端的輸入:

clang -S -fobjc-arc -emit-llvm main.m -o main.ll

此步驟LLVM會(huì)去做些優(yōu)化工作,在Xcode的編譯設(shè)置里也可以設(shè)置優(yōu)化的級(jí)別-01钳榨,-03舰罚,-0s等,還可以通過編寫自己的pass自定制優(yōu)化解決方案薛耻,編寫自己的Pass請(qǐng)參閱[這篇文章]

clang -O3 -S -fobjc-arc -emit-llvm main.m -o main.ll

什么是pass呢营罢,可以將pass理解為L(zhǎng)LVM優(yōu)化工作的一個(gè)節(jié)點(diǎn),一個(gè)節(jié)點(diǎn)做一些事饼齿,把這些節(jié)點(diǎn)加起來就構(gòu)成了LLVM完整的優(yōu)化器了饲漾。而且當(dāng)你在Xcode里開啟了bitcode的話還會(huì)做進(jìn)一步的優(yōu)化工作:對(duì)于新的后端架構(gòu)可以使用這份優(yōu)化后的bitcode去生成。這也是LLVM靈活性的一個(gè)體現(xiàn)吧缕溉。
開啟bitcode優(yōu)化:

clang -emit-llvm -c main.m -o main.bc

生成匯編的命令:

clang -S -fobjc-arc main.m -o main.s

再生成目標(biāo)文件:

clang -fmodules -c main.m -o main.o

最后生成可執(zhí)行文件:

clang main.o -o main

這樣通過執(zhí)行./main就可以看到程序的執(zhí)行結(jié)果啦考传!starming rank 14

那么以上就是LLVM的整個(gè)編譯流程了。對(duì)于具體的Clang編譯過程中的細(xì)節(jié)問題证鸥,將在后續(xù)的文章中進(jìn)行介紹和討論僚楞。歡迎關(guān)注!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末枉层,一起剝皮案震驚了整個(gè)濱河市泉褐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸟蜡,老刑警劉巖膜赃,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異矩欠,居然都是意外死亡财剖,警方通過查閱死者的電腦和手機(jī)悠夯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來躺坟,“玉大人沦补,你說我怎么就攤上這事∵涑龋” “怎么了夕膀?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)美侦。 經(jīng)常有香客問我产舞,道長(zhǎng),這世上最難降的妖魔是什么菠剩? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任易猫,我火速辦了婚禮,結(jié)果婚禮上具壮,老公的妹妹穿的比我還像新娘准颓。我一直安慰自己,他們只是感情好棺妓,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布攘已。 她就那樣靜靜地躺著,像睡著了一般怜跑。 火紅的嫁衣襯著肌膚如雪样勃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天性芬,我揣著相機(jī)與錄音峡眶,去河邊找鬼。 笑死批旺,一個(gè)胖子當(dāng)著我的面吹牛幌陕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汽煮,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼搏熄,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了暇赤?” 一聲冷哼從身側(cè)響起心例,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鞋囊,沒想到半個(gè)月后止后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年译株,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓜喇。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歉糜,死狀恐怖乘寒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情匪补,我是刑警寧澤伞辛,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站夯缺,受9級(jí)特大地震影響蚤氏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜踊兜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一竿滨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捏境,春花似錦姐呐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽头谜。三九已至骏掀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柱告,已是汗流浹背截驮。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留际度,地道東北人葵袭。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像乖菱,于是被迫代替她去往敵國(guó)和親坡锡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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