RTL中文版(zz)

RTL中文版(zz)

以下是本人對gcc internal的RTL的部分中文翻譯,希望給指出點錯誤,也希望大家能夠參與Machine Desc和Target Macros的翻譯



11 RTL表示
編譯器的大多數工作都是在一種稱爲寄存器傳遞語言(Register Transfer Language)的中間表示之上完成的。這種語言用來描述將被輸出的指令,幾乎是一個接一個的,通過代數形式來描述指令的功能。

RTL的靈感來自Lisp列表。它存在兩種形式:一種是內部形式,通過指向其它結構的結構來表示;另一種是文本形式,用在機器描述和打印調式輸出中,通過嵌套的圓括號來表示,以對應其在內部的結構。
11.1 RTL對象類型
RTL使用五種對象:表達式,整數,寬整數,字符串和向量。表達式是非常重要的一種對象。一個RTL表達式(簡稱爲RTX)是一個C語言中的結構類型,通常用一個指針來引用;類型爲typedef name rtx。

整數就是簡單的int,用十進制數書寫。寬整數是一種類型爲HOST_WIDE_INT的整數對象,用十進制書寫。

字符串是一系列的字符。在內部用C語言的char*方式表示,並且採用C的語法形式。不過,在RTL中字符串不能爲空。如果在機器描述中寫了一個空串,它在內部將由一個空指針表示而不是一個指向空字符的指針。在某些上下文中,這些替代字符串的空指針是有效的。在RTL代碼中,字符串通常出現在 symbol_ref表達式中,但也在其它RTL表達式的上下文中出現,用於構成機器描述。

在機器描述中,字符串通常加上雙引號,和在C中一樣。不過,在機器描述中,字符串可以分成多行寫,這在C中是非法的,並且臨近的字符串常量不會像C一樣被連接。字符串常量可以用圓括號圍住,使得機器描述便於閱讀。

字符串還有一種特殊的語法,這在當機器描述中嵌入C代碼時很有用。在出現字符串的任何地方都可以加上C風格的大括號塊。整個大括號塊,包括最外層的一對括號,被看作字符串常量。大括號裏面的雙引號不作爲特殊的字符。因此,如果用C代碼寫字符串常量時,不需要通過反斜槓對雙引號進行轉義操作。

向量包含多個指向表達式的指針。向量中的元素個數被顯式的表現。向量的書寫方式爲用方括號包裹着元素,通過空格順序隔開。長度爲零的向量不會被生成,而使用空指針來代替。

表達式按表達式代碼(也稱作RTX碼)分類。表達式代碼的名字在rtl.def中定義爲一個C的枚舉常量(大寫字母)。表達式代碼及它的含義是機器獨立的。RTX碼可以通過宏GET_CODE(x)獲取,通過宏PUT_CODE(x, newcode)修改。

表達式代碼決定了表達式包含多少操作數,以及操作數是哪種對象。和LISP不一樣的是,在RTL中,無法通過操作數來得知它屬於哪種對象。必須通過它的上下文--包含表達式的表達式代碼得知。例如,在代碼subreg的表達式中,第一個操作數被作爲一個表達式,第二個數被作爲一個整數。在代碼plus的表達式中有兩個操作數,都被作爲表達式。在symbol_ref表達式中有一個操作數,被作爲字符串。

表達式的書寫方式爲一對圓括號加上表達式的類型名字,標誌和機器模式,然後是表達式的操作數(用空格分隔)。

表達式代碼的名字在md文件中用小寫表示,在C代碼中用大寫表示。在本參考手冊中,它們用下面的方式表示:const_int。

在一些上下文中,表達式通常會需要一個空指針,書寫方式爲nil。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章