LCC編譯器的源程式分析 47 計算需要使用棧大小

2021-08-22 09:28:48 字數 625 閱讀 7275

計算棧的大小,是通過後端介面的**來完成計算的。棧的大小,主要就是區域性變數、臨時變數、呼叫引數和返回值等使用的位元組大小,如果變數可以放到暫存器,就不需加到棧的大小裡。上面已經看了下面的**:

#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...