Sortie de la suite de compilateurs LLVM 12.0

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

  • La prise en charge des attributs « probable » et « improbable » proposés dans la norme C++20 a été implémentée et activée par défaut, permettant à l'optimiseur d'être informé de la probabilité de déclenchement de la construction conditionnelle (par exemple, « [[probable » ]] if (aléatoire > 0) {“).
  • Ajout de la prise en charge des processeurs AMD Zen 3 (-march=znver3), Intel Alder Lake (-march=alderlake) et Intel Sapphire Rapids (-march=sapphirerapids).
  • Ajout de la prise en charge des indicateurs "-march=x86-64-v[234]" pour sélectionner les niveaux d'architecture x86-64 (v2 - couvre les extensions SSE4.2, SSSE3, POPCNT et CMPXCHG16B ; v3 - AVX2 et MOVBE ; v4 - AVX-512 ) .
  • Ajout de la prise en charge des processeurs Arm Cortex-A78C (cortex-a78c), Arm Cortex-R82 (cortex-r82), Arm Neoverse V1 (neoverse-v1), Arm Neoverse N2 (neoverse-n2) et Fujitsu A64FX (a64fx). Par exemple, pour activer les optimisations pour les processeurs Neoverse-V1, vous pouvez spécifier « -mcpu=neoverse-v1 ».
  • Pour l'architecture AArch64, de nouveaux indicateurs du compilateur "-moutline-atomics" et "-mno-outline-atomics" ont été ajoutés pour activer ou désactiver les fonctions d'aide aux opérations atomiques, telles que "__aarch64_cas8_relax". De telles fonctions détectent au moment de l'exécution si la prise en charge LSE (Large System Extensions) est disponible et utilisent les instructions du processeur atomique fournies ou utilisent les instructions LL/SC (Load-link/store-conditional) pour la synchronisation.
  • Ajout de l'option "-fbinutils-version" pour sélectionner la version cible de la suite binutils pour la compatibilité avec les anciens comportements de l'éditeur de liens et de l'assembleur.
  • Pour les fichiers exécutables ELF, lorsque l'indicateur "-gz" est spécifié, la compression des informations de débogage à l'aide de la bibliothèque zlib est activée par défaut (gz=zlib). La liaison des fichiers objets résultants nécessite lld ou GNU binutils 2.26+. Pour restaurer la compatibilité avec les anciennes versions de binutils, vous pouvez spécifier "-gz=zlib-gnu".
  • Le pointeur 'this' est désormais traité avec des vérifications non nulles et déréférençables (N). Pour supprimer l'attribut non nul lorsque vous devez utiliser des valeurs NULL, vous pouvez utiliser l'option "-fdelete-null-pointer-checks".
  • Sur la plateforme Linux, le mode "-fasynchronous-unwind-tables" est activé pour les architectures AArch64 et PowerPC pour générer des tables d'appels de déroulement, comme dans GCC.
  • Dans "#pragma clang loop vectorize_width", ajout de la possibilité de spécifier les options "fixe" (par défaut) et "évolutive" pour sélectionner la méthode de vectorisation. Le mode « évolutif », indépendant de la longueur du vecteur, est expérimental et peut être utilisé sur du matériel prenant en charge la vectorisation évolutive.
  • Prise en charge améliorée de la plate-forme Windows : des assemblages binaires officiels pour Windows sur les systèmes Arm64 ont été préparés, notamment le compilateur Clang, l'éditeur de liens LLD et les bibliothèques d'exécution du compilateur-rt. Lors de la construction pour les plates-formes cibles MinGW, le suffixe .exe est ajouté, même lors de la compilation croisée.
  • Les capacités associées à la prise en charge d'OpenCL, OpenMP et CUDA ont été étendues. Ajout des options "-cl-std=CL3.0" et "-cl-std=CL1.0" pour sélectionner les options de macro pour OpenCL 3.0 et OpenCL 1.0. Les outils de diagnostic ont été élargis.
  • Ajout de la prise en charge des instructions HRESET, UINTR et AVXVNNI implémentées dans certains processeurs x86.
  • Sur les systèmes x86, la prise en charge de l'option "-mtune=" est activée ", qui active les optimisations microarchitecturales sélectionnées, quelle que soit la valeur de "-march= "
  • L'analyseur statique a amélioré le traitement de certaines fonctions POSIX et la détermination considérablement améliorée du résultat des opérations conditionnelles lorsqu'il y a plusieurs valeurs symboliques dans la comparaison. De nouveaux contrôles ont été ajoutés : fuchia.HandleChecker (définit les handles dans les structures), webkit.UncountedLambdaCapturesChecker webkit et alpha.webkit.UncountedLocalVarsChecker (prend en compte les particularités du travail avec des pointeurs dans le code du moteur WebKit).
  • Dans les expressions utilisées dans le contexte des constantes, l'utilisation des fonctions intégrées __builtin_bitreverse*, __builtin_rotateleft*, __builtin_rotateright*, _mm_popcnt*, _bit_scan_forward, __bsfd, __bsfq, __bit_scan_reverse, __bsrd, __bsrq, __bswap, __bswapd, __bswap64, est autorisée. __bswapq , _castf*, __rol* et __ror*.
  • Ajout d'une option BitFieldColonSpacing à l'utilitaire clang-format pour sélectionner l'espacement autour des identifiants, des colonnes et des définitions de champs.
  • Le serveur de mise en cache Clangd (Clang Server) sur la plate-forme Linux a considérablement réduit la consommation de mémoire lors d'un fonctionnement à long terme (des appels périodiques à malloc_trim sont fournis pour renvoyer les pages de mémoire libres au système d'exploitation).

