gcc 源码分析1

本分析将基于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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值