Llançament del conjunt de compiladors GCC 11

Després d'un any de desenvolupament, s'ha llançat el conjunt de compiladors gratuïts GCC 11.1, la primera versió significativa de la nova branca GCC 11.x. D'acord amb el nou esquema de numeració de la versió, es va utilitzar la versió 11.0 en el procés de desenvolupament, i poc abans del llançament de GCC 11.1, la branca GCC 12.0 ja s'havia ramificat, a partir de la qual es formaria la següent versió principal, GCC 12.1.

GCC 11.1 destaca per la seva transició a l'ús del format de fitxer de depuració DWARF 5 per defecte, la inclusió predeterminada de l'estàndard C++17 ("-std=gnu++17"), millores significatives en el suport per a C++20. estàndard, suport experimental per a C++23, millores relacionades amb el futur estàndard de llenguatge C (C2x), noves optimitzacions de rendiment.

Principals canvis:

  • El mode predeterminat per al llenguatge C++ s'ha canviat per utilitzar l'estàndard C++17 (-std=gnu++17) en comptes del C++14 ofert anteriorment. És possible desactivar selectivament el nou comportament C++17 quan es processen plantilles que utilitzen altres plantilles com a paràmetre (-fno-new-ttp-matching).
  • S'ha afegit suport per a l'acceleració de maquinari de l'eina AddressSanitizer, que us permet determinar els fets d'accés a àrees de memòria alliberades, superant els límits de la memòria intermèdia assignada i alguns altres tipus d'errors quan es treballa amb memòria. Actualment, l'acceleració de maquinari només està disponible per a l'arquitectura AArch64 i es centra en l'ús quan es compila el nucli Linux. Per habilitar l'acceleració de maquinari d'AddressSanitizer quan es construeixen components d'espai d'usuari, s'ha afegit la marca "-fsanitize=hwaddress" i la marca del nucli "-fsanitize=kernel-hwaddress".
  • Quan es genera informació de depuració, s'utilitza per defecte el format DWARF 5 que, en comparació amb versions anteriors, permet generar dades de depuració un 25% més compactes. El suport complet per a DWARF 5 requereix almenys la versió 2.35.2 de binutils. El format DWARF 5 és compatible amb les eines de depuració des de GDB 8.0, valgrind 3.17.0, elfutils 0.172 i dwz 0.14. Per generar fitxers de depuració amb altres versions de DWARF, podeu utilitzar les opcions "-gdwarf-2", "-gdwarf-3" i "-gdwarf-4".
  • S'han augmentat els requisits per als compiladors que es poden utilitzar per crear GCC. El compilador ara ha de suportar l'estàndard C++11 (abans es requeria C++98), és a dir. Si GCC 10 va ser suficient per construir GCC 3.4, ara es necessita almenys GCC 11 per construir GCC 4.8.
  • S'ha canviat el nom i la ubicació dels fitxers per desar els abocadors, els fitxers temporals i la informació addicional necessària per a l'optimització de LTO. Aquests fitxers ara es guarden sempre al directori actual tret que el camí es canviï explícitament mitjançant les opcions "-dumpbase", "-dumpdir" i "-save-temps="*".
  • El suport per al format binari BRIG per utilitzar-lo amb el llenguatge HSAIL (Heterogeneous System Architecture Intermediate Language) ha quedat obsolet i aviat s'eliminarà.
  • S'han ampliat les capacitats del mode ThreadSanitizer (-fsanitize=thread), dissenyat per detectar condicions de carrera quan es comparteixen les mateixes dades de diferents fils d'una aplicació multifil. La nova versió afegeix suport per a temps d'execució i entorns alternatius, així com suport per a l'eina de depuració KCSAN (Kernel Concurrency Sanitizer), dissenyada per detectar de forma dinàmica les condicions de carrera dins del nucli de Linux. S'han afegit noves opcions "-param tsan-distinguish-volatile" i "-param tsan-instrument-func-entry-exit".
  • Els números de columna dels missatges de diagnòstic ara reflecteixen no el recompte de bytes des del principi de la línia, sinó els números de columna que tenen en compte els caràcters de diversos bytes i els caràcters que ocupen diverses posicions de la línia (per exemple, el caràcter 🙂 ocupa dues posicions i està codificat en 4 bytes). De la mateixa manera, els caràcters de tabulació ara es tracten com un nombre determinat d'espais (configurable mitjançant l'opció -ftabstop, per defecte 8). Per restaurar el comportament antic, es proposa l'opció "-fdiagnostics-column-unit=byte" i per determinar el valor inicial (numeració de 0 o 1) - l'opció "-fdiagnostics-column-origin=".
  • El vectoritzador té en compte tot el contingut de la funció i afegeix capacitats de processament associades a interseccions i referències a blocs anteriors al gràfic de flux de control (CFG, gràfic de flux de control).
  • L'optimitzador implementa la capacitat de convertir una sèrie d'operacions condicionals que comparen la mateixa variable en una expressió de commutació. En el futur, l'expressió switch es pot codificar mitjançant instruccions de prova de bits (s'ha afegit l'opció "-fbit-tests" per controlar aquesta conversió).
  • Optimitzacions interprocediments millorades. S'ha afegit una nova passada IPA-modref (-fipa-modref) per fer un seguiment dels efectes secundaris en cridar funcions i millorar la precisió de l'anàlisi. Implementació millorada de la passada IPA-ICF (-fipa-icf), que redueix el consum de memòria durant la compilació i augmenta el nombre de funcions unificades per a les quals es combinen blocs de codi idèntics. En la passada IPA-CP (Propagació constant interprocedimental), s'han millorat les heurístiques de predicció, tenint en compte els límits coneguts i les característiques dels bucles.
  • A Linking Time Optimizations (LTO), el format de bytecode està optimitzat per reduir la mida i millorar la velocitat de processament. Reducció del consum màxim de memòria durant la fase d'enllaç.
  • En el mecanisme d'optimització basat en els resultats de l'elaboració de perfils de codi (PGO - Profile-guided optimization), que permet generar un codi més òptim basat en l'anàlisi de les característiques d'execució, la mida dels fitxers amb dades GCOV es redueix a causa de l'empaquetament més compacte de zero comptadors. . S'ha millorat el mode "-fprofile-values" fent un seguiment de més paràmetres a les trucades indirectes.
  • La implementació de l'estàndard OpenMP 5.0 (Open Multi-Processing), que defineix l'API i els mètodes per aplicar mètodes de programació paral·lel en sistemes multinucli i híbrids (CPU+GPU/DSP) amb memòria compartida i unitats de vectorització (SIMD), ha va continuar. S'ha afegit suport inicial per a la directiva d'assignació i la capacitat d'utilitzar bucles heterogenis en construccions OpenMP. S'ha implementat el suport per a la variable d'entorn OMP_TARGET_OFFLOAD.
  • S'ha millorat la implementació de l'especificació de programació paral·lela OpenACC 2.6 prevista per als llenguatges C, C++ i Fortran, que defineix eines per a operacions de descàrrega en GPU i processadors especialitzats, com NVIDIA PTX.
  • Per als llenguatges C, s'ha implementat un nou atribut "no_stack_protector", dissenyat per marcar funcions per a les quals no s'hauria d'habilitar la protecció de la pila ("-fstack-protector"). L'atribut "malloc" s'ha ampliat per donar suport a la identificació de parells de trucades per a l'assignació i l'alliberament de memòria (assignador/desalocador), que s'utilitza a l'analitzador estàtic per identificar errors típics en el treball amb la memòria (fuites de memòria, ús després de l'alliberament, etc.). trucades dobles a la funció lliure, etc.) i als advertiments del compilador "-Wmismatched-dealloc", "-Wmismatched-new-delete" i "-Wfree-nonheap-object", informant sobre la inconsistència entre les operacions de desassignació de memòria i d'assignació de memòria.
  • S'han afegit nous avisos per al llenguatge C:
    • "-Wmismatched-dealloc" (habilitat per defecte): adverteix sobre les operacions de desassignació de memòria que utilitzen un punter que no és compatible amb les funcions d'assignació de memòria.
    • "-Wsizeof-array-div" (habilitat quan s'especifica "-Wall") - Avisa sobre la divisió de dos operadors sizeof si el divisor no coincideix amb la mida de l'element de la matriu.
    • "-Wstringop-overread" (habilitat per defecte): adverteix sobre la crida d'una funció de cadena que llegeix dades d'una àrea fora del límit de la matriu.
    • "-Wtsan" (activat per defecte): adverteix sobre l'ús de funcions (com ara std::atomic_thread_fence) que no són compatibles amb ThreadSanitizer.
    • "-Warray-parameter" i "-Wvla-parameter" (habilitat quan s'especifica "-Wall"): adverteix sobre la substitució de funcions amb declaracions d'arguments incompatibles associades a matrius de longitud fixa i variable.
    • L'avís "-Wuninitialized" ara detecta els intents de llegir des de la memòria assignada dinàmicament no inicialitzada.
    • L'avís "-Wfree-nonheap-object" amplia la definició de casos en què les funcions de desassignació de memòria es criden amb un punter que no s'obté mitjançant funcions d'assignació de memòria dinàmica.
    • L'avís "-Wmaybe-uninitialized" ha ampliat la detecció de passar punters a funcions que fan referència a ubicacions de memòria no inicialitzades.
  • Per al llenguatge C, s'ha implementat una part de les noves funcionalitats desenvolupades en el marc de l'estàndard C2X (habilitat especificant -std=c2x i -std=gnu2x): macros BOOL_MAX i BOOL_WIDTH, indicació opcional de noms de paràmetres no utilitzats en funció definicions (com en C++), atribut "[ [nodiscard]]", operador de preprocessador "__has_c_attribute", macros FLT_IS_IEC_60559, DBL_IS_IEC_60559, LDBL_IS_IEC_60559, __STDC_WANT_IEC_60559, __STDC_WANT_IEC_XNUMX, NAND_FLTSNT_AN, DBL_IS_IEC_XNUMX, DBL_IS_IEC_XNUMX AN, DEC_INFINITY i DEC _NAN, NaN=macros per FloatN, _FloatNx i _DecimalN, capacitat d'especificar marques de salt abans de les declaracions i al final de les declaracions compostes.
  • Per a C++, s'han implementat una part dels canvis i innovacions proposats a l'estàndard C++20, incloses les funcions virtuals “consteval virtual”, pseudo-destructors per al final del cicle de vida dels objectes, l'ús de la classe enum i calculant la mida d'una matriu a l'expressió "nova".
  • Per a C++, s'ha afegit suport experimental per a algunes millores que s'estan desenvolupant per al futur estàndard C++23 (-std=c++23, -std=gnu++23, -std=c++2b, -std=gnu ++2b). Per exemple, ara hi ha suport per al sufix literal "zu" per als valors signats size_t.
  • libstdc++ ha millorat el suport per a l'estàndard C++17, inclosa la introducció de les implementacions std::from_chars i std::to_chars per als tipus de coma flotant. S'han implementat nous elements de l'estàndard C++20, inclosos std::bit_cast, std::source_location, operacions atòmiques wait and notify, , , , , així com elements del futur estàndard de C++ 23 (std::to_underlying, std::is_scoped_enum). S'ha afegit suport experimental per a tipus per al processament de dades paral·lel (SIMD, Data-Parallel Types). La implementació de std::uniform_int_distribution s'ha accelerat.
  • S'ha eliminat la marca de qualitat alfa de libgccjit, una biblioteca compartida per incrustar un generador de codi en altres processos i utilitzar-lo per organitzar la compilació JIT de bytecode en codi màquina. S'ha afegit la possibilitat de crear libgccjit per a MinGW.
  • S'ha afegit suport per a l'arquitectura AArch64 Armv8-R (-march=armv8-r). Per a les arquitectures AArch64 i ARM, s'ha afegit suport per als processadors (paràmetres -mcpu i -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) i Arm Neoverse N2 (neoverse-n2). També s'han afegit CPU Fujitsu A64FX (a64fx) i Arm Cortex-R82 (cortex-r82), que només admeten l'arquitectura AArch64.
  • S'ha afegit suport per utilitzar instruccions SIMD Armv8.3-a (AArch64/AArch32), SVE (AArch64), SVE2 (AArch64) i MVE (AArch32 M-profile) per autovectoritzar operacions que realitzen sumes, restes, multiplicacions i variants d'addició/resta. nombres complexos. S'ha afegit suport inicial per a l'autovectorització per a ARM mitjançant el conjunt d'instruccions MVE.
  • Per a les plataformes ARM, es proporciona un conjunt complet de funcions C integrades al compilador (intrínses), substituïdes per instruccions vectorials esteses (SIMD), que cobreixen totes les instruccions NEON documentades a l'especificació ACLE Q3 2020.
  • S'ha afegit suport per a GPU gfx908 al backend per generar codi per a GPU AMD basat en la microarquitectura GCN.
  • S'ha afegit suport per a nous processadors i noves extensions de conjunt d'instruccions implementades en ells:
    • Intel Sapphire Rapids (-march=sapphirerapids, permet el suport per a MOVDIRI, MOVDIR64B, AVX512VP2INTERSECT, ENQCMD, CLDEMOTE, SERIALIZE, PTWRITE, WAITPKG, TSXLDTRK, AMT-TILE, AMX-INT8, AMX-BV16NI i instruccions AV.
    • Intel Alderlake (-march=alderlake, habilita el suport per a les instruccions CLDEMOTE, PTWRITE, WAITPKG, SERIALIZE, KEYLOCKER, AVX-VNNI i HRESET).
    • Intel Rocketlake (-march=rocketlake, semblant a Rocket Lake sense suport SGX).
    • AMD Zen 3 (-march=znver3).
  • Per als sistemes IA-32/x86-64 basats en processadors Intel, s'ha afegit suport per a noves instruccions de processador TSXLDTRK, SERIALIZE, HRESET, UINTRKEYLOCKER, AMX-TILE, AMX-INT8, AMX-BF16, AVX-VNNI.
  • S'ha afegit suport per a les marques "-march=x86-64-v[234]" per seleccionar els nivells d'arquitectura x86-64 (v2 - cobreix les extensions SSE4.2, SSSE3, POPCNT i CMPXCHG16B; v3 - AVX2 i MOVBE; v4 - AVX-512 ).
  • S'ha afegit suport per a sistemes RISC-V amb ordre de bytes big-endian. S'ha afegit l'opció "-misa-spec="*" per seleccionar la versió de l'especificació d'arquitectura del conjunt d'instruccions RISC-V. S'ha afegit suport per a AddressSanitizer i protecció de pila mitjançant etiquetes canàries.
  • Millora continuada del mode d'anàlisi estàtica "-fanalyzer", que realitza una anàlisi interprocediment intensiva en recursos dels camins d'execució de codi i dels fluxos de dades del programa. El mode és capaç de detectar problemes en l'etapa de compilació, com ara trucades dobles a la funció free() per a una àrea de memòria, fuites de descriptors de fitxers, desreferenciar i passar punters nuls, accedir a blocs de memòria alliberats, utilitzar valors no inicialitzats, etc. En la nova versió:
    • El codi per fer el seguiment de l'estat del programa s'ha reescrit completament. S'han resolt els problemes amb l'escaneig de fitxers C molt grans.
    • S'ha afegit el suport inicial de C++.
    • L'anàlisi de l'assignació i desassignació de memòria s'ha abstret de les funcions específiques de malloc i de lliure, i ara admet new/delete i new[]/delete[].
    • S'han afegit nous avisos: -Wanalyzer-shift-count-negative, -Wanalyzer-shift-count-overflow, -Wanalyzer-write-to-const i -Wanalyzer-write-to-string-literal.
    • S'han afegit noves opcions de depuració -fdump-analyzer-json i -fno-analyzer-feasibility.
    • S'ha implementat la possibilitat d'estendre l'analitzador mitjançant connectors per a GCC (per exemple, s'ha preparat un connector per comprovar l'ús incorrecte del bloqueig global (GIL) a CPython).

Font: opennet.ru

Afegeix comentari