Llançament del conjunt de compiladors GCC 9

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

GCC 9.1 destaca per estabilitzar el suport per a l'estàndard C++17, continuar implementant les capacitats del futur estàndard C++20 (nom en codi C++2a), inclusió a la interfície per al llenguatge D, suport parcial per a OpenMP 5.0 , suport gairebé complet per a OpenACC 2.5, augmentar l'escalabilitat de les optimitzacions i optimitzacions interprocedimentals en l'etapa d'enllaç, ampliació d'eines de diagnòstic i addició de nous avisos, backends per a OpenRISC, C-SKY V2 i GPU AMD GCN.

El principal canvis:

  • S'ha afegit suport per al llenguatge de programació D. GCC inclou una interfície amb un compilador GDC (Gnu D Compiler) i biblioteques en temps d'execució (libphobos), que us permeten utilitzar GCC estàndard per crear programes en el llenguatge de programació D. El procés d'habilitar el suport del llenguatge D a GCC ha començat el 2011, però arrossegat a causa de la necessitat de fer que el codi compleixi els requisits del GCC i dels problemes de transferència de drets de propietat intel·lectual a Digital Mars, que està desenvolupant el llenguatge de programació D;
  • S'han fet millores al generador de codi. Per exemple, s'ha implementat l'ús de diferents estratègies per ampliar les expressions Switch (taula de salt, prova de bits, arbre de decisió) en funció de les situacions. S'ha afegit la capacitat de transformar funcions lineals que inclouen una expressió Switch mitjançant l'optimització "-ftree-switch-conversion" (per exemple, un conjunt de condicions com "cas 2: com = 205; trencament; cas 3: com = 305; trencament). ;" es convertirà en "100 * com + 5";
  • Optimitzacions interprocediments millorades. La configuració de desplegament en línia s'ha adaptat a les bases de codi C++ modernes i s'han ampliat amb nous paràmetres max-inline-insns-small, max-inline-insns-size, uninlined-function-insns, uninlined-function-time, uninlined-thunk-insns i uninlined -temps d'agraïment. Precisió i agressivitat millorades de la separació de codi fred/calent. Escalabilitat millorada per a molt grans unitats de traducció (per exemple, quan s'aplica l'optimització en l'etapa d'enllaç a programes grans);
  • 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. Opció de resum "-fprofile-use" ara inclou els modes d'optimització "-fversion-loops-for-strides", "-floop-interchange", "-floop-unroll-and-jam" i "-ftree-loop-distribution". S'ha eliminat la inclusió d'histogrames amb comptadors als fitxers, la qual cosa va reduir la mida dels fitxers amb perfils (ara es generen histogrames sobre la marxa quan es realitzen optimitzacions durant l'enllaç);
  • Optimitzacions de temps d'enllaç (LTO) millorades. Es va proporcionar una simplificació dels tipus abans de generar el resultat, cosa que va permetre reduir significativament la mida dels fitxers d'objectes LTO, reduir el consum de memòria a l'etapa d'enquadernació i millorar la paral·lelització de les operacions. El nombre de particions (-param lto-partitions) s'ha incrementat de 32 a 128, la qual cosa millora el rendiment en sistemes amb un gran nombre de fils de CPU. S'ha afegit un paràmetre per controlar el nombre de processos d'optimització
    "-param lto-max-streaming-parallelism";

    Com a resultat, en comparació amb GCC 8.3, les optimitzacions introduïdes a GCC 9 permès reduir el temps de compilació de Firefox 5 i LibreOffice 66 en un 6.2.3%. La mida dels fitxers d'objectes va disminuir un 7%. El temps d'enllaç en una CPU de 8 nuclis es va reduir un 11%. L'etapa d'optimització seqüencial de l'etapa d'enllaç és ara un 28% més ràpida i consumeix un 20% menys de memòria. El consum de memòria de cada processador de l'etapa paral·lelitzada de LTO va disminuir un 30%;

  • La major part de l'especificació de programació paral·lela s'implementa per als llenguatges C, C++ i Fortran OpenACC 2.5, que defineix eines per a operacions de descàrrega en GPU i processadors especialitzats com NVIDIA PTX;
  • S'ha implementat suport parcial per a l'estàndard per a C i C++ OpenMP 5.0 (Open Multi-Processing), que defineix l'API i els mètodes d'aplicació de mètodes de programació paral·lel per als llenguatges C, C++ i Fortran en sistemes multinucli i híbrids (CPU+GPU/DSP) amb memòria compartida i unitats de vectorització (SIMD) ;
  • S'han afegit nous avisos per al llenguatge C: "-Adreça-del-membre-empat" (valor del punter no alineat a un membre empaquetat d'una estructura o unió) i
    «-Valor-wabsolut" (quan s'accedeix a funcions per calcular un valor absolut, si hi ha una funció més adequada per a l'argument especificat, per exemple, s'ha d'utilitzar fabs(3.14) en comptes de abs(3.14). S'han afegit nous avisos per a C++: "-Wdeprecated-copy",
    "-Winit-list-lifetime", "-Wredundant-move", "-Wpessimizing-move" i "-Wclass-conversion". S'han ampliat molts avisos disponibles anteriorment;

  • S'ha afegit suport experimental per a part del futur estàndard de llenguatge C, amb el nom en clau C2x. Per habilitar el suport C2x, utilitzeu les opcions "-std=c2x" i "-std=gnu2x" (per habilitar les extensions GNU). L'estàndard encara es troba en una fase inicial de desenvolupament, per tant, de les seves capacitats, només s'admet l'expressió _Static_assert amb un argument (_Static_assert amb dos arguments està estandarditzada a C11);
  • El suport per a l'estàndard C++17 s'ha declarat estable. A la interfície, les capacitats del llenguatge de C++17 estan totalment implementades, i a libstdc++, les funcions de biblioteca definides a l'estàndard estan a prop de la implementació total;
  • Continuat implementació elements del futur estàndard C++2a. Per exemple, s'ha afegit la possibilitat d'incloure intervals durant la inicialització, s'han implementat extensions per a expressions lambda, s'ha afegit suport per a membres buits d'estructures de dades i atributs probables/poc probables, s'ha proporcionat la possibilitat de cridar funcions virtuals en expressions condicionals. , etc.
    Per habilitar el suport C++2a, utilitzeu les opcions "-std=c++2a" i "-std=gnu++2a". S'han afegit fitxers de capçalera de bits i versió a libstdc++ per a C++ 2a, std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible i std::type_identity trets, std::midpoint, std::lerp , std::bind_front,
    std::visit, std::is_constant_evaluated i std::assume_aligned, va afegir suport per al tipus char8_t, va implementar la possibilitat de comprovar el prefix i el sufix de les cadenes (starts_with, ends_with);

  • S'ha afegit suport per als nous processadors ARM
    Cortex-A76, Cortex-A55, Cortex-A76 DynamIQ big.LITTLE i Neoverse N1. S'ha afegit suport per a instruccions introduïdes a Armv8.3-A per treballar amb nombres complexos, generació de números pseudoaleatoris (rng) i etiquetatge de memòria (memtag), així com instruccions per bloquejar atacs relacionats amb l'execució especulativa i el funcionament de la unitat de predicció de branques. . Per a l'arquitectura AArch64, s'ha afegit un mode de protecció interseccions de pila i pila ("-fstack-clash-protection"). Per utilitzar les característiques de l'arquitectura Armv8.5-A, s'ha afegit l'opció "-march=armv8.5-a".

  • Inclou un backend per generar codi per a GPU AMD basat en la microarquitectura GCN. Actualment, la implementació es limita a la compilació d'aplicacions d'un sol fil (més endavant s'oferirà suport per a la realització de càlculs multifil mitjançant OpenMP i OpenACC) i suport per a GPU Fiji i Vega 10;
  • S'ha afegit un nou backend per als processadors OpenRISC;
  • S'ha afegit backend per als processadors C-SKY V2, produït per l'empresa xinesa del mateix nom per a diversos dispositius de consum;
  • Totes les opcions de línia d'ordres que operen valors de bytes admeten els sufixos kb, KiB, MB, MiB, GB i GiB;
  • Implementat l'opció "-flive-patching=[inline-only-static|inline-clone]" us permet aconseguir una compilació segura per als sistemes de pegats en directe a causa del control multinivell de l'ús d'interprocediments (IPA) optimitzacions;
  • S'ha afegit l'opció "--completion" per a un control detallat de la finalització de l'opció quan s'utilitza bash;
  • Les eines de diagnòstic ofereixen visualitzacions d'extractes de text font que indiquen el número de línia i marquen visualment la informació relacionada, com ara els tipus d'operands. Per desactivar la visualització de números de línia i etiquetes, es proporcionen les opcions "-fno-diagnostics-show-line-numbers" i "-fno-diagnostics-show-labels";

    Llançament del conjunt de compiladors GCC 9

  • Ampliat eines per diagnosticar errors en el codi C++, millor llegibilitat de la informació sobre les causes dels errors i ressaltat de paràmetres problemàtics;

    Llançament del conjunt de compiladors GCC 9

  • S'ha afegit l'opció "-fdiagnostics-format=json", que permet generar una sortida de diagnòstic en format llegible per màquina (JSON);
  • S'han afegit noves opcions de perfil "-fprofile-filter-files" i "-fprofile-exclude-files" per seleccionar els fitxers font que s'han de processar;
  • AddressSanitizer proporciona la generació de codi de verificació més compacte per a variables automàtiques, que redueix el consum de memòria del fitxer executable que s'està comprovant;
  • Sortida millorada en "-fopt-info» (informació detallada sobre optimitzacions afegides). S'han afegit nous prefixos "optimitzat" i "perdut", a més del prefix disponible anteriorment "nota". S'ha afegit la sortida d'informació sobre la presa de decisions sobre el desplegament en línia i la vectorització de cicles;
  • S'ha afegit l'opció "-fsave-optimization-record", quan s'especifica, GCC desa el fitxer SRCFILE.opt-record.json.gz amb una descripció de les decisions sobre l'ús de determinades optimitzacions. La nova opció difereix del mode "-fopt-info" perquè inclou metadades addicionals, com ara informació sobre el perfil i les cadenes en línia;
  • S'han afegit opcions "-fipa-stack-alignment" i "-fipa-reference-addressable" per controlar l'alineació de la pila i l'ús de modes d'adreçament (només escriptura o lectura exacta) per a variables estàtiques durant les optimitzacions interprocediments;
  • S'introdueixen noves funcions integrades per controlar l'enllaç d'atributs, així com el comportament relacionat amb la predicció de branques i l'execució d'instruccions especulatives: "__builtin_té_atribut","__esperar_integrada_amb_probabilitat"I"__valor_segur_de_especulació_integrada". S'ha afegit un nou atribut per a funcions, variables i tipus copy;
  • S'ha implementat suport complet per a l'entrada/sortida asíncrona per a l'idioma Fortran;
  • El suport per a les plataformes Solaris 10 (*-*-solaris2.10) i Cell/BE (SPU de motor de banda ampla de cèl·lules) ha quedat obsolet i s'eliminarà en la propera versió principal. El suport per a les arquitectures Armv2, Armv3, Armv5 i Armv5E s'ha interromput. El suport per a Intel MPX (extensions de protecció de memòria) s'ha interromput.

Font: opennet.ru

Afegeix comentari