经过六个月的开发,LLVM 22.1.0 正式发布。它开发了一系列工具(编译器、优化器和代码生成器),可以将程序编译成类似 RISC 架构的虚拟指令的中间位代码(一种带有多级优化系统的底层虚拟机)。生成的伪代码可以转换为特定目标平台的机器代码,也可以被即时 (JIT) 编译器用于在程序执行期间直接生成机器指令。基于 LLVM 技术,该项目正在开发 Clang 编译器,支持 C、C++ 和 Objective-C 编程语言。从 18.x 分支开始,该项目采用了新的版本编号方案,其中版本 0(“N.0”)用于开发阶段,第一个稳定版本编号为“N.1”。
Clang 22 的改进包括:
- 新增对内存分配令牌(Allocation Tokens)的支持,用于为使用 malloc 等函数执行的内存分配操作添加唯一标识符。分配令牌有助于构建堆信息结构,简化内存泄漏检测,并支持根据对象用途或修改模式对其进行分组(例如,将“热”数据与“冷”数据分开)。要启用此功能,请使用“-fsanitize=alloc-token”标志。
- C语言相关特性:
- 已实现定义“defer”延迟执行机制的规范草案,允许在当前作用域退出时执行操作。已添加“-fdefer-ts”标志以启用“defer”支持。
- 新增了内置函数 `__builtin_stack_address()`,与 GCC 中的类似函数相对应。该函数返回栈地址,用于分隔调用 `__builtin_stack_address()` 的当前函数及其后续调用函数的栈区域。
- 正在为未来 C2y 标准开发的功能:
- 新增了对命名循环的支持,允许您为循环和 switch 语句指定名称,这些名称可以在 break 和 continue 语句中指定,以显式定义要退出的循环。外层循环:for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // 跳转到 CONT1 continue outer; // 跳转到 CONT2 // CONT1 } // CONT2 }
- 用于生成唯一标识符名称的内置宏“__COUNTER__”的实现已得到扩展并纳入标准。该宏的调用次数上限为2147483647次;超过此上限将导致错误。
- 移除在声明为“extern inline”的函数中使用静态函数或变量时发出的警告(-Wstatic-in-inline)。
- C23 C 标准中定义的功能:
- float.h 头文件现在支持 FLT_SNAN、DBL_SNAN 和 LDBL_SNAN 宏,它们为 float、double 和 long double 类型实现了带信号的 NaN 值(在算术运算中使用时会引发异常)。
- 修复了一个错误,即如果不同的未命名类型具有相同的字段,则它们在同一个翻译单元中会被视为兼容。
- 用于在依赖项扫描期间忽略缺失头文件的“-MG”标志已扩展到“#embed”指令,现在当“#embed”指令中指定的文件缺失时,会抑制“找不到文件”错误。
- C++相关功能:
- 新增了在 `constexpr` 上下文中使用结构化绑定的功能,该功能是在 C++2c (C++26) 规范中开发的。这意味着对常量表达式的引用现在本身也可以是常量表达式。目前已实现对数组和简单结构体的支持(尚不支持元组)。例如:`constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;`
- 根据 C++20 标准的要求,约束现在在检查之前会转换为标准形式,从而可以生成更准确的诊断消息,并正确处理仅在概念 ID 中使用的模板参数的替换错误。
- 添加了一系列内置函数“__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship”,用于查找比较运算符“<”、“">”、“<="”和“">="”是否由“<=>”运算符合成。
- “-Wincompatible-pointer-types”参数已更改为输出错误信息而非警告信息。要恢复之前的行为,请使用“-Wno-error=incompatible-pointer-types”选项。
- 新增了内置函数 __builtin_bswapg、__builtin_elementwise_ldexp、__builtin_elementwise_fshl、__builtin_elementwise_fshr、__builtin_elementwise_minnumnum、__builtin_elementwise_maxnumnum、__builtin_masked_load、__builtin_masked_expand_load、__builtin_masked_store、__builtin_masked_compress_store、__builtin_masked_gather、__builtin_masked_scatter 和 __builtin_dedup_pack。例如,`builtin_dedup_pack` 允许您从类型列表中删除重复项:`using MyTypeList = TypeList<__builtin_dedup_pack>` …>; // 结果类型将是 TypeList
- 使用 UBSan 调试未定义行为时(-fsanitize=undefined -fsanitize-trap=undefined),生成的调试信息中现在包含错误原因信息。新增了“-fsanitize-debug-trap-reasons”标志,用于指定错误信息的详细程度。可以将其设置为“basic”以显示一般描述(例如,“整数加法溢出”),也可以设置为“detailed”以包含详细信息(例如,“'a + b' 中的有符号整数加法溢出”)。
- 添加了新的编译器标志:
- "-f[no-]sanitize-debug-trap-reasons" 用于控制在使用 "-fsanitize-trap" 模式编译时,是否将异常陷阱原因嵌入到调试信息中。
- “-fsanitize=alloc-token”、“-falloc-token-max”、“-fsanitize-alloc-token-fast-abi”和“-fsanitize-alloc-token-extended”用于管理内存分配令牌。
- "-fmatrix-memory-layout" 用于控制矩阵类型的内存布局(例如,列优先矩阵使用列优先,行优先矩阵使用行优先)。
- 现在函数有一个名为“malloc_span”的属性,类似于 malloc 属性,但适用于返回类似 span 的结构的函数,该结构包含一个指针和一个字段,该字段表示块的大小或指向块末尾的指针。
- 添加了“modular_format”属性,以便在链接时动态选择 printf 函数所需的静态链接实现。
- 诊断和静态分析工具已得到扩展,新增了检查项(数十项与诊断相关的改进)。
- X86 后端已添加 SSE、AVX 和 AVX512 扩展的附加内部函数。已为基于 Wildcat Lake (-march=wildcatlake) 和 Nova Lake (-march=novalake) 微架构的 Intel CPU 添加构建模式。
- AArch64 后端现已支持 Ampere Computing 的 Ampere1C (ampere1c)、Arm C1-Nano (c1-nano)、Arm C1-Pro (c1-pro)、Arm C1-Premium (c1-premium) 和 Arm C1-Ultra (c1-ultra) 处理器。此外,还为 FCVTZ[US]、FCVTN[US]、FCVTM[US]、FCVTP[US] 和 FCVTA[US] 指令添加了内置函数。函数多版本 (FMV) 支持已稳定。用户现在可以设置不同函数版本的优先级。
- 增加了对 LoongArch32 (LA32R, LA32S) 架构的支持。
- 改进了对 ARM、AMDGPU、RISC-V、LoongArch64、MIPS、WebAssembly 和 PowerPC 架构的后端。
来源: opennet.ru
