Este repositório contém scripts de construção e material auxiliar para construir um conjunto de ferramentas bare-metal baseado em LLVM direcionado ao Arm com base em:
O objetivo é fornecer um conjunto de ferramentas bare-metal baseado em LLVM que possa atingir a família de arquitetura Arm do Armv6-M e mais recente. A cadeia de ferramentas segue a ABI para a arquitetura Arm e tenta fornecer recursos típicos necessários para sistemas operacionais incorporados e em tempo real.
C++ é parcialmente suportado com o uso de libc++ e libc++abi do LLVM. Os recursos que não são suportados incluem:
O LLVM Embedded Toolchain for Arm usa a versão instável libc++ ABI. Esta ABI usa todas as melhorias e correções de bugs mais recentes da libc++, mas pode resultar em erros de link ao vincular objetos compilados em versões mais antigas da ABI. Para obter mais informações, consulte https://libcxx.llvm.org/DesignDocs/ABIVersioning.html.
O LLVM Embedded Toolchain for Arm depende dos seguintes componentes upstream
Componente | Link |
---|---|
LLVM | https://github.com/llvm/llvm-project |
picolibc | https://github.com/picolibc/picolibc |
O conteúdo deste repositório está licenciado sob Apache-2.0. Consulte LICENSE.txt.
Os binários resultantes são cobertos por suas respectivas licenças de código aberto; consulte os links dos componentes acima.
Os testes para alguns alvos usam modelos Arm FVP disponíveis gratuitamente, mas não de código aberto, que possuem suas próprias licenças. Eles não são usados por padrão; consulte Construindo a partir da fonte para obter detalhes.
O LLVM Embedded Toolchain for Arm foi desenvolvido e testado no Ubuntu 18.04 LTS.
A versão para Windows é baseada no Windows Server 2019 e levemente testada no Windows 10.
Construir no macOS é funcional para x86_64 e Apple Silicon.
Pacotes binários são fornecidos para as principais versões do LLVM para Linux e Windows.
Baixe uma versão do conjunto de ferramentas para sua plataforma nas versões do Github e extraia o arquivo em um diretório arbitrário.
Instale o pacote redistribuível do Microsoft Visual C++ com suporte mais recente apropriado, como os downloads mais recentes com suporte do Microsoft Visual C++ Redistributable.
Nota: Se você estiver usando a cadeia de ferramentas em um ambiente compartilhado com entrada não confiável, certifique-se de que ela esteja em área restrita suficiente.
Para usar o conjunto de ferramentas, na linha de comando você precisa fornecer as seguintes opções:
crt0
ou crt0-semihost
. crt0
será vinculado automaticamente, mas isso pode ser suprimido com a opção -nostartfiles
para que crt0-semihost
possa ser usado.crt0-semihost
.-T
. Os scripts padrão picolibcpp.ld
e picolibc.ld
são fornecidos e podem ser usados diretamente ou incluídos em um script de vinculador customizado.Por exemplo:
$ 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
O sistema multilib do clang
selecionará automaticamente um conjunto apropriado de bibliotecas com base em seus sinalizadores de compilação. clang
emitirá um aviso se nenhum conjunto apropriado de bibliotecas for encontrado.
Para exibir o diretório selecionado pelo sistema multilib, adicione o sinalizador -print-multi-directory
às opções da linha de comando clang
.
Para exibir todas as multilibs disponíveis, execute clang
com o sinalizador -print-multi-lib
e um alvo triplo como --target=aarch64-none-elf
ou --target=arm-none-eabi
.
É possível que clang
escolha um conjunto de bibliotecas que não são aquelas que você deseja usar. Neste caso você pode ignorar o sistema multilib fornecendo uma opção --sysroot
especificando o diretório que contém os diretórios include
e lib
das bibliotecas que você deseja usar. Por exemplo:
$ 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
A seleção de FPU pode ser ignorada, mas não é recomendado, pois os padrões são diferentes dos do GCC.
As compilações do conjunto de ferramentas vêm com dois arquivos de configuração, Omax.cfg e OmaxLTO.cfg. Quando usados, esses arquivos de configuração permitem vários sinalizadores de otimização de construção para alcançar o mais alto desempenho em benchmarks incorporados típicos. OmaxLTO.cfg permite sinalizadores específicos de otimização de tempo de link (LTO). Essas configurações podem ser opcionalmente passadas usando o sinalizador --config
. Por exemplo:
$ clang
example.c
...
--config=Omax.cfg
--config=OmaxLTO.cfg
-o example
Os usuários devem ser avisados de que o Omax.cfg ativa -ffast-math
, que quebra a conformidade com o IEEE e permite otimizações matemáticas que podem afetar a correção do código. Os LTOs são mantidos separadamente em OmaxLTO.cfg, pois os usuários podem não querer LTOs devido ao aumento potencial no tempo de link e/ou aumento no uso de memória durante o link. Algumas das opções nos arquivos de configuração são opções internas do LLVM não documentadas. Para essas opções não documentadas, consulte o código-fonte das passagens de otimização correspondentes no projeto LLVM para saber mais. Os usuários também são incentivados a criar suas próprias configurações e ajustar seus próprios parâmetros de sinalização. Informações sobre sinalizadores de otimização específicos do LLVM Embedded Toolchain para Arm estão disponíveis em Sinalizadores de Otimização
As versões binárias do LLVM Embedded Toolchain for Arm são baseadas em ramificações de lançamento do projeto LLVM upstream, portanto, podem ser usadas com segurança com todas as ferramentas fornecidas pelas versões LLVM da versão correspondente.
Consulte Migrando do Arm GNU Toolchain e Experimental newlib support para obter conselhos sobre como usar o LLVM Embedded Toolchain for Arm com projetos existentes que dependem do Arm GNU Toolchain.
Nota:
picolibc
fornece excelente suporte para Arm GNU Toolchain, portanto, projetos que exigem o uso de Arm GNU Toolchain e LLVM Embedded Toolchain for Arm podem escolherpicolibc
ounewlib
.
LLVM Embedded Toolchain for Arm é um projeto de código aberto e, portanto, pode ser construído a partir do código-fonte. Consulte o guia Construindo a partir da fonte para obter instruções detalhadas.
Levante um problema por meio de problemas do Github.
Consulte o Guia de Contribuição para obter detalhes.