GCC版本更新录(202x)
2023-04-27 15:39:40 阿炯

本文是从GCC的产品主页分离出来的,专门用于该软件的更新记录,截止到2029年12月31日。

GCC(GNU Compiler Collection,GNU 编译器套装),是一套由 GNU 开发的编程语言编译器。它是一套以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU 计划 的关键部分,亦是自由的 类 Unix 及苹果计算机 Mac OS X 操作系统的标准编译器。GCC(特别是其中的 C 语言编译器)也常被认为是跨平台编译器的事实标准。GNU 编译器套件包括 C、C++、 Objective-C、 Fortran、Java、Ada、Go 语言前端等,也包括了这些语言的库(如 libstdc++,libgcj 等)。 GCC 的初衷是为 GNU 操作系统专门编写的一款编译器。GNU 系统是彻底的自由软件。此处,“自由” 的含义是它尊重用户的自由 。

GCC 是以 GPL 许可证所发行的自由软件,也是 GNU 计划的关键部分。GCC 的初衷是为 GNU 操作系统专门编写一款编译器,现已被大多数类 Unix 操作系统(如 Linux、BSD、Mac OS X 等)采纳为标准的编译器,甚至在微软的 Windows 上也可以使用 GCC。GCC 支持多种计算机体系结构芯片,如 x86、ARM、MIPS 等,并已被移植到其他多种硬件平台。其原名为 GNU C 语言编译器(GNU C Compiler),只能处理 C 语言。但其很快扩展,变得可处理 C++,后来又扩展为能够支持更多编程语言,如 Fortran、Pascal、Objective -C、Java、Ada、Go 以及各类处理器架构上的汇编语言等,所以改名 GNU 编译器套件(GNU Compiler Collection)。

Linux 程序员可以根据自己的需要让 GCC 在编译的任何阶段结束,检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。与其他常用的编译器一样,GCC 也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。它提供了 30 多条警告信息和 3 个警告级别,使用它们有助于增强程序的稳定性和可移植性。此外,GCC 还对标准的 C/C++ 语言进行了大量的扩展,提高了程序的执行效率,有助于编译器进行代码优化,能够减轻编程的工作量。


最新版本:6.1
该版本较之前GCC5 新怎了大量的功能特性,默认采用C++14为新的标准,替代了之前的C++98。OpenMP 4.5规范将在本版本中被支持。此外 GCC 6.1 增强了对 C++17 的试验性支持;大大改进了诊断特性,包括位置,位置范围,拼写错误标识符建议,选项名字等等改进;新增了修复提示和一些警告提示。可以在完整发布说明里查看。

最新版本:8.1
GCC 8.1 发布,该版本是一个主要版本,包含了一些新功能以及其它许多功能增强。C++前端现在已经为即将推出的 C++2a 草案中的一些部分提供了实验性支持,同时 -std = c++2a 和 -std = gnu++2a 选项,以及 libstdc ++ 库还有一些 C++17 和 C++2a 草稿库特性也实现了。此版本在诊断功能方面具有显着的改进,包括位置、位置范围和 fix-it 提示(特别是 在C++前端),并添加了各种新的警告。配置文件驱动的优化得到了显着改善,现在在x86上功能默认分为热区和冷区。链接时间优化现在有一种发布 DWARF 调试信息的新方法,这使得 LTO 优化的代码更具可调试性。新的循环优化器也做了一些改进与新增特性,像 -ftree-loop-distribution、-floop-unroll-and-jam 和 -floop-interchange 在默认情况下已启用 -O3。

AArch64 目标现在支持可伸缩向量扩展,以运行时确定的元素数量为特征向量。同时有一些需要注意的事项:
已删除支持过时的 SDB / coff 调试信息格式,选项 -gcoff 不再执行任何操作。
C 和 C++ 的 Cilk+ 扩展已被删除。
C 和 C++ 的 MPX 扩展已被弃用,并将在未来版本中删除。
std::atomic<void*> 扩展和类似 std::atomic<R(*)()> 的输入方式已经被弃用。
非标准的 C++0x std :: copy_exception 函数已经被删除,使用 std :: make_exception_ptr 来替换。
GCC 8 已经宣布废弃最近未在 GCC 中维护且未经测试的 powerpc*-*-*spe* 目标端口,除非有活动来恢复它们,否则 GCC 的下一个版本将永久删除它们的源代码。
详情见发行公告

