GCC編譯器后端移植技術(shù)_第1頁(yè)
GCC編譯器后端移植技術(shù)_第2頁(yè)
GCC編譯器后端移植技術(shù)_第3頁(yè)
GCC編譯器后端移植技術(shù)_第4頁(yè)
GCC編譯器后端移植技術(shù)_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、GCC編譯器后端移植技術(shù)摘要:從gcc編譯器的體系結(jié)構(gòu)出發(fā),提出了gcc前后端分離的結(jié)構(gòu)以適合移植到不同的硬件平臺(tái),分析了gcc后端移植的關(guān)鍵技術(shù)。重點(diǎn)闡述后端移植所必須的文件,并詳細(xì)說(shuō)明這些文件的作用,給出了rtl中間語(yǔ)言的語(yǔ)法結(jié)構(gòu)以及典型指令的rtl指令模板結(jié)構(gòu)。最后通過(guò)一個(gè)實(shí)例對(duì)移植到新硬件體系結(jié)構(gòu)的gcc進(jìn)行測(cè)試,結(jié)果表明針對(duì)特定的硬件體系結(jié)構(gòu),gcc后端移植技術(shù)是可行的,能夠產(chǎn)生正確的匯編語(yǔ)言代碼。關(guān)鍵詞:rtl中間語(yǔ)言; 指令模板; 機(jī)器描述md; 后端移植引言近年來(lái),嵌入式計(jì)算機(jī)系統(tǒng)被廣泛應(yīng)用于軍事及空間領(lǐng)域的各種控制及智能系統(tǒng)中。在這些系統(tǒng)中,嵌入式計(jì)算機(jī)是系統(tǒng)的核心和智能部件

2、。隨著集成電路技術(shù)的發(fā)展,開(kāi)始設(shè)計(jì)生產(chǎn)具有自主產(chǎn)權(quán)的專(zhuān)用芯片,并越來(lái)越多的將其應(yīng)用于航空航天等相應(yīng)嵌入式計(jì)算機(jī)系統(tǒng)中。同時(shí)嵌入式計(jì)算機(jī)應(yīng)用的不斷發(fā)展給計(jì)算機(jī)技術(shù)的各個(gè)方面提出了新的要求和挑戰(zhàn)。嵌入式系統(tǒng)的開(kāi)發(fā)特征對(duì)開(kāi)發(fā)工具提出了特殊的要求。它對(duì)于代碼大小,代碼性能,以及可配置性的苛刻要求,使得在桌面以及服務(wù)器端開(kāi)發(fā)中表現(xiàn)良好的編譯系統(tǒng)往往不能勝任。這需要為其開(kāi)發(fā)專(zhuān)用的高級(jí)語(yǔ)言編譯器,但是開(kāi)發(fā)一個(gè)完全自主化的編譯器往往需要很長(zhǎng)時(shí)間,并不是一個(gè)可取的方案,所以把目光轉(zhuǎn)向可變目標(biāo)編譯器1??勺兡繕?biāo)編譯器能夠針對(duì)不同的目標(biāo)機(jī)器生成代碼。編譯器中與機(jī)器有關(guān)的部分被獨(dú)立成模塊,針對(duì)不同的目標(biāo)機(jī)器,這些模塊

3、可以方便的進(jìn)行替換。gcc就是是可變目標(biāo)編譯器,作為開(kāi)源編譯器,它源碼豐富,文檔詳盡,是一個(gè)支持多種高級(jí)語(yǔ)言和多機(jī)器平臺(tái)的系統(tǒng),高度優(yōu)化和可移植性能是該編譯系統(tǒng)最為突出的2大特點(diǎn)。本文將詳細(xì)介紹gcc移植相關(guān)的技術(shù)。1gcc體系結(jié)構(gòu)gcc(gnu complier collection)是一個(gè)成功的支持多種高級(jí)語(yǔ)言和多種機(jī)器平臺(tái)的系統(tǒng)。gcc體系結(jié)構(gòu)(如圖1所示)可以劃分為2部分:與語(yǔ)言相關(guān),目標(biāo)機(jī)器無(wú)關(guān)的前端和與語(yǔ)言無(wú)關(guān),目標(biāo)機(jī)器相關(guān)的后端。圖1gcc體系結(jié)構(gòu)它是一個(gè)典型的語(yǔ)法制導(dǎo)的優(yōu)化編譯器23,前端通過(guò)詞法分析,語(yǔ)法分析,語(yǔ)義分析,生成語(yǔ)法樹(shù),對(duì)語(yǔ)法樹(shù)簡(jiǎn)單優(yōu)化之后,將其轉(zhuǎn)化為中間代碼。后

