LLVM 11.0编译器集发布

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

新版本中的关键变化是包含 法兰,Fortran 语言的前端。 Flang 支持 Fortran 2018、OpenMP 4.5 和 OpenACC 3.0,但该项目的开发尚未完成,前端仅限于代码解析和检查正确性。 尚不支持生成 LLVM 中间代码,为了生成可执行文件,需要生成规范代码并将其传递给外部 Fortran 编译器。

改进之处 在 Clang 11.0 中:

  • 添加了恢复抽象语法树的功能(AST)用于损坏的 C++ 代码,可用于帮助诊断错误并向外部实用程序(例如 clang-tidy 和 clangd)提供附加信息。 该功能默认为 C++ 代码启用,并通过“-Xclang -f[no-]recovery-ast”选项进行控制。
  • 添加了新的诊断模式:
    • “-Wpointer-to-int-cast”是一组有关将指针强制转换为不能容纳所有可能值的整数类型 int 的警告。
    • “-Wuninitialized-const-reference” - 关于在接受带有“const”属性的引用参数的函数参数中传递未初始化变量的警告。
    • “-Wimplicit-const-int-float-conversion” - 默认启用有关实数常量隐式转换为整数类型的警告。
  • 对于ARM平台,提供了编译器内置的C函数(内在的),替换为高效向量指令 Arm v8.1-M MVE 和 CDE。 可用函数在头文件arm_mve.h 和arm_cde.h 中定义。
  • 额外 一组扩展整数类型 _ExtInt(N),允许您创建不是 XNUMX 的倍数的类型,可以在 FPGA/HLS 上高效处理。 例如, _ExtInt(7) 定义由 7 位组成的整数类型。
  • 添加了定义对基于 ARM SVE(可扩展向量扩展)指令的内置 C 函数的支持的宏:
    __ARM_FEATURE_SVE,__ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32、__ARM_FEATURE_SVE_MATMUL_FP64、
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2,__ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4。 例如,通过设置命令行选项“-march=armv64-a+sve”生成AArch8代码时定义__ARM_FEATURE_SVE宏。

  • “-O”标志现在用“-O1”优化模式标识,而不是“-O2”。
  • 添加了新的编译器标志:
    • “-fstack-clash-protection” - 启用保护 栈和堆的交集.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - 允许您选择浮点数的异常处理程序模式。
    • “-ffp-model={precise,strict,fast}” - 简化对一系列浮点数专用选项的访问。
    • “-fpch-codegen”和“-fpch-debuginfo”生成预编译头(PCH),其中包含代码和调试信息的单独目标文件。
    • “-fsanitize-coverage-allowlist”和“-fsanitize-coverage-blocklist”用于检查覆盖测试白名单和黑名单。
    • “-mtls-size={12,24,32,48}”选择 TLS(线程本地存储)大小。
    • “-menable-experimental-extension”以启用实验性 RISC-V 扩展。
  • C 的默认模式是“-fno-common”,它允许在某些平台上更有效地访问全局变量。
  • 默认模块缓存已从 /tmp 移至 ~/.cache 目录。 要覆盖,您可以使用“-fmodules-cache-path =”标志。
  • 默认的 C 语言标准已从 gnu11 更新为 gnu17。
  • 添加了对 GNU C 扩展的初步支持“汇编内联» 添加汇编器插入。 该扩展仍在分析中,但没有以任何方式进行处理。
  • 与 OpenCL 和 CUDA 支持相关的功能已得到扩展。 添加了对 OpenCL 2.0 块诊断的支持并实现了新的 OpenMP 5.0 功能。
  • 向 clang-format 实用程序添加了 IndentExternBlock 选项,用于在 extern“C”和 extern“C++”块内对齐。
  • 静态分析器改进了 C++ 中继承构造函数的处理。 添加了新检查 alpha.core.C11Lock 和 alpha.fuchsia.Lock 来检查锁,alpha.security.cert.pos.34c 来检测 putenv 的不安全使用,webkit.NoUncountedMemberChecker 和 webkit.RefCntblBaseVirtualDtor 来检测不可数类型的问题,alpha .cplusplus .SmartPtr 检查空智能指针取消引用。
  • 干净整洁的短绒 添加 很大一部分是新支票。
  • clangd 缓存服务器(Clang Server)提高了性能并添加了新的诊断功能。

创新 LLVM 11.0:

  • 构建系统已切换为使用 Python 3。如果 Python 3 不可用,可以回滚到使用 Python 2。
  • Go 语言编译器(llgo)的前端不包含在该版本中,将来可能会进行重组。
  • vector-function-abi-variant 属性已添加到中间表示 (IR) 中,以描述标量函数和向量函数之间的映射以向量化调用。 llvm::VectorType 有两种独立的向量类型 llvm::FixedVectorType 和 llvm::ScalableVectorType。
  • 基于 udef 值进行分支并将 undef 值传递给标准库函数被识别为未定义行为。 在
    memset/memcpy/memmove 允许传递 undef 指针,但如果大小参数为零。

  • LLJIT 添加了对通过 LLJIT::initialize 和 LLJIT::deinitialize 方法执行静态初始化的支持。 已经实现了使用 StaticLibraryDefinitionGenerator 类将静态库添加到 JITDylib 的功能。 添加了 C API 兽人v2 (用于构建 JIT 编译器的 API)。
  • AArch64 架构的后端添加了对 Cortex-A34、Cortex-A77、Cortex-A78 和 Cortex-X1 处理器的支持。 实现了 ARMv8.2-BF16 (BFloat16) 和 ARMv8.6-A 扩展,包括 RMv8.6-ECV(增强型计数器虚拟化)、ARMv8.6-FGT(细粒度陷阱)、ARMv8.6-AMU(活动监视器虚拟化)和 ARMv8.0-DGH(数据收集提示)。 提供了为与 SVE 向量指令绑定的内置函数生成代码的能力。
  • ARM 架构的后端添加了对 Cortex-M55、Cortex-A77、Cortex-A78 和 Cortex-X1 处理器的支持。 实施扩展
    Armv8.6-A 矩阵乘法和 RMv8.2-AA32BF16 BFloat16。

  • PowerPC 架构的后端添加了对 POWER10 处理器代码生成的支持。 循环优化已得到扩展,浮点支持也得到了改进。
  • RISC-V 架构的后端允许接受支持尚未正式批准的实验性扩展指令集的补丁。
  • AVR 架构的后端已从实验类别转移到稳定版本,包含在基本发行版中。
  • x86 架构的后端支持 Intel AMX 和 TSXLDTRK 指令。 增加了针对攻击的保护 LVI (加载值注入),并且还实现了通用的推测执行副作用抑制机制,以阻止因 CPU 上操作的推测执行而引起的攻击。
  • 在 SystemZ 架构的后端中,添加了对 MemorySanitizer 和 LeakSanitizer 的支持。
  • 向 Libc++ 添加了对带有数学常量的头文件的支持 .
  • 扩展 LLD 链接器功能。 改进了对 ELF 格式的支持,包括添加的选项“--lto-emit-asm”、“--lto-whole-program-visibility”、“-print-archive-stats”、“-shuffle-sections”、“ -thinlto-单模块”、“-unique”、“-rosegment”、“-threads=N”。 添加了“--time-trace”选项,将跟踪保存到文件中,然后可以通过 Chrome 中的 chrome://tracing 界面进行分析。

来源: opennet.ru

添加评论