日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

GCC-3.4.6源代码学习笔记

發(fā)布時(shí)間:2023/12/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GCC-3.4.6源代码学习笔记 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大約4年前,我加入了GDNT - 北電網(wǎng)絡(luò)在中國(guó)的合資企業(yè),參與3G UMTS無(wú)線接入網(wǎng)的研發(fā)工作。與GCC有了第一次親密的接觸(之前使用的是MS的VC)。彼時(shí),北電在其諸如,UMTS、CDMA、及自行開發(fā)的眾多工具等項(xiàng)目中(此后,在4G項(xiàng)目,Wimax及Lte中),將GCC作為標(biāo)準(zhǔn)編譯器來(lái)使用。每周我都需要進(jìn)行數(shù)次的loadbuild,編譯出load文件進(jìn)行測(cè)試,以驗(yàn)證我對(duì)一些bug的修正代碼。每次loadbuild,編譯的文件數(shù)以千計(jì),最后的執(zhí)行文件可至百兆的尺寸。而GCC的運(yùn)行令人驚異地穩(wěn)定。這些年來(lái),我只碰到過(guò)2次GCC的崩潰,其中一次還是因?yàn)槲覟榱诉_(dá)到模板分離編譯(separate compilation of template)的效果(GCC至今未支持這一特性。據(jù)我所知,目前只有EDG的前端能做到。而且在C++標(biāo)準(zhǔn)穩(wěn)定下來(lái)之前【ISO-IEC - 14882-1998】,EDG的前端是實(shí)際的標(biāo)準(zhǔn)。在http://www.edg.com/可以找到有關(guān)EDG的情況),使用了奇怪的代碼(含有錯(cuò)誤的C++代碼),而導(dǎo)致生成錯(cuò)誤的中間樹代碼(很遺憾,GCC未能檢出語(yǔ)法錯(cuò)誤)。從而觸發(fā)了GCC內(nèi)部的斷言。因此GCC雖然退出,但給出了詳細(xì)的錯(cuò)誤轉(zhuǎn)儲(chǔ)。還算退出得比較體面。

這個(gè)神奇的工具令人稱奇!雖然以前我也學(xué)過(guò)編譯原理,但是面對(duì)GCC,我覺(jué)得對(duì)它知之甚少。多虧GCC是開源的,使我得以窺探其神秘面紗后的容顏。這些年,雖然自覺(jué)對(duì)GCC已有相當(dāng)?shù)牧私?#xff0c;但遠(yuǎn)還未到究竟。借此博客,我將和大家分享這些年來(lái)學(xué)習(xí)GCC的筆記(所關(guān)注的GCC為:3.4.6版,C++前端,運(yùn)行平臺(tái):x86/Linux,目標(biāo)機(jī)器:x86/Linux)。而這個(gè)筆記還在增長(zhǎng)中,還遠(yuǎn)未結(jié)束。

參考文獻(xiàn)

[1] Programming language pragmatics, 2nd edition

[2] gccint, version 3.4.6

[3] ISO-IEC-14882-2003

[4] The C Preprocessor April 2001, for GCC V3

[5] cppinternals

[6] Using the GNU Compiler Collection

[7] Inside The C++ Object Model, by Stanley B.Lippman

[8] GCC Complete Reference

[9] The design and evolution of C++, by Bjarne Stroustrup

[10] Linkers & Loaders, by John R. Levine

[11] Efficient Instruction Scheduling Using Finite State Automata, by Vasanth Bala, Norman Rubin

[12] Compilers: Principles, Techniques, and Tools, 2nd edition

其中,[2]和[5]保存在目錄“YOUR-GCC-SOURCE-DIR/gcc/doc”下。[1],[7],[9],[10]和[12]給出了一些有用的背景知識(shí)。

準(zhǔn)備工作

