该存储库包含构建脚本和辅助材料,用于构建基于裸机 LLVM 的针对 Arm 的工具链,基于:
目标是提供一个基于 LLVM 的裸机工具链,可以针对 Armv6-M 及更高版本的 Arm 架构系列。该工具链遵循 Arm 架构的 ABI,并尝试提供嵌入式和实时操作系统所需的典型功能。
使用 LLVM 中的 libc++ 和 libc++abi 部分支持 C++。不支持的功能包括:
Arm 的 LLVM 嵌入式工具链使用不稳定的 libc++ ABI 版本。此 ABI 使用所有最新的 libc++ 改进和错误修复,但在链接针对旧版本 ABI 编译的对象时可能会导致链接错误。有关更多信息,请参阅 https://libcxx.llvm.org/DesignDocs/ABIVersioning.html。
Arm 的 LLVM 嵌入式工具链依赖于以下上游组件
成分 | 关联 |
---|---|
LLVM | https://github.com/llvm/llvm-project |
吡啶甲酸乙酯 | https://github.com/picolibc/picolibc |
该存储库的内容已获得 Apache-2.0 许可。请参阅 LICENSE.txt。
生成的二进制文件受各自的开源许可证保护,请参阅上面的组件链接。
对某些目标的测试使用免费但非开源的 Arm FVP 模型,这些模型有自己的许可证。默认情况下不使用这些,有关详细信息,请参阅从源代码构建。
适用于 Arm 的 LLVM 嵌入式工具链在 Ubuntu 18.04 LTS 上构建和测试。
Windows 版本基于 Windows Server 2019 构建,并在 Windows 10 上进行了轻微测试。
在 macOS 上构建适用于 x86_64 和 Apple Silicon。
为 Linux 和 Windows 的主要 LLVM 版本提供了二进制包。
从 Github 版本下载适合您平台的工具链版本,并将存档解压到任意目录中。
安装适当的最新支持的 Microsoft Visual C++ Redistributable 软件包,例如从 Microsoft Visual C++ Redistributable 最新支持的下载。
注意:如果您在具有不受信任输入的共享环境中使用工具链,请确保它已充分沙箱化。
要使用工具链,您需要在命令行上提供以下选项:
crt0
或crt0-semihost
。 crt0
将自动链接,但可以使用-nostartfiles
选项抑制此情况,以便可以使用crt0-semihost
。crt0-semihost
。-T
指定的链接器脚本。提供了默认的picolibcpp.ld
和picolibc.ld
脚本,可以直接使用或从自定义链接器脚本中包含它们。例如:
$ 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
clang
的 multilib 系统将根据您的编译标志自动选择一组合适的库。如果找不到合适的库集, clang
将发出警告。
要显示 multilib 系统选择的目录,请将标志-print-multi-directory
添加到clang
命令行选项中。
要显示所有可用的 multilib,请使用-print-multi-lib
标志和一个目标三元组(如--target=aarch64-none-elf
或--target=arm-none-eabi
运行clang
。
clang
可能会选择一组不是您想要使用的库。在这种情况下,您可以通过提供--sysroot
选项指定包含要使用的库的include
和lib
目录的目录来绕过 multilib 系统。例如:
$ 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
FPU 选择可以跳过,但不建议这样做,因为默认值与 GCC 不同。
工具链的构建包含两个配置文件:Omax.cfg 和 OmaxLTO.cfg。使用时,这些配置文件会启用多个构建优化标志,以在典型的嵌入式基准测试中实现最高性能。 OmaxLTO.cfg 启用链接时优化 (LTO) 特定标志。可以选择使用--config
标志传递这些配置。例如:
$ clang
example.c
...
--config=Omax.cfg
--config=OmaxLTO.cfg
-o example
应警告用户,Omax.cfg 启用-ffast-math
,这会破坏 IEEE 合规性并启用可能影响代码正确性的数学优化。 LTO 单独保存在 OmaxLTO.cfg 中,因为用户可能不需要 LTO,因为链接时间可能会增加和/或链接期间内存使用量会增加。配置文件中的一些选项是未记录的内部 LLVM 选项。对于这些未记录的选项,请参阅 LLVM 项目中相应优化过程的源代码以了解更多信息。还鼓励用户创建自己的配置并调整自己的标志参数。有关 Arm 特定优化标志的 LLVM 嵌入式工具链的信息可在优化标志中找到
Arm 的 LLVM 嵌入式工具链的二进制版本基于上游 LLVM 项目的版本分支,因此可以安全地与匹配版本的 LLVM 版本提供的所有工具一起使用。
请参阅从 Arm GNU 工具链迁移和实验性 newlib 支持,了解有关在依赖 Arm GNU 工具链的现有项目中使用适用于 Arm 的 LLVM 嵌入式工具链的建议。
注意:
picolibc
为 Arm GNU Toolchain 提供了出色的支持,因此需要同时使用 Arm GNU Toolchain 和 LLVM Embedded Toolchain for Arm 的项目可以选择picolibc
或newlib
。
Arm 的 LLVM 嵌入式工具链是一个开源项目,因此可以从源代码构建。请参阅从源代码构建指南以获取详细说明。
请通过 Github issues 提出问题。
详情请参阅贡献指南。