Llançament del conjunt de compiladors GCC 12

Després d'un any de desenvolupament, s'ha llançat el conjunt de compiladors gratuïts GCC 12.1, la primera versió significativa de la nova branca GCC 12.x. D'acord amb el nou esquema de numeració de la versió, en el procés de desenvolupament es va utilitzar la versió 12.0 i, poc abans del llançament de GCC 12.1, la branca GCC 13.0 ja s'havia ramificat, sobre la base de la qual la següent versió principal, GCC 13.1, seria estar format. El 23 de maig, el projecte celebrarà els 35 anys de la formació de la primera edició de GCC.

Principals canvis:

  • S'ha afegit suport per al format de depuració CTF (Compact Type Format), que proporciona emmagatzematge compacte d'informació sobre tipus C, connexions entre funcions i símbols de depuració. Quan s'incrusta en objectes ELF, el format permet l'ús de taules de caràcters EFL per evitar la duplicació de dades.
  • El suport per al format d'emmagatzematge d'informació de depuració "STABS", creat a la dècada de 1980, ha quedat obsolet.
  • Es continua treballant per ampliar el suport per als futurs estàndards C2X i C++23 per als llenguatges C i C++. Per exemple, s'ha afegit suport per a l'expressió "si consteval"; permès utilitzar auto en arguments de funció (“f(auto(g()))”); l'ús de variables no literals, goto i labels està permès en funcions declarades com a constexpr; suport afegit per a operadors d'índex multidimensionals operador[]; en if, for i switch, les capacitats dels blocs d'inicialització s'han ampliat (“for (utilitzant T = int; T e : v)”).
  • La biblioteca estàndard de C++ ha millorat el suport per a les seccions experimentals dels estàndards C++20 i C++23. S'ha afegit suport per a std::move_only_function, , std::basic_string::resize_and_overwrite, , i std::invoke_r. Permès utilitzar std::unique_ptr, std::vector, std::basic_string, std::optional i std::variant a les funcions constexpr.
  • La interfície de Fortran ofereix suport complet per a l'especificació TS 29113, que descriu capacitats per garantir la portabilitat entre el codi Fortran i C.
  • S'ha afegit suport per a l'extensió __builtin_shufflevector(vec1, vec2, index1, index2, ...) que s'ha afegit prèviament a Clang, que ofereix una única trucada per dur a terme operacions comunes de barreja i barreja de vectors.
  • Quan s'utilitza el nivell d'optimització "-O2", la vectorització està activada per defecte (els modes -ftree-vectorize i -fvect-cost-model=molt barats estan habilitats). El model molt barat permet la vectorització només si el codi vectorial pot substituir completament el codi escalar que s'està vectoritzant.
  • S'ha afegit el mode "-ftrivial-auto-var-init" per permetre la inicialització explícita de variables a la pila per fer un seguiment dels problemes i bloquejar les vulnerabilitats associades a l'ús de variables no inicialitzades.
  • Per als llenguatges C i C++, s'ha afegit una funció integrada __builtin_dynamic_object_size per determinar la mida d'un objecte, compatible amb una funció similar de Clang.
  • Per als llenguatges C i C++, s'ha afegit suport per a l'atribut "no disponible" (per exemple, podeu marcar funcions que generaran un error si proveu d'utilitzar-les).
  • Per als llenguatges C i C++, s'ha afegit suport per a les directives de preprocessament "#elifdef" i "#elifndef".
  • S'ha afegit la marca "-Wbidi-chars" per mostrar un avís si els caràcters UTF-8 s'utilitzen incorrectament, canviant l'ordre en què es mostra el text bidireccional.
  • S'ha afegit el senyalador "-Warray-compare" per mostrar un avís quan s'intenta comparar dos operands que fan referència a matrius.
  • La implementació dels estàndards OpenMP 5.0 i 5.1 (Open Multi-Processing), que defineixen 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) , ha continuat.
  • Implementació millorada de l'especificació de programació paral·lela OpenACC 2.6, que defineix eines per a operacions de descàrrega en GPU i processadors especialitzats com NVIDIA PTX.
  • S'ha afegit suport per a instruccions ampliades Intel AVX86-FP512 i el tipus _Float16 al backend de generació de codi per a l'arquitectura x16.
  • Per a l'arquitectura x86, s'ha afegit protecció contra les vulnerabilitats dels processadors causades per l'execució especulativa d'instruccions després d'operacions de salt endavant incondicionals. El problema es produeix a causa del processament preventiu d'instruccions immediatament després de la instrucció de branca a la memòria (SLS, Straight Line Speculation). Per habilitar la protecció, es proposa l'opció "-mharden-sls".
  • S'ha afegit detecció de l'ús de variables no inicialitzades a l'analitzador estàtic experimental. S'ha afegit suport inicial per analitzar el codi de muntatge a les insercions en línia. Seguiment de memòria millorat. S'ha reescrit el codi per processar les expressions de commutació.
  • S'han afegit 30 noves trucades a libgccjit, una biblioteca compartida per incrustar un generador de codi en altres processos i utilitzar-lo per compilar bytecode JIT al codi màquina.
  • El backend per generar bytecode BPF ha afegit suport per al mecanisme CO-RE (Compile Once - Run Everywhere), que us permet compilar el codi dels programes eBPF per al nucli de Linux només una vegada i utilitzar un carregador universal especial que adapta el programa carregat. al nucli actual i al format de tipus BPF). CO-RE resol el problema de la portabilitat dels programes eBPF compilats, que abans només es podien utilitzar en la versió del nucli per a la qual s'havien compilat, ja que la posició dels elements en les estructures de dades canvia de versió en versió.
  • El backend RISC-V afegeix suport per a noves extensions d'arquitectura de conjunt d'instruccions zba, zbb, zbc i zbs, així com extensions ISA per a operacions criptogràfiques vectorials i escalars. De manera predeterminada, es proporciona suport per a l'especificació RISC-V ISA 20191213. S'ha afegit el senyalador -mtune=thead-c906 per habilitar optimitzacions per als nuclis T-HEAD c906.
  • S'ha afegit suport per al tipus __int128_t/integer(kind=16) al backend de generació de codi per a les GPU AMD basades en la microarquitectura GCN. És possible utilitzar fins a 40 grups de treball per unitat de computació (CU) i fins a 16 fronts d'instruccions (front d'ona, un conjunt de fils executats en paral·lel pel motor SIMD) per grup. Anteriorment, només es permetia una vora d'instrucció per CU.
  • El backend NVPTX, dissenyat per generar codi mitjançant l'arquitectura de conjunt d'instruccions NVIDIA PTX (Parallel Thread Execution), ha afegit la possibilitat d'utilitzar les banderes "-march", "-mptx" i "-march-map". Suport implementat per a PTX ISA sm_53, sm_70, sm_75 i sm_80. L'arquitectura predeterminada és sm_30.
  • Les implementacions de les funcions integrades s'han reescrit al backend per als processadors PowerPC/PowerPC64/RS6000. Les funcions integrades __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar són document_set__tfiar i __builtin_set_tfhartin
  • El backend per a l'arquitectura ARM/AArch64 ha afegit suport per a Arm Ampere-1 (-mcpu/-mtune ampere1), Arm Cortex-A510 (cortex-a510), Arm Cortex-A710 (cortex-a710) i Arm Cortex-X2 ( còrtex- x2). S'ha afegit suport per a noves opcions d'arquitectura ARMv8 per utilitzar-les amb l'opció "-march": armv8.7-a, armv8.8-a, armv9-a. S'ha afegit la implementació de funcions C integrades al compilador (Intrínsecs) per a la càrrega atòmica i desar dades a la memòria, basant-se en l'ús d'instruccions ARM esteses (ls64). S'ha afegit suport per accelerar les funcions memcpy, memmove i memset mitjançant l'extensió ARM mopsoption.
  • S'ha afegit un nou mode de verificació "-fsanitize=shadow-call-stack" (ShadowCallStack), que actualment només està disponible per a l'arquitectura AArch64 i funciona quan es construeix codi amb l'opció "-ffixed-r18". El mode proporciona protecció contra la sobreescritura de l'adreça de retorn d'una funció en cas de desbordament de memòria intermèdia a la pila. L'essència de la protecció és desar l'adreça de retorn en una pila "ombra" separada després de transferir el control a una funció i recuperar aquesta adreça abans de sortir de la funció.

Font: opennet.ru

Afegeix comentari