一些重要的GCC源碼是由GCC自帶工具生成的。在深入看代碼前,我們首先需要編譯GCC,生成這些源碼。至于如何下載源代碼(http://gcc.gnu.org/mirrors.html是官方的下載地址),編譯前配置及編譯,網(wǎng)上有豐富的資料,在此略過(guò)(注:如果已經(jīng)裝有GCC,使用g++ -###可查看GCC的配置命令)。

GCC的架構(gòu)

GCC可簡(jiǎn)單地分為2部分:前端和后端。預(yù)處理器(如果存在)、詞法分析器和語(yǔ)法分析器在前端實(shí)現(xiàn),前端的作用是將源語(yǔ)言寫的程序轉(zhuǎn)換成與語(yǔ)言無(wú)關(guān)的中間形式。因此,理論上,引入對(duì)新語(yǔ)言的支持,只需要實(shí)現(xiàn)預(yù)處理器、詞法分析器和語(yǔ)法分析器。但實(shí)際上,一般的我們還需要寫一些代碼以確立運(yùn)行時(shí)環(huán)境。

在GCC 3.4.6,這個(gè)通用的中間語(yǔ)言是RTL(register transfer language)。RTL是一種簡(jiǎn)單的語(yǔ)言,很容易就能翻譯成匯編代碼。因此,直接將源語(yǔ)言轉(zhuǎn)換為RTL,不太合適。事實(shí)上,前端首先會(huì)將代碼轉(zhuǎn)換成中間樹并進(jìn)行大量的處理,然后再進(jìn)一步變換為RTL,并送入后端。

后端的作用則是生成匯編代碼。作為廣泛使用的編譯器,GCC可以支持各種流行的平臺(tái)。為了實(shí)現(xiàn)這個(gè)目的,GCC采用了機(jī)器描述文件,對(duì)目標(biāo)機(jī)器的指令集、流水線結(jié)構(gòu)、甚至架構(gòu)本身帶來(lái)的優(yōu)化機(jī)會(huì)進(jìn)行描述。對(duì)于目標(biāo)機(jī)器(配置GCC時(shí)需指定),這些描述文件將被多個(gè)工具處理,生成相應(yīng)的源代碼,然后用于編譯GCC。因此,引入新機(jī)器的主要工作,在于提供機(jī)器描述文件(一般而言還需要定義一些處理函數(shù)提供必要的處理邏輯)。

在以下地址,http://www.ibm.com/developerworks/cn/linux/l-gcc4/?ca=dwcn-newsletter-linux,可以找到關(guān)于GCC較新版本的信息。

前端

當(dāng)我們調(diào)用 ”gcc –o xxx xxx.c” 時(shí),事實(shí)上我們的請(qǐng)求會(huì)轉(zhuǎn)交給一個(gè)shell,這個(gè)shell會(huì)解析這個(gè)調(diào)用命令,并根據(jù)它所能認(rèn)識(shí)的命令行選項(xiàng),在所運(yùn)行的平臺(tái)上進(jìn)行相應(yīng)的準(zhǔn)備。然后根據(jù)源文件的后綴,調(diào)用相匹配的編譯器,并將其不能識(shí)別的命令行選項(xiàng)一并傳入。這里我們不關(guān)心這個(gè)shell,我們專注于真正的編譯器。

1.????? 概覽

前端讀入源程序進(jìn)行語(yǔ)法分析,然后將其轉(zhuǎn)換為語(yǔ)言無(wú)關(guān)形式。理論上,每個(gè)前端可以使用獨(dú)特的形式。不過(guò)在GCC中,為了盡可能地重用代碼,不同前端生成的中間樹都使用同一組樹節(jié)點(diǎn)。顯然,這組節(jié)點(diǎn)需要足夠的多樣性以滿足不同語(yǔ)言的要求。這組樹節(jié)點(diǎn)對(duì)于C/C++前端的意義非同尋常,我們首先需要對(duì)其著手。

1.1. 前端中樹的表達(dá)形式

為了支持已經(jīng)存在及以后將會(huì)加入的前端,GCC定義了數(shù)十種的樹節(jié)點(diǎn)(不是所有節(jié)點(diǎn)都能作為葉子節(jié)點(diǎn))。所有的節(jié)點(diǎn),在其結(jié)構(gòu)體定義中,以下面的結(jié)構(gòu)作為第一個(gè)成員。

?

129? struct tree_common GTY(())??????????????????????????????????????????????????????????????? ????????????? in tree.h

130? {

131? ? tree chain;

132? ? tree type;

133?

134? ? ENUM_BITFIELD(tree_code) code : 8;

135?

136? ? unsigned side_effects_flag : 1;

137? ? unsigned constant_flag : 1;

138? ? unsigned addressable_flag : 1;

139? ? unsigned volatile_flag : 1;

140? ? unsigned readonly_flag : 1;

141? ? unsigned unsigned_flag : 1;

142? ? unsigned asm_written_flag: 1;

143? ? unsigned unused_0 : 1;

144?

145? ? unsigned used_flag : 1;

146? ? unsigned nothrow_flag : 1;

147? ? unsigned static_flag : 1;

148? ? unsigned public_flag : 1;

149? ? unsigned private_flag : 1;

150? ? unsigned protected_flag : 1;

151? ? unsigned deprecated_flag : 1;

152? ? unsigned unused_1 : 1;

153?

154? ? unsigned lang_flag_0 : 1;

155? ? unsigned lang_flag_1 : 1;

156? ? unsigned lang_flag_2 : 1;

157? ? unsigned lang_flag_3 : 1;

158? ? unsigned lang_flag_4 : 1;

159? ? unsigned lang_flag_5 : 1;

160? ? unsigned lang_flag_6 : 1;

161? ? unsigned unused_2 : 1;

162? };

?

上面,在134行,在3.4.6版,ENUM_BITFIELD將被擴(kuò)展為”__extension__ enum”, 131行的chain,如果需要,能將該節(jié)點(diǎn)鏈入樹。

下面給出了,結(jié)構(gòu)體中部分的標(biāo)識(shí)域的含義,及訪問(wèn)它們的宏定義(紅字部分)。

????????? TREE_TYPE ((NODE)->common.type)

用于所有表示表達(dá)式的節(jié)點(diǎn),代表該表達(dá)式的數(shù)據(jù)類型。

2??????? 在POINTER_TYPE節(jié)點(diǎn)中,代表該指針指向的類型。

2??????? 在ARRAY_TYPE節(jié)點(diǎn)中,代表數(shù)組元素的類型。

2??????? 在VECTOR_TYPE節(jié)點(diǎn)中,代表vector元素的類型(某些芯片的寄存器足夠大,足以存放多個(gè)標(biāo)量,這一組標(biāo)量稱為vector類型)。

????????? TREE_ADDRESSABLE((NODE)->common.addressable_flag)

2??????? 在VAR_DECL節(jié)點(diǎn)中,非零值表示該節(jié)點(diǎn)代表的變量的地址,在程序的其他地方被使用,不能產(chǎn)生將該變量置入寄存器的代碼。

2??????? 在FUNCTION_DECL節(jié)點(diǎn)中,非零值表示該節(jié)點(diǎn)代表的函數(shù)的地址,在程序的其他地方被使用。該函數(shù)必須被編譯出來(lái)即便它是內(nèi)聯(lián)函數(shù)(在被調(diào)用的地方,內(nèi)聯(lián)函數(shù)被展開為函數(shù)體,故不需要單獨(dú)編譯出來(lái))。

2??????? 在FIELD_DECL節(jié)點(diǎn)中,非零值表示該節(jié)點(diǎn)代表的成員的地址允許被程序員設(shè)定。彼時(shí),該標(biāo)識(shí)用于別名識(shí)別:參見函數(shù)record_component_aliases。

2??????? 在CONSTRUCTOR節(jié)點(diǎn)中,非零值表示該構(gòu)造函數(shù)必須在內(nèi)存中創(chuàng)建對(duì)象(而不是在寄存器中)。

2??????? 在LABEL_DECL節(jié)點(diǎn)中,非零值表示一條目標(biāo)為該lable的goto語(yǔ)句,出現(xiàn)在所有執(zhí)行跳轉(zhuǎn)到該label的goto語(yǔ)句,需要恢復(fù)棧的綁定域外。

2??????? 在所有*_TYPE節(jié)點(diǎn)中,非零值表示該類型的所有對(duì)象必須是完全取址的。這意味著,例如:這些對(duì)象任何一部分都不能放入寄存器中。

2??????? 在IDENTIFIER_NODE節(jié)點(diǎn)中,非零值表示某些同名的外部聲明的地址已被引用。這關(guān)系到內(nèi)聯(lián)函數(shù)。

????????? TREE_STATIC ((NODE)->common.static_flag)

2??????? 在VAR_DECL節(jié)點(diǎn)中,非零值表示該變量為靜態(tài)類型。

2??????? 在FUNCTION_DECL節(jié)點(diǎn)中,非零值表示該函數(shù)已被定義。

2??????? In a CONSTRUCTOR, nonzero means allocate static storage.

????????? TREE_VIA_VIRTUAL ((NODE)->common.static_flag)

2??????? 在TREE_LIST或TREE_VEC節(jié)點(diǎn)中,非零值表示所對(duì)應(yīng)的類,其派生關(guān)系為虛繼承(virtual)。

????????? TREE_CONSTANT_OVERFLOW ((NODE)->common.static_flag)

2??????? 在INTEGER_CST,REAL_CST,COMPLEX_CST或 VECTOR_CST節(jié)點(diǎn)中,非零值表示在常量折疊中發(fā)生溢出。它與TREE_OVERFLOW的區(qū)別在于,如果常量表達(dá)式發(fā)生溢出,ANSI C要求給出診斷信息。

????????? TREE_SYMBOL_REFERENCED

(IDENTIFIER_NODE_CHECK (NODE)->common.static_flag)

2??????? 在IDENTIFIER_NODE節(jié)點(diǎn)中,非零值表示該字串作為參數(shù)調(diào)用了函數(shù)assemble_name。

????????? CLEANUP_EH_ONLY ((NODE)->common.static_flag)

2??????? 在TARGET_EXPR,WITH_CLEANUP_EXPR,CLEANUP_STMT節(jié)點(diǎn),或塊(block)的清理(cleanup)鏈的節(jié)點(diǎn)中,非零值表示相關(guān)的清理只在異常拋出時(shí)執(zhí)行,而在正常退出時(shí)不需要執(zhí)行。

????????? TREE_OVERFLOW ((NODE)->common.public_flag)

2??????? 在INTEGER_CST,REAL_CST,COMPLEX_CST或VECTOR_CST節(jié)點(diǎn)中,非零值表示在常量折疊中發(fā)生溢出,并且這部分的警告還沒(méi)有發(fā)出。TREE_OVERFLOW同時(shí)意味著TREE_CONSTANT_OVERFLOW,但反之不成立。

????????? TREE_PUBLIC((NODE)->common.public_flag)

2??????? 在VAR_DECL或FUNCTION_DECL節(jié)點(diǎn)中,非零值表示該名字可從模塊(module)外訪問(wèn)。在IDENTIFIER_NODE節(jié)點(diǎn)中,非零值表示在域內(nèi)(inner scope),已有該名字所代表的,能從模塊(module)外訪問(wèn)的,外部鏈接性的聲明(external declaration)。

????????? TREE_PRIVATE ((NODE)->common.private_flag)

2??????? 在C++里,在類中使用。

????????? CALL_EXPR_HAS_RETURN_SLOT_ADDR ((NODE)->common.private_flag)

2??????? 在CALL_EXPR節(jié)點(diǎn)中,非零值表示返回值的地址是參數(shù)鏈的一部分。

????????? TREE_PROTECTED ((NODE)->common.protected_flag)

2??????? 在C++中用于類。在BLOCK節(jié)點(diǎn)中,這是個(gè)BLOCK_HANDLER_BLOCK節(jié)點(diǎn)。

????????? CALL_FROM_THUNK_P ((NODE)->common.protected_flag)

2??????? 在CALL_EXPR節(jié)點(diǎn)中,非零值表示該函數(shù)調(diào)用是從thunk到thunk目標(biāo)函數(shù)的跳轉(zhuǎn)。

????????? TREE_SIDE_EFFECTS ((NODE)->common.side_effects_flag)

2??????? 在所有的表達(dá)式中,非零值表示該表達(dá)式含有副作用(side effects)或者對(duì)其每次求值(reevaluation of the whole expression)將產(chǎn)生不同的值。如果其子表達(dá)式是一個(gè)函數(shù)調(diào)用、對(duì)一個(gè)volatile變量的引用或含有副作用,這個(gè)標(biāo)識(shí)符將被設(shè)置。

2??????? In a *_DECL, this is set only if the declaration said `volatile'.

????????? TREE_THIS_VOLATILE ((NODE)->common.volatile_flag)

2??????? 非零值表示該表達(dá)式在C的含義下(in the C sense)是volatile:它的地址應(yīng)該是類型`volatile WHATEVER *'。換而言之,所聲明的項(xiàng)(item)是volatile修飾的(volatile qualified)。該標(biāo)識(shí)符用于*_DECL和*_REF節(jié)點(diǎn)中。

2??????? 在*_TYPE節(jié)點(diǎn)中,非零值表示其對(duì)應(yīng)的類型為volatile修飾的(volatile-qualified)。不過(guò)如果節(jié)點(diǎn)代表一個(gè)類型,應(yīng)該使用TYPE_VOLATILE而不是這個(gè)宏。因?yàn)?#xff0c;以后這2個(gè)宏會(huì)訪問(wèn)不同的位(現(xiàn)在是相同的,見下一條)。如果這個(gè)位被設(shè)上,TREE_SIDE_EFFECTS也應(yīng)該同時(shí)被設(shè)上。

