發布 LLVM 16.0 編譯器套件

經過六個月的開發,LLVM 16.0 專案發布了——一個與 GCC 相容的工具包(編譯器、優化器和程式碼產生器),可將程式編譯成類 RISC 虛擬指令的中間位碼(具有多層最佳化系統)。 產生的偽代碼可以在程式執行時直接使用 JIT 編譯器轉換為機器指令。

Clang 16.0 的主要改進:

  • 預設的 C++/ObjC++ 標準是 gnu++17(以前是 gnu++14),這表示預設支援具有 GNU 擴充功能的 C++17 功能。 要傳回先前的行為,可以使用“-std=gnu++14”選項。
  • 實現了與 C++20 標準相關的高階功能:
    • 有條件的平凡特殊成員函數,
    • 捕捉 lambda 函數中的結構化綁定,
    • 表達式內的相等運算符,
    • 在某些情況下可以選擇省略 typename 關鍵字,
    • 括號內的有效聚合初始化(“Aggr(val1, val2)”)。
  • 未來 C++2b 標準中定義的功能已實現:
    • 允許在複合表達式的末尾放置標籤,
    • 靜態運算子(),
    • 靜態運算子[],
    • 確保與 char8_t 類型的兼容性,
    • “\N{...}”中允許使用的字元範圍已擴大
    • 新增了在宣告為 constexpr 的函數中使用宣告為「static constexpr」的變數的功能。
  • 未來C標準C2x中定義的功能已經實現:
    • 若要停用“-Wunused-label”警告,允許將“[[maybe_unused]]”屬性套用至標籤
    • 允許將標籤放置在複合表達式中的任何位置,
    • 新增了 typeof 和 typeof_unqual 運算符,
    • 新類型 nullptr_t 和 nullptr 常數定義空指針,可以轉換為任何指針類型並表示未綁定到整數和 void* 類型的 NULL 變體。
    • 在 C2x 模式下,允許使用可變數量的參數(可變參數)呼叫 va_start 巨集。
  • 在 C99、C11 和 C17 合規模式中,預設選項「-Wimplicit-function-declaration」和「-Wimplicit-int」現在會產生錯誤而不是警告。
  • 在 C++ 模式下間接使用「void *」(例如「void func(void *p) { *p; }」)現在會產生錯誤,類似於 ISO C++、GCC、ICC 和 MSVC。
  • 在 Microsoft 風格的內聯彙編區塊中指定位元域作為指令操作數(例如“__asm { mov eax, s.bf }”)現在會產生錯誤。
  • 新增了對不同模組中是否存在具有相同名稱的不同結構和聯合的診斷。
  • 與 OpenCL 和 OpenMP 支援相關的功能已擴充。 改進了對 OpenCL 核心參數中使用的 C++ 模板的診斷。 改進了對 AMDGPU 的排隊塊支援。 nounwind 屬性隱式加入到所有函數中。 改進了對內建函數的支援。
  • 新增了使用 CLANG_CRASH_DIAGNOSTICS_DIR 環境變數來定義保存崩潰診斷資料的目錄的功能。
  • Unicode 支援已更新為 Unicode 15.0 規格。 標識符中允許使用一些數學符號,例如“₊”(例如“double xₖ₊₁”)。
  • 新增了對載入多個設定檔的支援(首先載入預設設定文件,然後載入透過「--config =」標誌指定的設定文件,現在可以多次指定)。 更改了設定檔的預設載入順序:clang 嘗試先載入文件- .cfg,如果沒有找到它會嘗試載入兩個文件.cfg 和.cfg。 為了預設禁用載入設定文件,新增了“--no-default-config”標誌。
  • 為了確保可重複構建,可以將 __DATE__、__TIME__ 和 __TIMESTAMP__ 巨集中的當前日期和時間值替換為 SOURCE_DATE_EPOCH 環境變數中指定的時間。
  • 為了檢查是否存在可在常數上下文中使用的內建函數(builtin),新增了巨集「__has_constexpr_builtin」。
  • 新增了新的編譯標誌“-fcoro-aligned-allocation”用於對齊的協程幀分配。
  • 「-fstrict-flex-arrays=」標誌實現了對結構中靈活數組元素的第三級驗證的支援(靈活數組成員,結構末尾的不定大小的數組)。 在第三級,只有大小“[]”(例如“int b[]”)被視為靈活數組,但大小“[0]”(例如“int b[0]”)被視為靈活數組不是。
  • 新增了“-fmodule-output”標誌以啟用標準 C++ 模組的單階段編譯模型。
  • 新增了“-Rpass-analysis=stack-frame-layout”模式以幫助診斷堆疊幀佈局問題。
  • 新增了新屬性__attribute__((target_version("cpu_features"))) 並擴展了屬性__attribute__((target_clones("cpu_features1","cpu_features2",...))) 的功能,以選擇AArch64 提供的函數的特定版本CPU。
  • 診斷工具擴充:
    • 新增了警告“-Wsingle-bit-bitfield-constant-conversion”,以在將 XNUMX 指派給一位有符號位元域時偵測隱式截斷。
    • 未初始化 constexpr 變數的診斷已擴展。
    • 新增了“-Wcast-function-type-strict”和“-Win相容-function-pointer-types-strict”警告,以識別函數類型轉換的潛在問題。
    • 新增了在導出區塊中使用不正確或保留的模組名稱的診斷。
    • 改進了定義中缺少的“auto”關鍵字的偵測。
    • 「-Winteger-overflow」警告的實施增加了對導致溢出的其他情況的檢查。
  • 實現了對LoongArch指令集架構(-march=loongarch64或-march=la464)的支持,用於龍芯3 5000處理器並實現新的RISC ISA,類似於MIPS和RISC-V。

