Рэліз набору кампілятараў 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 Compiler) і runtime-бібліятэкі (libphobos), якія дазваляюць выкарыстоўваць штатны GCC для зборкі праграм на мове праграмавання D. Працэс уключэння падтрымкі мовы D у GCC пачаўся яшчэ ў 2011 годзе, але зацягнуўся з-за неабходнасці прывядзення кода да адпаведнасці патрабаванням GCC і праблем з перадачай правоў на інтэлектуальную ўласнасць кампаніі Digital Mars, якая развівае мову праграмавання D;
  • Унесены паляпшэнні ў генератар кода. Напрыклад, рэалізавана ўжыванне розных стратэгій расчынення выразаў Switch (jump table, bit test, decision tree) у залежнасці ад сітуацый. Дададзена магчымасць трансфармацыі лінейных функцый, якія ўключаюць выраз Switch, з выкарыстаннем аптымізацыі "-ftree-switch-conversion" (напрыклад, набор умоў выгляду "case 2: how = 205; break; case 3: how = 305; break;" будзе ператвораны ў "100 * how + 5";
  • Палепшаны міжпрацэдурныя аптымізацыі. Налады inline-разгортвання адаптаваны для сучасных кодавых баз на C++ і пашыраны новымі параметрамі -thunk-time. Падвышаная дакладнасць і агрэсіўнасць падзелу халоднага і гарачага кода. Палепшана масабіраванасць для вельмі вялікіх адзінак трансляцыі (напрыклад, пры ўжыванні аптымізацыі на этапе звязвання да вялікіх праграм);
  • Палепшаны механізм аптымізацыі на аснове вынікаў прафілявання кода (PGO - Profile-guided optimization), які генеруе больш аптымальны код на аснове аналізу асаблівасцяў выканання кода. Зводная опцыя «-fprofile-use» зараз уключае рэжымы аптымізацыі "-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 аптымізацыі дазволілі прыкладна на 5% скараціць час кампіляцыі Firefox 66 і LibreOffice 6.2.3. Памер аб'ектных файлаў знізіўся на 7%. Час звязвання на 8-ядзерным CPU паменшылася на 11%. Паслядоўная стадыя аптымізацыі на этапе звязвання зараз выконваецца на 28% хутчэй і спажывае на 20% менш памяці. Спажыванне памяці кожнага апрацоўшчыка распаралельванай стадыі LTO знізілася на 30%;

  • Для моў C, C++ і Fortran рэалізавана большая частка спецыфікацыі паралельнага праграмавання OpenACC 2.5, вызначальнай сродкі для вынасу аперацый (offloading) на GPU і спецыялізаваныя працэсары, такія як NVIDIA PTX;
  • Для З і З++ рэалізавана частковая падтрымка стандарту Адкрыйце MP 5.0 (Open Multi-Processing), вызначальнага API і спосабы ўжывання метадаў раўналежнага праграмавання для моў Сі, Сі++ і Фортран на шмат'ядравых і гібрыдных (CPU+GPU/DSP) сістэмах з агульнай памяццю і блокамі вектарызацыі (SIMD);
  • Для мовы Сі дададзены новыя папярэджанні: «-Waddress-of-packed-member» (невыраўнаванае значэнне паказальніка на ўпакаваны элемент структуры або аб'яднання) і
    «-Wabsolute-value» (пры звароце да функцый вылічэння абсалютнага значэння, калі для названага аргументу маецца больш прыдатная функцыя, напрыклад, замест abs(3.14) варта выкарыстоўваць fabs(3.14)). Для C++ дададзены новыя папярэджанні: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" і "-Wclass-conversion". Пашыраны многія раней даступныя папярэджанні;

  • Дададзена эксперыментальная падтрымка часткі будучага стандарту мовы Сі, які развіваецца пад кодавым імем C2x. Для ўключэння падтрымкі C2x варта выкарыстоўваць опцыі "-std=c2x" і "-std=gnu2x" (для ўключэння пашырэнняў GNU). Стандарт пакуль на ранняй стадыі развіцця, таму з яго магчымасцяў падтрымліваецца толькі выраз _Static_assert з адным аргументам (_Static_assert c двума аргументамі стандартызавана ў C11);
  • Абвешчана стабільнай падтрымка стандарту C++17. У франтэндзе моўныя магчымасці C++17 рэалізаваны цалкам, а ў libstdc++ вызначаныя ў стандарце бібліятэчныя функцыі блізкія да поўнай рэалізацыі;
  • Прадоўжана рэалізацыя элементаў будучага стандарту C++2a. Напрыклад, дададзена магчымасць уключэння дыяпазонаў пры ініцыялізацыі, рэалізаваны пашырэнні для лямбда-выразаў, дададзена падтрымка пустых чальцоў структур дадзеных і атрыбутаў likely/unlikely, забяспечана магчымасць выкліку віртуальных функцый ва ўмоўных выразах і т.п.
    Для ўключэння падтрымкі C++2a варта выкарыстоўваць опцыі "-std=c++2a" і "-std=gnu++2a". У libstdc++ для C++2a дададзеныя загалоўкавыя файлы bit і version, тыпажы std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible і std::type_identity, функцыі std: , 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-clash-protection»). Для выкарыстання асаблівасцяў архітэктуры Armv8.5-A дададзена опцыя "-march=armv8.5-a"

  • У склад уключаны бэкенд для генерацыі кода для GPU AMD на базе мікраархітэктуры GCN. Рэалізацыя пакуль абмежавана кампіляцыяй аднаструменных прыкладанняў (падтрымка вынасу шматструменных вылічэнняў праз OpenMP і OpenACC будзе прапанавана пазней) і падтрымкай GPU Fiji і Vega 10;
  • Дададзены новы бэкенд для працэсараў OpenRISC;
  • Дададзены бэкенд для працэсараў C-SKY V2, якія выпускаюцца аднайменнай кітайскай кампаніяй для розных спажывецкіх прылад;
  • Ва ўсіх опцыях каманднага радка, якія аперуюць байтавымі значэннямі, забяспечана падтрымка суфіксаў kb, KiB, MB, MiB, GB і GiB;
  • Рэалізавана опцыя "-flive-patching=[inline-only-static|inline-clone]", якая дазваляе дамагчыся бяспечнай кампіляцыі для сістэм гарачага накладання патчаў (live-patching) за кошт шматузроўневага кіравання ужываннем міжпрацэдурных (IPA) аптымізацый;
  • Дададзена опцыя «-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-info»(Дэталізацыя інфармацыі аб дададзеных аптымізацыях). Дададзены новыя прэфіксы "optimized" і "missed", акрамя раней даступнага прэфікса "note". Дададзена выснова звестак аб прыняцці рашэння па inline-разгортванні і вектарызацыі цыклаў;
  • Дададзена опцыя "-fsave-optimization-record", пры ўказанні якой GCC захоўвае файл SRCFILE.opt-record.json.gz з апісаннем рашэнняў па ўжыванні тых ці іншых аптымізацый. Ад рэжыму "-fopt-info" новая опцыя адрозніваецца ўключэннем дадатковых метададзеных, такіх як інфармацыя аб профілі і inline-ланцужках;
  • Дададзеныя опцыі "-fipa-stack-alignment" і "-fipa-reference-addressable" для кіравання пры міжпрацэдурных аптымізацыях выраўноўваннем стэка і ўжываннем рэжымаў адрасацыі (толькі запіс або сапраўды чытанне) для статычных зменных;
  • Прадстаўлены новыя ўбудаваныя функцыі для кіравання прывязкай атрыбутаў, а таксама паводзінамі, злучаным з прадказаннем пераходаў і спекулятыўным выкананнем інструкцый: «__builtin_has_attribute«,«__builtin_expect_with_probability» і «__builtin_speculation_safe_value“. Для функцый, зменных і тыпаў дададзены новы атрыбут копія;
  • Для мовы Fortran рэалізавана паўнавартасная падтрымка асінхроннага ўводу/высновы;
  • Абвешчаная састарэлай і будзе выдаленая ў наступным значным выпуску падтрымка платформаў Solaris 10 (*-*-solaris2.10) і Cell/BE (Cell Broadband Engine SPU). Спынена падтрымка архітэктур Armv2, Armv3, Armv5 і Armv5E. Спынена падтрымка пашырэння Intel MPX (Memory Protection Extensions).

Крыніца: opennet.ru

Дадаць каментар