????????? TYPE_VOLATILE (TYPE_CHECK (NODE)->common.volatile_flag)

2??????? 非零值表示該類型作為整體是volatile的。

????????? TREE_READONLY ((NODE)->common.readonly_flag)

2??????? 在VAR_DECL,PARM_DECL或者FIELD_DECL,或者所有*_REF類型節(jié)點(diǎn)中,非零值表示它不能作為左值(the lhs of an assignment)。

2??????? 在*_TYPE節(jié)點(diǎn)中,非零值表示其對(duì)應(yīng)的類型為常量(const-qualified)類型(但是如果節(jié)點(diǎn)表示類型則應(yīng)該使用宏TYPE_READONLY)。

????????? TYPE_READONLY (TYPE_CHECK (NODE)->common.readonly_flag)

2??????? 非零值表示該節(jié)點(diǎn)代表的類型為常量類型。

????????? TREE_CONSTANT ((NODE)->common.constant_flag)

2??????? 非零值表示表達(dá)式的值為常量。在所有的*_CST節(jié)點(diǎn)中設(shè)置。也可能出現(xiàn)在數(shù)學(xué)表達(dá)式中,ADDR_EXPR或者CONSTRUCTOR節(jié)點(diǎn)中,如果它們的值為常量。

????????? TREE_UNSIGNED ((NODE)->common.unsigned_flag)

