Repositori ini berisi skrip build dan materi tambahan untuk membuat Arm penargetan rantai alat berbasis bare-metal LLVM berdasarkan:
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.
C++ didukung sebagian dengan penggunaan libc++ dan libc++abi dari LLVM. Fitur yang tidak didukung antara lain:
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:
crt0
atau crt0-semihost
. crt0
akan ditautkan secara otomatis, tetapi hal ini dapat ditekan dengan opsi -nostartfiles
sehingga crt0-semihost
dapat digunakan.crt0-semihost
.-T
. Skrip picolibcpp.ld
dan picolibc.ld
default disediakan dan dapat digunakan secara langsung atau disertakan dari skrip linker khusus.Misalnya:
$ 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
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=/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
Pemilihan FPU dapat dilewati, tetapi 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 LLVM Embedded Toolchain untuk tanda optimasi khusus Arm tersedia di Bendera Optimasi
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.