GCC 11 компиляторлар жинағының шығарылымы

Бір жылдық дамудан кейін тегін GCC 11.1 компиляторлар жинағының шығарылымы шығарылды, бұл жаңа GCC 11.x тармағындағы бірінші маңызды шығарылым. Жаңа шығарылымды нөмірлеу схемасы бойынша 11.0 нұсқасы әзірлеу кезінде пайдаланылды және GCC 11.1 шығарылымына аз уақыт қалғанда GCC 12.0 тармағы қазірдің өзінде ажыратылған болатын, одан GCC 12.1 келесі маңызды шығарылымы қалыптасады.

GCC 11.1 әдепкі бойынша DWARF 5 отладка файл пішімін пайдалануға көшуімен, C++17 стандартының әдепкі қосылуымен («-std=gnu++17»), C++20 қолдауының айтарлықтай жақсартуларымен ерекшеленеді. стандартты, C++23 үшін эксперименттік қолдау, болашақ Си тілінің стандартына (C2x) қатысты жақсартулар, өнімділікті жаңа оңтайландырулар.

Негізгі өзгерістер:

  • C++ тілінің әдепкі режимі бұрын ұсынылған C++ 17 орнына C++ 17 стандартын (-std=gnu++14) пайдалануға ауыстырылды. Басқа үлгілерді параметр ретінде пайдаланатын үлгілерді өңдеу кезінде жаңа C++17 әрекетін таңдаулы түрде өшіруге болады (-fno-new-ttp-матч).
  • AddressSanitizer құралының аппараттық жеделдетілуіне қолдау қосылды, ол бос жад аймақтарына қол жеткізу, бөлінген буфер шекарасынан шығу фактілерін және жадпен жұмыс істеу кезінде қателердің кейбір басқа түрлерін анықтауға мүмкіндік береді. Аппараттық жеделдету қазіргі уақытта тек AArch64 архитектурасы үшін қол жетімді және Linux ядросын құрастыру кезінде пайдалануға бағытталған. Пайдаланушы кеңістігі құрамдастарын құру кезінде AddressSanitizer аппараттық жеделдетуді қосу үшін "-fsanitize=hwaddress" жалаушасы және "-fsanitize=kernel-hwaddress" ядролық жалаушасы қосылды.
  • Түзету ақпаратын жасау кезінде әдепкі бойынша DWARF 5 пішімі пайдаланылады, ол алдыңғы нұсқалармен салыстырғанда 25%-ға ықшам жөндеу деректерін жасауға мүмкіндік береді. DWARF 5 үшін толық қолдау кем дегенде binutils 2.35.2 нұсқасын қажет етеді. DWARF 5 пішіміне GDB 8.0, valgrind 3.17.0, elfutils 0.172 және dwz 0.14 бастап жөндеу құралдарында қолдау көрсетіледі. DWARF бағдарламасының басқа нұсқаларын пайдаланып жөндеу файлдарын жасау үшін "-gdwarf-2", "-gdwarf-3" және "-gdwarf-4" опцияларын пайдалануға болады.
  • GCC құру үшін пайдалануға болатын компиляторларға қойылатын талаптар ұлғайтылды. Енді компилятор C++ 11 стандартын қолдауы керек (бұрын C++ 98 талап етілетін), яғни. Егер GCC 10 GCC 3.4 құру үшін жеткілікті болса, GCC 11 құру үшін кем дегенде GCC 4.8 қажет.
  • Демптерді, уақытша файлдарды және LTO оңтайландыруына қажетті қосымша ақпаратты сақтауға арналған файлдардың атауы мен орны өзгертілді. Жол "-dumpbase", "-dumpdir" және "-save-temps=*" опциялары арқылы анық өзгертілмесе, мұндай файлдар енді әрқашан ағымдағы каталогта сақталады.
  • HSAIL (гетерогенді жүйе архитектурасының аралық тілі) тілімен пайдалануға арналған BRIG екілік пішімін қолдау ескірген және жақын арада жойылады.
  • ThreadSanitizer режимінің мүмкіндіктері (-fsanitize=thread) кеңейтілді, көп ағынды қолданбаның әртүрлі ағындарынан бірдей деректерді ортақ пайдалану кезінде жарыс шарттарын анықтауға арналған. Жаңа шығарылым баламалы жұмыс уақыттары мен орталарға қолдауды қосады, сонымен қатар Linux ядросындағы жарыс жағдайларын динамикалық түрде анықтауға арналған KCSAN (ядроның бір мезгілдегі дезинфекциялау құралы) жөндеу құралына қолдау көрсетеді. «-param tsan-distinguish-volatile» және «-param tsan-instrument-func-entry-exit» жаңа опциялары қосылды.
  • Диагностикалық хабарламалардағы баған нөмірлері енді жолдың басынан бастап байт санын емес, шын мәнінде көп байтты таңбаларды және жолда бірнеше орынды алатын таңбаларды ескеретін баған нөмірлерін көрсетеді (мысалы, 🙂 таңбасы екі орынды алады және 4 байтпен кодталған). Сол сияқты, қойынды таңбалары енді бос орындардың белгілі бір саны ретінде қарастырылады (-ftabstop опциясы арқылы конфигурацияланады, әдепкі 8). Ескі әрекетті қалпына келтіру үшін “-fdiagnostics-column-unit=byte” опциясы ұсынылады, ал бастапқы мәнді анықтау (0 немесе 1-ден бастап нөмірлеу) – “-fdiagnostics-column-origin=” опциясы.
  • Векторизатор функцияның барлық мазмұнын ескереді және басқару-ағын графигіндегі (CFG, бақылау-ағын графигі) алдыңғы блоктарға сілтемелер мен қиылыстармен байланысты өңдеу мүмкіндіктерін қосады.
  • Оңтайландырушы бір айнымалы мәнді ауыстырып қосқыш өрнегіне салыстыратын шартты операциялар қатарын түрлендіру мүмкіндігін жүзеге асырады. Ауыстыру өрнегін кейінірек биттік тестілеу нұсқаулары арқылы кодтауға болады (мұндай түрлендіруді басқару үшін «-fbit-tests» опциясы қосылған).
  • Жақсартылған процедурааралық оңтайландырулар. Функцияларды шақыру кезінде жанама әсерлерді бақылау және талдаудың дәлдігін жақсарту үшін жаңа IPA-modref рұқсаты (-fipa-modref) қосылды. IPA-ICF өтуін (-fipa-icf) жақсарту, ол компиляция кезінде жадты тұтынуды азайтады және кодтың бірдей блоктары біріктірілген бірыңғай функциялардың санын арттырады. IPA-CP (Interprocedural Constant Propagation) өтуінде циклдердің белгілі шекаралары мен ерекшеліктерін ескере отырып болжау эвристикасы жетілдірілді.
  • Уақытты оңтайландыруларды байланыстыруда (LTO) байт код пішімі өлшемді азайту және өңдеу жылдамдығын жақсарту үшін оңтайландырылған. Байланыстыру кезеңінде жадты тұтынудың ең жоғары деңгейі төмендеді.
  • Орындау мүмкіндіктерін талдау негізінде анағұрлым оңтайлы кодты генерациялауға мүмкіндік беретін кодты профильдеу (PGO - Profile-guided Optimization) нәтижелеріне негізделген оңтайландыру механизмінде GCOV деректері бар файлдардың өлшемі нөлдік есептегіштердің ықшам орауының арқасында азаяды. . Жанама қоңыраулардағы көбірек параметрлерді қадағалау арқылы жақсартылған "-fprofile-values" режимі.
  • Ортақ жады және векторизация бірліктері (SIMD) бар көп ядролы және гибридті (CPU+GPU/DSP) жүйелерде параллельді бағдарламалау әдістерін қолданудың API және әдістерін анықтайтын OpenMP 5.0 (Open Multi-Processing) стандартын енгізу. жалғастырды. Бөлу директивасына бастапқы қолдау және OpenMP конструкцияларында гетерогенді циклдарды пайдалану мүмкіндігі қосылды. OMP_TARGET_OFFLOAD ортасының айнымалы мәніне қолдау енгізілді.
  • C, C++ және Fortran тілдеріне арналған OpenACC 2.6 параллельді бағдарламалау спецификациясын енгізу жетілдірілді, ол GPU және NVIDIA PTX сияқты мамандандырылған процессорлардағы жүктеу операцияларына арналған құралдарды анықтайды.
  • Си тілдері үшін стек қорғауы қосылмауы тиіс функцияларды белгілеуге арналған «no_stack_protector» жаңа төлсипаты жүзеге асырылды («-fstack-protector»). «malloc» атрибуты жадты бөлуге және босатуға арналған шақырулар жұбын анықтауға қолдау көрсету үшін кеңейтілді (бөлгіш/бөлгіш), ол жадпен жұмыс істеудегі типтік қателерді (жадтың ағып кетуі, босатудан кейін пайдалану,) анықтау үшін статикалық анализаторда қолданылады бос функцияға қосарланған шақырулар және т.б.) және компилятордың «-Wmismatched-dealloc», «-Wmismatched-new-delete» және «-Wfree-nonheap-object» ескертулерінде жадты босату және жадты бөлу операциялары арасындағы сәйкессіздік туралы хабарлайды.
  • Си тілі үшін жаңа ескертулер қосылды:
    • "-Wmismatched-dealloc" (әдепкі бойынша қосылған) - жадты бөлу функцияларымен үйлесімді емес көрсеткішті пайдаланатын жадты бөлу операциялары туралы ескертеді.
    • "-Wsizeof-array-div" ("-Wall" көрсетілгенде қосылады) - Егер бөлгіш массив элементінің өлшеміне сәйкес келмесе, екі sizeof операторын бөлу туралы ескертеді.
    • "-Wstringop-overread" (әдепкі бойынша қосулы) - жиым шекарасынан тыс аумақтан деректерді оқитын жол функциясын шақыру туралы ескертеді.
    • "-Wtsan" (әдепкі бойынша қосулы) - ThreadSanitizer қолданбасында қолдау көрсетілмейтін мүмкіндіктерді (мысалы, std::atomic_thread_fence) пайдалану туралы ескертеді.
    • “-Warray-parameter” және “-Wvla-parameter” (“-Wall” көрсету кезінде қосылады) – бекітілген және айнымалы ұзындықтағы массивтермен байланысты аргументтердің үйлеспейтін мәлімдемелерімен функцияларды қайта анықтау туралы ескертеді.
    • "-Wuninitialized" ескертуі енді инициализацияланбаған динамикалық түрде бөлінген жадтан оқу әрекеттерін анықтайды.
    • "-Wfree-nonheap-object" ескертуі жадты босату функциялары динамикалық жадты бөлу функциялары арқылы алынбаған көрсеткішпен шақырылатын жағдайлардың анықтамасын кеңейтеді.
    • "-Wmaybe-инициализацияланбаған" ескертуі инициализацияланбаған жад орындарына сілтеме жасайтын функцияларға көрсеткіштерді жіберуді анықтауды кеңейтті.
  • Си тілі үшін C2X стандарты аясында әзірленген жаңа мүмкіндіктердің бір бөлігі іске асырылды (-std=c2x және -std=gnu2x көрсету арқылы қосылған): BOOL_MAX және BOOL_WIDTH макростары, функциядағы пайдаланылмаған параметрлер атауларының қосымша көрсеткіші анықтамалар (C++ тіліндегідей), “[ [nodiscard]] төлсипаты, препроцессор операторы "__c_атрибуты", макростар FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_LTANFITY, FSN60559_XNUMXT, NBL_EXIT _SNAN, LDBL_SNAN, DEC_INFINITY және DEC _NAN, NaN=макростар FloatN, _FloatNx және _DecimalN, мәлімдемелердің алдында және құрама мәлімдемелердің соңында өту белгілерін көрсету мүмкіндігі.
  • C++ үшін C++20 стандартында ұсынылған өзгерістер мен жаңалықтардың бір бөлігі, соның ішінде «consteval virtual» виртуалды функциялары, объектілердің өмірлік циклінің аяқталуына арналған псевдодеструкторлар, enum класын пайдалану және «жаңа» өрнектегі массив өлшемін есептеу.
  • C++ үшін болашақ C++23 стандарты үшін әзірленетін кейбір жақсартуларға эксперименттік қолдау қосылды (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Мысалы, енді қол қойылған size_t мәндері үшін "zu" әріптік жұрнағын қолдау бар.
  • libstdc++ C++17 стандартына қолдауды жақсартты, оның ішінде өзгермелі нүкте түрлері үшін std::from_chars және std::to_chars іске асыруларын енгізу. C++20 стандартының жаңа элементтері, соның ішінде std::bit_cast, std::source_location, атомдық операциялар күту және хабарлау, , , , , сонымен қатар болашақ C++ стандарты 23 (std::to_underlying, std::is_scoped_enum). Деректерді параллель өңдеуге арналған түрлерге эксперименттік қолдау қосылды (SIMD, Data-Parallel Types). std::uniform_int_distribution орындалуы жеделдетілді.
  • Альфа сапасы жалаушасы libgccjit-тен, код генераторын басқа процестерге ендіруге және оны машина кодына байт кодының JIT компиляциясын ұйымдастыру үшін пайдалануға арналған ортақ кітапханадан жойылды. MinGW үшін libgccjit құру мүмкіндігі қосылды.
  • AArch64 Armv8-R архитектурасына қолдау қосылды (-march=armv8-r). AArch64 және ARM архитектуралары үшін процессорларға қолдау қосылды (параметрлері -mcpu және -mtune): Arm Cortex-A78 (кортекс-a78), Arm Cortex-A78AE (кортекс-a78ae), Arm Cortex-A78C (кортекс-a78c) , Arm Cortex- X1 (кортекс-x1), Arm Neoverse V1 (neoverse-v1) және Arm Neoverse N2 (neoverse-n2). Fujitsu A64FX (a64fx) және Arm Cortex-R82 (cortex-r82) процессорлары да қосылды, олар тек AArch64 архитектурасына қолдау көрсетеді.
  • Қосу, алу, көбейту және қосу/азайту нұсқаларын орындайтын операцияларды автовекторлау үшін Armv8.3-a (AAarch64/AArch32), SVE (AAarch64), SVE2 (AAarch64) және MVE (AAarch32 M-профиль) SIMD нұсқауларын пайдалануға қолдау қосылды. күрделі сандар. MVE нұсқаулар жинағын пайдаланып ARM үшін автовекторизацияға бастапқы қолдау қосылды.
  • ARM платформалары үшін ACLE Q3 2020 спецификациясында құжатталған барлық NEON нұсқауларын қамтитын кеңейтілген векторлық нұсқаулармен (SIMD) ауыстырылған компилятормен біріктірілген C функцияларының (Intrinsics) толық жиынтығы қамтамасыз етілген.
  • GCN микроархитектурасына негізделген AMD GPU үшін кодты жасау үшін серверге gfx908 GPU қолдауы қосылды.
  • Жаңа процессорларға және оларда енгізілген жаңа нұсқаулар жиынтығы кеңейтіміне қолдау қосылды:
    • Intel Sapphire Rapids (-march=sapphirerapids, MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TXLDTRK, AMT-TILEXNF, AMT-TILE.NF, AMT-TILE, TXLDTRK, MOVDIR8B, AVX16VPXNUMXINTERSECT, нұсқауларын қолдауға мүмкіндік береді.
    • Intel Alderlake (-march=alderlake, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI және HRESET нұсқауларын қолдауға мүмкіндік береді).
    • Intel Rocketlake (-march=rocketlake, SGX қолдауынсыз Rocket Lake сияқты).
    • AMD Zen 3 (-mart=znver3).
  • Intel процессорларына негізделген IA-32/x86-64 жүйелері үшін TXLDTRK, SERIALIZE, HRESET, UINTKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI жаңа процессор нұсқауларын қолдау қосылды.
  • x86-64 архитектуралық деңгейлерін таңдау үшін "-march=x234-86-v[64]" жалаушаларына қолдау қосылды (v2 - SSE4.2, SSSE3, POPCNT және CMPXCHG16B кеңейтімдерін қамтиды; v3 - AVX2 және MOVBE; v4 - AVX-512 ).
  • Үлкен эндиан байт реті бар RISC-V жүйелеріне қолдау қосылды. RISC-V нұсқаулар жинағының архитектуралық сипаттамасының нұсқасын таңдау үшін "-misa-spec=*" опциясы қосылды. AddressSanitizer үшін қолдау және канар тегтерін пайдаланып стек қорғанысы қосылды.
  • Бағдарламадағы кодтың орындалу жолдары мен деректер ағынының ресурсты көп қажет ететін процедурааралық талдауын жүзеге асыратын «-фанализатор» статикалық талдау режимін жетілдіруді жалғастыру. Режим компиляция сатысындағы мәселелерді анықтай алады, мысалы, бір жад аймағы үшін free() функциясына қосарланған шақырулар, файл дескрипторының ағып кетуі, сілтемені алып тастау және нөлдік көрсеткіштерді беру, бос жад блоктарына қол жеткізу, инициализацияланбаған мәндерді пайдалану және т.б. Жаңа нұсқада:
    • Бағдарлама күйін бақылау коды толығымен қайта жазылды. Өте үлкен C файлдарын сканерлеуге қатысты мәселелер шешілді.
    • C++ бастапқы қолдауы қосылды.
    • Жадты бөлу және бөлуді талдау арнайы malloc және бос функциялардан алынып тасталды және қазір new/delete және new[]/delete[] функцияларын қолдайды.
    • Жаңа ескертулер қосылды: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Write-to-const және -Wanalyzer-write to-string-string.
    • Жаңа түзету опциялары қосылды -fdump-analyzer-json және -fno-analyzer-feasibility.
    • Анализаторды GCC плагиндері арқылы кеңейту мүмкіндігі іске асырылды (мысалы, CPython жүйесінде жаһандық құлыптауды (GIL) дұрыс пайдаланбағанын тексеру үшін плагин дайындалды).

Ақпарат көзі: opennet.ru

пікір қалдыру