Repositori ini berisi skrip build dan materi tambahan untuk membuat Arm penargetan rantai alat berbasis bare-metal LLVM berdasarkan:
dentang + llvm
lld
libc++abi
libc++
kompiler-rt
picolibc, atau opsional newlib atau libc LLVM
Tujuannya adalah untuk menyediakan toolchain bare-metal berbasis LLVM yang dapat menargetkan rangkaian arsitektur Arm dari Armv6-M dan yang lebih baru. Toolchain mengikuti ABI untuk Arsitektur Arm dan berupaya menyediakan fitur-fitur khas yang diperlukan untuk sistem operasi tertanam dan real-time.
Lenganv6-M
Lenganv7-M
Armv7E-M
Jalur Utama dan Garis Dasar Armv8-M
Armv8.1-M Garis Utama dan Garis Dasar
Armv4T (eksperimental)
Armv5TE (eksperimental)
Armv6 (eksperimental, menggunakan varian perpustakaan Armv5TE)
Lenganv7-A
Lenganv7-R
AArch32 Armv8-A
AArch32 Armv8-R
AArch64 Armv8-A
C++ didukung sebagian dengan penggunaan libc++ dan libc++abi dari LLVM. Fitur yang tidak didukung antara lain:
Multithread
LLVM Embedded Toolchain for Arm menggunakan versi libc++ ABI yang tidak stabil. ABI ini menggunakan semua perbaikan libc++ dan perbaikan bug terbaru, namun dapat mengakibatkan kesalahan tautan saat menautkan ke objek yang dikompilasi dengan versi ABI yang lebih lama. Untuk informasi lebih lanjut lihat https://libcxx.llvm.org/DesignDocs/ABIVersioning.html.
Toolchain Tertanam LLVM untuk Arm bergantung pada komponen upstream berikut
Komponen | Link |
---|---|
LLVM | https://github.com/llvm/llvm-project |
picolibc | https://github.com/picolibc/picolibc |
Konten repositori ini dilisensikan di bawah Apache-2.0. Lihat LISENSI.txt.
Biner yang dihasilkan tercakup dalam lisensi sumber terbuka masing-masing, lihat tautan komponen di atas.
Pengujian untuk beberapa target menggunakan model Arm FVP yang tersedia secara gratis tetapi bukan sumber terbuka, yang memiliki lisensinya sendiri. Ini tidak digunakan secara default, lihat Membangun dari sumber untuk detailnya.
LLVM Embedded Toolchain for Arm dibuat dan diuji pada Ubuntu 18.04 LTS.
Versi Windows dibuat di Windows Server 2019 dan diuji ringan di Windows 10.
Membangun di macOS berfungsi untuk x86_64 dan Apple Silicon.
Paket biner disediakan untuk rilis LLVM utama untuk Linux dan Windows.
Unduh rilis rantai alat untuk platform Anda dari rilis Github dan ekstrak arsip ke direktori arbitrer.
Instal paket Microsoft Visual C++ Redistributable terbaru yang didukung dan sesuai, seperti dari unduhan terbaru yang didukung Microsoft Visual C++ Redistributable.
Catatan: Jika Anda menggunakan rantai alat di lingkungan bersama dengan masukan yang tidak tepercaya, pastikan rantai alat tersebut cukup di-sandbox.
Untuk menggunakan rantai alat, pada baris perintah Anda perlu menyediakan opsi berikut:
Targetnya tiga kali lipat.
FPU yang akan digunakan.
Menonaktifkan/mengaktifkan pengecualian C++ dan RTTI.
Pustaka runtime C: crt0
atau crt0-semihost
. crt0
akan ditautkan secara otomatis, tetapi hal ini dapat ditekan dengan opsi -nostartfiles
sehingga crt0-semihost
dapat digunakan.
Library semihosting, jika menggunakan crt0-semihost
.
Skrip tautan yang ditentukan dengan -T
. Skrip picolibcpp.ld
dan picolibc.ld
default disediakan dan dapat digunakan secara langsung atau disertakan dari skrip linker khusus.
Misalnya:
$ PATH=<install-dir>/LLVMEmbeddedToolchainForArm-<revision>/bin:$PATH $ clang --target=armv6m-none-eabi -mfpu=none -fno-exceptions -fno-rtti -nostartfiles -lcrt0-semihost -lsemihost -T picolibc.ld -o example example.c
Sistem multilib clang
akan secara otomatis memilih kumpulan pustaka yang sesuai berdasarkan flag kompilasi Anda. clang
akan mengeluarkan peringatan jika tidak ada kumpulan perpustakaan yang sesuai dapat ditemukan.
Untuk menampilkan direktori yang dipilih oleh sistem multilib, tambahkan tanda -print-multi-directory
ke opsi baris perintah clang
Anda.
Untuk menampilkan semua multilib yang tersedia, jalankan clang
dengan bendera -print-multi-lib
dan target triple seperti --target=aarch64-none-elf
atau --target=arm-none-eabi
.
Ada kemungkinan clang
akan memilih sekumpulan perpustakaan yang bukan ingin Anda gunakan. Dalam hal ini Anda dapat melewati sistem multilib dengan memberikan opsi --sysroot
yang menentukan direktori yang berisi direktori include
dan lib
dari perpustakaan yang ingin Anda gunakan. Misalnya:
$ clang --sysroot=<install-dir>/LLVMEmbeddedToolchainForArm-<revision>/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
Pemilihan FPU dapat dilewati, namun tidak disarankan karena defaultnya berbeda dengan GCC.
Pembuatan rantai alat dikemas dengan dua file konfigurasi, Omax.cfg dan OmaxLTO.cfg. Saat digunakan, file konfigurasi ini mengaktifkan beberapa tanda pengoptimalan build untuk mencapai performa tertinggi pada tolok ukur tersemat pada umumnya. OmaxLTO.cfg mengaktifkan tanda khusus optimasi waktu tautan (LTO). Konfigurasi ini secara opsional dapat diteruskan menggunakan flag --config
. Misalnya:
$ clang example.c ... --config=Omax.cfg --config=OmaxLTO.cfg -o example
Pengguna harus diperingatkan bahwa Omax.cfg mengaktifkan -ffast-math
yang melanggar kepatuhan IEEE dan mengaktifkan optimasi matematika yang dapat memengaruhi kebenaran kode. LTO disimpan secara terpisah di OmaxLTO.cfg karena pengguna mungkin tidak menginginkan LTO karena potensi peningkatan waktu tautan dan/atau peningkatan penggunaan memori selama penautan. Beberapa opsi dalam file konfigurasi adalah opsi LLVM internal yang tidak terdokumentasi. Untuk opsi tidak berdokumen ini, silakan lihat kode sumber dari jalur pengoptimalan yang sesuai di proyek LLVM untuk mengetahui lebih lanjut. Pengguna juga didorong untuk membuat konfigurasi mereka sendiri dan menyesuaikan parameter flag mereka sendiri. Informasi tentang tanda pengoptimalan khusus Rantai Alat Tertanam LLVM untuk Arm tersedia di Tanda Pengoptimalan
Rilis biner dari LLVM Embedded Toolchain for Arm didasarkan pada cabang rilis Proyek LLVM hulu, sehingga dapat digunakan dengan aman dengan semua alat yang disediakan oleh rilis LLVM dengan versi yang cocok.
Lihat Migrasi dari Arm GNU Toolchain dan dukungan newlib Eksperimental untuk saran tentang penggunaan LLVM Embedded Toolchain untuk Arm dengan proyek yang sudah ada yang mengandalkan Arm GNU Toolchain.
Catatan:
picolibc
memberikan dukungan luar biasa untuk Arm GNU Toolchain, sehingga proyek yang memerlukan penggunaan Arm GNU Toolchain dan LLVM Embedded Toolchain untuk Arm dapat memilihpicolibc
ataunewlib
.
LLVM Embedded Toolchain for Arm adalah proyek sumber terbuka dan karenanya dapat dibangun dari sumber. Silakan lihat panduan Bangunan dari sumber untuk petunjuk rinci.
Silakan ajukan masalah melalui masalah Github.
Silakan lihat Panduan Kontribusi untuk rinciannya.