Sortie de la suite de compilateurs LLVM 11.0

Après six mois de développement soumis lancement du projet LLVM 11.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.

Le changement clé dans la nouvelle version a été l'inclusion de Nervure, interface pour le langage Fortran. Flang prend en charge Fortran 2018, OpenMP 4.5 et OpenACC 3.0, mais le développement du projet n'est pas encore terminé et le front-end se limite à l'analyse du code et à la vérification de son exactitude. La génération de code intermédiaire LLVM n'est pas encore prise en charge et pour générer des fichiers exécutables, du code canonique est généré et transmis à un compilateur Fortran externe.

Améliorations dans Clang 11.0 :

  • Ajout de la possibilité de restaurer l'arbre de syntaxe abstraite (AST) pour le code C++ défectueux, qui peut être utilisé pour aider à diagnostiquer les erreurs et fournit des informations supplémentaires aux utilitaires externes tels que clang-tidy et clangd. La fonctionnalité est activée par défaut pour le code C++ et est contrôlée via les options "-Xclang -f[no-]recovery-ast".
  • Ajout de nouveaux modes de diagnostic :
    • « -Wpointer-to-int-cast » est un groupe d'avertissements concernant la conversion de pointeurs vers un type entier int qui ne prend pas en charge toutes les valeurs possibles.
    • « -Wuninitialized-const-reference » - avertissement concernant le passage de variables non initialisées dans les paramètres de fonction qui acceptent les arguments de référence avec l'attribut « const ».
    • "-Wimplicit-const-int-float-conversion" - activé par défaut, avertissement concernant la conversion implicite d'une constante réelle en un type entier.
  • Pour la plateforme ARM, des fonctions C intégrées au compilateur sont fournies (Intrinsèque), remplacé par des instructions vectorielles efficaces Arm v8.1-M MVE et CDE. Les fonctions disponibles sont définies dans les fichiers d'en-tête arm_mve.h et arm_cde.h.
  • Добавлен un ensemble de types entiers étendus _ExtInt(N), vous permettant de créer des types qui ne sont pas des multiples de puissances de deux, qui peuvent être traités efficacement sur FPGA/HLS. Par exemple, _ExtInt(7) définit un type entier composé de 7 bits.
  • Ajout de macros qui définissent la prise en charge des fonctions C intégrées basées sur les instructions ARM SVE (Scalable Vector Extension) :
    __ARM_FEATURE_SVE, __ARM_FEATURE_SVE_BF16,
    __ARM_FEATURE_SVE_MATMUL_FP32, __ARM_FEATURE_SVE_MATMUL_FP64,
    __ARM_FEATURE_SVE_MATMUL_INT8,
    __ARM_FEATURE_SVE2, __ARM_FEATURE_SVE2_AES,
    __ARM_FEATURE_SVE2_BITPERM,
    __ARM_FEATURE_SVE2_SHA3,
    __ARM_FEATURE_SVE2_SM4. Par exemple, la macro __ARM_FEATURE_SVE est définie lors de la génération du code AArch64 en définissant l'option de ligne de commande "-march=armv8-a+sve".

  • Le flag "-O" est désormais identifié avec le mode d'optimisation "-O1" au lieu de "-O2".
  • Ajout de nouveaux indicateurs du compilateur :
    • "-fstack-clash-protection" - active la protection contre intersections de pile et de tas.
    • "-ffp-exception-behavior={ignore,maytrap,strict}" - vous permet de sélectionner le mode de gestion d'exceptions pour les nombres à virgule flottante.
    • "-ffp-model={precise,strict,fast}" - Simplifie l'accès à une série d'options spécialisées pour les nombres à virgule flottante.
    • "-fpch-codegen" et "-fpch-debuginfo" pour générer un en-tête précompilé (PCH) avec des fichiers objets séparés pour le code et les informations de débogage.
    • « -fsanitize-coverage-allowlist » et « -fsanitize-coverage-blocklist » pour vérifier les listes blanches et noires des tests de couverture.
    • « -mtls-size={12,24,32,48} » pour sélectionner la taille TLS (thread-local storage).
    • "-menable-experimental-extension" pour activer les extensions RISC-V expérimentales.
  • Le mode par défaut pour C est "-fno-common", qui permet un accès plus efficace aux variables globales sur certaines plateformes.
  • Le cache du module par défaut a été déplacé de /tmp vers le répertoire ~/.cache. Pour remplacer, vous pouvez utiliser l'indicateur « -fmodules-cache-path= ».
  • La norme du langage C par défaut a été mise à jour de gnu11 à gnu17.
  • Ajout du support préliminaire pour l'extension GNU C "asm en ligne» pour ajouter des inserts assembleur. L'extension est toujours en cours d'analyse, mais n'est en aucun cas traitée.
  • Les capacités associées à la prise en charge d'OpenCL et de CUDA ont été étendues. Ajout de la prise en charge des diagnostics de bloc OpenCL 2.0 et implémentation de nouvelles fonctionnalités OpenMP 5.0.
  • Ajout de l'option IndentExternBlock à l'utilitaire de format clang pour l'alignement dans les blocs extern "C" et extern "C++".
  • L'analyseur statique a amélioré la gestion des constructeurs hérités en C++. Ajout de nouveaux contrôles alpha.core.C11Lock et alpha.fuchsia.Lock pour vérifier les verrous, alpha.security.cert.pos.34c pour détecter l'utilisation dangereuse de putenv, webkit.NoUncountedMemberChecker et webkit.RefCntblBaseVirtualDtor pour détecter les problèmes avec d'innombrables types, alpha .cplusplus .SmartPtr pour vérifier le déréférencement du pointeur intelligent nul.
  • En linter clang-bien rangé ajoutée une grande partie des nouveaux chèques.
  • Le serveur de mise en cache clangd (Clang Server) a amélioré les performances et ajouté de nouvelles capacités de diagnostic.

