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

發佈了85 篇原創文章 · 獲贊 20 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章