發布 LLVM 9.0 編譯器套件

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

LLVM 9.0 的新功能包括從目標 RISC-V 平台中刪除實驗設計標籤、對 OpenCL 的 C++ 支援、將程式拆分為 LLD 中動態載入部分的能力以及“彙編程式轉到”,在 Linux 核心程式碼中使用。 libc++ 新增了對 WASI(WebAssembly 系統介面)的支持,LLD 新增了對 WebAssembly 動態連結的初始支援。

改進之處 在 Clang 9.0 中:

  • 添加 GCC 特定表達式的實作“彙編程式轉到「,它允許您從彙編器內聯區塊移動到 C 程式碼中的標籤。 在 x86_64 架構的系統上使用 Clang 以「CONFIG_JUMP_LABEL=y」模式建構 Linux 核心需要此功能。 考慮到先前版本中新增的更改,現在可以在 Clang 中為 x86_64 架構建立 Linux 核心(之前僅支援為 arm、aarch64、ppc32、ppc64le 和 mips 架構建置)。 此外,Android 和 ChromeOS 專案已轉換為使用 Clang 進行核心構建,並且 Google 正在測試 Clang 作為為其生產 Linux 系統構建核心的主要平台。 未來,其他LLVM元件可以在核心建置過程中使用,包括LLD、llvm-objcopy、llvm-ar、llvm-nm和llvm-objdump;
  • 新增了在 OpenCL 中使用 C++17 的實驗支援。 具體功能包括支援位址空間屬性、透過類型轉換運算子阻止位址空間轉換、提供 OpenCL for C 中的向量類型、存在用於映像、事件、通道等的特定 OpenCL 類型。
  • 新增了新的編譯器標誌“-ftime-trace”和“-ftime-trace-粒度=N”,以產生有關前端(解析、初始化)和後端(最佳化階段)各個階段的執行時間的報告。 報告以json格式儲存,相容於chrome://tracing和speedscope.app;
  • 新增了「__declspec(allocator)」說明符的處理並產生隨附的偵錯訊息,使您可以監視 Visual Studio 環境中的記憶體消耗;
  • 對於C語言,增加了對「__FILE_NAME__」宏的支持,該宏類似於「__FILE__」宏,但僅包含檔案名,不包含完整路徑;
  • C++ 擴展了對位址空間屬性的支持,以涵蓋各種 C++ 功能,包括參數和實參模式、參考類型、傳回類型推斷、物件、自動產生的函數、內建運算子等。
  • 與 OpenCL、OpenMP 和 CUDA 支援相關的功能已擴充。 這包括內建 OpenCL 函數的隱式包含的初步支援(已新增「-fdeclare-opencl-builtins」標誌)、已實作 cl_arm_integer_dot_product 擴充功能以及已擴展的診斷工具;
  • 靜態分析器的工作得到了改進,並添加了有關執行靜態分析的文件。 新增了顯示可用檢查器模組和支援的選項的標誌(“-analyzer-checker[-option]-help”、“-analyzer-checker[-option]-help-alpha”和“-analyzer-checker[-option ]-help” “-開發人員”)。 添加了“-analyzer-werror”標誌以將警告視為錯誤。
    新增了新的驗證模式:

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling 用於識別使用緩衝區的不安全做法;
    • osx.MIGChecker 用來搜尋違反 MIG(馬赫介面產生器)呼叫規則的情況;
    • optin.osx.OSObjectCStyleCast 尋找不正確的 XNU libkern 物件轉換;
    • apiModeling.llvm 具有一組建模檢查函數,用於偵測 LLVM 程式碼庫中的錯誤;
    • 用於檢查未初始化的 C++ 物件的穩定程式碼(optin.cplusplus 套件中的 UninitializedObject);
  • clang-format 實用程式新增了對 C# 語言格式化程式碼的支持,並提供對 Microsoft 使用的程式碼格式化樣式的支援;
  • clang-cl 是一種替代命令列介面,它提供與Visual Studio 中包含的cl.exe 編譯器的選項級相容性,它添加了啟發式方法,將不存在的檔案視為命令列選項並顯示相應的警告(例如,當執行“clang-cl /diagnostic :caret /c test.cc”時);
  • linter clang-tidy 中新增了大量新檢查,包括特定於 OpenMP API 的新增檢查;
  • 擴充 伺服器能力 鏗鏘 (Clang Server),其中預設啟用後台索引建置模式,新增了對程式碼上下文操作的支援(變數檢索、自動和巨集定義的擴充、轉義字串到非轉義字串的轉換),能夠顯示來自Clang- tidy 的警告,擴展了頭文件中錯誤的診斷,並添加了顯示有關類型層次結構的資訊的功能;

主要的 創新 LLVM 9.0:

  • LLD 連結器中新增了一項實驗性分割功能,該功能可讓您將一個程式拆分為多個部分,每個部分位於單獨的 ELF 檔案中。 此功能可讓您啟動程式的主要部分,該部分將在運行過程中根據需要加載其他元件(例如,您可以將內建的 PDF 檢視器分離成一個單獨的文件,該文件僅在使用者開啟 PDF 時載入)文件)。

    LLD連結器 脫穎而出 到適合連結arm32_7、arm64、ppc64le和x86_64架構的Linux核心的狀態。
    新選項“-”(輸出到標準輸出)、“-[no-]allow-shlib-undefined”、“-undefined-glob”、“-nmagic”、“-omagic”、“-dependent-library”、“ - z ifunc-noplt」和「-z 公頁大小」。 對於AArch64架構,增加了對BTI(分支目標指示符)和PAC(指標驗證碼)指令的支援。 對 MIPS、RISC-V 和 PowerPC 平台的支援得到了顯著改進。 新增了對 WebAssembly 動態連結的初步支援;

  • 在 libc++ 中 實施的 函數 ssize、std::is_constant_evaluated、std::midpoint 和 std::lerp,方法“front”和“back”已添加到 std::span,類型 std::is_unbounded_array 和 std::is_bounded_array 的屬性已添加,std功能已擴展::atomic。 對 GCC 4.9 的支援已停止(可與 GCC 5.1 及更高版本一起使用)。 增加了支持 瓦西 (WebAssembly System Interface,在瀏覽器外使用WebAssembly的介面);
  • 新增了新的優化。 在某些情況下啟用了 memcmp 呼叫到 bcmp 的轉換。 實現了對跳轉表的範圍檢查的省略,其中較低的開關塊無法訪問或未使用指令時,例如,調用 void 類型的函數時;
  • RISC-V 架構的後端已經穩定,不再定位為實驗性的,而是預設建構的。 為具有 MAFDC 擴展的 RV32I 和 RV64I 指令集變體提供完整的程式碼產生支援;
  • 針對 X86、AArch64、ARM、SystemZ、MIPS、AMDGPU 和 PowerPC 架構的後端進行了大量改進。 例如,對於建築
    AArch64增加了對SVE2(Scalable Vector Extension 2)和MTE(Memory Tagging Extensions)指令的支援;在ARM後端,增加了對Armv8.1-M架構和MVE(M-Profile Vector Extension)擴充的支援。 AMDGPU後端添加了對GFX10(Navi)架構的支持,預設啟用函數呼叫功能,並啟動組合通道 民進黨 (數據並行原語)。

  • LLDB 偵錯器現在具有回溯顏色突出顯示功能,並添加了對 DWARF4 debug_types 和 DWARF5 debug_info 區塊的支援;
  • llvm-objcopy 和 llvm-strip 公用程式中新增了對 COFF 格式的物件和可執行檔的支援。

來源: opennet.ru

添加評論