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