关于 GCC 里的tree结构,该怎么解决

关于 GCC 里的tree结构uniontree_nodeGTY((ptr_alias(unionlang_tree_node),desc( tree_node_structure(&

关于 GCC 里的tree结构
union   tree_node   GTY   ((ptr_alias   (union   lang_tree_node),
            desc   ( "tree_node_structure   (&%h) ")))
{
    struct   tree_common   GTY   ((tag   ( "TS_COMMON ")))   common;
    struct   tree_int_cst   GTY   ((tag   ( "TS_INT_CST ")))   int_cst;
    struct   tree_real_cst   GTY   ((tag   ( "TS_REAL_CST ")))   real_cst;
    struct   tree_vector   GTY   ((tag   ( "TS_VECTOR ")))   vector;
    struct   tree_string   GTY   ((tag   ( "TS_STRING ")))   string;
    struct   tree_complex   GTY   ((tag   ( "TS_COMPLEX ")))   complex;
    struct   tree_identifier   GTY   ((tag   ( "TS_IDENTIFIER ")))   identifier;
    struct   tree_decl_minimal   GTY((tag   ( "TS_DECL_MINIMAL ")))   decl_minimal;
    struct   tree_decl_common   GTY   ((tag   ( "TS_DECL_COMMON ")))   decl_common;
    struct   tree_decl_with_rtl   GTY   ((tag   ( "TS_DECL_WRTL ")))   decl_with_rtl;
    struct   tree_decl_non_common     GTY   ((tag   ( "TS_DECL_NON_COMMON ")))   decl_non_common;
    struct   tree_parm_decl     GTY     ((tag   ( "TS_PARM_DECL ")))   parm_decl;
    struct   tree_decl_with_vis   GTY   ((tag   ( "TS_DECL_WITH_VIS ")))   decl_with_vis;
    struct   tree_var_decl   GTY   ((tag   ( "TS_VAR_DECL ")))   var_decl;
    struct   tree_field_decl   GTY   ((tag   ( "TS_FIELD_DECL ")))   field_decl;
    struct   tree_label_decl   GTY   ((tag   ( "TS_LABEL_DECL ")))   label_decl;
    struct   tree_result_decl   GTY   ((tag   ( "TS_RESULT_DECL ")))   result_decl;
    struct   tree_const_decl   GTY   ((tag   ( "TS_CONST_DECL ")))   const_decl;
    struct   tree_type_decl   GTY   ((tag   ( "TS_TYPE_DECL ")))   type_decl;
    struct   tree_function_decl   GTY   ((tag   ( "TS_FUNCTION_DECL ")))   function_decl;
    struct   tree_type   GTY   ((tag   ( "TS_TYPE ")))   type;
    struct   tree_list   GTY   ((tag   ( "TS_LIST ")))   list;
    struct   tree_vec   GTY   ((tag   ( "TS_VEC ")))   vec;
    struct   tree_exp   GTY   ((tag   ( "TS_EXP ")))   exp;
    struct   tree_ssa_name   GTY   ((tag   ( "TS_SSA_NAME ")))   ssa_name;
    struct   tree_phi_node   GTY   ((tag   ( "TS_PHI_NODE ")))   phi;
    struct   tree_block   GTY   ((tag   ( "TS_BLOCK ")))   block;
    struct   tree_binfo   GTY   ((tag   ( "TS_BINFO ")))   binfo;
    struct   tree_statement_list   GTY   ((tag   ( "TS_STATEMENT_LIST ")))   stmt_list;
    struct   tree_value_handle   GTY   ((tag   ( "TS_VALUE_HANDLE ")))   value_handle;


    struct   tree_constructor   GTY   ((tag   ( "TS_CONSTRUCTOR ")))   constructor;
};

这个是GCC里tree的一个大概结构图,不知道有没有前辈做个类似的分析研究.
能不能说说这个结构中各个variable的大概的作用.


[解决办法]
恕我孤陋寡闻阿,这是个什么东西啊,没见过:(
[解决办法]
lz是不是在阅读GCC的源码?
[解决办法]
不太清楚,我也想知道,帮你顶顶吧。
[解决办法]
吐血中~~

[解决办法]
lz牛啊, 给你找到一点资料:http://www.cs.wustl.edu/~mdeters/seminar/fall2005/notes0926.html

这个tree_node 是 gcc用来表示他的读进来的code的。

其中, GTY (( )) 是用来给GCC 's own internal garbage collector 提供信息的, 所以你可以不看他。

tree_node()其实是一个 union of structs。这里面, 最常用的是struct tree_common。他之后的每个一 struct里面有struct tree_common这个struct在里面。 struct tree_common他是这样的:
struct tree_common GTY(())
{
tree chain;
tree type;
union tree_ann_d *ann;

ENUM_BITFIELD(tree_code) code : 8;

unsigned side_effects_flag : 1;
unsigned constant_flag : 1;
unsigned addressable_flag : 1;
unsigned volatile_flag : 1;
unsigned readonly_flag : 1;
unsigned unsigned_flag : 1;
unsigned asm_written_flag: 1;
unsigned nowarning_flag : 1;

unsigned used_flag : 1;
unsigned nothrow_flag : 1;
unsigned static_flag : 1;
unsigned public_flag : 1;
unsigned private_flag : 1;
unsigned protected_flag : 1;
unsigned deprecated_flag : 1;
unsigned invariant_flag : 1;

unsigned lang_flag_0 : 1;
unsigned lang_flag_1 : 1;
unsigned lang_flag_2 : 1;
unsigned lang_flag_3 : 1;
unsigned lang_flag_4 : 1;
unsigned lang_flag_5 : 1;
unsigned lang_flag_6 : 1;
unsigned visited : 1;
};

在这struct里面,最重要的东西是chain, type, and code. 这里面code 最重要, 他告诉你是啥code 类型, 所以你找到对应的在tree_node struct 里面。

具体的细节你自己找书看了。 


[解决办法]
http://www-128.ibm.com/developerworks/cn/linux/l-gcc/part1/
[解决办法]
原来楼主是在阅读gcc源代码阿!
那你最好先把编译原理学习好,否则是绝对看不懂的。
[解决办法]
恩,既然这样,楼主就继续看吧,不过难度很大的,因为gcc太大了,不太容易吃透的。。。
[解决办法]
C、C++的编译器是差不多最复杂的,因为C、C++语法不满足BNF描述。如果研究编译原理,最好换个简单点的语言的编译器。
[解决办法]
C、C++的编译器是差不多最复杂的,因为C、C++语法不满足BNF描述。如果研究编译原理,最好换个简单点的语言的编译器。
------------------------------
C++之父教导我们说不要用lex,yacc