LLVM 10.0编译器集发布

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

LLVM 10.0 中的新功能包括对 C++ 概念的支持、不再将 Clang 作为单独的进程运行、支持 Windows 的 CFG(控制流防护)检查以及对新 CPU 功能的支持。

改进之处 在 Clang 10.0 中:

  • 添加了对“概念”,一个 C++ 模板扩展,将包含在下一个标准中,代号为 C++2a(由 -std=c++2a 标志打开)。
    概念允许您定义一组模板参数要求,这些要求在编译时限制可以接受为模板参数的参数集。 这些概念可用于避免模板内使用的数据类型的属性与输入参数的数据类型属性之间的逻辑不一致。

    模板
    概念 EqualityComparable = 需要(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • 默认情况下,停止启动执行编译的单独进程(“clang -cc1”)。 现在编译已在主进程中完成,“-fno-integrated-cc1”选项可用于恢复旧的行为。
  • 新的诊断模式:
    • “-Wc99-designator”和“-Wreorder-init-list”警告不要在 C++ 模式下使用 C99 初始值设定项,因为它们在 C99 中正确但在 C++20 中不正确。
    • “-Wsizeof-array-div” - 捕获诸如“int arr[10];”之类的情况…sizeof(arr) / sizeof(short)…”(应该是“sizeof(arr) / sizeof(int)”)。
    • “-Wxor-used-as-po” - 警告不要使用结构,例如在可能与求幂 (2^16) 混淆的运算中使用“^”(xor)运算符。
    • “-Wfinal-dtor-non-final-class” - 警告未用“final”说明符标记的类,但具有带有“final”属性的析构函数。
    • “-Wtautological-bitwise-compare”是一组警告,用于诊断按位运算和常量之间的同义反复比较,以及识别将按位 OR 运算应用于非负数的始终为真比较。
    • “-Wbitwise-conditional-parentheses”警告将逻辑运算符 AND (&) 和 OR (|) 与条件运算符 (?:) 混合时出现的问题。
    • “-Wmisleading-indentation”类似于 GCC 中的同名检查,它警告缩进表达式,就好像它们是 if/else/for/while 块的一部分,但实际上它们不包含在该块中。
    • 当指定“-Wextra”时,启用“-Wdeprecated-copy”检查,警告有关构造函数的使用
      具有显式析构函数定义的类中的“移动”和“复制”。

    • “-Wtautological-overlap-compare”、“-Wsizeof-pointer-div”、“-Wtautological-compare”、“-Wrange-loop-analysis”检查已得到扩展。
    • 默认情况下禁用“-Wbitwise-op-parentheses”和“-Wlogic-op-parentheses”检查。
  • 在 C 和 C++ 代码中,仅允许在数组中进行指针算术运算。 “-fsanitize=pointer-overflow”模式下的未定义行为清理程序现在可以捕获向空指针添加非零偏移量或在从非空指针中减去整数时创建空指针等情况。
  • “-fsanitize=implicit-conversion”(隐式转换清理程序)模式适用于识别位大小小于“int”类型的类型的递增和递减操作的问题。
  • 在向量化中默认选择 x86 目标架构时“-march=skylake-avx512”、“-march=icelake-client”、“-march=icelake-server”、“-march=cascadelake”和“-march=cooperlake”代码已停止使用 512 位 zmm 寄存器,除了源代码中的直接指示之外。 原因是执行 512 位操作时 CPU 频率会降低,这会对整体性能产生负面影响。 要更改新行为,提供了选项“-mprefer-vector-width=512”。
  • “-flax-vector-conversions”标志的行为与 GCC 类似:禁止整数和浮点向量之间的隐式向量位转换。 为了消除这个限制,建议使用标志
    “-flax-vector-conversions=all”是默认值。

  • 改进了对 Octeon 系列 MIPS CPU 的支持。 将“octeon+”添加到有效 CPU 类型列表中。
  • 当组装成 WebAssembly 中间代码时,会自动调用 wasm-opt 优化器(如果系统中可用)。
  • 对于基于RISC-V架构的系统,在汇编器内联插入的条件块中允许使用存储浮点值的寄存器。
  • 添加了新的编译器标志:“-fgnuc-version”以设置“__GNUC__”和类似宏的版本值; "-fmacro-prefix-map=OLD=NEW" 将宏中的目录前缀 OLD 替换为 NEW,例如“__FILE__”; “-fpatchable-function-entry=N[,M]”在函数入口点之前和之后生成一定数量的NOP指令。 对于RISC-V
    添加了对“-ffixed-xX”、“-mcmodel=medany”和“-mcmodel=medlow”标志的支持。

  • 添加了对 '__attribute__((target(“branch-protection=..."))) 属性的支持,其效果与选项类似 -分支保护.
  • 在Windows平台上,当指定“-cfguard”标志时,实现了执行流完整性检查(控制流保护)对间接函数调用的替代。 要禁用检查替换,可以使用“-cfguard-nochecks”标志或“__declspec(guard(nocf))”修饰符。
  • 在不使用“extern”关键字的情况下,gnu_inline 属性的行为与 GCC 类似。
  • 与 OpenCL 和 CUDA 支持相关的功能已得到扩展。 添加了对 OpenMP 5.0 新功能的支持。
  • clang-format 实用程序中添加了 Standard 选项,它允许您确定解析和格式化代码时使用的 C++ 标准版本(Latest、Auto、c++03、c++11、c++14、 c++17、c++20)。
  • 静态分析器中添加了新的检查: alpha.cplusplus.PlacementNew 用于确定是否有足够的存储空间,fuchsia.HandleChecker 用于检测与 Fuchsia 处理程序相关的泄漏,security.insecureAPI.decodeValueOfObjCType 用于在使用 [NSCoderdecodeValueOfObjCType 时检测潜在的缓冲区溢出:在:] 。
  • Undefined Behaviour Sanitizer (UBSan) 扩展了其指针溢出检查,以捕获对 NULL 指针的非零偏移量的应用或由此产生的 NULL 指针偏移量的添加。
  • 干净整洁的短绒 添加 很大一部分是新支票。

创新 LLVM 10.0:

  • 到框架 归因者 添加了新的过程间优化和分析器。 预测了19个不同属性的状态,包括12个属性12个LLVM IR和7个抽象属性(例如liveness)。
  • 添加了编译器内置的新矩阵数学函数(内在的),在编译期间被高效的向量指令取代。
  • 针对 X86、AArch64、ARM、SystemZ、MIPS、AMDGPU 和 PowerPC 架构的后端进行了大量改进。 添加了CPU支持
    Cortex-A65、Cortex-A65AE、Neoverse E1 和 Neoverse N1。 对于 ARMv8.1-M,代码生成过程已得到优化(例如,出现了对具有最小开销的循环的支持),并使用 MVE 扩展添加了对自动向量化的支持。 改进了 CPU MIPS Octeon 支持。 对于 PowerPC,启用了使用 MASSV(数学加速子系统)库的数学子例程矢量化,改进了代码生成,并优化了循环的内存访问。 对于 x86,矢量类型 v2i32、v4i16、v2i16、v8i8、v4i8 和 v2i8 的处理已更改。

  • 改进了 WebAssembly 的代码生成器。 添加了对 TLS(线程本地存储)和atomic.fence 指令的支持。 SIMD 支持已显着扩展。 WebAssembly 对象文件现在能够使用多值函数签名。
  • 分析器在处理循环时使用 内存SSA,它允许您定义不同内存操作之间的依赖关系。 MemorySSA 可以减少编译和执行时间,或者可以用来代替 AliasSetTracker,而不会损失性能。
  • LLDB 调试器显着改进了对 DWARF v5 格式的支持。 改进了对使用 MinGW 进行构建的支持
    并添加了调试 ARM 和 ARM64 架构的 Windows 可执行文件的初始功能。 添加了按 Tab 自动完成输入时提供的选项的描述。

  • 扩展 LLD 链接器功能。 改进了对 ELF 格式的支持,包括确保 glob 模板与 GNU 链接器完全兼容,添加对压缩调试节“.zdebug”的支持,添加 PT_GNU_PROPERTY 属性来定义 .note.gnu.property 节(可以在将来使用) Linux 内核),
    “-zoseparate-code”、“-zseparate-code”和“-zseparate-loadable-segments”模式已经实现。 改进了对 MinGW 和 WebAssembly 的支持。

来源: opennet.ru

添加评论