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-ի փորձարարական աջակցություն, ապագա C լեզվի ստանդարտի հետ կապված բարելավումներ (C2x), կատարողականի նոր օպտիմալացումներ:

Խոշոր փոփոխություններ.

  • C++ լեզվի լռելյայն ռեժիմը փոխվել է՝ նախկինում առաջարկված C++17-ի փոխարեն օգտագործելու C++17 ստանդարտը (-std=gnu++14): Հնարավոր է ընտրողաբար անջատել նոր C++17 վարքագիծը կաղապարների մշակման ժամանակ, որոնք օգտագործում են այլ կաղապարներ որպես պարամետր (-fno-new-ttp-matching):
  • Ավելացվել է 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=*» տարբերակների միջոցով:
  • BRIG երկուական ձևաչափի աջակցությունը HSAIL (Հետերոգեն համակարգի ճարտարապետության միջանկյալ լեզու) լեզվով օգտագործելու համար հնացել է և շուտով կհեռացվի:
  • ThreadSanitizer ռեժիմի հնարավորությունները (-fsanitize=thread) ընդլայնվել են, որոնք նախատեսված են մրցավազքի պայմանները հայտնաբերելու համար, երբ կիսվում են նույն տվյալները բազմաշերտ հավելվածի տարբեր թելերից: Նոր թողարկումն ավելացնում է այլընտրանքային գործարկման ժամանակների և միջավայրերի աջակցություն, ինչպես նաև KCSAN (Kernel Concurrency Sanitizer) վրիպազերծման գործիքի աջակցություն, որը նախատեսված է Linux միջուկում մրցավազքի պայմանները դինամիկ կերպով հայտնաբերելու համար: Ավելացվեցին նոր տարբերակներ «-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 (Միջընթացակարգային հաստատուն տարածում) անցումում կանխատեսման էվրիստիկաները բարելավվել են՝ հաշվի առնելով հանգույցների հայտնի սահմաններն ու առանձնահատկությունները:
  • Linking Time Optimizations-ում (LTO) բայթկոդի ձևաչափը օպտիմիզացված է չափը նվազեցնելու և մշակման արագությունը բարելավելու համար: Պարտադիր փուլի ընթացքում հիշողության առավելագույն սպառման նվազեցում:
  • Կոդերի պրոֆիլավորման արդյունքների վրա հիմնված օպտիմալացման մեխանիզմում (PGO - Profile-guided optimization), որը թույլ է տալիս ստեղծել ավելի օպտիմալ կոդ՝ հիմնված կատարման առանձնահատկությունների վերլուծության վրա, GCOV տվյալների հետ ֆայլերի չափը կրճատվում է զրոյական հաշվիչների ավելի կոմպակտ փաթեթավորման պատճառով: . Բարելավված «-fprofile-values» ռեժիմը՝ հետևելով անուղղակի զանգերի ավելի շատ պարամետրերին:
  • OpenMP 5.0 (Open Multi-Processing) ստանդարտի ներդրումը, որը սահմանում է API-ն և զուգահեռ ծրագրավորման մեթոդների կիրառման մեթոդները բազմամիջուկային և հիբրիդային (CPU+GPU/DSP) համակարգերում՝ ընդհանուր հիշողության և վեկտորացման միավորներով (SIMD), ունի շարունակվեց. Ավելացվեց սկզբնական աջակցություն հատկացնել հրահանգին և OpenMP-ի կառուցվածքներում տարասեռ օղակներ օգտագործելու հնարավորությունը: Իրականացված աջակցություն OMP_TARGET_OFFLOAD միջավայրի փոփոխականի համար:
  • Բարելավվել է C, C++ և Fortran լեզուների համար նախատեսված OpenACC 2.6 զուգահեռ ծրագրավորման հստակեցման իրականացումը, որը սահմանում է GPU-ների և մասնագիտացված պրոցեսորների վրա գործառնությունների բեռնաթափման գործիքներ, ինչպիսիք են NVIDIA PTX-ը:
  • C լեզուների համար ներդրվել է «no_stack_protector» նոր հատկանիշ, որը նախատեսված է նշելու գործառույթները, որոնց համար stack-ի պաշտպանությունը չպետք է միացված լինի («-fstack-protector»): «malloc» հատկանիշը ընդլայնվել է՝ աջակցելու հիշողության հատկացման և ազատման համար զանգերի զույգերի նույնականացմանը (բաշխիչ/տեղաբաշխիչ), որն օգտագործվում է ստատիկ անալիզատորում՝ հիշողության հետ աշխատելու բնորոշ սխալները հայտնաբերելու համար (հիշողության արտահոսք, օգտագործում ազատելուց հետո, կրկնակի զանգեր դեպի անվճար ֆունկցիա և այլն) և կոմպիլյատորների նախազգուշացումներում «-Wmismatched-dealloc», «-Wmismatched-new-delete» և «-Wfree-nonheap-object»՝ տեղեկացնելով հիշողության տեղաբաշխման և հիշողության բաշխման գործողությունների անհամապատասխանության մասին:
  • Նոր նախազգուշացումներ են ավելացվել C լեզվի համար.
    • «-Wmismatched-dealloc» (միացված է լռելյայն) - զգուշացնում է հիշողության տեղաբաշխման գործողությունների մասին, որոնք օգտագործում են ցուցիչ, որը համատեղելի չէ հիշողության բաշխման գործառույթների հետ:
    • «-Wsizeof-array-div» (միացված է, երբ «-Wall» նշված է) - Զգուշացնում է երկու չափի օպերատորների բաժանման մասին, եթե բաժանարարը չի համապատասխանում զանգվածի տարրի չափին:
    • «-Wstringop-overread» (միացված է լռելյայն) - զգուշացնում է լարային ֆունկցիան կանչելու մասին, որը կարդում է տվյալներ զանգվածի սահմանից դուրս գտնվող տարածքից:
    • «-Wtsan» (միացված է լռելյայն) - Զգուշացնում է գործառույթների օգտագործման մասին (օրինակ՝ std::atomic_thread_fence), որոնք չեն աջակցվում ThreadSanitizer-ում:
    • «-Warray-parameter» և «-Wvla-parameter» (միացված է «-Wall») - նախազգուշացնում է գերակայող գործառույթների մասին՝ ֆիքսված և փոփոխական երկարության զանգվածների հետ կապված արգումենտների անհամատեղելի հայտարարություններով:
    • «-Wuninitialized» նախազգուշացումն այժմ հայտնաբերում է դինամիկ տեղաբաշխված ոչ սկզբնական հիշողությունից կարդալու փորձեր:
    • «-Wfree-nonheap-object» նախազգուշացումը ընդլայնում է այն դեպքերի սահմանումը, երբ հիշողության տեղաբաշխման գործառույթները կանչվում են ցուցիչով, որը չի ստացվում դինամիկ հիշողության բաշխման գործառույթների միջոցով:
    • «-Wmaybe-unitialized» նախազգուշացումը ընդլայնել է ցուցիչների հայտնաբերումը գործառույթներին, որոնք վերաբերում են չնախաստորագրված հիշողության վայրերին:
  • C լեզվի համար ներդրվել է C2X ստանդարտի շրջանակներում մշակված նոր հնարավորությունների մի մասը (միացված է նշելով -std=c2x և -std=gnu2x). մակրոները BOOL_MAX և BOOL_WIDTH, գործառույթում չօգտագործված պարամետրերի անունների կամընտիր նշում: սահմանումներ (ինչպես C++-ում), հատկանիշ «[[nodiscard]]», նախապրոցեսորային օպերատոր «__has_c_attribute», մակրոներ FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_60559_XNUMXFL, N, NI, FLT, XNUMX, XNUMX, XNUMX, XNUMX, XNUMX, XNUMX, XNUMX, N, XNUMX, XNUMX, N, XNUMX, XNUMX, XNUMX, N. , DBL_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 ++2բ): Օրինակ, այժմ կա աջակցություն «zu» բառացի վերջածանցին` ստորագրված size_t արժեքների համար:
  • 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 (cortex-a78), Arm Cortex-A78AE (cortex-a78ae), Arm Cortex-A78C (cortex-a78c) , Arm Cortex- X1 (cortex-x1), Arm Neoverse V1 (neoverse-v1) և Arm Neoverse N2 (neoverse-n2): Ավելացվել են նաև Fujitsu A64FX (a64fx) և Arm Cortex-R82 (cortex-r82) պրոցեսորները, որոնք աջակցում են միայն AArch64 ճարտարապետությանը:
  • Ավելացվեց Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) և MVE (AArch32 M-պրոֆիլ) SIMD հրահանգներ օգտագործելու համար՝ գումարում, հանում, բազմապատկում և գումարում/հանում կատարող գործողություններ ավտոմատ վեկտորիզացնելու համար: կոմպլեքս թվեր. Ավելացվել է նախնական աջակցություն ARM-ի համար ավտովեկտորացման համար՝ օգտագործելով MVE հրահանգների հավաքածու:
  • ARM պլատֆորմների համար տրամադրվում է կոմպիլյատորի հետ ինտեգրված C ֆունկցիաների ամբողջական փաթեթ (Intrinsics), որը փոխարինվել է ընդլայնված վեկտորային հրահանգներով (SIMD), որը ներառում է ACLE Q3 2020 թ.
  • Gfx908 GPU-ի աջակցությունն ավելացվել է հետին պլանում՝ GCN միկրոճարտարապետության հիման վրա AMD GPU-ների համար կոդ ստեղծելու համար:
  • Ավելացված է աջակցություն նոր պրոցեսորների և դրանցում ներդրված նոր հրահանգների հավաքածուի ընդլայնումների համար.
    • Intel Sapphire Rapids (-march=sapphirerapids, հնարավորություն է տալիս աջակցում MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, 8AMT-XVT, TSXLDTRK, AMT-XVT, TSXLDTRK, AMT-XVT, 16, XNUMX, AMT-XVT, TSXLDTRK, AMT-XVT, և .
    • Intel Alderlake (-march=alderlake, հնարավորություն է տալիս աջակցություն CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI և HRESET հրահանգներին):
    • Intel Rocketlake (-march=rocketlake, նման է Rocket Lake-ին առանց SGX աջակցության):
    • դրամ Զեն 3 (-մարս=znver3).
  • Intel պրոցեսորների վրա հիմնված IA-32/x86-64 համակարգերի համար ավելացվել է նոր պրոցեսորային հրահանգների աջակցություն TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI:
  • Ավելացվել է «-march=x86-64-v[234]» դրոշների աջակցություն՝ x86-64 ճարտարապետության մակարդակները ընտրելու համար (v2 - ընդգրկում է SSE4.2, SSSE3, POPCNT և CMPXCHG16B ընդարձակումները; v3 - AVX2 և MOVBE; v4 - AVX-512 ) .
  • Ավելացվել է աջակցություն RISC-V համակարգերին՝ մեծ-էնդիան բայթերի պատվերով: Ավելացվեց «-misa-spec=*» տարբերակը՝ ընտրելու RISC-V հրահանգների հավաքածուի ճարտարապետության ճշգրտման տարբերակը: Ավելացվեց AddressSanitizer-ի և կույտերի պաշտպանության աջակցություն՝ օգտագործելով դեղձանիկ պիտակներ:
  • «-fanalyzer» ստատիկ վերլուծության ռեժիմի շարունակական բարելավում, որն իրականացնում է ծրագրում կոդի կատարման ուղիների և տվյալների հոսքերի ռեսուրսների ինտենսիվ միջընթացակարգային վերլուծություն: Ռեժիմը կարող է հայտնաբերել խնդիրներ կոմպիլյացիայի փուլում, օրինակ՝ կրկնակի զանգեր free() ֆունկցիայի համար մեկ հիշողության տարածքի համար, ֆայլերի նկարագրիչի արտահոսք, չհղում և փոխանցել զրոյական ցուցիչներ, մուտք գործել ազատված հիշողության բլոկներ, օգտագործել չնախապատրաստված արժեքներ և այլն: Նոր տարբերակում.
    • Ծրագրի վիճակին հետևելու ծածկագիրը ամբողջությամբ վերաշարադրվել է: Շատ մեծ C ֆայլերի սկանավորման հետ կապված խնդիրները լուծվել են:
    • Ավելացվեց նախնական C++ աջակցությունը:
    • Հիշողության տեղաբաշխման և տեղաբաշխման վերլուծությունը վերցված է հատուկ malloc և անվճար գործառույթներից և այժմ աջակցում է նոր/ջնջել և նոր[]/ջնջել[]:
    • Ավելացվել են նոր նախազգուշացումներ՝ -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const and -Wanalyzer-write-to-string-literal:
    • Ավելացվեցին վրիպազերծման նոր տարբերակներ՝ fdump-analyzer-json և -fno-analyzer-feasibility:
    • Գործարկվել է GCC-ի համար պլագինների միջոցով անալիզատորը երկարացնելու հնարավորությունը (օրինակ, պատրաստվել է պլագին CPython-ում գլոբալ կողպման (GIL) սխալ օգտագործումը ստուգելու համար):

Source: opennet.ru

Добавить комментарий