1. 程式人生 > >GCC-3.4.6原始碼學習筆記 當前目錄

GCC-3.4.6原始碼學習筆記 當前目錄

參考文獻

準備工作

GCC的架構

前端

1.概覽

1.1. 前端中樹的表達形式

1.1.2. tree_code —— 樹節點的ID

1.1.3.1.  節點大小的確定

1.1.3.2.  記憶體分配

1.2.1.  機器模式的概念[2]

1.2.2.1. 初始化臨時的size_t節點

1.2.2.1.1.      整型型別的節點

1.2.2.1.2.      建立臨時的size_t節點

1.2.2.1.3.      建立整型的型別節點

1.2.2.1.4.      確定取值範圍

1.2.2.1.5.      整型型別的佈局

1.2.2.1.5.1. 整型的型別資訊

1.2.2.1.5.1.1. 確定型別的符號

1.2.2.1.5.1.2. 確定機器模式

1.2.2.1.5.1.3. 確定型別大小

1.2.2.1.5.2.完成佈局

1.2.2.2. size_t的正式的節點

1.2.2.3. 建立整型常量節點

1.2.3.1. tree_real_cst節點

1.2.3.1.1.      從real_value建立節點

1.2.3.1.2.      從整型常量建立節點

1.2.3.1.2.1. 從整型常量構建real_value

1.2.3.1.2.2. 生成值的規範化

1.2.3.1.2.3. 轉換到實數模式

1.2.4.1.  指標型別節點的構造

1.2.4.1.1.      用於表示型別的樹節點

1.2.4.1.2.      節點的建立

1.2.4.1.3.      型別的佈局

1.2.4.2. 建立引用型別的節點

1.2.4.3. 為地址表示式建立節點

1.2.4.4. 為OFFSET_TYPE建立節點

1.3.1. 節點的建立

1.3.1.1. tree_exp型別

1.3.1.2. 運算元的預處理

1.3.2. 對於CALL_EXPR節點的處理

1.3.2.1. 確定被呼叫的函式

1.3.2.1.1. CALL_EXPR節點

1.3.2.1.2. 找出呼叫的函式

1.3.2.1.3. 確定函式的屬性

1.3.2.1.3.1. 獲取描述被呼叫函式的資料

1.3.2.1.3.2. 函式呼叫關係圖

1.3.2.1.3.2.1.節點結構

1.3.2.1.3.2.2.建立cgaph_node節點

1.3.2.1.3.3. 確定屬性

1.5. 為宣告建立節點

1.5.1. 對宣告的佈局

1.6.1. 建立函式型別的節點

1.6.1.1. 由函式形參建立函式型別節點

1.6.1.2. 由函式形參連結串列建立函式型別節點

1.6.1.3. 對函式型別的佈局

1.6.2. 建立索引節點

1.6.3.1. 型別的佈局

1.6.3.1.1. 獲取陣列的邊界

1.6.3.1.1.1. 對整型常量的操作

1.6.3.1.1.1.1. 左移

1.6.3.1.1.1.2. 右移

1.6.3.1.1.1.3. 迴圈移位

1.6.3.1.1.1.4. 加法和減法

1.6.3.1.1.1.5. 乘法

1.6.3.1.1.1.6. 除法和取整

1.6.3.1.1.2. 獲取結果

1.6.3.1.2. 確定元素和陣列的大小

1.7. save_expr函式的細節

2.1. 識別符號雜湊表的初始化

2.1.1. Obstack的管理

2.1.1.1. 初始化管理塊

2.1.1.2. 記憶體分配

2.1.1.3. 釋放物件

2.1.2. 元素的分配函式

2.1.2.1. 識別符號同時存在樹和雜湊表的方式

2.1.3. 雜湊表的查詢

2.2.1. 雜湊表的定義

2.2.2. 雜湊表的元素

2.2.3. 查詢雜湊表

2.2.3.1. 為新型別填寫資訊

2.2.3.1.1. 整數型別的資訊

