GCC 6.1 Release Note 重點翻譯(上)

GCC 6.1 釋出了,相信大家都很好奇 GCC 6.1 跟之前的版本有什麼不一樣的地方。Skymizer 也跟大家一樣關心,現在就讓我們一起來看看這個版本的變化吧!

注意事項

  • C++ 的預設語言標準從 -std=gnu++98 更改為 -std=gnu++14

  • 部份舊系統的支援和近期未維護或未經測試的 target ports 已列入待移除觀察名單。除非後續有再進行維護,否則它們將在下一個版本的 GCC 被移除。
    以下列出在某些特定架構上個體系統的 ports 已被列入待移除觀察名單:

    • SH5 / SH64 (sh64-*-*) 的移除公告在這裡

一般性最佳化改善

  • UndefinedBehaviorSanitizer 提供新的 sanitization 選項:-fsanitize=bounds-strict,可以打開嚴格的 array bounds 檢查。
    特別是,它同時啟用了 fsanitize=bounds 和 instrumentation of flexible array member-like arrays。

  • Type-based alias 的分析現在能夠更清楚地處理不同指標的存取行為。在高階的 C/C++ 程式中大約改善了 20%-30% 的 alias oracle 精確度。
    某些使用 invalid type punning of pointer types 的程式現在可能需要 -fno-strict-aliasing 才能正確運作。

  • Alias analysis 現在正確地支援 weakrefalias 屬性。這可以在 link-time optimization 時對單一檔案正確地存取變數以及其 alias。

  • Value range propogation 優化現在會假設 C++ 成員函式的 this 指標不為 null。
    這樣可減少平常的 null 指標檢查但也會造成某些 non-conforming 的程式 (Qt-5, Chromium, KDevelop) 出問題。
    可以使用 -fno-delete-null-pointer-checks 作為暫時的解決方法。錯誤的程式碼可以被 -fsanitize=undefined 識別出來。

  • Link-time optimization 改善:

    • warningerror 屬性現在已能正確地於 declaration linking 時保留下來,且 -D_FORTIFY_SOURCE=2 現在能被 -flto 支援。
    • 已修正 Type merging,以處理 Fortran 2008 語言標準中定義的 C 和 Fortran 的 interoperability rules。
      不過也有例外,CHARACTER(KIND=C_CHAR) 無法在任何狀況下和 char 交互運作,
      因為若 char 是個純量 (scalar),則 CHARACTER(KIND=C_CHAR) 是個陣列。
      此時可以用 INTEGER(KIND=C_SIGNED_CHAR) 取代。
      總的來說,這樣的互用性無法被施行,例如,在陣列裡 passing convention 的函式和純量並不相同。
    • Link time 現在保存了更多的 type 資訊,和沒有 link-time optimization 比起來,減少了 type based alias 精確度降低的幅度。
    • 在宣告以及環境變數中的 invalid type punning 現在能用 -Wodr-type-mismatch 回報。
    • LTO 下的 object file 大小現在減少了 11% (以 Firefox 46.0 編譯測量)。
    • Link-time 平行化(用 -flto=n 執行)有重大改進,減少了分割程式時 streamed data 的大小。
      編譯 Firefox 46.0 時的 streamed IL 大小減少了 66%。
    • 擴充 Linker plugin 功能,可傳遞 GCC 後端的 binary type 資訊(也可以用 -flinker-output 手動控制)。
      這讓它可以更正確地設定 code generator 以及支援 incremental linking。
      在啟用 plugin 設定時支援以 gcc -r 來對 LTO object file 進行 incremental linking。
      有兩種方法可以進行 incremental linkg:

      1. ld -r 的 linking 結果可以產生一個 object file,所有從其它的 object files 來的 sections 都會被合併起來。
        這使得實際上的 link time optimization 延緩到最終的 linking 階段才進行,卻讓程式得以整體性的優化。
        但有這種 object file 的 Linking final binary 會稍微慢一點點。
      2. gcc -r 的 linking 會引進 link time optimization 並把最終的 binary 放進一個 object file,
        對這樣的 object file 做 linking 比較快,但對整個程式的優化來說效益較少。
        GCC 7 未來將以 gcc -r 直接支援 incremental link-time optimization。
    • Inter-procedural optimization 的改善:

    • 基本的 jump threading 現在將在 profile construction 及 inline analysis 前執行,
      結果可使估計的時間和大小更貼近真實,提供給 inliner 和 function cloning 階段做 heuristic 評估。
    • Fuction cloning 現在會更積極地清理未使用的 function 參數。
Source: GCC 6 Release Series Changes, New Features, and Fixes

相關閱讀:GCC 6 Release Note (下)

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *