Thread overview
Xtensa support
Apr 12, 2024
Matheus Catarino
Apr 14, 2024
Witold Baryluk
Apr 14, 2024
Matheus Catarino
Apr 14, 2024
Witold Baryluk
April 12, 2024

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?

April 14, 2024

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.

April 14, 2024

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++.
$> /root/.espressif/tools/xtensa-esp-elf/esp-13.2.0_20230928/xtensa-esp-elf/bin/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-esp-elf/xtensa-esp-elf --with-headers=/builds/idf/crosstool-NG/builds/xtensa-esp-elf/xtensa-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)

Result

./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)
April 14, 2024

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).