Sortie de la suite de compilateurs LLVM 15.0

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

  • Pour les systèmes basés sur l'architecture x86, l'indicateur « -fzero-call-used-regs » a été ajouté, qui garantit que tous les registres CPU utilisés dans la fonction sont réinitialisés à zéro avant de rendre le contrôle à la fonction. Cette option vous permet de vous protéger contre les fuites d'informations provenant des fonctions et de réduire d'environ 20 % le nombre de blocs adaptés à la création de gadgets ROP (Return-Oriented Programming) dans les exploits.
  • La randomisation du placement mémoire des structures pour le code C a été implémentée, ce qui complique l'extraction des données des structures en cas d'exploitation de vulnérabilités. La randomisation est activée et désactivée à l'aide des attributs randomize_layout et no_randomize_layout, et nécessite la définition d'une graine à l'aide de l'indicateur "-frandomize-layout-seed" ou "-frandomize-layout-seed-file".
  • Ajout de l'indicateur "-fstrict-flex-arrays=" ", avec lequel vous pouvez contrôler les limites d'un élément de tableau flexible dans les structures (Flexible Array Members, un tableau de taille indéfinie à la fin de la structure). Lorsqu'il est défini sur 0 (par défaut), le dernier élément de la structure avec un tableau est toujours traité comme un tableau flexible, 1 - seules les tailles [], [0] et [1] sont traitées comme un tableau flexible, 2 - uniquement les tailles [] et [0] sont traités comme un tableau flexible.
  • Ajout d'un support expérimental pour le langage de type C HLSL (High-Level Shader Language), utilisé dans DirectX pour écrire des shaders.
  • Ajout de "-Warray-parameter" pour avertir du remplacement de fonctions avec des déclarations d'arguments incompatibles associées aux tableaux de longueur fixe et variable.
  • Compatibilité améliorée avec MSVC. Ajout de la prise en charge de la « fonction #pragma » (demande au compilateur de générer un appel de fonction au lieu d'une expansion en ligne) et de « #pragma alloc_text » (définit le nom de la section avec le code de fonction) fournis dans MSVC. Ajout de la prise en charge des indicateurs /JMC et /JMC compatibles MSVC.
  • Les travaux se poursuivent pour prendre en charge les futures normes C2X et C++23. Pour le langage C, sont implémentés : l'attribut noreturn, les mots-clés false et true, le type _BitInt(N) pour les entiers d'une profondeur de bits donnée, les macros *_WIDTH, le préfixe u8 pour les caractères codés en UTF-8.

    Pour C++, les éléments suivants sont implémentés : fusion de modules, isolation ABI des membres de fonction, initialisation dynamique ordonnée de variables non locales dans les modules, opérateurs d'index multidimensionnels, auto(x), variables non littérales, goto et étiquettes dans les fonctions déclarées comme constexpr. , séquences d'échappement délimitées, nommées caractères d'échappement.

  • Les capacités associées à la prise en charge d'OpenCL et d'OpenMP ont été étendues. Ajout de la prise en charge de l'extension OpenCL cl_khr_subgroup_rotate.
  • Pour l'architecture x86, une protection a été ajoutée contre les vulnérabilités des processeurs causées par l'exécution spéculative d'instructions après des opérations de saut avant inconditionnelles. Le problème se produit en raison du traitement préemptif des instructions qui suivent immédiatement l'instruction de branchement en mémoire (SLS, Straight Line Speculation). Pour activer la protection, l'option « -mharden-sls=[none|all|return|indirect-jmp] » est proposée.
  • Pour les plates-formes prenant en charge l'extension SSE2, le type _Float16 a été ajouté, qui est émulé à l'aide du type float en cas de manque de prise en charge des instructions AVX512-FP16.
  • Ajout du drapeau "-m[no-]rdpru" pour contrôler l'utilisation de l'instruction RDPRU, prise en charge à partir des processeurs AMD Zen2.
  • Ajout de l'indicateur "-mfunction-return=thunk-extern" pour se protéger contre la vulnérabilité RETBLEED, qui fonctionne en ajoutant une séquence d'instructions qui exclut l'implication du mécanisme d'exécution spéculative pour les branches indirectes.

Innovations clés de LLVM 15.0 :

  • Ajout de la prise en charge des architectures CPU Cortex-M85, Armv9-A, Armv9.1-A et Armv9.2-A, extensions Armv8.1-M PACBTI-M.
  • Un backend expérimental pour DirectX a été ajouté et prend en charge le format DXIL (DirectX Intermediate Language) utilisé pour les shaders DirectX. Le backend est activé en spécifiant le paramètre « -DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX » lors de l'assemblage.
  • Libc++ continue d'implémenter de nouvelles fonctionnalités des standards C++20 et C++2b, notamment l'achèvement de l'implémentation de la bibliothèque « format » et la proposition de version expérimentale de la bibliothèque « ranges ».
  • Backends améliorés pour les architectures x86, PowerPC et RISC-V.
  • Les capacités de l'éditeur de liens LLD et du débogueur LLDB ont été améliorées.

Source: opennet.ru

Ajouter un commentaire