Објавување на пакетот компајлер 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, подобрувања поврзани со идниот јазичен стандард C (C2x), нови оптимизации во заднините на компајлерот и експериментална поддршка режим на статичка анализа. Дополнително, при подготовката на нова филијала, проектот го префрли складиштето од SVN во Git.

Главните промени:

  • Додадено експериментален начин на статичка анализа "- фанализатор“, која врши интерпроцедурална анализа со интензивна ресурси на патеките за извршување на кодот и тековите на податоци во програмата. Режимот е способен за откривање проблеми во фазата на компилација, како што се двојни повици до функцијата free() за една мемориска област, протекување на дескрипторот на датотеки, дереференцирање и пренесување нула покажувачи, пристап до ослободени мемориски блокови, користење неиницијализирани вредности итн. Употребата на новиот режим за кодот OpenSSL веќе овозможи да се идентификува опасна ранливост.
  • Подобрени интерпроцедурални оптимизации. Пропусницата IPA-SRA (Interprocedural Scalar Shared Replacement) е редизајнирана да работи во време на врзување и, меѓу другото, сега ги отстранува пресметаните и вратените неискористени вредности. Во режимот за оптимизација „-O2“, опцијата „-finline-functions“ е овозможена, која е повторно наместена за да се фаворизира покомпактен код пред перформансите на извршување. Работата на хеуристиката за распоредување на функцијата во линија е забрзана. Хеуристиката за проширување и функционално клонирање сега може да користи информации за опсегот на вредности за да ја предвиди ефективноста на поединечните трансформации. За C++, точноста на парсирањето на псевдоними засновано на тип е подобрена.
  • Подобрени оптимизации за време на поврзување (LTO). Додадена е нова извршна датотека ѓубре да ги ресетирате информациите за објектните датотеки со LTO бајтекод. Паралелните минувања на LTO автоматски го одредуваат бројот на задачите за правење што се извршуваат истовремено и, доколку не можат да се утврдат, користете информации за бројот на јадра на процесорот како фактор на паралелизација. Додадена е способност за компресија на LTO бајтекод користејќи го алгоритмот zstd.
  • Механизмот за оптимизација базиран на резултатите од профилирањето на кодот (PGO - Profile-guided optimization) е подобрен, што генерира пооптимален код врз основа на анализа на карактеристиките на извршувањето на кодот. Подобрено одржување на профилот за време на компилацијата и раздвојување на топло/ладно код. Преку опцијата "-fprofile-вредности» сега може да следи до 4 вредности на профилот, на пример за индиректни повици и обезбедување попрецизни информации за профилот.
  • Спецификација за паралелно програмирање имплементирана за C, C++ и Fortran јазиците OpenACC 2.6, кој ги дефинира алатките за истоварување операции на графички процесори и специјализирани процесори како што е NVIDIA PTX. Имплементацијата на стандардот е речиси завршена Отворете MP 5.0 (Open Multi-Processing), кој ги дефинира API и методите за примена на паралелни методи на програмирање на повеќејадрени и хибридни (CPU+GPU/DSP) системи со заедничка меморија и единици за векторизација (SIMD). Додадени функции како што се последни приватни условувања, директиви за скенирање и циклус, изрази за нарачка и use_device_addr. За OpenMP и OpenACC, додадена е поддршка за исфрлање операции на графички процесори од четвртата генерација (Фиџи) и петтата генерација AMD Radeon (GCN) (VEGA 10/VEGA 20).
  • За јазиците од семејството C, функцијата „пристап“ е додадена за да се опише пристапот на функцијата до објектите што се пренесуваат со референца или покажувач и да се поврзат таквите објекти со цели броеви кои содржат информации за големината на објектите. За да работи заедно со „пристап“, атрибутот „тип“ се имплементира за да открие неточен пристап од корисничките функции, на пример, кога пишувате вредности во област надвор од границите на низата. Додаден е и атрибутот „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). На пример:

    статички const int π = 3;
    int get_naïve_pi() {
    врати π;
    }

  • За јазикот C, имплементиран е дел од нови функции развиени во рамките на стандардот C2X (овозможено со наведување -std=c2x и -std=gnu2x): се појави поддршка за синтаксата „[[]]“ за дефинирање на атрибутите како во C++ (на пример, [[gnu ::const]], [[застарено]], [[fallthrough]] и [[maybe_unused]]. Додадена е поддршка за синтаксата „u8“ за дефинирање на константи со знаци UTF-8.
    Додадени се нови макроа во . Додадени се замени „%OB“ и „%Ob“ на strftime.

  • Стандардниот режим за C е „-fno-common“, што овозможува поефикасен пристап до глобалните променливи на некои платформи.
  • За C++, имплементирани се околу 16 промени и иновации, развиени во стандардот C++20. Вклучувајќи го додадениот клучен збор „continit“
    и имплементирана е поддршка за екстензии на шаблони "концепти“. Концептите ви дозволуваат да дефинирате множество барања за параметри на шаблоните кои, при компајлирањето, го ограничуваат множеството аргументи што може да се прифатат како параметри на шаблонот. Концептите може да се користат за да се избегнат логички недоследности помеѓу својствата на типовите на податоци што се користат во шаблонот и својствата на типот на податоци на влезните параметри.

  • 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“.
  • Додаден претпроцесорски оператор "__има_изграден", што може да се користи за проверка на вградените функции.
  • Додадена е нова вградена функција „__builtin_roundeven“ со имплементација на функцијата за заокружување дефинирана во спецификацијата ISO/IEC TS 18661, слична на „круг“, но заокружува дел поголем од 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 и множење на матрицата. Додадена е поддршка за процесорот
    Рачен кортекс-А77,
    Arm Cortex-A76AE,
    Рачен кортекс-А65,
    Arm Cortex-A65AE,
    Рачен кортекс-А34 и
    Marvell ThunderX3.

  • Додадена е поддршка за ABI FDPIC (32-битни функциски покажувачи) за ARM64. Редизајнирана и оптимизирана обработка на 64-битни операции со цели броеви. Додадена е поддршка за процесорот
    Рачен кортекс-А77,
    Arm Cortex-A76AE и
    Рачен кортекс-M35P. Проширена поддршка за инструкции за обработка на податоци ACLE, вклучувајќи 32-битен SIMD, 16-битно множење, аритметика на бравата и други оптимизации на алгоритам DSP. Додадена е експериментална поддршка за инструкциите за ACLE CDE (Прилагодено проширување на патеката за податоци).

  • Значително подобрено генерирање код и векторизација во заднината за AMD графичките процесори базирани на микроархитектурата на GCN.
  • Додадена е поддршка за уреди слични на XMEGA за AVR архитектура
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATtiny808, ATtiny809, ATmega1608ATme1609, ATmega3208ATme3209, ATmega4808, ATmega4809 , ATmegaXNUMX, ATmegaXNUMX XNUMX, ATmegaXNUMX и ATmegaXNUMX.

  • За архитектурите IA-32/x86-64 е додадена нова екстензија за архитектура на комплет инструкции на Intel ENQCMD (-menqcmd). Додадена е поддршка за Intel Cooperlake (-march=cooperlake, вклучува екстензија AVX512BF16 ISA) и Tigerlake (-march=tigerlake, ги вклучува MOVDIRI, MOVDIR64B и AVX512VP2INTERSECT ISA екстензии) процесори.
  • Имплементацијата на HSAIL (Среден јазик за хетерогена архитектура на системот) за хетерогени компјутерски системи базирани на архитектурата HSA е застарена и најверојатно ќе биде отстранета во идното издание.

Извор: opennet.ru

Додадете коментар