LCC編譯器的源程式分析 48 暫存器分配

2021-06-15 22:16:34 字數 560 閱讀 8843

lcc裡是使用非常簡單的暫存器分配演算法,並且侷限於森林裡的臨時變數的分配。下面就來分析暫存器分配的**:

#001 int askregvar(symbol p, symbol regs)

#011  else if (p->temporary)

#015  else if ((r = askreg(regs, vmask)) != null)

#022  else

#026 } 第

5行判斷儲存型別是否不能為暫存器型別,如果非暫存器型別就直接跳出處理。 第

7行判斷是否列舉等型別,如果是就返回。 第

11行判斷是否臨時變數,如果是就返回。 第

15行是呼叫函式

askreg

來分配暫存器,如果分配的暫存器不為空,就在第

16行到第

20行裡儲存分配的暫存器。 第

22行到第

26行是分配暫存器不成功返回。

如果分配暫存器不成功,編譯器會把這個變數放到棧的幀裡面。下一次再分析

askreg

函式是怎麼樣分配暫存器的。

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