發布 LLVM 22 編譯器套件

經過六個月的開發,LLVM 22.1.0 正式發布。它開發了一系列工具(編譯器、最佳化器和程式碼產生器),可以將程式編譯成類似 RISC 架構的虛擬指令的中間位元程式碼(一種具有多層最佳化系統的底層虛擬機器)。產生的偽代碼可以轉換為特定目標平台的機器碼,也可以被即時 (JIT) 編譯器用於在程式執行期間​​直接產生機器指令。基於 LLVM 技術,該專案正在開發 Clang 編譯器,支援 C、C++ 和 Objective-C 程式語言。從 18.x 分支開始,該專案採用了新的版本編號方案,其中版本 0(“N.0”)用於開發階段,第一個穩定版本編號為“N.1”。

Clang 22 的改進包括:

  • 新增對記憶體分配令牌(Allocation Tokens)的支持,用於為使用 malloc 等函數執行的記憶體分配操作添加唯一識別碼。分配令牌有助於建立堆疊資訊結構,簡化記憶體洩漏偵測,並支援根據物件用途或修改模式對其進行分組(例如,將「熱」資料與「冷」資料分開)。若要啟用此功能,請使用“-fsanitize=alloc-token”標誌。
  • C語言相關特性:
    • 已實作定義「defer」延遲執行機制的規範草案,允許在目前作用域結束後執行操作。已新增“-fdefer-ts”標誌以啟用“defer”支援。
    • 新增了內建函數 `__builtin_stack_address()`,與 GCC 中的類似函數相對應。此函數傳回堆疊位址,用於分隔呼叫 `__builtin_stack_address()` 的目前函數及其後續呼叫函數的堆疊區域。
  • 正在為未來 C2y 標準開發的功能:
    • 新增了對命名循環的支持,允許您為循環和 switch 語句指定名稱,這些名稱可以在 break 和 continue 語句中指定,以明確定義要退出的循環。外層迴圈:for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // 跳到 CONT1 continue outer; // 跳到 CONT2 // CONT1 } // CONT2 }
    • 用於產生唯一識別碼名稱的內建巨集「__COUNTER__」的實作已擴展並納入標準。此巨集的呼叫次數上限為2147483647次;超過此上限將導致錯誤。
    • 移除在宣告為「extern inline」的函數中使用靜態函數或變數時發出的警告(-Wstatic-in-inline)。
  • C23 C 標準中定義的功能:
    • float.h 頭檔現在支援 FLT_SNAN、DBL_SNAN 和 LDBL_SNAN 宏,它們為 float、double 和 long double 類型實作了帶有訊號的 NaN 值(在算術運算中使用時會引發異常)。
    • 修正了一個錯誤,即如果不同的未命名類型具有相同的字段,則它們在同一個翻譯單元中會被視為相容。
    • 用於在依賴項掃描期間忽略缺失頭檔的「-MG」標誌已擴展到「#embed」指令,現在當「#embed」指令中指定的檔案缺失時,會抑制「找不到檔案」錯誤。
  • C++相關功能:
    • 新增了在 `constexpr` 上下文中使用結構化綁定的功能,該功能是在 C++2c (C++26) 規範中開發的。這意味著對常數表達式的引用現在本身也可以是常數表達式。目前已實現對數組和簡單結構體的支援(尚不支援元組)。例如:`constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;`
    • 根據 C++20 標準的要求,約束現在在檢查之前會轉換為標準形式,從而可以產生更準確的診斷訊息,並正確處理僅在概念 ID 中使用的模板參數的替換錯誤。
    • 新增了一系列內建函數“__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship”,用於尋找比較運算子“<”、“">”、“<="”和“">="”是否由“<=>”運算符合成。
    • 「-Wincompatible-pointer-types」參數已變更為輸出錯誤訊息而非警告訊息。若要恢復先前的行為,請使用「-Wno-error=incompatible-pointer-types」選項。
  • 新增了內建函數__builtin_bswapg、__builtin_elementwise_ldexp、__builtin_elementwise_fshl、__builtin_elementwise_fshr、__builtin_elementwise_minnumnum、__builtin_elementwise_maxnu mnum、__builtin_masked_load、__builtin_masked_expand_load、__builtin_masked_store、__builtin_masked_compress_store、__builtin_masked_gather、__builtin_masked_scatter和 __builtin_dedup_pack。例如,`builtin_dedup_pack` 允許您從類型清單中刪除重複項:`using MyTypeList = TypeList<__builtin_dedup_pack>` …>; // 結果類型將是 TypeList
  • 使用 UBSan 偵錯未定義行為時(-fsanitize=undefined -fsanitize-trap=undefined),產生的偵錯資訊中現在包含錯誤原因資訊。新增了“-fsanitize-debug-trap-reasons”標誌,用於指定錯誤訊息的詳細程度。可以將其設為「basic」以顯示一般描述(例如,「整數加法溢位」),也可以設定為「detailed」以包含詳細資訊(例如,「'a + b' 中的有符號整數加法溢位」)。
  • 新增了新的編譯器標誌:
    • "-f[no-]sanitize-debug-trap-reasons" 用於控制在使用 "-fsanitize-trap" 模式編譯時,是否將異常陷阱原因嵌入到偵錯資訊中。
    • 「-fsanitize=alloc-token」、「-falloc-token-max」、「-fsanitize-alloc-token-fast-abi」和「-fsanitize-alloc-token-extended」用於管理記憶體分配令牌。
    • "-fmatrix-memory-layout" 用於控制矩陣類型的記憶體佈局(例如,列優先矩陣使用列優先,行優先矩陣使用行優先)。
  • 現在函數有一個名為「malloc_span」的屬性,類似於 malloc 屬性,但適用於傳回類似 span 的結構的函數,該結構包含一個指標和一個字段,該字段表示區塊的大小或指向區塊末尾的指標。
  • 新增了「modular_format」屬性,以便在連結時動態選擇 printf 函數所需的靜態連結實作。
  • 診斷和靜態分析工具已擴展,新增了檢查項目(數十項與診斷相關的改進)。
  • X86 後端已新增 SSE、AVX 和 AVX512 擴充的附加內部函數。已為基於 Wildcat Lake (-march=wildcatlake) 和 Nova Lake (-march=novalake) 微架構的 Intel CPU 新增建置模式。
  • AArch64 後端現已支援 Ampere Computing 的 Ampere1C (ampere1c)、Arm C1-Nano (c1-nano)、Arm C1-Pro (c1-pro)、Arm C1-Premium (c1-premium) 和 Arm C1-Ultra (c1-ultra) 處理器。此外,也為 FCVTZ[US]、FCVTN[US]、FCVTM[US]、FCVTP[US] 和 FCVTA[US] 指令新增了內建函數。函數多版本 (FMV) 支援已穩定。使用者現在可以設定不同函數版本的優先權。
  • 增加了對 LoongArch32 (LA32R, LA32S) 架構的支援。
  • 改進了對 ARM、AMDGPU、RISC-V、LoongArch64、MIPS、WebAssembly 和 PowerPC 架構的後端。

來源: opennet.ru

為具有 DDoS 保護、VPS VDS 服務器的站點購買可靠的主機 🔥 購買具備 DDoS 防護的可靠網站寄存服務,包括 VPS 和 VDS 伺服器 | ProHoster