Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1076709
  • 博文数量: 104
  • 博客积分: 3715
  • 博客等级: 中校
  • 技术积分: 1868
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-30 08:38
文章分类

全部博文(104)

文章存档

2013年(1)

2012年(9)

2011年(41)

2010年(3)

2009年(3)

2008年(47)

分类:

2008-11-27 17:04:16

这个基本上就是tree.def文件的翻译,只是做得简洁了些。偶尔加入了一些辅助理解的东西。
当遇到麻烦的时候,最好的参考资料就是tree.def文件中的注释。只是那些注释都是英文的,着急的时候看起来比较麻烦,不如中文易懂。顺便也可以熟悉一下树的结构。
更加好的方式是配合一些图,实在懒得做了:)

1、DEFTREECODE (ERROR_MARK, "error_mark", tcc_exceptional, 0)
所有源代码中错误的结构都会被分析成这种节点,该类节点在后续的翻译中会被接受,以避
免对于一个错误产生多个错误消息。

2、DEFTREECODE (IDENTIFIER_NODE, "identifier_node", tcc_exceptional, 0)
用于表示一个名字,例如在decl节点中的DECL_NAME。内部来看,它类似于一个STRING_CST
节点。对于任意一个名字,有且只有一个IDENTIFIER_NODE节点。使用函数get_identifier
来获得它(第一次是创建它)

3、DEFTREECODE (TREE_LIST, "tree_list", tcc_exceptional, 0)
这些节点通过其中的TREE_CHAIN域串成链表,链表的元素保存在TREE_VALUE域中。

4、DEFTREECODE (TREE_VEC, "tree_vec", tcc_exceptional, 0)
该节点中包含tree_node组成的数组。

5、DEFTREECODE (BLOCK, "block", tcc_exceptional, 0)
表示一个符号邦定的块(类似C语言中的"{}")。所有的这些块构成一棵树,
一个块的BLOCK_SUBBLOCKS指向其子块的链表。
BLOCK_SUPERCONTEXT域指向它的父块。
     如果一个块代表的是某个函数的最外层的作用域,这个域指向该函数的FUNCTION_DECL
节点。
BLOCK_VARS指向该块中声明节点构成的链表。
BLOCK_CHAIN指向同级的下一个块
BLOCK_ABSTRACT_ORIGIN指向该块来自的那个原本的(抽象)树结点,如果该块不是任何
其他东西的实例,该指针为NULL。非空的时候,它可能指向一个快,或者一个
FUNCTION_DECL节点(例如,该块表示一个被inline函数的最外层的作用域)。
BLOCK_ABSTRACT非0表示该块是一个抽象树结点的实例(Inlined函数)。
TREE_ASM_WRITTEN非0表示该块在省城的汇编中可能会被引用。

上面这些结点是最上层的树结点,代表了整个程序的结构。
===============================================================================

每一种数据类型,都用下面的一种树结点表示:
每一个表示数据类型的节点都有一个TYPE_SIZE成员,其中包含了一个表达式树,该树表示
这种数据类型有多少个bit。
TYPE_MODE包含这种类型的数据对应的机器模式
TYPE_POINTER_TO包含指向该类型的指针类型,如果还没有构建,则包含0。
TYPE_NEXT_VARIANT用于将该类型的所有加修饰符("const" and "volatile")的变种串联起
    来。
TYPE_MAIN_VARIANT指向自己所在的“变种”链的第一个节点。
TYPE_NONCOPIED_PARTS它指向一个链表,该链表表示在赋值时,哪些部分不应该被拷贝。
     该链表中的每个元素的TREE_VALUE是一个FIELD_DECL,表示这个域不应该被拷贝。
     相应的TREE_PURPOSE是一个初始值,当一个该类型的对象通过INIT_EXPR初始化时使用
     ,空表示没有特别的初始值。如果我们确定赋值右边的对象是一个完整的对象,这些
     域也会被拷贝(而不是另一个对象的部分对象)。使用fixed_type_p来确定是否是一个
     完整的对象。
TYPE_NAME包含了该类型在程序中使用的名字(用于GDB和输出符号表)。
     它可能是一个TYPE_DECL节点(typedef),或者是一个IDENTIFIER_NODE(structs,
     unions or enums), 或者是0(一般的没有特殊名字的类型)。
TYPE_CONTEXT对于任何一个可能有名字或命名成员的类型,该域指向代表给定名字的那个域
     的节点。如果该类型具有"file scope",就指向NULL_TREE。对于大多数类型,它指向
     一个BLOCK或FUNCTION_DECL节点,但是它也可以指向一个FUNCTION_TYPE节点(这些类型
     的作用域仅限于一个函数声明的形参列表),它也可以指向一个RECORD_TYPE,
     UNION_TYPE或者QUAL_UNION_TYPE节点
     对于一般没有标签(名字)的类型,TYPE_CONTEXT不需要指向任何东西。这些类型没有
     作用域。
TREE_CHAIN用于对ENUMERAL_TYPE, RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE节点名
     字的前向引用。

6、DEFTREECODE (OFFSET_TYPE, "offset_type", tcc_type, 0)
表示一个相对于一个对象的指针,TREE_TYPE域表示该指针(偏移量)处的对象的类型。
TYPE_OFFSET_BASETYPE域表示这个偏移指针相对的基类型。

