LLVM 20.0.0git 发行说明

警告

这些是即将发布的 LLVM 20 的正在进行的说明。以前版本的发布说明可以在下载页面上找到。

简介

本文档包含 LLVM 编译器基础架构版本 20.0.0git 的发行说明。在这里,我们描述了 LLVM 的状态,包括自上一个版本以来的主要改进、LLVM 各种子项目的改进以及当前代码的一些用户。所有 LLVM 版本都可以从LLVM 版本网站下载。

有关 LLVM 的更多信息,包括有关最新版本的信息,请查看LLVM 主网站。如果您有任何疑问或意见,Discourse 论坛是一个很好的提问场所。

请注意,如果您是从 Git 检出或 LLVM 主网站读取此文件,则本文档适用于下一个版本,而不是当前版本。要查看特定版本的发布说明,请参阅版本页面

此版本中更改的非全面列表

构建 LLVM 所需工具链的更新

LLVM IR 的更改

  • x86_mmx IR 类型已被移除。它将在比特码升级中转换为标准向量类型<1 x i64>

  • llvm.experimental.stepvector 内联函数重命名为llvm.stepvector

LLVM 基础设施的更改

构建 LLVM 的更改

TableGen 的更改

过程间优化的更改

AArch64 后端的更改

  • 代码段中的.balign N, 0.p2align N, 0.align N, 0现在将用一系列0x0字节(请求的填充值)填充所需的对齐空间,而不是 NOP。

AMDGPU 后端的更改

  • 已移除llvm.amdgcn.flat.atomic.faddllvm.amdgcn.global.atomic.fadd 内联函数。用户应改用带有fadd 和 addrspace(0) 或 addrspace(1) 的atomicrmw 指令。

ARM 后端的更改

  • 代码段中的.balign N, 0.p2align N, 0.align N, 0现在将用一系列0x0字节(请求的填充值)填充所需的对齐空间,而不是 NOP。

AVR 后端的更改

DirectX 后端的更改

Hexagon 后端的更改

LoongArch 后端的更改

MIPS 后端的更改

PowerPC 后端的更改

RISC-V 后端的更改

  • 代码段中的.balign N, 0.p2align N, 0.align N, 0现在将用一系列0x0字节(请求的填充值)填充所需的对齐空间,而不是 NOP。

  • 添加了 Syntacore SCR4 和 SCR5 CPU:-mcpu=syntacore-scr4/5-rv32/64

  • -mcpu=sifive-p470 已添加。

  • 添加了 RP2350 的 Hazard3 CPU:-mcpu=rp2350-hazard3(仅限 32 位)。

  • 现在,使用 RVV 指令的固定长度向量支持需要 VLEN>=64。这意味着 Zve32x 和 Zve32f 也将需要 Zvl64b。之前的支持基本上没有经过测试。

  • Zvbc32eZvkgs 扩展现在已实验性地支持。

  • 添加了SmctrSsctr 扩展。

WebAssembly 后端的更改

Windows 目标的更改

X86 后端的更改

  • 代码段中的.balign N, 0x90.p2align N, 0x90.align N, 0x90现在将用重复的0x90字节填充所需的对齐空间,而不是使用优化的 NOP 填充。优化的 NOP 填充使用各种宽度的 NOP 指令填充空间,而不仅仅是使用0x90字节编码的那些。要在代码段中使用优化的 NOP 填充,请省略“fillval”参数,即分别为.balign N.p2align N.align N

  • 由于x86_mmx IR 类型已移除,因此具有x86_mmx 参数或返回值的函数将使用不同的、不兼容的调用约定 ABI。此类函数在实际应用中通常不会出现(Clang 永远不会生成它们!),因此预计不会导致实际的兼容性问题。

  • 支持AVX10.2-256AVX10.2-512 的 ISA。

OCaml 绑定的更改

Python 绑定的更改

C API 的更改

  • 由于x86_mmx IR 类型已移除,以下符号已被删除

    • LLVMX86_MMXTypeKind

    • LLVMX86MMXTypeInContext

    • LLVMX86MMXType

  • 以下函数已添加,以进一步支持非空终止字符串

  • LLVMGetNamedFunctionWithLength

  • LLVMGetNamedGlobalWithLength

  • 以下函数已添加,用于访问与LLVMValueRefLLVMBuilderRef 对象关联的LLVMContextRef

    with LLVMValueRef and LLVMBuilderRef objects

    • LLVMGetValueContext

    • LLVMGetBuilderContext

  • 新的 Pass Manager 现在可以使用自定义别名分析管道调用,使用LLVMPassBuilderOptionsSetAAPipeline 函数。

  • 现在还可以通过调用LLVMRunPassesOnFunction 而不是LLVMRunPasses 在单个函数上运行新的 Pass Manager。

  • 已添加对使用自定义同步范围创建指令的支持

    • LLVMGetSyncScopeID 用于将同步范围名称映射到 ID。

    • LLVMBuildFenceSyncScopeLLVMBuildAtomicRMWSyncScopeLLVMBuildAtomicCmpXchgSyncScope 版本的现有构建器函数,带有一个额外的同步范围 ID 参数。

    • LLVMGetAtomicSyncScopeIDLLVMSetAtomicSyncScopeID 用于获取和设置任何原子指令的同步范围。

    • LLVMIsAtomic 用于检查指令是否为原子指令,以与上述函数一起使用。由于向后兼容性,LLVMIsAtomicSingleThreadLLVMSetAtomicSingleThread 将继续与任何指令类型一起使用。

  • LLVMSetPersonalityFnLLVMSetInitializer API 现在分别支持通过传递空指针来清除个性函数和初始化程序。

代码生成基础设施的更改

元数据信息的更改

调试信息的更改

LLVM 工具的更改

LLDB 的更改

BOLT 的更改

Sanitizers 的更改

其他更改

使用 LLVM 19 的外部开源项目

  • 一个项目……

其他信息

可以在 LLVM 网页 上找到各种其他信息,特别是在 文档 部分。网页还包含与源代码的 Git 版本保持一致的 API 文档版本。您可以通过进入 LLVM 代码树中的 llvm/docs/ 目录来访问特定于此版本的这些文档。

如果您有任何关于 LLVM 的问题或意见,请随时通过 Discourse 论坛 与我们联系。