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 內建函式。使用者應該改用 atomicrmw 指令和 fadd 以及 addrspace(0) 或 addrspace(1)。

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

  • 新增 Hazard3 CPU,其已完成 RP2350 的佈局:-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

    • LLVMGetValueContext

    • LLVMGetBuilderContext

  • 現在可以使用自訂別名分析管道來呼叫新的 Pass Manager,方法是使用 LLVMPassBuilderOptionsSetAAPipeline 函式。

  • 現在也可以在單一函式上執行新的 Pass Manager,方法是呼叫 LLVMRunPassesOnFunction 而不是 LLVMRunPasses

  • 新增了對建立具有自訂同步範圍的指令的支援

    • LLVMGetSyncScopeID 可將同步範圍名稱映射至 ID。

    • 現有建構器函式的 LLVMBuildFenceSyncScopeLLVMBuildAtomicRMWSyncScopeLLVMBuildAtomicCmpXchgSyncScope 版本,並帶有一個額外的同步範圍 ID 參數。

    • LLVMGetAtomicSyncScopeIDLLVMSetAtomicSyncScopeID 可取得和設定任何原子指令的同步範圍。

    • LLVMIsAtomic 可檢查指令是否為原子指令,以便與上述函式搭配使用。為了向後相容,LLVMIsAtomicSingleThreadLLVMSetAtomicSingleThread 繼續適用於任何指令類型。

  • LLVMSetPersonalityFnLLVMSetInitializer API 現在分別支援透過傳遞空指標來清除個性化函式和初始值設定項。

程式碼生成基礎架構的變更

中繼資料資訊的變更

除錯資訊的變更

LLVM 工具的變更

LLDB 的變更

BOLT 的變更

Sanitizers 的變更

其他變更

使用 LLVM 19 的外部開放原始碼專案

  • 一個專案...

其他資訊

LLVM 網頁 上可以找到各種額外的資訊,特別是在 文件 部分。該網頁還包含與 Git 版本的原始碼保持同步的 API 文件版本。您可以透過進入 LLVM 樹中的 llvm/docs/ 目錄來存取此版本專屬的文件版本。

如果您對 LLVM 有任何問題或意見,請隨時透過 Discourse 論壇 與我們聯繫。