您的位置:首页 > 其它

gcc 源码分析1

2013-03-15 18:42 141 查看
本分析将基于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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: