發布 LLVM 15.0 編譯器套件

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

Clang 15.0 的主要改進:

  • 對於基於 x86 架構的系統,新增了「-fzero-call-used-regs」標誌,確保函數中使用的所有 CPU 暫存器在從函數傳回控制權之前重設為零。 此選項可讓您防止函數中的資訊洩漏,並將適合在漏洞利用中建立 ROP(面向返回程式設計)小工具的區塊數量減少約 20%。
  • C 程式碼結構的記憶體放置已隨機化,這使得在利用漏洞時從結構中提取資料變得複雜。 使用 randomize_layout 和 no_randomize_layout 屬性開啟和關閉隨機化,並且需要使用「-frandomize-layout-seed」或「-frandomize-layout-seed-file」標誌設定種子。
  • 新增了“-fstrict-flex-arrays=”標誌”,您可以使用它來控制結構中靈活數組元素的邊界(靈活數組成員,結構末尾的不定大小的數組)。 當設定為 0(預設)時,帶有數組的結構的最後一個元素始終被處理為靈活數組,1 - 僅大小 []、[0] 和 [1] 被處理為靈活數組,2 - 僅大小[ ] 和[0] 像靈活數組一樣處理。
  • 新增了對類 C 語言 HLSL(高級著色器語言)的實驗性支持,該語言在 DirectX 中用於編寫著色器。
  • 新增了“-Warray-parameter”,以警告使用與固定長度和可變長度數組關聯的不相容參數聲明覆蓋函數。
  • 改進了與 MSVC 的兼容性。 新增了對 MSVC 中提供的“#pragma function”(指示編譯器產生函數呼叫而不是內聯擴展)和“#pragma alloc_text”(定義帶有函數代碼的節的名稱)的支援。 新增了對 MSVC 相容的 /JMC 和 /JMC 標誌的支援。
  • 支援未來 C2X 和 C++23 標準的工作仍在繼續。 對於 C 語言,實作了以下內容:noreturn 屬性、關鍵字 false 和 true、給定位深度的整數的 _BitInt(N) 類型、*_WIDTH 巨集、UTF-8 編碼字元的 u8 前綴。

    對於C++,實作了以下功能:模組合併、函式成員的ABI 隔離、模組中非局部變數的有序動態初始化、多維索引運算子、auto(x)、非文字變數、宣告為constexpr 的函式中的goto和標籤,分隔轉義序列,命名轉義字元。

  • 與 OpenCL 和 OpenMP 支援相關的功能已擴充。 新增了對 OpenCL 擴充功能 cl_khr_subgroup_rotate 的支援。
  • 對於 x86 架構,增加了對無條件向前跳轉操作後推測執行指令所導致的處理器漏洞的保護。 此問題的發生是由於搶佔式處理記憶體中緊接在分支指令之後的指令(SLS,直線推測)所致。 為了啟用保護,建議使用選項「-mharden-sls=[none|all|return|indirect-jmp]」。
  • 對於支援SSE2擴充的平台,新增了_Float16類型,在不支援AVX512-FP16指令的情況下使用float類型進行模擬。
  • 新增了「-m[no-]rdpru」標誌來控制 RDPRU 指令的使用,從 AMD Zen2 處理器開始支援。
  • 新增了「-mfunction-return=thunk-extern」標誌以防止 RETBLEED 漏洞,該漏洞透過添加一系列指令來防止間接分支的推測執行機制的參與。

LLVM 15.0 的主要創新:

  • 增加了對 Cortex-M85 CPU、Armv9-A、Armv9.1-A 和 Armv9.2-A 架構、Armv8.1-M PACBTI-M 擴展的支援。
  • 新增了 DirectX 實驗性後端,支援用於 DirectX 著色器的 DXIL(DirectX 中間語言)格式。 透過在組譯期間指定“-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX”參數來啟用後端。
  • Libc++繼續實作C++20和C++2b標準的新功能,包括完成「format」函式庫的實作和建議的實驗版本的「ranges」函式庫。
  • 改進了 x86、PowerPC 和 RISC-V 架構的後端。
  • LLD 連結器和 LLDB 偵錯器的功能已增強。

來源: opennet.ru

添加評論