Dieses Repository enthält Build-Skripte und Hilfsmaterial zum Erstellen einer Bare-Metal-LLVM-basierten Toolchain für Arm, basierend auf:
Das Ziel besteht darin, eine LLVM-basierte Bare-Metal-Toolchain bereitzustellen, die auf die Arm-Architekturfamilie ab Armv6-M und neuer abzielen kann. Die Toolchain folgt dem ABI für die Arm-Architektur und versucht, typische Funktionen bereitzustellen, die für eingebettete und Echtzeit-Betriebssysteme benötigt werden.
C++ wird teilweise durch die Verwendung von libc++ und libc++abi von LLVM unterstützt. Zu den nicht unterstützten Funktionen gehören:
LLVM Embedded Toolchain for Arm verwendet die instabile libc++ ABI-Version. Dieses ABI verwendet alle neuesten libc++-Verbesserungen und Bugfixes, kann jedoch zu Linkfehlern führen, wenn es mit Objekten verknüpft wird, die mit älteren Versionen des ABI kompiliert wurden. Weitere Informationen finden Sie unter https://libcxx.llvm.org/DesignDocs/ABIVersioning.html.
Die LLVM Embedded Toolchain für Arm basiert auf den folgenden Upstream-Komponenten
Komponente | Link |
---|---|
LLVM | https://github.com/llvm/llvm-project |
picolibc | https://github.com/picolibc/picolibc |
Der Inhalt dieses Repositorys ist unter Apache-2.0 lizenziert. Siehe LICENSE.txt.
Die resultierenden Binärdateien unterliegen ihren jeweiligen Open-Source-Lizenzen, siehe Komponentenlinks oben.
Beim Testen einiger Ziele werden die frei verfügbaren, aber nicht Open-Source-Arm-FVP-Modelle verwendet, die über eigene Lizenzen verfügen. Diese werden nicht standardmäßig verwendet. Weitere Informationen finden Sie unter Erstellen aus der Quelle.
LLVM Embedded Toolchain for Arm wurde auf Ubuntu 18.04 LTS erstellt und getestet.
Die Windows-Version basiert auf Windows Server 2019 und wurde leicht unter Windows 10 getestet.
Der Aufbau auf macOS funktioniert für x86_64 und Apple Silicon.
Binärpakete werden für Hauptversionen von LLVM für Linux und Windows bereitgestellt.
Laden Sie eine Version der Toolchain für Ihre Plattform von Github Releases herunter und extrahieren Sie das Archiv in ein beliebiges Verzeichnis.
Installieren Sie das entsprechende neueste unterstützte Microsoft Visual C++ Redistributable-Paket, z. B. von den neuesten unterstützten Downloads von Microsoft Visual C++ Redistributable.
Hinweis: Wenn Sie die Toolchain in einer gemeinsamen Umgebung mit nicht vertrauenswürdigen Eingaben verwenden, stellen Sie sicher, dass sie über eine ausreichende Sandbox verfügt.
Um die Toolchain verwenden zu können, müssen Sie in der Befehlszeile die folgenden Optionen angeben:
crt0
oder crt0-semihost
. crt0
wird automatisch verknüpft, dies kann jedoch mit der Option -nostartfiles
unterdrückt werden, sodass crt0-semihost
verwendet werden kann.crt0-semihost
verwendet wird.-T
angegebenes Linker-Skript. Die Standardskripts picolibcpp.ld
und picolibc.ld
werden bereitgestellt und können direkt verwendet oder über ein benutzerdefiniertes Linkerskript eingebunden werden.Zum Beispiel:
$ 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
Das Multilib-System von clang
wählt basierend auf Ihren Kompilierungsflags automatisch einen geeigneten Satz von Bibliotheken aus. clang
gibt eine Warnung aus, wenn keine geeigneten Bibliotheken gefunden werden können.
Um das vom Multilib-System ausgewählte Verzeichnis anzuzeigen, fügen Sie das Flag -print-multi-directory
zu Ihren clang
Befehlszeilenoptionen hinzu.
Um alle verfügbaren Multilibs anzuzeigen, führen Sie clang
mit dem Flag -print-multi-lib
und einem Zieltripel wie --target=aarch64-none-elf
oder --target=arm-none-eabi
aus.
Es ist möglich, dass clang
eine Reihe von Bibliotheken auswählt, die Sie nicht verwenden möchten. In diesem Fall können Sie das Multilib-System umgehen, indem Sie die Option --sysroot
angeben, die das Verzeichnis angibt, das die include
und lib
-Verzeichnisse der Bibliotheken enthält, die Sie verwenden möchten. Zum Beispiel:
$ 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
Die FPU-Auswahl kann übersprungen werden, dies wird jedoch nicht empfohlen, da sich die Standardeinstellungen von denen von GCC unterscheiden.
Die Builds der Toolchain werden mit zwei Konfigurationsdateien geliefert, Omax.cfg und OmaxLTO.cfg. Bei Verwendung ermöglichen diese Konfigurationsdateien mehrere Build-Optimierungsflags, um bei typischen eingebetteten Benchmarks die höchste Leistung zu erzielen. OmaxLTO.cfg aktiviert Link-Time-Optimierung (LTO)-spezifische Flags. Diese Konfigurationen können optional mit dem Flag --config
übergeben werden. Zum Beispiel:
$ clang
example.c
...
--config=Omax.cfg
--config=OmaxLTO.cfg
-o example
Benutzer sollten gewarnt werden, dass Omax.cfg -ffast-math
aktiviert, was gegen die IEEE-Konformität verstößt und mathematische Optimierungen ermöglicht, die sich auf die Codekorrektheit auswirken können. LTOs werden in OmaxLTO.cfg separat aufbewahrt, da Benutzer LTOs aufgrund einer möglichen Verlängerung der Verbindungszeit und/oder einer erhöhten Speichernutzung während der Verbindung möglicherweise nicht wünschen. Einige der Optionen in den Konfigurationsdateien sind undokumentierte interne LLVM-Optionen. Weitere Informationen zu diesen undokumentierten Optionen finden Sie im Quellcode der entsprechenden Optimierungsdurchläufe im LLVM-Projekt. Benutzer werden außerdem dazu ermutigt, ihre eigenen Konfigurationen zu erstellen und ihre eigenen Flag-Parameter abzustimmen. Informationen zur LLVM Embedded Toolchain für Arm-spezifische Optimierungsflags finden Sie unter Optimierungsflags
Binäre Versionen der LLVM Embedded Toolchain for Arm basieren auf Release-Zweigen des Upstream-LLVM-Projekts und können daher sicher mit allen Tools verwendet werden, die von LLVM-Releases der entsprechenden Version bereitgestellt werden.
Ratschläge zur Verwendung der LLVM Embedded Toolchain für Arm mit vorhandenen Projekten, die auf der Arm GNU Toolchain basieren, finden Sie unter „Migration von der Arm GNU Toolchain“ und „Experimentelle Newlib-Unterstützung“.
Hinweis:
picolibc
bietet hervorragende Unterstützung für die Arm GNU Toolchain, sodass Projekte, die sowohl die Arm GNU Toolchain als auch die LLVM Embedded Toolchain für Arm verwenden müssen, entwederpicolibc
odernewlib
wählen können.
LLVM Embedded Toolchain for Arm ist ein Open-Source-Projekt und kann daher aus dem Quellcode erstellt werden. Ausführliche Anweisungen finden Sie im Leitfaden „Building from Source“.
Bitte melden Sie ein Problem über Github Issues.
Weitere Informationen finden Sie im Beitragsleitfaden.