Este repositorio contiene scripts de compilación y material auxiliar para construir una cadena de herramientas basada en LLVM sin sistema operativo dirigida a Arm basada en:
El objetivo es proporcionar una cadena de herramientas básica basada en LLVM que pueda apuntar a la familia de arquitectura Arm desde Armv6-M y versiones posteriores. La cadena de herramientas sigue la ABI para Arm Architecture e intenta proporcionar características típicas necesarias para sistemas operativos integrados y en tiempo real.
C++ es parcialmente compatible con el uso de libc++ y libc++abi de LLVM. Las funciones que no son compatibles incluyen:
LLVM Embedded Toolchain para Arm utiliza la versión inestable libc++ ABI. Esta ABI utiliza todas las mejoras y correcciones de errores más recientes de libc++, pero puede provocar errores de enlace al vincular objetos compilados con versiones anteriores de la ABI. Para obtener más información, consulte https://libcxx.llvm.org/DesignDocs/ABIVersioning.html.
La cadena de herramientas integrada LLVM para Arm se basa en los siguientes componentes ascendentes
Componente | Enlace |
---|---|
LVM | https://github.com/llvm/llvm-project |
picolibc | https://github.com/picolibc/picolibc |
El contenido de este repositorio tiene licencia Apache-2.0. Consulte LICENCIA.txt.
Los binarios resultantes están cubiertos por sus respectivas licencias de código abierto; consulte los enlaces de los componentes más arriba.
Las pruebas para algunos objetivos utilizan los modelos Arm FVP disponibles gratuitamente pero no de código abierto, que tienen sus propias licencias. Estos no se utilizan de forma predeterminada; consulte Creación desde el código fuente para obtener más detalles.
LLVM Embedded Toolchain para Arm está construido y probado en Ubuntu 18.04 LTS.
La versión de Windows está integrada en Windows Server 2019 y se ha probado ligeramente en Windows 10.
La compilación en macOS es funcional para x86_64 y Apple Silicon.
Se proporcionan paquetes binarios para las principales versiones de LLVM para Linux y Windows.
Descargue una versión de la cadena de herramientas para su plataforma desde las versiones de Github y extraiga el archivo en un directorio arbitrario.
Instale el paquete redistribuible de Microsoft Visual C++ compatible más reciente, como las últimas descargas compatibles de Microsoft Visual C++ Redistributable.
Nota: Si está utilizando la cadena de herramientas en un entorno compartido con entradas que no son de confianza, asegúrese de que esté suficientemente protegida.
Para utilizar la cadena de herramientas, en la línea de comando debe proporcionar las siguientes opciones:
crt0
o crt0-semihost
. crt0
se vinculará automáticamente, pero esto se puede suprimir con la opción -nostartfiles
para poder usar crt0-semihost
.crt0-semihost
.-T
. Se proporcionan los scripts picolibcpp.ld
y picolibc.ld
predeterminados y pueden usarse directamente o incluirse desde un script de enlace personalizado.Por ejemplo:
$ 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
El sistema multilib de clang
seleccionará automáticamente un conjunto apropiado de bibliotecas según sus indicadores de compilación. clang
emitirá una advertencia si no se puede encontrar un conjunto apropiado de bibliotecas.
Para mostrar el directorio seleccionado por el sistema multilib, agregue la bandera -print-multi-directory
a las opciones de su línea de comando clang
.
Para mostrar todas las bibliotecas múltiples disponibles, ejecute clang
con la bandera -print-multi-lib
y un triple objetivo como --target=aarch64-none-elf
o --target=arm-none-eabi
.
Es posible que clang
elija un conjunto de bibliotecas que no sean las que desea utilizar. En este caso, puede omitir el sistema multilib proporcionando una opción --sysroot
que especifica el directorio que contiene los directorios include
y lib
de las bibliotecas que desea utilizar. Por ejemplo:
$ 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
Se puede omitir la selección de FPU, pero no se recomienda ya que los valores predeterminados son diferentes a los de GCC.
Las compilaciones de la cadena de herramientas vienen empaquetadas con dos archivos de configuración, Omax.cfg y OmaxLTO.cfg. Cuando se utilizan, estos archivos de configuración habilitan varios indicadores de optimización de compilación para lograr el mayor rendimiento en pruebas comparativas integradas típicas. OmaxLTO.cfg habilita indicadores específicos de optimización del tiempo de enlace (LTO). Estas configuraciones se pueden pasar opcionalmente usando el indicador --config
. Por ejemplo:
$ clang
example.c
...
--config=Omax.cfg
--config=OmaxLTO.cfg
-o example
Se debe advertir a los usuarios que Omax.cfg habilita -ffast-math
, lo que infringe el cumplimiento de IEEE y habilita optimizaciones matemáticas que pueden afectar la corrección del código. Los LTO se mantienen por separado en OmaxLTO.cfg, ya que es posible que los usuarios no quieran LTO debido al posible aumento en el tiempo de enlace y/o al aumento del uso de memoria durante el enlace. Algunas de las opciones en los archivos de configuración son opciones LLVM internas no documentadas. Para estas opciones no documentadas, consulte el código fuente de los pases de optimización correspondientes en el proyecto LLVM para obtener más información. También se anima a los usuarios a crear sus propias configuraciones y ajustar sus propios parámetros de bandera. La información sobre los indicadores de optimización específicos de LLVM Embedded Toolchain para Arm está disponible en Indicadores de optimización
Las versiones binarias de LLVM Embedded Toolchain para Arm se basan en ramas de versión del proyecto LLVM anterior, por lo que se pueden utilizar de forma segura con todas las herramientas proporcionadas por las versiones de LLVM de la versión coincidente.
Consulte Migración desde Arm GNU Toolchain y Compatibilidad experimental con newlib para obtener consejos sobre el uso de LLVM Embedded Toolchain para Arm con proyectos existentes que dependen de Arm GNU Toolchain.
Nota:
picolibc
proporciona un excelente soporte para Arm GNU Toolchain, por lo que los proyectos que requieren el uso de Arm GNU Toolchain y LLVM Embedded Toolchain para Arm pueden elegirpicolibc
onewlib
.
LLVM Embedded Toolchain for Arm es un proyecto de código abierto y, por lo tanto, se puede crear desde el código fuente. Consulte la guía Construir desde el código fuente para obtener instrucciones detalladas.
Plantee un problema a través de problemas de Github.
Consulte la Guía de contribuciones para obtener más detalles.