GCC 11 kompilatoru komplekta izlaiŔana

Pēc gada izstrādes ir izlaists bezmaksas GCC 11.1 kompilatoru komplekts, kas ir pirmais nozÄ«mÄ«gais laidiens jaunajā GCC 11.x atzarā. Saskaņā ar jauno laidienu numerācijas shēmu izstrādes laikā tika izmantota versija 11.0, un Ä«si pirms GCC 11.1 izlaiÅ”anas jau tika izveidots GCC 12.0 atzars, no kura tiks veidots nākamais nozÄ«mÄ«gais GCC 12.1 laidiens.

GCC 11.1 ir ievērojams ar pāreju uz DWARF 5 atkļūdoÅ”anas faila formāta izmantoÅ”anu pēc noklusējuma, standarta C++17 iekļauÅ”anu (ā€œ-std=gnu++17ā€), bÅ«tiskiem C++20 atbalsta uzlabojumiem. standarts, eksperimentāls atbalsts C++23, uzlabojumi saistÄ«bā ar topoÅ”o C valodas standartu (C2x), jaunas veiktspējas optimizācijas.

Galvenās izmaiņas:

  • C++ valodas noklusējuma režīms ir pārslēgts, lai izmantotu C++17 standartu (-std=gnu++17), nevis iepriekÅ” piedāvāto C++14. Ir iespējams selektÄ«vi atspējot jauno C++17 uzvedÄ«bu, apstrādājot veidnes, kurās kā parametrs tiek izmantotas citas veidnes (-fno-new-ttp-matching).
  • Pievienots AddressSanitizer rÄ«ka aparatÅ«ras paātrinājuma atbalsts, kas ļauj noteikt faktus par piekļuvi atbrÄ«votajiem atmiņas apgabaliem, pārsniedzot pieŔķirtā bufera robežas, un dažus citus kļūdu veidus, strādājot ar atmiņu. AparatÅ«ras paātrinājums paÅ”laik ir pieejams tikai AArch64 arhitektÅ«rai, un tas ir vērsts uz izmantoÅ”anu, kompilējot Linux kodolu. Lai iespējotu AddressSanitizer aparatÅ«ras paātrinājumu, veidojot lietotāja telpas komponentus, ir pievienots karodziņŔ "-fsanitize=hwaddress" un kodola karodziņŔ "-fsanitize=kernel-hwaddress".
  • Ä¢enerējot atkļūdoÅ”anas informāciju, pēc noklusējuma tiek izmantots DWARF 5 formāts, kas, salÄ«dzinot ar iepriekŔējām versijām, ļauj Ä£enerēt par 25% kompaktākus atkļūdoÅ”anas datus. PilnÄ«gam DWARF 5 atbalstam ir nepiecieÅ”ama vismaz binutils versija 2.35.2. DWARF 5 formāts tiek atbalstÄ«ts atkļūdoÅ”anas rÄ«kos kopÅ” versijas GDB 8.0, valgrind 3.17.0, elfutils 0.172 un dwz 0.14. Lai Ä£enerētu atkļūdoÅ”anas failus, izmantojot citas DWARF versijas, varat izmantot opcijas "-gdwarf-2", "-gdwarf-3" un "-gdwarf-4".
  • Ir paaugstinātas prasÄ«bas kompilatoriem, kurus var izmantot, lai izveidotu GCC. Tagad kompilatoram jāatbalsta C++11 standarts (iepriekÅ” bija nepiecieÅ”ams C++98), t.i. Ja GCC 10 izveidei pietika ar GCC 3.4, tad tagad ir nepiecieÅ”ams vismaz GCC 11, lai izveidotu GCC 4.8.
  • MainÄ«ts izgāztuvju, pagaidu failu un LTO optimizācijai nepiecieÅ”amās papildu informācijas saglabāŔanas failu nosaukums un atraÅ”anās vieta. Šādi faili tagad vienmēr tiek saglabāti paÅ”reizējā direktorijā, ja vien ceļŔ nav skaidri mainÄ«ts, izmantojot opcijas "-dumpbase", "-dumpdir" un "-save-temps=*".
  • Binārā formāta BRIG atbalsts lietoÅ”anai ar HSAIL (neviendabÄ«gās sistēmas arhitektÅ«ras starpvalodas) valodu ir novecojis un drÄ«zumā tiks noņemts.
  • Režīma ThreadSanitizer (-fsanitize=thread) iespējas ir paplaÅ”inātas, lai noteiktu sacensÄ«bu apstākļus, koplietojot tos paÅ”us datus no dažādiem daudzpavedienu lietojumprogrammas pavedieniem. Jaunajā laidienā ir pievienots atbalsts alternatÄ«viem izpildlaikiem un vidēm, kā arÄ« atbalsts KCSAN (Kernel Concurrency Sanitizer) atkļūdoÅ”anas rÄ«kam, kas paredzēts, lai dinamiski noteiktu sacensÄ«bu apstākļus Linux kodolā. Pievienotas jaunas opcijas "-param tsan-distinguish-volatile" un "-param tsan-instrument-func-entry-exit".
  • Kolonnu numuri diagnostikas ziņojumos tagad atspoguļo nevis baitu skaitu no rindas sākuma, bet faktiski kolonnu numurus, kas ņem vērā vairāku baitu rakstzÄ«mes un rakstzÄ«mes, kas ieņem vairākas pozÄ«cijas rindā (piemēram, rakstzÄ«me šŸ™‚ aizņem divas pozÄ«cijas un ir kodēts 4 baitos). Tāpat arÄ« tabulÄ“Å”anas rakstzÄ«mes tagad tiek uzskatÄ«tas par noteiktu atstarpju skaitu (konfigurējama, izmantojot opciju -ftabstop, noklusējuma 8). Lai atjaunotu iepriekŔējo darbÄ«bu, tiek piedāvāta opcija ā€œ-fdiagnostics-column-unit=byteā€ un, lai noteiktu sākotnējo vērtÄ«bu (numurÄ“Å”ana no 0 vai 1), - opcija ā€œ-fdiagnostics-column-origin=ā€.
  • Vektorizators ņem vērā visu funkcijas saturu un pievieno apstrādes iespējas, kas saistÄ«tas ar krustojumiem un atsaucēm uz iepriekŔējiem blokiem vadÄ«bas plÅ«smas grafikā (CFG, kontroles plÅ«smas grafiks).
  • Optimizētājs ievieÅ” iespēju pārvērst virkni nosacÄ«jumu operāciju, kas salÄ«dzina vienu un to paÅ”u mainÄ«go slēdža izteiksmē. Nākotnē slēdža izteiksmi var kodēt, izmantojot bitu testÄ“Å”anas instrukcijas (lai kontrolētu Ŕādu pārveidoÅ”anu, ir pievienota opcija ā€œ-fbit-testsā€).
  • Uzlabota starpprocedÅ«ru optimizācija. Pievienota jauna IPA-modref caurlaide (-fipa-modref), lai izsekotu blakusefektiem, izsaucot funkcijas, un uzlabotu analÄ«zes precizitāti. Uzlabota IPA-ICF caurlaides (-fipa-icf) ievieÅ”ana, kas samazina atmiņas patēriņu kompilācijas laikā un palielina vienoto funkciju skaitu, kurām tiek apvienoti identiski koda bloki. IPA-CP (Interprocedural konstante izplatÄ«Å”anās) pārejā prognozÄ“Å”anas heiristika ir uzlabota, ņemot vērā zināmās cilpu robežas un iezÄ«mes.
  • SaistÄ«Å”anas laika optimizācijā (LTO) baitkoda formāts ir optimizēts, lai samazinātu izmēru un uzlabotu apstrādes ātrumu. Samazināts maksimālās atmiņas patēriņŔ saistÄ«Å”anas fāzē.
  • Optimizācijas mehānismā, kas balstÄ«ts uz koda profilÄ“Å”anas rezultātiem (PGO - Profile-guided optimization), kas ļauj Ä£enerēt optimālāku kodu, pamatojoties uz izpildes pazÄ«mju analÄ«zi, failu izmērs ar GCOV datiem tiek samazināts, pateicoties kompaktākam nulles skaitÄ«tāju iepakojumam. . Uzlabots "-fprofile-values" režīms, sekojot lÄ«dzi vairāk parametru netieÅ”ajiem zvaniem.
  • OpenMP 5.0 (Open Multi-Processing) standarta ievieÅ”ana, kas definē API un metodes paralēlās programmÄ“Å”anas metožu pielietoÅ”anai daudzkodolu un hibrÄ«dās (CPU+GPU/DSP) sistēmās ar koplietojamo atmiņu un vektorizācijas vienÄ«bām (SIMD), ir. turpinājās. Pievienots sākotnējais atbalsts pieŔķirÅ”anas direktÄ«vai un iespēja OpenMP konstrukcijās izmantot neviendabÄ«gas cilpas. Ieviests atbalsts vides mainÄ«gajam OMP_TARGET_OFFLOAD.
  • Ir uzlabota OpenACC 2.6 paralēlās programmÄ“Å”anas specifikācijas ievieÅ”ana, kas paredzēta C, C++ un Fortran valodām, kas definē rÄ«kus GPU un specializēto procesoru, piemēram, NVIDIA PTX, operāciju izkrauÅ”anai.
  • C valodām ir ieviests jauns atribÅ«ts ā€œno_stack_protectorā€, kas paredzēts, lai atzÄ«mētu funkcijas, kurām nevajadzētu iespējot steka aizsardzÄ«bu (ā€œ-fstack-protectorā€). AtribÅ«ts ā€œmallocā€ ir paplaÅ”ināts, lai atbalstÄ«tu atmiņas pieŔķirÅ”anas un atbrÄ«voÅ”anas zvanu pāru identificÄ“Å”anu (alokators/sadalÄ«tājs), ko izmanto statiskajā analizatorā, lai identificētu tipiskas kļūdas darbā ar atmiņu (atmiņas noplÅ«des, izmantoÅ”ana pēc atbrÄ«voÅ”anas, dubultie izsaukumi uz brÄ«vo funkciju utt.) un kompilatoru brÄ«dinājumos ā€œ-Wmismatched-deallocā€, ā€œ-Wmismatched-new-deleteā€ un ā€œ-Wfree-nonheap-objectā€, informējot par neatbilstÄ«bu starp atmiņas atdalÄ«Å”anas un atmiņas pieŔķirÅ”anas darbÄ«bām.
  • C valodai ir pievienoti jauni brÄ«dinājumi:
    • "-Wmismatched-dealloc" (iespējots pēc noklusējuma) ā€” brÄ«dina par atmiņas atdalÄ«Å”anas darbÄ«bām, kurās tiek izmantots rādÄ«tājs, kas nav saderÄ«gs ar atmiņas pieŔķirÅ”anas funkcijām.
    • "-Wsizeof-array-div" (iespējots, ja ir norādÄ«ts "-Wall") ā€” brÄ«dina par divu operatoru izmēru sadalÄ«Å”anu, ja dalÄ«tājs neatbilst masÄ«va elementa izmēram.
    • "-Wstringop-overread" (iespējots pēc noklusējuma) - brÄ«dina par virknes funkcijas izsaukÅ”anu, kas nolasa datus no apgabala ārpus masÄ«va robežas.
    • "-Wtsan" (iespējots pēc noklusējuma) ā€” brÄ«dina par tādu lÄ«dzekļu (piemēram, std::atomic_thread_fence) izmantoÅ”anu, kas netiek atbalstÄ«ti programmā ThreadSanitizer.
    • ā€œ-Warray-parameterā€ un ā€œ-Wvla-parameterā€ (iespējots, norādot ā€œ-Wallā€) ā€“ brÄ«dina par funkciju ignorÄ“Å”anu ar nesaderÄ«gām argumentu deklarācijām, kas saistÄ«tas ar fiksēta un mainÄ«ga garuma masÄ«viem.
    • BrÄ«dinājums "-Wuninitialized" tagad nosaka mēģinājumus lasÄ«t no neinicializētas dinamiski pieŔķirtās atmiņas.
    • BrÄ«dinājums "-Wfree-nonheap-object" paplaÅ”ina to gadÄ«jumu definÄ«ciju, kad atmiņas atdalÄ«Å”anas funkcijas tiek izsauktas ar rādÄ«tāju, kas nav iegÅ«ts, izmantojot dinamiskās atmiņas pieŔķirÅ”anas funkcijas.
    • BrÄ«dinājums "-Wmaybe-unitialized" ir paplaÅ”inājis norādes noteikÅ”anu funkcijām, kas attiecas uz neinicializētām atmiņas vietām.
  • C valodai ir ieviesta daļa no jaunām funkcijām, kas izstrādātas C2X standarta ietvaros (iespējota, norādot -std=c2x un -std=gnu2x): makro BOOL_MAX un BOOL_WIDTH, neizmantoto parametru nosaukumu izvēles norāde funkcijā. definÄ«cijas (kā C++), atribÅ«ts "[ [nodiscard]]", priekÅ”apstrādātāja operators "__has_c_attribute", makro FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_BBL_60559AN_, IN, XNUMX LDBL_SNAN, DEC_INFINITY un DEC _NAN, NaN = makro FloatN, _FloatNx un _DecimalN, iespēja norādÄ«t lēciena atzÄ«mes pirms deklarācijām un salikto priekÅ”rakstu beigās.
  • AttiecÄ«bā uz C++ ir ieviesta daļa no C++20 standartā piedāvātajām izmaiņām un jauninājumiem, tostarp virtuālās funkcijas ā€œconsteval virtualā€, pseidodestruktorus objektu dzÄ«ves cikla beigām, enum klases izmantoÅ”anu un masÄ«va lieluma aprēķināŔana ā€œjaunajāā€ izteiksmē.
  • Programmai C++ ir pievienots eksperimentāls atbalsts dažiem uzlabojumiem, kas tiek izstrādāti nākotnes standartam C++23 (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Piemēram, tagad tiek atbalstÄ«ts burtiskais sufikss ā€œzuā€ vērtÄ«bām ar zÄ«mi size_t.
  • libstdc++ ir uzlabojis atbalstu C++17 standartam, tostarp ievieÅ”ot std::from_chars un std::to_chars implementācijas peldoŔā komata tipiem. Ieviesti jauni C++20 standarta elementi, tostarp std::bit_cast, std::source_location, atomu darbÄ«bas gaidÄ«Å”ana un paziņoÅ”ana, , , , , kā arÄ« elementi nākotnes C++ standarts 23 (std::to_underlying, std::is_scoped_enum). Pievienots eksperimentāls atbalsts tipiem paralēlai datu apstrādei (SIMD, Data-Parallel Types). Ir paātrināta std::uniform_int_distribution ievieÅ”ana.
  • Noņemts alfa kvalitātes karodziņŔ no libgccjit, koplietojamas bibliotēkas koda Ä£eneratora iegulÅ”anai citos procesos un izmantoÅ”anai, lai organizētu baitkoda JIT kompilāciju maŔīnas kodā. Pievienota iespēja MinGW izveidot libgccjit.
  • Pievienots atbalsts AArch64 Armv8-R arhitektÅ«rai (-march=armv8-r). AArch64 un ARM arhitektÅ«rām ir pievienots atbalsts procesoriem (parametri -mcpu un -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) un Arm Neoverse N2 (neoverse-n2). Ir pievienoti arÄ« Fujitsu A64FX (a64fx) un Arm Cortex-R82 (cortex-r82) CPU, kas atbalsta tikai AArch64 arhitektÅ«ru.
  • Pievienots atbalsts Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) un MVE (AArch32 M-profils) SIMD instrukciju izmantoÅ”anai, lai automātiski vektorizētu darbÄ«bas, kas veic saskaitÄ«Å”anu, atņemÅ”anu, reizināŔanu un saskaitÄ«Å”anas/atņemÅ”anas variantus. kompleksie skaitļi. Pievienots sākotnējais atbalsts autovektorizācijai ARM, izmantojot MVE instrukciju kopu.
  • ARM platformām tiek nodroÅ”ināts pilns kompilatorā integrētu C funkciju komplekts (Intrinsics), kas aizstāts ar paplaÅ”inātām vektoru instrukcijām (SIMD), kas aptver visas NEON instrukcijas, kas dokumentētas ACLE Q3 2020 specifikācijā.
  • Aizmugursistēmai ir pievienots atbalsts gfx908 GPU, lai Ä£enerētu kodu AMD GPU, pamatojoties uz GCN mikroarhitektÅ«ru.
  • Pievienots atbalsts jauniem procesoriem un tajos ieviesti jauni instrukciju kopas paplaÅ”inājumi:
    • Intel Sapphire Rapids (-march=sapphirerapids, nodroÅ”ina atbalstu instrukcijām MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-AVX8, 16NIMX-BFXXNUMX.
    • Intel Alderlake (-march=alderlake, nodroÅ”ina atbalstu CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI un HRESET instrukcijām).
    • Intel Rocketlake (-march=rocketlake, lÄ«dzÄ«gi kā Rocket Lake bez SGX atbalsta).
    • AMD Zen 3 (-march=znver3).
  • Sistēmām IA-32/x86-64, kuru pamatā ir Intel procesori, ir pievienots atbalsts jaunām procesora instrukcijām TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
  • Pievienots atbalsts karodziņiem "-march=x86-64-v[234]", lai atlasÄ«tu x86-64 arhitektÅ«ras lÄ«meņus (v2 ā€” aptver SSE4.2, SSSE3, POPCNT un CMPXCHG16B paplaÅ”inājumus; v3 ā€” AVX2 un MOVBE; v4 ā€” AVX-512 ) .
  • Pievienots atbalsts RISC-V sistēmām ar lielo baitu secÄ«bu. Pievienota opcija "-misa-spec=*", lai atlasÄ«tu RISC-V instrukciju kopas arhitektÅ«ras specifikācijas versiju. Pievienots atbalsts AddressSanitizer un kaudzes aizsardzÄ«bai, izmantojot kanāriju tagus.
  • Turpinās pilnveidot statiskās analÄ«zes režīmu ā€œ-fanalyzerā€, kas programmā veic resursietilpÄ«gu koda izpildes ceļu un datu plÅ«smu starpprocedÅ«ru analÄ«zi. Režīms spēj atklāt problēmas kompilācijas stadijā, piemēram, dubultus izsaukumus uz free() funkciju vienam atmiņas apgabalam, faila deskriptora noplÅ«des, atsauces atcelÅ”anu un nulles rādÄ«tāju nodoÅ”anu, piekļuvi atbrÄ«votajiem atmiņas blokiem, neinicializētu vērtÄ«bu izmantoÅ”anu utt. Jaunajā versijā:
    • Programmas stāvokļa izsekoÅ”anas kods ir pilnÄ«bā pārrakstÄ«ts. Problēmas ar ļoti lielu C failu skenÄ“Å”anu ir atrisinātas.
    • Pievienots sākotnējais C++ atbalsts.
    • Atmiņas pieŔķirÅ”anas un atdalÄ«Å”anas analÄ«ze ir abstrahēta no specifiskajām malloc un bezmaksas funkcijām, un tagad tā atbalsta jaunu/dzēst un jaunu[]/dzēst[].
    • Pievienoti jauni brÄ«dinājumi: -Wanalyzer-shift-count-negatÄ«vs, -Wanalyzer-shift-count-overflow, -Wanalyzer-Write-to-const un -Wanalyzer-Write-to-string-literal.
    • Pievienotas jaunas atkļūdoÅ”anas opcijas -fdump-analyzer-json un -fno-analyzer-iespējams.
    • Ir ieviesta iespēja paplaÅ”ināt analizatoru, izmantojot GCC spraudņus (piemēram, ir sagatavots spraudnis, lai pārbaudÄ«tu globālās bloÄ·Ä“Å”anas (GIL) nepareizu izmantoÅ”anu CPython).

Avots: opennet.ru

Pievieno komentāru