最新版本:8.3
GCC 8.3 是 GCC 8 分支的 bug 修复版本,其中包含对 GCC 8.2 中的回归和严重 bug 的重要修复,自上一版本以来修复了超过 153 个错误。新版更新主要是针对 Windows 操作系统的一个 C++ Microsoft ABI 位阈布局(bitfield layout)Bug 的修复(PR87137)。GCC 8 介绍了这缺陷的额外案例。开发团队决定在单个改动中解决掉这个缺陷的所有案例,而不是只解决掉那些回归。详情可以查看更新日志

最新版本:11.0
从 GCC 9 开始,对 C++ 17 的支持已经不再是实验性质,C++ 前端实现了完整的 C++ 17 语言,并且 C++ 标准库支持几乎也完成了(不过目前还有两个库特性有待完善)。目前在 GCC 中,当不指定任何版本 C++ 标准时,默认版本是 C++ 14(从 GCC 6.1 开始)。但是随着 GCC 对 C++ 17 的支持现在已经有一年以上的成熟期,并且 GCC 11 将于明年发布,开发团队认为是时候将 C++ 17 用作 GCC 11 的默认前端了。虽然可以在 GCC 10 中进行此更改,但是它已经进入周期的后期阶段,没有太多时间来解决可能出现的任何后果;而虽然 GCC 已经在不断支持 C++ 2a/C++ 20,但目前要进行默认的转换还为时过早。2020年6月26 日,GCC 11 源码中已经将 C++ 17 更改为默认前端语言。C++ 17 有许多新的特性,包括:删除 trigraphs、在模板参数中允许使用 typename(作为替代类)、来自 braced-init-list 的新规则用于自动推导、UTF-8 字符文字与一些用于对齐内存分配的扩展等,迁移到 C++ 17 对于 GCC 与开发者来说有众多优势。

2021年11上旬消息,GCC 12 编译器现已支持 -march=armv9-a,以针对即将推出的 Armv9-A ISA。ARMv8 已经发布了近 10 年时间,其主要特点是增加对 64 位指令集的支持,包括目前性能最强的 Cortex-X1/A78,都是基于 ARMv8.x 指令集打造。而在今年 3 月,ARM 正式推出 ARMv9 指令集,在兼容 ARMv8 的基础上,提升处理器性能,同时提升安全性、增强矢量计算、机器学习及数字信号处理。而基于 ARMv9 开发的处理器预计将在 2022 年初正式商用。

因此,开源代码编译器一直在为这种处理器做准备,包括 LLVM/Clang、从 Binutils 到 GNU Compiler Collection 的 GNU 工具链也一直在准备他们的新代码。GCC 12 已经达到了可以使用 -march=armv9-a 的阶段,该命令可以支持 ARMv9-A ISA 并启用可用的新指令。目前,调试基于现有的 ARMv8 Cortex-A53 进行。这是支持下一代 Arm 架构的一个重要步骤。据悉,GCC 12 的第一个稳定版本 GCC 12.1 应该在 2022 年第二季度推出,目前其功能开发开始逐渐减少,并专注于错误修复。但鉴于回归的风险很低,因此仍有可能在明年的发布之前看到更多的 ARMv9 相关功能。

GCC 11.4 作为修复版本于2023年5月下旬发布了 ,修复了大量社区报告的问题。11.3 在一年多之前发布,因此 GCC 11.4 覆盖了 2022 至今的向后移植错误/回归修复内容。修复的问题主要是一些 C 复合体代码的编译时间较长、特定条件下的编译错误问题、一些类型处理错误问题。相关Bugs在此不一一列举,可以在 GCCv11.4 Bugzilla 中查看所有修复项。可以在 gcc 官网下载。但对于那些想要最新编译器功能、扩展 CPU 支持和优化的人来说,更推荐使用 GCC 13.1 版本,GCC 13.1 拥有如 Modula-2 语言前端等最新功能。


