Ce référentiel contient des scripts de construction et du matériel auxiliaire pour créer une chaîne d'outils basée sur LLVM nue ciblant Arm basée sur :
L'objectif est de fournir une chaîne d'outils nue basée sur LLVM qui peut cibler la famille d'architecture Arm à partir d'Armv6-M et plus récent. La chaîne d'outils suit l'ABI pour l'architecture Arm et tente de fournir les fonctionnalités typiques nécessaires aux systèmes d'exploitation embarqués et en temps réel.
C++ est partiellement pris en charge avec l'utilisation de libc++ et libc++abi de LLVM. Les fonctionnalités qui ne sont pas prises en charge incluent :
LLVM Embedded Toolchain for Arm utilise la version instable libc++ ABI. Cette ABI utilise toutes les dernières améliorations et corrections de bogues de la libc++, mais peut entraîner des erreurs de liaison lors de la liaison avec des objets compilés avec des versions plus anciennes de l'ABI. Pour plus d'informations, voir https://libcxx.llvm.org/DesignDocs/ABIVersioning.html.
La chaîne d'outils intégrée LLVM pour Arm s'appuie sur les composants en amont suivants
Composant | Lien |
---|---|
LLVM | https://github.com/llvm/llvm-project |
picolibc | https://github.com/picolibc/picolibc |
Le contenu de ce référentiel est sous licence Apache-2.0. Voir LICENSE.txt.
Les binaires résultants sont couverts par leurs licences open source respectives, voir les liens des composants ci-dessus.
Les tests pour certaines cibles utilisent les modèles Arm FVP disponibles gratuitement mais non open source, qui disposent de leurs propres licences. Ceux-ci ne sont pas utilisés par défaut, voir Construction à partir des sources pour plus de détails.
LLVM Embedded Toolchain for Arm est construit et testé sur Ubuntu 18.04 LTS.
La version Windows est basée sur Windows Server 2019 et légèrement testée sur Windows 10.
La construction sur macOS est fonctionnelle pour x86_64 et Apple Silicon.
Des packages binaires sont fournis pour les versions majeures de LLVM pour Linux et Windows.
Téléchargez une version de la chaîne d'outils pour votre plate-forme à partir des versions de Github et extrayez l'archive dans un répertoire arbitraire.
Installez le dernier package redistribuable Microsoft Visual C++ pris en charge approprié, par exemple à partir des derniers téléchargements pris en charge par Microsoft Visual C++ Redistributable.
Remarque : Si vous utilisez la chaîne d'outils dans un environnement partagé avec des entrées non fiables, assurez-vous qu'elle est suffisamment mise en bac à sable.
Pour utiliser la chaîne d'outils, sur la ligne de commande, vous devez fournir les options suivantes :
crt0
, soit crt0-semihost
. crt0
sera lié automatiquement, mais cela peut être supprimé avec l'option -nostartfiles
afin que crt0-semihost
puisse être utilisé.crt0-semihost
.-T
. Les scripts picolibcpp.ld
et picolibc.ld
par défaut sont fournis et peuvent être utilisés directement ou inclus à partir d'un script d'éditeur de liens personnalisé.Par exemple:
$ PATH=/LLVMEmbeddedToolchainForArm-/bin:$PATH
$ clang
--target=armv6m-none-eabi
-mfpu=none
-fno-exceptions
-fno-rtti
-nostartfiles
-lcrt0-semihost
-lsemihost
-T picolibc.ld
-o example example.c
Le système multilib de clang
sélectionnera automatiquement un ensemble approprié de bibliothèques en fonction de vos indicateurs de compilation. clang
émettra un avertissement si aucun ensemble de bibliothèques approprié ne peut être trouvé.
Pour afficher le répertoire sélectionné par le système multilib, ajoutez l'indicateur -print-multi-directory
à vos options de ligne de commande clang
.
Pour afficher tous les multilibs disponibles, exécutez clang
avec l'indicateur -print-multi-lib
et un triple cible comme --target=aarch64-none-elf
ou --target=arm-none-eabi
.
Il est possible que clang
choisisse un ensemble de bibliothèques qui ne sont pas celles que vous souhaitez utiliser. Dans ce cas, vous pouvez contourner le système multilib en fournissant une option --sysroot
spécifiant le répertoire contenant les répertoires include
et lib
des bibliothèques que vous souhaitez utiliser. Par exemple:
$ clang
--sysroot=/LLVMEmbeddedToolchainForArm-/lib/clang-runtimes/arm-none-eabi/armv6m_soft_nofp
--target=armv6m-none-eabi
-mfpu=none
-fno-exceptions
-fno-rtti
-nostartfiles
-lcrt0-semihost
-lsemihost
-T picolibc.ld
-o example example.c
La sélection FPU peut être ignorée, mais cela n'est pas recommandé car les valeurs par défaut sont différentes de celles de GCC.
Les versions de la chaîne d'outils sont fournies avec deux fichiers de configuration, Omax.cfg et OmaxLTO.cfg. Lorsqu'ils sont utilisés, ces fichiers de configuration activent plusieurs indicateurs d'optimisation de build pour obtenir les performances les plus élevées sur les benchmarks intégrés typiques. OmaxLTO.cfg active les indicateurs spécifiques à l'optimisation du temps de liaison (LTO). Ces configurations peuvent éventuellement être transmises à l'aide de l'indicateur --config
. Par exemple:
$ clang
example.c
...
--config=Omax.cfg
--config=OmaxLTO.cfg
-o example
Les utilisateurs doivent être avertis que Omax.cfg active -ffast-math
, ce qui enfreint la conformité IEEE et permet des optimisations mathématiques qui peuvent affecter l'exactitude du code. Les LTO sont conservés séparément dans OmaxLTO.cfg car les utilisateurs peuvent ne pas vouloir de LTO en raison d'une augmentation potentielle du temps de liaison et/ou d'une utilisation accrue de la mémoire pendant la liaison. Certaines options des fichiers de configuration sont des options LLVM internes non documentées. Pour ces options non documentées, veuillez consulter le code source des passes d'optimisation correspondantes dans le projet LLVM pour en savoir plus. Les utilisateurs sont également encouragés à créer leurs propres configurations et à régler leurs propres paramètres d'indicateur. Des informations sur les indicateurs d'optimisation spécifiques à la chaîne d'outils intégrée LLVM pour Arm sont disponibles dans Indicateurs d'optimisation.
Les versions binaires de la chaîne d'outils intégrée LLVM pour Arm sont basées sur les branches de version du projet LLVM en amont et peuvent donc être utilisées en toute sécurité avec tous les outils fournis par les versions LLVM de la version correspondante.
Voir Migration depuis Arm GNU Toolchain et Prise en charge expérimentale de newlib pour obtenir des conseils sur l'utilisation de LLVM Embedded Toolchain pour Arm avec des projets existants s'appuyant sur Arm GNU Toolchain.
Remarque :
picolibc
offre une excellente prise en charge d'Arm GNU Toolchain, de sorte que les projets qui nécessitent l'utilisation à la fois d'Arm GNU Toolchain et de LLVM Embedded Toolchain for Arm peuvent choisir soitpicolibc
, soitnewlib
.
LLVM Embedded Toolchain for Arm est un projet open source et peut donc être construit à partir des sources. Veuillez consulter le guide Construire à partir des sources pour des instructions détaillées.
Veuillez soulever un problème via les problèmes Github.
Veuillez consulter le Guide de contribution pour plus de détails.