發布 LLVM 12.0 編譯器套件

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

Clang 12.0 的改進:

  • 預設情況下,已實現並啟用對 C++20 標準中提出的「可能」和「不太可能」屬性的支持,從而允許優化器了解觸發條件構造的機率(例如,「[[可能]] 如果(隨機> 0){“)。
  • 新增了對 AMD Zen 3 (-march=znver3)、Intel Alder Lake (-march=alderlake) 和 Intel Sapphire Rapids (-march=sapphirerapids) 處理器的支援。
  • 新增了對「-march=x86-64-v[234]」標誌的支援以選擇x86-64 架構等級(v2 - 涵蓋SSE4.2、SSSE3、POPCNT 和CMPXCHG16B 擴充;v3 - AVX2 和MOVBE;v4 - AVX -512 )。
  • 增加了對Arm Cortex-A78C (cortex-a78c)、Arm Cortex-R82 (cortex-r82)、Arm Neoverse V1 (neoverse-v1)、Arm Neoverse N2 (neoverse-n2) 和Fujitsu A64FX (a64fx) 處理器的支援。例如,要啟用 Neoverse-V1 CPU 的最佳化,您可以指定「-mcpu=neoverse-v1」。
  • 對於 AArch64 架構,新增了新的編譯器標誌「-moutline-atomics」和「-mno-outline-atomics」來啟用或停用原子操作輔助函數,例如「__aarch64_cas8_relax」。此類函數在運行時會偵測 LSE(大型系統擴充)支援是否可用,並使用提供的原子處理器指令或回退到使用 LL/SC(載入連結/儲存條件)指令進行同步。
  • 新增了「-fbinutils-version」選項來選擇 binutils 套件的目標版本,以與舊的連結器和彙編器行為相容。
  • 對於 ELF 可執行文件,當指定「-gz」標誌時,預設啟用使用 zlib 庫壓縮偵錯資訊(gz=zlib)。連結產生的目標檔案需要 lld 或 GNU binutils 2.26+。若要復原與舊版 binutils 的相容性,可以指定「-gz=zlib-gnu」。
  • 現在使用非空和可取消引用(N) 檢查來處理「this」指標。要刪除nonnull屬性,如果需要使用NULL值,可以使用“-fdelete-null-pointer-checks”選項。
  • 在 Linux 平台上,AArch64 和 PowerPC 架構啟用「-fasynchronous-unwind-tables」模式來產生展開呼叫表,就像在 GCC 中一樣。
  • 在「#pragma clang Loop vectorize_width」中新增了指定「固定」(預設)和「可擴展」選項來選擇向量化方法的功能。 「可擴展」模式與向量長度無關,是實驗性的,可以在支援可擴展向量化的硬體上使用。
  • 改進了對Windows平台的支援:已經為Arm64系統上的Windows準備了官方二進位組件,包括Clang編譯器、LLD連結器和compiler-rt執行階段庫。當為 MinGW 目標平台建置時,即使交叉編譯,也會新增 .exe 後綴。
  • 與 OpenCL、OpenMP 和 CUDA 支援相關的功能已擴充。新增了選項「-cl-std=CL3.0」和「-cl-std=CL1.0」來選擇 OpenCL 3.0 和 OpenCL 1.0 的巨集選項。診斷工具得到了擴展。
  • 新增了對某些基於 x86 的處理器中實現的 HRESET、UINTR 和 AVXVNNI 指令的支援。
  • 在 x86 系統上,啟用了對「-mtune=」選項的支持,從而啟用選定的微架構最佳化,而不管「-march=」值如何。
  • 靜態分析器改進了一些 POSIX 函數的處理,並顯著改善了當比較中有多個符號值時條件運算結果的確定。新增了新的檢查:fuchia.HandleChecker(定義結構中的句柄)、webkit.UncountedLambdaCapturesChecker webkit 和 alpha.webkit.UncountedLocalVarsChecker(考慮到在 WebKit 引擎程式碼中使用指標的特殊性)。
  • 在常數上下文中使用的表達式中,使用內建函數 __builtin_bitreverse*、__builtin_rotateleft*、__builtin_rotateright*、_mm_popcnt*、_bit_scan_forward、__bsfd、__bsfq、__bit_scan_reverse、__ap__p、p__ *、__rol* 和__ror*。
  • 在 clang-format 公用程式中新增了 BitFieldColonSpacing 選項,以選擇識別碼、欄位和欄位定義周圍的間距。
  • Linux平台上的clangd快取伺服器(Clang Server)在長期運行過程中顯著減少了記憶體消耗(提供定期呼叫malloc_trim以將空閒記憶體頁傳回給作業系統)。

LLVM 12.0 的主要創新:

  • 對用 Python 編寫的 llvm-build 建置工具的支援已停止,該專案已完全切換為使用 CMake 建置系統。
  • 在AArch64架構的後端,改進了對Windows平台的支援:確保了目標Windows系統正確產生彙編器輸出,優化了unwind呼叫的資料產生(此類資料的大小已減少60) %),已新增指令. seh_* 使用組譯程式建立展開資料的功能。
  • PowerPC 架構的後端對循環和內聯部署進行了新的優化,擴展了對 Power10 處理器的支持,增加了對用於矩陣操作的 MMA 指令的支持,並改進了對 AIX 作業系統的支援。
  • x86 後端增加了對 AMD Zen 3、Intel Alder Lake 和 Intel Sapphire Rapids 處理器以及 HRESET、UINTR 和 AVXVNNI 處理器指令的支援。支援 MPX(記憶體保護擴充),用於檢查指標以確保不再支援記憶體邊界(該技術並不普遍,已從 GCC 和 clang 中刪除)。添加了對彙編器對 {disp32} 和 {disp8} 前綴以及 .d32 和 .d8 後綴的支持,以控制操作數偏移和跳轉的大小。新增了新屬性“tune-cpu”來控制微架構優化的包含。
  • 整數問題偵測器中新增了新模式「-fsanitize=unsigned-shift-base」(整數清理器,「-fsanitize=integer」),以偵測向左移位後無符號整數的溢位。
  • 在各種偵測器(asan、cfi、lsan、msan、tsan、ubsan sanitizer)中,增加了對標準 Musl 函式庫的 Linux 發行版的支援。
  • LLD 連結器的功能已擴充。改進了對ELF 格式的支持,包括添加的選項“--dependency-file”、“-error-handling-script”、“-lto-pseudo-probe-for-profiling”、“-no-lto-whole- program” -可見性” “改進了 MinGW 支援。對於 Mach-O 格式 (macOS),已實現對 arm64、arm 和 i386 架構、連結時最佳化 (LTO) 以及用於異常處理的堆疊展開的支援。
  • Libc++ 實作了 C++20 標準的新功能,並已開始開發 C++2b 規格的功能。新增了對停用本地化支援(“-DLIBCXX_ENABLE_LOCALIZATION=OFF”)和產生偽隨機數的裝置(“-DLIBCXX_ENABLE_RANDOM_DEVICE=OFF”)進行建置的支援。

來源: opennet.ru

添加評論