Next: , Up: RTL


10.1 RTL对象类型

RTL使用五种对象:表达式、整数、宽整数、字符串和向量。其中,最重要的是表达式。RTL 表达式(简称RTX)是一个C结构体,通常用指针来引用它。这种引用它的指针的类型定义名为rtx

整数就是C中的int,书写形式使用十进制表示。宽整数是HOST_WIDE_INT类型的一个整数对象,其书写形式也用十进制表示。

字符串为一串字符,在存储器中以C的char *形式表示且按C语法规定书写。然而,RTL中的字符串决不会为空值。若机器描述中有一空字符串,它在存储器中则表示成一个空指针而不是通常意义上的指向空字符的指针。在某些上下文中,允许用这种空指针表示空字符串。在RTL代码中,字符串经常出现在symbol_ref表达式中,但也出现在某些机器描述的RTL表达式中。

在机器描述中,字符串通常是双引号表示,就和C一样。但是,机器描述中的字符串可以跨越多个行,这在C中是无效的,而且邻接的字符串常量的联接方式和C中的不一样。任何字符串常量都可以使用一对括号包裹。有些时候,这样使得机器描述读起来更容易一些。

对于字符串,还有一种特殊的语法,用于在机器描述中嵌入C代码。只要字符串可以出现的地方,都可以书写一个C风格的大括号代码块。整个大括号代码块,包括最外面的一对括号,被作为字符串常量看待。括号里面的双引号字符不是特殊字符。因此,如果你在C代码中书写字符串常量,则不需要使用反斜杠来转义每个引号字符。

向量包含任意数目的指向表达式的指针。向量中元素的个数,在向量中显式的存在。向量的书写形式为,方括号(‘[...]’),里面是元素,并使用空格分隔。长度为0的向量不会被创建;而是使用空指针来替代。

表达式根据expression codes来划分类别(也称作RTX代码)。表达式代码为在rtl.def中定义的一个名字,其也是一个(大写的)C枚举常量。合理的表达式代码以及它们的含义,是机器无关的。RTX的代码可以使用宏GET_CODE (x)来抽取,以及使用PUT_CODE (x, newcode)来修改。

表达式代码决定了表达式包含了多少个操作数,以及它们都是什么对象。在RTL中,不像Lisp,你不能通过查看一个操作数来得知它是什么对象。替代的,你必须通过它的上下文来知道——通过所包含的表达式的表达式代码。例如,在一个表达式代码为subreg的表达式中,第一个操作数被作为一个表达式,第二个操作数为一个整数。在代码为plus的表达式中,有两个操作数,都作为表达式。在symbol_ref表达式中,有一个操作数,作为一个字符串。

表达式被书写为,一对括号,包含了表达式类型的名字,它的标记和机器模式(如果存在的话),然后是表达式的操作数(通过空格分隔)。

表达式代码名,在‘md’文件中按小写形式书写,但在C代码中出现时按大写形式书写。在这个手册里,它们按照如下形式表示:const_int

在一些上下文中,表达式通常会需要一个空指针。这种书写形式为(nil)