经过六个月的开发
LLVM 9.0 的新功能包括从目标 RISC-V 平台中删除实验设计标签、对 OpenCL 的 C++ 支持、将程序拆分为 LLD 中动态加载部分的能力以及“
-
添加者 GCC 特定表达式的实现“asm 转到 “,它允许您从汇编器内联块移动到 C 代码中的标签。 在 x86_64 架构的系统上使用 Clang 以“CONFIG_JUMP_LABEL=y”模式构建 Linux 内核需要此功能。 考虑到之前版本中添加的更改,现在可以在 Clang 中为 x86_64 架构构建 Linux 内核(之前仅支持为 arm、aarch64、ppc32、ppc64le 和 mips 架构构建)。 此外,Android 和 ChromeOS 项目已经转换为使用 Clang 进行内核构建,并且 Google 正在测试 Clang 作为为其生产 Linux 系统构建内核的主要平台。 将来,其他LLVM组件可以在内核构建过程中使用,包括LLD、llvm-objcopy、llvm-ar、llvm-nm和llvm-objdump; - 添加了对在 OpenCL 中使用 C++17 的实验支持。 具体功能包括支持地址空间属性、通过类型转换运算符阻止地址空间转换、提供 OpenCL for C 中的向量类型、存在用于图像、事件、通道等的特定 OpenCL 类型。
- 添加了新的编译器标志“-ftime-trace”和“-ftime-trace-粒度=N”,以生成有关前端(解析、初始化)和后端(优化阶段)各个阶段的执行时间的报告。 报告以json格式保存,兼容chrome://tracing和speedscope.app;
- 添加了“__declspec(allocator)”说明符的处理并生成随附的调试信息,使您可以监视 Visual Studio 环境中的内存消耗;
- 对于C语言,增加了对“__FILE_NAME__”宏的支持,该宏类似于“__FILE__”宏,但仅包含文件名,不包含完整路径;
- C++ 扩展了对地址空间属性的支持,以涵盖各种 C++ 功能,包括参数和实参模式、引用类型、返回类型推断、对象、自动生成的函数、内置运算符等。
- 与 OpenCL、OpenMP 和 CUDA 支持相关的功能已得到扩展。 这包括对内置 OpenCL 函数的隐式包含的初步支持(已添加“-fdeclare-opencl-builtins”标志)、已实现 cl_arm_integer_dot_product 扩展以及已扩展的诊断工具;
- 静态分析器的工作得到了改进,并添加了有关执行静态分析的文档。 添加了显示可用检查器模块和支持的选项的标志(“-analyzer-checker[-option]-help”、“-analyzer-checker[-option]-help-alpha”和“-analyzer-checker[-option]-help” “-开发人员”)。 添加了“-analyzer-werror”标志以将警告视为错误。
添加了新的验证模式:- security.insecureAPI.DeprecatedOrUnsafeBufferHandling 用于识别使用缓冲区的不安全做法;
- osx.MIGChecker 用于搜索违反 MIG(马赫接口生成器)调用规则的情况;
- optin.osx.OSObjectCStyleCast 查找不正确的 XNU libkern 对象转换;
- apiModeling.llvm 具有一组建模检查函数,用于检测 LLVM 代码库中的错误;
- 用于检查未初始化的 C++ 对象的稳定代码(optin.cplusplus 包中的 UninitializedObject);
- clang-format 实用程序添加了对 C# 语言格式化代码的支持,并提供对 Microsoft 使用的代码格式化样式的支持;
- clang-cl 是一种替代命令行界面,它提供与 Visual Studio 中包含的 cl.exe 编译器的选项级兼容性,它添加了启发式方法,将不存在的文件视为命令行选项并显示相应的警告(例如,运行“clang-cl /diagnostic :caret /c test.cc”时);
- linter clang-tidy 中添加了大量新检查,包括特定于 OpenMP API 的添加检查;
-
扩展 服务器能力铿锵 (Clang Server),其中默认启用后台索引构建模式,添加了对代码上下文操作的支持(变量检索、自动和宏定义的扩展、转义字符串到非转义字符串的转换),能够显示来自 Clang-tidy 的警告,扩展了头文件中错误的诊断,并添加了显示有关类型层次结构的信息的功能;
主
- LLD 链接器中添加了一项实验性分区功能,该功能允许您将一个程序拆分为多个部分,每个部分位于一个单独的 ELF 文件中。 此功能允许您启动程序的主要部分,该部分将在运行过程中根据需要加载其他组件(例如,您可以将内置的 PDF 查看器分离成一个单独的文件,该文件仅在用户打开 PDF 时加载)文件)。
LLD链接器
未报告 到适合链接arm32_7、arm64、ppc64le和x86_64架构的Linux内核的状态。
新选项“-”(输出到标准输出)、“-[no-]allow-shlib-undefined”、“-undefined-glob”、“-nmagic”、“-omagic”、“-dependent-library”、“- z ifunc-noplt”和“-z 公共页面大小”。 对于AArch64架构,增加了对BTI(分支目标指示符)和PAC(指针验证码)指令的支持。 对 MIPS、RISC-V 和 PowerPC 平台的支持得到了显着改进。 添加了对 WebAssembly 动态链接的初步支持; - 在 libc++ 中
实施的 函数 ssize、std::is_constant_evaluated、std::midpoint 和 std::lerp,方法“front”和“back”已添加到 std::span,类型 std::is_unbounded_array 和 std::is_bounded_array 的属性已添加,std 功能已扩展::atomic。 对 GCC 4.9 的支持已停止(可与 GCC 5.1 及更高版本一起使用)。 增加了支持瓦西 (WebAssembly System Interface,在浏览器外使用WebAssembly的接口); - 添加了新的优化。 在某些情况下启用了 memcmp 调用到 bcmp 的转换。 实现了对跳转表的跳过范围检查,其中较低的开关块不可访问或未使用指令时,例如,调用 void 类型的函数时;
- RISC-V 架构的后端已经稳定,不再定位为实验性的,而是默认构建的。 为具有 MAFDC 扩展的 RV32I 和 RV64I 指令集变体提供完整的代码生成支持;
- 针对 X86、AArch64、ARM、SystemZ、MIPS、AMDGPU 和 PowerPC 架构的后端进行了大量改进。 例如,对于建筑
AArch64增加了对SVE2(Scalable Vector Extension 2)和MTE(Memory Tagging Extensions)指令的支持;在ARM后端,增加了对Armv8.1-M架构和MVE(M-Profile Vector Extension)扩展的支持。 AMDGPU后端添加了对GFX10(Navi)架构的支持,默认启用函数调用功能,并激活组合通道民进党 (数据并行基元)。 - LLDB 调试器现在具有回溯颜色突出显示功能,并添加了对 DWARF4 debug_types 和 DWARF5 debug_info 块的支持;
- llvm-objcopy 和 llvm-strip 实用程序中添加了对 COFF 格式的对象和可执行文件的支持。
来源: opennet.ru