Kutolewa kwa kikundi cha mkusanyaji wa GCC 11

Baada ya mwaka wa maendeleo, kutolewa kwa safu ya mkusanyaji ya GCC 11.1 bila malipo imetolewa, toleo la kwanza muhimu katika tawi jipya la GCC 11.x. Chini ya mpango mpya wa kuorodhesha toleo, toleo la 11.0 lilitumika wakati wa utayarishaji, na muda mfupi kabla ya kutolewa kwa GCC 11.1, tawi la GCC 12.0 lilikuwa tayari limegawanyika, ambapo toleo la pili muhimu la GCC 12.1 litaundwa.

GCC 11.1 inajulikana kwa mpito wake wa kutumia umbizo la faili la utatuzi la DWARF 5 kwa chaguomsingi, ujumuishaji chaguomsingi wa kiwango cha C++17 (β€œ-std=gnu+++17”), maboresho makubwa katika usaidizi wa C++20. usaidizi wa kawaida, wa majaribio wa C++23, maboresho yanayohusiana na kiwango cha lugha cha C cha siku zijazo (C2x), uboreshaji mpya wa utendakazi.

Mabadiliko kuu:

  • Hali chaguo-msingi ya lugha ya C++ imebadilishwa ili kutumia kiwango cha C++17 (-std=gnu+++17) badala ya C++14 iliyotolewa hapo awali. Inawezekana kuzima kwa kuchagua tabia mpya ya C++17 wakati wa kuchakata violezo vinavyotumia violezo vingine kama kigezo (-fno-new-ttp-matching).
  • Usaidizi ulioongezwa wa kuongeza kasi ya vifaa vya zana ya AddressSanitizer, ambayo inakuwezesha kuamua ukweli wa kupata maeneo ya kumbukumbu ya bure, kwenda zaidi ya mipaka ya bafa iliyotengwa, na aina nyingine za makosa wakati wa kufanya kazi na kumbukumbu. Uongezaji kasi wa maunzi kwa sasa unapatikana tu kwa usanifu wa AArch64 na unalenga matumizi wakati wa kuunda kinu cha Linux. Ili kuwezesha kuongeza kasi ya maunzi ya AddressSanitizer wakati wa kuunda vipengee vya nafasi ya mtumiaji, bendera "-fsanitize=hwaddress" imeongezwa, na alama ya kernel "-fsanitize=kernel-hwaddress".
  • Wakati wa kutoa maelezo ya utatuzi, umbizo la DWARF 5 hutumiwa kwa chaguo-msingi, ambayo, ikilinganishwa na matoleo ya awali, inaruhusu kuzalisha 25% zaidi ya data ya utatuzi wa kompakt. Usaidizi kamili wa DWARF 5 unahitaji angalau toleo la 2.35.2 la binutils. Umbizo la DWARF 5 linaauniwa katika zana za utatuzi tangu GDB 8.0, valgrind 3.17.0, elfutils 0.172 na dwz 0.14. Ili kuzalisha faili za utatuzi kwa kutumia matoleo mengine ya DWARF, unaweza kutumia chaguo "-gdwarf-2", "-gdwarf-3" na "-gdwarf-4".
  • Mahitaji ya wakusanyaji ambayo yanaweza kutumika kujenga GCC yameongezwa. Mkusanyaji lazima sasa aunga mkono kiwango cha C ++11 (hapo awali C ++98 ilihitajika), i.e. Ikiwa GCC 10 ilitosha kujenga GCC 3.4, basi angalau GCC 11 inahitajika kujenga GCC 4.8.
  • Jina na eneo la faili za kuhifadhi taka, faili za muda na maelezo ya ziada muhimu kwa uboreshaji wa LTO yamebadilishwa. Faili kama hizo sasa huhifadhiwa kila wakati kwenye saraka ya sasa isipokuwa njia inabadilishwa wazi kupitia chaguzi za "-dumpbase", "-dumpdir" na "-save-temps=*".
  • Uwezo wa kutumia umbizo la mfumo jozi BRIG kwa ajili ya matumizi ya lugha ya HSAIL (Lugha ya Usanifu wa Mfumo wa Kati wa Lugha ya Kati) umeacha kutumika na utaondolewa hivi karibuni.
  • Uwezo wa modi ya ThreadSanitizer (-fsanitize=thread) umepanuliwa, iliyoundwa ili kutambua hali ya mbio wakati wa kushiriki data sawa kutoka kwa nyuzi tofauti za programu ya nyuzi nyingi. Toleo jipya linaongeza usaidizi kwa nyakati na mazingira mbadala ya kukimbia, pamoja na usaidizi wa zana ya utatuzi ya KCSAN (Kernel Concurrency Sanitizer), iliyoundwa ili kutambua kwa nguvu hali ya mbio ndani ya kerneli ya Linux. Imeongeza chaguo mpya "-param tsan-distinguish-volatile" na "-param tsan-chombo-func-entry-exit".
  • Nambari za safu wima katika ujumbe wa uchunguzi sasa hazionyeshi hesabu ya baiti tangu mwanzo wa mstari, lakini kwa kweli nambari za safu ambazo huzingatia herufi nyingi na wahusika wanaochukua nafasi kadhaa kwenye mstari (kwa mfano, mhusika πŸ™‚ anachukua nafasi mbili na imesimbwa kwa baiti 4). Vivyo hivyo, herufi za kichupo sasa zinachukuliwa kama idadi fulani ya nafasi (zinazoweza kusanidiwa kupitia -ftabstop chaguo, chaguo-msingi 8). Ili kurejesha tabia ya zamani, chaguo la "-fdiagnostics-column-unit=byte" linapendekezwa, na kuamua thamani ya awali (idadi kutoka 0 au 1) - chaguo "-fdiagnostics-column-origin=".
  • Vectorizer inazingatia yaliyomo yote ya kazi na inaongeza uwezo wa usindikaji unaohusishwa na makutano na marejeleo ya vizuizi vilivyotangulia kwenye grafu ya mtiririko wa kudhibiti (CFG, grafu ya mtiririko wa kudhibiti).
  • Kiboreshaji hutekeleza uwezo wa kubadilisha mfululizo wa utendakazi wa masharti ambao unalinganisha kigezo sawa hadi usemi wa swichi. Usemi wa swichi unaweza kusimba baadaye kwa kutumia maagizo ya majaribio kidogo (chaguo la "-fbit-majaribio" limeongezwa ili kudhibiti ugeuzaji kama huo).
  • Uboreshaji wa kiutaratibu ulioboreshwa. Imeongeza pasi mpya ya IPA-modref (-fipa-modref) ili kufuatilia madoido wakati wa kupiga simu vitendaji na kuboresha usahihi wa uchanganuzi. Utekelezaji ulioboreshwa wa pasi ya IPA-ICF (-fipa-icf), ambayo hupunguza utumiaji wa kumbukumbu wakati wa ujumuishaji na huongeza idadi ya kazi zilizounganishwa ambazo vizuizi sawa vya nambari vinajumuishwa. Katika kupita kwa IPA-CP (Interprocedural constant propagation), heuristics ya utabiri imeboreshwa, kwa kuzingatia mipaka inayojulikana na vipengele vya vitanzi.
  • Katika Uboreshaji wa Wakati wa Kuunganisha (LTO), umbizo la bytecode limeboreshwa ili kupunguza ukubwa na kuboresha kasi ya uchakataji. Kupunguza matumizi ya kumbukumbu ya kilele wakati wa awamu ya kufunga.
  • Katika utaratibu wa uboreshaji kulingana na matokeo ya uwekaji wasifu wa msimbo (PGO - Uboreshaji unaoongozwa na Wasifu), ambayo inaruhusu kutoa nambari bora zaidi kulingana na uchanganuzi wa vipengee vya utekelezaji, saizi ya faili zilizo na data ya GCOV hupunguzwa kwa sababu ya ufungashaji thabiti zaidi wa kaunta sifuri. . Hali ya "-fprofile-values" iliyoboreshwa kwa kufuatilia vigezo zaidi kwenye simu zisizo za moja kwa moja.
  • Utekelezaji wa kiwango cha OpenMP 5.0 (Open Multi-Processing), ambacho hufafanua API na mbinu za kutumia mbinu za upangaji sambamba kwenye mifumo ya msingi na mseto (CPU+GPU/DSP) yenye vitengo vya kumbukumbu na vekta (SIMD) vilivyoshirikiwa. iliendelea. Imeongeza usaidizi wa awali kwa maagizo ya kutenga na uwezo wa kutumia vitanzi tofauti katika miundo ya OpenMP. Usaidizi uliotekelezwa kwa tofauti ya mazingira ya OMP_TARGET_OFFLOAD.
  • Utekelezaji wa vipimo vya programu sambamba vya OpenACC 2.6 vilivyotolewa kwa lugha za C, C++ na Fortran umeboreshwa, ambayo inafafanua zana za upakiaji wa shughuli kwenye GPU na vichakataji maalumu, kama vile NVIDIA PTX.
  • Kwa lugha za C, sifa mpya ya "no_stack_protector" imetekelezwa, iliyoundwa ili kuashiria vipengele ambavyo ulinzi wa rafu haupaswi kuwashwa ("-fstack-protector"). Sifa ya "malloc" imepanuliwa ili kusaidia utambuzi wa jozi za simu za kugawa na kuachilia kumbukumbu (allocator/deallocator), ambayo hutumiwa katika kichanganuzi tuli ili kubaini makosa ya kawaida katika kufanya kazi na kumbukumbu (uvujaji wa kumbukumbu, tumia baada ya kuachilia, wito mara mbili kwa kazi ya bure, nk) na katika maonyo ya mkusanyaji "-Wmismatched-dealloc", "-Wmismatched-new-delete" na "-Wfree-nonheap-object", taarifa kuhusu kutofautiana kati ya ugawaji wa kumbukumbu na shughuli za ugawaji kumbukumbu.
  • Maonyo mapya yameongezwa kwa lugha ya C:
    • "-Wmismatched-dealloc" (imewezeshwa na chaguo-msingi) - inaonya kuhusu shughuli za uwekaji kumbukumbu zinazotumia pointer ambayo haiendani na kazi za ugawaji kumbukumbu.
    • "-Wsizeof-array-div" (imewashwa wakati "-Wall" imebainishwa) - Inaonya kuhusu kugawanya saizi mbili za waendeshaji ikiwa kigawanyo hakilingani na ukubwa wa kipengele cha mkusanyiko.
    • "-Wstringop-overread" (imewezeshwa kwa chaguo-msingi) - inaonya juu ya kupiga kazi ya kamba ambayo inasoma data kutoka eneo nje ya mpaka wa safu.
    • "-Wtsan" (imewezeshwa kwa chaguomsingi) - Inaonya kuhusu kutumia vipengele (kama vile std::atomic_thread_fence) ambavyo havitumiki katika ThreadSanitizer.
    • β€œ-Warray-parameta” na β€œ-Wvla-parameta” (imewashwa wakati wa kubainisha β€œ-Wall”) - inaonya kuhusu kubatilisha chaguo za kukokotoa zenye matamko yasiooani ya hoja zinazohusiana na safu za urefu zisizobadilika na zisizobadilika.
    • Onyo la "-Wunitialized" sasa hutambua majaribio ya kusoma kutoka kwa kumbukumbu iliyogawiwa kwa nguvu isiyokuwa ya kawaida.
    • Onyo la "-Wfree-nonheap-object" hupanua ufafanuzi wa hali ambapo vitendaji vya uwekaji kumbukumbu huitwa kwa kiashiria ambacho hakijapatikana kupitia vitendakazi vya ugavi wa kumbukumbu vinavyobadilika.
    • Onyo la "-Wmaybe-uninitialized" limepanua ugunduzi wa viashiria vya kukokotoa vinavyorejelea maeneo ya kumbukumbu ambayo hayajaanzishwa.
  • Kwa lugha ya C, sehemu ya vipengele vipya vilivyoundwa ndani ya mfumo wa kiwango cha C2X imetekelezwa (imewezeshwa kwa kubainisha -std=c2x na -std=gnu2x): macros BOOL_MAX na BOOL_WIDTH, onyesho la hiari la majina ya vigezo ambavyo havijatumika katika utendakazi. ufafanuzi (kama ilivyo katika C++), sifa β€œ[[nodiscard]]", opereta wa kichakataji awali "__has_c_attribute", macros FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_NFANN60559_DSN_XNUMX IEC_SNANT_XNUMX, __STDC_WANT_IEC_NFANNXNUMX_XNUMX_NLT_XNUMX, DBL_IS_IEC_XNUMX , LDBL_SNAN, DEC_INFINITY na DEC _NAN, NaN=makros kwa FloatN, _FloatNx na _DecimalN, uwezo wa kubainisha alama za kuruka kabla ya matamko na mwisho wa taarifa shirikishi.
  • Kwa C++, sehemu ya mabadiliko na ubunifu uliopendekezwa katika kiwango cha C++20 umetekelezwa, ikiwa ni pamoja na kazi za kawaida "consteval virtual", waharibifu wa pseudo kwa mwisho wa mzunguko wa maisha ya vitu, matumizi ya darasa la enum na kuhesabu ukubwa wa safu katika usemi "mpya".
  • Kwa C++, usaidizi wa majaribio umeongezwa kwa baadhi ya maboresho yanayotengenezwa kwa kiwango cha C++23 cha siku zijazo (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Kwa mfano, sasa kuna uwezo wa kiambishi tamati "zu" kwa thamani zilizotiwa saini size_t.
  • libstdc++ imeboresha usaidizi wa kiwango cha C++17, ikiwa ni pamoja na kuanzishwa kwa std::from_chars na std::to_chars utekelezaji kwa aina za pointi zinazoelea. Vipengele vipya vilivyotekelezwa vya kiwango cha C++20, ikiwa ni pamoja na std::bit_cast, std::source_location, shughuli za atomiki kusubiri na kuarifu, , , , , pamoja na vipengele vya siku zijazo C++ kiwango cha 23 (std::to_underlying, std::is_scoped_enum). Umeongeza usaidizi wa majaribio kwa aina za usindikaji wa data sambamba (SIMD, Aina za Data-Sambamba). Utekelezaji wa std::uniform_int_distribution umeharakishwa.
  • Imeondoa bendera ya ubora wa alfa kutoka kwa libgccjit, maktaba iliyoshirikiwa ya kupachika jenereta ya msimbo katika michakato mingine na kuitumia kupanga mkusanyiko wa JIT wa bytecode kwenye msimbo wa mashine. Imeongeza uwezo wa kujenga libgccjit kwa MinGW.
  • Usaidizi ulioongezwa kwa usanifu wa AArch64 Armv8-R (-march=armv8-r). Kwa usanifu wa AArch64 na ARM, usaidizi wa vichakataji umeongezwa (vigezo -mcpu na -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) na Arm Neoverse N2 (neoverse-n2). CPU za Fujitsu A64FX (a64fx) na Arm Cortex-R82 (cortex-r82) pia zimeongezwa, zikisaidia tu usanifu wa AArch64.
  • Usaidizi ulioongezwa wa kutumia Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) na MVE (AArch32 M-profile) maagizo ya SIMD ili kugeuza shughuli zinazotekeleza kujumlisha, kutoa, kuzidisha, kuzidisha na lahaja za kuongeza/kutoa zaidi kiotomatiki. nambari ngumu. Imeongeza usaidizi wa awali wa uwekaji kiotomatiki kwa ARM kwa kutumia seti ya maagizo ya MVE.
  • Kwa majukwaa ya ARM, seti kamili ya vitendakazi vya C (Intrinsics) vilivyounganishwa na mkusanyaji hutolewa, nafasi yake kuchukuliwa na maagizo ya vekta iliyopanuliwa (SIMD), inayojumuisha maagizo yote ya NEON yaliyoandikwa katika vipimo vya ACLE Q3 2020.
  • Usaidizi wa gfx908 GPU umeongezwa kwa upande wa nyuma kwa ajili ya kuzalisha msimbo wa AMD GPU kulingana na usanifu mdogo wa GCN.
  • Usaidizi ulioongezwa kwa vichakataji vipya na viendelezi vipya vya seti ya maagizo vilivyotekelezwa ndani yao:
    • Intel Sapphire Rapids (-march=sapphirerapids, huwezesha usaidizi kwa MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMV-INT-INT-8 na AMX-INT16.
    • Intel Alderlake (-march=alderlake, huwezesha usaidizi kwa CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI na maagizo ya HRESET).
    • Intel Rocketlake (-march=rocketlake, sawa na Rocket Lake bila usaidizi wa SGX).
    • AMD Zen 3 (-march=znver3).
  • Kwa mifumo ya IA-32/x86-64 kulingana na wasindikaji wa Intel, msaada wa maagizo mapya ya kichakataji TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI imeongezwa.
  • Umeongeza uwezo wa kutumia bendera za "-march=x86-64-v[234]" ili kuchagua viwango vya usanifu vya x86-64 (v2 - inashughulikia viendelezi vya SSE4.2, SSSE3, POPCNT na CMPXCHG16B; v3 - AVX2 na MOVBE; v4 - AVX-512 ).
  • Usaidizi ulioongezwa kwa mifumo ya RISC-V yenye mpangilio wa baiti kubwa. Imeongezwa chaguo la "-misa-spec=*" ili kuchagua toleo la seti ya usanifu wa maagizo ya RISC-V. Umeongeza usaidizi kwa AnwaniSanitizer na ulinzi wa rafu kwa kutumia vitambulisho vya canary.
  • Uboreshaji unaoendelea wa hali ya uchanganuzi tuli ya "-fanalyzer", ambayo hufanya uchanganuzi wa kiutaratibu wa rasilimali nyingi wa njia za utekelezaji wa nambari na mtiririko wa data katika programu. Hali hiyo ina uwezo wa kugundua matatizo katika hatua ya ujumuishaji, kama vile kupiga simu mara mbili kwa kitendakazi cha free() kwa eneo moja la kumbukumbu, uvujaji wa maelezo ya faili, kuondoa rejeleo na kupitisha viashiria visivyofaa, kufikia vizuizi vya kumbukumbu vilivyoachiliwa, kwa kutumia maadili ambayo hayajaanzishwa, n.k. Katika toleo jipya:
    • Msimbo wa kufuatilia hali ya programu umeandikwa upya kabisa. Matatizo ya kuchanganua faili kubwa sana za C yametatuliwa.
    • Imeongeza usaidizi wa awali wa C++.
    • Ugawaji wa kumbukumbu na uchanganuzi wa uwekaji umetolewa kutoka kwa malloc mahususi na vitendaji visivyolipishwa, na sasa unaweza kutumia mpya/kufuta na mpya[]/delete[].
    • Maonyo mapya yameongezwa: -Hesabu-hasi ya Wanalyzer-shift-hasi, -Utiririko wa hesabu ya Wanalyzer-shift, -Wanalyzer-andika-to-const na -Wanalyzer-andika-to-string-halisi.
    • Imeongeza chaguo mpya za utatuzi -fdump-analyzer-json na -fno-analyzer-uwezekano.
    • Uwezo wa kupanua kichanganuzi kupitia programu-jalizi za GCC umetekelezwa (kwa mfano, programu-jalizi imetayarishwa ili kuangalia matumizi yasiyo sahihi ya kufuli kwa kimataifa (GIL) katika CPython).

Chanzo: opennet.ru

Kuongeza maoni