? ? ? ? C/C++源代碼經過 GCC 解析(Parse)及轉換后,通過 GIMPLE IR 予以表示(Representation)。其中,一個C/C++源文件,通過 宏處理后,形成一個 轉譯單元(Translation Unit),在 GCC 內部,通過下面結構予以表示:
????????Symbol Table?
? ? ? ? ? ? ? ? -- Global Variables
? ? ? ? ? ? ? ? -- Call Graph
? ? ? ? ? ? ? ? ? ? ? ? -- Functions
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -- Control Flow Graph
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -- Basic Blocks
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -- instructions
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? -- defintions and uses
? ? ? ? 上述表達,可以清楚地看到程序的控制流走向。在最末端的指令層級(Instructions),GIMPLE IR 指令 或 RTL IR 指令,一般表達為三地址模式的操作(3 - Addresses operations),即
?Op result, src0, src1
? ? ? ? 那么,對于不同的指令,抽象來看,都會有其 定義的值/變量(Definitions),以及有其 使用的值或變量(Uses),如上面的,result 為 其定義(defintion),src0, src1為其使用(use)。
? ? ? ? 在 GIMPLE IR 和 RTL IR 中,會通過 指令的編號來作為其使用(use)的引用。
? ? ? ? 那么,通過對指令的定義及使用的分析,逐步往上,擴展到 基礎塊(Basic Block),控制流圖(Control Flow Graph)等,實現程序的數據流分析(Data-Flow Analysis)。
? ? ? ? 例如,將GIMPLE IR 轉換成 SSA(Static Single Assignment)的模式,使得每個值對應唯一的變量,這樣就簡化了數據流的分析。然后,基于SSA,就可以實現 constant propagation 等優化。
? ? ? ? 又例如,Domination Tree 的構建,Live-variable 等。都是基于上述的框架,通過分析指令的定義與使用,得出數據流(Data-Flow / Value-Flow)的信息。