Chinaunix

标题: RTL(gcc Register Transfer Language )中文版(zz) [打印本页]

作者: Send_linux    时间: 2007-03-06 15:35
标题: RTL(gcc Register Transfer Language )中文版(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。

[ 本帖最后由 cjaizss 于 2008-6-1 11:57 编辑 ]
作者: 周杰伦    时间: 2008-01-14 22:02
容易误解的是RTL是in mem IR,而不是in file IR。
GCC是紧凑结构的静态编译器,RTL对于移植来讲最直接,但是 树 也同样重要,RTL和树 是同时存在的,共同构成CFG来进行优化,尤其现在GCC4还有了GIMPLE。
作者: cjaizss    时间: 2008-01-15 12:55
挺好,但是建议可否把标题中的RTL用Register Transfer Language 解释一下,因为单个RTL容易被误解,特别在这个版面,hoho
作者: 没谱的曲    时间: 2008-01-20 16:21
学习了,谢谢分享。。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2