发布 GCC 10 编译器套件

经过一年的发展 发表 发布一组免费的编译器 GCC 10.1,新 GCC 10.x 分支中的第一个主要版本。 依据 新方案 从版本号来看,开发过程中使用了 10.0 版本,在 GCC 10.1 发布之前不久,GCC 11.0 分支已经分支出来,在此基础上形成下一个重要版本 GCC 11.1。

GCC 10.1 值得注意的是针对 C++20 标准开发的 C++ 语言中的许多创新的实现、与未来 C 语言标准 (C2x) 相关的改进、编译器后端的新优化和实验支持 静态分析模式。 此外,在准备新分支的过程中,项目将存储库从SVN转移到了Git。

变化:

  • 额外 静态分析实验模式"-分析仪“,它对程序中的代码执行路径和数据流执行资源密集型过程间分析。 该模式能够在编译阶段检测问题,例如对一个内存区域的 free() 函数的两次调用、文件描述符泄漏、取消引用和传递空指针、访问已释放的内存块、使用未初始化的值等。 OpenSSL 代码新模式的使用已经可以识别 危险的脆弱性.
  • 改进了过程间优化。 IPA-SRA(过程间标量共享替换)通道已被重新设计为在绑定时工作,并且现在删除了计算和返回的未使用的值。 在“-O2”优化模式下,启用“-finline-functions”选项,重新调整该选项以支持更紧凑的代码而不是执行性能。 内联函数部署的启发式工作已经加快。 内联扩展和函数克隆启发式现在可以使用有关值范围的信息来预测各个转换的有效性。 对于 C++,基于类型的别名解析的准确性已得到提高。
  • 增强的链接时间优化 (LTO)。 添加了新的可执行文件 lto转储 使用 LTO 字节码重置有关对象文件的信息。 并行 LTO 遍自动确定同时运行的 make 任务的数量,如果无法确定,则使用有关 CPU 核心数量的信息作为并行化因子。 添加了使用 zstd 算法压缩 LTO 字节码的功能。
  • 改进了基于代码分析结果的优化机制(PGO - Profile-guided optimization),可根据代码执行特征的分析生成更优化的代码。 改进了编译期间的配置文件维护以及热/冷代码分离。 通过选项“-f 配置文件值» 现在可以监控最多 4 个配置文件值,例如间接呼叫和提供更精确的配置文件信息。
  • 针对 C、C++ 和 Fortran 语言实现的并行编程规范 开放ACC 2.6,它定义了用于在 GPU 和专用处理器(例如 NVIDIA PTX)上卸载操作的工具。 标准的实施已接近完成 开放MP 5.0 (开放式多处理),它定义了在具有共享内存和矢量化单元(SIMD)的多核和混合(CPU+GPU/DSP)系统上应用并行编程方法的API和方法。 添加了诸如lastprivate条件、扫描和循环指令、顺序和use_device_addr表达式等功能。 对于 OpenMP 和 OpenACC,添加了对第四代 (Fiji) 和第五代 AMD Radeon (GCN) GPU (VEGA 10/VEGA 20) 上卸载操作的支持。
  • 对于C家族的语言,添加了“access”函数来描述函数对通过引用或指针传递的对象的访问,并将这些对象与包含有关对象大小的信息的整数参数相关联。 为了与“access”结合使用,“type”属性被实现来检测用户函数的不正确访问,例如,将值写入数组边界之外的区域时。 还添加了“symver”属性,用于将 ELF 文件中的符号与特定版本号关联起来。
  • 添加了新警告:
    • “-Wstring-compare”(通过“-Wextra”启用) - 警告存在将零与调用 strcmp 和 strncmp 函数的结果进行比较的表达式,该表达式相当于一个常量,因为长度第一个参数的数组大小大于第二个参数中的数组大小。
    • “-Wzero-length-bounds”(通过“-Warray-bounds”启用)- 警告访问零长度的数组元素,这可能会导致覆盖其他数据。
    • “-Warray-bounds”、“-Wformat-overflow”、“-Wrestrict”、“-Wreturn-local-addr”和“-Wstringop-overflow”警告已得到扩展,以扩大越界情况的数量被处理的。
  • 实现了使用当前编码(默认为 UTF-8)而不是 UCN 表示法(\uNNNN 或 \UNNNNNNNN)直接在标识符中指定宽字符的功能。 例如:

    静态常量 int π = 3;
    int get_naïve_pi() {
    返回π;
    }

  • 对于 C 语言,已经实现了 C2X 标准中开发的部分新功能(通过指定 -std=c2x 和 -std=gnu2x 启用):出现了对“[[]]”语法的支持,用于定义属性,如下所示C++(例如,[[gnu ::const]]、[[已弃用]]、[[fallthrough]] 和 [[maybe_unused]]。添加了对“u8”语法的支持,用于使用 UTF-8 字符定义常量。
    添加了新的宏。 向 strftime 添加了“%OB”和“%Ob”替换。

  • C 的默认模式是“-fno-common”,它允许在某些平台上更有效地访问全局变量。
  • 对于 C++,在 C++16 标准中开发了大约 20 项更改和创新。 包括添加的关键字“constinit”
    并已实现对模板扩展的支持”概念”。 概念允许您定义一组模板参数要求,这些要求在编译时限制可以接受为模板参数的参数集。 这些概念可用于避免模板内使用的数据类型的属性与输入参数的数据类型属性之间的逻辑不一致。

  • G++ 通过 constexpr 提供对因更改常量对象而导致的未定义行为的检测。 减少了编译器计算 constexpr 时的内存消耗。 添加了新警告“-Wmismatched-tags”和“-Wredundant-tags”。
  • 已提出新的命令行选项:
    • “-fallocation-dce”删除不必要的“新”和“删除”运算符对。
    • “-fprofile-partial-training”禁用没有训练运行的代码的大小优化。
    • “-fprofile-reproducible 控制配置文件再现性的水平。
    • “-fprofile-prefix-path”定义用于单独配置文件生成的基本源构建目录(对于“-fprofile-generate=profile_dir”和“-fprofile-use=profile_dir”)。
  • 在上述选项的警告文本中,提供了超链接,可让您转到这些选项的文档。 URL 替换是使用“-fdiagnostics-urls”选项控制的。
  • 添加了预处理器运算符“__has_builtin”,可用于检查内置函数。
  • 添加了新的内置函数“__builtin_roundeven”,其实现了ISO/IEC TS 18661规范中定义的舍入函数,与“round”类似,但将大于0.5的部分向上舍入(到更大的值),小于0.5的部分向上舍入(到更大的值) - 向下(到零),并且等于 0.5 - 从倒数第二位的奇偶校验开始。
  • 对于AArch64架构,增加了对SVE2扩展的支持,并改进了对SVE(可扩展矢量扩展)的支持,包括增加了对内置SVE ACLE函数和类型的支持,以及矢量化的使用。 扩展了对 LSE(大型系统扩展)和 TME(事务内存扩展)的支持。 添加了 Armv8.5-A 和 Armv8.6-A 中提出的新指令,包括随机数生成、舍入、内存标签绑定的指令,
    bfloat16 和矩阵乘法。 添加了处理器支持
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 和
    Marvell ThunderX3。

  • 添加了对 ARM32 的 ABI FDPIC(64 位函数指针)的支持。 重新设计并优化了 64 位整数运算的处理。 添加了CPU支持
    Arm Cortex-A77,
    Arm Cortex-A76AE 和
    Arm Cortex-M35P。 扩展了对 ACLE 数据处理指令的支持,包括 32 位 SIMD、16 位乘法、锁存算术和其他 DSP 算法优化。 添加了对 ACLE CDE(自定义数据路径扩展)指令的实验性支持。

  • 基于 GCN 微架构,显着改进了 AMD GPU 后端的代码生成和矢量化。
  • 添加了对 AVR 架构的类似 XMEGA 设备的支持
    ATtiny202、ATtiny204、ATtiny402、ATtiny404、ATtiny406、ATtiny804、ATtiny806、ATtiny807、ATtiny1604、ATtiny1606、ATtiny1607、ATmega808、ATmega809、ATmega1608、ATmega1609、ATmega3208、ATmega3209 4808、ATmega4809 和 ATmegaXNUMX。

  • 为 IA-32/x86-64 架构添加了新的 Intel ENQCMD 指令集架构扩展 (-menqcmd)。 添加了对 Intel Cooperlake(-march=cooperlake,包括 AVX512BF16 ISA 扩展)和 Tigerlake(-march=tigerlake,包括 MOVDIRI、MOVDIR64B 和 AVX512VP2INTERSECT ISA 扩展)CPU 的支持。
  • 基于 HSA 架构的异构计算系统的 HSAIL(异构系统架构中间语言)实现已被弃用,并且可能会在未来版本中删除。

来源: opennet.ru

添加评论