Llançament del conjunt de compiladors GCC 10

Després d'un any de desenvolupament publicat llançament d'un conjunt gratuït de compiladors GCC 10.1, la primera versió important de la nova branca GCC 10.x. D'acord amb nou esquema números de llançament, en el procés de desenvolupament es va utilitzar la versió 10.0 i, poc abans del llançament de GCC 10.1, la branca GCC 11.0 ja s'havia ramificat, sobre la base de la qual es formaria la següent versió significativa, GCC 11.1.

GCC 10.1 destaca per la implementació de moltes innovacions en el llenguatge C++ desenvolupat per a l'estàndard C++20, millores relacionades amb el futur estàndard del llenguatge C (C2x), noves optimitzacions en els backends del compilador i suport experimental. Mode d'anàlisi estàtica. A més, durant la preparació d'una nova branca, el projecte va transferir el repositori de SVN a Git.

El principal canvis:

  • Afegit manera experimental d'anàlisi estàtica"- fanalitzador", que realitza una anàlisi interprocediment intensiva en recursos dels camins d'execució de codi i dels fluxos de dades en un 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. L'ús del nou mode per al codi OpenSSL ja ha permès identificar-lo vulnerabilitat perillosa.
  • Optimitzacions interprocediments millorades. La passada IPA-SRA (substitució compartida escalar interprocedimental) s'ha redissenyat per funcionar en el moment de l'enllaç i, entre altres coses, ara elimina els valors no utilitzats calculats i retornats. En el mode d'optimització "-O2", està habilitada l'opció "-finline-functions", que es torna a sintonitzar per afavorir un codi més compacte per sobre del rendiment d'execució. S'ha accelerat el treball de l'heurística per al desplegament de funcions en línia. Les heurístiques d'expansió en línia i de clonació de funcions ara poden utilitzar informació sobre els intervals de valors per predir l'efectivitat de les transformacions individuals. Per a C++, s'ha millorat la precisió de l'anàlisi d'àlies basat en tipus.
  • Optimitzacions de temps d'enllaç (LTO) millorades. S'ha afegit un nou executable lto-abocador per restablir la informació sobre fitxers d'objectes amb bytecode LTO. Les passades LTO paral·leles determinen automàticament el nombre de tasques de creació que s'executen simultàniament i, si no es poden determinar, utilitzen informació sobre el nombre de nuclis de CPU com a factor de paral·lelització. S'ha afegit la possibilitat de comprimir el codi de bytes LTO mitjançant l'algorisme zstd.
  • S'ha millorat el mecanisme d'optimització basat en els resultats del perfil de codi (PGO - Profile-guided optimization), que genera un codi més òptim a partir d'una anàlisi de les característiques de l'execució del codi. Manteniment millorat del perfil durant la compilació i la separació del codi calent/fred. Mitjançant l'opció "-fprofile-valors» Ara pot controlar fins a 4 valors de perfil, per exemple, per a trucades indirectes i proporcionar informació de perfil més precisa.
  • Especificació de programació paral·lela implementada per als llenguatges C, C++ i Fortran OpenACC 2.6, que defineix eines per a operacions de descàrrega en GPU i processadors especialitzats com NVIDIA PTX. La implementació de la norma està gairebé completa OpenMP 5.0 (Open Multi-Processing), que defineix l'API i els mètodes d'aplicació de mètodes de programació paral·lel en sistemes multinucli i híbrids (CPU+GPU/DSP) amb memòria compartida i unitats de vectorització (SIMD). S'han afegit funcions com ara condicionals lastprivate, directives d'exploració i bucle, expressions order i use_device_addr. Per a OpenMP i OpenACC, s'ha afegit suport per a les operacions de descàrrega a les GPU AMD Radeon (GCN) de quarta generació (Fiji) i de cinquena generació (VEGA 10/VEGA 20).
  • Per als llenguatges de la família C, s'ha afegit la funció "accés" per descriure l'accés de la funció als objectes passats per referència o punter, i per associar aquests objectes amb arguments enters que contenen informació sobre la mida dels objectes. Per treballar conjuntament amb "access", l'atribut "type" s'implementa per detectar l'accés incorrecte de les funcions de l'usuari, per exemple, quan s'escriuen valors en una àrea fora dels límits de la matriu. També s'afegeix l'atribut "symver" per associar símbols en un fitxer ELF amb números de versió específics.
  • S'han afegit nous avisos:
    • "-Wstring-compare" (habilitat amb "-Wextra"): adverteix sobre la presència d'expressions en què es compara zero amb el resultat de cridar les funcions strcmp i strncmp, que és equivalent a una constant a causa del fet que la longitud d'un argument és més gran que la mida de la matriu del segon argument.
    • "-Wzero-length-bounds" (habilitat amb "-Warray-bounds"): adverteix sobre l'accés a elements de la matriu de longitud zero, cosa que pot provocar la sobreescritura d'altres dades.
    • Els avisos "-Warray-bounds", "-Wformat-overflow", "-Wrestrict", "-Wreturn-local-addr" i "-Wstringop-overflow" s'han ampliat per ampliar el nombre de situacions fora de límits. que es manegen.
  • S'ha implementat la capacitat d'especificar directament caràcters amples als identificadors mitjançant la codificació actual (UTF-8 per defecte) en lloc de la notació UCN (\uNNNN o \UNNNNNNNN). Per exemple:

    static const int π = 3;
    int get_naïve_pi() {
    retorn π;
    }

  • Per al llenguatge C, s'ha implementat una part de les noves característiques desenvolupades dins de l'estàndard C2X (habilitat especificant -std=c2x i -std=gnu2x): ha aparegut suport per a la sintaxi “[[]]” per definir atributs com en C++ (per exemple, [[gnu ::const]], [[deprecated]], [[fallthrough]] i [[maybe_unused]]. S'ha afegit suport per a la sintaxi "u8" per definir constants amb caràcters UTF-8.
    S'han afegit noves macros a . S'han afegit substitucions "%OB" i "%Ob" a strftime.

  • El mode predeterminat per a C és "-fno-common", que permet un accés més eficient a les variables globals en algunes plataformes.
  • Per a C++, s'han implementat uns 16 canvis i innovacions, desenvolupats en l'estàndard C++20. Incloent la paraula clau afegida "constinit"
    i s'ha implementat el suport per a les extensions de plantilles "conceptes". Els conceptes us permeten definir un conjunt de requisits de paràmetres de plantilla que, en el moment de la compilació, limiten el conjunt d'arguments que es poden acceptar com a paràmetres de plantilla. Els conceptes es poden utilitzar per evitar incoherències lògiques entre les propietats dels tipus de dades utilitzats a la plantilla i les propietats del tipus de dades dels paràmetres d'entrada.

  • G++ proporciona detecció de comportaments no definits causats pel canvi d'objectes constants mitjançant constexpr. Reducció del consum de memòria pel compilador en calcular constexpr. S'han afegit nous advertiments "-Wmismatched-tags" i "-Wredundant-tags".
  • S'han proposat noves opcions de línia d'ordres:
    • "-fallocation-dce" per eliminar parells innecessaris d'operadors "nou" i "eliminar".
    • "-fprofile-partial-training" per desactivar l'optimització de mida per al codi que no té una execució d'entrenament.
    • "-fprofile-reproducible per controlar el nivell de reproductibilitat del perfil.
    • "-fprofile-prefix-path" per definir el directori de compilació d'origen base utilitzat per a la generació de perfils separats (per a "-fprofile-generate=profile_dir" i "-fprofile-use=profile_dir").
  • En el text d'advertència de les opcions esmentades, es proporcionen hipervincles que permeten anar a la documentació d'aquestes opcions. La substitució d'URL es controla mitjançant l'opció "-fdiagnostics-urls".
  • S'ha afegit un operador de preprocessador "__ha_construït", que es pot utilitzar per comprovar les funcions integrades.
  • S'ha afegit una nova funció integrada "__builtin_roundeven" amb una implementació de la funció d'arrodoniment definida a l'especificació ISO/IEC TS 18661, semblant a "round", però arrodonint part superior a 0.5 (a un valor més gran), menys de 0.5 - avall (fins a zero) i igual a 0.5 - a partir de la paritat del penúltim dígit.
  • Per a l'arquitectura AArch64, s'ha afegit suport per a l'extensió SVE2 i s'ha millorat el suport per a SVE (Extensió vectorial escalable), incloent-hi suport afegit per a les funcions i tipus d'ACLE SVE integrats i l'ús de la vectorització. S'ha ampliat el suport per a LSE (Extensions de sistema grans) i TME (Extensió de memòria transaccional). S'han afegit noves instruccions proposades a Armv8.5-A i Armv8.6-A, incloses instruccions per a la generació de números aleatoris, arrodoniment, vinculació d'etiquetes de memòria,
    bfloat16 i multiplicació de matrius. S'ha afegit suport de processador
    Braç Cortex-A77,
    Braç Cortex-A76AE,
    Braç Cortex-A65,
    Braç Cortex-A65AE,
    Braç Cortex-A34 i
    Marvell ThunderX3.

  • S'ha afegit suport per a ABI FDPIC (punters de funció de 32 bits) per a ARM64. Processament redissenyat i optimitzat d'operacions enteres de 64 bits. S'ha afegit suport de CPU
    Braç Cortex-A77,
    Braç Cortex-A76AE i
    Braç Cortex-M35P. Suport ampliat per a instruccions de processament de dades ACLE, incloent SIMD de 32 bits, multiplicació de 16 bits, aritmètica de tancament i altres optimitzacions d'algorismes DSP. S'ha afegit suport experimental per a les instruccions d'ACLE CDE (Extensió de ruta de dades personalitzada).

  • Millora significativa de la generació de codi i la vectorització al backend per a les GPU AMD basades en la microarquitectura GCN.
  • S'ha afegit suport per a dispositius semblants a XMEGA per a l'arquitectura AVR
    ATtiny202, ATtiny204, ATtiny402, ATtiny404, ATtiny406, ATtiny804, ATtiny806, ATtiny807, ATtiny1604, ATtiny1606, ATtiny1607, ATmega808, ATmega809, ATmega1608, ATmega1609, ATmega3208, ATmega3209, ATmega4808 4809, ATmegaXNUMX i ATmegaXNUMX.

  • S'ha afegit una nova extensió d'arquitectura de conjunt d'instruccions Intel ENQCMD (-menqcmd) per a arquitectures IA-32/x86-64. S'ha afegit suport per a les CPU Intel Cooperlake (-march=cooperlake, inclou l'extensió ISA AVX512BF16) i Tigerlake (-march=tigerlake, inclou les extensions ISA MOVDIRI, MOVDIR64B i AVX512VP2INTERSECT).
  • Una implementació del HSAIL (Heterogeneous System Architecture Intermediate Language) per a sistemes informàtics heterogenis basats en l'arquitectura HSA ha quedat obsoleta i probablement s'eliminarà en una versió futura.

Font: opennet.ru

Afegeix comentari