DEV Community

Cover image for Solución de Error "fno-tree-switch-conversion" de clangd con Xtensa-elf-g++ en sistemas GNU/Linux Debian x86_64
Mashiro Marsell
Mashiro Marsell

Posted on

Solución de Error "fno-tree-switch-conversion" de clangd con Xtensa-elf-g++ en sistemas GNU/Linux Debian x86_64

Esta solución ha sido probada en el microcontrolador ESP32 (Espressif)


Requisitos previos

  • GNU++11 como estándar del core
  • PlatformIO Core 6.1.18 o superior
  • curl 8.14.1 o superior (o alternativamente wget 1.25.0 o superior)
  • Python 3.13.5 o superior
  • Carpeta de instalación .platformio en /home/USUARIO/
  • Vim 9.2.1 o Neovim 0.11.5 o superior
  • LazyVim (opcional)
  • Mason.nvim 2.2.1 o superior
  • clangd 21.1.8 o superior

Creación de un proyecto en PlatformIO para ESP32 Pico

Crear la carpeta del proyecto

mkdir -p proyecto1

cd proyecto1/

pio --boards list | grep esp32

pio project init --board pico32 --ide vim

pio run -t compiledb

Enter fullscreen mode Exit fullscreen mode

Correcion de error fno-tree-switch-conversion con archivo yaml

El compilador Clangd necesita de el compile_commands.json para encontrar las rutas que establece el compilador de Xtensa. Aunque hay problemas en la lectura de las cabeceras, por lo que es necesario hacer un archivo .clangd o clangd.yaml. Fuentes:

Link:compileflags
Link:Suppress
Link: Discusion de Github

En la carpeta raiz crear un archivo con el nombre: .clangd o clangd.yaml

:/proyecto1$ touch .clangd

Copiar este codigo a .clangd, e introducir la informacion segun sea.

CompileFlags:
  #Binario del compilador de Xtensa para archivos con extension .cpp
  Compiler: /home/USUARIO/.platformio/packages/toolchain-xtensa-esp32/bin/xtensa-esp32-elf-g++

  Add: [
    #Correccion de banderas de clangd a gcc
    "-D__GNUC__=8",
    "-D__GNUC_MINOR__=4",
    "-D__GNUC_PATCHLEVEL__=0",
    "-D__GXX_EXPERIMENTAL_CXX0X__=1",

    # Solucion para el error GLIBC
    "-D__GLIBC_USE(x)=0",
    "-D__GLIBC_PREREQ(x,y)=0",

    # Forzar modo para esp32 y no x86_64
    "-x", "c++",
    "-fno-exceptions",
    "-std=gnu++11",
    "--target=xtensa-esp32-elf",
    "-DARDUINO=10812",
    "-DARDUINO_ARCH_ESP32",
    "-DARDUINO_VARIANT=\"esp32\"",
    "-DESP32",

    # TOOLCHAIN (LibrerIa estándar de C/C++) ---
    "-isystem", "/home/USUARIO/.platformio/packages/toolchain-xtensa-esp32/xtensa-esp32-elf/include/c++/8.4.0",
    "-isystem", "/home/USUARIO/.platformio/packages/toolchain-xtensa-esp32/xtensa-esp32-elf/include/c++/8.4.0/xtensa-esp32-elf",
    "-isystem", "/home/USUARIO/.platformio/packages/toolchain-xtensa-esp32/lib/gcc/xtensa-esp32-elf/8.4.0/include",
    "-isystem", "/home/USUARIO/.platformio/packages/toolchain-xtensa-esp32/xtensa-esp32-elf/include",

    # CORE ARDUINO (Marco Arduino) ---
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/cores/esp32",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/variants/esp32",

    # LIBRERIAS INTEGRADAS
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/Wire/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/SPI/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/WiFi/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/BluetoothSerial/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/FS/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/SD/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/HTTPClient/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/Update/src",
    "-I/home/USUARIO/.platformio/packages/framework-arduinoespressif32/libraries/WebServer/src",

  ]

  #Quitar todos los errores que arroja clangd y banderas que no puede interpretar
  Remove: [
    "-mlongcalls",
    "-mlong-calls",
    "-fno-tree-switch-conversion",
    "-fstrict-volatile-bitfields",
    "-mfix-esp32-erratum-76",
    "-fno-shrink-wrap",
    "-fno-tree-pre"
  ]

Diagnostics:
  Suppress: [
    "drv_unknown_argument", 
    "pp_file_not_found", 
    "unknown_argument",
    "illegal_use_of_builtin"
  ]
Enter fullscreen mode Exit fullscreen mode

Top comments (0)