最新版本:12.1
2022年5月是 GCC 1.0 发布的 35 周年,同时 GCC 12.1 也已正式发布,GCC 12.1 是一个重要的功能版本,包含新的 C/C++ 功能到 Fortran 和 Ada 等其他语言的持续工作,支持跨多个架构的最新 CPU 和 ISA 功能,并推进 GCC 的最新功能如内置静态分析器和 JIT 库。一些亮点包括:
继续为编译器和 C++ 标准库分别支持 C2X 和 C++23 以及 C 和 C++ 的下一版本。C2X 和 C++23 支持仍被视为实验性的。C++20 libstdc++ 支持也得到了改进,但仍处于试验阶段。
GCC 12 支持新 Intel CPU 的 AVX-512 FP16 支持。
改进了对 OpenMP 5.0 的支持,添加了各种功能。一些 OpenMP 5.1 功能也已到位。
OpenACC 2.6 支持得到改进,包括 AMD GPU 的工作并行性。
在面向前端的 AMD Radeon GCN 上,解决了每个计算单元只能使用一个波前的限制 - 现在每个 CU 最多支持 40 个工作组,每个工作组支持 16 个波前。
与各种 Ada 扩展一起实现的 Ada 2022 语言功能。
GCC 的 RISC-V CPU 支持改进,现在支持各种新的指令集扩展。RISC-V 的向量和标量加密扩展与 zba、zbb、zbc 和 zbs 一起添加。
新的 Arm CPU 目标包括 Cortex-A510、Ampere-1、Cortex-A710 和 Cortex-X2。
现在在 -O2 优化级别启用矢量化,使用非常便宜的成本模型来提高常用优化级别的性能。
GCC JIT 库 (libgccjit) 已通过各种新入口点和新功能得到进一步改进。
新的 -ftrivial-auto-var-init 允许隐式初始化堆栈变量,以增强安全性。
GCC 12 编译器提供 x86 直线推测 (SLS) 缓解支持。Linux 内核已准备好使用这个新的安全选项。
GCC 的 Fortran "gfortran" 前端现在完全支持 TS 29113 以实现与 C 编程语言的互操作性。TS 29113 是提高 Fortran 与 C 的互操作性的技术规范。
GCC 的静态分析器通过许多新的警告和功能继续得到改进。
点击此处查看更多 GCC 12 的更改内容。

GCC 13 新增 Ampere-1A CPU 支持

CPU 供应商 Ampere Computing 于2022年11月中旬宣布将 AmpereOne 作为其下一代 AArch64 “云原生” 服务器 CPU 品牌,以取代目前基于 Neoverse-N1 的 Ampere Altra/Ampere Altra Max 处理器。2021年11月,当时 Ampere Computing 其将下一代服务器处理器 “Ampere1” 的支持补丁添加到 GCC,确认 Ampere1 处理器正在使用基于 ARMv8.6 的 ISA 和其他基本功能,随后又将  Ampere1 CPU 支持添加到 LLVM 中。虽然 AmpereOne 处理器尚未正式推出,新的 AArch64 核心还是一个原始设计,但 Ampere Computing 已经向 GCC 编译器提交了支持补丁,以支持其最新的 “Ampere-1A” 变体型号。


现在 GCC 13 合并窗口引入了 “ampere-1a”,作为新的 CPU 目标。据外媒 Phoronix 介绍,Ampere-1A 有一个更新的指令表、一个新的融合对(A + B + 1 和 A - B - 1),且具有与 Ampere-1(非 A)不同的处理器 ID,和 Ampere-1 比 extra 有更多的时序差异。与 Ampere-1 不同,Ampere-1A 支持 AArch64 的内存标记扩展 (MTE)。在邮件中可以阅读更多细节,Ampere Computing 尚未公布 “Ampere-1A”  CPU 的详细信息,提前发布编译器补丁只是为了将其纳入下一个年度编译器版本 GCC 13。该 CPU 对标的应该是 AMD EPYC Genoa/Bergamo ,以及即将推出的 Intel Xeon Sapphire Rapids

GCC 13 中将不会引入对 Rust 的支持

2023年4月消息,第一个官方 GCC 13 版本即将发布,但 GCC 的 Rust 前端项目 gccrs 却不会如期出现在此版本中。2022年12月,Gccrs 被批准合并到 GCC 主线,所有 gccrs 代码也都被合并到了 GCC 13 上游代码库中。但时至今日,编译器仍未就支持 Rust 做好准备。开发人员 Philip Herron 和 Arthur Cohen 发文解释称:

我们的期望是,通过明确表示编译器仍未为真正的 Rust 代码做好准备;可以从早期用户那里得到有价值的反馈,以及来自两个不同社区(Rust 社区和 GCC 社区)的更多参与。我们计划在最后的发布期限之前尽可能的完成更多工作,但现在 GCC 13.1 版本已经来临,我们在完整性方面仍然没有达到目标。这意味着当使用 gccrs 时,你仍然无法实现如 “Hello World!” 之类的 “easy Rust things”,也不能使用常用的标准库。同样,对于 Rust 编程语言必不可少的更复杂的概念(如 borrow-checking)也尚未实现;如果没有这些功能, gccrs 将不会被认为是完整的。我们认为这会给不知情的用户带来很多困惑,他们可能会将 gccrs 视为官方 GCC 版本的一部分,并期望得到一个可用的编译器。