4、端接受前端產(chǎn)生的語(yǔ)法樹(shù),將其轉(zhuǎn)換為中間語(yǔ)言的表現(xiàn)形式,在此基礎(chǔ)上進(jìn)行各種優(yōu)化,然后根據(jù)目標(biāo)機(jī)的機(jī)器描述生成匯編程序代碼4。gcc要實(shí)現(xiàn)支持多平臺(tái)編譯,必須解決3個(gè)根本問(wèn)題:需要設(shè)計(jì)一種較好的中間語(yǔ)言,在適當(dāng)?shù)膶哟紊?,向上能支撐多種語(yǔ)言的映射,向下能夠適合多平臺(tái)轉(zhuǎn)換并且適合于各種優(yōu)化;需要設(shè)計(jì)一種對(duì)目標(biāo)機(jī)恰當(dāng)?shù)臋C(jī)器描述;在機(jī)器描述與編譯主體之間需要仔細(xì)的設(shè)計(jì)一種統(tǒng)一接口。將gcc移植到一個(gè)新的硬件系統(tǒng)時(shí),上述3個(gè)問(wèn)題的解決是致關(guān)重要的。由于gcc前端與語(yǔ)言相關(guān)5,已經(jīng)很成熟穩(wěn)定,能夠支持當(dāng)今流行的大部分高級(jí)語(yǔ)言,如c/c+,java,fortran,ada 等,所以不對(duì)前端做過(guò)多介紹,著重介紹后

5、端技術(shù)。2rtl中間語(yǔ)言rtl(register transfer language)6是一種以一種虛擬寄存器(pseudo register)的方式來(lái)敘述計(jì)算機(jī)行為的語(yǔ)言。rtl有5種對(duì)象:表達(dá)式,整數(shù),寬整數(shù),字符串和向量。其中最重要的是表達(dá)式rtx(rtl expression)。rtx類(lèi)似于c的結(jié)構(gòu)體,通常用指針來(lái)引用它,指針類(lèi)型定義名為rtx。每個(gè)rtx都具有統(tǒng)一的內(nèi)部數(shù)據(jù)結(jié)構(gòu)與外部語(yǔ)法。本文只涉及rtx的外部語(yǔ)法,即rtx表達(dá)式的文本形式的語(yǔ)法,其一般形式為:(code: m opn1 opn2 ),code:rtx操作碼。該操作碼指明rtx表示的操作類(lèi)型,如表示一條指令時(shí)進(jìn)行某種

