LLVM 15.0编译器集发布

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

Clang 15.0 的主要改进:

  • 对于基于 x86 架构的系统,添加了“-fzero-call-used-regs”标志,确保函数中使用的所有 CPU 寄存器在从函数返回控制权之前重置为零。 此选项允许您防止函数中的信息泄漏,并将适合在漏洞利用中构建 ROP(面向返回编程)小工具的块数量减少大约 20%。
  • C 代码结构的内存放置已实现随机化,这使得在利用漏洞时从结构中提取数据变得复杂。 使用 randomize_layout 和 no_randomize_layout 属性打开和关闭随机化,并且需要使用“-frandomize-layout-seed”或“-frandomize-layout-seed-file”标志设置种子。
  • 添加了“-fstrict-flex-arrays=”标志”,您可以使用它控制结构中灵活数组元素的边界(灵活数组成员,结构末尾的不定大小的数组)。 当设置为 0(默认)时,带有数组的结构的最后一个元素始终被处理为灵活数组,1 - 仅大小 []、[0] 和 [1] 被处理为灵活数组,2 - 仅大小[] 和 [0] 像灵活数组一样处理。
  • 添加了对类 C 语言 HLSL(高级着色器语言)的实验性支持,该语言在 DirectX 中用于编写着色器。
  • 添加了“-Warray-parameter”,以警告使用与固定长度和可变长度数组关联的不兼容参数声明覆盖函数。
  • 改进了与 MSVC 的兼容性。 添加了对 MSVC 中提供的“#pragma function”(指示编译器生成函数调用而不是内联扩展)和“#pragma alloc_text”(定义带有函数代码的节的名称)的支持。 添加了对 MSVC 兼容的 /JMC 和 /JMC 标志的支持。
  • 支持未来 C2X 和 C++23 标准的工作仍在继续。 对于 C 语言,实现了以下内容:noreturn 属性、关键字 false 和 true、给定位深度的整数的 _BitInt(N) 类型、*_WIDTH 宏、UTF-8 编码字符的 u8 前缀。

    对于 C++,实现了以下功能:模块合并、函数成员的 ABI 隔离、模块中非局部变量的有序动态初始化、多维索引运算符、auto(x)、非文字变量、声明为 constexpr 的函数中的 goto 和标签,分隔转义序列,命名转义字符。

  • 与 OpenCL 和 OpenMP 支持相关的功能已得到扩展。 添加了对 OpenCL 扩展 cl_khr_subgroup_rotate 的支持。
  • 对于 x86 架构,增加了针对无条件向前跳转操作后推测执行指令所导致的处理器漏洞的保护。 该问题的发生是由于抢占式处理内存中紧随分支指令之后的指令(SLS,直线推测)所致。 为了启用保护,建议使用选项“-mharden-sls=[none|all|return|indirect-jmp]”。
  • 对于支持SSE2扩展的平台,添加了_Float16类型,在不支持AVX512-FP16指令的情况下使用float类型进行模拟。
  • 添加了“-m[no-]rdpru”标志来控制 RDPRU 指令的使用,从 AMD Zen2 处理器开始支持。
  • 添加了“-mfunction-return=thunk-extern”标志以防止 RETBLEED 漏洞,该漏洞通过添加一系列指令来防止间接分支的推测执行机制的参与。

LLVM 15.0 的主要创新:

  • 添加了对 Cortex-M85 CPU、Armv9-A、Armv9.1-A 和 Armv9.2-A 架构、Armv8.1-M PACBTI-M 扩展的支持。
  • 添加了 DirectX 实验性后端,支持用于 DirectX 着色器的 DXIL(DirectX 中间语言)格式。 通过在汇编期间指定“-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX”参数来启用后端。
  • Libc++继续实现C++20和C++2b标准的新功能,包括完成“format”库的实现和建议的实验版本的“ranges”库。
  • 改进了 x86、PowerPC 和 RISC-V 架构的后端。
  • LLD 链接器和 LLDB 调试器的功能已得到增强。

来源: opennet.ru

添加评论