www.digitalmars.com         C & C++   DMDScript  

D.gnu - Xtensa support

reply Matheus Catarino <matheus-catarino hotmail.com> writes:
I've recently seen support for different target architectures on 
https://explore.dgnu.org .
What is the status of Xtensa and xtensa-gnu support? Does it 
support both xtensa ABIs (call0 and windowed)?

Currently there is a need to fork espressif/LLVM when using ldc2. 
Is there a need to fork espressif crosstool-ng?
Apr 12
parent reply Witold Baryluk <witold.baryluk gmail.com> writes:
On Friday, 12 April 2024 at 23:16:30 UTC, Matheus Catarino wrote:
 I've recently seen support for different target architectures 
 on https://explore.dgnu.org .
 What is the status of Xtensa and xtensa-gnu support? Does it 
 support both xtensa ABIs (call0 and windowed)?

 Currently there is a need to fork espressif/LLVM when using 
 ldc2. Is there a need to fork espressif crosstool-ng?
It works. I successfully run some code with it with gdc few years ago. But it is quite a work to map either reimplement all the APIs in D from scratch, but it can be done as everything is reasonably well documented. I only had some basic stuff like GPIO, very little of timers and uart. So no networking (possibly, but I had other things to do) or other stuff. As of xtensa ABIs I have no idea. I didn't use espressif libraries. Should be possible tho.
Apr 14
parent reply Matheus Catarino <matheus-catarino hotmail.com> writes:
On Sunday, 14 April 2024 at 07:25:07 UTC, Witold Baryluk wrote:
 On Friday, 12 April 2024 at 23:16:30 UTC, Matheus Catarino 
 wrote:
 I've recently seen support for different target architectures 
 on https://explore.dgnu.org .
 What is the status of Xtensa and xtensa-gnu support? Does it 
 support both xtensa ABIs (call0 and windowed)?

 Currently there is a need to fork espressif/LLVM when using 
 ldc2. Is there a need to fork espressif crosstool-ng?
It works. I successfully run some code with it with gdc few years ago. But it is quite a work to map either reimplement all the APIs in D from scratch, but it can be done as everything is reasonably well documented. I only had some basic stuff like GPIO, very little of timers and uart. So no networking (possibly, but I had other things to do) or other stuff. As of xtensa ABIs I have no idea. I didn't use espressif libraries. Should be possible tho.
Espressif/LLVM have xtensa-ABI (windowed) partial support, but GCC [upstream and fork] have both xtensa-ABI (call0 & windowed) ```bash ./gcc/esp32s3-gdc/bin/xtensa-esp32s3-elf-gdc --help=target The following options are target specific: -mabi=call0 Use call0 ABI. -mabi=windowed Use windowed registers ABI. -malways-memw Always emit a MEMW before a load and after a store operation. Used to debug memory coherency issues. -mauto-litpools Relax literals in assembler and place them automatically in the text section. -mconst16 Use CONST16 instruction to load constants. -mdisable-hardware-atomics Call built-in functions for atomic operations instead of using hardware atomic instructions. This option can be used if atomic operations on some memory regions need to be emulated in software. -mdynconfig= Directory or path to dynconfig library. -mextra-l32r-costs= Set extra memory access cost for L32R instruction, in clock-cycle units. -mfix-esp32-psram-cache-issue Work around a PSRAM cache issue in the ESP32 ECO1 chips. -mfix-esp32-psram-cache-strategy= Specify a psram cache fix strategy. -mforce-no-pic Disable position-independent code (PIC) for use in OS kernel code. -mfused-madd Same as -ffp-contract=fast (or, in negated form, -ffp-contract=off). Uses of this option are diagnosed. -mlongcalls Use indirect CALLXn instructions for large programs. -mlra Use LRA instead of reload (transitional). -mno-serialize-volatile Do not serialize volatile memory references with MEMW instructions. -mtarget-align Automatically align branch targets to reduce branch penalties. -mtext-section-literals Intersperse literal pools with code in the text section. Psram cache fix strategies (for use with -mfix-esp32-psram-cache-strategy= option): dupldst memw nops ``` src: https://github.com/espressif/gcc src: https://github.com/espressif/crosstool-ng - **Note:** replace `--enable-languages=c,c++` to `--enable-languages=c,d` or add `d` after `c++`. ```bash $> /root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20230928/xtensa-esp-elf/bi /xtensa-esp-elf-gcc -v Using built-in specs. COLLECT_GCC=/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20230928/xtensa-esp-elf/bin/xtensa-esp-elf-gcc COLLECT_LTO_WRAPPER=/root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20230928/xtensa-esp-elf/bin/../libexec/gcc/xtensa-esp-elf/13.2.0/lto-wrapper Target: xtensa-esp-elf Configured with: /builds/idf/crosstool-NG/.build/xtensa-esp-elf/src/gcc/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=xtensa-esp-elf --prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --exec_prefix=/builds/idf/crosstool-NG/builds/xtensa-esp-elf --with-local-prefix=/builds/idf/crosstool-NG/builds/xtensa-es -elf/xtensa-esp-elf --with-headers=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xt nsa-esp-elf/include --with-newlib --enable-threads=no --disable-shared --with-pkgversion='crosstool-NG esp-13.2.0_20230928' --disable-__cxa_atexit --enable-cxx-flags=-ffunction-sections --disable-libgomp --disable-libmudflap --disable-libmpx --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libstdcxx-verbose --with-gmp=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpfr=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-mpc=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --with-isl=/builds/idf/crosstool-NG/.build/xtensa-esp-elf/buildtools --enable-lto --enable-target-optspace --without-long-double-128 --disable-nls --enable-multiarch --enable-languages=c,c++ --disable-libstdcxx-verbose --enable-threads=posix --enable-gcov-custom-rtio --enable-libstdcxx-time=yes Thread model: posix Supported LTO compression algorithms: zlib gcc version 13.2.0 (crosstool-NG esp-13.2.0_20230928) ``` ```bash ./gcc/esp32s3-gdc/bin/xtensa-esp32s3-elf-gdc -v Using built-in specs. COLLECT_GCC=./gcc/esp32s3-gdc/bin/xtensa-esp32s3-elf-gdc COLLECT_LTO_WRAPPER=/home/kassane/gcc/esp32s3-gdc/bin/../libexec/gcc/xtensa-esp32s3-elf/13.2.0/lto-wrapper Target: xtensa-esp32s3-elf Configured with: ./configure --target=xtensa-esp32s3-elf --enable-languages=c,d,lto Thread model: single Supported LTO compression algorithms: zlib zstd gcc version 13.2.0 (GCC) ```
Apr 14
parent Witold Baryluk <witold.baryluk gmail.com> writes:
On Sunday, 14 April 2024 at 16:04:54 UTC, Matheus Catarino wrote:
 Espressif/LLVM have xtensa-ABI (windowed) partial support, but 
 GCC [upstream and fork] have both xtensa-ABI (call0 & windowed)
OK. BTW. If you are on Debian / Ubuntu, xtensa cross compilers for C,C++,D are prepackaged in official repo. Package is named `gcc-xtensa-lx106` (it has all 3 language compilers).
Apr 14