Sortie de la suite de compilateurs LLVM 9.0

Après six mois de développement soumis lancement du projet LLVM 9.0 — Outils compatibles GCC (compilateurs, optimiseurs et générateurs de code), compilant des programmes en bitcode intermédiaire d'instructions virtuelles de type RISC (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.

Les nouvelles fonctionnalités de LLVM 9.0 incluent la suppression de la balise de conception expérimentale de la plate-forme cible RISC-V, la prise en charge C++ d'OpenCL, la possibilité de diviser un programme en parties chargées dynamiquement dans LLD et la mise en œuvre du «asm va à", utilisé dans le code du noyau Linux. libc++ a ajouté la prise en charge de WASI (WebAssembly System Interface) et LLD a ajouté la prise en charge initiale de la liaison dynamique WebAssembly.

Améliorations dans Clang 9.0 :

  • Ajouté par implémentation de l'expression spécifique à GCC "asm va à“, qui permet de passer d’un bloc assembleur en ligne à une étiquette en code C. Cette fonctionnalité est requise pour construire le noyau Linux en mode « CONFIG_JUMP_LABEL=y » à l'aide de Clang sur les systèmes avec une architecture x86_64. Compte tenu des modifications ajoutées dans les versions précédentes, le noyau Linux peut désormais être construit en Clang pour l'architecture x86_64 (auparavant, seule la construction pour les architectures arm, aarch64, ppc32, ppc64le et mips était prise en charge). De plus, les projets Android et ChromeOS ont déjà été convertis pour utiliser Clang pour la création de noyaux, et Google teste Clang comme plate-forme principale de création de noyaux pour ses systèmes Linux de production. À l'avenir, d'autres composants LLVM pourront être utilisés dans le processus de construction du noyau, notamment LLD, llvm-objcopy, llvm-ar, llvm-nm et llvm-objdump ;
  • Ajout d'un support expérimental pour l'utilisation de C++17 dans OpenCL. Les fonctionnalités spécifiques incluent la prise en charge des attributs d'espace d'adressage, le blocage de la conversion de l'espace d'adressage par les opérateurs de transtypage, la fourniture de types vectoriels comme dans OpenCL pour C, la présence de types OpenCL spécifiques pour les images, les événements, les canaux, etc.
  • Ajout de nouveaux indicateurs du compilateur « -ftime-trace » et « -ftime-trace-granularity=N » pour générer un rapport sur le temps d'exécution des différentes étapes du frontend (analyse, initialisation) et du backend (étapes d'optimisation). Le rapport est enregistré au format json, compatible avec chrome://tracing et speedscope.app ;
  • Ajout du traitement du spécificateur « __declspec(allocator) » et génération des informations de débogage associées qui vous permettent de surveiller la consommation de mémoire dans l'environnement Visual Studio ;
  • Pour le langage C, la prise en charge de la macro « __FILE_NAME__ » a été ajoutée, qui ressemble à la macro « __FILE__ », mais inclut uniquement le nom du fichier sans le chemin complet ;
  • C++ a étendu la prise en charge des attributs d'espace d'adressage pour couvrir diverses fonctionnalités C++, notamment les modèles de paramètres et d'arguments, les types de référence, l'inférence de type de retour, les objets, les fonctions générées automatiquement, les opérateurs intégrés, etc.
  • Les capacités associées à la prise en charge d'OpenCL, OpenMP et CUDA ont été étendues. Cela inclut la prise en charge initiale de l'inclusion implicite des fonctions OpenCL intégrées (l'indicateur « -fdeclare-opencl-builtins » a été ajouté), l'extension cl_arm_integer_dot_product a été implémentée et les outils de diagnostic ont été étendus ;
  • Le travail de l'analyseur statique a été amélioré et une documentation sur la réalisation d'une analyse statique a été ajoutée. Ajout d'indicateurs pour afficher les modules de vérification disponibles et les options prises en charge (« -analyzer-checker[-option]-help », « -analyzer-checker[-option]-help-alpha » et « -analyzer-checker[-option]-help " -développeur"). Ajout de l'indicateur "-analyzer-werror" pour traiter les avertissements comme des erreurs.
    Ajout de nouveaux modes de vérification :

    • security.insecureAPI.DeprecatedOrUnsafeBufferHandling pour identifier les pratiques dangereuses pour travailler avec des tampons ;
    • osx.MIGChecker pour rechercher les violations des règles d'appel MIG (Mach Interface Generator) ;
    • optin.osx.OSObjectCStyleCast pour rechercher les conversions d'objets XNU libkern incorrectes ;
    • apiModeling.llvm avec un ensemble de fonctions de vérification de modélisation pour détecter les erreurs dans la base de code LLVM ;
    • Code stabilisé pour vérifier les objets C++ non initialisés (UninitializedObject dans le package optin.cplusplus) ;
  • L'utilitaire clang-format a ajouté la prise en charge du formatage du code dans le langage C# et prend en charge le style de formatage du code utilisé par Microsoft ;
  • clang-cl, une interface de ligne de commande alternative qui offre une compatibilité au niveau des options avec le compilateur cl.exe inclus dans Visual Studio, a ajouté une heuristique pour traiter les fichiers inexistants comme des options de ligne de commande et afficher un avertissement correspondant (par exemple, lors de l'exécution de "clang-cl /diagnostic :caret /c test.cc");
  • Une grande partie de nouvelles vérifications ont été ajoutées à linter clang-tidy, y compris des vérifications supplémentaires spécifiques à l'API OpenMP ;
  • Étendu capacités du serveur clangd (Clang Server), dans lequel le mode de création d'index en arrière-plan est activé par défaut, la prise en charge des actions contextuelles avec du code a été ajoutée (récupération de variables, extension des définitions automatiques et macros, conversion des chaînes échappées en chaînes non échappées), la possibilité d'afficher avertissements de Clang-tidy, diagnostics étendus des erreurs dans les fichiers d'en-tête et ajout de la possibilité d'afficher des informations sur la hiérarchie des types ;

principal les innovations LLVM 9.0 :

  • Une fonctionnalité de partitionnement expérimentale a été ajoutée à l'éditeur de liens LLD, qui vous permet de diviser un programme en plusieurs parties, chacune se trouvant dans un fichier ELF distinct. Cette fonctionnalité vous permet de lancer la partie principale du programme, qui chargera d'autres composants selon les besoins pendant le fonctionnement (par exemple, vous pouvez séparer la visionneuse PDF intégrée en un fichier séparé, qui ne se chargera que lorsque l'utilisateur ouvrira le PDF. déposer).

    Éditeur de liens LLD apporté à un état adapté à la liaison du noyau Linux pour les architectures arm32_7, arm64, ppc64le et x86_64.
    Nouvelles options "-" (sortie vers la sortie standard), "-[no-]allow-shlib-undefined", "-undefined-glob", "-nmagic", "-omagic", "-dependent-library", " - z ifunc-noplt" et "-z common-page-size". Pour l'architecture AArch64, la prise en charge des instructions BTI (Branch Target Indicator) et PAC (Pointer Authentication Code) a été ajoutée. La prise en charge des plates-formes MIPS, RISC-V et PowerPC a été considérablement améliorée. Ajout de la prise en charge initiale des liens dynamiques pour WebAssembly ;

  • En libc++ mis en œuvre les fonctions ssize, std::is_constant_evaluated, std::midpoint et std::lerp, les méthodes "front" et "back" ont été ajoutées à std::span, les attributs de types std::is_unbounded_array et std::is_bounded_array ont été ajoutés , les capacités std ont été étendues : :atomic. La prise en charge de GCC 4.9 a été interrompue (peut être utilisée avec GCC 5.1 et les versions plus récentes). Prise en charge ajoutée ÉTAIS-JE (WebAssembly System Interface, une interface permettant d'utiliser WebAssembly en dehors du navigateur) ;
  • De nouvelles optimisations ont été ajoutées. Activation de la conversion des appels memcmp en bcmp dans certaines situations. Implémentation de l'omission de la vérification de plage pour les tables de sauts dans lesquelles les blocs de commutation inférieurs sont inaccessibles ou lorsque les instructions ne sont pas utilisées, par exemple lors de l'appel de fonctions de type void ;
  • Le backend de l'architecture RISC-V a été stabilisé, qui n'est plus positionné comme expérimental et est construit par défaut. Fournit une prise en charge complète de la génération de code pour les variantes du jeu d'instructions RV32I et RV64I avec les extensions MAFDC ;
  • De nombreuses améliorations ont été apportées aux backends des architectures X86, AArch64, ARM, SystemZ, MIPS, AMDGPU et PowerPC. Par exemple, pour l'architecture
    AArch64 a ajouté la prise en charge des instructions SVE2 (Scalable Vector Extension 2) et MTE (Memory Tagging Extensions) ; dans le backend ARM, la prise en charge de l'architecture Armv8.1-M et de l'extension MVE (M-Profile Vector Extension) a été ajoutée. La prise en charge de l'architecture GFX10 (Navi) a été ajoutée au backend AMDGPU, les capacités d'appel de fonctions sont activées par défaut et un pass combiné est activé DPP (Primitives parallèles aux données).

  • Le débogueur LLDB dispose désormais d'une surbrillance des couleurs pour les traces arrière et d'une prise en charge supplémentaire des blocs DWARF4 debug_types et DWARF5 debug_info ;
  • La prise en charge des fichiers objets et exécutables au format COFF a été ajoutée aux utilitaires llvm-objcopy et llvm-strip.

Source: opennet.ru

Ajouter un commentaire