发布 GCC 12 编译器套件

经过一年的开发,免费编译器套件 GCC 12.1 已经发布,这是新的 GCC 12.x 分支中的第一个重要版本。 按照新的版本编号方案,开发过程中使用了12.0版本,在GCC 12.1发布前不久,GCC 13.0分支已经分支出来,在此基础上下一个主要版本GCC 13.1将被形成。 23 月 35 日,该项目将庆祝第一届 GCC 成立 XNUMX 周年。

主要变化:

  • 添加了对 CTF(紧凑类型格式)调试格式的支持,该格式提供有关 C 类型、函数之间的连接和调试符号的信息的紧凑存储。 当嵌入 ELF 对象中时,该格式允许使用 EFL 字符表来避免数据重复。
  • 对 1980 世纪 XNUMX 年代创建的“STABS”调试信息存储格式的支持已被弃用。
  • 继续努力扩展对 C 和 C++ 语言的未来 C2X 和 C++23 标准的支持。 例如,添加了对“if consteval”表达式的支持; 允许在函数参数中使用 auto (“f(auto(g()))”); 在声明为 constexpr 的函数中允许使用非文字变量、goto 和标签; 添加了对多维索引运算符operator[]的支持; 在 if、for 和 switch 中,初始化块的功能得到了扩展(“for (using T = int; T e : v)”)。
  • C++ 标准库改进了对 C++20 和 C++23 标准实验部分的支持。 添加了对 std::move_only_function 的支持, ,std::basic_string::resize_and_overwrite, , 和 std::invoke_r。 允许在 constexpr 函数中使用 std::unique_ptr、std::vector、std::basic_string、std::optional 和 std::variant。
  • Fortran 前端提供对 TS 29113 规范的全面支持,该规范描述了确保 Fortran 和 C 代码之间可移植性的功能。
  • 添加了对之前添加到 Clang 的 __builtin_shufflevector(vec1, vec2, index1, index2, ...) 扩展的支持,它提供了一个调用来执行常见的向量洗牌和洗牌操作。
  • 使用“-O2”优化级别时,默认启用矢量化(启用 -ftree-vectorize 和 -fvect-cost-model=very-cheap 模式)。 仅当矢量代码可以完全替代正在矢量化的标量代码时,非常便宜的模型才允许矢量化。
  • 添加了“-ftrivial-auto-var-init”模式,以启用堆栈上变量的显式初始化,以跟踪问题并阻止与使用未初始化变量相关的漏洞。
  • 对于 C 和 C++ 语言,添加了内置函数 __builtin_dynamic_object_size 来确定对象的大小,与 Clang 中的类似函数兼容。
  • 对于 C 和 C++ 语言,添加了对“不可用”属性的支持(例如,您可以标记在尝试使用时将生成错误的函数)。
  • 对于 C 和 C++ 语言,添加了对预处理指令“#elifdef”和“#elifndef”的支持。
  • 添加了“-Wbidi-chars”标志,以便在 UTF-8 字符使用不正确时显示警告,从而更改双向文本的显示顺序。
  • 添加了“-Warray-compare”标志,以在尝试比较引用数组的两个操作数时显示警告。
  • OpenMP 5.0 和 5.1(开放式多处理)标准的实施,定义了在具有共享内存和矢量化单元 (SIMD) 的多核和混合 (CPU+GPU/DSP) 系统上应用并行编程方法的 API 和方法,一直持续着。
  • 改进了 OpenACC 2.6 并行编程规范的实现,该规范定义了用于在 GPU 和专用处理器(例如 NVIDIA PTX)上卸载操作的工具。
  • x86 架构的代码生成后端添加了对扩展指令 Intel AVX512-FP16 和 _Float16 类型的支持。
  • 对于 x86 架构,增加了针对无条件向前跳转操作后推测执行指令所导致的处理器漏洞的保护。 该问题的发生是由于抢占式处理内存中紧随分支指令之后的指令(SLS,直线推测)所致。 为了启用保护,建议使用“-mharden-sls”选项。
  • 在实验静态分析器中添加了对未初始化变量的使用的检测。 添加了对分析内联插入中的汇编代码的初始支持。 改进了内存跟踪。 处理 switch 表达式的代码已被重写。
  • 添加了 30 个对 libgccjit 的新调用,libgccjit 是一个共享库,用于将代码生成器嵌入到其他进程中,并使用它将字节码 JIT 编译为机器代码。
  • 后端添加了对CO-RE(Compile Once - Run Everywhere)机制的支持,用于生成BPF字节码,这使得您只需为Linux内核编译一次eBPF程序的代码,并使用适应Linux内核的特殊通用加载器将程序加载到当前内核和 BPF 类型格式)。 CO-RE 解决了编译后的 eBPF 程序的可移植性问题,以前这些程序只能在编译它们的内核版本中使用,因为数据结构中元素的位置随着版本的不同而变化。
  • RISC-V 后端增加了对新指令集架构扩展 zba、zbb、zbc 和 zbs 的支持,以及针对向量和标量加密操作的 ISA 扩展。 默认情况下,提供对 RISC-V ISA 20191213 规范的支持。已添加 -mtune=thead-c906 标志以启用 T-HEAD c906 内核的优化。
  • 基于 GCN 微架构的 AMD GPU 的代码生成后端添加了对 __int128_t/integer(kind=16) 类型的支持。 每个计算单元 (CU) 最多可以使用 40 个工作组,每组最多可以使用 16 个指令前端(波前,一组由 SIMD 引擎并行执行的线程)。 以前,每个 CU 只允许有一个指令沿。
  • NVPTX 后端旨在使用 NVIDIA PTX(并行线程执行)指令集架构生成代码,增加了使用“-march”、“-mptx”和“-march-map”标志的功能。 实现了对 PTX ISA sm_53、sm_70、sm_75 和 sm_80 的支持。 默认架构是 sm_30。
  • 在PowerPC / PowerPC64 / RS6000处理器的后端,内置函数的实现已被重写。 内置函数 __builtin_get_texasr、__builtin_get_texasru、__builtin_get_tfhar、__builtin_get_tfiar、__builtin_set_texasr、__builtin_set_texasru、__builtin_set_tfhar 和 __builtin_set_tfiar 均已记录。
  • 支持 Arm Ampere-64 (-mcpu/-mtune ampere1)、Arm Cortex-A1 (cortex-a510)、Arm Cortex-A510 (cortex-a710) 和 Arm Cortex-X710 (cortex-x2)。 添加了对新 ARMv2 架构选项的支持,以便与“-march”选项一起使用:armv8-a、armv8.7-a、armv8.8-a。 基于扩展 ARM 指令 (ls9) 的使用,添加了内置于编译器 (Intrinsics) 中的 C 函数的实现,用于原子加载数据并将数据保存到内存中。 添加了对使用 mopsoption ARM 扩展加速 memcpy、memmove 和 memset 函数的支持。
  • 添加了新的检查模式“-fsanitize=shadow-call-stack”(ShadowCallStack),该模式目前仅适用于 AArch64 架构,并且在使用“-ffixed-r18”选项构建代码时有效。 该模式提供保护,防止在堆栈上发生缓冲区溢出时覆盖函数的返回地址。 保护的本质是在将控制权转移给函数之后将返回地址保存在单独的“影子”堆栈中,并在退出函数之前检索该地址。

来源: opennet.ru

添加评论