Sortie de la suite de compilateurs LLVM 16.0

Après six mois de développement, la version du projet LLVM 16.0 a été présentée - une boîte à outils compatible GCC (compilateurs, optimiseurs et générateurs de code) qui compile les programmes en bitcode intermédiaire d'instructions virtuelles de type RISC (une machine virtuelle de bas niveau avec un système d'optimisation multi-niveaux). Le pseudocode généré peut être converti à l'aide d'un compilateur JIT en instructions machine directement au moment de l'exécution du programme.

Améliorations majeures de Clang 16.0 :

  • La norme C++/ObjC++ par défaut est gnu++17 (anciennement gnu++14), ce qui signifie que les fonctionnalités C++17 avec extensions GNU sont prises en charge par défaut. Pour renvoyer le comportement précédent, vous pouvez utiliser l'option "-std=gnu++14".
  • Implémentation de fonctionnalités avancées liées au standard C++20 :
    • Fonctions membres spéciales conditionnellement triviales,
    • capturer des liaisons structurées dans les fonctions lambda,
    • Opérateur d'égalité à l'intérieur des expressions,
    • Possibilité d'omettre le mot-clé typename dans certains contextes,
    • Initialisation d'agrégat valide entre parenthèses (« Aggr(val1, val2) »).
  • Les fonctionnalités définies dans le futur standard C++2b ont été implémentées :
    • Il est permis de placer des étiquettes à la fin des expressions composées,
    • opérateur statique(),
    • opérateur statique[],
    • La compatibilité avec le type char8_t est assurée,
    • La plage de caractères autorisés à être utilisés dans "\N{...}" a été étendue
    • Ajout de la possibilité d'utiliser des variables déclarées comme "constexpr statique" dans les fonctions déclarées comme constexpr.
  • Les fonctionnalités définies dans le futur standard C C2x ont été implémentées :
    • Pour désactiver l'avertissement "-Wunused-label", l'attribut "[[maybe_unused]]" peut être appliqué aux étiquettes
    • Il est permis de placer des étiquettes n'importe où dans les expressions composées,
    • Ajout des opérateurs typeof et typeof_unqual,
    • Un nouveau type nullptr_t et une constante nullptr pour définir des pointeurs nuls qui peuvent se convertir en n'importe quel type de pointeur et représenter une variante de NULL qui n'est pas liée aux types entier et vide*.
    • En mode C2x, l'appel de la macro va_start avec un nombre variable d'arguments (variadique) est autorisé.
  • Dans les modes de conformité C99, C11 et C17, les options par défaut « -Wimplicit-function-declaration » et « -Wimplicit-int » produisent désormais une erreur au lieu d'un avertissement.
  • L'utilisation indirecte de "void *" (par exemple "void func(void *p) { *p; }") en mode C++ génère désormais une erreur, similaire à ISO C++, GCC, ICC et MSVC.
  • La spécification de champs de bits comme opérandes d'instruction (par exemple "__asm ​​​​{ mov eax, s.bf }") dans les blocs d'assemblage en ligne de style Microsoft génère désormais une erreur.
  • Ajout de diagnostics pour la présence de différentes structures et unions portant les mêmes noms dans différents modules.
  • Les capacités associées à la prise en charge d'OpenCL et d'OpenMP ont été étendues. Diagnostics améliorés pour les modèles C++ utilisés dans les arguments du noyau OpenCL. Prise en charge améliorée des blocs de file d’attente pour AMDGPU. L'attribut nounwind est implicitement ajouté à toutes les fonctions. Prise en charge améliorée des fonctions intégrées.
  • Ajout de la possibilité d'utiliser la variable d'environnement CLANG_CRASH_DIAGNOSTICS_DIR pour définir le répertoire dans lequel les données de diagnostic de crash sont enregistrées.
  • La prise en charge d'Unicode a été mise à jour vers la spécification Unicode 15.0. Certains symboles mathématiques sont autorisés dans les identifiants, tels que "₊" (par exemple "double xₖ₊₁").
  • Ajout de la prise en charge du chargement de plusieurs fichiers de configuration (les fichiers de configuration par défaut sont chargés en premier, puis ceux spécifiés via l'indicateur « --config= », qui peut désormais être spécifié plusieurs fois). Modification de l'ordre de chargement par défaut des fichiers de configuration : clang essaie de charger le fichier en premier - .cfg, et s'il n'est pas trouvé, il essaie de charger deux fichiers .cfg et .cfg. Pour désactiver le chargement des fichiers de configuration par défaut, l'indicateur « --no-default-config » a été ajouté.
  • Pour garantir des builds reproductibles, il est possible de remplacer les valeurs de date et d'heure actuelles dans les macros __DATE__, __TIME__ et __TIMESTAMP__ par l'heure spécifiée dans la variable d'environnement SOURCE_DATE_EPOCH.
  • Pour vérifier la présence de fonctions intégrées (builtin) pouvant être utilisées dans le contexte de constantes, la macro « __has_constexpr_builtin » a été ajoutée.
  • Ajout d'un nouvel indicateur de compilation "-fcoro-aligned-allocation" pour l'allocation de trames de coroutine alignée.
  • L'indicateur « -fstrict-flex-arrays= » implémente la prise en charge du troisième niveau de vérification des éléments de tableau flexibles dans les structures (Flexible Array Members, un tableau de taille indéfinie à la fin de la structure). Au troisième niveau, seule la taille "[]" (par exemple, "int b[]") est traitée comme un tableau flexible, mais la taille "[0]" (par exemple, "int b[0]") n'est pas.
  • Ajout de l'indicateur "-fmodule-output" pour activer le modèle de compilation monophasé pour les modules C++ standard.
  • Ajout du mode « -Rpass-analysis=stack-frame-layout » pour aider à diagnostiquer les problèmes de disposition du cadre de pile.
  • Ajout d'un nouvel attribut __attribute__((target_version("cpu_features"))) et extension de la fonctionnalité de l'attribut __attribute__((target_clones("cpu_features1","cpu_features2",...))) pour sélectionner des versions spécifiques des fonctionnalités fournies par AArch64 Processeurs.
  • Outils de diagnostic élargis :
    • Ajout de l'avertissement "-Wsingle-bit-bitfield-constant-conversion" pour détecter la troncature implicite lors de l'attribution d'un champ de bits signé à un seul bit.
    • Les diagnostics des variables constexpr non initialisées ont été étendus.
    • Ajout des avertissements « -Wcast-function-type-strict » et « -Wincompatible-function-pointer-types-strict » pour identifier les problèmes potentiels avec la conversion de type de fonction.
    • Ajout de diagnostics pour l'utilisation de noms de modules incorrects ou réservés dans les blocs d'exportation.
    • Détection améliorée des mots-clés « auto » manquants dans les définitions.
    • L'implémentation de l'avertissement "-Winteger-overflow" a ajouté des contrôles pour des situations supplémentaires conduisant à des débordements.
  • Implémentation du support de l'architecture du jeu d'instructions LoongArch (-march=loongarch64 ou -march=la464), utilisée dans les processeurs Loongson 3 5000 et implémentant le nouveau RISC ISA, similaire à MIPS et RISC-V.

Innovations clés de LLVM 16.0 :

  • Le code LLVM est autorisé à utiliser des éléments définis dans la norme C++17.
  • Les exigences environnementales pour la construction de LLVM ont été augmentées. Les outils de build devraient désormais prendre en charge le standard C++17, c'est-à-dire Pour créer, vous avez besoin d'au moins GCC 7.1, Clang 5.0, Apple Clang 10.0 ou Visual Studio 2019 16.7.
  • Le backend de l'architecture AArch64 ajoute la prise en charge des processeurs Cortex-A715, Cortex-X3 et Neoverse V2, l'assembleur pour RME MEC (Memory Encryption Contexts), les extensions Armv8.3 (Complex Number) et Function Multi Versioning.
  • Dans le backend de l'architecture ARM, la prise en charge des plates-formes cibles Armv2, Armv2A, Armv3 et Armv3M a été interrompue, pour lesquelles la génération du code correct n'était pas garantie. Ajout de la possibilité de générer du code pour les instructions permettant de travailler avec des nombres complexes.
  • Le backend de l'architecture X86 a ajouté la prise en charge des architectures de jeu d'instructions (ISA) AMX-FP16, CMPCCXADD, AVX-IFMA, AVX-VNNI-INT8, AVX-NE-CONVERT. Ajout de la prise en charge des instructions RDMSRLIST, RMSRLIST et WRMSRNS. Options implémentées "-mcpu=raptorlake", "-mcpu=meteorlake", "-mcpu=emeraldrapids", "-mcpu=sierraforest", "-mcpu=graniterapids" et "-mcpu=grandridge".
  • Ajout du support officiel pour la plateforme LoongArch.
  • Backends améliorés pour les architectures MIPS, PowerPC et RISC-V
  • Ajout de la prise en charge du débogage des exécutables 64 bits pour l'architecture LoongArch au débogueur LLDB. Gestion améliorée des symboles de débogage COFF. Filtrage fourni des DLL en double dans la liste des modules Windows chargés.
  • Dans la bibliothèque Libc++, le travail principal s'est concentré sur l'implémentation du support des nouvelles fonctionnalités des standards C++20 et C++23.
  • L'éditeur de liens LDD réduit considérablement le temps de liaison en parallélisant les opérations d'analyse de relocalisation d'adresse et d'initialisation de section. Ajout de la prise en charge de la compression de section à l'aide de l'algorithme ZSTD.

Source: opennet.ru

Ajouter un commentaire