>> 后端部分目录由此链接进入
准备工作
GCC的架构
前端
1.概览
1.1. 前端中树的表达形式
1.1.2. tree_code —— 树节点的ID
1.1.3.1. 节点大小的确定
1.1.3.2. 内存分配
1.2. 树节点的构造
1.2.1. 机器模式的概念[2]
1.2.2. 内建类型的树节点
1.2.2.1. 初始化临时的size_t节点
1.2.2.1.1. 整型类型的节点
1.2.2.1.2. 创建临时的size_t节点
1.2.2.1.3. 创建整型的类型节点
1.2.2.1.4. 确定取值范围
1.2.2.1.5. 整型类型的布局
1.2.2.1.5.1. 整型的类型信息
1.2.2.1.5.1.1. 确定类型的符号
1.2.2.1.5.1.2. 确定机器模式
1.2.2.1.5.1.3. 确定类型大小
1.2.2.1.5.2.完成布局
1.2.2.2. size_t的正式的节点
1.2.2.3. 创建整型常量节点
1.2.3. 创建浮点常量节点
1.2.3.1. tree_real_cst节点
1.2.3.1.1. 从real_value创建节点
1.2.3.1.2. 从整型常量创建节点
1.2.3.1.2.1. 从整型常量构建real_value
1.2.3.1.2.2. 生成值的规范化
1.2.3.1.2.3. 转换到实数模式
1.2.4. 与地址相关节点的构造
1.2.4.1. 指针类型节点的构造
1.2.4.1.1. 用于表示类型的树节点
1.2.4.1.2. 节点的创建
1.2.4.1.3. 类型的布局
1.2.4.2. 创建引用类型的节点
1.2.4.3. 为地址表达式创建节点
1.2.4.4. 为OFFSET_TYPE创建节点
1.3. 为非一元表达式创建节点
1.3.1. 节点的创建
1.3.1.1. tree_exp类型
1.3.1.2. 操作数的预处理
1.3.2. 对于CALL_EXPR节点的处理
1.3.2.1. 确定被调用的函数
1.3.2.1.1. CALL_EXPR节点
1.3.2.1.2. 找出调用的函数
1.3.2.1.3. 确定函数的属性
1.3.2.1.3.1. 获取描述被调用函数的数据
1.3.2.1.3.2. 函数调用关系图
1.3.2.1.3.2.1.节点结构
1.3.2.1.3.2.2.创建cgaph_node节点
1.3.2.1.3.3. 确定属性
1.4. 为一元表达式创建节点
1.5. 为声明创建节点
1.5.1. 对声明的布局
1.6. 为类型创建节点 – 第一部分
1.6.1. 创建函数类型的节点
1.6.1.1. 由函数形参创建函数类型节点
1.6.1.2. 由函数形参链表创建函数类型节点
1.6.1.3. 对函数类型的布局
1.6.2. 创建索引节点
1.6.3. 创建数组类型节点
1.6.3.1. 类型的布局
1.6.3.1.1. 获取数组的边界
1.6.3.1.1.1. 对整型常量的操作
1.6.3.1.1.1.1. 左移
1.6.3.1.1.1.2. 右移
1.6.3.1.1.1.3. 循环移位
1.6.3.1.1.1.4. 加法和减法
1.6.3.1.1.1.5. 乘法
1.6.3.1.1.1.6. 除法和取整
1.6.3.1.1.2. 获取结果
1.6.3.1.2. 确定元素和数组的大小
1.7. save_expr函数的细节
2.编译器的初始化
2.1. 标识符哈希表的初始化
2.1.1. Obstack的管理
2.1.1.1. 初始化管理块
2.1.1.2. 内存分配
2.1.1.3. 释放对象
2.1.2. 元素的分配函数
2.1.2.1. 标识符同时存在树和哈希表的方式
2.1.3. 哈希表的查找
2.2. 类型哈希表的初始化
2.2.1. 哈希表的定义
2.2.2. 哈希表的元素
2.2.3. 查找哈希表
2.2.3.1. 为新类型填写信息
2.2.3.1.1. 整数类型的信息
2.2.3.1.2. 实数和复数类型信息
2.2.3.1.3. 其他简单类型的信息
2.2.3.1.4. 数组类型的信息
2.2.3.1.5. 聚集类型的信息
2.2.3.1.5.1. 概览[2]
2.2.3.1.5.2. 聚集类型的布局
2.2.3.1.5.2.1. 保存信息的结构体
2.2.3.1.5.2.2. 收集域的信息
2.2.3.1.5.2.2.1. tree_decl节点
2.2.3.1.5.2.2.2. 域的布局
2.2.3.1.5.2.2.3. VAR_DECL类型
2.2.3.1.5.2.2.4. CONST_DECL及TYPE_DECL类型
2.2.3.1.5.2.2.5. UNION的布局
2.2.3.1.5.2.2.5.1.FIELD_DECL的布局
2.2.3.1.5.2.2.5.2. 位域声明节点的处理
2.2.3.1.5.2.2.5.3. 其他域声明的处理
2.2.3.1.5.2.2.5.4. 进一步调整
2.2.3.1.5.2.2.5.5. 更新record_layout_info
2.2.3.1.5.2.2.6. RECORD_TYPE中的FIELD_DECL
2.2.3.1.5.2.2.6.1. 确定FIELD_DECL的对齐量
2.2.3.1.5.2.2.6.2. 不必要的紧凑布局
2.2.3.1.5.2.2.6.3. 需要填充的情况
2.2.3.1.5.2.2.6.4. GCC默认布局下的位域
2.2.3.1.5.2.2.6.5. MS布局下的位域
2.2.3.1.5.2.2.6.6. 更新record_layout_info
2.2.3.1.5.2.3. 完成布局
2.2.3.1.5.2.3.1. 确定类型大小
2.2.3.1.5.2.3.2. 确定类型模式
2.3. 初始化寄存器集
2.4. 初始化优化参数
3. 对命令行选项的处理
3.1. 为语言准备的钩子
3.2. 初始化源文件阅读器
3.2.1. 创建cpp_reader (续)
3.2.2. 准备处理编译命令选项
3.3. 处理编译选项
3.3.1. 与优化有关的选项
3.3.2. 初始化与目标平台相关选项
3.3.3. 处理其他选项
3.3.4. 完成处理
4. 预备源码分析
4.1. 选项的后处理
4.1.1. 完成查找路径设置
4.1.2. 设置Lexer控制参数
4.1.3. 读入源代码
4.1.3.1. 查找并读入文件
4.1.3.1.1. 验证PCH文件
4.1.3.2. 读入文件
4.1.3.2.1. PCH文件的案例
4.1.3.2.1.1. 预处理阶段的#pragma
4.1.3.2.1.2. 读入中间形式的PCH内容
4.1.3.2.1.2.1. 纯量变量的内容
4.1.3.2.1.2.2. 全局数组的内容
4.1.3.2.1.2.3. 哈希表
4.1.3.2.1.2.4. 映射文件内容至虚存
4.1.3.2.1.2.4.1. 恢复识别符
4.1.3.2.1.3. 恢复保存的宏及#pragma
4.1.3.2.1.4. 读入宏定义
4.1.3.2.1.4.1. 准备缓存
4.1.3.2.1.4.2.提前定义所在行号
4.1.3.2.1.4.3. 传统模式
4.1.3.2.1.4.4.创建宏定义 -ISO模式
4.1.3.2.1.4.4.1. 提前符号
4.1.3.2.1.4.4.2. 解析参数
4.1.3.2.1.4.4.3. 宏展开体
4.1.3.2.1.4.4.4. 完成创建
4.1.3.2.1.4.5. 完成读入
4.1.3.2.2. 读入普通文件
4.1.3.2.3. 堆叠文件(PCH文件除外)
4.1.3.2.3.1. 更换文件
4.1.3.2.3.1.1. #pragma interface及#pragmaimplementation
4.1.4. 根据目标平台调整选项
4.1.5. 最后确定参数
4.2. 初始化后端
4.2.1. 创建后端永久共享对象
4.2.1.1. 设定寄存器模式
4.2.1.2. 初始化哈希表
4.2.1.3. 创建RTL对象
4.2.1.3.1. RTL语言
4.2.1.3.2. 创建对象
4.2.1.3.2.1. 用于寄存器及相关的对象
4.2.1.3.2.2. 浮点常量对象
4.2.2. 初始化寄存器集
4.2.3. 确定寄存器集
4.2.3.1. 确定子集及超集关系
4.2.3.2. 确定寄存器间移动数据的代价
4.2.3.3. 支持自动增/减寄存器的信息
4.2.4. 初始化伪栈框引用
4.2.5. 准备别名分析
4.2.6. 准备循环优化遍
4.2.6.1. 概览
4.2.6.2. 初始化
4.2.7. 准备重装遍
4.2.7.1. 概览
4.2.7.2. 初始化
4.2.8. 用于函数调用序幕、结尾,兄弟调用结尾的数据
4.2.9. 准备汇编的生成
4.2.10. 评估算术操作的代价
4.2.10.1. 创建伪函数上下文 (续)
4.2.10.2. 数据收集
4.2.11. 更新用于函数调用的物理寄存器信息
4.2.12. 清除伪函数上下文
4.3. 语言相关的初始化
4.3.1. 前端部分的初始化
4.3.1.1. stmt_codes
4.3.1.2. 为C++初始化关键字
4.3.1.3. 初始化tree_list所用的哈希表
4.3.1.4. 与C++语义相关的初始化
4.3.1.5. 初始化操作符数据
4.3.1.6. 初始化名字修饰相关的数据结构
4.3.1.7. 初始化声明处理机制
4.3.1.7.1. 预定义标识符
4.3.1.7.2. 全局名字空间
4.3.1.7.2.1. 数据结构
4.3.1.7.2.2. 进入全局名字空间
4.3.1.7.2.3. 从全局名字空间返回
4.3.1.7.2.4. 全局名字空间对象
4.3.1.7.2.5. 创建作用域
4.3.1.7.3. 类型信息树节点
4.3.1.7.4. 创建std名字空间
4.3.1.7.4.1. 加入全局名字空间
4.3.1.7.4.2. 退回到全局名字空间
4.3.1.7.5. 内建对象的节点
4.3.1.7.5.1. 内建整型类型节点
4.3.1.7.5.2. 表示内建整型类型大小的节点
4.3.1.7.5.3. 其他内建类型节点
4.3.1.7.5.3.1. 常用常量的节点
4.3.1.7.5.3.2. va_list类型节点
4.3.1.7.5.3.3. Vector类型节点
4.3.1.7.5.4. 内建函数类型节点
4.3.1.7.5.5. 内建函数属性的节点
4.3.1.7.5.5.1. 内建函数属性的细节
4.3.1.7.5.6. 创建内建函数节点
4.3.1.7.5.6.1. 概览
4.3.1.7.5.6.2. 创建FUNCTION_DECL节点
4.3.1.7.5.6.3. 把FUNCTION_DECL加入当前名字空间
4.3.1.7.5.6.4. 为内建函数创建RTX对象
4.3.1.7.5.6.5. 处理内建函数的属性
4.3.1.7.5.6.5.1. 建立属性处理方法
4.3.1.7.5.6.5.2.处理format属性
4.3.1.7.5.6.5.3. 设置format属性
4.3.1.7.5.6.5.4. 处理nonnull属性
4.3.1.7.5.6.5.5.设置nonnull属性
4.3.1.7.5.6.5.6. 处理nothrow属性
4.3.1.7.5.6.5.7.设置nothrow属性
4.3.1.7.5.6.6. 题外话 —— 编译内建函数
4.3.1.7.6. 其它具有C链接性的C++语言成分
4.3.1.7.6.1. 标准部分
4.3.1.7.6.2. 扩展部分
4.3.1.7.7. 具有C++链接性的C++语言成分
4.3.1.7.7.1. bad_alloc
4.3.1.7.7.2. Binfo及basetype的细节
4.3.1.7.7.3. new和delete操作符
4.3.1.7.8. 完成初始化
4.3.1.7.8.1. 初始化类处理参数
4.3.1.7.8.2. 运行时类型识别RTTI
4.3.1.7.8.2.1. 构建TYPE_DECL节点
4.3.1.7.8.2.2. 构建type_info的定义
4.3.1.7.8.2.3. RTTI的使用
4.3.1.7.8.2.3.1. 为类型生成RTTI
4.3.1.7.8.2.3.2. type_info的后处理
4.3.1.7.8.2.3.2.1. 安装基本类型type_info对象
4.3.1.7.8.2.3.2.2. 构建真实type_info对象
4.3.1.7.8.3. 异常处理句柄
4.3.1.7.8.4. 检测链接器的行为及其它
4.3.1.8. 设置预处理器
4.3.1.9. 完成前端初始化
4.3.2. 构建异常上下文
4.3.3. 初始化库函数调用表
4.3.4. 完成编译器初始化
5. 源代码解析
5.1. 设置系统的宏定义
5.1.1. C++内建宏
5.1.2. C内建宏
5.1.2.1. __GUNC__宏系列
5.1.2.2. stddef.h定义的宏
5.1.2.3. 对应于语言的控制宏
5.1.2.4. 对应于基本类型特性的宏
5.1.2.5. 对应于编译器的控制宏
5.1.2.6. 对应于目标系统的控制宏
5.2. 命令行上的宏及断言
5.3. 由-imacros引入的宏定义及断言
5.3.1. 符号提取
5.3.1.1. 处理指示
5.3.1.2. 宏调用
5.3.1.2.1. 函数式宏的扩展—实参收集
5.3.1.2.2. 函数式宏的扩展—实参替换
5.3.1.3. 内建宏—pragma指示的处理
5.3.1.3.1. #pragma GCCdependency的句柄
5.3.1.4. 其它内建宏的处理
5.4. 由-include包含的头文件
5.5. 为PCH头文件准备
5.6. 准备解析器
5.6.1. 创建主词法分析器
5.6.1.1. 获取预处理后符号
5.6.1.1.1. 标识符
5.6.1.1.2. 数字
5.6.1.1.2.1. 整数
5.6.1.1.2.2. 浮点数
5.6.1.1.2.3. 字符、字符串常量
5.6.1.1.3. 完成预处理符号提取
5.6.2. 创建解析器上下文
5.7. 准备延迟访问列表
5.8. 向解析器传入符号
5.9. 试探性的解析器
5.9.1. 概观
5.9.2. 访问控制
5.9.2.1. 是否从当前类访问
5.9.2.2. 是否从友元访问
5.9.2.3. 确定访问属性
5.9.3. 错误恢复
5.10. 解析器用到的辅助函数
5.11. 解析编译单元–入口
5.12. 解析编译单元–声明序列
5.12.1. 学习编译过程的第一个例子
5.12.2. 第一条语句– NAMESPACE_DECL
5.12.3. 第二条语句–TEMPLATE_DECL
5.12.3.1. 解析模板参数列表
5.12.3.1.1. 解析模板类型参数
5.12.3.1.2. 处理模板参数
5.12.3.2. 解析模板声明的decl-specifier-seq部分
5.12.3.2.1. 解析type-specifier
5.12.3.2.1.1. class-specifier的情形
5.12.3.2.1.1.1. 解析class-head
5.12.3.2.1.1.1.1. 合理性检查
5.12.3.2.1.1.1.2. 加入类SingleThreaded的标签
5.12.3.2.1.1.1.3. 为类创建TEMPLATE_DECL
5.12.3.2.1.1.1.4. 加入类的TYPE_DECL
5.12.3.2.1.1.2. 开始类定义
5.12.3.2.1.1.2.1. 构建对自己的引用
5.12.3.2.1.1.2.2. 为自己的引用构建TEMPLATE_DECL
5.12.3.2.1.1.2.3. 作为成员加入类域
5.12.3.2.1.1.3. 解析类体
5.12.3.2.1.1.3.1. 加入嵌套类的标签
5.12.3.2.1.1.3.2. 为嵌套类创建TEMPLATE_DECL
5.12.3.2.1.1.3.3. 开始嵌套类定义
5.12.3.2.1.1.3.4.解析默认构造函数
5.12.3.2.1.1.3.4.1. 解析声明符
5.12.3.2.1.1.3.4.2. 为方法构建节点 (续)
5.12.3.2.1.1.3.4.3. 缓存内联函数体
5.12.3.2.1.1.3.4.4. 退出方法的作用域
5.12.3.2.1.1.3.4.5. 把构造函数插入类
5.12.3.2.1.1.3.5. 解析其它构造函数
5.12.3.2.1.1.3.5.1. 解析参数
5.12.3.2.1.1.3.5.2. 为参数构建DECL节点
5.12.3.2.1.1.3.5.3. 完成
5.12.3.2.1.1.3.6. 完成解析
5.12.3.2.1.1.3.6.1. 退出嵌套类
5.12.3.2.1.1.3.6.2. 完成方法成员的解析
5.12.3.2.1.1.4. 解析类体–typedef声明
5.12.3.2.1.1.4.1. 找出decl-specifier-spec及declarator
5.12.3.2.1.1.4.2. 为类字段构建节点
5.12.3.2.1.1.4.3. 加入类字段的节点
5.12.3.2.1.2. 完成解析
5.12.3.2.1.2.1. 延迟的内联函数解析
5.12.3.2.1.2.1.1. 开始函数处理
5.12.3.2.1.2.1.1.1. 处理函数之前准备数据
5.12.3.2.1.2.1.1.2. 加入函数作用域
5.12.3.2.1.2.1.2. 解析函数体
5.12.3.2.1.2.1.2.1. 准备阶段
5.12.3.2.1.2.1.2.2. 完成阶段
5.12.3.2.1.2.1.3. 完成函数处理
5.12.3.2.1.2.1.4. 为产生代码准备
5.12.3.2.1.2.1.4.1. 更新函数调用图
5.12.3.2.1.2.2. 闭合类定义
5.12.4. 第二个例子
5.12.4.1. 解析模板参数列表
5.12.4.1.1. 模板模板参数
5.12.4.1.1.1. 参数
5.12.4.1.1.2. 缺省实参
5.12.4.1.1.2.1. 名字查找的细节
5.12.4.1.1.2.1.1. 在指定域中查找
5.12.4.1.1.2.1.1.1. 在指定名字空间中的查找
5.12.4.1.1.2.1.1.2. 在指定类中的查找
5.12.4.1.1.2.1.2. 在指定对象中查找
5.12.4.1.1.2.1.3. 在当前作用域查找
5.12.4.1.1.2.1.3.1. 转换操作符
5.12.4.1.1.2.1.3.2. 其他名字
5.12.4.1.1.2.2. 查找的结果
5.12.4.1.1.3. 处理模板模板参数
5.12.4.1.2. 非类型参数
5.12.4.1.2.1. 处理非类型参数
5.12.4.2. 解析class-head
5.12.4.2.1. 评估类型的依赖性
5.12.4.2.1.1. 概述
5.12.4.2.1.2. 依赖于类型
5.12.4.2.1.3. 依赖于值
5.12.4.2.2. 类名查找
5.12.4.2.2.1. 非template-id
5.12.4.2.2.2. template-id
5.12.4.2.2.2.1. 解析模板名
5.12.4.2.2.2.1.1. Operator-function-id
5.12.4.2.2.2.1.2. 标识符
5.12.4.2.2.2.2. 解析实参列表
5.12.4.2.2.2.2.1. 解析实参
5.12.4.2.2.2.2.1.1.type-id的情形
5.12.4.2.2.2.2.1.2.id-expression的情形
5.12.4.2.2.2.2.1.3.assignment-expression的情形
5.12.4.2.2.2.3. 完成template-id
5.12.4.2.2.3. 完成类名查找
5.12.4.2.3. 处理基类
5.12.4.2.3.1. 解析base-clause
5.12.4.2.3.1.1. 内层template-id
5.12.4.2.3.1.1.1. 模板模板实参
5.12.4.2.3.1.1.2. 非类型实参
5.12.4.2.3.1.1.3. 生成template-id
5.12.4.2.3.1.2. 外层template-id
5.12.4.2.3.2. 为base-clause构建节点
5.12.4.2.3.2.1. 填充binfo
5.12.4.3. 解析class-definition
5.12.5. 第三个例子
5.12.5.1. using指示
5.12.5.2. Main() 的定义
5.12.5.2.1. 函数定义–声明符部分
5.12.5.2.2. 函数定义–函数体部分 (续)
5.12.5.2.2.1. 准备函数体解析
5.12.5.2.2.2. 处理函数体
5.12.5.2.2.2.1. 模板具现
5.12.5.2.2.2.1.1. template-id
5.12.5.2.2.2.1.1. 替换第一个缺省实参
5.12.5.2.2.2.1.2. 替换剩下的缺省实参
5.12.5.2.2.2.1.3. 生成节点
5.12.5.2.2.2.1.2. 构建VAR_DECL
5.12.5.2.2.2.1.3. 为具现构建RECORD_TYPE
5.12.5.2.2.2.1.3.1. 具现基类 – 实参替换
5.12.5.2.2.2.1.3.2. 具现基类——完成
5.12.5.2.2.2.1.3.3. 派生类的RECORD_TYPE成员的替代
5.12.5.2.2.2.1.3.4. 派生类的RECORD_TYPE修正内联方法
5.12.5.2.2.2.1.3.5. 派生类的RECORD_TYPE验证基类
5.12.5.2.2.2.1.3.6. 派生类的RECORD_TYPE验证成员
5.12.5.2.2.2.1.3.7. 派生类的RECORD_TYPE验证方法
5.12.5.2.2.2.1.3.8. 派生类的RECORD_TYPE补充缺少的方法
5.12.5.2.2.2.1.3.9. 派生类的RECORD_TYPE– 布局
5.12.5.2.2.2.1.3.10. 派生类的RECORD_TYPE构建vtable
(续)
5.12.5.2.2.2.1.3.11.派生类RECORD_TYPE完成vtable
5.12.5.2.2.2.1.3.12.派生类RECORD_TYPE生成VTT
(续)
5.12.5.2.2.2.1.4. 完成具现
5.12.5.2.2.2.1.5. 完成VAR_DECL
5.12.5.2.2.2.2. Return表达式
5.12.5.2.2.3. 完成函数体处理
5.12.5.2.3. 函数定义– 完成
5.13. 解析后阶段
5.13.1. 预备知识—转换的细节
5.13.1.1. 确定合适的转换
5.13.1.1.1. 标准转换序列
5.13.1.1.2. 用户定义转换序列
5.13.1.1.2.1. 收集候选函数
5.13.1.1.2.1.1. 添加普通函数
5.13.1.1.2.1.2. 添加模板方法
5.13.1.1.2.1.2.1. 模板实参推导 (续1)(续2)
5.13.1.1.2.2. 确定最优
5.13.1.1.2.2.1. 挑选可行的候选者
5.13.1.1.2.2.2. 选出最优 (续)
5.13.1.1.3. 引用类型的转换
5.13.1.1.3.1. 重载引用的解析
5.13.1.1.3.2. 对确定类型的引用
5.13.1.2. 真正的转换
5.13.1.2.1. 扩展支持的不良标准转换
5.13.1.2.2. 用户定义转换
5.13.1.2.2.1. 转换隐含的this实参
5.13.1.2.2.2. 转换其他实参
5.13.1.2.2.2.1. 普通实参
5.13.1.2.2.2.2. 缺省实参
5.13.1.2.2.2.3. 省略实参
5.13.1.2.2.3. 调用初始化方法
5.13.1.2.3. 标准转换
5.13.1.2.3.1. 案例学习:到指针的转换
5.13.1.2.3.1.1. 从类到指针
5.13.1.2.3.1.2. 到void*或函数指针
5.13.1.2.3.1.3. 在类指针之间
5.13.1.2.3.1.4. 指向成员的指针之间
5.13.1.2.3.1.5. 从成员函数指针到其它指针类型
5.13.2. 输出PCH文件
5.13.3. 为基本类型产生tinfo
5.13.4. 稳定中间树
5.13.4.1. 迭代 – 发布vtable
5.13.4.2. 迭代 – 发布tinfo
5.13.4.3. 迭代 – 发布全局聚集类的构造函数/析构函数
5.13.4.3.1. 修整需要初始化的变量
5.13.4.3.2. 产生初始化代码
5.13.4.4. 迭代 – 为延迟函数发布代码
5.13.4.5. 迭代 – 处理名字空间中的全局对象
5.13.4.6. 迭代 – 在类中没有初始值的静态成员
5.13.4.7. 发布代码根据优先级调用初始化函数
5.13.4.7.1. 为函数调用产生代码
5.13.4.7.1.1. 构建获取函数地址的表达式 (续)
5.13.4.7.1.2. 为实参执行适合的转换
5.13.4.7.1.3. 为函数调用构建节点
5.13.4.7.2完成初始化函数的调用.
5.13.5. 代码分析及优化
5.13.5.1. 预备知识- 别名集分析
5.13.5.1.1. 别名集概念
5.13.5.1.2. 数据结构
5.13.5.1.3. 准备别名集
5.13.5.2. 为待定变量发布汇编
5.13.5.2.1. 内存分配
5.13.5.2.2. 内存配置
5.13.5.2.2.1. 初始值
5.13.5.2.2.1.1. 输出引用的常量
5.13.5.2.2.1.1.1. 设置内存属性
5.13.5.2.2.1.1.2. 确定输出节
5.13.5.2.2.1.1.3. 发布汇编代码
5.13.5.2.2.1.1.3.1. 全0的内容
5.13.5.2.2.1.1.3.2. 整数
5.13.5.2.2.1.1.3.3. 浮点数
5.13.5.2.2.1.1.3.4. 字符串
5.13.5.2.2.1.1.3.5. 聚集类初始值
5.13.5.2.2.2. 变量
5.13.5.2.2.2.1. 发布汇编 – 未指定初始值
5.13.5.2.2.2.2. 发布汇编 – 指定初始值
5.13.5.3. 分析编译单元
5.13.5.3.1. 分析函数
5.13.5.3.1.1. 构建函数调用图
5.13.5.3.1.2. 分析函数能否内联
5.13.5.3.2. 基于cgraph图的优化
5.13.5.3.2.1. 标记局部函数
5.13.5.3.2.2. 确定函数能否内联
5.13.5.3.2.2.1. 按调用次序排序
5.13.5.3.2.2.2. 强制内联的函数
5.13.5.3.2.2.3. 普通的内联函数
5.13.5.3.2.3. 设置cgraph_global_info_ready
5.13.5.3.2.4. 基于cgraph图为函数发布汇编
5.13.5.3.2.4.1. 标记出需要发布汇编的函数
5.13.5.3.2.4.2. 基于cgraph展开内联函数调用
5.13.5.3.2.4.2.1. 找出函数体中可以内联的调用
5.13.5.3.2.4.2.2. 产生初始化函数实参的代码
5.13.5.3.2.4.2.3. 展开内联函数体
5.13.5.3.2.4.2.3.1. 准备ret_label
5.13.5.3.2.4.2.3.2. 替换形参
5.13.5.3.2.4.2.3.3. 构建返回变量
5.13.5.3.2.4.2.3.4. 拷贝函数体
5.13.5.3.2.4.2.4. 结束语及预告