Après six mois de développement, LLVM 22.1.0 est disponible. Ce projet développe des outils (compilateurs, optimiseurs et générateurs de code) qui compilent les programmes en bitcode intermédiaire d'instructions virtuelles de type RISC (une machine virtuelle de bas niveau dotée d'un système d'optimisation multiniveau). Le pseudocode généré peut être converti en code machine pour une plateforme cible donnée ou utilisé par un compilateur JIT (Just-In-Time) pour générer directement les instructions machine lors de l'exécution du programme. Basé sur les technologies LLVM, le projet développe le compilateur Clang, compatible avec les langages de programmation C, C++ et Objective-C. À partir de la branche 18.x, le projet a adopté une nouvelle numérotation des versions : la version 0 (« N.0 ») est utilisée pendant le développement, et la première version stable est numérotée « N.1 ».
Parmi les améliorations de Clang 22 :
- Ajout de la prise en charge des jetons d'allocation mémoire (Alloc Tokens) pour marquer les opérations d'allocation mémoire effectuées avec des fonctions telles que `malloc` à l'aide d'un identifiant unique. Les jetons d'allocation permettent de structurer les informations du tas, de simplifier la détection des fuites de mémoire et de regrouper les objets selon leur finalité ou leurs schémas de modification (par exemple, séparer les données fréquemment utilisées des données rarement utilisées). Pour activer cette fonctionnalité, utilisez l'option `-fsanitize=alloc-token`.
- Fonctionnalités liées au langage C :
- Une spécification préliminaire définissant le mécanisme d'exécution différée « defer » a été implémentée, permettant l'exécution d'actions à la sortie du contexte actuel. L'option « -fdefer-ts » a été ajoutée pour activer la prise en charge de « defer ».
- La fonction intégrée `__builtin_stack_address()` a été ajoutée, à l'instar de la fonction similaire de GCC. Cette fonction renvoie l'adresse de pile séparant la zone de pile de la fonction courante qui l'a appelée de celle des fonctions suivantes qu'elle appelle.
- Capacités en cours de développement pour la future norme C2y :
- Ajout de la prise en charge des boucles nommées, permettant d'attribuer des noms aux boucles et aux instructions switch. Ces noms peuvent être spécifiés dans les instructions break et continue afin de définir explicitement la boucle à quitter. `outer` : `for (int i = 0; i < IK; ++ i) { for (int j = 0; j < JK; ++ j) { continue; // aller à CONT1 continue outer; // aller à CONT2 // CONT1 } // CONT2 }`
- L'implémentation de la macro intégrée « __COUNTER__ », conçue pour générer des noms d'identificateurs uniques, a été étendue et intégrée à la norme. Le nombre d'appels à cette macro est limité à 2 147 483 647 ; tout dépassement de cette limite entraînera une erreur.
- Suppression de l'avertissement (-Wstatic-in-inline) lors de l'utilisation de fonctions ou de variables statiques à l'intérieur de fonctions déclarées comme « extern inline ».
- Capacités définies dans la norme C23 C :
- Le fichier d'en-tête float.h prend désormais en charge les macros FLT_SNAN, DBL_SNAN et LDBL_SNAN, qui implémentent les valeurs NaN signalées (provoquant une exception lorsqu'elles sont utilisées dans des opérations arithmétiques) pour les types float, double et long double.
- Correction d'un bug où différents types sans nom étaient considérés comme compatibles au sein d'une même unité de traduction s'ils possédaient les mêmes champs.
- L'option « -MG », utilisée pour ignorer les fichiers d'en-tête manquants lors de l'analyse des dépendances, a été étendue aux directives « #embed » et supprime désormais l'erreur « fichier introuvable » lorsqu'un fichier spécifié dans une directive « #embed » est manquant.
- Fonctionnalités liées à C++ :
- La possibilité d'utiliser des liaisons structurées dans le contexte « constexpr », tel que développé dans la spécification C++2c (C++26), a été ajoutée. Cela signifie que les références à des expressions constantes peuvent désormais être elles-mêmes des expressions constantes. La prise en charge est implémentée pour les tableaux et les structures simples (les tuples ne sont pas encore pris en charge). `constexpr int arr[] = {1, 2}; constexpr auto [x, y] = arr;`
- Conformément à la norme C++20, les contraintes sont désormais converties au format standard avant d'être vérifiées, ce qui permet d'obtenir des messages de diagnostic plus précis et une gestion correcte des erreurs de substitution dans les arguments de modèle utilisés uniquement dans les identifiants de concept.
- Ajout d'une famille de fonctions intégrées "__builtin_[lt|gt|le|ge]_synthesizes_from_spaceship" pour déterminer si les opérateurs de comparaison "<", ">", "<=", et ">=" ont été synthétisés à partir de l'opérateur "<=>".
- Le paramètre « -Wincompatible-pointer-types » a été modifié afin de générer une erreur au lieu d'un avertissement. Pour revenir au comportement précédent, utilisez l'option « -Wno-error=incompatible-pointer-types ».
- Ajout des fonctions intégrées __builtin_bswapg, __builtin_elementwise_ldexp, __builtin_elementwise_fshl, __builtin_elementwise_fshr, __builtin_elementwise_minnumnum, __builtin_elementwise_maxnumnum, __builtin_masked_load, __builtin_masked_expand_load, __builtin_masked_store, __builtin_masked_compress_store, __builtin_masked_gather, __builtin_masked_scatter et __builtin_dedup_pack. Par exemple, builtin_dedup_pack permet de supprimer les doublons d'une liste de types : using MyTypeList = TypeList<__builtin_dedup_pack …>; // le type résultant sera TypeList
- Lors du débogage de comportements indéfinis avec UBSan (-fsanitize=undefined -fsanitize-trap=undefined), les informations relatives à la cause de l'erreur sont désormais incluses dans les informations de débogage générées. L'option « -fsanitize-debug-trap-reasons » a été ajoutée pour spécifier le niveau de détail des informations d'erreur. Elle peut être définie sur « basic » pour des descriptions générales (par exemple, « Dépassement de capacité lors de l'addition d'entiers ») et sur « detailed » pour inclure des informations détaillées (par exemple, « Dépassement de capacité lors de l'addition d'entiers signés dans 'a + b' »).
- Ajout de nouveaux indicateurs du compilateur :
- "-f[no-]sanitize-debug-trap-reasons" permet de contrôler si les raisons des interceptions d'exceptions sont intégrées aux informations de débogage lors de la compilation en mode "-fsanitize-trap".
- "-fsanitize=alloc-token", "-falloc-token-max", "-fsanitize-alloc-token-fast-abi", et "-fsanitize-alloc-token-extended" pour gérer les jetons d'allocation de mémoire.
- "-fmatrix-memory-layout" permet de contrôler la disposition en mémoire des types de matrices (par exemple, column-major pour column-major, row-major pour row-major).
- Les fonctions possèdent désormais un attribut « malloc_span », similaire à l'attribut malloc mais applicable aux fonctions qui renvoient des structures de type span contenant un pointeur et un champ avec la taille ou un pointeur vers la fin du bloc.
- Ajout de l'attribut « modular_format » pour sélectionner dynamiquement l'implémentation statique requise de la fonction printf lors de la liaison.
- Les outils de diagnostic et d'analyse statique ont été développés, de nouveaux contrôles ont été ajoutés (plusieurs dizaines d'améliorations liées au diagnostic).
- Des fonctions intrinsèques supplémentaires pour les extensions SSE, AVX et AVX512 ont été ajoutées au backend x86. Des modes de compilation ont été ajoutés pour les processeurs Intel basés sur les microarchitectures Wildcat Lake (-march=wildcatlake) et Nova Lake (-march=novalake).
- Le backend AArch64 prend désormais en charge les processeurs Ampere Computing Ampere1C (ampere1c), Arm C1-Nano (c1-nano), Arm C1-Pro (c1-pro), Arm C1-Premium (c1-premium) et Arm C1-Ultra (c1-ultra). Des fonctions intégrées supplémentaires ont été ajoutées pour les instructions FCVTZ[US], FCVTN[US], FCVTM[US], FCVTP[US] et FCVTA[US]. La gestion des versions multiples des fonctions (FMV) a été stabilisée. Les utilisateurs peuvent désormais modifier la priorité des différentes versions de fonctions.
- Ajout de la prise en charge de l'architecture LoongArch32 (LA32R, LA32S).
- Amélioration des backends pour les architectures ARM, AMDGPU, RISC-V, LoongArch64, MIPS, WebAssembly et PowerPC.
Source: opennet.ru