2.2.3.1.2. 實數和複數型別資訊

2.2.3.1.3. 其他簡單型別的資訊

2.2.3.1.4. 陣列型別的資訊

2.2.3.1.5.1. 概覽[2]

2.2.3.1.5.2. 聚集型別的佈局

2.2.3.1.5.2.1. 儲存資訊的結構體

2.2.3.1.5.2.2. 收集域的資訊

2.2.3.1.5.2.2.1. tree_decl節點

2.2.3.1.5.2.2.2. 域的佈局

2.2.3.1.5.2.2.3. VAR_DECL型別

2.2.3.1.5.2.2.4. CONST_DECL及TYPE_DECL型別

2.2.3.1.5.2.2.5. UNION的佈局

2.2.3.1.5.2.2.5.1.FIELD_DECL的佈局

2.2.3.1.5.2.2.5.2. 位域宣告節點的處理

2.2.3.1.5.2.2.5.3. 其他域宣告的處理

2.2.3.1.5.2.2.5.4. 進一步調整

2.2.3.1.5.2.2.5.5. 更新record_layout_info

2.2.3.1.5.2.2.6.1. 確定FIELD_DECL的對齊量

2.2.3.1.5.2.2.6.2. 不必要的緊湊佈局

2.2.3.1.5.2.2.6.3. 需要填充的情況

2.2.3.1.5.2.2.6.4. GCC預設佈局下的位域

2.2.3.1.5.2.2.6.5. MS佈局下的位域

2.2.3.1.5.2.2.6.6. 更新record_layout_info

2.2.3.1.5.2.3. 完成佈局

2.2.3.1.5.2.3.1. 確定型別大小

2.2.3.1.5.2.3.2. 確定型別模式

3.1. 為語言準備的鉤子

3.2. 初始化原始檔閱讀器

3.3.1. 與優化有關的選項

