gcc研究筆記(二)cp和cpplib的介面

2022-09-01 16:51:21 字數 1589 閱讀 9302

1 呼叫介面

cp_lexer_get_preprocessor_token: // in cp/ parser.c,c++分析器

=> c_lex_with_flags

=> 標記c++關鍵字

c_lex_with_flags: // in c-lex.c,c語言詞法分析

=> cpp_get_token // in cpplib

=> 過濾掉cpp_padding型別的標記

=> 對各型別做進一步精化處理,構造tree結構

2 記憶體介面

c和c++共用乙個cpp_reader *parse_in介面(在c-common.c中定義,cp/decl2.c中有對其的外部宣告)。

c_common_init_options(在c-opts.c中實現)函式呼叫cpp_create_reader(在cpplib中實現)建立cpp_reader物件,並將結果賦給parse_in。

cpp_create_reader是乙個重要的介面函式,它用於建立cpp_reader物件和進行一些重要的初始化工作。cpp_create_reader的第二個引數為hash_table *table,它允許使用者對hash表進行自定義,如果table非空,則cpplib將使用此hash表儲存識別符號。hash_table結構存在兩個重要的域:

…hashnode (*alloc_node) (hash_table *);

void * (*alloc_subobject) (size_t);

…正是這兩個域為cpplib和c/++編譯器提供了記憶體介面。所有hash_table的操作函式將使用alloc_node為識別符號節點分配空間,cpplib則使用alloc_subobject為所有掛接在識別符號節點上的子物件(如cpp_macro)分配空間。

stringpool.c檔案中的init_stringpool函式建立了乙個hash_table結構ident_hash,並掛接了c編譯器中的記憶體分配函式alloc_node和stringpool_ggc_alloc。

alloc_node的實現如下:

static hashnode

alloc_node (hash_table *table attribute_unused)

make_node其實是乙個在tree.h中定義的巨集,它用於建立所有的樹物件,上面呼叫它建立了乙個c語言中的識別符號節點,它有兩部分構成,開頭是tree_common結構,緊跟著為ht_identifier(hashnode為指向其的指標型別)結構,gcc_ident_to_ht_ident的作用便是把make_node返回的指標加上sizeof(struct tree_common),使其指向後面的hash節點。

在c_lex_with_flags函式中,操作正好相反:

case cpp_name:

*value = ht_ident_to_gcc_ident (ht_node (tok->val.node));

上述**將cpplib中的hash節點指標轉換為c/c++編譯器中的識別符號節點指標(減去sizeof(struct tree_common)。這一轉換結果的正確性是由ident_hash中掛接的節點分配函式alloc_node保證的。

GCC學習筆記(二)

本文主要介紹gcc編譯器的主要組成部分以及gcc編譯器的命名規則。乙個abi定義了機器 如何訪問資料結構與運算程式,此處所定義的介面相當低端並且相依於硬體。而類似概念的api則在源 定義這些,則較為高階,並不直接相依於硬體,通常會是人類可閱讀的 理解abi時可以參考api。決定要不要採取既定的abi...

gcc研究筆記(一)tree是什麼

在gcc中,幾乎所有的東西都是用樹結構串起來的,從而形成抽象語法樹。tree可以看作是指向樹節點的指標,所有的樹節點都有乙個共同的基類 tree common。在檔案coretypes.h中,tree的定義如下 ifndef used for target typedef union tree no...

Linux 學習筆記 cp 和 ln

最近在重溫大學的經典課程 linux。每天工作之餘的時間,坐在家裡的陽台上,簡簡單單的紀錄一些基本的知識點,對我來說,既溫暖又難得。有朋友問我關於cp和ln建立符號鏈結 軟鏈結 和硬鏈結的一些問題,在這裡做個記錄。cp 命令 基本用法 cp source destination 該命令將source...