GCC 10編譯器套件發布

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

GCC 10.1 值得注意的是針對 C++20 標準開發的 C++ 語言中的許多創新的實現、與未來 C 語言標準 (C2x) 相關的改進、編譯器後端的新優化和實驗支持 靜態分析模式。 此外,在準備新分支的過程中,專案將儲存庫從SVN轉移到了Git。

主要的 變化:

  • 添加 靜態分析實驗模式"-分析儀「,它對程式中的程式碼執行路徑和資料流執行資源密集型過程間分析。 此模式能夠在編譯階段檢測問題,例如對一個記憶體區域的 free() 函數的兩次呼叫、檔案描述符洩漏、取消引用和傳遞空指標、存取已釋放的記憶體區塊、使用未初始化的值等。 OpenSSL 程式碼新模式的使用已經可以識別 危險的脆弱性.
  • 改進了過程間優化。 IPA-SRA(過程間標量共享替換)通道已重新設計為在綁定時工作,並且現在刪除了計算和返回的未使用的值。 在“-O2”最佳化模式下,啟用“-finline-functions”選項,重新調整該選項以支援更緊湊的程式碼而不是執行效能。 內聯函數部署的啟發式工作已經加快。 內聯擴展和函數克隆啟發式現在可以使用有關值範圍的資訊來預測各個轉換的有效性。 對於 C++,基於類型的別名解析的準確性已提高。
  • 增強的連結時間最佳化 (LTO)。 新增了新的可執行檔 lto轉儲 使用 LTO 字節碼重設有關物件檔案的資訊。 並行 LTO 遍自動確定同時運行的 make 任務的數量,如果無法確定,則使用有關 CPU 核心數量的信息作為平行化因子。 新增了使用 zstd 演算法壓縮 LTO 字節碼的功能。
  • 改進了基於程式碼分析結果的最佳化機制(PGO - Profile-guided optimization),可根據程式碼執行特徵的分析產生更優化的程式碼。 改進了編譯期間的設定檔維護以及熱/冷程式碼分離。 透過選項“-f設定檔值» 現在可以監控最多 4 個設定檔值,例如間接呼叫和提供更精確的設定檔資訊。
  • 針對 C、C++ 和 Fortran 語言實作的平行程式設計規範 開放ACC 2.6,它定義了用於在 GPU 和專用處理器(例如 NVIDIA PTX)上卸載操作的工具。 標準的實施已接近完成 打開 MP 5.0 (開放式多處理),它定義了在具有共享記憶體和向量化單元(SIMD)的多核心和混合(CPU+GPU/DSP)系統上應用平行程式設計方法的API和方法。 新增了諸如lastprivate條件、掃描和循環指令、順序和use_device_addr表達式等功能。 對於 OpenMP 和 OpenACC,新增了對第四代 (Fiji) 和第五代 AMD Radeon (GCN) GPU (VEGA 10/VEGA 20) 上卸載作業的支援。
  • 對於C家族的語言,加入了「access」函數來描述函數對透過引用或指標傳遞的物件的訪問,並將這些物件與包含有關物件大小的資訊的整數參數相關聯。 為了與“access”結合使用,“type”屬性被實現來檢測用戶函數的不正確訪問,例如,將值寫入數組邊界之外的區域時。 還添加了“symver”屬性,用於將 ELF 檔案中的符號與特定版本號關聯起來。
  • 新增了新警告:
    • 「-Wstring-compare」(透過「-Wextra」啟用) - 警告存在將零與呼叫 strcmp 和 strncmp 函數的結果進行比較的表達式,該表達式相當於一個常數,因為長度第一個參數的陣列大小大於第二個參數中的陣列大小。
    • 「-Wzero-length-bounds」(透過「-Warray-bounds」啟用)- 警告存取零長度的陣列元素,這可能會導致覆蓋其他資料。
    • 「-Warray-bounds」、「-Wformat-overflow」、「-Wrestrict」、「-Wreturn-local-addr」和「-Wstringop-overflow」警告已擴展,以擴大越界情況的數量被處理的。
  • 實作了使用目前編碼(預設為 UTF-8)而不是 UCN 表示法(\uNNNN 或 \UNNNNNNNN)直接在識別符中指定寬字元的函數。 例如:

    靜態常數 int π = 3;
    int get_naïve_pi() {
    返回π;
    }

  • 對於C 語言,已經實現了C2X 標準中開發的部分新功能(透過指定-std=c2x 和-std=gnu2x 啟用):出現了對「[[]]」語法的支持,用於定義屬性,如下所示C++(例如,[[gnu ::const]]、[[已棄用]]、[[fallthrough]] 和[[maybe_unused]]。增加了對「u8」語法的支持,用於使用UTF-8字元定義常數。
    新增了新的宏。 在 strftime 新增了“%OB”和“%Ob”替換。

  • C 的預設模式是“-fno-common”,它允許在某些平台上更有效地存取全域變數。
  • 對於 C++,在 C++16 標準中開發了大約 20 項變更和創新。 包括新增的關鍵字“constinit”
    並已實現對模板擴展的支持”概念」。 概念可讓您定義一組模板參數要求,這些要求在編譯時限制可以接受為模板參數的參數集。 這些概念可用於避免在範本內使用的資料類型的屬性與輸入參數的資料類型屬性之間的邏輯不一致。

  • G++ 透過 constexpr 提供對因更改常數物件而導致的未定義行為的偵測。 減少了編譯器計算 constexpr 時的記憶體消耗。 新增了新警告“-Wmismatched-tags”和“-Wredundant-tags”。
  • 已提出新的命令列選項:
    • “-fallocation-dce”刪除不必要的“新”和“刪除”運算子對。
    • “-fprofile-partial-training”禁用沒有訓練運行的程式碼的大小最佳化。
    • 「-fprofile-reproducible 控製設定檔再現性的程度。
    • 「-fprofile-prefix-path」定義用於單獨設定檔產生的基本來源建置目錄(對於「-fprofile-generate=profile_dir」和「-fprofile-use=profile_dir」)。
  • 在上述選項的警告文字中,提供了超鏈接,可讓您轉到這些選項的文件。 URL 替換是使用「-fdiagnostics-urls」選項控制的。
  • 新增了預處理器運算子“__has_builtin”,可用於檢查內建函數。
  • 新增了新的內建函數“__builtin_roundeven”,其實現了ISO/IEC TS 18661規範中定義的捨入函數,與“round”類似,但將大於0.5的部分向上捨入(到更大的值),小於0.5的部分向上捨入(到更大的值) - 向下(到零),並且等於 0.5 - 從倒數第二位的奇偶校驗開始。
  • 對於AArch64架構,增加了對SVE2擴展的支持,並改進了對SVE(可擴展向量擴展)的支持,包括增加了對內建SVE ACLE函數和類型的支持,以及向量化的使用。 擴展了對 LSE(大型系統擴充)和 TME(事務記憶體擴充)的支援。 新增了 Armv8.5-A 和 Armv8.6-A 中提出的新指令,包括隨機數產生、舍入、記憶體標籤綁定的指令,
    bfloat16 和矩陣乘法。 新增了處理器支援
    Arm Cortex-A77,
    Arm Cortex-A76AE,
    Arm Cortex-A65,
    Arm Cortex-A65AE,
    Arm Cortex-A34 和
    Marvell ThunderX3。

  • 新增了對 ARM32 的 ABI FDPIC(64 位元函數指標)的支援。 重新設計並優化了 64 位元整數運算的處理。 新增了CPU支持
    Arm Cortex-A77,
    Arm Cortex-A76AE 和
    Arm Cortex-M35P。 擴展了對 ACLE 資料處理指令的支持,包括 32 位元 SIMD、16 位元乘法、鎖存算術和其他 DSP 演算法最佳化。 新增了對 ACLE CDE(自訂資料路徑擴展)指令的實驗性支援。

  • 基於 GCN 微架構,顯著改進了 AMD GPU 後端的程式碼產生和向量化。
  • 增加了對 AVR 架構的類似 XMEGA 設備的支持
    ATtiny202、ATtiny204、ATtiny402、ATtiny404、ATtiny406、ATtiny804、ATtiny806、ATtiny807、ATtiny1604、ATtiny1606、ATtiny1607、ATmega808、ATmega 809、ATmega1608 和 ATmega1609。

  • 為 IA-32/x86-64 架構新增了新的 Intel ENQCMD 指令集架構擴充 (-menqcmd)。 新增了對 Intel Cooperlake(-march=cooperlake,包括 AVX512BF16 ISA 擴展)和 Tigerlake(-march=tigerlake,包括 MOVDIRI、MOVDIR64B 和 AVX512VP2INTERSECT ISA 擴展)CPU 的支援。
  • 基於 HSA 架構的異質運算系統的 HSAIL(異質系統架構中間語言)實作已被棄用,並且可能會在未來版本中刪除。

來源: opennet.ru

添加評論