天天看點

《深入分析GCC 》——3.2 GCC的邏輯結構

本節書摘來自華章出版社《深入分析gcc 》一書中的第3章,第3.2節,作者 王亞剛 ,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

gcc的源代碼檔案數量龐大,目錄結構複雜,總體結構了解有一定的難度,但從代碼功能和邏輯結構上來講,這些代碼大緻可以分為如圖3-1所示的幾個部分。

《深入分析GCC 》——3.2 GCC的邏輯結構

圖3-1分為上下兩個部分,上半部分使用gcc表示gcc 4.4.0的源代碼内容,下半部分使用gcc/cc1表示使用gcc源代碼編譯生成的編譯器程式。

圖3-1的上半部分根據源代碼的功能将gcc源代碼分為4大部分:

(1)進階語言相關代碼(high-level-language specif?ic code)。在gcc的源代碼中,對于gcc能夠編譯的每一種程式設計語言都有其相應的處理代碼,這些代碼主要集中在${gcc_source}/${language}目錄下。其中${language}代表了程式設計語言的名稱,這部分代碼主要完成進階程式設計語言的詞法、文法分析等功能,進而生成該語言對應的抽象文法樹(ast,abstract syntax tree),并完成其規範化(genericize)操作。

(2)與程式設計語言和目标機器無關的通用代碼(language & machine independent generic code)。這部分代碼主要包括${gcc_source}/目錄下的代碼,用于完成gimple和rtl的生成,以及數量龐大的基于gimple和rtl的處理及編譯優化工作。

(3)機器描述(machine descriptions)代碼。一般來說,對于gcc支援的每一種名稱為${target}的目标機器,在gcc的代碼中均有一個名稱為${gcc_source}/conf?ig/${target}的子目錄,用來存放與該目标機器相關的機器描述代碼及其相應的頭檔案和c檔案等。

(4)與目标機器相關的生成器代碼(machine dependent generator code)。這部分代碼比較難以了解,讀者可以試着這樣來考慮。為了生成目标機器上編譯器程式cc1,gcc提供的源代碼在設計階段是不完整的,其中缺少的部分主要包括目标機器相關的rtl構造及目标代碼生成等部分的源代碼。由于這一部分源代碼是與目标機器相關的,在gcc設計源代碼時是難以确定的,是以,gcc采用了這樣一種解決的思路,就是通過一些生成器(generator)代碼,這些代碼能夠根據目标機器的機器描述檔案,提取目标機器的資訊,進而自動地生成關于目标機器上rtl構造及目标代碼生成的源代碼,并将這些源代碼與gcc原有的其他代碼結合在一起編譯,進而生成與目标機器相關的編譯器程式。與目标機器相關的生成器代碼的檔案名稱一般為${gcc_source}/gen*.[ch],其主要的功能就是根據機器描述檔案生成與目标機器相關的部分源代碼。

是以,最終參與編譯,生成目标機器編譯器的源代碼主要包括了語言相關的代碼、語言及機器無關的通用代碼,以及根據機器描述檔案由機器相關代碼生成器所生成的代碼等三部分。

圖3-1的下半部分給出了根據上述gcc的源代碼所生成的目标機器上編譯器cc1(gcc程式所調用的編譯器)的主要工作流程。從整體上看,目标機器上編譯器cc1的功能就是将使用者輸入的進階程式代碼最終編譯成目标機器上的彙編代碼,其中經曆了前端的詞法分析、文法分析、語義分析,中間的gimple生成、gimple優化,以及後端的rtl生成、rtl優化、代碼生成等幾個步驟。在這些處理過程中,gcc也分别使用幾種不同的中間表示(intermediate representation,ir)形式,包括ast、gimple、rtl等。這些處理步驟與上半部分的代碼具有一定的對應關系,例如詞法、文法分析以及ast的規範化過程對應上半部分的“進階語言相關代碼”;gimple生成、gimple優化及rtl優化部分則對應上半部分的“與程式設計語言和目标機器無關的代碼”;rtl生成以及最終的彙編代碼生成部分則由上半部分的“與目标機器相關的生成器代碼”根據上半部分的“機器描述”生成。

對圖3-1的上半部分和下半部分進行對照,可以看出不同部分的gcc源代碼在功能上的差異。

本書在分析gcc時,也是按照cc1的執行流程,圍繞各種中間表示的生成和處理進行深入分析,進而幫助讀者了解gcc設計的關鍵思路和技術,主要包括:

第4章主要以c語言為例,介紹gcc前端對于進階語言進行詞法、文法分析,進而生成其ast的過程,重點描述了其中ast的表示、存儲結構及其操作等。

第5章主要描述gimple中間表示的生成過程。

第6章主要描述基于gimple中間表示的各種編譯優化,這些優化大多是基于靜态單指派(static single assignment,ssa)形式的gimple表示,而且都是與目标機器無關的優化。

第7章詳細地介紹了gcc中rtl中間表示的基本概念,并對其類型、存儲以及操作做了較長的描述。

第8章主要介紹gcc中機器描述檔案${target}.md的指令模闆的基本概念及其主要内容,并對機器描述檔案中def?ine_insn、def?ine_expand、def?ine_split、def?ine_peephole等主要操作進行了詳細的描述和執行個體說明,這些内容對于了解機器描述檔案和使用者機器描述檔案至關重要。

第9章主要對gcc中機器描述檔案的c檔案和頭檔案進行了較長的描述。這些内容也為第12章的gcc向新處理器的移植做了充分的準備。另外,9.9節則重點介紹了與目标機器相關的生成器代碼的結構及其作用。

第10章主要描述rtl中間表示的生成技術。

第11章主要描述基于rtl中間表示的優化技術,這些優化大部分是與目标機器相關的。

第12章重點給出将gcc移植到新的處理器的基本過程和執行個體。

繼續閱讀