Sortie de la suite de compilateurs GCC 12

Après un an de développement, la suite de compilateurs gratuite GCC 12.1 est sortie, la première version significative de la nouvelle branche GCC 12.x. Conformément au nouveau schéma de numérotation des versions, la version 12.0 a été utilisée dans le processus de développement, et peu avant la sortie de GCC 12.1, la branche GCC 13.0 avait déjà bifurqué, sur la base de laquelle la prochaine version majeure, GCC 13.1, serait être formé. Le 23 mai, le projet fêtera les 35 ans de la création de la première édition de GCC.

Les principaux changements:

  • Ajout de la prise en charge du format de débogage CTF (Compact Type Format), qui fournit un stockage compact d'informations sur les types C, les connexions entre les fonctions et les symboles de débogage. Lorsqu'il est intégré dans des objets ELF, le format permet l'utilisation de tables de caractères EFL pour éviter la duplication des données.
  • La prise en charge du format de stockage des informations de débogage « STABS », créé dans les années 1980, est obsolète.
  • Les travaux se poursuivent pour étendre la prise en charge des futures normes C2X et C++23 pour les langages C et C++. Par exemple, la prise en charge de l'expression « if consteval » a été ajoutée ; autorisé à utiliser auto dans les arguments de fonction (« f(auto(g())) »); l'utilisation de variables non littérales, goto et labels est autorisée dans les fonctions déclarées comme constexpr ; ajout de la prise en charge des opérateurs d'index multidimensionnels Operator[] ; dans if, for et switch, les capacités des blocs d'initialisation ont été étendues (« for (using T = int; T e : v) »).
  • La bibliothèque standard C++ a amélioré la prise en charge des sections expérimentales des normes C++20 et C++23. Ajout de la prise en charge de std::move_only_function, , std::basic_string::resize_and_overwrite, , et std::invoke_r. Autorisé à utiliser std::unique_ptr, std::vector, std::basic_string, std::optional et std::variant dans les fonctions constexpr.
  • L'interface Fortran fournit une prise en charge complète de la spécification TS 29113, qui décrit les capacités permettant d'assurer la portabilité entre le code Fortran et C.
  • Ajout de la prise en charge de l'extension __builtin_shufflevector(vec1, vec2, index1, index2, ...) précédemment ajoutée à Clang, qui propose un seul appel pour effectuer des opérations de mélange et de mélange de vecteurs courantes.
  • Lors de l'utilisation du niveau d'optimisation "-O2", la vectorisation est activée par défaut (les modes -ftree-vectorize et -fvect-cost-model=very-cheap sont activés). Le modèle très bon marché permet la vectorisation uniquement si le code vectoriel peut remplacer complètement le code scalaire en cours de vectorisation.
  • Ajout du mode "-ftrivial-auto-var-init" pour permettre l'initialisation explicite des variables sur la pile afin de suivre les problèmes et de bloquer les vulnérabilités associées à l'utilisation de variables non initialisées.
  • Pour les langages C et C++, une fonction intégrée __builtin_dynamic_object_size a été ajoutée pour déterminer la taille d'un objet, compatible avec une fonction similaire de Clang.
  • Pour les langages C et C++, le support de l'attribut « indisponible » a été ajouté (vous pouvez par exemple marquer les fonctions qui généreront une erreur si vous essayez de les utiliser).
  • Pour les langages C et C++, la prise en charge des directives de prétraitement « #elifdef » et « #elifndef » a été ajoutée.
  • Ajout de l'indicateur "-Wbidi-chars" pour afficher un avertissement si les caractères UTF-8 sont utilisés de manière incorrecte, modifiant ainsi l'ordre dans lequel le texte bidirectionnel est affiché.
  • Ajout de l'indicateur "-Warray-compare" pour afficher un avertissement lors de la tentative de comparaison de deux opérandes faisant référence à des tableaux.
  • La mise en œuvre des standards OpenMP 5.0 et 5.1 (Open Multi-Processing), qui définissent l'API et les méthodes d'application des méthodes de programmation parallèle sur les systèmes multicœurs et hybrides (CPU+GPU/DSP) à mémoire partagée et unités de vectorisation (SIMD) , a continué.
  • Implémentation améliorée de la spécification de programmation parallèle OpenACC 2.6, qui définit des outils de déchargement des opérations sur les GPU et les processeurs spécialisés tels que NVIDIA PTX.
  • La prise en charge des instructions étendues Intel AVX86-FP512 et du type _Float16 a été ajoutée au backend de génération de code pour l'architecture x16.
  • Pour l'architecture x86, une protection a été ajoutée contre les vulnérabilités des processeurs causées par l'exécution spéculative d'instructions après des opérations de saut avant inconditionnelles. Le problème se produit en raison du traitement préemptif des instructions qui suivent immédiatement l'instruction de branchement en mémoire (SLS, Straight Line Speculation). Pour activer la protection, l'option « -mharden-sls » est proposée.
  • Ajout de la détection de l'utilisation de variables non initialisées à l'analyseur statique expérimental. Ajout de la prise en charge initiale de l'analyse du code assembleur dans les insertions en ligne. Suivi de la mémoire amélioré. Le code de traitement des expressions switch a été réécrit.
  • Ajout de 30 nouveaux appels à libgccjit, une bibliothèque partagée permettant d'intégrer un générateur de code dans d'autres processus et de l'utiliser pour compiler JIT du bytecode en code machine.
  • La prise en charge du mécanisme CO-RE (Compile Once - Run Everywhere) a été ajoutée au backend pour générer du bytecode BPF, ce qui vous permet de compiler une seule fois le code des programmes eBPF pour le noyau Linux et d'utiliser un chargeur universel spécial qui adapte le programme chargé au noyau actuel et au format de types BPF). CO-RE résout le problème de la portabilité des programmes eBPF compilés, qui auparavant ne pouvaient être utilisés que dans la version du noyau pour laquelle ils ont été compilés, puisque la position des éléments dans les structures de données change d'une version à l'autre.
  • Le backend RISC-V ajoute la prise en charge des nouvelles extensions d'architecture de jeu d'instructions zba, zbb, zbc et zbs, ainsi que des extensions ISA pour les opérations cryptographiques vectorielles et scalaires. Par défaut, la prise en charge de la spécification RISC-V ISA 20191213 est fournie. L'indicateur -mtune=thead-c906 a été ajouté pour permettre les optimisations pour les cœurs T-HEAD c906.
  • La prise en charge du type __int128_t/integer(kind=16) a été ajoutée au backend de génération de code pour les GPU AMD basés sur la microarchitecture GCN. Il est possible d'utiliser jusqu'à 40 groupes de travail par unité de calcul (CU) et jusqu'à 16 fronts d'instructions (front d'onde, un ensemble de threads exécutés en parallèle par le moteur SIMD) par groupe. Auparavant, un seul front d'instruction par CU était autorisé.
  • Le backend NVPTX, conçu pour générer du code à l'aide de l'architecture de jeu d'instructions NVIDIA PTX (Parallel Thread Execution), a ajouté la possibilité d'utiliser les indicateurs « -march », « -mptx » et « -march-map ». Prise en charge implémentée pour PTX ISA sm_53, sm_70, sm_75 et sm_80. L'architecture par défaut est sm_30.
  • Dans le backend des processeurs PowerPC / PowerPC64 / RS6000, les implémentations des fonctions intégrées ont été réécrites. Les fonctions intégrées __builtin_get_texasr, __builtin_get_texasru, __builtin_get_tfhar, __builtin_get_tfiar, __builtin_set_texasr, __builtin_set_texasru, __builtin_set_tfhar et __builtin_set_tfiar sont documentées.
  • Prise en charge d'Arm Ampere-64 (-mcpu/-mtune ampere1), Arm Cortex-A1 (cortex-a510), Arm Cortex-A510 (cortex-a710) et Arm Cortex-X710 (cortex-x2). Ajout de la prise en charge des nouvelles options d'architecture ARMv2 à utiliser avec l'option "-march" : armv8-a, armv8.7-a, armv8.8-a. Ajout de l'implémentation de fonctions C intégrées au compilateur (Intrinsics) pour le chargement atomique et la sauvegarde des données en mémoire, basées sur l'utilisation d'instructions ARM étendues (ls9). Ajout de la prise en charge de l'accélération des fonctions memcpy, memmove et memset à l'aide de l'extension ARM mopsoption.
  • Ajout d'un nouveau mode de vérification « -fsanitize=shadow-call-stack » (ShadowCallStack), qui n'est actuellement disponible que pour l'architecture AArch64 et fonctionne lors de la construction de code avec l'option « -ffixed-r18 ». Le mode offre une protection contre l'écrasement de l'adresse de retour d'une fonction en cas de débordement de tampon sur la pile. L'essence de la protection est de sauvegarder l'adresse de retour dans une pile « fantôme » distincte après avoir transféré le contrôle à une fonction et de récupérer cette adresse avant de quitter la fonction.

Source: opennet.ru

Ajouter un commentaire