Innovations clés de LLVM 12.0 :

  • La prise en charge de l'outil de construction llvm-build écrit en Python a été interrompue et le projet est désormais complètement passé à l'utilisation du système de construction CMake.
  • Dans le backend de l'architecture AArch64, la prise en charge de la plate-forme Windows a été améliorée : la génération correcte de la sortie de l'assembleur pour les systèmes Windows cibles a été assurée, la génération de données sur les appels de déroulement a été optimisée (la taille de ces données a été réduite de 60 %), la possibilité de créer des données de déroulement à l'aide de l'assembleur a été ajoutée aux directives .seh_*.
  • Le backend de l'architecture PowerPC propose de nouvelles optimisations pour les boucles et le déploiement en ligne, une prise en charge étendue des processeurs Power10, une prise en charge supplémentaire des instructions MMA pour la manipulation matricielle et une prise en charge améliorée du système d'exploitation AIX.
  • Le backend x86 ajoute la prise en charge des processeurs AMD Zen 3, Intel Alder Lake et Intel Sapphire Rapids, ainsi que des instructions des processeurs HRESET, UINTR et AVXVNNI. Prise en charge de MPX (Memory Protection Extensions) pour vérifier les pointeurs afin de garantir que les limites de mémoire ne sont plus prises en charge (cette technologie n'est pas répandue et a déjà été supprimée de GCC et de clang). Ajout de la prise en charge à l'assembleur des préfixes {disp32} et {disp8} et des suffixes .d32 et .d8 pour contrôler la taille des décalages et des sauts d'opérandes. Ajout d'un nouvel attribut "tune-cpu" pour contrôler l'inclusion des optimisations microarchitecturales.
  • Un nouveau mode « -fsanitize=unsigned-shift-base » a été ajouté au détecteur de problèmes d'entiers (entier sanitizer, « -fsanitize=integer ») pour détecter les débordements d'entiers non signés après un léger décalage vers la gauche.
  • Dans divers détecteurs (asan, cfi, lsan, msan, tsan, ubsan sanitizer), la prise en charge des distributions Linux avec la bibliothèque Musl standard a été ajoutée.
  • Les capacités de l'éditeur de liens LLD ont été étendues. Prise en charge améliorée du format ELF, y compris les options ajoutées « --dependency-file », « -error-handling-script », « -lto-pseudo-probe-for-profiling », « -no-lto-whole-program -visibilité” " Prise en charge améliorée de MinGW. Pour le format Mach-O (macOS), la prise en charge des architectures arm64, arm et i386, les optimisations du temps de liaison (LTO) et le déroulement de la pile pour la gestion des exceptions ont été implémentés.
  • Libc++ implémente de nouvelles fonctionnalités du standard C++20 et a commencé le développement des fonctionnalités de la spécification C++2b. Ajout de la prise en charge de la construction avec désactivation de la localisation (« -DLIBCXX_ENABLE_LOCALIZATION=OFF ») et des dispositifs de génération de nombres pseudo-aléatoires (« -DLIBCXX_ENABLE_RANDOM_DEVICE=OFF »).

Source: opennet.ru

Ajouter un commentaire