計算棧的大小,是通過後端介面的**來完成計算的。棧的大小,主要就是區域性變數、臨時變數、呼叫引數和返回值等使用的位元組大小,如果變數可以放到暫存器,就不需加到棧的大小裡。上面已經看了下面的**:
#044 case blockbeg:
#045
#053 break;
現在,就接著檢視ir->blockbeg介面的函式,它的**如下:
#001void blockbeg(env *e)
第2行是儲存當前使用棧的大小。 第
3行是儲存使用的暫存器。 第
4行是儲存自由的暫存器。
ir->local介面的**如下:
#001static void local(symbol p)
#011}
這個函式
local
是計算乙個符號使用棧的開始位置。 第
2行判斷是否是浮點資料型別,如果是就設定為自動儲存型別。 第
4行是查詢這個符號是否可以使用暫存器,如果不使用暫存器,就放置在棧裡,然後就新增棧的大小。 第
6行是按
4位元組對齊取整棧的開始位置。 第
8行和第
9行是儲存變數儲存在棧的開始位置。
下一節再來分析暫存器分配部分的函式。
LCC編譯器的源程式分析 12 13
語法分析是比較複雜的處理,下面再來分析乙個例子,它的 如下 typedef unsigned short wchar t typedef wchar t wint t 第一句語句在lcc裡的處理,前面已經解釋清楚,主要生成wchar t儲存符號表裡,並且記錄這個id的型別屬性。那麼第二句是怎麼樣通過...
LCC編譯器的源程式分析 18 19
lcc編譯器的源程式分析 19 全域性函式的定義 函式定義funcdefn處理裡,已經準備好呼叫引數和引數返回,接著就是呼叫全域性函式宣告來處理。如下面的 132 宣告函式。133 cfunc dclglobal sclass,id,ty,pt 134 上面的 是處理函式全域性定義。現在就去就分析d...
LCC編譯器的源程式分析 20 復合語句
在 c語言裡,有一種語句叫做復合語句。它是由 把一些語句括起來的,如下面的例子 在lcc 裡處理這樣的復合語句的函式是 compound 它在上面函式定義函式 funcdefn 是這樣呼叫的 150labels table null,labels 151stmtlabs table null,lab...