- 深入理解LLVM:代碼生成
- 彭成寒 李靈 戴賢澤 王志磊 俞佳嘉
- 1273字
- 2024-12-18 16:44:26
1.1 LLVM設(shè)計(jì)思路分析
LLVM項(xiàng)目起源于伊利諾伊大學(xué)香檳分校的研究型項(xiàng)目,在2000年由Chris Lattner和其導(dǎo)師Vikram Adve發(fā)起,并于2003年正式開源并發(fā)布1.0版本。2002年,Lattner在其碩士論文“LLVM: AN INFRASTRUCTURE FOR MULTI-STAGE OPTIMIZATION”中詳細(xì)介紹了LLVM的設(shè)計(jì)思路,本節(jié)將簡(jiǎn)單總結(jié)這一思路。
LLVM的愿景是實(shí)現(xiàn)一個(gè)編譯器的基礎(chǔ)設(shè)施,能適配現(xiàn)代編程語言、硬件架構(gòu)發(fā)展,它有3個(gè)目標(biāo)。
1)具備多階段優(yōu)化能力(如過程內(nèi)優(yōu)化、過程間優(yōu)化、配置文件驅(qū)動(dòng)的優(yōu)化),保證程序執(zhí)行性能足夠高。
2)提供基礎(chǔ)機(jī)制,方便進(jìn)行編譯器研發(fā)。
3)兼容標(biāo)準(zhǔn)系統(tǒng)編譯器的行為。
為了達(dá)到這些目標(biāo),LLVM設(shè)計(jì)了一套虛擬指令集,稱為L(zhǎng)LVM IR。雖然LLVM IR是低級(jí)的中間表示,但是它攜帶了程序的類型信息,這樣的IR設(shè)計(jì)既方便了靜態(tài)編譯優(yōu)化,又允許在鏈接時(shí)進(jìn)行優(yōu)化。Lattner設(shè)想在鏈接優(yōu)化完成后生成的二進(jìn)制文件中,既可以包含可執(zhí)行代碼,又可以包含IR,其中IR可以用于后續(xù)的JIT優(yōu)化[1]。Lattner還設(shè)想在LLVM中提供運(yùn)行時(shí)優(yōu)化,通過監(jiān)控程序的執(zhí)行過程來收集反饋信息(profile information)并用于指導(dǎo)程序優(yōu)化[2]。
LLVM編譯器整體架構(gòu)圖如圖1-1所示。

圖1-1 LLVM編譯器整體架構(gòu)圖
從圖1-1中可以看到,LLVM編譯優(yōu)化策略和程序的“編譯-鏈接-執(zhí)行”模式完全匹配,在編譯期、鏈接期、執(zhí)行期都可以進(jìn)行優(yōu)化。和其他編譯器不同的是:LLVM借助了LLVM IR,大量的優(yōu)化工作都是圍繞LLVM IR展開的,不同的優(yōu)化都由獨(dú)立的模塊完成。
1)編譯時(shí)優(yōu)化:各個(gè)語言的編譯器前端將代碼翻譯成LLVM IR,LLVM優(yōu)化器針對(duì)LLVM IR做盡可能多的優(yōu)化。編譯期優(yōu)化大多數(shù)屬于局部?jī)?yōu)化(少量?jī)?yōu)化是過程間優(yōu)化),通常包含架構(gòu)無關(guān)優(yōu)化和架構(gòu)相關(guān)優(yōu)化。
2)鏈接時(shí)優(yōu)化:編譯器在編譯時(shí)為函數(shù)提供過程間摘要信息,并附加到LLVM IR中,在連接時(shí)使用這些信息完成優(yōu)化。
3)運(yùn)行時(shí)和離線優(yōu)化:基于收集的程序執(zhí)行信息,再次對(duì)應(yīng)用進(jìn)行優(yōu)化。
在這些優(yōu)化工作中,LLVM IR是整個(gè)編譯系統(tǒng)設(shè)計(jì)的關(guān)鍵,具有如下特點(diǎn)。
1)LLVM使用LLVM IR描述一個(gè)虛擬架構(gòu)并捕獲常規(guī)處理器的關(guān)鍵操作,同時(shí)消除了特定機(jī)器架構(gòu)限制,如物理寄存器、流水線、調(diào)用約定、陷阱等方面的限制。
2)LLVM IR提供無限數(shù)量的類型化虛擬寄存器,并用這些寄存器來存儲(chǔ)基礎(chǔ)類型(如整型、浮點(diǎn)型、指針類型)的值。LLVM IR采用SSA形式,從而更便于進(jìn)行編譯優(yōu)化。
3)在LLVM IR中提供了特有的指令,顯式描述異常控制流信息。
4)LLVM IR約定虛擬寄存器和內(nèi)存之間,僅靠load和store指令進(jìn)行數(shù)據(jù)交換,交換數(shù)據(jù)時(shí)需要約定數(shù)據(jù)類型。內(nèi)存被劃分為全局區(qū)域、棧、堆(過程被視為全局對(duì)象),其中棧、堆上的對(duì)象分別使用alloca指令[3]和malloc指令操作分配空間,并通過這兩個(gè)函數(shù)返回的指針值來訪問相應(yīng)的空間,棧對(duì)象在當(dāng)前函數(shù)的棧幀中分配,控制流(線程)離開函數(shù)時(shí)自動(dòng)釋放棧對(duì)象,堆對(duì)象必須使用free指令進(jìn)行顯式釋放。
5)LLVM IR集成了運(yùn)行時(shí)和系統(tǒng)函數(shù),如I/O、內(nèi)存管理、信號(hào)量等的相關(guān)函數(shù),這些函數(shù)由運(yùn)行時(shí)庫提供,可以被程序鏈接使用。同時(shí)LLVM IR提供文本、二進(jìn)制、內(nèi)存3種文件格式,以方便開發(fā)、存儲(chǔ)和運(yùn)行。
LLVM IR提供了各種分析和變換的Pass(Pass是指對(duì)編譯對(duì)象進(jìn)行一次處理,詳細(xì)內(nèi)容可以參考附錄C),以及配套的工具集,如匯編、反匯編、解釋器、優(yōu)化器、編譯器、測(cè)試套等相關(guān)工具,能幫助開發(fā)者快速入門和使用LLVM。
- 極簡(jiǎn)算法史:從數(shù)學(xué)到機(jī)器的故事
- 數(shù)據(jù)科學(xué)實(shí)戰(zhàn)手冊(cè)(R+Python)
- WildFly:New Features
- Beginning C++ Game Programming
- Offer來了:Java面試核心知識(shí)點(diǎn)精講(原理篇)
- Reactive Programming With Java 9
- 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):軟件核心復(fù)雜性應(yīng)對(duì)之道(修訂版)
- 第一行代碼 C語言(視頻講解版)
- Learning Concurrency in Kotlin
- 快速入門與進(jìn)階:Creo 4·0全實(shí)例精講
- Java程序設(shè)計(jì)基礎(chǔ)(第6版)
- ASP.NET Web API Security Essentials
- Mastering Embedded Linux Programming
- Continuous Delivery and DevOps:A Quickstart Guide Second Edition
- Applied Deep Learning with Python