发布 GCC 13 编译器套件

经过一年的开发,免费的 GCC 13.1 编译器套件已经发布,这是新的 GCC 13.x 分支中的第一个重要版本。 根据新的版本编号方案,开发过程中使用了版本 13.0,在 GCC 13.1 发布之前不久,GCC 14.0 分支已经分叉,GCC 14.1 的下一个重要版本将由此形成。

主要变化:

  • GCC 采用了使用 Modula-2 编程语言构建程序的前端。 它支持符合 PIM2、PIM3 和 PIM4 方言以及该语言公认的 ISO 标准的构建代码。
  • 由 gccrs 项目 (GCC Rust) 准备的 Rust 语言编译器实现的前端已添加到 GCC 源代码树中。 在当前视图中,前后端被标记为实验性的,并且默认情况下处于禁用状态。 一旦前端准备就绪(预计在下一个版本中),就可以使用标准 GCC 工具包来编译 Rust 程序,而无需安装使用 LLVM 开发构建的 rustc 编译器。
  • 步步链接优化 (LTO) 添加了对 GNU make 项目维护的作业服务器 (jobserver) 的支持,以优化跨多个线程的并行构建执行。 在 GCC 中,作业服务器用于在整个程序(WPA,全程序分析)上下文中并行化 LTO 优化期间的工作。 默认情况下使用命名管道 (--jobserver-style=fifo) 与作业服务器进行通信。
  • 静态分析器 (-fanalyzer) 提供 20 种新的诊断检查,包括“-Wanalyzer-out-of-bounds”、“-Wanalyzer-allocation-size”、“-Wanalyzer-deref-before-check”、“-Wanalyzer-infinite-recursion”、“-Wanalyzer-jump-through-null”、“-Wanalyzer-va-list-leak”。
  • 已实现基于 JSON 以 SARIF 格式输出诊断信息的功能。 新格式可用于获取静态分析结果(GCC -fanalyzer),以及获取有关警告和错误的信息。 使用选项“-fdiagnostics-format=sarif-stderr|sarif-file|json-stderr|json|json-file”完成启用,其中带有“json”的选项会导致输出为 GCC 特定的 JSON 格式变体。
  • 实现了 C23 C 标准中定义的一些功能,例如用于定义空指针的 nullptr 常量,更容易使用具有可变数量参数(可变参数)的列表,扩展枚举的功能,noreturn 属性,允许在定义对象时使用 constexpr 和 auto,typeof 和 typeof_unqual 运算符,新关键字alignas、alignof、bool、false、static_assert、thread_local 和 true,在初始化时允许使用空括号。
  • 实现了 C++23 标准中定义的一些功能,例如在复合表达式末尾放置标签的能力、与 char8_t 类型的兼容性、#warning 预处理器指令、分隔 (\u{}、\o{}、\x{}) 和命名 ('\N{LATIN CAPITAL LETTER A}') 转义序列、静态运算符()、静态运算符[]、表达式内部的相等运算符、对 con stexpr 使用的一些限制的例外、源代码中对 UTF-8 的支持代码。
  • libstdc++ 改进了对 C++20 和 C++23 标准的实验性支持,例如添加头文件支持和 std::format,扩展头文件功能,添加了额外的浮点类型,实现了头文件和。
  • 添加了新的函数属性来记录文件描述符在整型变量中传递:“__attribute__((fd_arg(N)))”、“__attribute__((fd_arg_read(N)))”和“__attribute__((fd_arg_write(N)))”。 指定的属性可以在静态分析器 (-fanalyzer) 中使用来检测文件描述符的不正确工作。
  • 添加了新属性“__attribute__((assume(EXPR)))”,您可以使用该属性告诉编译器该表达式为真,并且编译器可以使用此事实而无需评估该表达式。
  • 添加了“-fstrict-flex-arrays=[level]”标志以在处理结构中的灵活数组元素(灵活数组成员,结构末尾的不定大小数组,例如“int b[]”)时选择行为。
  • 添加了“-Wenum-int-mismatch”标志,以便在枚举类型和整数类型之间不匹配时发出警告。
  • Fortran 前端完全支持最终化。
  • Go语言前端增加了对泛型函数和类型(泛型)的支持,并确保了与Go 1.18语言包的兼容性。
  • AArch64 后端支持 CPU Ampere-1A (ampere1a)、Arm Cortex-A715 (cortex-a715)、Arm Cortex-X1C (cortex-x1c)、Arm Cortex-X3 (cortex-x3) 和 Arm Neoverse V2 (neoverse-v2)。 “-march=”选项中添加了对“armv9.1-a”、“armv9.2-a”和“armv9.3-a”参数的支持。 添加了对 FEAT_LRCPC、FEAT_CSSC 和 FEAT_LSE2 处理器扩展的支持。
  • ARM 架构后端添加了对 STAR-MC1 (star-mc1)、Arm Cortex-X1C (cortex-x1c) 和 Arm Cortex-M85 (cortex-m85) CPU 的支持。
  • x86 后端添加了对 Intel Raptor Lake、Meteor Lake、Sierra Forest、Grand Ridge、Emerald Rapids、Granite Rapids 和 AMD Zen 4 (znver4) 处理器的支持。 Intel 处理器中提出的 AVX-IFMA、AVX-VNNI-INT8、AVX-NE-CONVERT、CMPccXADD、AMX-FP16、PREFETCHI、RAO-INT 和 AMX-COMPLEX 指令集架构扩展已得到实现。 对于具有 SSE2 的系统上的 C 和 C++,提供了 __bf16 类型。
  • AMD Radeon GPU (GCN) 的代码生成后端实现了使用 AMD Instinct MI200 加速器来提高 OpenMP/OpenACC 性能的功能。 使用 SIMD 指令改进矢量化。
  • 显着扩展了 LoongArch 平台的后端功能。
  • 在 RISC-V 后端添加了对 CPU T-Head 的玄铁 C906 (thead-c906) 的支持。 实现了对 RISC-V Vector Extension Intrinsic 0.11 规范中定义的向量处理程序的支持。 添加了对 30 个 RISC-V 规范扩展的支持。
  • 使用“-shared”选项生成共享对象时,如果启用了“-Ofast”、“-ffast-math”或“-funsafe-math-optimizations”优化,则在添加浮点环境后不再添加启动代码。
  • 几乎所有配置都实现了对 DWARF 调试格式的支持。
  • 添加了“-gz=zstd”选项以使用 Zstandard 算法压缩调试信息。 删除了对已弃用的调试信息压缩模式“-gz=zlib-gnu”的支持。
  • 添加了对 OpenMP 5.2(开放式多处理)的初步支持,并继续实施 OpenMP 5.0 和 5.1 标准,定义了在具有共享内存和矢量化单元 (SIMD) 的多核和混合 (CPU + GPU / DSP) 系统上应用并行编程方法的 API 和方法。
  • 不再支持旧版 STABS 调试信息存储格式(通过 -gstabs 和 -gxcoff 选项启用),该格式创建于 1980 世纪 XNUMX 年代并在 dbx 调试器中使用。
  • 已弃用对 Solaris 11.3 的支持(支持该平台的代码将在未来版本中删除)。

来源: opennet.ru

添加评论