LLVM 9.0编译器集发布

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

LLVM 9.0 的新功能包括从目标 RISC-V 平台中删除实验设计标签、对 OpenCL 的 C++ 支持、将程序拆分为 LLD 中动态加载部分的能力以及“asm 转到”,在 Linux 内核代码中使用。 libc++ 添加了对 WASI(WebAssembly 系统接口)的支持,LLD 添加了对 WebAssembly 动态链接的初始支持。

改进之处 在 Clang 9.0 中:

  • 添加者 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 的警告,扩展了头文件中错误的诊断,并添加了显示有关类型层次结构的信息的功能;

创新 LLVM 9.0:

  • 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

添加评论