GCC 12編譯器套件發布

經過一年的開發,免費編譯器套件 GCC 12.1 已經發布,這是新的 GCC 12.x 分支中的第一個重要版本。依照新的版本編號方案,開發過程中使用了12.0版本,在GCC 12.1發布前不久,GCC 13.0分支已經分支出來,在此基礎上下一個主要版本GCC 13.1將被形成。 23 月 35 日,該計畫將慶祝第一屆 GCC 成立 XNUMX 週年。

主要變化:

  • 新增了對 CTF(緊湊類型格式)調試格式的支持,該格式提供有關 C 類型、函數之間的連接和調試符號的資訊的緊湊存儲。當嵌入 ELF 物件中時,此格式允許使用 EFL 字元表來避免資料重複。
  • 對 1980 世紀 XNUMX 年代創建的「STABS」偵錯資訊儲存格式的支援已被棄用。
  • 繼續努力擴展對 C 和 C++ 語言的未來 C2X 和 C++23 標準的支援。例如,新增了對“if consteval”表達式的支援;允許在函數參數中使用 auto (“f(auto(g()))”);在宣告為 constexpr 的函數中允許使用非文字變數、goto 和標籤;新增了對多維索引運算子operator[]的支援;在 if、for 和 switch 中,初始化區塊的功能得到了擴展(“for (using T = int; T e : v)”)。
  • C++ 標準函式庫改進了對 C++20 和 C++23 標準實驗部分的支援。新增了對 std::move_only_function、、std::basic_string::resize_and_overwrite、、 和 std::invoke_r 的支援。允許在 constexpr 函數中使用 std::unique_ptr、std::vector、std::basic_string、std::optional 和 std::variant。
  • Fortran 前端提供對 TS 29113 規範的全面支持,該規範描述了確保 Fortran 和 C 代碼之間可移植性的功能。
  • 新增了對先前新增至 Clang 的 __builtin_shufflevector(vec1, vec2, index1, index2, ...) 擴充功能的支持,它提供了一個呼叫來執行常見的向量洗牌和洗牌操作。
  • 使用「-O2」最佳化等級時,預設啟用向量化(啟用 -ftree-vectorize 和 -fvect-cost-model=very-cheap 模式)。只有當向量程式碼可以完全取代正在向量化的標量程式碼時,非常便宜的模型才允許向量化。
  • 新增了「-ftrivial-auto-var-init」模式,以啟用堆疊上變數的明確初始化,以追蹤問題並阻止與使用未初始化變數相關的漏洞。
  • 對於 C 和 C++ 語言,新增了內建函數 __builtin_dynamic_object_size 來確定物件的大小,與 Clang 中的類似函數相容。
  • 對於 C 和 C++ 語言,新增了對「不可用」屬性的支援(例如,您可以標記在嘗試使用時將產生錯誤的函數)。
  • 對於 C 和 C++ 語言,新增了對預處理指令「#elifdef」和「#elifndef」的支援。
  • 新增了「-Wbidi-chars」標誌,以便在 UTF-8 字元使用不正確時顯示警告,從而更改雙向文字的顯示順序。
  • 新增了“-Warray-compare”標誌,以在嘗試比較引用數組的兩個操作數時顯示警告。
  • OpenMP 5.0 和 5.1(開放式多處理)標準的實施,定義了在具有共享記憶體和向量化單元 (SIMD) 的多核心和混合 (CPU+GPU/DSP) 系統上應用平行程式設計方法的 API 和方法,一直持續著。
  • 改進了 OpenACC 2.6 平行程式設計規範的實現,該規範定義了用於在 GPU 和專用處理器(例如 NVIDIA PTX)上卸載操作的工具。
  • x86 架構的程式碼產生後端增加了對擴充指令 Intel AVX512-FP16 和 _Float16 類型的支援。
  • 對於 x86 架構,增加了對無條件向前跳轉操作後推測執行指令所導致的處理器漏洞的保護。此問題的發生是由於搶佔式處理記憶體中緊接在分支指令之後的指令(SLS,直線推測)所致。為了啟用保護,建議使用“-mharden-sls”選項。
  • 在實驗靜態分析器中加入了對未初始化變數的使用的檢測。新增了對分析內聯插入中的彙編程式碼的初始支援。改進了記憶體追蹤。處理 switch 表達式的程式碼已重寫。
  • 新增了 30 個對 libgccjit 的新調用,libgccjit 是一個共享庫,用於將程式碼產生器嵌入到其他進程中,並使用它將字節碼 JIT 編譯為機器碼。
  • 後端添加了對CO-RE(Compile Once - Run Everywhere)機制的支持,用於生成BPF字節碼,這使得您只需為Linux內核編譯一次eBPF程式的程式碼,並使用適應Linux內核的特殊通用載入器將程式載入到目前核心和 BPF 類型格式)。 CO-RE 解決了編譯後的 eBPF 程式的可攜性問題,以前這些程式只能在編譯它們的核心版本中使用,因為資料結構中元素的位置隨著版本的不同而變化。
  • RISC-V 後端增加了對新指令集架構擴展 zba、zbb、zbc 和 zbs 的支持,以及針對向量和標量加密操作的 ISA 擴展。預設情況下,提供對 RISC-V ISA 20191213 規範的支援。已新增 -mtune=thead-c906 標誌以啟用 T-HEAD c906 內核的最佳化。
  • 基於 GCN 微架構的 AMD GPU 的程式碼產生後端增加了對 __int128_t/integer(kind=16) 類型的支援。每個運算單元 (CU) 最多可使用 40 個工作群組,每組最多可使用 16 個指令前端(波前,一組由 SIMD 引擎並行執行的執行緒)。以前,每個 CU 只允許有一個指令沿。
  • NVPTX 後端旨在使用 NVIDIA PTX(平行執行緒執行)指令集架構產生程式碼,增加了使用「-march」、「-mptx」和「-march-map」標誌的功能。實現了對 PTX ISA sm_53、sm_70、sm_75 和 sm_80 的支援。預設架構是 sm_30。
  • 在PowerPC / PowerPC64 / RS6000處理器的後端,內建函數的實作已重寫。內建函數 __builtin_get_texasr、__builtin_get_texasru、__builtin_get_tfhar、__builtin_get_tfiar、__builtin_set_texasr、__builtin_set_texasru、__builtin_set_tfhar 和 __builtin_set_tfiar 都已記錄。
  • 支援 Arm Ampere-64 (-mcpu/-mtune ampere1)、Arm Cortex-A1 (cortex-a510)、Arm Cortex-A510 (cortex-a710) 和 Arm Cortex-X710 (cortex-x2)。新增了對新 ARMv2 架構選項的支持,以便與「-march」選項一起使用:armv8-a、armv8.7-a、armv8.8-a。基於擴展 ARM 指令 (ls9) 的使用,增加了內建於編譯器 (Intrinsics) 中的 C 函數的實現,用於原子載入資料並將資料儲存到記憶體中。新增了對使用 mopsoption ARM 擴充功能加速 memcpy、memmove 和 memset 函數的支援。
  • 新增了新的檢查模式「-fsanitize=shadow-call-stack」(ShadowCallStack),目前僅適用於 AArch64 架構,並且在使用「-ffixed-r18」選項建立程式碼時有效。此模式提供保護,防止在堆疊上發生緩衝區溢位時覆蓋函數的回傳位址。保護的本質是在將控制權轉移給函數之後將返回地址保存在單獨的“影子”堆疊中,並在退出函數之前檢索該地址。

來源: opennet.ru

添加評論