Sortie de la suite de compilateurs LLVM 10.0

Après six mois de développement soumis lancement du projet LLVM 10.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 10.0 incluent la prise en charge des concepts C++, l'exécution de Clang en tant que processus distinct, la prise en charge des vérifications CFG (Control Flow Guard) pour Windows et la prise en charge de nouvelles fonctionnalités de processeur.

Améliorations dans Clang 10.0 :

  • Ajout de la prise en charge de "les concepts", une extension de modèle C++ qui sera incluse dans le prochain standard, nommée C++2a (activée par l'indicateur -std=c++2a).
    Les concepts vous permettent de définir un ensemble d'exigences en matière de paramètres de modèle qui, au moment de la compilation, limitent l'ensemble d'arguments pouvant être acceptés en tant que paramètres de modèle. Les concepts peuvent être utilisés pour éviter les incohérences logiques entre les propriétés des types de données utilisés dans le modèle et les propriétés des types de données des paramètres d'entrée.

    modèle
    concept EqualityComparable = nécessite (T a, T b) {
    { a == b } -> std :: booléen ;
    { a != b } -> std::boolean;
    };

  • Par défaut, le lancement d'un processus distinct (« clang -cc1 ») dans lequel la compilation est effectuée est arrêté. La compilation est désormais effectuée dans le processus principal, et l'option "-fno-integrated-cc1" peut être utilisée pour restaurer l'ancien comportement.
  • Nouveaux modes de diagnostic :
    • "-Wc99-designator" et "-Wreorder-init-list" mettent en garde contre l'utilisation des initialiseurs C99 en mode C++ dans les cas où ils sont corrects en C99 mais pas en C++20.
    • "-Wsizeof-array-div" - détecte des situations telles que "int arr[10] ; …sizeof(arr) / sizeof(short)… » (doit être « sizeof(arr) / sizeof(int) »).
    • "-Wxor-used-as-po" - met en garde contre l'utilisation de constructions telles que l'utilisation de l'opérateur "^" (xor) dans des opérations qui peuvent être confondues avec l'exponentiation (2^16).
    • "-Wfinal-dtor-non-final-class" - avertit des classes qui ne sont pas marquées avec le spécificateur "final", mais qui ont un destructeur avec l'attribut "final".
    • "-Wtautological-bitwise-compare" est un groupe d'avertissements permettant de diagnostiquer les comparaisons tautologiques entre une opération au niveau du bit et une constante, et d'identifier les comparaisons toujours vraies dans lesquelles l'opération OU au niveau du bit est appliquée à un nombre non négatif.
    • "-Wbitwise-conditional-parenthèses" avertit des problèmes lors du mélange des opérateurs logiques AND (&) et OR (|) avec l'opérateur conditionnel (?:).
    • "-Wmisleading-indentation" est un analogue de la vérification du même nom de GCC, qui avertit des expressions indentées comme si elles faisaient partie d'un bloc if/else/for/while, mais en fait elles ne sont pas incluses dans ce bloc .
    • Lors de la spécification de « -Wextra », la vérification « -Wdeprecated-copy » est activée, avertissant de l'utilisation de constructeurs
      "move" et "copy" dans les classes avec une définition explicite du destructeur.

    • Les vérifications "-Wtautological-overlap-compare", "-Wsizeof-pointer-div", "-Wtautological-compare", "-Wrange-loop-analysis" ont été étendues.
    • Les vérifications "-Wbitwise-op-parenthèses" et "-Wlogical-op-parenthèses" sont désactivées par défaut.
  • Dans le code C et C++, les opérations arithmétiques de pointeur ne sont autorisées que dans les tableaux. Le désinfectant de comportement non défini en mode "-fsanitize=pointer-overflow" détecte désormais des cas tels que l'ajout d'un décalage non nul à un pointeur nul ou la création d'un pointeur nul lors de la soustraction d'un entier d'un pointeur non nul.
  • Le mode "-fsanitize=implicit-conversion" (Implicit Conversion Sanitizer) est adapté pour identifier les problèmes liés aux opérations d'incrémentation et de décrémentation pour les types dont la taille en bits est inférieure à celle du type "int".
  • Lors de la sélection des architectures cibles x86 "-march=skylake-avx512", "-march=icelake-client", "-march=icelake-server", "-march=cascadelake" et "-march=cooperlake" par défaut dans le format vectoriel. le code a cessé d'utiliser les registres zmm de 512 bits, à l'exception de leur indication directe dans le code source. La raison en est que la fréquence du processeur diminue lors de l'exécution d'opérations 512 bits, ce qui peut affecter négativement les performances globales. Pour modifier le nouveau comportement, l'option "-mprefer-vector-width=512" est fournie.
  • Le comportement de l'indicateur "-flax-vector-conversions" est similaire à celui de GCC : les conversions implicites de bits vectoriels entre vecteurs entiers et vecteurs à virgule flottante sont interdites. Pour éliminer cette limitation, il est proposé d'utiliser le drapeau
    "-flax-vector-conversions=all" qui est la valeur par défaut.

  • Prise en charge améliorée des processeurs MIPS de la famille Octeon. Ajout de "octeon+" à la liste des types de CPU valides.
  • Lors de l'assemblage dans le code intermédiaire WebAssembly, l'optimiseur wasm-opt est automatiquement appelé, s'il est disponible dans le système.
  • Pour les systèmes basés sur l'architecture RISC-V, l'utilisation de registres stockant des valeurs à virgule flottante est autorisée dans les blocs conditionnels des insertions en ligne de l'assembleur.
  • Ajout de nouveaux indicateurs du compilateur : "-fgnuc-version" pour définir la valeur de version pour "__GNUC__" et les macros similaires ; "-fmacro-prefix-map=OLD=NEW" pour remplacer le préfixe de répertoire OLD par NEW dans les macros telles que "__FILE__" ; "-fpatchable-function-entry=N[,M]" pour générer un certain nombre d'instructions NOP avant et après le point d'entrée de la fonction. Pour RISC-V
    ajout de la prise en charge des indicateurs "-ffixed-xX", "-mcmodel=medany" et "-mcmodel=medlow".

  • Ajout de la prise en charge de l'attribut '__attribute__((target("branch-protection=..."))) , dont l'effet est similaire à l'option -mbranche-protection.
  • Sur la plate-forme Windows, lors de la spécification de l'indicateur « -cfguard », la substitution des contrôles d'intégrité du flux d'exécution (Control Flow Guard) aux appels de fonction indirects est implémentée. Pour désactiver la substitution de vérification, vous pouvez utiliser l'indicateur « -cfguard-nochecks » ou le modificateur « __declspec(guard(nocf)) ».
  • Le comportement de l'attribut gnu_inline est similaire à celui de GCC dans les cas où il est utilisé sans le mot-clé "extern".
  • Les capacités associées à la prise en charge d'OpenCL et de CUDA ont été étendues. Ajout de la prise en charge des nouvelles fonctionnalités d'OpenMP 5.0.
  • Une option Standard a été ajoutée à l'utilitaire clang-format, qui vous permet de déterminer la version du standard C++ utilisée lors de l'analyse et du formatage du code (Latest, Auto, c++03, c++11, c++14, c++17, c++20).
  • De nouveaux contrôles ont été ajoutés à l'analyseur statique : alpha.cplusplus.PlacementNew pour déterminer s'il y a suffisamment d'espace de stockage, fuchsia.HandleChecker pour détecter les fuites liées aux gestionnaires Fuchsia, security.insecureAPI.decodeValueOfObjCType pour détecter d'éventuels débordements de tampon lors de l'utilisation de [NSCoder decodeValueOfObjCType :à:] .
  • L'UBSan (Undefined Behaviour Sanitizer) a étendu ses contrôles de débordement de pointeur pour détecter l'application de décalages non nuls aux pointeurs NULL ou l'ajout résultant d'un décalage de pointeur NULL.
  • En linter clang-bien rangé ajoutée une grande partie des nouveaux chèques.

principal les innovations LLVM 10.0 :

  • Vers le cadre Attributeur De nouvelles optimisations et analyseurs interprocéduraux ont été ajoutés. L'état de 19 attributs différents est prédit, dont 12 attributs 12 LLVM IR et 7 attributs abstraits tels que la vivacité.
  • Ajout de nouvelles fonctions mathématiques matricielles intégrées au compilateur (Intrinsèque), qui sont remplacées par des instructions vectorielles efficaces lors de la compilation.
  • De nombreuses améliorations ont été apportées aux backends des architectures X86, AArch64, ARM, SystemZ, MIPS, AMDGPU et PowerPC. Prise en charge du processeur ajoutée
    Cortex-A65, Cortex-A65AE, Neoverse E1 et Neoverse N1. Pour ARMv8.1-M, ​​​​le processus de génération de code a été optimisé (par exemple, la prise en charge des boucles avec une surcharge minimale est apparue) et la prise en charge de l'autovectorisation a été ajoutée à l'aide de l'extension MVE. Prise en charge améliorée du processeur MIPS Octeon. Pour PowerPC, la vectorisation des sous-programmes mathématiques à l'aide de la bibliothèque MASSV (Mathematical Acceleration SubSystem) est activée, la génération de code est améliorée et l'accès à la mémoire à partir des boucles est optimisé. Pour x86, la gestion des types de vecteurs v2i32, v4i16, v2i16, v8i8, v4i8 et v2i8 a été modifiée.

  • Générateur de code amélioré pour WebAssembly. Ajout de la prise en charge des instructions TLS (Thread-Local Storage) et atomic.fence. La prise en charge SIMD a été considérablement étendue. Les fichiers objets WebAssembly ont désormais la possibilité d'utiliser des signatures de fonctions à valeurs multiples.
  • L'analyseur est utilisé lors du traitement des boucles MémoireSSA, qui permet de définir des dépendances entre différentes opérations mémoire. MemorySSA peut réduire le temps de compilation et d'exécution ou peut être utilisé à la place d'AliasSetTracker sans perte de performances.
  • Le débogueur LLDB a considérablement amélioré la prise en charge du format DWARF v5. Prise en charge améliorée de la construction avec MinGW
    et ajout de la capacité initiale de déboguer les exécutables Windows pour les architectures ARM et ARM64. Ajout de descriptions des options proposées lors de la saisie semi-automatique en appuyant sur la touche de tabulation.

  • Étendu Capacités de l’éditeur de liens LLD. Prise en charge améliorée du format ELF, notamment en garantissant une compatibilité totale des modèles glob avec l'éditeur de liens GNU, en ajoutant la prise en charge des sections de débogage compressées ".zdebug", en ajoutant la propriété PT_GNU_PROPERTY pour définir la section .note.gnu.property (peut être utilisée à l'avenir noyaux Linux),
    Les modes « -z noseparate-code », « -z Separate-code » et « -z Separate-loadable-segments » ont été implémentés. Prise en charge améliorée de MinGW et WebAssembly.

Source: opennet.ru

Ajouter un commentaire