本分析将基于gcc 1.40 源代码
预处理部分不做分析,我们将直接基于cc1源代码部分,该部分是输入c源代码,产生汇编:
该代码的入口部分在topleve.c中,main是gcc初始化部分:
在main里面,将依次执行如下的初始化:
init_tree();
init_lex();
init_rtl();
init_emit_once ();
init_decl_processing ();
init_optabs ();
这里值得分析的是:init_lex(),init_decl_processing (),
先看看init_lex()
ridpointers[(int) RID_INT] = get_identifier ("int");
ridpointers[(int) RID_CHAR] = get_identifier ("char");
ridpointers[(int) RID_SHORT] = get_identifier ("short");
主要对gcc 的内置类型int,char,short分别生成为tree_identifier类型的tree_node节点。这个节点的
相关属性为
length,id 长度,
pointer,保存为id值,比如int 就为int,char 就为char.
init_decl_processing ():
生成内置的integer_type_node,char_type_node,short_integer_type_node节点;
先生成integer_type_node:
integer_type_node:
为tree_type类型节点,节点code:INTEGER_TYPE
type::align = 1
type::size_unit = 1
type::main_variant指向自身。
type::sep_unit = 32
type::sep 指向一个 tree_int_cst 节点值,表示该类型能表示的最小值
int_cst_low = 0x80000000
int_cst_high = 0xffffffff
type::max 指向一个 tree_int_cst 节点值,表示该类型能表示的最大值
int_cst_low = 0x7fffffff
int_cst_high = 0x00000000
type::max::common::type,type::sep::common::type 均指向自身。
sizetype = integer_type_node;
然后调用layout_type设定
type::mode 设定为SImode
type::size 设定为一个 tree_int_cst 节点值:他的
int_cst_low = 4
int_cst_high = 0
type::size_unit = 8
type::align = 32
然后根据integer_type_node和ridpointers[(int) RID_INT]调用build_decl 生成一个TYPE_DECL节(tree_decl)点类型:
decl::align = 1;
decl::size_unit = 1;
decl::voffset_unit = 1;
decl::linenum = 出现在源文件中的行数
decl::filename = 文件名
decl::name = ridpointers[(int) RID_INT],注意tree_identifier节点
decl::print_name = "int"
decl::assembler_name = "int"
common::type = integer_type_node
decl::arguments = NULL
decl::initial = NULL
然后把integer_type_node 压入 current_binding_level中(调用pushdecl)
注意的是在这一个过程中,ridpointers[(int) RID_INT],注意tree_identifier节点将执行:
IDENTIFIER_GLOBAL_VALUE (name) = integer_type_node;
基于int 的tree_identifier生成 lang_identifier节点,
lang_identifier::ignore = identifier("int")
lang_identifier::global_value = integer_type_node;
后续源文件中读到int时要去取它的type就是从这儿取的。
这样current_binding_level->name 指向integer_type_node
后续以同样的步骤处理char_type_node:
生成的依然为为tree_type类型节点,节点code:INTEGER_TYPE,不同地方在于:
type::sep_unit = 8;
type::sep 指向一个 tree_int_cst 节点值,表示该类型能表示的最小值
int_cst_low = 0
int_cst_high = 0
type::max 指向一个 tree_int_cst 节点值,表示该类型能表示的最大值
int_cst_low = 255
int_cst_high = 0
type::mode 设定为 HImode
type::size 设定为一个 tree_int_cst 节点值:他的
int_cst_low = 1
int_cst_high = 0
type::size_unit = 8
type::align = 8
short_integer_type_node节点:
生成的依然为为tree_type类型节点,节点code:INTEGER_TYPE,不同地方在于:
type::sep_unit = 16;
type::sep 指向一个 tree_int_cst 节点值,表示该类型能表示的最小值
int_cst_low = 0xffff8000
int_cst_high = 0xffffffff
type::max 指向一个 tree_int_cst 节点值,表示该类型能表示的最大值
int_cst_low = 0x7fff
int_cst_high = 0
type::mode 设定为 PSImode
type::size 设定为一个 tree_int_cst 节点值:他的
int_cst_low = 2
int_cst_high = 0
type::size_unit = 16
type::align = 16