GCC 6.1 釋出了,相信大家都很好奇 GCC 6.1 跟之前的版本有什麼不一樣的地方。Skymizer 也跟大家一樣關心,現在就讓我們一起來看看這個版本的變化吧!
注意事項
- C++ 的預設語言標準從 -std=gnu++98 更改為 -std=gnu++14。
-
部份舊系統的支援和近期未維護或未經測試的 target ports 已列入待移除觀察名單。除非後續有再進行維護,否則它們將在下一個版本的 GCC 被移除。
以下列出在某些特定架構上個體系統的 ports 已被列入待移除觀察名單:- SH5 / SH64
(sh64-*-*)
的移除公告在這裡
- SH5 / 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 現在正確地支援 weakref 和 alias 屬性。這可以在 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 改善:
- warning 和 error 屬性現在已能正確地於 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:- 以 ld -r 的 linking 結果可以產生一個 object file,所有從其它的 object files 來的 sections 都會被合併起來。
這使得實際上的 link time optimization 延緩到最終的 linking 階段才進行,卻讓程式得以整體性的優化。
但有這種 object file 的 Linking final binary 會稍微慢一點點。 - 以 gcc -r 的 linking 會引進 link time optimization 並把最終的 binary 放進一個 object file,
對這樣的 object file 做 linking 比較快,但對整個程式的優化來說效益較少。
GCC 7 未來將以 gcc -r 直接支援 incremental link-time optimization。
- 以 ld -r 的 linking 結果可以產生一個 object file,所有從其它的 object files 來的 sections 都會被合併起來。
- Inter-procedural optimization 的改善:
- 基本的 jump threading 現在將在 profile construction 及 inline analysis 前執行,
結果可使估計的時間和大小更貼近真實,提供給 inliner 和 function cloning 階段做 heuristic 評估。 - Fuction cloning 現在會更積極地清理未使用的 function 參數。