LLVM 16.0 的主要創新:

  • LLVM 程式碼允許使用 C++17 標準中定義的元素。
  • 提高了建置LLVM的環境要求。 建置工具現在應該支援 C++17 標準,即要建置,您至少需要 GCC 7.1、Clang 5.0、Apple Clang 10.0 或 Visual Studio 2019 16.7。
  • AArch64 架構的後端增加了對 Cortex-A715、Cortex-X3 和 Neoverse V2 CPU 的支援、RME MEC(記憶體加密上下文)彙編器、Armv8.3 擴充(複數)和功能多版本控制。
  • 在ARM架構的後端中,對Armv2、Armv2A、Armv3和Armv3M目標平台的支援已停止,無法保證產生正確的程式碼。 新增了產生用於處理複數的指令程式碼的功能。
  • X86 架構的後端增加了對指令集架構 (ISA) AMX-FP16、CMPCCXADD、AVX-IFMA、AVX-VNNI-INT8、AVX-NE-CONVERT 的支援。 新增了對 RDMSRLIST、RMSRLIST 和 WRMSRNS 指令的支援。 實現了選項“-mcpu=raptorlake”、“-mcpu=meteorlake”、“-mcpu=emeraldrapids”、“-mcpu=sierraforest”、“-mcpu=graniterapids”和“-mcpu=grandridge”。
  • 新增對LoongArch平台的官方支援。
  • 改進了 MIPS、PowerPC 和 RISC-V 架構的後端
  • LLDB 偵錯器新增了對 LoongArch 架構的 64 位元可執行檔的偵錯支援。 改進了 COFF 調試符號的處理。 提供了已載入 Windows 模組清單中重複 DLL 的篩選。
  • 在Libc++函式庫中,主要工作集中在實作對C++20和C++23標準新功能的支援。
  • LDD 連結器透過並行化位址重定位掃描和段初始化操作,顯著縮短了連結時間。 增加了對使用 ZSTD 演算法的部分壓縮的支援。

來源: opennet.ru

添加評論