Рэліз набору кампілятараў GCC 10

Пасля года распрацоўкі апублікаваны рэліз свабоднага набору кампілятараў GCC 10.1, першы значны выпуск у новай галінцы GCC 10.x. У адпаведнасці з новай схемай нумарацыі выпускаў, версія 10.0 выкарыстоўвалася падчас распрацовак, а незадоўга да выхаду GCC 10.1 ужо адгалінулася галінка GCC 11.0, на базе якой будзе сфарміраваны наступны значны рэліз GCC 11.1.

GCC 10.1 адметны рэалізацыяй шматлікіх навін мовы C++, якія развіваюцца для стандарту C++20, паляпшэннямі злучанымі з будучыняй стандартам мовы Сі (C2x), новымі аптымізацыямі ў бэкендах кампілятара і эксперыментальнай падтрымкай рэжыму статычнага аналізу. Акрамя таго, падчас падрыхтоўкі новага адгалінавання праектам выкананы пераклад рэпазітара з SVN на Git.

Асноўныя змены:

  • Дададзены эксперыментальны рэжым статычнага аналізу «-аналізатар«, які выконвае рэсурсаёмісты міжпрацэдурны аналіз шляхоў выканання кода і плыняў дадзеных у праграме. Рэжым здольны на этапе кампіляцыі выяўляць такія праблемы, як падвойны выклік функцыі free() для адной вобласці памяці, уцечкі файлавых дэскрыптараў, разнайменаванне і перадачу нулявых паказальнікаў, зварот да вызваленых блокаў памяці, выкарыстанне неініцыялізаваных значэнняў і да т.п. Ужыванне новага рэжыму для кода OpenSSL ужо дазволіла выявіць небяспечную ўразлівасць.
  • Палепшаны міжпрацэдурныя аптымізацыі. Праход IPA-SRA (міжпрацэдурная скалярная замена агульных значэнняў) перапрацаваны для працы падчас звязвання і апроч іншага зараз выдаляе якія вылічаюцца і што вяртаюцца невыкарыстоўваныя значэнні. У рэжыме аптымізацыі "-O2" уключаная опцыя "-finline-functions", якая пераналаджана ў карысць атрымання больш кампактнага кода, чым у карысць прадукцыйнасці выканання. Паскорана праца эўрыстыкі inline-разгортвання функцый. Эўрыстыка inline-разгортвання і кланаванне функцый зараз можа выкарыстоўваць інфармацыю аб дыяпазонах значэнняў для прадказання эфектыўнасці асобных пераўтварэнняў. Для З++ падвышана дакладнасць аналізу псеўданімаў на аснове тыпаў.
  • Пашыраны аптымізацыі на этапе звязвання (LTO). Дададзены новы выкананы файл lto-dump для скіду інфармацыі аб аб'ектных файлах з байткодам LTO. У раўналежна выкананых праходах LTO забяспечана аўтаматычнае вызначэнне ліку адначасова запускаемых задач make і, калі іх не атрымалася вызначыць, выкарыстанне ў якасці фактару распаралельвання звестак аб ліку ядраў CPU. Дададзена магчымасць сціску байткода LTO пры дапамозе алгарытму zstd.
  • Палепшаны механізм аптымізацыі на аснове вынікаў прафілявання кода (PGO - Profile-guided optimization), які генеруе больш аптымальны код на аснове аналізу асаблівасцяў выканання кода. Палепшана суправаджэнне профіля падчас кампіляцыі і падзелы «гарачага»/»халоднага» кода. Праз опцыю-fprofile-values» зараз можна адсочваць да 4 значэнняў профілю, напрыклад, для ўскосных выклікаў і прадастаўлення больш дакладнай інфармацыі аб профілі.
  • Для моў C, C++ і Fortran рэалізавана спецыфікацыя паралельнага праграмавання OpenACC 2.6, Якая вызначае сродкі для вынасу аперацый (offloading) на GPU і спецыялізаваныя працэсары, такія як NVIDIA PTX. Амаль завершана рэалізацыя стандарту Адкрыйце MP 5.0 (Open Multi-Processing), вызначальнага API і спосабы ўжывання метадаў раўналежнага праграмавання на шмат'ядравых і гібрыдных (CPU+GPU/DSP) сістэмах з агульнай памяццю і блокамі вектарызацыі (SIMD). Дададзеныя такія магчымасці як умоўныя выразы lastprivate, дырэктывы scan і loop, выразы order і use_device_addr. Для OpenMP і OpenACC дададзена падтрымка вынасу аперацый (offloading) на GPU AMD Radeon (GCN) чацвёртага (Fiji) і пятага пакаленняў (VEGA 10/VEGA 20).
  • Для моў сямейства Сі дададзена функцыя «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). Напрыклад:

    static const int π = 3;
    int get_naïve_pi() {
    return π;
    }

  • Для мовы Сі рэалізаваная порцыя новых магчымасцяў якія развіваюцца ў рамках стандарту C2X (уключаецца праз указанне -std=c2x і -std=gnu2x): з'явілася падтрымка сінтаксісу «[[]]» для азначэння атрыбутаў як у З++ (напрыклад, [[gnu ::const]], [[deprecated]], [[fallthrough]] і [[maybe_unused]] Дададзена падтрымка сінтаксісу u8» для вызначэння канстант з сімваламі ў UTF-8.
    Дададзеныя новыя макрасы ў . У strftime дададзеныя падстаноўкі %OB і %Ob.

  • Па змаўчанні для Сі ўжыты рэжым "-fno-common", які дазваляе падвысіць эфектыўнасць доступу да глабальных зменных на некаторых платформах.
  • Для C++ рэалізавана каля 16 змен і навін, якія развіваюцца ў стандарце C++20. У тым ліку дададзена ключавое слова "constinit"
    і рэалізавана падтрымка пашырэння шаблонаўканцэпцыі“. Канцэпцыі дазваляюць вызначыць набор патрабаванняў да параметраў шаблону, якія падчас кампіляцыі абмяжоўваюць набор аргументаў, якія могуць прымацца ў якасці параметраў шаблона. Канцэпцыі можна ўжываць для таго, каб пазбегнуць лагічных неадпаведнасцяў паміж уласцівасцямі тыпаў дадзеных, выкарыстоўваных усярэдзіне шаблону, і ўласцівасцямі тыпаў дадзеных уваходных параметраў.

  • У G++ забяспечана выяўленне нявызначаных паводзін, выкліканага зменай аб'ектаў-канстант праз constexpr. Зніжана спажыванне памяці кампілятарам пры вылічэнні constexpr. Дададзеныя новыя папярэджанні "-Wmismatched-tags" і "-Wredundant-tags".
  • Прапанаваны новыя опцыі каманднага радка:
    • "-fallocation-dce" для выдалення лішніх пар аператараў "new" і "delete".
    • -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 (Scalable Vector Extension), у тым ліку дададзеная падтрымка ўбудаваных функцый і тыпаў SVE ACLE, забяспечана ўжыванне вектарызацыі. Пашыраная падтрымка LSE (Large System Extensions) і TME (Transactional Memory Extension). Дададзены новыя інструкцыі, прапанаваныя ў 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 (Custom Datapath Extension).

  • Значна палепшана генерацыя кода і вектарызацыя ў бэкендзе для GPU AMD на базе мікраархітэктуры GCN.
  • Для архітэктуры AVR дададзена падтрымка XMEGA-падобных прылад.
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATtiny809, ATmega1608 ATmega1609, ATmega3208, ATmega3209 і ATmega4808.

  • Для архітэктур IA-32/x86-64 дададзена новае пашырэнне архітэктуры набору каманд Intel ENQCMD (-menqcmd). Дададзена падтрымка CPU Intel Cooperlake (-march = cooperlake, уключае ISA-пашырэнне AVX512BF16) і Tigerlake (-march = tigerlake, уключае ISA-пашырэння MOVDIRI, MOVDIR64B і AVX512VP2INTERSECT).
  • Абвешчаная састарэлай і верагодна будзе выдаленая ў будучыні выпуску рэалізацыя прамежкавай мовы HSAIL (Heterogeneous System Architecture Intermediate Language) для гетэрагенных вылічальных сістэм на базе архітэктуры HSA.

Крыніца: opennet.ru

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