GCC 10 компилятор топтомунун чыгарылышы

Бир жылдык өнүгүүдөн кийин жарыяланган компиляторлордун акысыз топтомун чыгаруу GCC 10.1, жаңы GCC 10.x бутагынын биринчи негизги релиз. Менен ылайык жаңы схема релиз номерлери, 10.0 версиясы иштеп чыгуу процессинде колдонулган жана GCC 10.1 чыгарар алдында GCC 11.0 бутагы буга чейин эле бутактанган, анын негизинде кийинки маанилүү релиз GCC 11.1 түзүлөт.

GCC 10.1 C++ 20 стандарты үчүн иштелип чыккан C++ тилиндеги көптөгөн инновацияларды ишке ашыруу, келечектеги Си тилинин стандартына (C2x) байланыштуу жакшыртууларды, компилятордун беттериндеги жаңы оптималдаштырууларды жана эксперименталдык колдоону көрсөтүү менен айырмаланат. статикалык талдоо режими. Мындан тышкары, жаңы филиалды даярдоо учурунда, долбоор репозиторийди SVNден Гитке өткөрдү.

негизги өзгөрүүлөр:

  • Кошулган статикалык анализдин эксперименталдык режими "-фанализатор", ал программадагы коддун аткарылышынын жолдорун жана маалымат агымын ресурсту көп талап кылган процедуралар аралык талдоо жүргүзөт. Режим компиляция стадиясында көйгөйлөрдү аныктай алат, мисалы, бир эстутум аймагы үчүн free() функциясына эки жолу чалуу, файлдын дескрипторунун агып кетиши, нөл көрсөткүчтөрдү жокко чыгаруу жана өткөрүү, бошогон эс блокторуна кирүү, инициализацияланбаган маанилерди колдонуу ж.б. OpenSSL коду үчүн жаңы режимди колдонуу мурунтан эле аныктоого мүмкүндүк берген коркунучтуу аялуу.
  • Жакшыртылган процедуралар аралык оптималдаштыруу. IPA-SRA (Interprocedural Scalar Shared Replacement) өтмөгү милдеттүү убакытта иштөө үчүн кайра иштелип чыккан жана башка нерселер менен катар азыр эсептелген жана кайтарылган пайдаланылбаган маанилерди жок кылат. "-O2" оптималдаштыруу режиминде "-finline-функциялары" опциясы иштетилет, ал аткаруу көрсөткүчтөрүнө караганда компакттуу кодду жактыруу үчүн кайра бапталат. Inline функцияларды жайылтуу үчүн эвристикалык иш тездетилди. Киргизилген кеңейтүү жана функцияны клондоо эвристикасы эми жеке трансформациялардын эффективдүүлүгүн болжолдоо үчүн маани диапазондору жөнүндө маалыматты колдоно алат. C++ үчүн типке негизделген лакап аттарды талдоонун тактыгы жакшыртылды.
  • Өркүндөтүлгөн байланыштыруу убактысын оптималдаштыруу (LTO). Жаңы аткарылуучу кошулду lto-dump LTO байт коду менен объект файлдары жөнүндө маалыматты баштапкы абалга келтирүү. Параллель LTO өтүүлөр автоматтык түрдө бир эле учурда иштеп жаткан жасоо тапшырмаларынын санын аныктайт жана аларды аныктоо мүмкүн болбосо, процессордун өзөктөрүнүн саны жөнүндө маалыматты параллелизация фактору катары колдонушат. Zstd алгоритмин колдонуу менен LTO байт кодун кысуу мүмкүнчүлүгү кошулду.
  • Кодду профилдөөнүн натыйжаларына негизделген оптималдаштыруу механизми (PGO - Profile-guided optimization) жакшыртылды, ал коддун аткарылышынын мүнөздөмөлөрүн талдоонун негизинде оптималдуу кодду жаратат. Компиляция жана ысык/муздак кодду бөлүү учурунда жакшыртылган профилдик тейлөө. опциясы аркылуу "-fprofile-values» эми 4 профилдик мааниге чейин көзөмөлдөй алат, мисалы кыйыр чалуулар жана так профиль маалыматын берүү.
  • C, C++ жана Fortran тилдеринде ишке ашырылган параллелдүү программалоонун спецификациясы OpenACC 2.6, ал GPUларда жана NVIDIA PTX сыяктуу адистештирилген процессорлордо жүктөө операцияларын аныктоочу куралдарды аныктайт. Стандартты ишке ашыруу дээрлик аяктады Open MP 5.0 (Open Multi-Processing), бул API жана параллелдүү программалоо ыкмаларын көп ядролуу жана гибриддик (CPU+GPU/DSP) жалпы эс тутуму жана векторизация бирдиктери (SIMD) менен колдонуу ыкмаларын аныктайт. Акыркы жеке шарттар, скандоо жана цикл директивалары, тартип жана use_device_addr туюнтмалары сыяктуу кошумча функциялар. OpenMP жана OpenACC үчүн төртүнчү муундагы (Фиджи) жана бешинчи муундагы AMD Radeon (GCN) GPUларында (VEGA 10/VEGA 20) жүктөө операциялары үчүн колдоо кошулду.
  • Си үй-бүлөсүнүн тилдери үчүн функциянын шилтеме же көрсөткүч аркылуу өтүүчү объекттерге жетүү мүмкүнчүлүгүн сүрөттөө жана объекттердин өлчөмү жөнүндө маалыматты камтыган бүтүн сан аргументтери менен байланыштыруу үчүн "жетиштүү" функциясы кошулган. "Кирүү" менен бирге иштөө үчүн "тип" атрибуту колдонуучунун функцияларынан туура эмес кирүүнү аныктоо үчүн ишке ашырылат, мисалы, массивдин чегинен тышкары аймакка маанилерди жазууда. ELF файлындагы символдорду конкреттүү версия номерлери менен байланыштыруу үчүн "symver" атрибуту да кошулган.
  • Жаңы эскертүүлөр кошулду:
    • "-Wstring-салыштыруу" ("-Wextra" менен иштетилген) - strcmp жана strncmp функцияларын чакыруунун натыйжасы менен нөл салыштырылган туюнтмалардын бар экендиги жөнүндө эскертет, бул узундугуна байланыштуу туруктууга барабар. бир аргументтин өлчөмү экинчи аргументтеги массивдин өлчөмүнөн чоңураак.
    • "-Wzero-length-bounds" ("-Warray-bounds" менен иштетилген) - нөл узундуктагы массивдин элементтерине жетүү жөнүндө эскертет, бул башка маалыматтардын үстүнөн жазууга алып келиши мүмкүн.
    • "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" жана "-Wstringop-overflow" эскертүүлөрү чектен тышкаркы кырдаалдардын санын кеңейтүү үчүн кеңейтилди. иштетилет.
  • UCN нотациясынын (\uNNNN же \UNNNNNNNN) ордуна учурдагы коддоону (демейки боюнча UTF-8) колдонуу менен идентификаторлордо кеңири символдорду түздөн-түз көрсөтүү мүмкүнчүлүгү ишке ашырылды. Мисалы:

    static const int π = 3;
    int get_naïve_pi() {
    кайтаруу π;
    }

  • Си тили үчүн C2X стандартынын алкагында иштелип чыккан жаңы функциялардын бир бөлүгү ишке ашырылган (-std=c2x жана -std=gnu2x көрсөтүү менен иштетилген): "[[]]" синтаксисин колдоо төмөнкүдөй атрибуттарды аныктоо үчүн пайда болду C++ (мисалы, [[gnu ::const]], [[deprecated]], [[fallthrough]] жана [[maybe_unused]]. UTF-8 символдору менен константаларды аныктоо үчүн "u8" синтаксиси кошулду.
    Жаңы макростор кошулду . strftime'га "%OB" жана "%Ob" алмаштыруулар кошулду.

  • C үчүн демейки режим "-fno-common" болуп саналат, ал кээ бир платформаларда глобалдык өзгөрмөлөргө натыйжалуураак жетүүгө мүмкүндүк берет.
  • C++ үчүн C++16 стандартында иштелип чыккан 20га жакын өзгөртүүлөр жана инновациялар киргизилген. Кошулган ачкыч сөздү камтыган "constinit"
    жана шаблон кеңейтүүлөрүн колдоо ишке ашырылды "түшүнүктөр". Түшүнүктөр компиляция убагында калыптын параметрлери катары кабыл алынышы мүмкүн болгон аргументтердин топтомун чектеген шаблон параметрлеринин талаптарынын топтомун аныктоого мүмкүндүк берет. Түшүнүктөр шаблон ичинде колдонулган маалымат типтеринин касиеттери менен киргизүү параметрлеринин маалымат түрүнүн касиеттеринин ортосундагы логикалык карама-каршылыктарды болтурбоо үчүн колдонулушу мүмкүн.

  • G++ constexpr аркылуу туруктуу объекттерди өзгөртүүдөн келип чыккан аныкталбаган жүрүм-турумду аныктоону камсыз кылат. Constexpr эсептөөдө компилятор тарабынан эстутум керектөө кыскарган. "-Wmismatched-tegs" жана "-Wredundant-tegs" жаңы эскертүүлөр кошулду.
  • Жаңы буйрук сабынын параметрлери сунушталды:
    • "-fallocation-dce" "жаңы" жана "жок кылуу" операторлорунун керексиз түгөйлөрүн алып салуу үчүн.
    • "-fprofile-partial-training" машыгуу процесси жок коддун өлчөмүн оптималдаштырууну өчүрүү үчүн.
    • "-fprofile-reproducible профилдин кайталануу деңгээлин көзөмөлдөө үчүн.
    • "-fprofile-prefix-path" өзүнчө профилди түзүү үчүн колдонулган базалык булак куруу каталогун аныктоо үчүн ("-fprofile-generate=profile_dir" жана "-fprofile-use=profile_dir" үчүн).
  • Көрсөтүлгөн варианттар үчүн эскертүү текстинде бул опциялар боюнча документтерге өтүүгө мүмкүндүк берген гипершилтемелер берилген. URL алмаштыруу "-fdiagnostics-urls" опциясы аркылуу көзөмөлдөнөт.
  • Кошулган препроцессор оператору "__курулган", ал орнотулган функцияларды текшерүү үчүн колдонулушу мүмкүн.
  • ISO/IEC TS 18661 спецификациясында аныкталган тегеректөө функциясын ишке ашыруу менен жаңы орнотулган "__builtin_roundeven" функциясы кошулду, "тегерекке" окшош, бирок тегеректөө бөлүгү 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. 32-бит SIMD, 16-биттик көбөйтүү, латч арифметикасы жана башка DSP алгоритмин оптималдаштырууну камтыган ACLE маалыматтарды иштетүү көрсөтмөлөрү үчүн кеңейтилген колдоо. ACLE CDE (Custom Datapath Extension) нускамаларына эксперименталдык колдоо кошулду.

  • GCN микроархитектурасынын негизинде AMD GPU'лары үчүн кодду түзүү жана векторизациялоо кыйла жакшыртылган.
  • AVR архитектурасы үчүн XMEGA сыяктуу түзмөктөрдү колдоо кошулду
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmegamegamega809 , ATmega1608, ATmega1609 3208, ATmega3209 жана ATmega4808.

  • IA-32/x86-64 архитектуралары үчүн жаңы Intel ENQCMD нускамалар топтому архитектура кеңейтүүсү (-menqcmd) кошулду. Intel Cooperlake (-march=cooperlake, AVX512BF16 ISA кеңейтүүсүн камтыйт) жана Tigerlake (-march=tigerlake, MOVDIRI, MOVDIR64B жана AVX512VP2INTERSECT ISA кеңейтүүлөрүн камтыйт) CPU үчүн кошумча колдоо.
  • HSA архитектурасына негизделген гетерогендик эсептөө системалары үчүн HSAIL (Гетерогендик система архитектурасынын орто тили) ишке ашырылышы эскирди жана келечектеги чыгарылышта алынып салынышы мүмкүн.

Source: opennet.ru

Комментарий кошуу