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 dans Clang 13.0 :
- Les appels de fin garantis (appel d'une sous-routine à la toute fin d'une fonction, créant une récursivité de fin si la sous-routine s'appelle elle-même) sont pris en charge. Ces appels sont pris en charge grâce à l'attribut « [[clang::musttail]] » en C++ et à l'attribut « __attribute__((musttail)) » en C, utilisé dans l'expression « return ». Cette fonctionnalité permet des optimisations par le dépliage du code en une itération plate afin d'économiser de l'espace sur la pile.
- Les définitions d'attributs de style C++11 sont désormais prises en charge dans les déclarations et extensions « using » de clang, en utilisant le format « [[]] ».
- Ajout de l'indicateur « -Wreserved-identifier » pour générer un avertissement lors de la spécification d'identifiants réservés dans le code utilisateur.
- Ajout des indicateurs « -Wunused-but-set-parameter » et « -Wunused-but-set-variable » pour générer un avertissement si un paramètre ou une variable est défini mais non utilisé.
- Ajout de l'indicateur « -Wnull-pointer-subtraction » pour générer un avertissement si le code peut conduire à 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 trames 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 génère des rapports aux formats HTML et Sarif. Une nouvelle vérification a été ajoutée : allocClassWithName. En spécifiant l'option « -analyzer-display-progress », le temps d'analyse de chaque fonction est affiché. L'analyseur de pointeurs intelligents (alpha.cplusplus.SmartPtr) est presque prêt.
- Fonctionnalités étendues liées à la prise en charge d'OpenCL. 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. Poursuite de l'implémentation de la spécification OpenCL 3.0. Pour le C, la spécification OpenCL 1.2 est utilisée par défaut, sauf si une autre version est explicitement sélectionnée. Pour le C++, prise en charge des fichiers portant l'extension « .clcpp ».
- 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.
- L'utilitaire clang-format a été mis à jour avec les options suivantes : SpacesInLineCommentPrefix pour déterminer le nombre d'espaces avant les commentaires, IndentAccessModifiers, LambdaBodyIndentation et PPIndentWidth pour contrôler l'alignement des enregistrements, les expressions lambda et les directives du préprocesseur. La possibilité de trier la liste des fichiers d'en-tête (SortIncludes) a été étendue. La prise en charge du formatage des fichiers JSON a été ajoutée.
- Un grand nombre de nouveaux contrôles ont été ajoutés au linter clang-tidy.
Innovations clés de LLVM 13.0 :
- Добавлена опция «-ehcontguard» для использования технологии CET (Windows Control-flow Enforcement Technology) для защиты на этапе обработки исключений от выполнения эксплоитов, построенных с использованием приёмов возвратно-ориентированного программирования (ROP, Return-Oriented Programming).
- Le projet debuginfo-test a été renommé cross-project-tests et est conçu pour tester des composants de différents projets, sans se limiter aux informations de débogage.
- Le système de construction prend en charge la construction de plusieurs distributions, par exemple, une avec des utilitaires et l'autre avec des bibliothèques pour les développeurs.
- Le backend de l'architecture AArch64 implémente la prise en charge des extensions Armv9-A RME (Realm Management Extension) et SME (Scalable Matrix Extension) en assembleur.
- La prise en charge 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++ продолжена реализация новых возможностей стандартов C++20 и C++2b, в том числе завершена реализация библиотеки «concepts». Для платформы Windows на базе MinGW добавлена поддержка std::filesystem. Разделены заголовочные файлы <algorithm>, <iterator> и <utility>. Добавлена сборочная опция LIBCXX_ENABLE_INCOMPLETE_FEATURES для отключения заголовочных файлов с не полностью реализованной функциональностью.
- L'éditeur de liens LLD a été étendu pour prendre en charge les processeurs Aarch64 big-endian, et le backend Mach-O a été amélioré pour permettre la liaison de programmes standard. Les améliorations nécessaires à la liaison de Glibc avec LLD sont incluses.
- L'utilitaire llvm-mca (Machine Code Analyzer) a été mis à jour pour prendre en charge les processeurs de pipeline superscalaires dans l'ordre tels que l'ARM Cortex-A55.
- Le débogueur LLDB pour la plateforme AArch64 prend désormais entièrement en charge l'authentification par pointeur, le mécanisme MTE (MemTag, Memory Tagging Extension) et les registres SVE. Des commandes ont été ajoutées pour associer des balises à chaque opération d'allocation mémoire et pour vérifier le pointeur lors de l'accès à la mémoire, qui doit être associé à une balise valide.
- Le débogueur LLDB et le frontend Fortran Flang ont été ajoutés aux assemblys binaires générés par le projet.
Source: opennet.ru
