LLVM 16.0编译器集发布

经过六个月的开发,LLVM 16.0 项目发布了——一个兼容 GCC 的工具包(编译器、优化器和代码生成器),可将程序编译成类 RISC 虚拟指令的中间位码(具有多级优化系统)。 生成的伪代码可以在程序执行时直接使用 JIT 编译器转换为机器指令。

Clang 16.0 的主要改进:

  • 默认的 C++/ObjC++ 标准是 gnu++17(以前是 gnu++14),这意味着默认支持具有 GNU 扩展的 C++17 功能。 要返回以前的行为,可以使用“-std=gnu++14”选项。
  • 实现了与 C++20 标准相关的高级功能:
    • 有条件的平凡特殊成员函数,
    • 捕获 lambda 函数中的结构化绑定,
    • 表达式内的相等运算符,
    • 在某些情况下可以选择省略 typename 关键字,
    • 括号中的有效聚合初始化(“Aggr(val1, val2)”)。
  • 未来 C++2b 标准中定义的功能已实现:
    • 允许在复合表达式的末尾放置标签,
    • 静态运算符(),
    • 静态运算符[],
    • 确保与 char8_t 类型的兼容性,
    • “\N{...}”中允许使用的字符范围已扩大
    • 添加了在声明为 constexpr 的函数中使用声明为“static constexpr”的变量的功能。
  • 未来C标准C2x中定义的功能已经实现:
    • 要禁用“-Wunused-label”警告,允许将“[[maybe_unused]]”属性应用于标签
    • 允许将标签放置在复合表达式中的任何位置,
    • 添加了 typeof 和 typeof_unqual 运算符,
    • 新类型 nullptr_t 和 nullptr 常量定义空指针,可以转换为任何指针类型并表示不绑定到整数和 void* 类型的 NULL 变体。
    • 在 C2x 模式下,允许使用可变数量的参数(可变参数)调用 va_start 宏。
  • 在 C99、C11 和 C17 合规模式中,默认选项“-Wimplicit-function-declaration”和“-Wimplicit-int”现在会生成错误而不是警告。
  • 在 C++ 模式下间接使用“void *”(例如“void func(void *p) { *p; }”)现在会生成错误,类似于 ISO C++、GCC、ICC 和 MSVC。
  • 在 Microsoft 风格的内联汇编块中指定位域作为指令操作数(例如“__asm ​​{ mov eax, s.bf }”)现在会生成错误。
  • 添加了对不同模块中是否存在具有相同名称的不同结构和联合的诊断。
  • 与 OpenCL 和 OpenMP 支持相关的功能已得到扩展。 改进了对 OpenCL 内核参数中使用的 C++ 模板的诊断。 改进了对 AMDGPU 的排队块支持。 nounwind 属性隐式添加到所有函数中。 改进了对内置函数的支持。
  • 添加了使用 CLANG_CRASH_DIAGNOSTICS_DIR 环境变量来定义保存崩溃诊断数据的目录的功能。
  • Unicode 支持已更新为 Unicode 15.0 规范。 标识符中允许使用一些数学符号,例如“₊”(例如“double xₖ₊₁”)。
  • 添加了对加载多个配置文件的支持(首先加载默认配置文件,然后加载通过“--config =”标志指定的配置文件,现在可以多次指定)。 更改了配置文件的默认加载顺序:clang 尝试首先加载文件- .cfg,如果没有找到它会尝试加载两个文件.cfg 和.cfg。 为了默认禁用加载配置文件,添加了“--no-default-config”标志。
  • 为了确保可重复构建,可以将 __DATE__、__TIME__ 和 __TIMESTAMP__ 宏中的当前日期和时间值替换为 SOURCE_DATE_EPOCH 环境变量中指定的时间。
  • 为了检查是否存在可在常量上下文中使用的内置函数(builtin),添加了宏“__has_constexpr_builtin”。
  • 添加了新的编译标志“-fcoro-aligned-allocation”用于对齐的协程帧分配。
  • “-fstrict-flex-arrays=”标志实现了对结构中灵活数组元素的第三级验证的支持(灵活数组成员,结构末尾的不定大小的数组)。 在第三级,只有大小“[]”(例如“int b[]”)被视为灵活数组,但大小“[0]”(例如“int b[0]”)被视为灵活数组不是。
  • 添加了“-fmodule-output”标志以启用标准 C++ 模块的单阶段编译模型。
  • 添加了“-Rpass-analysis=stack-frame-layout”模式以帮助诊断堆栈帧布局问题。
  • 添加了新属性 __attribute__((target_version("cpu_features"))) 并扩展了属性 __attribute__((target_clones("cpu_features1","cpu_features2",...))) 的功能,以选择 AArch64 提供的功能的特定版本CPU。
  • 诊断工具扩展:
    • 添加了警告“-Wsingle-bit-bitfield-constant-conversion”,以在将 XNUMX 分配给一位有符号位域时检测隐式截断。
    • 未初始化 constexpr 变量的诊断已得到扩展。
    • 添加了“-Wcast-function-type-strict”和“-Win兼容-function-pointer-types-strict”警告,以识别函数类型转换的潜在问题。
    • 添加了在导出块中使用不正确或保留的模块名称的诊断。
    • 改进了对定义中缺失的“auto”关键字的检测。
    • “-Winteger-overflow”警告的实施增加了对导致溢出的其他情况的检查。
  • 实现了对LoongArch指令集架构(-march=loongarch64或-march=la464)的支持,用于龙芯3 5000处理器并实现新的RISC ISA,类似于MIPS和RISC-V。

LLVM 16.0 的主要创新:

  • LLVM 代码允许使用 C++17 标准中定义的元素。
  • 提高了构建LLVM的环境要求。 构建工具现在应该支持 C++17 标准,即要构建,您至少需要 GCC 7.1、Clang 5.0、Apple Clang 10.0 或 Visual Studio 2019 16.7。
  • AArch64 架构的后端增加了对 Cortex-A715、Cortex-X3 和 Neoverse V2 CPU 的支持、RME MEC(内存加密上下文)汇编器、Armv8.3 扩展(复数)和功能多版本控制。
  • 在ARM架构的后端中,对Armv2、Armv2A、Armv3和Armv3M目标平台的支持已停止,无法保证生成正确的代码。 添加了生成用于处理复数的指令代码的功能。
  • X86 架构的后端增加了对指令集架构 (ISA) AMX-FP16、CMPCCXADD、AVX-IFMA、AVX-VNNI-INT8、AVX-NE-CONVERT 的支持。 添加了对 RDMSRLIST、RMSRLIST 和 WRMSRNS 指令的支持。 实现了选项“-mcpu=raptorlake”、“-mcpu=meteorlake”、“-mcpu=emeraldrapids”、“-mcpu=sierraforest”、“-mcpu=graniterapids”和“-mcpu=grandridge”。
  • 新增对LoongArch平台的官方支持。
  • 改进了 MIPS、PowerPC 和 RISC-V 架构的后端
  • LLDB 调试器添加了对 LoongArch 架构的 64 位可执行文件的调试支持。 改进了 COFF 调试符号的处理。 提供了对已加载 Windows 模块列表中重复 DLL 的过滤。
  • 在Libc++库中,主要工作集中在实现对C++20和C++23标准新功能的支持。
  • LDD 链接器通过并行化地址重定位扫描和段初始化操作,显着缩短了链接时间。 添加了对使用 ZSTD 算法的部分压缩的支持。

来源: opennet.ru

添加评论