3.3.3.1. 可用的選項 (

3.3.3.1.1. C++的選項續1)(續2

3.3.3.1.2. 處理公共選項續1)(續2

3.3.4. 完成處理 

4. 預備原始碼分析

4.1. 選項的後處理

4.1.3. 讀入原始碼

4.1.3.1. 查詢並讀入檔案

4.1.3.2. 讀入檔案

4.1.3.2.1. PCH檔案的案例

4.1.3.2.1.1. 預處理階段的#pragma

4.1.3.2.1.2.1. 純量變數的內容

4.1.3.2.1.2.2. 全域性陣列的內容

4.1.3.2.1.2.3. 雜湊表

4.1.3.2.1.2.4. 對映檔案內容至虛存

4.1.3.2.1.2.4.1. 恢復識別符

4.1.3.2.1.3. 恢復儲存的巨集及#pragma

4.1.3.2.1.4. 讀入巨集定義

 4.1.3.2.1.4.1. 準備快取

 4.1.3.2.1.4.2.提前定義所在行號

 4.1.3.2.1.4.3. 傳統模式

 4.1.3.2.1.4.4.1. 提前符號

 4.1.3.2.1.4.4.2. 解析引數

 4.1.3.2.1.4.4.3. 巨集展開體

 4.1.3.2.1.4.4.4. 完成建立

4.1.3.2.1.4.5. 完成讀入

4.1.3.2.2. 讀入普通檔案

4.1.3.2.3. 堆疊檔案(PCH檔案除外)

4.1.3.2.3.1. 更換檔案

4.2. 初始化後端

4.2.1. 建立後端永久共享物件

4.2.1.1. 設定暫存器模式

4.2.1.3. 建立RTL物件

4.2.1.3.1. RTL語言

4.2.1.3.2. 建立物件

4.2.1.3.2.1. 用於暫存器及相關的物件

4.2.1.3.2.2. 浮點常量物件

4.2.2. 初始化暫存器集

4.2.3. 確定暫存器集

4.2.3.1. 確定子集及超集關係

4.2.4. 初始化偽棧框引用

4.2.5. 準備別名分析

4.2.6.1. 概覽

4.2.6.2. 初始化

4.2.7. 準備重灌遍

4.2.7.1. 概覽

4.2.7.2. 初始化

4.2.9. 準備彙編的生成

4.2.10.1. 建立偽函式上下文 (

4.2.10.2. 資料收集

4.2.12. 清除偽函式上下文

4.3.1. 前端部分的初始化

4.3.1.1. stmt_codes

4.3.1.2. 為C++初始化關鍵字

4.3.1.3. 初始化tree_list所用的雜湊表

4.3.1.4. 與C++語義相關的初始化

4.3.1.5. 初始化操作符資料

4.3.1.6. 初始化名字修飾相關的資料結構

4.3.1.7.1. 預定義識別符號

4.3.1.7.2. 全域性名字空間

4.3.1.7.2.1. 資料結構

4.3.1.7.2.2. 進入全域性名字空間

4.3.1.7.2.3. 從全域性名字空間返回

4.3.1.7.2.4. 全域性名字空間物件

4.3.1.7.2.5. 建立作用域

4.3.1.7.4.1. 加入全域性名字空間

4.3.1.7.4.2. 退回到全域性名字空間

4.3.1.7.5.1. 內建整型型別節點

4.3.1.7.5.2. 表示內建整型型別大小的節點

4.3.1.7.5.3. 其他內建型別節點

4.3.1.7.5.3.1. 常用常量的節點

4.3.1.7.5.3.2. va_list型別節點

4.3.1.7.5.3.3. Vector型別節點

4.3.1.7.5.4. 內建函式型別節點

4.3.1.7.5.5. 內建函式屬性的節點

4.3.1.7.5.5.1. 內建函式屬性的細節

4.3.1.7.5.6. 建立內建函式節點

4.3.1.7.5.6.1. 概覽

4.3.1.7.5.6.2. 建立FUNCTION_DECL節點

4.3.1.7.5.6.3. 把FUNCTION_DECL加入當前名字空間

4.3.1.7.5.6.4. 為內建函式建立RTX物件

4.3.1.7.5.6.5. 處理內建函式的屬性

4.3.1.7.5.6.5.1. 建立屬性處理方法

4.3.1.7.5.6.5.2.處理format屬性

4.3.1.7.5.6.5.3. 設定format屬性

4.3.1.7.5.6.5.4. 處理nonnull屬性

4.3.1.7.5.6.5.5.設定nonnull屬性

4.3.1.7.5.6.5.6. 處理nothrow屬性

4.3.1.7.5.6.5.7.設定nothrow屬性

4.3.1.7.5.6.6. 題外話 —— 編譯內建函式

4.3.1.7.6.1. 標準部分

4.3.1.7.6.2. 擴充套件部分

4.3.1.7.7.1. bad_alloc

4.3.1.7.7.2. Binfo及basetype的細節

4.3.1.7.7.3. new和delete操作符

4.3.1.7.8. 完成初始化

4.3.1.7.8.1. 初始化類處理引數

4.3.1.7.8.2. 執行時型別識別RTTI

4.3.1.7.8.2.1. 構建TYPE_DECL節點

4.3.1.7.8.2.3. RTTI的使用

4.3.1.7.8.2.3.1. 為型別生成RTTI

4.3.1.7.8.2.3.2.1. 安裝基本型別type_info物件

4.3.1.7.8.2.3.2.2. 構建真實type_info物件

4.3.1.7.8.3. 異常處理控制代碼

4.3.1.7.8.4. 檢測連結器的行為及其它

4.3.1.8. 設定前處理器

4.3.1.9. 完成前端初始化

5. 原始碼解析

5.1. 設定系統的巨集定義

5.1.1. C++內建巨集

5.1.2. C內建巨集

5.1.2.1. __GUNC__巨集系列

5.1.2.2. stddef.h定義的巨集

5.1.2.3. 對應於語言的控制巨集

5.1.2.4. 對應於基本型別特性的巨集

5.1.2.5. 對應於編譯器的控制巨集

5.1.2.6. 對應於目標系統的控制巨集

5.3. 由-imacros引入的巨集定義及斷言

5.3.1. 符號提取

5.3.1.1. 處理指示

5.3.1.2. 巨集呼叫

5.3.1.2.1. 函式式巨集的擴充套件—實參收集

5.3.1.2.2. 函式式巨集的擴充套件—實參替換

5.3.1.3.1. #pragma GCCdependency的控制代碼

5.3.1.4. 其它內建巨集的處理

5.5. 為PCH標頭檔案準備

5.6. 準備解析器

5.6.1. 建立主詞法分析器

5.6.1.1. 獲取預處理後符號

5.6.1.1.1. 識別符號

5.6.1.1.2. 數字

5.6.1.1.2.1. 整數

5.6.1.1.2.2. 浮點數

5.6.1.1.2.3. 字元、字串常量

5.6.1.1.3. 完成預處理符號提取

5.7. 準備延遲訪問列表

5.8. 向解析器傳入符號

5.9.1. 概觀

5.9.2. 訪問控制

5.9.2.3. 確定訪問屬性

5.9.3. 錯誤恢復

5.10. 解析器用到的輔助函式

5.12.1. 學習編譯過程的第一個例子

5.12.2. 第一條語句– NAMESPACE_DECL

5.12.3.1. 解析模板引數列表

5.12.3.1.2. 處理模板引數

5.12.3.2.1. 解析type-specifier

5.12.3.2.1.1.1. 解析class-head

5.12.3.2.1.1.1.1. 合理性檢查

5.12.3.2.1.1.1.2. 加入類SingleThreaded的標籤

5.12.3.2.1.1.2. 開始類定義

5.12.3.2.1.1.2.1. 構建對自己的引用

5.12.3.2.1.1.2.2. 為自己的引用構建TEMPLATE_DECL

5.12.3.2.1.1.2.3. 作為成員加入類域

5.12.3.2.1.1.3. 解析類體

5.12.3.2.1.1.3.1. 加入巢狀類的標籤

5.12.3.2.1.1.3.2. 為巢狀類建立TEMPLATE_DECL

5.12.3.2.1.1.3.3. 開始巢狀類定義

5.12.3.2.1.1.3.4.解析預設建構函式

5.12.3.2.1.1.3.4.1. 解析宣告符

5.12.3.2.1.1.3.4.2. 為方法構建節點                   (

5.12.3.2.1.1.3.4.3. 快取行內函數體

5.12.3.2.1.1.3.4.4. 退出方法的作用域

5.12.3.2.1.1.3.4.5. 把建構函式插入類

5.12.3.2.1.1.3.5. 解析其它建構函式

5.12.3.2.1.1.3.5.1. 解析引數

5.12.3.2.1.1.3.5.2. 為引數構建DECL節點

5.12.3.2.1.1.3.5.3. 完成

5.12.3.2.1.1.3.6. 完成解析

5.12.3.2.1.1.3.6.1. 退出巢狀類

5.12.3.2.1.1.3.6.2. 完成方法成員的解析

5.12.3.2.1.1.4.1. 找出decl-specifier-spec及declarator

5.12.3.2.1.1.4.2. 為類欄位構建節點

5.12.3.2.1.1.4.3. 加入類欄位的節點

5.12.3.2.1.2. 完成解析

5.12.3.2.1.2.1. 延遲的行內函數解析

5.12.3.2.1.2.1.1. 開始函式處理

5.12.3.2.1.2.1.1.1. 處理函式之前準備資料

5.12.3.2.1.2.1.1.2. 加入函式作用域

5.12.3.2.1.2.1.2. 解析函式體

5.12.3.2.1.2.1.2.1. 準備階段

5.12.3.2.1.2.1.2.2. 完成階段

5.12.3.2.1.2.1.3. 完成函式處理

5.12.3.2.1.2.1.4. 為產生程式碼準備

5.12.3.2.1.2.1.4.1. 更新函式呼叫圖

5.12.3.2.1.2.2. 閉合類定義

5.12.4. 第二個例子

5.12.4.1. 解析模板引數列表

5.12.4.1.1. 模板模板引數

5.12.4.1.1.1. 引數

5.12.4.1.1.2. 預設實參

5.12.4.1.1.2.1. 名字查詢的細節

5.12.4.1.1.2.1.1. 在指定域中查詢

5.12.4.1.1.2.1.1.1. 在指定名字空間中的查詢

5.12.4.1.1.2.1.1.2. 在指定類中的查詢

5.12.4.1.1.2.1.2. 在指定物件中查詢

5.12.4.1.1.2.1.3. 在當前作用域查詢

5.12.4.1.1.2.1.3.1. 轉換操作符

5.12.4.1.1.2.1.3.2. 其他名字

5.12.4.1.1.2.2. 查詢的結果

5.12.4.1.1.3. 處理模板模板引數

5.12.4.1.2. 非型別引數

5.12.4.1.2.1. 處理非型別引數

5.12.4.2.1. 評估型別的依賴性

5.12.4.2.1.1. 概述

5.12.4.2.1.2. 依賴於型別

5.12.4.2.1.3. 依賴於值

5.12.4.2.2. 類名查詢

5.12.4.2.2.1. 非template-id

5.12.4.2.2.2. template-id

5.12.4.2.2.2.1. 解析模板名

5.12.4.2.2.2.1.1. Operator-function-id

5.12.4.2.2.2.1.2. 識別符號

5.12.4.2.2.2.2. 解析實參列表

5.12.4.2.2.2.2.1. 解析實參

5.12.4.2.2.2.2.1.1.type-id的情形

5.12.4.2.2.2.2.1.2.id-expression的情形

5.12.4.2.2.2.2.1.3.assignment-expression的情形

5.12.4.2.2.3. 完成類名查詢

5.12.4.2.3. 處理基類

5.12.4.2.3.1. 解析base-clause

5.12.4.2.3.1.1. 內層template-id

5.12.4.2.3.1.1.1. 模板模板實參

5.12.4.2.3.1.1.2. 非型別實參

5.12.4.2.3.1.2. 外層template-id

5.12.4.2.3.2.1. 填充binfo

5.12.4.3. 解析class-definition

5.12.5. 第三個例子

5.12.5.1. using指示

5.12.5.2. Main() 的定義

5.12.5.2.1. 函式定義–宣告符部分

5.12.5.2.2.1. 準備函式體解析

5.12.5.2.2.2. 處理函式體

5.12.5.2.2.2.1. 模板具現

5.12.5.2.2.2.1.1. template-id

5.12.5.2.2.2.1.1. 替換第一個預設實參

5.12.5.2.2.2.1.2. 替換剩下的預設實參

5.12.5.2.2.2.1.3. 生成節點

5.12.5.2.2.2.1.2. 構建VAR_DECL

5.12.5.2.2.2.1.3.1. 具現基類 – 實參替換

5.12.5.2.2.2.1.3.2. 具現基類——完成

5.12.5.2.2.2.1.3.3. 派生類的RECORD_TYPE成員的替代

5.12.5.2.2.2.1.3.4. 派生類的RECORD_TYPE修正內聯方法

5.12.5.2.2.2.1.3.5. 派生類的RECORD_TYPE驗證基類

                          (續1)(續2

                           (

                           (續1)  (續2

                           (

5.12.5.2.2.2.1.4. 完成具現

5.12.5.2.2.2.1.5. 完成VAR_DECL

5.12.5.2.2.2.2. Return表示式

5.12.5.2.2.3. 完成函式體處理

5.12.5.2.3. 函式定義– 完成

5.13. 解析後階段

5.13.1. 預備知識—轉換的細節

5.13.1.1. 確定合適的轉換

5.13.1.1.1. 標準轉換序列

5.13.1.1.2.1. 收集候選函式

5.13.1.1.2.1.1. 新增普通函式

5.13.1.1.2.1.2. 新增模板方法

5.13.1.1.2.1.2.1. 模板實參推導 (續1)(續2

5.13.1.1.2.2. 確定最優

5.13.1.1.2.2.1. 挑選可行的候選者

5.13.1.1.2.2.2. 選出最優 (

5.13.1.1.3. 引用型別的轉換

5.13.1.1.3.1. 過載引用的解析

5.13.1.1.3.2. 對確定型別的引用

5.13.1.2. 真正的轉換

5.13.1.2.1. 擴充套件支援的不良標準轉換

5.13.1.2.2. 使用者定義轉換

5.13.1.2.2.1. 轉換隱含的this實參

5.13.1.2.2.2. 轉換其他實參

5.13.1.2.2.2.1. 普通實參

5.13.1.2.2.2.2. 預設實參

5.13.1.2.2.2.3. 省略實參

5.13.1.2.2.3. 呼叫初始化方法

5.13.1.2.3. 標準轉換

5.13.1.2.3.1.1. 從類到指標

5.13.1.2.3.1.2. 到void*或函式指標

5.13.1.2.3.1.3. 在類指標之間

5.13.1.2.3.1.4. 指向成員的指標之間

5.13.1.2.3.1.5. 從成員函式指標到其它指標型別

5.13.4. 穩定中間樹

5.13.4.1. 迭代 – 釋出vtable

5.13.4.3.1. 修整需要初始化的變數

5.13.4.3.2. 產生初始化程式碼

5.13.4.6. 迭代 – 在類中沒有初始值的靜態成員

5.13.4.7.1.1. 構建獲取函式地址的表示式 (

5.13.4.7.2完成初始化函式的呼叫.

5.13.5.1. 預備知識- 別名集分析

5.13.5.1.1. 別名集概念

5.13.5.1.2. 資料結構

5.13.5.1.3. 準備別名集

5.13.5.2.1. 記憶體分配

5.13.5.2.2. 記憶體配置

5.13.5.2.2.1. 初始值

5.13.5.2.2.1.1. 輸出引用的常量

5.13.5.2.2.1.1.1. 設定記憶體屬性

5.13.5.2.2.1.1.2. 確定輸出節

5.13.5.2.2.1.1.3. 釋出彙編程式碼

5.13.5.2.2.1.1.3.1. 全0的內容

5.13.5.2.2.1.1.3.2. 整數

5.13.5.2.2.1.1.3.3. 浮點數

5.13.5.2.2.1.1.3.4. 字串

5.13.5.2.2.1.1.3.5. 聚集類初始值

5.13.5.2.2.2. 變數

5.13.5.2.2.2.1. 釋出彙編 – 未指定初始值

5.13.5.2.2.2.2. 釋出彙編 – 指定初始值

5.13.5.3. 分析編譯單元

5.13.5.3.1. 分析函式

5.13.5.3.1.1. 構建函式呼叫圖

5.13.5.3.1.2. 分析函式能否內聯

5.13.5.3.2.1. 標記區域性函式

5.13.5.3.2.2. 確定函式能否內聯

5.13.5.3.2.2.1. 按呼叫次序排序

5.13.5.3.2.2.2. 強制內聯的函式

5.13.5.3.2.2.3. 普通的行內函數

5.13.5.3.2.3. 設定cgraph_global_info_ready

5.13.5.3.2.4.1. 標記出需要釋出彙編的函式

5.13.5.3.2.4.2. 基於cgraph展開行內函數呼叫

5.13.5.3.2.4.2.1. 找出函式體中可以內聯的呼叫

5.13.5.3.2.4.2.3. 展開行內函數體

5.13.5.3.2.4.2.3.1. 準備ret_label

5.13.5.3.2.4.2.3.2. 替換形參

5.13.5.3.2.4.2.3.3. 構建返回變數

5.13.5.3.2.4.2.3.4. 拷貝函式體

5.13.5.3.2.4.2.4. 結束語及預告