发布 GCC 9 编译器套件

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

GCC 9.1 值得注意的是稳定了对 C++17 标准的支持、继续实现未来 C++20 标准(代号为 C++2a)的功能、包含在 D 语言的前端、部分支持 OpenMP 5.0 ,几乎完全支持OpenACC 2.5,提高了过程间优化和绑定阶段优化的可扩展性,扩展了诊断工具并添加了新的警告,OpenRISC、C-SKY V2 和 AMD GCN GPU 的后端。

变化:

  • 添加了对 D 编程语言的支持。GCC 包含带有编译器的前端 GDC (Gnu D 编译器) 和运行时库 (libphobos),它们允许您使用标准 GCC 以 D 编程语言构建程序。在 GCC 中启用 D 语言支持的过程 开始 早在2011年,但是 拖下去 由于需要使代码符合GCC要求以及将知识产权转让给正在开发D编程语言的Digital Mars的问题;
  • 对代码生成器进行了改进。 例如,已经实现了根据情况使用不同的策略来扩展Switch表达式(跳转表、位测试、决策树)。 添加了使用“-ftree-switch-conversion”优化转换包含 Switch 表达式的线性函数的功能(例如,一组条件,如“case 2: how = 205;break;case 3: how = 305;break ;”将转换为“100 * how + 5”;
  • 改进了过程间优化。 内联部署设置已针对现代 C++ 代码库进行了调整,并使用新参数 max-inline-insns-small、max-inline-insns-size、uninlined-function-insns、uninlined-function-time、uninlined-thunk-insns 和 uninlined 进行了扩展- 重击时间。 提高了冷/热代码分离的准确性和积极性。 提高了超大型的可扩展性 翻译单位 (例如,在大型程序的链接阶段应用优化时);
  • 改进了基于代码分析结果的优化机制(PGO - Profile-guided optimization),可根据代码执行特征的分析生成更优化的代码。 摘要选项“-fprofile 使用”现在包括优化模式“-fversion-loops-for-strides”、“-floop-interchange”、“-floop-unroll-and-jam”和“-ftree-loop-distribution”。 删除了文件中包含带有计数器的直方图,这减少了带有配置文件的文件的大小(现在在链接期间执行优化时会动态生成直方图);
  • 增强的链接时间优化 (LTO)。 在生成结果之前提供了类型的简化,这使得可以显着减小LTO对象文件的大小,减少绑定阶段的内存消耗,并提高操作的并行化。 分区数量 (-param lto-partitions) 从 32 个增加到 128 个,这提高了具有大量 CPU 线程的系统的性能。 添加了一个参数来控制优化器进程的数量
    “-param lto-max-streaming-parallelism”;

    因此,与 GCC 8.3 相比,GCC 9 中引入的优化 允许 将 Firefox 5 和 LibreOffice 66 的编译时间减少约 6.2.3%。 目标文件的大小减少了 7%。 8 核 CPU 上的绑定时间减少了 11%。 链接阶段的顺序优化阶段现在速度提高了 28%,消耗的内存减少了 20%。 LTO并行阶段每个处理器内存消耗下降30%;

  • 大多数并行编程规范是针对 C、C++ 和 Fortran 语言实现的 开放ACC 2.5,它定义了用于在 GPU 和专用处理器(例如 NVIDIA PTX)上卸载操作的工具;
  • C 和 C++ 已实现对该标准的部分支持 开放MP 5.0 (开放式多处理),定义了在具有共享内存和矢量化单元(SIMD)的多核和混合(CPU+GPU/DSP)系统上应用C、C++和Fortran语言并行编程方法的API和方法;
  • 为 C 语言添加了新的警告:“-打包成员的W地址“(指向结构或联合的打包成员的未对齐指针值)和
    «-W绝对值" (当访问计算绝对值的函数时,如果有更适合指定参数的函数,例如,应使用 fabs(3.14) 而不是 abs(3.14)。 为 C++ 添加了新警告:“-Wdeprecated-copy”,
    “-Winit-list-lifetime”、“-Wredundant-move”、“-Wpessimizing-move”和“-Wclass-conversion”。 许多以前可用的警告已得到扩展;

  • 添加了对部分未来 C 语言标准(代号为 C2x)的实验性支持。 要启用 C2x 支持,请使用选项“-std=c2x”和“-std=gnu2x”(以启用 GNU 扩展)。 该标准仍处于早期开发阶段,因此,就其功能而言,仅支持具有一个参数的表达式 _Static_assert(具有两个参数的 _Static_assert 在 C11 中已标准化);
  • 对 C++17 标准的支持已声明稳定。 在前端,完全实现了C++17的语言能力,而在libstdc++中,标准中定义的库函数也接近完全实现;
  • 继续 履行 未来 C++2a 标准的元素。 例如,添加了在初始化期间包含范围的功能,实现了 lambda 表达式的扩展,添加了对数据结构的空成员和可能/不可能属性的支持,提供了在条件表达式中调用虚拟函数的功能, ETC。
    要启用 C++2a 支持,请使用“-std=c++2a”和“-std=gnu++2a”选项。 向 libstdc++ 添加了 C++2a、std::remove_cvref、std::unwrap_reference、std::unwrap_decay_ref、std::is_nothro_convertible 和 std::type_identity 特征、std::midpoint、std::lerp 函数的位和版本头文件,std::bind_front,
    std::visit、std::is_constant_evaluated 和 std::assume_aligned,增加了对 char8_t 类型的支持,实现了检查字符串前缀和后缀的功能(starts_with、ends_with);

  • 添加了对新 ARM 处理器的支持
    Cortex-A76、Cortex-A55、Cortex-A76 DynamIQ big.LITTLE 和 Neoverse N1。 添加了对 Armv8.3-A 中引入的用于处理复数、伪随机数生成 (rng) 和内存标记 (memtag) 的指令的支持,以及用于阻止与分支预测单元的推测执行和操作相关的攻击的指令。 针对AArch64架构,增加了保护模式 栈和堆的交集 (“-fstack-冲突保护”)。 为了使用Armv8.5-A架构的功能,添加了选项“-march=armv8.5-a”

  • 它包括一个用于为基于 GCN 微架构的 AMD GPU 生成代码的后端。 目前实现仅限于单线程应用程序的编译(稍后将提供通过OpenMP和OpenACC进行多线程计算的支持)以及对GPU Fiji和Vega 10的支持;
  • 为处理器添加了新的后端 开放式RISC;
  • 添加了处理器后端 中天V2,由中国同名公司生产,适用于各种消费设备;
  • 所有操作字节值的命令行选项都支持后缀kb、KiB、MB、MiB、GB和GiB;
  • 实施的 “-flive-patching=[inline-only-static|inline-clone]”选项允许您实现实时修补系统的安全编译,因为对过程间使用的多级控制(“近期行动计划”)优化;
  • 添加了“--completion”选项,用于在使用 bash 时细粒度控制选项完成;
  • 诊断工具提供源文本摘录的显示,指示行号并直观地标记相关信息,例如操作数类型。 要禁用行号和标签的显示,提供了选项“-fno-diagnostics-show-line-numbers”和“-fno-diagnostics-show-labels”;

    发布 GCC 9 编译器套件

  • 扩展 用于诊断 C++ 代码中的错误的工具,提高了有关错误原因的信息的可读性并突出显示有问题的参数;

    发布 GCC 9 编译器套件

  • 添加了选项“-fdiagnostics-format=json”,允许以机器可读格式(JSON)生成诊断输出;
  • 添加了新的分析选项“-fprofile-filter-files”和“-fprofile-exclude-files”来选择要处理的源文件;
  • AddressSanitizer 为自动变量提供更紧凑的验证代码的生成,从而减少了被检查的可执行文件的内存消耗;
  • 改进了输出“-fopt-信息»(有关添加优化的详细信息)。 除了之前可用的前缀“note”之外,还添加了新的前缀“optimized”和“missed”。 增加了循环内联展开和向量化决策信息的输出;
  • 添加了“-fsave-optimization-record”选项,指定后,GCC 会保存 SRCFILE.opt-record.json.gz 文件,其中包含有关使用某些优化的决策的描述。 新选项与“-fopt-info”模式的不同之处在于包含额外的元数据,例如有关配置文件和内联链的信息;
  • 添加了选项“-fipa-stack-alignment”和“-fipa-reference-addressable”来控制堆栈对齐以及在过程间优化期间静态变量的寻址模式(只写或精确读)的使用;
  • 引入了新的内置函数来控制属性绑定以及与分支预测和推测指令执行相关的行为:“__builtin_has_attribute __builtin_has_attribute“”__builtin_expect_with_probability __builtin_expect_with_probability“ 和 ”__builtin_推测_安全_值”。 为函数、变量和类型添加了新属性 复制;
  • Fortran语言已实现对异步输入/输出的全面支持;
  • 已弃用对 Solaris 10 (*-*-solaris2.10) 和 Cell/BE(Cell 宽带引擎 SPU)平台的支持,并将在下一个主要版本中删除。 对 Armv2、Armv3、Armv5 和 Armv5E 架构的支持已停止。 对 Intel MPX(内存保护扩展)的支持已停止。

来源: opennet.ru

添加评论