GCC 9編譯器套件發布

經過一年的發展 發表 發布一組免費的編譯器 GCC 9.1,新 GCC 9.x 分支中的第一個主要版本。 依據 新方案 從版本號來看,開發過程中使用的是 9.0 版本,在 GCC 9.1 發布前不久,GCC 10.0 分支已經分支出來,在此基礎上形成下一個重要版本 GCC 10.1。

GCC 9.1 值得注意的是穩定了對 C++17 標準的支援、繼續實現未來 C++20 標準(代號為 C++2a)的功能、包含在 D 語言的前端、部分支援 OpenMP 5.0 ,幾乎完全支援OpenACC 2.5,提高了過程間優化和綁定階段優化的可擴展性,擴展了診斷工具並添加了新的警告,OpenRISC、C-SKY V2 和AMD GCN GPU 的後端。

主要的 變化:

  • 新增了對 D 程式語言的支援。GCC 包含帶有編譯器的前端 GDC (Gnu D 編譯器) 和執行時間函式庫 (libphobos),它們允許您使用標準 GCC 以 D 程式語言建置程式。在 GCC 中啟用 D 語言支援的過程 已開始 早在2011年,但是 拖下去 由於需要使程式碼符合GCC要求以及將智慧財產權轉讓給正在開發D程式語言的Digital Mars的問題;
  • 對程式碼產生器進行了改進。 例如,已經實作了根據情況使用不同的策略來擴展Switch表達式(跳轉表、位元測試、決策樹)。 新增了使用“-ftree-switch-conversion”優化轉換包含 Switch 表達式的線性函數的功能(例如,一組條件,如“case 2: how = 205;break;case 3: how = 305;break ;”將轉換為“100 * how + 5”;
  • 改進了過程間優化。 內嵌部署設定已針對現代C++ 程式碼庫進行了調整,並使用新參數max-inline-insns-small、max-inline-insns-size、uninlined-function-insns、uninlined-function-time、uninlined-thunk- insns 和uninlined 進行了擴展- 重擊時間。 提高了冷/熱代碼分離的準確性和積極性。 提高了非常大的可擴展性 翻譯單位 (例如,在大型程式的連結階段應用最佳化時);
  • 改進了基於程式碼分析結果的最佳化機制(PGO - Profile-guided optimization),可根據程式碼執行特徵的分析產生更最佳化的程式碼。 摘要選項“-fprofile-使用」現在包括最佳化模式「-fversion-loops-for-strides」、「-floop-interchange」、「-floop-unroll-and-jam」和「-ftree-loop-distribution」。 刪除了檔案中包含帶有計數器的直方圖,這減少了具有設定檔的檔案的大小(現在在連結期間執行最佳化時會動態生成直方圖);
  • 增強的連結時間最佳化 (LTO)。 在產生結果之前提供了類型的簡化,這使得可以顯著減小LTO物件檔案的大小,減少綁定階段的記憶體消耗,並提高操作的並行化。 分區數量 (-param lto-partitions) 從 32 個增加到 128 個,這提高了具有大量 CPU 執行緒的系統的效能。 增加了一個參數來控制優化器進程的數量
    “-param lto-max-streaming-parallelism”;

    因此,與 GCC 8.3 相比,GCC 9 中引入的最佳化 允許 將 Firefox 5 和 LibreOffice 66 的編譯時間減少約 6.2.3%。 目標檔案的大小減少了 7%。 8 核心 CPU 上的綁定時間減少了 11%。 連結階段的順序最佳化階段現在速度提高了 28%,消耗的記憶體減少了 20%。 LTO並行階段每個處理器記憶體消耗下降30%;

  • 大多數平行程式設計規範是針對 C、C++ 和 Fortran 語言實作的 開放ACC 2.5,它定義了用於在 GPU 和專用處理器(例如 NVIDIA PTX)上卸載操作的工具;
  • C 和 C++ 已實現對該標準的部分支持 打開 MP 5.0 (開放式多處理),定義了在具有共享記憶體和向量化單元(SIMD)的多核心和混合(CPU+GPU/DSP)系統上應用C、C++和Fortran語言並行程式設計方法的API和方法;
  • 為 C 語言添加了新的警告:“-打包會員的W地址「(指向結構或聯合的壓縮成員的未對齊指標值)和
    «-W絕對值" (當存取計算絕對值的函數時,如果有更適合指定參數的函數,例如,應使用 fabs(3.14) 而不是 abs(3.14)。 為 C++ 新增了新警告:“-Wdeprecated-copy”,
    「-Winit-list-lifetime」、「-Wredundant-move」、「-Wpessimizing-move」和「-Wclass-conversion」。 許多以前可用的警告已擴展;

  • 增加了部分未來 C 語言標準(代號為 C2x)的實驗性支援。 若要啟用 C2x 支持,請使用選項“-std=c2x”和“-std=gnu2x”(以啟用 GNU 擴充功能)。 該標準仍處於早期開發階段,因此,就其功能而言,僅支援具有一個參數的表達式 _Static_assert(具有兩個參數的 _Static_assert 在 C11 中已標準化);
  • 對 C++17 標準的支援已聲明穩定。 在前端,完全實作了C++17的語言能力,而在libstdc++中,標準中定義的函式庫函數也接近完全實作;
  • 繼續 實作 未來 C++2a 標準的元素。 例如,添加了在初始化期間包含範圍的功能,實現了 lambda 表達式的擴展,添加了對資料結構的空成員和可能/不可能屬性的支持,提供了在條件表達式中調用虛擬函數的功能, ETC。
    要啟用 C++2a 支持,請使用“-std=c++2a”和“-std=gnu++2a”選項。 為libstdc++ 新增了C++2a、std::remove_cvref、std::unwrap_reference、std::unwrap_decay_ref、std::is_nothro_convertible 和std::type_identity 特徵、std::midpoint、std::lerp 函數的位元和版本頭文件,std::bind_front,
    std::visit、std::is_constant_evaluated 和 std::assume_aligned,增加了對 char8_t 類型的支持,實現了檢查字串前綴和後綴的功能(starts_with、ends_with);

  • 新增了對新 ARM 處理器的支持
    Cortex-A76、Cortex-A55、Cortex-A76 DynamIQ big.LITTLE 與 Neoverse N1。 增加了對Armv8.3-A 中引入的用於處理複數、偽隨機數生成(rng) 和內存標記(memtag) 的指令的支持,以及用於阻止與分支預測單元的推測執行和操作相關的攻擊的指令。 針對AArch64架構,增加了保護模式 棧和堆積的交集 (“-fstack-衝突保護”)。 為了使用Armv8.5-A架構的功能,新增了選項“-march=armv8.5-a”

  • 它包括一個用於為基於 GCN 微架構的 AMD GPU 生成程式碼的後端。 目前實作僅限於單執行緒應用程式的編譯(稍後將提供透過OpenMP和OpenACC進行多執行緒運算的支援)以及對GPU Fiji和Vega 10的支援;
  • 為處理器添加了新的後端 開放式RISC;
  • 新增了處理器後端 中天V2,由中國同名公司生產,適用於各種消費設備;
  • 所有操作位元組值的命令列選項都支援後綴kb、KiB、MB、MiB、GB和GiB;
  • 實施的 「-flive-patching=[inline-only-static|inline-clone]」選項可讓您實現即時修補系統的安全編譯,因為對製程間使用的多層控制(“近期行動計劃”)最佳化;
  • 新增了「--completion」選項,用於在使用 bash 時細粒度控制選項完成;
  • 診斷工具提供來源文字摘錄的顯示,指示行號並直觀地標記相關訊息,例如操作數類型。 若要停用行號和標籤的顯示,提供了選項「-fno-diagnostics-show-line-numbers」和「-fno-diagnostics-show-labels」;

    GCC 9編譯器套件發布

  • 擴充 用於診斷 C++ 程式碼中的錯誤的工具,提高了有關錯誤原因的資訊的可讀性並突出顯示有問題的參數;

    GCC 9編譯器套件發布

  • 新增了選項“-fdiagnostics-format=json”,允許以機器可讀格式(JSON)產生診斷輸出;
  • 新增了新的分析選項「-fprofile-filter-files」和「-fprofile-exclude-files」來選擇要處理的來源檔案;
  • AddressSanitizer 為自動變數提供更緊湊的驗證程式碼的生成,從而減少了被檢查的可執行檔的記憶體消耗;
  • 改進了輸出“-fopt-訊息»(有關添加優化的詳細資訊)。 除了先前可用的前綴“note”之外,還添加了新的前綴“optimized”和“missed”。 增加了循環內聯展開和向量化決策資訊的輸出;
  • 新增了「-fsave-optimization-record」選項,指定後,GCC 會保存 SRCFILE.opt-record.json.gz 文件,其中包含有關使用某些優化的決策的描述。 新選項與「-fopt-info」模式的不同之處在於包含額外的元數據,例如有關設定檔和內聯鏈的資訊;
  • 新增了選項「-fipa-stack-alignment」和「-fipa-reference-addressable」來控制堆疊對齊以及在過程間最佳化期間靜態變數的尋址模式(只寫或精確讀取)的使用;
  • 引入了新的內建函數來控制屬性綁定以及與分支預測和推測指令執行相關的行為:“__builtin_has_attribute __builtin_has_attribute“,”__builtin_expect_with_probability __builtin_expect_with_probability“ 和 ”__builtin_推測_安全性_值」。 為函數、變數和類型新增了新屬性 複製;
  • Fortran語言全面支援非同步輸入/輸出;
  • 已棄用對 Solaris 10 (*-*-solaris2.10) 和 Cell/BE(Cell 寬頻引擎 SPU)平台的支持,並將在下一個主要版本中刪除。 對 Armv2、Armv3、Armv5 和 Armv5E 架構的支援已停止。 對 Intel MPX(記憶體保護擴充)的支援已停止。

來源: opennet.ru

添加評論