官术网_书友最值得收藏!

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。

主站蜘蛛池模板: 林甸县| 益阳市| 特克斯县| 巴中市| 阳山县| 萝北县| 牟定县| 崇义县| 湘潭市| 尚志市| 酒泉市| 桂平市| 军事| 北海市| 深州市| 潼南县| 伊金霍洛旗| 富川| 明水县| 红安县| 盈江县| 灯塔市| 漳平市| 托克托县| 沁阳市| 万宁市| 隆安县| 射洪县| 白朗县| 昆明市| 阿合奇县| 玛纳斯县| 德阳市| 甘洛县| 阿勒泰市| 商城县| 开化县| 清苑县| 灵宝市| 蚌埠市| 神木县|