principal les innovations LLVM 11.0 :

  • Le système de construction a été basculé vers Python 3. Si Python 3 n'est pas disponible, il est possible de revenir à Python 2.
  • Le frontal avec le compilateur pour le langage Go (llgo) est exclu de la version, qui pourrait être restructurée à l'avenir.
  • L'attribut vector-function-abi-variant a été ajouté à la représentation intermédiaire (IR) pour décrire le mappage entre les fonctions scalaires et vectorielles pour vectoriser les appels. À partir de llvm::VectorType, il existe deux types de vecteurs distincts, llvm::FixedVectorType et llvm::ScalableVectorType.
  • Le branchement basé sur les valeurs udef et la transmission des valeurs undef aux fonctions de bibliothèque standard sont reconnus comme un comportement indéfini. DANS
    memset/memcpy/memmove permet de passer des pointeurs undef, mais si le paramètre de taille est nul.

  • LLJIT a ajouté la prise en charge de l'exécution d'initialisations statiques via les méthodes LLJIT::initialize et LLJIT::deinitialize. La possibilité d'ajouter des bibliothèques statiques à JITDylib à l'aide de la classe StaticLibraryDefinitionGenerator a été implémentée. Ajout de l'API C pour ORCv2 (API pour créer des compilateurs JIT).
  • La prise en charge des processeurs Cortex-A64, Cortex-A34, Cortex-A77 et Cortex-X78 a été ajoutée au backend de l'architecture AArch1. Implémentation des extensions ARMv8.2-BF16 (BFloat16) et ARMv8.6-A, notamment RMv8.6-ECV (Enhanced Counter Virtualization), ARMv8.6-FGT (Fine Grained Traps), ARMv8.6-AMU (Virtualisation des moniteurs d'activité) et ARMv8.0-DGH (indice de collecte de données). La possibilité de générer du code pour les liaisons de fonctions intégrées aux instructions vectorielles SVE est fournie.
  • La prise en charge des processeurs Cortex-M55, Cortex-A77, Cortex-A78 et Cortex-X1 a été ajoutée au backend de l'architecture ARM. Extensions implémentées
    Multiplication matricielle Armv8.6-A et RMv8.2-AA32BF16 BFloat16.

  • La prise en charge de la génération de code pour les processeurs POWER10 a été ajoutée au backend de l'architecture PowerPC. Les optimisations de boucles ont été étendues et la prise en charge des virgules flottantes a été améliorée.
  • Le backend de l'architecture RISC-V permet l'acceptation de correctifs prenant en charge des jeux d'instructions étendus expérimentaux qui n'ont pas encore été officiellement approuvés.
  • Le backend de l'architecture AVR a été transféré de la catégorie expérimentale à stable, inclus dans la distribution de base.
  • Le backend pour l'architecture x86 prend en charge les instructions Intel AMX et TSXLDTRK. Protection supplémentaire contre les attaques LVI (Load Value Injection), et implémente également un mécanisme général de suppression des effets secondaires d'exécution spéculative pour bloquer les attaques provoquées par l'exécution spéculative d'opérations sur le processeur.
  • Dans le backend de l'architecture SystemZ, la prise en charge de MemorySanitizer et LeakSanitizer a été ajoutée.
  • Ajout de la prise en charge du fichier d'en-tête avec des constantes mathématiques dans Libc++ .
  • Étendu Capacités de l’éditeur de liens LLD. Prise en charge améliorée du format ELF, y compris les options ajoutées "--lto-emit-asm", "--lto-whole-program-visibility", "-print-archive-stats", "-shuffle-sections", " -thinlto-single-module", "-unique", "-rosegment", "-threads=N". Ajout de l'option "--time-trace" pour enregistrer la trace dans un fichier, qui peut ensuite être analysé via l'interface chrome://tracing dans Chrome.

Source: opennet.ru

Ajouter un commentaire