This repository contains build scripts and auxiliary material for building a bare-metal LLVM based toolchain targeting Arm based on:
- clang + llvm
- lld
- libc++abi
- libc++
- compiler-rt
- newlib
The goal is to provide an LLVM based bare-metal toolchain that can target the Arm architecture family from Armv6-M and newer. The toolchain follows the ABI for the Arm Architecture and attempts to provide typical features needed for embedded and realtime operating systems.
- Armv6-M
- Armv7-M
- Armv7E-M
- Armv8-M Mainline
- Armv8.1-M Mainline
- AArch64 armv8.0 (experimental)
C++ is partially supported with the use of libc++ and libc++abi from LLVM. Features that are not supported include:
- Exceptions
- RTTI
- Multithreading
- Locales and input/output streams
- C++17's aligned operator new
The LLVM Embedded Toolchain for Arm relies on the following upstream components
Component | Link |
---|---|
LLVM | https://github.com/llvm/llvm-project |
newlib | https://sourceware.org/newlib |
On Windows the toolchain also uses several DLLs that are part of the Mingw-w64 project (based on GCC):
Library | Project | Link |
---|---|---|
libstdc++-6.dll | GCC | https://gcc.gnu.org |
libgcc_s_seh-1.dll | GCC | https://gcc.gnu.org |
libwinpthread-1.dll | Mingw-w64 | http://mingw-w64.org |
Content of this repository is licensed under Apache-2.0. See LICENSE.txt.
The resulting binaries are covered under their respective open source licenses, see component links above.
The LLVM Embedded Toolchain for Arm has been built and tested on Linux/Ubuntu 18.04.5 LTS.
Download a release of the toolchain for your platform from Github releases and extract the archive into an arbitrary directory.
To use the toolchain you need to provide a compiler configuration file on the command line, for example:
$ PATH=<install-dir>/LLVMEmbeddedToolchainForArm-<revision>/bin:$PATH
$ clang --config armv6m_soft_nofp_rdimon -o example example.c
The available configuration files can be listed using:
$ ls <install-dir>/LLVMEmbeddedToolchainForArm-<revision>/bin/*.cfg
Note that configurations under the nosys
or rdimon_baremetal
categories
require the linker script to be specified with -T
:
$ PATH=<install-dir>/LLVMEmbeddedToolchainForArm-<revision>/bin:$PATH
$ clang --config armv6m_soft_nofp_nosys -T device.ld -o example example.c
LLVM Embedded Toolchain for Arm is an open source project and thus can be built from source. Please see the Building from source guide for detailed instructions.
Please raise an issue via Github issues.
Please see the Contribution Guide for details.