2??????? 在INTEGER_TYPE或者ENUMERAL_TYPE節(jié)點(diǎn)中,非零值表示其對(duì)應(yīng)類型為無(wú)符號(hào)類型。在FIELD_DECL節(jié)點(diǎn)中,則表示為無(wú)符號(hào)域(unsigned bit field)。

????????? TREE_ASM_WRITTEN ((NODE)->common.asm_written_flag)

2??????? 在VAR_DECL節(jié)點(diǎn)中表示匯編代碼也被寫入。

2??????? 在FUNCTION_DECL節(jié)點(diǎn)中表示該函數(shù)已被編譯。在內(nèi)聯(lián)函數(shù)中,這個(gè)位很有意義,因?yàn)閮?nèi)聯(lián)函數(shù)可能不需要獨(dú)立編譯(作為函數(shù))。

2??????? 在RECORD_TYPE,UNION_TYPE,QUAL_UNION_TYPE或者ENUMERAL_TYPE節(jié)點(diǎn)中,表示有關(guān)類型的sdb調(diào)試信息已經(jīng)寫入。

2??????? 在BLOCK節(jié)點(diǎn)中,非零值表示在這個(gè)分段(block)內(nèi),reorder_block節(jié)點(diǎn)已發(fā)現(xiàn)。

