经过六个月的开发
新版本中的关键变化是包含
- 添加了恢复抽象语法树的功能(
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 扩展。
- “-fstack-clash-protection” - 启用保护
- 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)提高了性能并添加了新的诊断功能。
主
- 构建系统已切换为使用 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