Sortie de la suite de compilateurs LLVM 13.0

Après six mois de développement, la version du projet LLVM 13.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 de Clang 13.0 :

  • Implémentation du support des appels de queue garantis (appel d'un sous-programme à la toute fin d'une fonction, formant une récursion de queue si le sous-programme s'appelle lui-même). La prise en charge des appels de queue garantis est fournie par l'attribut "[[clang::musttail]]" en C++ et "__attribute__((musttail))" en C, utilisé dans une instruction "return". La fonctionnalité vous permet de mettre en œuvre des optimisations en déployant du code dans une itération plate pour économiser la consommation de la pile.
  • Les déclarations "using" et les extensions clang prennent en charge la définition d'attributs de style C++11 à l'aide du format "[[]]".
  • Ajout de l'indicateur "-Wreserved-identifier" pour afficher un avertissement lorsque vous spécifiez des identifiants réservés dans le code utilisateur.
  • Ajout des indicateurs "-Wunused-but-set-parameter" et "-Wunused-but-set-variable" pour afficher un avertissement si un paramètre ou une variable est défini mais n'est pas utilisé.
  • Ajout de l'indicateur "-Wnull-pointer-subtraction" pour émettre un avertissement si le code pourrait introduire un comportement indéfini en raison de l'utilisation d'un pointeur nul dans les opérations de soustraction.
  • Ajout de l'indicateur "-fstack-usage" pour générer pour chaque fichier de code un fichier ".su" supplémentaire contenant des informations sur la taille des frames de pile pour chaque fonction définie dans le fichier en cours de traitement.
  • Un nouveau type de sortie a été ajouté à l'analyseur statique - « sarif-html », qui conduit à la génération de rapports simultanément aux formats HTML et Sarif. Ajout d'une nouvelle vérification allocClassWithName. Lors de la spécification de l'option «-analyzer-display-progress», le temps d'analyse de chaque fonction est affiché. L'analyseur de pointeur intelligent (alpha.cplusplus.SmartPtr) est presque prêt.
  • Les capacités associées à la prise en charge d'OpenCL ont été étendues. Ajout de la prise en charge des nouvelles extensions cl_khr_integer_dot_product, cl_khr_extended_bit_ops, __cl_clang_bitfields et __cl_clang_non_portable_kernel_param_types. La mise en œuvre de la spécification OpenCL 3.0 s'est poursuivie. Pour C, la spécification OpenCL 1.2 est utilisée par défaut sauf si une autre version est explicitement sélectionnée. Pour C++, la prise en charge des fichiers avec l'extension « .clcpp » a été ajoutée.
  • La prise en charge des directives de transformation de boucle (« #pragma omp unrol » et « #pragma omp Tile ») définies dans la spécification OpenMP 5.1 a été implémentée.
  • Ajout d'options à l'utilitaire clang-format : SpacesInLineCommentPrefix pour définir le nombre d'espaces avant les commentaires, IndentAccessModifiers, LambdaBodyIndentation et PPIndentWidth pour contrôler l'alignement des entrées, des expressions lambda et des directives du préprocesseur. Les possibilités de tri de l'énumération des fichiers d'en-tête (SortIncludes) ont été étendues. Ajout de la prise en charge du formatage des fichiers JSON.
  • Une grande partie de nouveaux contrôles ont été ajoutés à linter clang-tidy.

Innovations clés de LLVM 13.0 :

  • Ajout de l'option « -ehcontguard » pour utiliser la technologie CET (Windows Control-flow Enforcement Technology) pour se protéger contre l'exécution d'exploits créés à l'aide des techniques de programmation orientée retour (ROP) au stade de la gestion des exceptions.
  • Le projet debuginfo-test a été renommé cross-project-tests et est conçu pour tester les composants de différents projets, sans se limiter aux informations de débogage.
  • Le système d'assemblage prend en charge la création de plusieurs distributions, par exemple, une avec des utilitaires et l'autre avec des bibliothèques pour les développeurs.
  • Dans le backend de l'architecture AArch64, la prise en charge des extensions Armv9-A RME (Realm Management Extension) et SME (Scalable Matrix Extension) est implémentée dans l'assembleur.
  • La prise en charge d'ISA V68/HVX a été ajoutée au backend de l'architecture Hexagon.
  • Le backend x86 a amélioré la prise en charge des processeurs AMD Zen 3.
  • Ajout de la prise en charge de l'APU GFX1013 RDNA2 au backend AMDGPU.
  • Libc++ continue d'implémenter de nouvelles fonctionnalités des standards C++20 et C++2b, y compris l'achèvement de la bibliothèque « concepts ». Ajout de la prise en charge de std::filesystem pour la plate-forme Windows basée sur MinGW. Fichiers d'en-tête séparés , Et . Ajout de l'option de construction LIBCXX_ENABLE_INCOMPLETE_FEATURES pour désactiver les fichiers d'en-tête dont les fonctionnalités ne sont pas entièrement implémentées.
  • Les capacités de l'éditeur de liens LLD ont été étendues, dans lesquelles la prise en charge des processeurs Big-endian Aarch64 est implémentée, et le backend Mach-O a été amené à un état permettant de lier des programmes réguliers. Améliorations incluses nécessaires pour lier la Glibc à l'aide de LLD.
  • L'utilitaire llvm-mca (Machine Code Analyzer) a ajouté la prise en charge des processeurs qui exécutent les instructions dans l'ordre (pipeline superscalaire dans l'ordre), comme l'ARM Cortex-A55.
  • Le débogueur LLDB pour la plate-forme AArch64 fournit une prise en charge complète de l'authentification par pointeur, des registres MTE (MemTag, Memory Tagging Extension) et SVE. Ajout de commandes qui permettent de lier des balises à chaque opération d'allocation de mémoire et d'organiser une vérification du pointeur lors de l'accès à la mémoire, qui doit être associée à la bonne balise.
  • Le débogueur LLDB et le frontend pour le langage Fortran - Flang ont été ajoutés aux assemblys binaires générés par le projet.

Source: opennet.ru

Ajouter un commentaire