GCC編譯程式

GCC編譯程式

GCC編譯程式是指基於Unix的一類編譯程式。GCC編譯程式的一趟編譯可以包含20~30多遍(由具體編譯選項決定),其中絕大部分是用來執行最佳化功能的。GCC編譯程式先將源語言程式轉換為語法樹的中間表示,然後再轉換為RTL中間表示。

GCC簡介

GCC是一個用C語言實現的最佳化可移植編譯系統,實際上,GCC是編譯器的快速開發平台,因為它是一個可重定義目標的編譯器(retargetable compiler)。GCC不僅包括了編譯器的前端構件(如,面向ANSI C和其他高級語言的詞法、語法、語義分析程式)和一些標準的後端構件(如,X86、MIPS等常用系統的代碼生成器和最佳化器),而且對於一種新型體系結構的特定指令系統和硬體資源,它還提供一個配置接口,用於定義和描述這種機器的體系結構,並能根據這種描述自動生成面向該機器體系結構的編譯器後端。

GCC的設計思想主要體現在三個方面:目標機器描述與定義機制、RTL中間表示機制以及由機器描述引導中間代碼生成和最佳化策略。

首先,GCC對每個目標機的指令系統都有一個機器描述檔案(machine.md),以代數式的形式對每條指令所完成的操作以及各運算元的機器存儲模式和數據模式進行描述,對於用此方法難以描述的那些信息,作為特定的參數定義在目標機宏定義檔案(tm.h) 中。例如,機器的字長、暫存器的個數及使用約定、記憶體編址特性等。在RTL中間代碼生成階段,通常有多種生產策略被用於不同的參數定義組合。通過改寫這兩個檔案,可完成GCC向新的目標機的移植。

其次,採用合適的中間語言是實現編譯器代碼最佳化和可移植的關鍵。GCC從不同系統結構的機器語言中抽象出共性的操作,形成了一個適合編譯分析加工的中間語言,即RTL(Register Transfer Language),既可以用來描述源語言的各種運算和控制操作,又便於在其上進行深入的最佳化和彙編代碼的生成。

第三,GCC最具特色的設計思想是由目標機的機器描述檔案引導中間代碼的生成和最佳化。由於在傳統編譯器中,中間代碼的生成和最佳化無論是程式代碼還是數據結構均是與機器無關的,所生成的中間代碼不能體現目標機的指令特點和最佳化信息,這使目標代碼的質量受到很大的限制。GCC利用預定義的獨立於具體機器的“原子操作”來設定機器描述中的指令條目,在指令描述中含有對應的中間代碼的操作與數據模式,使GCC能在機器描述引導下進行中間代碼的生成,機器描述處理程式與機器無關,但所生成的中間代碼已含有給定目標機器的指令信息,可在其上進行某些與機器相關的指令歸併、窺孔最佳化及指令重排序等最佳化工作。

GCC清晰的前端語法樹結構、高度概括的抽象機中間語言、簡潔的機器描述等為快速地實現多源語言開發、多平台移植提供了有力的支持。

系統結構

GCC編譯程式主要由語法分析、語義分析、中間代碼生成、最佳化與暫存器分配以及彙編代碼生成等部分組成。

GCC編譯程式在一個總控程式的控制下,經過前端分析和後端處理,把一個GCC源程式轉換為目標機彙編代碼。

總控程式負責初始化、解碼參數、打開/關閉檔案,並控制各遍的操作。

前端分析完成語法、語義分析和中間代碼生成工作,它的輸入是預處理後的源程式,

編譯原理與技術輸出是RTL中間代碼。語法分析是核心,在掃描輸入檔案的過程中實現各種語義成分的翻譯和中間代碼的生成。當分析一函式時,函式中的語句將被轉換成RTI.表示,聲明和表達式的翻譯經由語法樹過渡後再轉換成中問代碼表示。語法分析程式是利用一個類似於YACC的自動生成工具GNU Bison生成的,該工具接受LALR(1)文法。

後端處理完成各種最佳化、暫存器分配和彙編代碼的生成。

最佳化包括全部的常規最佳化,最佳化相關的代碼在GCC中占有相當大的分量,而且每種最佳化都是對RTL中間代碼的一遍處理。這些最佳化是:轉移最佳化、指令調度最佳化和延遲分支最佳化等。其中,轉移最佳化對程式控制流進行最佳化,分別在RTL中間代碼生成、公共子表達式刪除和暫存器重載處理之後執行。每次轉移最佳化和循環最佳化之後進行公共子表達式刪除。指令歸併最佳化和重載處理之後進行指令調度最佳化。循環最佳化除了執行代碼外提之外,還可選擇地執行循環展開最佳化。指令歸併最佳化、指令調度最佳化和延遲分支最佳化均是在目標機器描述的引導下,通過模式匹配算法完成的。

局部和全局暫存器的分配是在數據流分析的基礎上進行的,前者完成基本塊內的暫存器分配最佳化,後者完成剩餘的跨越基本塊的暫存器分配最佳化。

後端的最後一遍處理是彙編代碼的生成。經過前面的分析和最佳化處理後,提交給代碼生成模組的RTL代碼已經含有彙編指令的雛形。代碼生成的主要工作是在機器描述產生的各種數據結構的引導下進行指令識別和獲取彙編指令模板,並據此輸出彙編指令代碼,最終完成對一個GCC源程式的翻譯。

基本過程

GCC編譯程式的基本過程如下:

(1)arm-elf-gcc根據輸入檔案的後綴來確定檔案的類型,然後根據用戶的編譯選項(包括最佳化選項和調試信息選項等)將其編譯成相應的彙編臨時檔案(後綴為.s)。

(2)arm-elf-as將該彙編檔案編譯成目標檔案(後綴為.o)。

(3)arm-elf-ld根據用戶的連結選項(包括指定連結命令檔案等)將目標檔案和各種庫連結起來生成執行檔。

相關詞條

熱門詞條

聯絡我們