GCC 11 konpiladore-multzoaren kaleratzea

Urtebeteko garapenaren ondoren, doako GCC 11.1 konpiladore-multzoa kaleratu da, GCC 11.x adar berriko lehen bertsio esanguratsua. Argitalpenaren zenbakitze-eskemaren arabera, 11.0 bertsioa erabili zen garapen-prozesuan, eta GCC 11.1 kaleratu baino pixka bat lehenago, GCC 12.0 adarra jada adarkatu egin zen, eta horren arabera hurrengo bertsio nagusia, GCC 12.1, izango zen. eratu.

GCC 11.1 nabarmentzen da DWARF 5 arazketa-fitxategi formatua lehenespenez erabiltzeko trantsizioagatik, C++17 estandarraren lehenetsitako sartzea ("-std=gnu++17"), C++20rako euskarriaren hobekuntza nabarmenak. estandarra, C++23rako euskarri esperimentala, etorkizuneko C hizkuntza estandarrari lotutako hobekuntzak (C2x), errendimenduaren optimizazio berriak.

Aldaketa nagusiak:

  • C++ hizkuntzaren modu lehenetsia aldatu da C++17 estandarra erabiltzeko (-std=gnu++17) aurretik eskainitako C++14aren ordez. Posible da C++17 portaera berria selektiboki desgaitzea parametro gisa beste txantiloiak erabiltzen dituzten txantiloiak prozesatzen direnean (-fno-new-ttp-matching).
  • AddressSanitizer tresnaren hardware-azeleraziorako euskarria gehitu da, askatutako memoria-eremuetan sartzeko, esleitutako buffer-aren mugetatik haratago eta memoriarekin lan egitean beste akats mota batzuk zehazteko aukera ematen duena. Hardware azelerazioa AArch64 arkitekturarako soilik dago erabilgarri eta Linux nukleoa konpilatzean erabilerara bideratzen da. Erabiltzailearen espazioaren osagaiak eraikitzean AddressSanitizer hardware azelerazioa gaitzeko, "-fsanitize=hwaddress" marka gehitu da, eta "-fsanitize=kernel-hwaddress" kernel-marka.
  • Arazketa-informazioa sortzerakoan, DWARF 5 formatua erabiltzen da lehenespenez, aurreko bertsioekin alderatuta, %25eko arazketa datu trinkoagoak sortzea ahalbidetzen duena. DWARF 5-ren laguntza osoa gutxienez binutils 2.35.2 bertsioa behar du. DWARF 5 formatua arazketa tresnetan onartzen da GDB 8.0, valgrind 3.17.0, elfutils 0.172 eta dwz 0.14. DWARF-en beste bertsio batzuk erabiliz arazketa-fitxategiak sortzeko, "-gdwarf-2", "-gdwarf-3" eta "-gdwarf-4" aukerak erabil ditzakezu.
  • GCC eraikitzeko erabil daitezkeen konpiladoreen baldintzak areagotu egin dira. Konpilatzaileak orain C++11 estandarra onartu behar du (lehen C++98 behar zen), hau da. GCC 10 GCC 3.4 eraikitzeko nahikoa bazen, orduan gutxienez GCC 11 behar da orain GCC 4.8 eraikitzeko.
  • Zabortegiak, aldi baterako fitxategiak eta LTO optimizatzeko beharrezkoa den informazio osagarria gordetzeko fitxategien izena eta kokapena aldatu dira. Horrelako fitxategiak orain uneko direktorioan gordetzen dira beti "-dumpbase", "-dumpdir" eta "-save-temps="*" aukeren bidez bidea esplizituki aldatzen ez bada.
  • HSAIL (Heterogeneous System Architecture Intermediate Language) hizkuntzarekin erabiltzeko BRIG formatu bitarrako euskarria zaharkituta geratu da eta laster kenduko da.
  • ThreadSanitizer moduaren (-fsanitize=thread) gaitasunak zabaldu dira, hari anitzeko aplikazio baten hari ezberdinetako datu berdinak partekatzen direnean lasterketa-baldintzak detektatzeko diseinatuta. Bertsio berriak exekuzio-denbora eta ingurune alternatiboetarako laguntza gehitzen du, baita KCSAN (Kernel Concurrency Sanitizer) arazketa tresnarako laguntza ere, Linux nukleoaren barruan lasterketa-baldintzak dinamikoki detektatzeko diseinatua. "-param tsan-distinguish-volatile" eta "-param tsan-instrument-func-entry-exit" aukera berriak gehitu dira.
  • Diagnostiko mezuetako zutabe-zenbakiek ez dute lerroaren hasierako byte-zenbaketa islatzen, baizik eta, benetan, byte anitzeko karaktereak eta lerroan hainbat posizio hartzen dituzten karaktereak kontuan hartzen dituzten zutabe-zenbakiak (adibidez, πŸ™‚ karaktereak bi posizio hartzen ditu eta 4 bytetan kodetuta dago). Era berean, tabulazio-karaktereak zuriune kopuru jakin gisa tratatzen dira (-ftabstop aukeraren bidez konfigura daiteke, lehenetsia 8). Portaera zaharra leheneratzeko, β€œ-fdiagnostics-column-unit=byte” aukera proposatzen da, eta hasierako balioa (0 edo 1etik zenbakitzea) zehazteko – β€œ-fdiagnostics-column-origin=” aukera.
  • Bektoreak funtzioaren eduki osoa hartzen du kontuan eta kontrol-fluxuaren grafikoan (CFG, kontrol-fluxuaren grafikoa) aurreko blokeei lotutako ebakidurak eta erreferentziak prozesatzeko gaitasunak gehitzen ditu.
  • Optimizatzaileak aldagai bera konparatzen duten baldintzazko eragiketa sorta bat aldagai-espresio batean bihurtzeko gaitasuna ezartzen du. Etengailuaren adierazpena gero kodetu daiteke bit probaren jarraibideen bidez ("-fbit-tests" aukera gehitu da bihurketa hori kontrolatzeko).
  • Prozedura arteko optimizazio hobetuak. IPA-modref pass berri bat gehitu da (-fipa-modref) funtzioak deitzean bigarren mailako efektuak jarraitzeko eta analisiaren zehaztasuna hobetzeko. IPA-ICF pass (-fipa-icf) inplementazioa hobetu da, konpilazioan memoria-kontsumoa murrizten duena eta kode-bloke berdinak konbinatzen dituzten funtzio bateratuen kopurua handitzen duena. IPA-CP (Procedural constant propagation) pasean, iragarpen heuristikoak hobetu dira, begizten muga eta ezaugarri ezagunak kontuan hartuta.
  • Linking Time Optimizations-en (LTO), bytecode formatua optimizatuta dago tamaina murrizteko eta prozesatzeko abiadura hobetzeko. Lotura-fasean memoria-kontsumo gailurra murriztu da.
  • Kode-profilaren emaitzetan oinarritutako optimizazio-mekanismoan (PGO - Profile-guided optimization), exekuzio-ezaugarrien azterketan oinarritutako kode optimoagoa sortzea ahalbidetzen duena, GCOV datuak dituzten fitxategien tamaina murrizten da zero kontagailuen pakete trinkoagoa delako. . "-fprofile-values" modua hobetu da zeharkako deietan parametro gehiagoren jarraipena eginez.
  • OpenMP 5.0 (Open Multi-Processing) estandarraren ezarpenak, memoria partekatua eta bektorializazio unitateak (SIMD) dituzten nukleo anitzeko eta hibridoen (CPU+GPU/DSP) sistemetan programazio paralelo-metodoak aplikatzeko APIa eta metodoak definitzen dituena. jarraitu zuen. Esleitu zuzentaraurako hasierako laguntza eta OpenMP konstruktuetan begizta heterogeneoak erabiltzeko gaitasuna gehitu da. OMP_TARGET_OFFLOAD ingurune-aldagaiaren euskarria inplementatu da.
  • C, C++ eta Fortran lengoaietarako emandako OpenACC 2.6 programazio paraleloaren zehaztapenaren ezarpena hobetu da, GPUetan eta prozesadore espezializatuetan deskargatzeko eragiketak definitzen dituena, NVIDIA PTX adibidez.
  • C lengoaietarako, "no_stack_protector" atributu berri bat ezarri da, pilaren babesa gaitu behar ez duten funtzioak markatzeko diseinatuta ("-fstack-protector"). "malloc" atributua zabaldu da memoria esleitzeko eta askatzeko dei bikoteen identifikaziorako (esleitzaile/deslokatzailea), analizatzaile estatikoan erabiltzen dena memoriarekin lan egitean ohikoak diren akatsak identifikatzeko (memoria ihesak, askatu ondoren erabiltzea, doako funtzioari dei bikoitzak, etab.) eta konpilatzaileen abisuetan β€œ-Wmismatched-dealloc”, β€œ-Wmismatched-new-delete” eta β€œ-Wfree-nonheap-object”, memoria desesleipenaren eta memoria esleipenaren eragiketen arteko inkoherentziaren berri emanez.
  • Abisu berriak gehitu dira C hizkuntzarako:
    • "-Wmismatched-dealloc" (lehenespenez gaituta) - memoria esleitzeko funtzioekin bateragarria ez den erakuslea erabiltzen duten memoria-desesleipen-eragiketei buruz ohartarazten du.
    • "-Wsizeof-array-div" (gaituta "-Wall" zehazten denean) - Bi tamainako operadoreen zatiketari buruz ohartarazten du zatitzailea matrizearen elementuaren tamainarekin bat ez badator.
    • "-Wstringop-overread" (lehenespenez gaituta) - matrizearen mugatik kanpoko eremu bateko datuak irakurtzen dituen kate-funtzio bati deitzeaz ohartarazten du.
    • "-Wtsan" (lehenespenez gaituta) - ThreadSanitizer-en onartzen ez diren funtzioak erabiltzeari buruz ohartarazten du (adibidez, std::atomic_thread_fence).
    • "-Warray-parameter" eta "-Wvla-parameter" (gaituta dago "-Wall" zehaztean) - luzera finkoko eta aldakorreko matrizeekin lotutako argumentuen deklarazio bateraezinak dituzten funtzioak gainidazteaz ohartarazten du.
    • "-Wuninitialized" abisuak hasieratu gabeko memoria dinamikoki esleitutako memoriatik irakurtzeko saiakerak hautematen ditu orain.
    • "-Wfree-nonheap-object" abisuak memoria-desesleipen-funtzioei memoria-esleipen-funtzio dinamikoen bidez lortzen ez den erakusle batekin deitzen diren kasuen definizioa zabaltzen du.
    • "-Wmaybe-uninitialized" abisuak erakusleak pasatzearen detekzioa zabaldu du hasieratu gabeko memoria-kokapenei erreferentzia egiten dieten funtzioetara.
  • C hizkuntzarako, C2X estandarraren esparruan garatutako ezaugarri berrien zati bat inplementatu da (-std=c2x eta -std=gnu2x zehaztuz gaituta): BOOL_MAX eta BOOL_WIDTH makroak, funtzioan erabiltzen ez diren parametroen izenen aukerako adierazpena. definizioak (C++-n bezala), "[ [nodiscard]]" atributua, "__has_c_attribute" aurreprozesadorearen eragilea, makroak FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559, __STDC_WANT_IEC_XNUMX, INFEX_AN, INFEX_AN, INFEX_AN, DBL_IS_IEC_XNUMX _SNAN, DEC_INFINITY eta DEC_NAN, NaN=makroak FloatN-rako , _FloatNx eta _DecimalN, deklarazioen aurretik eta adierazpen konposatuen amaieran jauzi-markak zehazteko gaitasuna.
  • C++-rako, C++20 estandarrean proposatutako aldaketen eta berrikuntzen zati bat inplementatu da, besteak beste, "consteval virtual" funtzio birtualak, objektuen bizi-zikloaren amaierarako sasi-suntsitzaileak, enum klasearen erabilera eta "berria" adierazpenean matrize baten tamaina kalkulatzea.
  • C++-rako, euskarri esperimentala gehitu da etorkizuneko C++23 estandarrerako garatzen ari diren hobekuntza batzuetarako (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Adibidez, orain "zu" atzizki literala onartzen da sinatutako size_t balioetarako.
  • libstdc++-k C++17 estandarraren euskarria hobetu du, std::from_chars eta std::to_chars inplementazioen sarrera barne, koma mugikorreko motetarako. C++20 estandarraren elementu berriak inplementatu dira, besteak beste, std::bit_cast, std::source_location, eragiketa atomikoak wait and notify, , , , , baita etorkizuneko C++23 estandarraren elementuak ere (std::to_underlying, std::is_scoped_enum). Datuen prozesamendu paralelorako moten euskarri esperimentala gehitu da (SIMD, Data-Parallel Types). std::uniform_int_distribution inplementazioa azkartu da.
  • Kendu alfa-kalitatearen bandera libgccjit-etik, kode-sorgailu bat beste prozesu batzuetan txertatzeko eta JIT bytekodeen konpilazioa makina-kodean antolatzeko liburutegi partekatua. MinGWrako libgccjit eraikitzeko gaitasuna gehitu da.
  • AArch64 Armv8-R arkitekturarako euskarria gehitu da (-march=armv8-r). AArch64 eta ARM arkitekturetarako, prozesadoreentzako euskarria gehitu da (-mcpu eta -mtune parametroak): 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) eta Arm Neoverse N2 (neoverse-n2). Fujitsu A64FX (a64fx) eta Arm Cortex-R82 (cortex-r82) CPUak ere gehitu dira, AArch64 arkitektura soilik onartzen dutenak.
  • Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) eta MVE (AArch32 M-profila) SIMD argibideak erabiltzeko laguntza gehitu da batuketa, kenketa, biderketa eta batuketa/kenketa aldaerak egiten dituzten eragiketak autovektorizatzeko. zenbaki konplexuak. ARMrako autobektoretzarako hasierako laguntza gehitu da MVE instrukzio-multzoa erabiliz.
  • ARM plataformetarako, konpiladoreetan integratutako C funtzioen multzo osoa (Intrinsekoak) eskaintzen da, bektore hedatutako jarraibideek (SIMD) ordezkatuta, ACLE Q3 2020 zehaztapenean dokumentatutako NEON instrukzio guztiak biltzen dituena.
  • gfx908 GPUrako euskarria gehitu da backend-era GCN mikroarkitekturan oinarritutako AMD GPUetarako kodea sortzeko.
  • Prozesadore berrientzako eta horietan inplementatutako instrukzio-multzoen luzapen berrientzako euskarria gehitu da:
    • Intel Sapphire Rapids (-march=sapphirerapids, MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BV16NI eta AVX-FXNUMXNI argibideak onartzen ditu.
    • Intel Alderlake (-march=alderlake, CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI eta HRESET argibideetarako laguntza gaitzen du).
    • Intel Rocketlake (-march=rocketlake, Rocket Lake-ren antzekoa SGX laguntzarik gabe).
    • AMD Zen 3 (-march=znver3).
  • Intel prozesadoreetan oinarritutako IA-32/x86-64 sistemetarako, TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI prozesadorearen argibide berrietarako laguntza gehitu da.
  • "-march=x86-64-v[234]" banderen laguntza gehitu da x86-64 arkitektura mailak hautatzeko (v2 - SSE4.2, SSSE3, POPCNT eta CMPXCHG16B luzapenak estaltzen ditu; v3 - AVX2 eta MOVBE; v4 - AVX-512 ) .
  • Big-endian byte ordena duten RISC-V sistementzako euskarria gehitu da. "-misa-spec=*" aukera gehitu da RISC-V instrukzio-multzoaren arkitektura-zehaztapenaren bertsioa hautatzeko. AddressSanitizer eta pila babesteko laguntza gehitu da kanariar etiketak erabiliz.
  • "-fanalyzer" analisi estatiko moduaren etengabeko hobekuntza, programako kodeen exekuzio bideen eta datu-fluxuen baliabide-prozedura arteko analisia egiten duena. Modu honek konpilazio fasean arazoak detektatzeko gai da, hala nola, free() funtzioari dei bikoitzak memoria eremu baterako, fitxategi deskribatzaileen ihesak, erakusle nuluak deserreferentziatu eta pasatzea, askatutako memoria blokeetara atzitzea, hasieratu gabeko balioak erabiltzea, etab. Bertsio berrian:
    • Programaren egoeraren jarraipena egiteko kodea guztiz berridatzi da. C fitxategi oso handiak eskaneatzeko arazoak konpondu dira.
    • Hasierako C++ euskarria gehitu da.
    • Memoriaren esleipena eta desesleipenaren azterketa malloc eta doako funtzio espezifikoetatik atera da, eta orain new/delete eta new[]/delete[] onartzen ditu.
    • Abisu berriak gehitu dira: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const eta -Wanalyzer-write-to-string-literal.
    • -fdump-analyzer-json eta -fno-analyzer-feasibility arazketa-aukera berriak gehitu dira.
    • GCCrako pluginen bidez analizatzailea hedatzeko gaitasuna inplementatu da (adibidez, plugin bat prestatu da CPython-en blokeo globalaren (GIL) erabilera okerra egiaztatzeko).

Iturria: opennet.ru

Gehitu iruzkin berria