????????? TREE_USED ((NODE)->common.used_flag)

2??????? 在*_DECL節(jié)點(diǎn)中表示,在其作用域中,相應(yīng)的名字被引用(is used in its scope)。

2??????? 在表達(dá)式節(jié)點(diǎn)中,表示如果其值未被使用,不發(fā)出警告。

2??????? 在IDENTIFIER_NODE節(jié)點(diǎn)中,表示同名的外部聲明已被引用(was used)。

????????? TREE_NOTHROW ((NODE)->common.nothrow_flag)

2??????? 在FUNCTION_DECL節(jié)點(diǎn)中,表示該函數(shù)不會(huì)拋出異常。在CALL_EXPR節(jié)點(diǎn)中,則表示該次調(diào)用不會(huì)拋出異常。

????????? TYPE_ALIGN_OK (TYPE_CHECK (NODE)->common.nothrow_flag)

2??????? 用在表示類型的節(jié)點(diǎn)中,非零值表示所有該類型的對(duì)象由語(yǔ)言或前端保證,被正確地對(duì)齊。因此,我們可以得知該類型的MEM節(jié)點(diǎn)(RTL節(jié)點(diǎn))的對(duì)齊量不少于該類型的對(duì)齊量,盡管它可能看起來(lái)不是這樣。在面向?qū)ο笳Z(yǔ)言中,這種情況發(fā)生在一個(gè)要求更多對(duì)齊量量的變種類型的對(duì)象上(in object-oriented languages where a tag field may show this is an object of a more-aligned variant of the more generic type)。