6、說(shuō)明。此外,code還確定rtx的操作數(shù)個(gè)數(shù)和這些操作數(shù)的種類(lèi)。m:機(jī)器模式。表示數(shù)據(jù)和運(yùn)行結(jié)果的類(lèi)型,它反映了數(shù)據(jù)類(lèi)型與字長(zhǎng)兩部分信息。數(shù)據(jù)類(lèi)型分為整型,浮點(diǎn)型和復(fù)型3種。機(jī)器字長(zhǎng)則分為8位,16位,32位,64位等。這兩部分信息組合所構(gòu)成的機(jī)器方式反映了機(jī)器能表示的各種數(shù)據(jù)類(lèi)型。opn:操作數(shù)。各個(gè)rtx表達(dá)式的操作個(gè)數(shù)以及操作數(shù)的種類(lèi)是各不相同的,這取決于rtx操作碼。以下是一個(gè)實(shí)際的rtx表達(dá)式例子,(insn 7 6 0 (set (mem:si (plus:si (reg:si 54 virtualstackvars)(const_int 12 0xfffffff4) 0 a+0

7、s4 a32)(const_int 3 0x3) 1 (nil)操作碼“insn”指出這是一條表示指令的rtx,前3個(gè)操作數(shù)均為整常數(shù),分別表示本條指令編號(hào),前一條指令編號(hào)和后一條指令編號(hào),構(gòu)成前向鏈和后向鏈(如圖2所示)。其對(duì)應(yīng)的樹(shù)結(jié)構(gòu)(如圖3所示)。3gcc后端技術(shù)gcc后端對(duì)于目標(biāo)機(jī)器的支持全部體現(xiàn)在后端描述中,將gcc移植到一個(gè)新的硬件系統(tǒng)時(shí),要對(duì)新系統(tǒng)的處理器架構(gòu)要進(jìn)行詳細(xì)的描述,使gcc的后端支持新的處理器架構(gòu)。本節(jié)重點(diǎn)介紹后端描述的結(jié)構(gòu)以后端描述的自動(dòng)處理。圖2insn對(duì)象的雙向鏈表圖3rtx表達(dá)式及其對(duì)應(yīng)的樹(shù)結(jié)構(gòu)3.1gcc后端描述gcc對(duì)于后端的描述主要有3個(gè)文件7,一個(gè)是c

8、語(yǔ)言宏文件,一個(gè)c源文件,一個(gè)用rtl表達(dá)式寫(xiě)成的機(jī)器描述文件md。將gcc移植到一個(gè)新的硬件系統(tǒng)時(shí),要對(duì)新系統(tǒng)的處理器架構(gòu)要進(jìn)行詳細(xì)的描述,使gcc的后端支持新的處理器架構(gòu)。具體的描述文件就是上述3個(gè)文件:c的宏文件,c文件和機(jī)器描述文件md,分別為target.h,target.c和target.md,target是需要移植的目標(biāo)機(jī)器的代號(hào)。下面分別介紹3種文件。3.1.1c的宏文件c的宏是用來(lái)描述機(jī)器和abi的屬性。一般分成以下幾類(lèi):(1)控制gcc驅(qū)動(dòng)程序選項(xiàng),目標(biāo)機(jī)器的特定命令行選項(xiàng)。這些宏定義告訴編譯驅(qū)動(dòng)程序以何種形式的命令行參數(shù)運(yùn)行諸如預(yù)處理,編譯,匯編,連接等處理步驟,在運(yùn)行這

9、些處理步驟中可能需要的查詢(xún)路徑名以及是否需要運(yùn)行某一些特殊的處理步驟等。(2) 存儲(chǔ)布局:要涉及基本的數(shù)據(jù)類(lèi)型的大小,對(duì)齊約定;(3) 應(yīng)用二進(jìn)制編程接口(abi),如何調(diào)用函數(shù);(4) 目標(biāo)機(jī)器的寄存器使用,包括類(lèi)型,基本特征,寄存器分配的順序,用于構(gòu)造堆棧的寄存器指令等等;(5) 尋址模式,描述目標(biāo)機(jī)器不同的尋址模式;(6) 匯編文件輸出框架格式約定,指定匯編程序的初試數(shù)據(jù)段,正文段,一般數(shù)據(jù)段等等的格式要求,定義匯編輸出函數(shù)的函數(shù)名;(7) 調(diào)試信息輸出約定,指定系統(tǒng)支持的調(diào)試文件格式。這些參數(shù),其中很多不是參數(shù)核集的元素,有缺省的處理方式,但要具體地描述一個(gè)特定平臺(tái),須對(duì)它們作正確而有

10、效的定義。它們是絕大多數(shù)平臺(tái)至少提供的內(nèi)容,只能描述出平臺(tái)最基本的功能。3.1.2c源文件target.h中定義的宏都是生成代碼,這給調(diào)試增加了一定的難度和復(fù)雜度,所以在target.c文件中增加一個(gè)同名函數(shù)(但是為小寫(xiě)字母)。例如,在target.h文件中,定義了這樣一個(gè)宏:#define preferred_reload_class(x,class)preferred_reload_class (x, class)為了讓其可用,并保證程序的可讀性,引入了target_protos.h文件,在target_protos.h中,聲明了同名函數(shù):extern enum reg_class pre

11、ferred_reload_class(rtx, enum reg_class)并且在target.c文件中具體定義了此函數(shù)。這是一個(gè)約定,在配置的時(shí)候,配置程序會(huì)做處理。由此,可以調(diào)試這個(gè)函數(shù),而不必在眾多的文件中增加宏定義。3.1.3機(jī)器描述md機(jī)器描述md中用rtl語(yǔ)言描述的指令模板是核心內(nèi)容。md文件是目標(biāo)機(jī)指令集的一個(gè)形式化的說(shuō)明文件,它針對(duì)gcc中的各種操作模式,描述了指定目標(biāo)機(jī)支持的操作和實(shí)現(xiàn)情況,而并非目標(biāo)指令集的簡(jiǎn)單匯集。編譯系統(tǒng)根據(jù)由機(jī)器描述md生成的數(shù)據(jù)結(jié)構(gòu)和函數(shù)定義集合,進(jìn)行中間代碼的生成以及中間代碼到匯編代碼的映射。這些“標(biāo)準(zhǔn)指令”是從各種目標(biāo)機(jī)的指令集中抽象出來(lái)的,

12、但同時(shí)它又能表達(dá)gcc中的各種基本操作。,下面是指令模板的一般結(jié)構(gòu)8:(define_patterntype “(optional)patternname”rtltempalte“optional paternalcondition”“outputtemplate”(optinally:attributesetting)簡(jiǎn)單介紹以下各個(gè)參數(shù)的含義:(1)patterntype 有2種類(lèi)型,insn是用于定義指令樣板的rtx表達(dá)式中最核心的一種類(lèi)型,既可作為生成模板,又可作為匹配模板;expand是模板的擴(kuò)充定義,僅在操作與標(biāo)準(zhǔn)名稱(chēng)模板相關(guān)時(shí)使用。(2) patternname 指令模板名,一個(gè)

13、模板可以為gcc規(guī)定的標(biāo)準(zhǔn)指令名,或者開(kāi)發(fā)者任意給定的名字,也可以空字符串,但是模板名必須惟一。(3) rtltempalte一個(gè)復(fù)雜操作的集合,為一不完全的rtx表達(dá)式或向量,稱(chēng)為rtl模板。它表示指令模板的rtl指令體,只規(guī)定了rtl指令體中的各種操作以及操作數(shù)的位置和操作數(shù)必須滿足的條件和限制,并未指明具體的操作數(shù)。(4) optional paternalcondition 為一字符串,稱(chēng)為條件。這個(gè)字符串或者為空,或者為一個(gè)c語(yǔ)言條件表達(dá)式。當(dāng)非空時(shí),它指出此模板有效的條件。(5) outputtemplate 為一字符串,稱(chēng)為輸出模板。輸出模板用來(lái)確定與此模板相匹配的rtl指令的匯

14、編輸出形式。(6) attributesetting 它為一任選的rtx向量,稱(chēng)為指令屬性。當(dāng)此操作數(shù)出現(xiàn)時(shí),它給出與這一模板相匹配的指令屬性。下面是mips.md中的一條單浮點(diǎn)加法指令模板:(define_insn “addsf3”(set(match_operand:sf 0 “register_operand” “=f”)(plus:sf(match_operand:sf 1 “register_operand”“f”) (match_operand:sf 2 “register_operand” “f”)“target_hard_float”“add.st%0,%1,%2”(set_a

15、ttr “type”“fadd”)(set_attr “mode”“sf”)這是一條單浮點(diǎn)加法指令的指令模板9,分別對(duì)應(yīng)指令模板結(jié)構(gòu)的各個(gè)參數(shù)的含義。從這個(gè)指令模板,可以看出這條指令的模板類(lèi)型patterntype是insn;模板名patternnames是”addsf3”,這是指令名,從指令名可以看出這是一條單浮點(diǎn)加法指令;這條指令有3個(gè)操作數(shù),rtl模板規(guī)定了3個(gè)操作數(shù)的各種操作和位置以及必須滿足的條件和限制條件,”set” ,”mem”,”plus”分別表示賦值,存儲(chǔ)器引用和加法運(yùn)算,它們的操作數(shù)均為rtx表達(dá)式;指令模板是否有效的條件是”target_hard_float”;匯編輸出模

16、板是”add.st%0,%1,%2”,輸出的匯編代碼形式就如輸出模板所示;最后是指令屬性,表明這是浮點(diǎn)加法指令,指令的模式為sf,是單浮點(diǎn)模式。3.2gcc后端處理機(jī)器描述文件md建立抽象機(jī)標(biāo)準(zhǔn)指令、中間語(yǔ)言rtl、目標(biāo)機(jī)匯編模板三者之間的聯(lián)系,它是一個(gè)正文文件,如果編譯過(guò)程中為構(gòu)造或匹配rtl去搜尋這樣一種文件,將會(huì)機(jī)器緩慢。為此gcc編譯內(nèi)部設(shè)計(jì)了專(zhuān)門(mén)的函數(shù)和數(shù)據(jù)結(jié)構(gòu)作為編譯主體與機(jī)器描述之間的接口,編譯主體通過(guò)這些函數(shù)和數(shù)據(jù)結(jié)構(gòu)獲得md的內(nèi)容。在編譯器的構(gòu)造期間,利用gcc提供的一套獨(dú)立的,專(zhuān)用的機(jī)器描述處理程序,將正文形式的md轉(zhuǎn)換成含有接口所需的數(shù)據(jù)結(jié)構(gòu)與函數(shù)的c源程序。gen*正是

17、完成這一工作的一套轉(zhuǎn)換程序10,對(duì)機(jī)器描述文件進(jìn)行處理(如圖4所示),生成一組c文件,或者頭文件,生成的這些文件以及手工定義的target.c和target.h結(jié)合起來(lái)就是gcc的機(jī)器相關(guān)部分。圖4后端處理流程gen*是指一套11個(gè)c程序,它們針對(duì)不同的編譯處理目的分析md,生成相應(yīng)一套接口程序包含11個(gè)c文件insn*.c,或者insn*.h。由gen*生成的這套接口程序分別作用于rtl的優(yōu)化,機(jī)器相關(guān)的優(yōu)化,匯編代碼輸出等過(guò)程。其中,insn*.h含有編譯主體和insn*.c涉及到的宏名定義,數(shù)據(jù)類(lèi)型定義以及外說(shuō)明,它們作為頭文件被包含于相關(guān)的源文件中。gcc通過(guò)使用生成的rtl代碼片段對(duì)

18、機(jī)器描述md文件中的指令模板進(jìn)行匹配。insnrecog.c中的函數(shù)recog()是依據(jù)md中的指令樣板生成的rtl指令匹配函數(shù)。給定一條rtl指令,該函數(shù)判斷它是否與md中的某條指令樣板相匹配,若匹配則返回該樣板的編號(hào),否則返回1。對(duì)每一個(gè)rtl片段來(lái)說(shuō),都要從md文件頭開(kāi)始掃描,逐個(gè)匹配直到找到一個(gè)insn定義的寄存器行為和rtl片段完全相同,輸出相應(yīng)的匯編代碼。4實(shí)例驗(yàn)證將gcc移植到了自己開(kāi)發(fā)的dsp芯片lsdsp上。首先要詳細(xì)編寫(xiě)的目標(biāo)機(jī)器后端描述文件11 ,lsdsp.md,lsdsp.c和lsdsp.h,然后放在gcc源碼包中相應(yīng)的位置,通過(guò)配置源碼中的configure腳本(具體參照gcc使用手冊(cè)),經(jīng)過(guò)編譯后得到目標(biāo)機(jī)編譯環(huán)境。簡(jiǎn)單加法程序的測(cè)試結(jié)果(如圖5所示)。從測(cè)試結(jié)果可以看出,移植后的gcc可以支持新的硬件體系結(jié)構(gòu),能夠產(chǎn)生符合標(biāo)準(zhǔn)的匯編代碼。5結(jié)語(yǔ)gcc是支持多語(yǔ)言、多目標(biāo)機(jī)編譯系統(tǒng)中最有代表性的一個(gè)。雖然隨著嵌入式應(yīng)用的升溫,優(yōu)化的交叉編譯系統(tǒng)正在得到越來(lái)越多的關(guān)注,但它還是一個(gè)比較新的課題,能參考的文獻(xiàn)和技術(shù)資料非常有限,很多工作都是靠閱讀大量的源代碼完成的。現(xiàn)在對(duì)專(zhuān)用芯片移植編譯器的技術(shù)已經(jīng)有所了解,要想得到高效的優(yōu)化的交叉編譯環(huán)境,還有大量工作要做。圖5測(cè)試結(jié)果參考文獻(xiàn)1fras

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論