发布 GCC 11 编译器套件

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

GCC 11.1 值得注意的是默认情况下过渡到使用 DWARF 5 调试文件格式、默认包含 C++17 标准(“-std=gnu++17”)、对 C++20 支持的显着改进标准、对 C++23 的实验性支持、与未来 C 语言标准 (C2x) 相关的改进、新的性能优化。

主要变化:

  • C++ 语言的默认模式已切换为使用 C++17 标准 (-std=gnu++17),而不是之前提供的 C++14。 在处理使用其他模板作为参数的模板时,可以有选择地禁用新的 C++17 行为 (-fno-new-ttp-matching)。
  • 添加了对 AddressSanitizer 工具硬件加速的支持,该工具允许您确定访问已释放内存区域、超出已分配缓冲区边界的事实以及使用内存时出现的一些其他类型的错误。 硬件加速目前仅适用于AArch64架构,并且重点在编译Linux内核时使用。 为了在构建用户空间组件时启用 AddressSanitizer 硬件加速,添加了标志“-fsanitize=hwaddress”,以及内核标志“-fsanitize=kernel-hwaddress”。
  • 生成调试信息时,默认使用 DWARF 5 格式,与之前的版本相比,可以生成紧凑 25% 的调试数据。 对 DWARF 5 的完全支持至少需要 binutils 版本 2.35.2。 从 GDB 5、valgrind 8.0、elfutils 3.17.0 和 dwz 0.172 开始,调试工具支持 DWARF 0.14 格式。 要使用其他版本的 DWARF 生成调试文件,可以使用选项“-gdwarf-2”、“-gdwarf-3”和“-gdwarf-4”。
  • 对可用于构建 GCC 的编译器的要求已提高。 编译器现在必须支持 C++11 标准(之前需要 C++98),即如果 GCC 10 足以构建 GCC 3.4,那么现在至少需要 GCC 11 才能构建 GCC 4.8。
  • 用于保存转储、临时文件和 LTO 优化所需的附加信息的文件的名称和位置已更改。 此类文件现在始终保存在当前目录中,除非通过“-dumpbase”、“-dumpdir”和“-save-temps=*”选项显式更改路径。
  • 对与 HSAIL(异构系统架构中间语言)语言一起使用的二进制格式 BRIG 的支持已被弃用,并将很快被删除。
  • ThreadSanitizer 模式 (-fsanitize=thread) 的功能已得到扩展,旨在在从多线程应用程序的不同线程共享相同数据时检测竞争条件。 新版本增加了对替代运行时和环境的支持,以及对 KCSAN(内核并发清理器)调试工具的支持,该工具旨在动态检测 Linux 内核中的竞争条件。 添加了新选项“-param tsan-distinguish-volatile”和“-param tsan-instrument-func-entry-exit”。
  • 诊断消息中的列号现在反映的不是从行开头开始的字节计数,而是实际上考虑了多字节字符和占据行中多个位置的字符的列号(例如,字符 🙂 占据两个位置和以 4 个字节编码)。 同样,制表符现在被视为一定数量的空格(可通过 -ftabstop 选项配置,默认为 8)。 为了恢复旧的行为,建议使用“-fdiagnostics-column-unit=byte”选项,并确定初始值(从0或1开始编号)-“-fdiagnostics-column-origin=”选项。
  • 矢量化器考虑了函数的全部内容,并添加了与控制流图(CFG,控制流图)中先前块的交叉点和引用相关的处理功能。
  • 优化器实现了将一系列比较相同变量的条件操作转换为 switch 表达式的能力。 稍后可以使用位测试指令对 switch 表达式进行编码(已添加“-fbit-tests”选项来控制此类转换)。
  • 改进了过程间优化。 添加了新的 IPA-modref 通道 (-fipa-modref) 以跟踪调用函数时的副作用并提高分析的准确性。 改进了 IPA-ICF 通道 (-fipa-icf) 的实现,减少了编译期间的内存消耗,并增加了组合相同代码块的统一函数的数量。 在 IPA-CP(过程间常数传播)过程中,考虑到循环的已知边界和特征,预测启发式得到了改进。
  • 在链接时间优化 (LTO) 中,字节码格式经过优化以减小大小并提高处理速度。 减少了绑定阶段的峰值内存消耗。
  • 在基于代码分析结果的优化机制(PGO - Profile-guided optimization)中,允许根据执行特征的分析生成更优化的代码,由于零计数器的封装更加紧凑,因此具有 GCOV 数据的文件的大小减小了。 通过跟踪间接调用的更多参数改进了“-fprofile-values”模式。
  • OpenMP 5.0(开放式多处理)标准的实施定义了在具有共享内存和矢量化单元(SIMD)的多核和混合(CPU+GPU/DSP)系统上应用并行编程方法的 API 和方法,继续。 添加了对分配指令的初始支持以及在 OpenMP 构造中使用异构循环的能力。 实现了对 OMP_TARGET_OFFLOAD 环境变量的支持。
  • 为C、C++和Fortran语言提供的OpenACC 2.6并行编程规范的实现得到了改进,它定义了用于在GPU和专用处理器(例如NVIDIA PTX)上卸载操作的工具。
  • 对于 C 语言,实现了一个新属性“no_stack_protector”,旨在标记不应启用堆栈保护的函数(“-fstack-protector”)。 “malloc”属性已扩展为支持识别分配和释放内存(分配器/释放器)的调用对,它在静态分析器中用于识别使用内存时的典型错误(内存泄漏、释放后使用、对 free 函数的双重调用等)以及编译器警告“-Wmismatched-dealloc”、“-Wmismatched-new-delete”和“-Wfree-nonheap-object”,通知内存释放和内存分配操作之间的不一致。
  • 为 C 语言添加了新的警告:
    • “-Wmismatched-dealloc”(默认启用)- 警告使用与内存分配函数不兼容的指针的内存释放操作。
    • “-Wsizeof-array-div”(指定“-Wall”时启用) - 如果除数与数组元素的大小不匹配,则警告有关除法两个 sizeof 运算符的警告。
    • “-Wstringop-overread”(默认启用)- 警告调用从数组边界之外的区域读取数据的字符串函数。
    • “-Wtsan”(默认启用)- 警告使用 ThreadSanitizer 不支持的功能(例如 std::atomic_thread_fence)。
    • “-Warray-parameter”和“-Wvla-parameter”(指定“-Wall”时启用) - 警告使用与固定长度和可变长度数组关联的参数的不兼容声明来覆盖函数。
    • “-Wuninitialized”警告现在可以检测读取未初始化的动态分配内存的尝试。
    • “-Wfree-nonheap-object”警告扩展了使用不是通过动态内存分配函数获得的指针调用内存释放函数的情况的定义。
    • “-Wmaybe-uninitialized”警告扩展了对将指针传递给引用未初始化内存位置的函数的检测。
  • 对于 C 语言,已经实现了在 C2X 标准框架内开发的部分新功能(通过指定 -std=c2x 和 -std=gnu2x 启用):宏 BOOL_MAX 和 BOOL_WIDTH,函数中未使用参数名称的可选指示定义(如 C++ 中)、属性“[ [nodiscard]]”、预处理器运算符“__has_c_attribute”、宏 FLT_IS_IEC_60559、DBL_IS_IEC_60559、LDBL_IS_IEC_60559、__STDC_WANT_IEC_60559_EXT__、INFINITY、NAN、FLT_SNAN、DBL_SNAN、LDBL_SNAN、 DEC_INFINITY 和 DEC_NAN,NaN=FloatN 的宏、_FloatNx 和 _DecimalN,能够在声明之前和复合语句末尾指定跳转标记。
  • 对于C++来说,已经实现了C++20标准中提出的部分改变和创新,包括虚拟函数“consteval virtual”、用于结束对象生命周期的伪析构函数、枚举类和计算“new”表达式中数组的大小。
  • 对于 C++,添加了对为未来 C++23 标准开发的一些改进的实验支持(-std=c++23、-std=gnu++23、-std=c++2b、-std=gnu ++2b)。 例如,现在支持带符号的 size_t 值的文字后缀“zu”。
  • libstdc++ 改进了对 C++17 标准的支持,包括引入浮点类型的 std::from_chars 和 std::to_chars 实现。 C++20 标准的新元素已实现,包括 std::bit_cast、std::source_location、原子操作等待和通知、 , , , ,以及未来 C++23 标准的元素(std::to_underlying、std::is_scoped_enum)。 添加了对并行数据处理类型(SIMD、数据并行类型)的实验支持。 std::uniform_int_distribution 的实现已加速。
  • 从 libgccjit 中删除了 alpha 质量标志,libgccjit 是一个共享库,用于将代码生成器嵌入到其他进程中,并使用它来将字节码的 JIT 编译组织为机器代码。 添加了为 MinGW 构建 libgccjit 的功能。
  • 添加了对 AArch64 Armv8-R 架构 (-march=armv8-r) 的支持。 对于 AArch64 和 ARM 架构,添加了对处理器的支持(参数 -mcpu 和 -mtune):Arm Cortex-A78 (cortex-a78)、Arm Cortex-A78AE (cortex-a78ae)、Arm Cortex-A78C (cortex-a78c) 、Arm Cortex-X1 (cortex-x1)、Arm Neoverse V1 (neoverse-v1) 和 Arm Neoverse N2 (neoverse-n2)。 还添加了富士通A64FX(a64fx)和Arm Cortex-R82(cortex-r82)CPU,仅支持AArch64架构。
  • 添加了对使用 Armv8.3-a (AArch64/AArch32)、SVE (AArch64)、SVE2 (AArch64) 和 MVE (AArch32 M-profile) SIMD 指令的支持,以自动矢量化执行加法、减法、乘法和加法/减法变体的操作复数。 添加了对使用 MVE 指令集的 ARM 自动向量化的初始支持。
  • 对于 ARM 平台,提供了一整套编译器集成的 C 函数(内部函数),并替换为扩展向量指令(SIMD),涵盖了 ACLE Q3 2020 规范中记录的所有 NEON 指令。
  • 后端添加了对 gfx908 GPU 的支持,用于为基于 GCN 微架构的 AMD GPU 生成代码。
  • 添加了对新处理器和其中实现的新指令集扩展的支持:
    • Intel Sapphire Rapids(-march=sapphirerapids,启用对 MOVDIRI、MOVDIR64B、AVX512VP2INTERSECT、ENQCMD、CLDEMOTE、SERIALIZE、PTWRITE、WAITPKG、TSXLDTRK、AMT-TILE、AMX-INT8、AMX-BF16 和 AVX-VNNI 指令的支持。
    • Intel Alderlake(-march=alderlake,启用对 CLDEMOTE、PTWRITE、WAITPKG、SERIALIZE、KEYLOCKER、AVX-VNNI 和 HRESET 指令的支持)。
    • Intel Rocketlake(-march=rocketlake,类似于没有 SGX 支持的 Rocket Lake)。
    • AMD Zen 3 (-march=znver3)。
  • 对于基于 Intel 处理器的 IA-32/x86-64 系统,添加了对新处理器指令 TSXLDTRK、SERIALIZE、HRESET、UINTRKEYLOCKER、AMX-TILE、AMX-INT8、AMX-BF16、AVX-VNNI 的支持。
  • 添加了对“-march=x86-64-v[234]”标志的支持以选择 x86-64 架构级别(v2 - 涵盖 SSE4.2、SSSE3、POPCNT 和 CMPXCHG16B 扩展;v3 - AVX2 和 MOVBE;v4 - AVX-512 )。
  • 添加了对具有大端字节顺序的 RISC-V 系统的支持。 添加“-misa-spec=*”选项来选择RISC-V指令集架构规范的版本。 添加了对 AddressSanitizer 和使用金丝雀标签的堆栈保护的支持。
  • 持续改进“-fanalyzer”静态分析模式,对程序中的代码执行路径和数据流进行资源密集型的过程间分析。 该模式能够在编译阶段检测问题,例如对一个内存区域的 free() 函数的两次调用、文件描述符泄漏、取消引用和传递空指针、访问已释放的内存块、使用未初始化的值等。 在新版本中:
    • 用于跟踪程序状态的代码已被完全重写。 扫描非常大的 C 文件的问题已得到解决。
    • 添加了初始 C++ 支持。
    • 内存分配和释放分析已从具体的 malloc 和 free 函数中抽象出来,现在支持 new/delete 和 new[]/delete[]。
    • 添加了新警告:-Wanalyzer-shift-count-negative、-Wanalyzer-shift-count-overflow、-Wanalyzer-write-to-const 和 -Wanalyzer-write-to-string-literal。
    • 添加了新的调试选项 -fdump-analyzer-json 和 -fno-analyzer-feasibility。
    • 通过 GCC 插件扩展分析器的能力已经实现(例如,已经准备了一个插件来检查 CPython 中全局锁定(GIL)的不正确使用)。

来源: opennet.ru

添加评论