【问题标题】:Where in the GCC source code does it compile to the different assembly languages?它在 GCC 源代码中的哪个位置编译为不同的汇编语言?
【发布时间】:2015-02-19 16:03:25
【问题描述】:

GCC 源代码中实际为不同架构构建程序集的代码在哪里?

想知道它编译成多少种不同的汇编语言,以及它实际上是如何做到的(通过查看源代码)。

它是在某个地方的 gcc repo 中,还是在另一个 repo 中?我已经开始四处挖掘,但没有找到任何东西。

https://github.com/gcc-mirror/gcc

例如,这里是 V8 中的一些汇编生成代码:

https://github.com/v8/v8-git-mirror/tree/master/src/x64

GCC 有什么等价物吗?

我想知道,因为 GCC 是如何做到这一点的,这是一个谜,这将是了解编译器如何实际实现到汇编级别的好方法。

【问题讨论】:

标签: c gcc assembly compiler-construction


【解决方案1】:

GCC 源代码的.md(机器描述)文件包含生成程序集的内容。 GCC 包含几个专门的 C/C++ 代码生成器(其中一些将.md 文件转换为代码发射程序集)。

GCC 是一个非常复杂的程序。 documentation of GCC MELT(一个过时的项目)包含几个有趣的链接和幻灯片,特别是指印度人GCC Resource Center

GCC 中的大多数优化都发生在中端(大部分独立于源语言或目标系统),特别是在 Gimple 表示上工作的许多通道。

GCC 存储库是 SVN repository

另见this answer,尤其是其中的图片。

【讨论】:

    【解决方案2】:

    GCC 的实际源代码最容易从这里访问:

    https://gcc.gnu.org/svn.html

    该软件可通过源代码控制系统 SVN(subversion)访问。这将安装在许多版本的 Linux/UNIX 上,但如果不在您的平台上,您可以安装 svn 工具包,然后使用以下命令获取源代码:

    svn checkout svn://gcc.gnu.org/svn/gcc/trunk SomeLocalDir
    

    GCC 很复杂,需要大量经验才能了解应用程序如何实际编译到不同架构的性质。

    简而言之,GCC 具有三个主要组件 - 前端、中间和后端处理。前端处理器具有语言解析组件以理解语言的语法(如 C、C++、Objective-C 等)。前端将代码解构为可移植构造,然后将其传递给后端以编译到目标环境。

    中间部分执行代码分析和优化,尝试对代码进行优先排序,以便在整个流程结束时生成尽可能好的输出。从技术上讲,优化可以发生在过程的任何部分,因为在分析过程中发现了模式。

    后端处理器将代码编译为树形输出格式(实际上不是最终的可执行代码)。基于预期输出的设计,“伪代码”针对使用寄存器、位大小、字节序等进行了优化。然后在汇编阶段生成最终代码,将后端代码转换为机器可执行指令。

    请务必注意,编译器有许多选项来处理输出格式,因此您可以为许多体系结构类创建输出,通常是开箱即用的。对于交叉编译和目标编译器选项,请尝试查看此链接:

    https://gcc.gnu.org/install/configure.html

    【讨论】:

    • 你忘了GCC的中端部分,比前后端加起来还要大!
    • 有很多位置可以看到整个过程 - Wiki 页面是一个好的开始。中间部分没有直接解决问题,但无论如何我都将其添加到答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多