????????? TREE_DEPRECATED ((NODE)->common.deprecated_flag)

2??????? 在IDENTIFIER_NODE節(jié)點(diǎn)中,該名字的使用是被__attribute__((deprecated))所不推薦的。

列表 1:tree_common中的標(biāo)識(shí)符

1.1.1. 樹節(jié)點(diǎn)的定義

以下是中間樹的節(jié)點(diǎn)的定義。

?

45??? typedef union tree_node *tree;????????????????????????????????????????????????????????????? in coretypes.h

?

1772 union tree_node GTY ((ptr_alias (union lang_tree_node),????????????????????????????? intree.h

1773?????????????? ????desc ("tree_node_structure (&%h)")))

1774 {

1775 ??struct tree_common GTY ((tag ("TS_COMMON"))) common;

1776 ??struct tree_int_cst GTY ((tag ("TS_INT_CST"))) int_cst;

1777 ??struct tree_real_cst GTY ((tag ("TS_REAL_CST"))) real_cst;

1778 ??struct tree_vector GTY ((tag ("TS_VECTOR"))) vector;

1779 ??struct tree_string GTY ((tag ("TS_STRING"))) string;

1780 ??struct tree_complex GTY ((tag ("TS_COMPLEX"))) complex;

1781 ??struct tree_identifier GTY ((tag ("TS_IDENTIFIER"))) identifier;

1782 ??struct tree_decl GTY ((tag ("TS_DECL"))) decl;

1783 ??struct tree_type GTY ((tag ("TS_TYPE"))) type;

1784 ??struct tree_list GTY ((tag ("TS_LIST"))) list;

1785 ??struct tree_vec GTY ((tag ("TS_VEC"))) vec;

1786 ??struct tree_exp GTY ((tag ("TS_EXP"))) exp;

1787 ??struct tree_block GTY ((tag ("TS_BLOCK"))) block;

1788 };

?

顯然,這個(gè)節(jié)點(diǎn)需要定義為union。注意第1772行的ptr_alias,它告訴GTY (GCC的廢料回收系統(tǒng)(garbage collection service),我們暫時(shí)不理會(huì)它),指向tree_node的指針實(shí)際上指向lang_tree_node,這個(gè)節(jié)點(diǎn)由前端通過(guò)tree_node追加額外的特定于語(yǔ)言的成員來(lái)定義(因此,它可被視為tree_node)。在C++前端中,lang_tree_node有如下定義:

?

472? union lang_tree_node GTY((desc ("cp_tree_node_structure (&%h)"), ??????????? incp-tree.h

473? ?????? chain_next ("(union lang_tree_node *)TREE_CHAIN (&%h.generic)")))

474? {

475? ? union tree_node GTY ((tag ("TS_CP_GENERIC"),

476????????????????????? desc ("tree_node_structure (&%h)"))) generic;

477? ? struct template_parm_index_s GTY ((tag ("TS_CP_TPI"))) tpi;

478? ? struct ptrmem_cst GTY ((tag ("TS_CP_PTRMEM"))) ptrmem;

479? ? struct tree_overload GTY ((tag ("TS_CP_OVERLOAD"))) overload;

480? ? struct tree_baselink GTY ((tag ("TS_CP_BASELINK"))) baselink;

481? ? struct tree_wrapper GTY ((tag ("TS_CP_WRAPPER"))) wrapper;

482? ? struct tree_default_arg GTY ((tag ("TS_CP_DEFAULT_ARG"))) default_arg;

483? ? struct lang_identifier GTY ((tag ("TS_CP_IDENTIFIER"))) identifier;

484? };


總結(jié)

以上是生活随笔為你收集整理的GCC-3.4.6源代码学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。