Shortcontents 简介 ,,·,·,··, 1向GCC开发提供帮助:: :::::::::::: 2GαC与可移植性::::::::::::::::::: 111 3GcC的输出接口::::::::: 4GCC低级运行时库 :::::2 5GCC中的语言前端∷:::::: ::::45 6源目录结构和构建系统∷::::: ::: :::45 7选项描述文件:::::: 67 8编译器的Passes和相关文件::::::::::::::::::69 9Tres:C和C++前端使用的中间表示::::::::::79 10RTL表示:::::::::::::::::::::::108 11GENEric:::::::::: ::::::::147 12GIMPLE ∴::::::::::::: 148 13分析和优化GIMPLE元组::::::::::::::::::178 14循环分析和表示::::::::::::::::::::::189 15控制流图::::::::::::::::::::::::195 16机器描述::::::::: :::::::::::::::201 17目标机描述宏和函数:::::::::::::::::::282 18主机配置::::::::::::::::::::::::401 19Makefile片段::::::::::::::::::::::403 20collect2 ::::::: ::405 21标准头文件目录::::::::::::::::::406 22内存管理和类型信息:::::::::::::::::::::407 资助自由软件∷:::::::::: ::::::411 GNU项目和GNU/Linux::::: ::::412 GNU通用公共授权:::::::::::::::::::::::::412 GNU自由文档授权::::::::::::::::::::::423 GCC的贡献者: ::::::::::::430 选项索引:::::::::::: ::445 概念索引∷::::::::::: ::;:::445 GNU编译器内部实现 Tableofcontents 简介 1向GCC开发提供帮助::::: :::;:::: 2GCC与可移植性:::::::::::::::::::::1 GCC的输出接口 2 4GCC低级运行时库:::::::::::::::: 4.1整数算术例程 411算术函数 4.1.2比较函数 4 413可产生异常的算术函数 4.1.4位运算::::: 4.2浮点模拟例程::: 4.21算术函数::: 42.2转换函数 4.2.3比较函数 4.24其它浮点函数: 445568999 4.3十进制浮点模拟例程::::::: 43.1算术函数 4.3.2转换函数::: 10 43.3比较函数:: 13 4.4定点小数模拟例程 ::14 441算术函数 14 442比较函数 ;: :::21 44.3转换函数 11 4.5语言无关的异常处理例程 ::44 4.6其它运行时库例程: 45 4.61Cache控制函数: 45 5GCC中的语言前端:::: 45 6源目录结构和构建系统::::::::::∷:::::::::45 61配置术语和历史:::::::::::::::::: 45 6.2顶层源文件目录 46 63gcc'子目录::: :47 631gcc的子目录 :::::47 632gcc目录下的配置::::: ::::::47 6321configure'使用的脚本:::::: 48 6.3.2.2config.build',config.host'和config.gcc‘文件 48 6323由configure创建的文件 48 6.33gcc目录下的构建系统::::: 49 6.34Makefile工作目标:: 49 635在gcc'目录下的库源文件和头文件: 51 636GCC安装的头文件 51 6.37构建文档:::: 51 63.7.1Texinfo手册 52 63.7.2生成ManPage:::: 52 63.7.3其它文档 53 6.38语言前端剖析 53 6381前端language'目录 :::::54 6.38.2前端config-lang.in文件 56 6.39目标机后端剖析: 56 64测试包: ::: 57 641测试包代码中使用的习惯用法 57 642Dejagnu测试中使用的指令 58 643Ada语言测试包: 62 644C语言测试包 :;:::: :::62 6.4.5Java库测试包 64 6.46对gcov测试的支持 :64 647对profile-directed优化测试的支持:: 65 648对二进制兼容性测试的支持:::::::::: 65 6.49对使用多个选项进行-torture测试的支持::::::: 66 7选项描述文件∷::::::::::::: 67 71选项文件格式::::::::::::: ::::67 7.2选项属性 ::::::68 8编译器的Passes和相关文件 :::69 81语法分析过程 69 82Simplification过程 70 8.3过程管理器 70 84Tree-SSA过程 71 8.5RTL过程 76 9Trees:C和C++前端使用的中间表示::::::::::79 91不足之处:::::: :::79 9.2概述:::: 9.2.1Trees 80 9.22标识符:: ::::80 92.3容器 81 9.3类型 :::81 9.4作用域 85 9.41命名空间:::: 85 9.4.2类 86 9.5声明 87 9.5.1关于声明的操作:::: ::: 87 GNU编译器内部实现 9.52内部结构:: 89 9.52.1目前的结构层次 ::89 9.52.2添加新的DECL节点类型 90 9.6函数 :91 9.61函数基础 91 9.6.2函数体 ::94 9.62.1语句 94 9.7树中的属性:::: :97 9.8表达式 a7 10RTL表示:::::::::::::::: ::108 101RTL对象类型 108 10.2RT类别和格式 :109 10.3访问操作数 ::: 111 104访问特殊操作数: 111 105RTL表达式中的标记 113 10.6机器模式 118 107常量表达式类型:: 122 108寄存器和内存::: 123 109RTL算术运算表达式 128 10.10比较运算:::::: :131 1011位域 132 1012向量运算 :::: ::::132 1013转换::::: ::133 10.14声明 134 1015副作用表达式::::::::::: 134 10.16地址中嵌入的副作用:::: 138 1017作为表达式的汇编指令: 139 10.18Insns ::::139 1019函数调用nsns的RT表示::: ::145 10.20结构共享假设 146 1021读取RTL ::::146 11GENERIC:::::::::::::::::::::::147 11.1语句 147 111.1块: ::::147 111.2语句序列 147 11.13空语句::: ::::::::::::::147 11.1.4跳转 148 11.1.5清除:::::::::::: ::148 12gimple::::::: :::::148 121元组表 149 12.1.1gimple-statementbase(gsbase ::149 12.1.2gimpl t_with_ops 150 12.1.3gimple_____ops 150 122GIMPLE指令集:::::: 151 123异常处理 152 12.4Temporaries 153 125操作数 153 125.1复合表达式: 153 12.52复合左值::::: 153 1253条件表达式 153 12.54逻辑运算符: 154 125.5操作操作数: :154 12.56操作数向量分配 :::154 125.7操作数有效性: ::::155 12.58语句有效性 155 126操作GIMPLE语句::::::::::: 156 12.6.1通用访问方法 ::156 127元组特定访问方法 :::158 12.7.1GIMPLEASM 垂垂 ::158 12.7.2GIMPLE_ASSIGN 159 12.73GIMPLEBIND 160 12.7.4GIMPLECALL ::::161 12.75GIMPLECATCH ::162 127.6GIMPLECHANGEDYNAMICTYPE 163 12.7.7GIMPLECOND 163 127.8GIMPLEEHFILTER 164 127.9GIMPLELABEL ::165 12.7.10GIMPLE_NOP 165 12.7.11GIMPLE_OMPATOMIC_LOAD:: :::165 12.7.12GIMPLE_OMP_ATOMIC_STORE 165 12.7.13GIMPLEOMPCONTINUE::::::::::::::::::::: 166 12.7.14GIMPLEOMPCRITICAL 166 12.7.15GIMPLEOMPFOR :166 12.7.16GIMPLE_OMPMASTER ::168 12.7.17GIMPLEOMPORDERED ::168 12.7.18GIMPLEOMPPARALLEL ::168 12.7.19GIMPLE_OMP_RETURN 169 12.7,20GIMPLEOMPSECTION :::::::::169 12.7,21GIMPLE_OMPSECTIONS ::::169 12.7.22GIMPLEOMPSINGLE :::::::::::170 12.7.23GIMPLEPHI::::::::::: 170 12,7.24GIMPLERESX 171 12.7.25GIMPLERETURN ::::::::::::::::::::171 12.7.26GIMPLESWITCH 171 12.7.27GIMPLE_TRY :::172 12.7.28GIMPLEWITHCLEANUPEXPR 172 GNU编译器内部实现 128GIMPLE序列: :173 129序列迭代器::::::::::: ::::::174 1210增加一个新的GIMPLE语句代码:: 177 12.11语句和操作数遍历:: 177 13分析和优化GIMPLE元组:::::::::::::::178 13.1Annotations 178 132SSA操作数:: 178 13.2.1操作数迭代器和访问例程 179 1322立即使用::::::: :;::: 181 13.3静态单赋值::::::::: ::::::183 1331保持SSA形式:::::::::: 184 13.32保持虚SSA形式::::: 185 1333检验SSANAM节点::::::::: 185 13.34遍历use-def链:: 186 133.5遍历支配树 ::186 3.4别名分析 186 14循环分析和表示::::::::::::::::::189 141循环表示: 189 142循环查询: 190 143循环操作:: 191 144循环封闭的SSA飛式 :192 145标量演化 192 146RTL上的ⅣV分析 193 147迭代次数分析 148数据依赖分析::: : 193 194 149线性循环转换框架::: ::195 14.10Omega一种对线性规划问题的求解 195 15控制流图:::::::::::::::::::: 195 15.1基本块 196 152边::: 197 153Profile信息::::: 199 154维护CFG :::200 15.5活跃信息:::::::::::::: 201 16机器描述::::::::::::::::::::::::::201 161概述机器描述是如何被使用的: 202 162指令模式的方方面面 ::202 163有关define_insn的例子 203 164RTL模板: ::203 16.5输岀模板和操作数替换∷::: ::: 206 166用于汇编输出的C语句 207 16.7断言 ::;: :::208 167.1机器无关的predicate 209 1672定义机器特定的predicate ::::::210 168操作数的约束: 212 168.1简单约束:::: ::::::::212 1682多个可选的约束 215 1683寄存器类别优先选择 :215 1684constrain修饰符 216 168.5机器特定的约束::::::: 217 1686使用enabled属性来禁止insn可选项 232 168.7定义机器特定的约束::: 233 1688从C中测试约束 234 169用于生成的标准指令模式名 :::::::235 1610指令模式的顺序问题: 253 1611指令模式的相互依赖性: :254 1612定义跳转指令模式 254 1613定义循环指令模式 ::::255 1614指令规范化 257 1615为代码生成定义RTL序列:::: :258 1616定义如何拆分指令 260 1617在机器描述中包含指令模式 262 1617.1用于目录搜索的RTL生成工具选项:::::::::: 263 1618机器特定的窥孔优化 263 16181RTL到文本的窥孔优化器 ::::::263 1618.2RTL到RTL的窥孔优化器 265 1619指令属性 266 16191定义属性以及它们的值 266 1619.2属性表达式 ::::267 16193给Insns赋予属性值:: :269 16194关于属性说明的例子: ::::::::270 16195计算一个Insn的长度:::: : 271 1619.6常量属性 272 16197延迟槽调度 272 16198处理器流水线描述::::::: 273 1620条件执行 277 1621常量定义:::::: ::278 16.22迭代器 :::::279 16221机器模式迭代器:::::: 279 16.22.1.1定义机器模式迭代器:: 279 1622.1.2机器模式迭代器中的替换 279 1622.1.3有关机器模式迭代器的例子 280 v GNU编译器内部实现 16222代码迭代器 281 17目标机描述宏和函数:::::::::::::::::282 17.1全局变量target ::::282 17.2控制编译驱动器,gcc':::::: :282 173运行时的target指定 :;:: 289 174为基于每个函数的信息定义数据结构 291 17.5存储布局:::::: 291 17.6源语言的数据类型布局 :298 177寄存器的用法:::::: ::: :: 302 17.7.1寄存器的基本特征 303 17.7.2寄存器的分配顺序:::::: ::::304 1773如何使值适合寄存器 305 1774处理叶子函数:::::::: :::::306 17.7.5形成栈的寄存器 307 178寄存器类别 307 17.9废弃的定义约束的宏:: ::::::314 17.10栈布局和调用约定: 315 17.10.1基本的帧布局 315 17.10.2对异常处理的支持: 318 17.10.3指定如何进行栈检查:::::::: 320 17.104用于栈帧寻址的寄存器:: ::321 17.105消除帧指针和参数指针 323 1710.6在栈上传递函数参数 :324 17.10.7在寄存器中传递参数 325 17.10.8标量函数值如何被返回 ;::::: 329 17.10.9如何返回大的值 330 17.10.10调用者保存的寄存器分配: :331 17.1011函数入口和出口 331 17.1012为profiling生成代码 334 17.1013允许尾调用 334 17.1014栈冲突保护 335 1711实现Varargs宏 335 17.12嵌套函数的蹦床:: :::337 1713库例程的隐式调用::: 338 17.14寻址模式 340 17.15锚定的地址 343 17.16条件代码状态: :: :::344 17.17描述操作的相对代价::: 346 17.18调整指令调度器::::::: :::349 1719将输出划分到section中(Texts,Data,,.) 353 17.20位置独立代码:::: 357 17.21定义汇编语言输出 357 17.211汇编文件的总体框架 358 17.21.2数据的输出 360 17.21.3未初始化变量的输出 :: :::362 17.214标号的生成和输出 ::363 17.21.5如何处理初始化函数:::::::::::::::::::::::::368