LLVM 13.0编译器集发布

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

Clang 13.0 的改进:

  • 实现了对有保证的尾部调用的支持(在函数的最后调用子例程,如果子例程调用自身,则形成尾部递归)。 对有保证的尾部调用的支持由 C++ 中的“[[clang::musttail]]”属性和 C 中的“__attribute__((musttail))”提供,用于“return”语句。 该功能允许您通过将代码部署到平面迭代中来实现优化,以节省堆栈消耗。
  • “using”声明和 clang 扩展支持使用“[[]]”格式定义 C++11 样式属性。
  • 添加了“-Wreserved-identifier”标志,以便在用户代码中指定保留标识符时显示警告。
  • 添加了“-Wunused-but-set-parameter”和“-Wunused-but-set-variable”标志,以便在设置但未使用参数或变量时显示警告。
  • 添加了“-Wnull-pointer-subtraction”标志,如果代码由于在减法运算中使用空指针而可能引入未定义的行为,则会发出警告。
  • 添加了“-fstack-usage”标志,为每个代码文件生成一个附加“.su”文件,其中包含有关正在处理的文件中定义的每个函数的堆栈帧大小的信息。
  • 静态分析器中添加了一种新的输出类型 - “sarif-html”,这导致同时生成 HTML 和 Sarif 格式的报告。 添加了新的 allocClassWithName 检查。 当指定“-analyzer-display-progress”选项时,将显示每个函数的分析时间。 智能指针分析器(alpha.cplusplus.SmartPtr)即将准备就绪。
  • 与 OpenCL 支持相关的功能已得到扩展。 添加了对新扩展 cl_khr_integer_dot_product、cl_khr_extended_bit_ops、__cl_clang_bitfields 和 __cl_clang_non_portable_kernel_param_types 的支持。 OpenCL 3.0 规范的实施仍在继续。 对于 C,默认情况下使用 OpenCL 1.2 规范,除非明确选择另一个版本。 对于 C++,添加了对扩展名为“.clcpp”的文件的支持。
  • 已实现对 OpenMP 5.1 规范中定义的循环转换指令(“#pragma omp unrol”和“#pragma omptile”)的支持。
  • 向 clang-format 实用程序添加了选项:SpacesInLineCommentPrefix 用于定义注释前的空格数、IndentAccessModifiers、LambdaBodyIndentation 和 PPIndentWidth 用于控制条目、lambda 表达式和预处理器指令的对齐方式。 扩展了对头文件枚举进行排序 (SortIncludes) 的可能性。 添加了对格式化 JSON 文件的支持。
  • 大部分新检查已添加到 linter clang-tidy 中。

LLVM 13.0 的主要创新:

  • 添加了“-ehcontguard”选项,以使用 CET(Windows 控制流强制技术)技术来防止在异常处理阶段使用面向返回编程 (ROP) 技术构建的漏洞的执行。
  • debuginfo-test 项目已更名为 cross-project-tests,旨在测试来自不同项目的组件,而不仅限于调试信息。
  • 组装系统为构建多个发行版提供支持,例如,一个带有实用程序,另一个带有供开发人员使用的库。
  • 在AArch64架构的后端,汇编器中实现了对Armv9-A RME(领域管理扩展)和SME(可扩展矩阵扩展)扩展的支持。
  • Hexagon 架构的后端添加了对 ISA V68/HVX 的支持。
  • x86 后端改进了对 AMD Zen 3 处理器的支持。
  • 向 AMDGPU 后端添加了对 GFX1013 RDNA2 APU 的支持。
  • Libc++ 继续实现 C++20 和 C++2b 标准的新功能,包括完成“concept”库。 添加了对基于 MinGW 的 Windows 平台的 std::filesystem 的支持。 头文件分开, 和。 添加了构建选项 LIBCXX_ENABLE_INCOMPLETE_FEATURES 以禁用未完全实现功能的头文件。
  • LLD链接器的功能得到了扩展,实现了对Big-endian Aarch64处理器的支持,并且Mach-O后端已达到允许链接常规程序的状态。 包括使用 LLD 链接 Glibc 所需的改进。
  • llvm-mca(机器代码分析器)实用程序添加了对按顺序执行指令(按序超标量管道)的处理器的支持,例如 ARM Cortex-A55。
  • AArch64 平台的 LLDB 调试器提供对指针身份验证、MTE(MemTag、内存标记扩展)和 SVE 寄存器的全面支持。 添加了命令,允许您将标签绑定到每个内存分配操作,并在访问内存时组织对指针的检查,该指针必须与正确的标签关联。
  • LLDB 调试器和 Fortran 语言前端 - Flang 已添加到项目生成的二进制程序集中。

来源: opennet.ru

添加评论