猿代码 — 科研/AI模型/高性能计算
0

GCC:GCC初始化

摘要: GCC初始化C 前端包括 C/C++ 预处理器和 C 编译器。程序cc1包括预处理器和 C 编译器。它编译一个 C 源文件并生成一个程序集 (.S) 文件。编译器前端和后端使用称为语言钩子的回调函数相互交互。所有钩子都包含在文件 ...

GCC初始化[编辑源代码]

GCC 初始化。

C 前端包括 C/C++ 预处理器和 C 编译器。程序 cc1 包括预处理器和 C 编译器。它编译一个 C 源文件并生成一个程序集 (.S) 文件。

编译器前端和后端使用称为语言钩子的回调函数相互交互。所有钩子都包含在文件 langhooks.h 中定义的全局变量结构lang_hooks lang_hooks中。有以下类型的钩子:用于树内联的钩子、用于调用图的钩子、用于函数的钩子、用于树转储的钩子、用于类型的钩子、用于声明的钩子和特定于语言的钩子。钩子的默认值在文件 langhooks-def.h 中定义。

GCC 初始化包括命令行选项解析、初始化后端、创建全局作用域以及初始化内置数据类型和函数。

每个声明都与一个作用域相关联。例如,局部变量与其函数的作用域相关联。全局声明与全局范围相关联。

文件 toplev.c 包含主 cc1 函数 toplev_main() 和定义编译器状态的全局变量。变量 current_function_decl 是正在编译的函数的声明,如果函数之间为 NULL

函数 toplev_main() 是处理命令行选项、初始化编译器、编译文件并释放分配资源的函数。函数 decode_options() 处理命令行选项并在编译器中设置相应的变量。

按照命令行选项,调用解析函数 do_compile()。它通过调用函数 backend_init() 来执行后端初始化。

后端初始化包括许多步骤。功能 init_emit_once() 为许多 RTL 表达式生成 寄存器:pc_rtx 表示程序计数器,CC0 表示条件, stack_pointer_rtx、frame_pointer_rtx等它们保存在数组中 global_rtl。

之后,函数 lang_dependent_init() 执行依赖于语言的初始化,其中包括前端和后端的初始化。C 初始化函数 c_objc_common_init() 创建内置数据类型、初始化全局作用域并执行其他初始化任务。函数 c_common_nodes_and_builtins() 创建文件 builtin-types.def 中描述的预定义类型。

标准 C 类型是在初始化时创建的。下表列出了几种类型:

GCC 内置类型
变量名称C型
char_type_node
integer_type_nodeint
unsigned_type_node无符号整数
void_type_node无效
ptr_type_node无效*

GCC 内置函数是在编译时计算的函数。例如,如果 strcpy() 函数的 size 参数是常量,则 GCC 会将函数调用替换为所需数量的赋值。编译器将标准库调用替换为内置函数,然后在构造函数的 AST 后对其进行评估。对于 strcpy(),编译器会检查 size 参数,如果参数是常量,则使用优化的内置版本 strcpy()。builtin_constant_p() 允许在编译时确定其参数的值是否已知。GCC 内置函数在 GCC 之外使用。例如,Linux 内核的字符串处理库使用 builtin_constant_p() 来调用字符串处理函数的优化版本,前提是在编译时知道字符串大小。

GCC 使用相应的 expand_builtin() 函数评估每个内置函数。例如,builtin_strcmp() 是使用 expand_builtin_strcmp() 计算的。下表给出了 GCC 内置的示例:

GCC 内置函数
内置名称解释
builtin_constant_p如果参数是常量,则返回 true
builtin_memcpy等同于 memcpy()
builtin_strlen等价于 strlen()


带回家GCC 初始化包括命令行选项解析、初始化后端、创建全局作用域以及初始化内置数据类型和函数。

说点什么...

已有0条评论

最新评论...

本文作者
2024-2-14 01:47
  • 0
    粉丝
  • 281
    阅读
  • 0
    回复
资讯幻灯片
热门评论
热门专题
排行榜
Copyright   ©2015-2023   猿代码-超算人才智造局 高性能计算|并行计算|人工智能      ( 京ICP备2021026424号-2 )