發布 LLVM 11.0 編譯器套件

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

新版本中的關鍵變化是包含 側翼,Fortran 語言的前端。 Flang 支援 Fortran 2018、OpenMP 4.5 和 OpenACC 3.0,但專案的開發尚未完成,前端僅限於程式碼解析和檢查正確性。 尚不支援產生 LLVM 中間程式碼,為了產生可執行文件,需要產生規範程式碼並將其傳遞給外部 Fortran 編譯器。

改進之處 在 Clang 11.0 中:

  • 新增了恢復抽象語法樹的功能(AST)用於損壞的 C++ 程式碼,可用於協助診斷錯誤並向外部實用程式(例如 clang-tidy 和 clangd)提供附加資訊。 此功能預設為 C++ 程式碼啟用,並透過「-Xclang -f[no-]recovery-ast」選項進行控制。
  • 新增了新的診斷模式:
    • 「-Wpointer-to-int-cast」是一組有關將指標強制轉換為不能容納所有可能值的整數類型 int 的警告。
    • “-Wuninitialized-const-reference” - 關於在接受帶有“const”屬性的引用參數的函數參數中傳遞未初始化變數的警告。
    • “-Wimplicit-const-int-float-conversion” - 預設啟用實數常數隱式轉換為整數類型的警告。
  • 對於ARM平台,提供了編譯器內建的C函數(內在的),替換為高效向量指令 Arm v8.1-M MVE 和 CDE。 可用函數在頭檔arm_mve.h 和arm_cde.h 中定義。
  • 添加 一組擴充整數類型 _ExtInt(N),可讓您建立不是 XNUMX 的倍數的類型,可以在 FPGA/HLS 上有效處理。 例如, _ExtInt(7) 定義由 7 位元組成的整數類型。
  • 新增了定義對基於 ARM SVE(可擴展向量擴展)指令的內建 C 函數的支援的巨集:
    __ARM_FEATURE_SVE,__ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32、__ARM_FEATURE_SVE_MATMUL_FP64、
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2,__ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4。 例如,透過設定命令列選項「-march=armv64-a+sve」產生AArch8程式碼時定義__ARM_FEATURE_SVE宏。

  • 「-O」標誌現在以「-O1」最佳化模式標識,而不是「-O2」。
  • 新增了新的編譯器標誌:
    • “-fstack-clash-protection” - 啟用保護 棧和堆積的交集.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - 允許您選擇浮點數的異常處理程序模式。
    • “-ffp-model={precise,strict,fast}” - 簡化對一系列浮點數專用選項的存取。
    • 「-fpch-codegen」和「-fpch-debuginfo」產生預編譯頭(PCH),其中包含程式碼和偵錯資訊的單獨目標檔案。
    • 「-fsanitize-coverage-allowlist」和「-fsanitize-coverage-blocklist」用於檢查覆蓋測試白名單和黑名單。
    • “-mtls-size={12,24,32,48}”選擇 TLS(執行緒本地儲存)大小。
    • 「-menable-experimental-extension」以啟用實驗性 RISC-V 擴充。
  • C 的預設模式是“-fno-common”,它允許在某些平台上更有效地存取全域變數。
  • 預設模組快取已從 /tmp 移至 ~/.cache 目錄。 要覆蓋,您可以使用“-fmodules-cache-path =”標誌。
  • 預設的 C 語言標準已從 gnu11 更新為 gnu17。
  • 增加了對 GNU C 擴展的初步支援“彙編內聯» 新增組譯器插入。 該擴展仍在分析中,但沒有以任何方式進行處理。
  • 與 OpenCL 和 CUDA 支援相關的功能已擴展。 新增了對 OpenCL 2.0 區塊診斷的支援並實作了新的 OpenMP 5.0 功能。
  • 在 clang-format 實用程式中新增了 IndentExternBlock 選項,用於在 extern「C」和 extern「C++」區塊內對齊。
  • 靜態分析器改進了 C++ 中繼承建構子的處理。 新增了新檢查alpha.core.C11Lock 和alpha.fuchsia.Lock 來檢查鎖,alpha.security.cert.pos.34c 來偵測putenv 的不安全使用,webkit.NoUncountedMemberChecker 和webkit.RefCntblBaseVirtualDtor 來偵測不可數型的問題,alpha .cplusplus .SmartPtr 檢查空智慧指標取消引用。
  • 乾淨整潔的短絨 添加 很大一部分是新支票。
  • clangd 快取伺服器(Clang Server)提高了效能並添加了新的診斷功能。