公告指出,gccrs 未在 GCC 13 中准备好,跟 Rust 本身 “nothing will work, unless everything works” 的严格设计脱不了干系。Rust 标准库可以被看作是几个相互依赖的 crates,其中两个主要组成部分是 core 和 alloc。就目前而言,gccrs 还不能编译其目标版本的 core crate;虽然 Philip 正在推进该方面的工作,但这一落后还是 “严重影响了我们的类型系统和编译器中的第二个中间表示”。另一方面,尽管开发人员旨在以 Rust 1.49 版本的核心库为目标,但也需要实现那些在 Rust 的后期版本中才稳定下来 (或者说至今仍可能是不稳定的) 的功能。为此,开发人员需要进行大量的调查工作。其举例称,用户可能希望 gccrs 处理这样一个代码片段:
fn main() {
    println!("Hello, world!");
}

但 gccrs 目前根本不能实现。“如果你对 Rust 有一点了解,你就会知道 println! 是一个宏调用。宏是很复杂的,但也是非常强大的。我们已经对它们进行了一段时间的研究,一些更复杂的功能仍未正确实现...... 虽然所有这些看起来都很容易理解和使用,但 Rust 编译器必须做很多工作来处理这些宏调用!”

值得一提的是,开发团队最近也开始了 Rust 过程宏 (Procedural Macros) 的相关工作,由 Pierre-Emmanuel Patry 领导。Philip 和 Arthur 在公告中表示,虽然没能赶上 GCC 13 的发布,但他们依然对 gccrs 未来的进展充满信心。该团队计划在未来几个月里专注于 core crate 以及 borrow-checker 的实现,并开发一些必要的工具来尝试并通过 Rust 1.49 testsuite。其目标是在下一个主要的 GCC 版本 (即 GCC 14) 中,将 Rust 1.49 版本的标准库与编译器一起发布,并希望向后移植足够多的更改到 GCC 13 分支,以便在 GCC 13.2 发布时使 core crate 能正常运行。这将使用户能够轻松地开始为 #![no_std] Rust 程序和一些嵌入式目标尝试编译器。

我们已经花费了大量时间完成与 GCC 上游的初步合并,这是一项不需要重复的工作。使得我们能够更加专注于 GCC 14 的编译器开发,并能够轻松地将补丁推送到上游。这段时间将用于生产更高质量的编译器,并有望接近一个真正的 Rust 编译器。这也提高了项目的知名度,有许多文章都是关于我们对上游的各种推动。将继续努力为 GCC 制作一个高质量的 Rust 编译器前端,并将坚持我们现有的原则:我们要尊重 Rust 编程语言,不以任何 way、shape 或 form 伤害它。gccrs 的目标不是要规避围绕 Rust 语言的各种程序,也不是为那些应该是无效的 Rust 代码提供一个 escape hatch。我们以 rustc 为指导,并将继续把这两个编译器之间的每一个差异视为 bug。

此外还邀请更多有志之士加入其核心团队,或者提供一些赞助。更多详情可查看完整公告


GCC 13.1 已作为 GCC 13 的第一个稳定版本于2023年4月下旬发布。这是一个重大更新,集成了 Modula-2 语言前端,并为计划将来发布的 Rust 语言前端奠定了基础。静态分析器继续被改进,有了 20 个新的诊断功能。更多的 C23 和 C++23 功能被连接起来,C++ 标准库对 C++20 和 C++23 的实验性支持得到了加强。 对于 C 语言家族,你现在可以使用 -fstrict-flex-arrays [=level] 来控制指定灵活数组成员的 legacy forms。

支持了许多新的 x86_64 / RISC-V / AArch64 处理器。还为 Ryzen 7000 系列和 EPYC 9004 系列处理器提供初始 AMD Zen 4 (znver4) 支持、OpenMP 卸载改进、支持以基于 JSON 的 SARIF 格式发出诊断、Ada 2022 添加、各种新的 C/C++  warnings、支持对于 AMD GCN 后端的 AMD Instinct MI200 系列、支持 Ampere-1A,支持 Neoverse-V2 / Cortex-X3 / Cortex-X1C / Cortex-A715,并支持许多新的 Intel CPU。

GCC 13 为 Raptor Lake、Meteor Lake、Sierra Forest、Grand Ridge、Emerald Rapids 和 Granite Rapids 添加了 Intel CPU targets,以及相关的新 Intel CPU 指令集扩展,如 AMX-FP16、AVX-IFMA、AVX-VNNI-INT8、AVX -NE-CONVERT、RAO-INT 和 AMX-COMPLEX。更多详情可查看完整更改列表