7、DEFTREECODE (ENUMERAL_TYPE, "enumeral_type", tcc_type, 0)
C的枚举类型。和整型节点很像。该类型的符号值由CONST_DECL节点定义, 但是,该类型却
不指向他们。该类型的TYPE_VALUES是一个个列表,列表的每个元素的TREE_PURPOSE
是名字,TREE_VALUE是对应的值(INTEGER_CST节点).
如果有一个`enum foo'前向引用,但是此时它还没有定义,那么这个引用在其TYPE_SIZE中
是一个0值(空指针),其类型名在TYPE_NAME域中。其他的域会在该类型定义的时候补充完整
RECORD_TYPE, UNION_TYPE, QUAL_UNION_TYPE的前向引用类似处理。

8、DEFTREECODE (BOOLEAN_TYPE, "boolean_type", tcc_type, 0)
布尔类型,类似于整型。

9、DEFTREECODE (INTEGER_TYPE, "integer_type", tcc_type, 0)
整型,包含C语言中的char类型。它也用于其他离散类型的子域。
TYPE_MIN_VALUE,TYPE_MAX_VALUE是表达式,表示整型的最大、最小值。
TYPE_PRECISION表示该类型使用多少个bit。在pascal中表示子域的时候,TREE_TYPE
指向子域类型(INTEGER_TYPE,ENUMERAL_TYPE或者BOOLEAN_TYPE)。其他时候TREE_TYPE是0

10、DEFTREECODE (REAL_TYPE, "real_type", tcc_type, 0)
浮点类型,不同的浮点类型通过TYPE_SIZE中的机器模式和TYPE_PRECISION区别。

11、DEFTREECODE (POINTER_TYPE, "pointer_type", tcc_type, 0)
指针类型,它的TREE_TYPE指向的是该指针指向的基类型。

12、DEFTREECODE (FIXED_POINT_TYPE, "fixed_point_type", tcc_type, 0)
在Embedded-c中的_Fract和_Accum类型,具体类型使用机器模式和精度区分。

13、DEFTREECODE (REFERENCE_TYPE, "reference_type", tcc_type, 0)
C++中的引用类型,和指针类似。

14、DEFTREECODE (COMPLEX_TYPE, "complex_type", tcc_type, 0)
复数类型,TREE_TYPE表示的是实部和虚部的数据类型

15、DEFTREECODE (VECTOR_TYPE, "vector_type", tcc_type, 0)
向量类型,TREE_TYPE指向该向量的元素的类型,TYPE_PRECISION表示该向量含有的元素数

16、DEFTREECODE (ARRAY_TYPE, "array_type", tcc_type, 0)
数组类型。
TREE_TYPE数组中元素的类型。
TYPE_DOMAIN数组下标的类型,它的范围表示数组的长度。
TYPE_POINTER_TO (TREE_TYPE (array_type)) 非空,总是保存着该数组类型可以强制转换
到的类型(C中)。
TYPE_STRING_FLAG标志该数组是不是一个字符串(某些语言中,字符串和字符数组是有区别
的)

17、DEFTREECODE (RECORD_TYPE, "record_type", tcc_type, 0)
结构体。
TYPE_FIELDS指向FIELD_DECL构成的链表。VAR_DECL, TYPE_DECL 和 CONST_DECLs指向相应
的链表,这些的作用域都是在这个结构体中。

18、DEFTREECODE (UNION_TYPE, "union_type", tcc_type, 0)    /* C union type */
C中的联合体,和结构体类似,只是所有成员的偏移量都是0

19、DEFTREECODE (QUAL_UNION_TYPE, "qual_union_type", tcc_type, 0)
类似于18,只是FIELD_DECL中的DECL_QUALIFIER决定了这个联合中当前有哪个成员。第一个
DECL_QUALIFIER为真的就是当前的成员。

20、DEFTREECODE (VOID_TYPE, "void_type", tcc_type, 0)
C中的void类型。

21、DEFTREECODE (FUNCTION_TYPE, "function_type", tcc_type, 0)
函数类型。
TREE_TYPE函数的返回值类型
TYPE_ARG_TYPES参数的类型列表(由TREE_LIST构成)

22、DEFTREECODE (METHOD_TYPE, "method_type", tcc_type, 0)
方法类型(C++对象的方法)
和函数类型类似,但是有一个Self隐含参数(第一个参数),并不出现在参数表中。
TYPE_METHOD_BASETYPE是Self参数的类型。TYPE_ARG_TYPES中包含Self。

23、DEFTREECODE (LANG_TYPE, "lang_type", tcc_type, 0)
语言自己指定的类型,前端必须提供操作它的方法。

===============================================================================
表达式

下面一部分是常量表达式。
24、DEFTREECODE (INTEGER_CST, "integer_cst", tcc_constant, 0)
内容包含在TREE_INT_CST_LOW和TREE_INT_CST_HIGH两个域中,每个域32位。INTEGER_CST
节点可能被共享,所以应该看成只读的。如果要设置TREE_OVERFLOW之类的标志,应该将这
个节点拷贝一份。如果一个INTEGER_CST节点已经设置了TREE_OVERFLOW或者
TREE_CONSTANT_OVERFLOW标志,我们知道它一定是唯一的。

25、DEFTREECODE (REAL_CST, "real_cst", tcc_constant, 0)
浮点常量,内容包含在TREE_REAL_CST域中

26、DEFTREECODE (FIXED_CST, "fixed_cst", tcc_constant, 0)
定点常量,内容包含在TREE_FIXED_CST

27、DEFTREECODE (COMPLEX_CST, "complex_cst", tcc_constant, 0)
复数常量,内容包含在TREE_REALPART和TREE_IMAGPART中,它们是另外一种常量。

28、DEFTREECODE (VECTOR_CST, "vector_cst", tcc_constant, 0)
向量常量,内容在TREE_VECTOR_CST_ELTS

29、DEFTREECODE (STRING_CST, "string_cst", tcc_constant, 0)
字符串常量。内容包括TREE_STRING_LENGTH和真正的字符串。

下面是声明
所有对名字的引用都表示为..._DECL形式的声明节点。在同一个邦定上下文中(BLOCK)所有
的声明节点通过TREE_CHAIN域串成链表。每一个DECL节点都有一个DECL_NAME域包含一个
IDENTIFIER_NODE(某些声明,比如标号,可能没有DECL_NAME)。DECL_CONTEXT指向这个声明
所在的作用域。对于FIELD_DECL, 它指向RECORD_TYPE, UNION_TYPE,或者 QUAL_UNION_TYPE
节点。对于VAR_DECL, PARM_DECL, FUNCTION_DECL, LABEL_DECL, 和CONST_DECL,它指向一
个包含该声明的FUNCTION_DECL,一个包含该声明的RECORD_TYPE,UNION_TYPE,或者
NULL_TREE,或者一个TRANSLATION_UNIT_DECL(该声明是文件作用域的)。
DECL_ABSTRACT_ORIGIN如果非空的话,则指向原本(抽象)的..._DECL节点(inlined or
template expanded)
TREE_TYPE保存该声明对象的数据类型。LABEL_DECL没有数据类型. 对于TYPE_DECL,
TREE_TYPE包含的是被声明的类型。
DECL_FIELD_BIT_OFFSET保存一个整数,使按照bit的偏移量。
DECL_VOFFSET保存一个表达式,表示一个变量的偏移; 它应该乘以DECL_VOFFSET_UNIT。
   上面两个域只用于FIELD_DECL和PARM_DECL.
DECL_INITIAL包含初始化一个变量或常量的初值。对于函数,它包含了函数体(一个类型为
BLOCK的节点,该节点包含了函数体),对于一个C语言中的LABEL_DECL,它表示一个标志,
非0表示已经看到了这个标号的定义。
PARM_DECL使用一个特别的域:DECL_ARG_TYPE表示实际传递的参数的类型(和声明的类型可
能不一样)。
FUNCTION_DECL使用4个特殊的域:
   DECL_ARGUMENTS保存了PARM_DECL的一个链表,表示形式参数
   DECL_RESULT保存了一个RESULT_DECL节点,表示函数的值,它有下面的域
      DECL_RTL为0表示该函数没有返回值。
      TREE_TYPE表示实际返回值的类型。这个和FUNCTION_DECL的返回类型应该一样,但是
      它也可以是一个由于整数提升而得到的更宽的整数类型。
   DECL_FUNCTION_CODE是一个编号,非0表示某个内建函数。
   DECL_SOURCE_FILE和DECL_SOURCE_LINE分别保存文件名和行号。
DECL_ABSTRACT非0表示该声明是某个抽象声明的实例。

30、几种常用声明
DEFTREECODE (FUNCTION_DECL, "function_decl", tcc_declaration, 0)
DEFTREECODE (LABEL_DECL, "label_decl", tcc_declaration, 0)
DEFTREECODE (FIELD_DECL, "field_decl", tcc_declaration, 0)
DEFTREECODE (VAR_DECL, "var_decl", tcc_declaration, 0)
DEFTREECODE (CONST_DECL, "const_decl", tcc_declaration, 0)
DEFTREECODE (PARM_DECL, "parm_decl", tcc_declaration, 0)
DEFTREECODE (TYPE_DECL, "type_decl", tcc_declaration, 0)
DEFTREECODE (RESULT_DECL, "result_decl", tcc_declaration, 0)

31、在Virtual SSA中使用的几种Memory Tag,它们表示主存的位置。
DEFTREECODE (STRUCT_FIELD_TAG, "struct_field_tag", tcc_declaration, 0)
DEFTREECODE (NAME_MEMORY_TAG, "name_memory_tag", tcc_declaration, 0)
DEFTREECODE (SYMBOL_MEMORY_TAG, "symbol_memory_tag", tcc_declaration, 0)
DEFTREECODE (MEMORY_PARTITION_TAG, "memory_partition_tag", tcc_declaration, 0)

32、DEFTREECODE (NAMESPACE_DECL, "namespace_decl", tcc_declaration, 0)
名字空间声明,它出现在其他_DECL的DECL_CONTEXT中,为名字构造一个层次结构。

33、DEFTREECODE (TRANSLATION_UNIT_DECL, "translation_unit_decl", tcc_declaration, 0)
翻译单元。这个其实不是一个声明,也不能被查找。为使用方便而引入。

下面是对主存的引用
34、DEFTREECODE (COMPONENT_REF, "component_ref", tcc_reference, 3)
值是结构体或者联合体的一个成员:
操作数 0 是结构体或者联合体;
操作数 1 是域(FIELD_DECL节点).
操作数 2 如果存在的话,是DECL_FIELD_OFFSET的值, 单位是
DECL_OFFSET_ALIGN / BITS_PER_UNIT

35、DEFTREECODE (BIT_FIELD_REF, "bit_field_ref", tcc_reference, 3)
对象中一组位的引用(位域),类似于COMPONENT_REF,只是访问的位置是显示给出的,而不
是通过一个FIELD_DECL给出。
操作数 0 是结构或者联合
操作数 1 是一个树,给出了要引用的bit的多少;
操作数 2 是一个树,给出了要引用的第一个位的位置。
位域可以是有符号的或无符号的。BIT_FIELD_REF_UNSIGNED用于标志它

36、DEFTREECODE (INDIRECT_REF, "indirect_ref", tcc_reference, 1)
间接引用操做,一个操作数,表示指针。

37、DEFTREECODE (ALIGN_INDIRECT_REF, "align_indirect_ref", tcc_reference, 1)
与上面类似,但是地址是对齐的。

38、DEFTREECODE (MISALIGNED_INDIRECT_REF, "misaligned_indirect_ref", tcc_reference, 2)
与36类似,但是同时指定了被引用地址的对齐方式。
操作数 0 被引用的地址;
操作数 1 是一个INTEGER_CST表示对齐量,或者0表示未知的对齐。

39、DEFTREECODE (ARRAY_REF, "array_ref", tcc_reference, 4)
数组引用
操作数 0 是数组
操作数 1 是一个数组下标
操作数 2 如果存在,是下标的TYPE_MIN_VALUE的一份拷贝
操作数 3 如果存在,是元素的大小。

40、DEFTREECODE (ARRAY_RANGE_REF, "array_range_ref", tcc_reference, 4)
类似上面,但是结果是数组的一个切片。

41、DEFTREECODE (OBJ_TYPE_REF, "obj_type_ref", tcc_expression, 3)
用于表示需要查找运行时类型的数据。通常是一个vtable的引用。操作数为:
OBJ_TYPE_REF_EXPR: 计算值的表达式
OBJ_TYPE_REF_OBJECT: 该对象是否就是需要以它为目标进行查找的对象?
OBJ_TYPE_REF_TOKEN: 前端指定的一些额外信息,有可能可以直接解析到DECL.

42、DEFTREECODE (EXC_PTR_EXPR, "exc_ptr_expr", tcc_expression, 0)
运行时的异常对象。

43、DEFTREECODE (FILTER_EXPR, "filter_expr", tcc_expression, 0)
运行时的filter对象。

44、DEFTREECODE (CONSTRUCTOR, "constructor", tcc_exceptional, 0)
构造器,用一系列元素构造一个聚合值。
在C中,只用于结构体和数组的初始化器。

以下的表达式中,如没有特殊说明,参数的类型必须一样,参数都是表达式。
45、DEFTREECODE (COMPOUND_EXPR, "compound_expr", tcc_expression, 2)
组合表达式,包含两个表达式,依次计算,返回第二个表达式的值。两个表达式的类型不用
一样。

46、DEFTREECODE (MODIFY_EXPR, "modify_expr", tcc_expression, 2)
赋值表达式,第一个操作数是左操作数

47、DEFTREECODE (INIT_EXPR, "init_expr", tcc_expression, 2)
初始化表达式,Op0时被初始化的,与MODIFY_EXPR不同的是,在Op1中对Op0的引用是未定义


/* For TARGET_EXPR, operand 0 is the target of an initialization,
   operand 1 is the initializer for the target, which may be void
     if simply expanding it initializes the target.
   operand 2 is the cleanup for this node, if any.
   operand 3 is the saved initializer after this node has been
   expanded once; this is so we can re-expand the tree later.  */
48、DEFTREECODE (TARGET_EXPR, "target_expr", tcc_expression, 4)
Op0时初始化的目标;Op1是初始化器(可以是void);Op2如果存在的话是该节点的清理器;
Op3在该节点扩展一次之后保存初始化器。

49、DEFTREECODE (COND_EXPR, "cond_expr", tcc_expression, 3)
条件表达式?:,Op0是条件,Op1是Then值,Op2是else值。Op0类型任意,但是Op1和Op2必须
和表达式有相同的类型,除非它们无条件地抛出异常,此时它们为VOID_TYPE

50、DEFTREECODE (VEC_COND_EXPR, "vec_cond_expr", tcc_expression, 3)
向量条件表达式。
   A = VEC_COND_EXPR ( X < Y, B, C)
表示
   for (i=0; i     A[i] = X[i] < Y[i] ? B[i] : C[i];

51、DEFTREECODE (BIND_EXPR, "bind_expr", tcc_expression, 3)
这个用在什么地方?
声明一个局部变量,包括生成RTL和分配空间。
BIND_EXPR_VARS 是VAR_DECL节点构成的链表。
BIND_EXPR_BODY 是要被计算的表达式(使用了上面的变量)。Op1的值变成BIND_EXPR的值
BIND_EXPR_BLOCK是对应于这些绑定的BLOCK
如果BIND_EXPR被扩展了,那么它的TREE_USED标志一定被设置了(对于debug有用)
BIND_EXPR不负责通知分析器关于这些变量的信息。如果BIND_EXPR来自于文件,那么创
建它的代码负责同志语法分析器关于这些变量的信息。
为了让BIND_EXPR被看见, 创建它的代码需要把它作为当前BLOCK的子BLOCK注册。

52、DEFTREECODE (CALL_EXPR, "call_expr", tcc_vl_exp, 3)
函数调用。Op0是一个INTEGER_CST,表示操作数的总数,也就是参数的数目加3;Op1是函数
;Op2是一个静态的"chain argument",或者NULL;后面的操作数是函数调用的参数。

53、DEFTREECODE (WITH_CLEANUP_EXPR, "with_cleanup_expr", tcc_expression, 1)
当进行清理动作的时候,计算一个指定的表达式。Op0就是指定的表达式。
第一次遇到CLEANUP_POINT_EXPR(这个表达式必须存在)的时候会执行清理动作。
这个和TRY_CATCH_EXPR的区别是,Op0总是会被执行。

54、DEFTREECODE (CLEANUP_POINT_EXPR, "cleanup_point_expr", tcc_expression, 1)
指定一个清理点。Op0就是可能有清理动作的表达式。如果它存在,在表达式被扩展的时候
会执行清理动作。

55、DEFTREECODE (PLACEHOLDER_EXPR, "placeholder_expr", tcc_exceptional, 0)
表示一个占位符。

56、简单的算术运算
DEFTREECODE (PLUS_EXPR, "plus_expr", tcc_binary, 2)
DEFTREECODE (MINUS_EXPR, "minus_expr", tcc_binary, 2)
DEFTREECODE (MULT_EXPR, "mult_expr", tcc_binary, 2)

57、DEFTREECODE (POINTER_PLUS_EXPR, "pointer_plus_expr", tcc_binary, 2)
指针加法,Op0是指针,Op1是整型。

58、DEFTREECODE (TRUNC_DIV_EXPR, "trunc_div_expr", tcc_binary, 2)
整数除法,向0舍入。

59、DEFTREECODE (CEIL_DIV_EXPR, "ceil_div_expr", tcc_binary, 2)
整数除法,向正无穷舍入。

60、DEFTREECODE (FLOOR_DIV_EXPR, "floor_div_expr", tcc_binary, 2)
整数除法,向负无穷舍入。

61、DEFTREECODE (ROUND_DIV_EXPR, "round_div_expr", tcc_binary, 2)
整数除法,向最近的整数舍入。

62、对应于上述四种除法的求余
DEFTREECODE (TRUNC_MOD_EXPR, "trunc_mod_expr", tcc_binary, 2)
DEFTREECODE (CEIL_MOD_EXPR, "ceil_mod_expr", tcc_binary, 2)
DEFTREECODE (FLOOR_MOD_EXPR, "floor_mod_expr", tcc_binary, 2)
DEFTREECODE (ROUND_MOD_EXPR, "round_mod_expr", tcc_binary, 2)

63、DEFTREECODE (RDIV_EXPR, "rdiv_expr", tcc_binary, 2)
浮点数除法

64、DEFTREECODE (EXACT_DIV_EXPR, "exact_div_expr", tcc_binary, 2)
这些除法应该不使用舍入机制。

65、DEFTREECODE (FIX_TRUNC_EXPR, "fix_trunc_expr", tcc_unary, 1)
截断浮点数,转换成定点数。

66、DEFTREECODE (FLOAT_EXPR, "float_expr", tcc_unary, 1)
整数转换成浮点数

67、DEFTREECODE (NEGATE_EXPR, "negate_expr", tcc_unary, 1)
一元求负

68、最大、最小值
DEFTREECODE (MIN_EXPR, "min_expr", tcc_binary, 2)
DEFTREECODE (MAX_EXPR, "max_expr", tcc_binary, 2)

69、DEFTREECODE (ABS_EXPR, "abs_expr", tcc_unary, 1)
绝对值,可以用于整型或浮点型

70、移位操作,如果第一个数是有符号的,表示算数移位,否则表示逻辑移位,第二个操作
数表示移动位数。如果第二个数大于第一个数的size,结果不定义。两个操作数类型不须一

DEFTREECODE (LSHIFT_EXPR, "lshift_expr", tcc_binary, 2)
DEFTREECODE (RSHIFT_EXPR, "rshift_expr", tcc_binary, 2)
DEFTREECODE (LROTATE_EXPR, "lrotate_expr", tcc_binary, 2)
DEFTREECODE (RROTATE_EXPR, "rrotate_expr", tcc_binary, 2)

71、位操作
DEFTREECODE (BIT_IOR_EXPR, "bit_ior_expr", tcc_binary, 2)
DEFTREECODE (BIT_XOR_EXPR, "bit_xor_expr", tcc_binary, 2)
DEFTREECODE (BIT_AND_EXPR, "bit_and_expr", tcc_binary, 2)
DEFTREECODE (BIT_NOT_EXPR, "bit_not_expr", tcc_unary, 1)

72、逻辑操作,ANDIF和ORIF是短路求值的,AND和OR不是。操作数可以是BOOLEAN_TYPE或者
INTEGER_TYPE。两种情况下,参数只能是0或者1。例如,TRUTH_NOT_EXPR不能使用一个
INTEGER_TYPE VAR_DECL作为参数,而是首先使用NE_EXPR将VAR_DECL与0比较,得到一个0或
者1,再用于TRUTH_NOT_EXPR
DEFTREECODE (TRUTH_ANDIF_EXPR, "truth_andif_expr", tcc_expression, 2)
DEFTREECODE (TRUTH_ORIF_EXPR, "truth_orif_expr", tcc_expression, 2)
DEFTREECODE (TRUTH_AND_EXPR, "truth_and_expr", tcc_expression, 2)
DEFTREECODE (TRUTH_OR_EXPR, "truth_or_expr", tcc_expression, 2)
DEFTREECODE (TRUTH_XOR_EXPR, "truth_xor_expr", tcc_expression, 2)
DEFTREECODE (TRUTH_NOT_EXPR, "truth_not_expr", tcc_expression, 1)

73、关系运算符。EQ_EXPR和NE_EXPR可以用于任意类型。其他的只能用于整型、指针、枚举
、浮点数。操作数类型必须一致。
DEFTREECODE (LT_EXPR, "lt_expr", tcc_comparison, 2)
DEFTREECODE (LE_EXPR, "le_expr", tcc_comparison, 2)
DEFTREECODE (GT_EXPR, "gt_expr", tcc_comparison, 2)
DEFTREECODE (GE_EXPR, "ge_expr", tcc_comparison, 2)
DEFTREECODE (EQ_EXPR, "eq_expr", tcc_comparison, 2)
DEFTREECODE (NE_EXPR, "ne_expr", tcc_comparison, 2)

74、浮点专用的关系运算
DEFTREECODE (UNORDERED_EXPR, "unordered_expr", tcc_comparison, 2)
DEFTREECODE (ORDERED_EXPR, "ordered_expr", tcc_comparison, 2)
DEFTREECODE (UNLT_EXPR, "unlt_expr", tcc_comparison, 2)
DEFTREECODE (UNLE_EXPR, "unle_expr", tcc_comparison, 2)
DEFTREECODE (UNGT_EXPR, "ungt_expr", tcc_comparison, 2)
DEFTREECODE (UNGE_EXPR, "unge_expr", tcc_comparison, 2)
DEFTREECODE (UNEQ_EXPR, "uneq_expr", tcc_comparison, 2)
DEFTREECODE (LTGT_EXPR, "ltgt_expr", tcc_comparison, 2)

75、DEFTREECODE (RANGE_EXPR, "range_expr", tcc_binary, 2)

76、DEFTREECODE (CONVERT_EXPR, "convert_expr", tcc_unary, 1)
表示一个类型转换,所有的显式或隐式类型转换都要用CONVERT_EXPR或者NOP_EXPR表示

77、DEFTREECODE (FIXED_CONVERT_EXPR, "fixed_convert_expr", tcc_unary, 1)
定点转换成整型、浮点或者定点,也表示从一个整型、浮点、定点转换到定点。

78、DEFTREECODE (NOP_EXPR, "nop_expr", tcc_unary, 1)
表示一个不需要生成任何代码的转换。

79、DEFTREECODE (NON_LVALUE_EXPR, "non_lvalue_expr", tcc_unary, 1)
表示一个一定不是左值的值。

80、DEFTREECODE (VIEW_CONVERT_EXPR, "view_convert_expr", tcc_reference, 1)
表示将一种类型的值当成另外一种类型使用

81、DEFTREECODE (SAVE_EXPR, "save_expr", tcc_expression, 1)
表示一个我们只需要计算一次而使用多次的值

82、DEFTREECODE (ADDR_EXPR, "addr_expr", tcc_expression, 1)
取地址表达式

83、DEFTREECODE (FDESC_EXPR, "fdesc_expr", tcc_expression, 2)

84、DEFTREECODE (COMPLEX_EXPR, "complex_expr", tcc_binary, 2)
给两个浮点数或者两个整数生成一个复数

85、DEFTREECODE (CONJ_EXPR, "conj_expr", tcc_unary, 1)
DEFTREECODE (REALPART_EXPR, "realpart_expr", tcc_reference, 1)
DEFTREECODE (IMAGPART_EXPR, "imagpart_expr", tcc_reference, 1)

86、自增、自减运算符。Op1是增量
DEFTREECODE (PREDECREMENT_EXPR, "predecrement_expr", tcc_expression, 2)
DEFTREECODE (PREINCREMENT_EXPR, "preincrement_expr", tcc_expression, 2)
DEFTREECODE (POSTDECREMENT_EXPR, "postdecrement_expr", tcc_expression, 2)
DEFTREECODE (POSTINCREMENT_EXPR, "postincrement_expr", tcc_expression, 2)

87、DEFTREECODE (VA_ARG_EXPR, "va_arg_expr", tcc_expression, 1)
用于实现可变参数'va_arg'

88、DEFTREECODE (TRY_CATCH_EXPR, "try_catch_expr", tcc_statement, 2)
计算参数Op0,当且仅当抛出异常时,执行Op2

89、DEFTREECODE (TRY_FINALLY_EXPR, "try_finally", tcc_statement, 2)
计算参数Op0,当从该表达式退出时,总是计算Op1

下面的表达式没有有用的值,它们主要用于产生副作用。

90、DEFTREECODE (DECL_EXPR, "decl_expr", tcc_statement, 1)
用于表示一个局部声明,其操作数是EXPR_DECL

91、DEFTREECODE (LABEL_EXPR, "label_expr", tcc_statement, 1)
标号定义,包装在一个语句中。Op0是LABEL_DECL,表达式类型是VOID。

92、DEFTREECODE (GOTO_EXPR, "goto_expr", tcc_statement, 1)
goto表达式,Op0时LABEL_DECL或者一个表达式

93、DEFTREECODE (RETURN_EXPR, "return_expr", tcc_statement, 1)
return表达式,计算Op0,把它从当前函数返回。Op0可以是NULL,可以认为类似一个赋值
表达式,并将返回值放到RESULT_DECL中。

94、DEFTREECODE (EXIT_EXPR, "exit_expr", tcc_statement, 1)
条件退出最内层的循环,Op0是退出条件

95、DEFTREECODE (LOOP_EXPR, "loop_expr", tcc_statement, 1)
一个循环。Op0是循环体。

96、DEFTREECODE (SWITCH_EXPR, "switch_expr", tcc_statement, 3)
Switch表达式。TREE_TYPE是条件的原始类型,没有进过类型转换,如果它是NULL,表示原
始类型和最终类型是相同的。Op0时条件,Op1是switch的体,Op2是一个TREE_VEC,包含了
所有Op1中的CASE_LABEL_EXPR。如果Op1是NULL,Op2也是NULL

97、DEFTREECODE (CASE_LABEL_EXPR, "case_label_expr", tcc_statement, 3)
用于表示一个case标号,操作数是CASE_LOW、CASE_HIGH。如果前者是NULL_TREE,该标号是
default标号,如果后者是NULL_TREE,该标号是正常标号。

98、DEFTREECODE (RESX_EXPR, "resx_expr", tcc_statement, 1)
从异常中恢复执行。

99、DEFTREECODE (ASM_EXPR, "asm_expr", tcc_statement, 4)
表示内联汇编

100、DEFTREECODE (SSA_NAME, "ssa_name", tcc_exceptional, 0)
SSA分析使用的变量引用。SSA构造器用这个实现SSA的版本

101、DEFTREECODE (PHI_NODE, "phi_node", tcc_exceptional, 0)
SSA的PHI操作符,PHI_RESULT是该节点创造的一个新的SSA_NAME,保存结构。
PHI_ARG_LENGTH表示参数的数目。

102、DEFTREECODE (CATCH_EXPR, "catch_expr", tcc_statement, 2)
例外处理代码。CATCH_TYPES是它捕获的一系列类型,CATCH_BODY是代码体

103、DEFTREECODE (EH_FILTER_EXPR, "eh_filter_expr", tcc_statement, 2)
表示一个例外的规约。EH_FILTER_TYPES是允许的类型,EH_FILTER_FAILURE是失败时计算的
一个表达式。EH_FILTER_MUST_NOT_THROW控制当扩展的时候使用的类型范围。

104、DEFTREECODE (CHANGE_DYNAMIC_TYPE_EXPR, "change_dynamic_type_expr",
         tcc_statement, 2)
表示一个主存位置动态类型的变化。它不产生任何代码。用于基于类型的别名分析。它由
C++的placement new产生。

105、DEFTREECODE (SCEV_KNOWN, "scev_known", tcc_expression, 0)
表示一个编译时可知的属性。

106、DEFTREECODE (SCEV_NOT_KNOWN, "scev_not_known", tcc_expression, 0)
表示一个编译时不可知的属性

107、DEFTREECODE (POLYNOMIAL_CHREC, "polynomial_chrec", tcc_expression, 3)
这是什么?

108、DEFTREECODE (STATEMENT_LIST, "statement_list", tcc_exceptional, 0)
用于将语句的容器串联在一起。使用迭代器访问。

109、DEFTREECODE (VALUE_HANDLE, "value_handle", tcc_exceptional, 0)
在PRE中使用的人工构造的节点,表示表达式。如果两个表达式计算出来相同的值,它们将
具有相同的VALUE_HANDLE

110、DEFTREECODE (ASSERT_EXPR, "assert_expr", tcc_expression, 2)
预测断言。由优化器产生的表达式,用于跟踪值。
   如果 X = ASSERT_EXPR , 优化器一定可以得到:
       1- X 是Y的一份拷贝.
    2- EXPR 是一个GIMPLE条件表达式,并且知道该表达式为真。

111、DEFTREECODE (TREE_BINFO, "tree_binfo", tcc_exceptional, 0)
基类信息,保存一个类是自己或其他类的基类

112、DEFTREECODE (WITH_SIZE_EXPR, "with_size_expr", tcc_expression, 2)
用于记录一个可变大小表达式的大小。Op0时真正的表达式,Op1是这个表达式的类型大小

113、DEFTREECODE (REALIGN_LOAD_EXPR, "realign_load", tcc_expression, 3)
条件选择表达式。Op0和Op1是两个向量,大小是VS。如果Op2>0,那么将Op0的最后VS-Op2个
元素连接到Op1的前Op2个元素后,如果Op2==0,返回Op1。

114、DEFTREECODE (TARGET_MEM_REF, "target_mem_ref", tcc_reference, 7)
低级的主存寻址。操作数依次是:
SYMBOL(静态或者全局变量),BASE(寄存器),INDEX(寄存器),STEP(整型常量),OFFSET(整
型常量),对应的地址是:
SYMBOL + BASE + STEP * INDEX + OFFSET
第六个参数是原本的主存访问,用于RTL的别名分析。第七个参数是一个tag,表示树级别
的别名分析。

===================
此处有一些OpenMP相关的#pragma,略过
===================

下面是规约(Reduce)操作
操作数 0 是向量,第一个元素用于保存结果。
操作数 1 是向量

115、
DEFTREECODE (REDUC_MAX_EXPR, "reduc_max_expr", tcc_unary, 1)
DEFTREECODE (REDUC_MIN_EXPR, "reduc_min_expr", tcc_unary, 1)
DEFTREECODE (REDUC_PLUS_EXPR, "reduc_plus_expr", tcc_unary, 1)

116、DEFTREECODE (DOT_PROD_EXPR, "dot_prod_expr", tcc_expression, 3)
点积。Op0和Op1类型是t1,Op2的类型大小至少是t1的两倍,操作如下:
tmp = WIDEN_MULT_EXPR(arg1, arg2);
arg3 = PLUS_EXPR (tmp, arg3);

117、DEFTREECODE (WIDEN_SUM_EXPR, "widen_sum_expr", tcc_binary, 2)
求和。Op0类型是t1,Op1的类型大小至少是t1的两倍。结构的类型与Op1一样。
  
118、DEFTREECODE (WIDEN_MULT_EXPR, "widen_mult_expr", tcc_binary, 2)
乘法。Op0和Op1类型是t1,结果的类型大小至少是t1的两倍

119、全向量的移位(按bit移动)
DEFTREECODE (VEC_LSHIFT_EXPR, "vec_lshift_expr", tcc_binary, 2)
DEFTREECODE (VEC_RSHIFT_EXPR, "vec_rshift_expr", tcc_binary, 2)

===============================================================================
GIMPLE用于自动向量化的一些树结点:

120、DEFTREECODE (GIMPLE_MODIFY_STMT, "gimple_modify_stmt", tcc_gimple_stmt, 2)
赋值表达式,Op0时目标,Op1是新值。

121、向量乘法。Op0和Op1是具有N个元素的向量,每个元素大小S。结果是N个元素的向量
,每个大小2*S。..._HI_...计算N/2个高位积,..._LO_...计算N/2个低位积
DEFTREECODE (VEC_WIDEN_MULT_HI_EXPR, "widen_mult_hi_expr", tcc_binary, 2)
DEFTREECODE (VEC_WIDEN_MULT_LO_EXPR, "widen_mult_lo_expr", tcc_binary, 2)

122、Unpack表达式。把输入向量的高半部分或低半部分解出来放到输出向量中。
输入向量的元素数目是输出向量的两倍(输入向量的元素大小是输出的一半)
DEFTREECODE (VEC_UNPACK_HI_EXPR, "vec_unpack_hi_expr", tcc_unary, 1)
DEFTREECODE (VEC_UNPACK_LO_EXPR, "vec_unpack_lo_expr", tcc_unary, 1)

123、Unpack输入向量的高半部或低半部,并且将定点值转换成浮点值放入输出向量
DEFTREECODE (VEC_UNPACK_FLOAT_HI_EXPR, "vec_unpack_float_hi_expr", tcc_unary, 1)
DEFTREECODE (VEC_UNPACK_FLOAT_LO_EXPR, "vec_unpack_float_lo_expr", tcc_unary, 1)

124、Pack两个输入向量的元素到一个输出响亮,使用截断或者饱和运算的方式。输入向量
元素的大小是输入向量的2倍。
DEFTREECODE (VEC_PACK_TRUNC_EXPR, "vec_pack_trunc_expr", tcc_binary, 2)
DEFTREECODE (VEC_PACK_SAT_EXPR, "vec_pack_sat_expr", tcc_binary, 2)

125、将两个输入向量的浮点值转化成整点,Pack到输出向量。输入向量的元素大小是输出向量的2倍。
DEFTREECODE (VEC_PACK_FIX_TRUNC_EXPR, "vec_pack_fix_trunc_expr", tcc_binary, 2)

126、从向量中提取奇数或偶数的元素
DEFTREECODE (VEC_EXTRACT_EVEN_EXPR, "vec_extracteven_expr", tcc_binary, 2)
DEFTREECODE (VEC_EXTRACT_ODD_EXPR, "vec_extractodd_expr", tcc_binary, 2)

127、交错输入向量的元素,输出结果的高部或低部。
DEFTREECODE (VEC_INTERLEAVE_HIGH_EXPR, "vec_interleavehigh_expr", tcc_binary, 2)
DEFTREECODE (VEC_INTERLEAVE_LOW_EXPR, "vec_interleavelow_expr", tcc_binary, 2)


阅读(3969) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~