Clang для pic32
2022-05-26 13:52Народ на днях задал мне вопрос, нет ли способа пересобрать RetroBSD из исходников на каком-нибудь современном линуксе, типа Ubuntu 22.04, не откатываясь на десять лет назад. Я потыркался маленько, и оказалось, что компилятор для mips32r2 найти не так уж легко. Нет способа просто установить GCC для MIPS из готовых пакетов ни на линуксе, ни на маке. Старые бинарные сборки устарели и на новых MacOS вообще не запускаются. Пытался скомпилировать последний GCC из исходников - валится где-то при сборке runtime библиотеки. Непруха в общем.
Неожиданно обнаружилось, что ситуацию может спасти Clang. Это другой Си компилятор, из проекта LLVM. Оказалось, что стандартный пакет типа clang-14 содержит бэкенд не только для x86-64, но и для кучи других архитектур, включая mips32. Вот полный список.
Неожиданно обнаружилось, что ситуацию может спасти Clang. Это другой Си компилятор, из проекта LLVM. Оказалось, что стандартный пакет типа clang-14 содержит бэкенд не только для x86-64, но и для кучи других архитектур, включая mips32. Вот полный список.
У меня есть в запаснике пример прошивки для pic32. Пришлось повозиться, чтобы поправить его для Clang, но вроде неплохо выходит. Компиляция выглядит следующим образом:$ clang-14 -print-targets
Registered Targets:
aarch64 - AArch64 (little endian)
aarch64_32 - AArch64 (little endian ILP32)
aarch64_be - AArch64 (big endian)
amdgcn - AMD GCN GPUs
arm - ARM
arm64 - ARM64 (little endian)
arm64_32 - ARM64 (little endian ILP32)
armeb - ARM (big endian)
avr - Atmel AVR Microcontroller
bpf - BPF (host endian)
bpfeb - BPF (big endian)
bpfel - BPF (little endian)
hexagon - Hexagon
lanai - Lanai
m68k - Motorola 68000 family
mips - MIPS (32-bit big endian)
mips64 - MIPS (64-bit big endian)
mips64el - MIPS (64-bit little endian)
mipsel - MIPS (32-bit little endian)
msp430 - MSP430 [experimental]
nvptx - NVIDIA PTX 32-bit
nvptx64 - NVIDIA PTX 64-bit
ppc32 - PowerPC 32
ppc32le - PowerPC 32 LE
ppc64 - PowerPC 64
ppc64le - PowerPC 64 LE
r600 - AMD GPUs HD2XXX-HD6XXX
riscv32 - 32-bit RISC-V
riscv64 - 64-bit RISC-V
sparc - Sparc
sparcel - Sparc LE
sparcv9 - Sparc V9
systemz - SystemZ
thumb - Thumb
thumbeb - Thumb (big endian)
ve - VE
wasm32 - WebAssembly 32-bit
wasm64 - WebAssembly 64-bit
x86 - 32-bit X86: Pentium-Pro and above
x86-64 - 64-bit X86: EM64T and AMD64
xcore - XCore
С компилятором разобрались, а теперь стоит большая задача поправить все исходники RetroBSD под него. Нынче Си гораздо более строгий, чем тридцать лет назад. Всяких глупостей не прощает.$ make
/usr/lib/llvm-14/bin/clang -target mipsel -mcpu=mips32r2 -mabi=o32 -mfloat-abi=soft -DPIC32MX7 -c uart.c
/usr/lib/llvm-14/bin/ld.lld -m elf32ltsmip -T using-bootloader.ld -e _start -g uart.o -o uart.elf
/usr/lib/llvm-14/bin/llvm-objcopy -O ihex uart.elf uart.hex
/usr/lib/llvm-14/bin/llvm-objdump --mcpu=mips32r2 -d -S uart.elf > uart.dis