主要的 創新 LLVM 11.0:

  • 建置系統已切換為使用 Python 3。如果 Python 3 不可用,可以回滾到使用 Python 2。
  • Go 語言編譯器(llgo)的前端不包含在該版本中,將來可能會進行重組。
  • vector-function-abi-variant 屬性已新增至中間表示 (IR) 中,以描述標量函數和向量函數之間的對應以向量化呼叫。 llvm::VectorType 有兩種獨立的向量類型 llvm::FixedVectorType 和 llvm::ScalableVectorType。
  • 基於 udef 值進行分支並將 undef 值傳遞給標準庫函數被識別為未定義行為。 在
    memset/memcpy/memmove 允許傳遞 undef 指針,但如果大小參數為零。

  • LLJIT 新增了透過 LLJIT::initialize 和 LLJIT::deinitialize 方法執行靜態初始化的支援。 已經實作了使用 StaticLibraryDefinitionGenerator 類別將靜態函式庫新增至 JITDylib 的功能。 新增了 C API 獸人v2 (用於建置 JIT 編譯器的 API)。
  • AArch64 架構的後端增加了對 Cortex-A34、Cortex-A77、Cortex-A78 和 Cortex-X1 處理器的支援。 實現了ARMv8.2-BF16 (BFloat16) 和ARMv8.6-A 擴展,包括RMv8.6-ECV(增強型計數器虛擬化)、ARMv8.6-FGT(細粒度陷阱)、ARMv8.6-AMU(活動監視器虛擬化)和 ARMv8.0-DGH(資料收集提示)。 提供了為與 SVE 向量指令綁定的內建函數產生程式碼的能力。
  • ARM 架構的後端增加了對 Cortex-M55、Cortex-A77、Cortex-A78 和 Cortex-X1 處理器的支援。 實施擴展
    Armv8.6-A 矩陣乘法和 RMv8.2-AA32BF16 BFloat16。

  • PowerPC 架構的後端增加了對 POWER10 處理器程式碼產生的支援。 循環優化已擴展,浮點支援也得到了改進。
  • RISC-V 架構的後端允許接受支援尚未正式批准的實驗性擴展指令集的補丁。
  • AVR 架構的後端已從實驗類別轉移到穩定版本,包含在基本發行版中。
  • x86 架構的後端支援 Intel AMX 和 TSXLDTRK 指令。 增加了針對攻擊的保護 低電壓指數 (加載值注入),並且還實現了通用的推測執行副作用抑制機制,以阻止因 CPU 上操作的推測執行而引起的攻擊。
  • 在 SystemZ 架構的後端中,增加了對 MemorySanitizer 和 LeakSanitizer 的支援。
  • 向 Libc++ 添加了對帶有數學常數的頭文件的支持 .
  • 擴充 LLD 連結器功能。 改進了對ELF 格式的支持,包括添加的選項“--lto-emit-asm”、“--lto-whole-program-visibility”、“-print-archive-stats”、“-shuffle-sections”、 「 -thinlto-單模組」、「-unique」、「-rosegment」、「-threads=N」。 新增了「--time-trace」選項,將追蹤儲存到檔案中,然後可以透過 Chrome 中的 chrome://tracing 介面進行分析。

來源: opennet.ru

添加評論