LLVM 15.0 inclut également un certain nombre de mises à jour intéressantes de C/C++.
Après six mois de développement, Annonce de la sortie du projet LLVM 15.0dans lequel beaucoup de changements majeurs ont été apportés, ainsi qu'une prise en charge supplémentaire des nouveaux processeurs, architectures, etc.
Pour ceux qui ne connaissent pas LLVM, vous devez savoir que cela est un compilateur compatible GCC (compilateurs, optimiseurs et générateurs de code) qui compile les programmes dans un bitcode intermédiaire d'instruction virtuelle de type RISC (une machine virtuelle de bas niveau avec un système d'optimisation à plusieurs niveaux).
Le pseudocode généré peut être converti par le compilateur JIT en instructions machine juste au moment de l'exécution du programme.
Nouvelles fonctionnalités majeures de LLVM 15.0
Dans cette nouvelle version qui est présentée, il est mis en évidence que le prise en charge des processeurs Cortex-M85, ainsi que pour les architectures Armv9-A, Armv9.1-A et Armv9.2-A, les extensions Armv8.1-M PACBTI-M.
Un autre changement qui ressort est que ajout d'un backend DirectX expérimental Quoi prend en charge le format DXIL (DirectX Intermediate Language) utilisé pour les shaders DirectX. Le backend est activé via l'option de build "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX".
libc++ continue d'implémenter de nouvelles fonctionnalités des standards C++20 et C++2b, y compris l'achèvement de l'implémentation de la bibliothèque "format" et la version expérimentale proposée de la bibliothèque "ranges".
Pour la partie des modifications liées à Clang 15.0, il est mentionné que ajout de la prise en charge expérimentale du langage de type C HLSL (High-Level Shading Language), qui est utilisé pour écrire des shaders à partir de DirectX 9, ainsi que pour traduire les shaders HLSL au format binaire DXIL (DirectX Intermediate Language) compatible DirectX 12, ainsi qu'au format SPIR -V utilisé par Vulkan. Dans le futur, prévoient d'implémenter la prise en charge du format DXBC (Bytecode DirectX) utilisé dans DirectX 9-11. L'implémentation est fournie par Microsoft et est basée sur le compilateur DirectX Shader, sorti en 2017, construit sur la base de LLVM 3.7.
Il est également mentionné qu'il continue avec le travailler pour prendre en charge les futures normes C2X et C++23. Implémentés pour le langage C : l'attribut noreturn, les mots clés false et true, le type _BitInt(N) pour les entiers d'une résolution donnée, les macros *_WIDTH, le préfixe u8 pour les caractères UTF-8.
En plus de cela, a été implémenté pour C++ : fusion de modules, Isolation ABI des membres de la fonction, initialisation dynamique ordonnée des variables non locales dans le module, 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, caractères d'échappement nommés.
Pour les systèmes basés sur l'architecture x86, ajout du drapeau "-fzero-call-used-regs", qui fournit la remise à zéro de tous les registres CPU utilisés dans la fonction avant de rendre le contrôle de la fonction. cette option protège contre les fuites de données de fonctions et de réduire d'environ 20 % le nombre de blocs adaptés à la création de dispositifs ROP (Return Oriented Programming) dans les exploits.
La randomisation de l'emplacement de la mémoire a été implémentée des structures pour le code C, 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 avec les attributs randomize_layout et no_randomize_layout, et nécessite que la graine soit définie avec l'indicateur "-frandomize-layout-seed" ou "-frandomize-layout-seed-file" pour garantir des versions reproductibles.
Des autres changements qui se démarquent:
- Fonctionnalités étendues liées à la prise en charge d'OpenCL et d'OpenMP. Ajout de la prise en charge de l'extension OpenCL cl_khr_subgroup_rotate.
- Backends améliorés pour les architectures x86, PowerPC et RISC-V.
Amélioration des capacités de l'éditeur de liens LLD et du débogueur LLDB. - Ajout du drapeau "-fstrict-flex-arrays=" » avec lequel vous pouvez contrôler les limites d'un élément de tableau souple dans les structures (Soft Array Members, un tableau de taille indéfinie à la fin de la structure).
- Ajout de l'option "-warray-parameter" pour avertir du remplacement des fonctions avec des déclarations d'arguments incompatibles associées à des tableaux de longueur fixe et variable.
- Compatibilité améliorée avec MSVC.
- Ajout de la prise en charge de la "fonction #pragma et "#pragma alloc_text" fournies dans MSVC.
- Ajout de la prise en charge des indicateurs /JMC et /JMC compatibles MSVC.
- Ajout de l'indicateur "-m[no-]rdpru" pour contrĂ´ler l'utilisation de l'instruction RDPRU, prise en charge par les processeurs AMD Zen2.
- Ajout du drapeau "-mfunction-return=thunk-extern" pour se protéger contre la vulnérabilité RETBLEED, qui fonctionne en ajoutant une séquence d'instructions qui exclut la participation du mécanisme d'exécution spéculative pour les sauts indirects.
Enfin Si vous souhaitez en savoir plus, vous pouvez vérifier les détails dans le lien suivant