本分析將基於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