LLVM 12.0编译器集发布

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

Clang 12.0 的改进:

  • 默认情况下,已实现并启用对 C++20 标准中提出的“可能”和“不太可能”属性的支持,从而允许优化器了解触发条件构造的概率(例如,“[[可能]] 如果(随机 > 0){“)。
  • 添加了对 AMD Zen 3 (-march=znver3)、Intel Alder Lake (-march=alderlake) 和 Intel Sapphire Rapids (-march=sapphirerapids) 处理器的支持。
  • 添加了对“-march=x86-64-v[234]”标志的支持以选择 x86-64 架构级别(v2 - 涵盖 SSE4.2、SSSE3、POPCNT 和 CMPXCHG16B 扩展;v3 - AVX2 和 MOVBE;v4 - AVX-512 )。
  • 添加了对 Arm Cortex-A78C (cortex-a78c)、Arm Cortex-R82 (cortex-r82)、Arm Neoverse V1 (neoverse-v1)、Arm Neoverse N2 (neoverse-n2) 和 Fujitsu A64FX (a64fx) 处理器的支持。 例如,要启用 Neoverse-V1 CPU 的优化,您可以指定“-mcpu=neoverse-v1”。
  • 对于 AArch64 架构,添加了新的编译器标志“-moutline-atomics”和“-mno-outline-atomics”来启用或禁用原子操作辅助函数,例如“__aarch64_cas8_relax”。 此类函数在运行时检测 LSE(大型系统扩展)支持是否可用,并使用提供的原子处理器指令或回退到使用 LL/SC(加载链接/存储条件)指令进行同步。
  • 添加了“-fbinutils-version”选项来选择 binutils 套件的目标版本,以与旧的链接器和汇编器行为兼容。
  • 对于 ELF 可执行文件,当指定“-gz”标志时,默认启用使用 zlib 库压缩调试信息(gz=zlib)。 链接生成的目标文件需要 lld 或 GNU binutils 2.26+。 要恢复与旧版本 binutils 的兼容性,可以指定“-gz=zlib-gnu”。
  • 现在使用非空和可取消引用(N) 检查来处理“this”指针。 要删除nonnull属性,如果需要使用NULL值,可以使用“-fdelete-null-pointer-checks”选项。
  • 在 Linux 平台上,AArch64 和 PowerPC 架构启用“-fasynchronous-unwind-tables”模式来生成展开调用表,就像在 GCC 中一样。
  • 在“#pragma clang Loop vectorize_width”中添加了指定“固定”(默认)和“可扩展”选项来选择矢量化方法的功能。 “可扩展”模式与向量长度无关,是实验性的,可以在支持可扩展向量化的硬件上使用。
  • 改进了对Windows平台的支持:已经为Arm64系统上的Windows准备了官方二进制程序集,包括Clang编译器、LLD链接器和compiler-rt运行时库。 当为 MinGW 目标平台构建时,即使交叉编译,也会添加 .exe 后缀。
  • 与 OpenCL、OpenMP 和 CUDA 支持相关的功能已得到扩展。 添加了选项“-cl-std=CL3.0”和“-cl-std=CL1.0”来选择 OpenCL 3.0 和 OpenCL 1.0 的宏选项。 诊断工具得到了扩展。
  • 添加了对某些基于 x86 的处理器中实现的 HRESET、UINTR 和 AVXVNNI 指令的支持。
  • 在 x86 系统上,启用了对“-mtune=”选项的支持”,这会激活选定的微架构优化,无论“-march=”的值如何”
  • 静态分析器改进了一些 POSIX 函数的处理,并显着改进了当比较中有多个符号值时条件运算结果的确定。 添加了新的检查:fuchia.HandleChecker(定义结构中的句柄)、webkit.UncountedLambdaCapturesChecker webkit 和 alpha.webkit.UncountedLocalVarsChecker(考虑到在 WebKit 引擎代码中使用指针的特殊性)。
  • 在常量上下文中使用的表达式中,使用内置函数 __builtin_bitreverse*、__builtin_rotateleft*、__builtin_rotateright*、_mm_popcnt*、_bit_scan_forward、__bsfd、__bsfq、__bit_scan_reverse、__bsrd、__bsrq、__bswap、__bswapd、__bswap64 是允许。__bswapq 、_castf*、__rol* 和 __ror*。
  • 向 clang-format 实用程序添加了 BitFieldColonSpacing 选项,以选择标识符、列和字段定义周围的间距。
  • Linux平台上的clangd缓存服务器(Clang Server)在长期运行过程中显着减少了内存消耗(提供定期调用malloc_trim以将空闲内存页返回给操作系统)。

LLVM 12.0 的主要创新:

  • 对用 Python 编写的 llvm-build 构建工具的支持已停止,该项目已完全切换为使用 CMake 构建系统。
  • 在AArch64架构的后端,改进了对Windows平台的支持:确保了目标Windows系统正确生成汇编器输出,优化了unwind调用的数据生成(此类数据的大小已减少60) %),已添加指令 .seh_* 使用汇编程序创建展开数据的功能。
  • PowerPC 架构的后端对循环和内联部署进行了新的优化,扩展了对 Power10 处理器的支持,增加了对用于矩阵操作的 MMA 指令的支持,并改进了对 AIX 操作系统的支持。
  • x86 后端增加了对 AMD Zen 3、Intel Alder Lake 和 Intel Sapphire Rapids 处理器以及 HRESET、UINTR 和 AVXVNNI 处理器指令的支持。 支持 MPX(内存保护扩展),用于检查指针以确保不再支持内存边界(该技术并不普遍,已从 GCC 和 clang 中删除)。 添加了对汇编器对 {disp32} 和 {disp8} 前缀以及 .d32 和 .d8 后缀的支持,以控制操作数偏移和跳转的大小。 添加了新属性“tune-cpu”来控制微架构优化的包含。
  • 整数问题检测器中添加了新模式“-fsanitize=unsigned-shift-base”(整数清理器,“-fsanitize=integer”),以检测向左移位后无符号整数的溢出。
  • 在各种检测器(asan、cfi、lsan、msan、tsan、ubsan sanitizer)中,添加了对带有标准 Musl 库的 Linux 发行版的支持。
  • LLD 链接器的功能已得到扩展。 改进了对 ELF 格式的支持,包括添加的选项“--dependency-file”、“-error-handling-script”、“-lto-pseudo-probe-for-profiling”、“-no-lto-whole-program” -可见性” “ 改进了 MinGW 支持。 对于 Mach-O 格式 (macOS),已实现对 arm64、arm 和 i386 架构、链接时优化 (LTO) 以及用于异常处理的堆栈展开的支持。
  • Libc++ 实现了 C++20 标准的新功能,并已开始开发 C++2b 规范的功能。 添加了对禁用本地化支持(“-DLIBCXX_ENABLE_LOCALIZATION=OFF”)和生成伪随机数的设备(“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”)进行构建的支持。

来源: opennet.ru

添加评论