-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Description
Nim Version
Nim Compiler Version 2.3.1 [Linux: amd64]
Compiled at 2025-09-25
Copyright (c) 2006-2025 by Andreas Rumpf
git hash: 9f74712
active boot switches: -d:release
as well as
Nim Compiler Version 2.2.4 [Linux: amd64]
Compiled at 2025-04-22
Copyright (c) 2006-2025 by Andreas Rumpf
git hash: f7145dd
active boot switches: -d:release
OS: WSL2 Ubuntu in Windows 11
Description
I have a special config.nims
file for compiling Nim to ESP32 (Xtensa) architecture.
Here is the relevant part:
# Xtensa CPU
switch "cpu", "esp"
switch "passC", "-mlongcalls -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero"
switch "passC", "-Wno-frame-address"
This has worked before, but it doesn't now - this is probably because of changes in GCC? My GCC version si 15.1.0
(using Xtensa GCC from ESP-IDF toolchain).
Current Output
> nimble prepare --verbose
Info: Package cache path /home/ado_linux/.nimble/pkgcache
Info: Nimble data file "/home/ado_linux/.nimble/nimbledata2.json" has been loaded.
Info: Dependency on nim@>= 1.0.0 already satisfied
Info: Dependency on nim@>= 1.6.0 already satisfied
Info: Dependency on unicodedb@>= 0.13.2 already satisfied
Info: Dependency on nim@>= 1.6.2 already satisfied
Info: Dependency on regex@>= 0.19.0 already satisfied
Attempting to execute hook prepareBefore in /home/ado_linux/esp/esp-idf_nim_template/esp_idf_nim_template.nimble
Executing task prepare in /home/ado_linux/esp/esp-idf_nim_template/esp_idf_nim_template.nimble
Using toolchain version: esp-15.1.0_20250607
Hint: used config file '/home/ado_linux/.choosenim/toolchains/nim-#devel/config/nim.cfg' [Conf]
Hint: used config file '/home/ado_linux/.choosenim/toolchains/nim-#devel/config/config.nims' [Conf]
Hint: used config file '/home/ado_linux/esp/esp-idf_nim_template/config.nims' [Conf]
..............................................................
CC: system/exceptions.nim
CC: std/private/digitsutils.nim
CC: std/private/dragonbox.nim
CC: std/private/schubfach.nim
CC: std/formatfloat.nim
CC: system/dollars.nim
CC: system.nim
CC: libnim.nim
In file included from /home/ado_linux/esp/esp-idf_nim_template/main/nimcache/@pstd@sprivate@sdigitsutils.nim.c:128:
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/system/strs_v2.nim: In function 'nimAddCharV1':
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/system/strs_v2.nim:93:39: error: passing argument 3 of '__builtin_sadd_overflow' from incompatible pointer type [-Wincompatible-pointer-types]
93 | inc s.len
| ^
| |
| NI * {aka long int *}
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:606:66: note: in definition of macro 'nimAddInt'
606 | #define nimAddInt(a, b, res) __builtin_sadd_overflow(a, b, res)
| ^~~
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/system/strs_v2.nim:93:39: note: expected 'int *' but argument is of type 'NI *' {aka 'long int *'}
93 | inc s.len
| ^
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:606:66: note: in definition of macro 'nimAddInt'
606 | #define nimAddInt(a, b, res) __builtin_sadd_overflow(a, b, res)
| ^~~
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/std/private/digitsutils.nim: In function '_ZN11digitsutils8addCharsE3varI6stringE5arrayI8range0234charE3int3int':
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/std/private/digitsutils.nim:45:29: error: passing argument 3 of '__builtin_sadd_overflow' from incompatible pointer type [-Wincompatible-pointer-types]
45 | result.setLen old + n
| ^
| |
| NI * {aka long int *}
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:606:66: note: in definition of macro 'nimAddInt'
606 | #define nimAddInt(a, b, res) __builtin_sadd_overflow(a, b, res)
| ^~~
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/std/private/digitsutils.nim:45:29: note: expected 'int *' but argument is of type 'NI *' {aka 'long int *'}
45 | result.setLen old + n
| ^
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:606:66: note: in definition of macro 'nimAddInt'
606 | #define nimAddInt(a, b, res) __builtin_sadd_overflow(a, b, res)
| ^~~
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/std/private/digitsutils.nim: In function '_ZN11digitsutils10addIntImplE3varI6stringE6uInt64':
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/std/private/digitsutils.nim:72:37: error: passing argument 3 of '__builtin_sadd_overflow' from incompatible pointer type [-Wincompatible-pointer-types]
72 | # process last 1-2 digits
| ^
| |
| NI * {aka long int *}
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:606:66: note: in definition of macro 'nimAddInt'
606 | #define nimAddInt(a, b, res) __builtin_sadd_overflow(a, b, res)
| ^~~
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/std/private/digitsutils.nim:72:37: note: expected 'int *' but argument is of type 'NI *' {aka 'long int *'}
72 | # process last 1-2 digits
| ^
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:606:66: note: in definition of macro 'nimAddInt'
606 | #define nimAddInt(a, b, res) __builtin_sadd_overflow(a, b, res)
| ^~~
compilation terminated due to -fmax-errors=3.
Error: execution of an external compiler program '/home/ado_linux/.espressif/tools/xtensa-esp-elf/esp-15.1.0_20250607/xtensa-esp-elf/bin/xtensa-esp32s3-elf-gcc -c -w -fmax-errors=3 -fno-strict-aliasing -mlongcalls -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero -g3 -Og -Os -fno-ident -I'/home/ado_linux/.choosenim/toolchains/nim-#devel/lib' -I/home/ado_linux/esp/esp-idf_nim_template/main -o /home/ado_linux/esp/esp-idf_nim_template/main/nimcache/@pstd@sprivate@sdigitsutils.nim.c.o /home/ado_linux/esp/esp-idf_nim_template/main/nimcache/@pstd@sprivate@sdigitsutils.nim.c' failed with exit code: 1
In file included from /home/ado_linux/esp/esp-idf_nim_template/main/nimcache/@pstd@sformatfloat.nim.c:128:
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/std/private/digitsutils.nim: In function '_ZN11digitsutils11utoa2DigitsE3varI9openArrayI4charEE3int6uInt32':
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/std/private/digitsutils.nim:34:34: error: passing argument 3 of '__builtin_sadd_overflow' from incompatible pointer type [-Wincompatible-pointer-types]
34 | buf[pos+1] = digits100[2 * digits + 1]
| ~^~~~~~~
| |
| NI * {aka long int *}
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:606:66: note: in definition of macro 'nimAddInt'
606 | #define nimAddInt(a, b, res) __builtin_sadd_overflow(a, b, res)
| ^~~
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/std/private/digitsutils.nim:34:34: note: expected 'int *' but argument is of type 'NI *' {aka 'long int *'}
34 | buf[pos+1] = digits100[2 * digits + 1]
| ~^~~~~~~
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:606:66: note: in definition of macro 'nimAddInt'
606 | #define nimAddInt(a, b, res) __builtin_sadd_overflow(a, b, res)
| ^~~
stack trace: (most recent call last)
/tmp/nimblecache-7250407160657696389/nimscriptapi_4880102100347668418.nim(219, 16)
/home/ado_linux/esp/esp-idf_nim_template/esp_idf_nim_template.nimble(15, 5) prepareTask
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/system/nimscript.nim(264, 7) exec
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/system/nimscript.nim(264, 7) Error: unhandled exception: FAILED: nim c main/libnim.nim [OSError]
nimscriptwrapper.nim(166) execScript
In file included from /home/ado_linux/esp/esp-idf_nim_template/main/nimcache/@mlibnim.nim.c:128:
/home/ado_linux/esp/esp-idf_nim_template/main/libnim.nim: In function 'add_int_in_nim':
Error: Exception raised during nimble script execution
/home/ado_linux/esp/esp-idf_nim_template/main/libnim.nim:4:28: error: passing argument 3 of '__builtin_sadd_overflow' from incompatible pointer type [-Wincompatible-pointer-types]
4 | result = a + b
| ^
| |
| NI32 * {aka long int *}
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:606:66: note: in definition of macro 'nimAddInt'
606 | #define nimAddInt(a, b, res) __builtin_sadd_overflow(a, b, res)
| ^~~
/home/ado_linux/esp/esp-idf_nim_template/main/libnim.nim:4:28: note: expected 'int *' but argument is of type 'NI32 *' {aka 'long int *'}
4 | result = a + b
| ^
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:606:66: note: in definition of macro 'nimAddInt'
606 | #define nimAddInt(a, b, res) __builtin_sadd_overflow(a, b, res)
| ^~~
Info: Nimble data file "/home/ado_linux/.nimble/nimbledata2.json" has been saved.
In file included from /home/ado_linux/esp/esp-idf_nim_template/main/nimcache/@psystem.nim.c:128:
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/system/iterators_1.nim: In function '_ZN6system18collectCyclesBaconE3varIN6system5GcEnvEE3int':
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/system/iterators_1.nim:39:33: error: passing argument 3 of '__builtin_ssub_overflow' from incompatible pointer type [-Wincompatible-pointer-types]
39 | dec(res, step)
| ^
| |
| NI * {aka long int *}
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:607:66: note: in definition of macro 'nimSubInt'
607 | #define nimSubInt(a, b, res) __builtin_ssub_overflow(a, b, res)
| ^~~
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/system/iterators_1.nim:39:33: note: expected 'int *' but argument is of type 'NI *' {aka 'long int *'}
39 | dec(res, step)
| ^
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:607:66: note: in definition of macro 'nimSubInt'
607 | #define nimSubInt(a, b, res) __builtin_ssub_overflow(a, b, res)
| ^~~
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/system/iterators_1.nim:39:33: error: passing argument 3 of '__builtin_ssub_overflow' from incompatible pointer type [-Wincompatible-pointer-types]
39 | dec(res, step)
| ^
| |
| NI * {aka long int *}
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:607:66: note: in definition of macro 'nimSubInt'
607 | #define nimSubInt(a, b, res) __builtin_ssub_overflow(a, b, res)
| ^~~
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/system/iterators_1.nim:39:33: note: expected 'int *' but argument is of type 'NI *' {aka 'long int *'}
39 | dec(res, step)
| ^
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:607:66: note: in definition of macro 'nimSubInt'
607 | #define nimSubInt(a, b, res) __builtin_ssub_overflow(a, b, res)
| ^~~
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/system/iterators_1.nim:131:31: error: passing argument 3 of '__builtin_sadd_overflow' from incompatible pointer type [-Wincompatible-pointer-types]
131 | inc i
| ^
| |
| NI * {aka long int *}
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:606:66: note: in definition of macro 'nimAddInt'
606 | #define nimAddInt(a, b, res) __builtin_sadd_overflow(a, b, res)
| ^~~
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/system/iterators_1.nim:131:31: note: expected 'int *' but argument is of type 'NI *' {aka 'long int *'}
131 | inc i
| ^
/home/ado_linux/.choosenim/toolchains/nim-#devel/lib/nimbase.h:606:66: note: in definition of macro 'nimAddInt'
606 | #define nimAddInt(a, b, res) __builtin_sadd_overflow(a, b, res)
| ^~~
compilation terminated due to -fmax-errors=3.
Expected Output
compile OK
Known Workarounds
Using switch "passC", "-Wno-incompatible-pointer-types"
suppresses the errors and compilation completes.
Additional Information
My config for RISC-V ESPs seems to work OK. Here is repo where all the code lives: https://github.com/adokitkat/esp-idf_nim_template
The whole config.nims
file (there is also esptarget.nims
file which loads some information like GCC path, etc.):
import os, strformat
include "esptarget.nims"
let gcc_exe = gcc_target & "-gcc"
switch "gcc.path", gcc_path
switch "gcc.exe", gcc_exe
switch "gcc.linkerexe", gcc_exe
import strutils
if target == "esp32" or "esp32s" in target:
# Xtensa CPU
switch "cpu", "esp"
switch "passC", "-mlongcalls -fno-builtin-memcpy -fno-builtin-memset -fno-builtin-bzero"
if target == "esp32":
switch "passC", "-Wno-frame-address"
# Workaround for newer GCC versions (14+?)
#switch "passC", "-Wno-incompatible-pointer-types"
else:
# RISC-V CPU
switch "cpu", "riscv32"
switch "passC", "-mtune=esp-base"
if target in ["esp32c2", "esp32c3"]:
switch "passC", "-march=rv32imc_zicsr_zifencei"
elif target in ["esp32c5", "esp32c6", "esp32c61", "esp32h2", "esp32h21"]:
switch "passC", "-march=rv32imac_zicsr_zifencei_zaamo_zalrsc"
elif target in ["esp32h4"]:
switch "passC", "-march=rv32imafc_zicsr_zifencei_zaamo_zalrsc_xespdsp"
switch "passC", "-mabi=ilp32f"
elif target in ["esp32p4"]:
var esp32p4_rev = ""
const esp32p4_rev_rx: Regex= re"(# CONFIG_ESP32P4_SELECTS_REV_LESS_V3)"
for m in sdkconfig.findAll(esp32p4_rev_rx):
esp32p4_rev = m.groupFirstCapture(0, sdkconfig)
break
if esp32p4_rev == "":
switch "passC", "-march=rv32imafc_zicsr_zifencei_zaamo_zalrsc_xesploop_xespv2p1" # ESP32-P4 rev. 2 and earlier
else:
switch "passC", "-march=rv32imafc_zicsr_zifencei_zaamo_zalrsc_zcb_zcmp_zcmt_xesploop_xespv -mno-cm-popret -mno-cm-push-reverse" # ESP32-P4 rev. 3+
switch "passC", "-mabi=ilp32f"
switch "os", "freertos"
switch "mm", "orc"
switch "threads", "off"
switch "define", "release"
switch "opt", "size"
switch "out", "main/libnim.a"
switch "define", "nimAdaptiveOrc"
switch "define", "use_malloc"
switch "define", "no_signal_handler"
switch "debugger", "native"
switch "tls_emulation", "off"
switch "app", "staticLib"
switch "noMain"
switch "header"
switch "nimcache", "main/nimcache"
switch "forceBuild"
# begin Nimble config (version 2)
when withDir(thisDir(), system.fileExists("nimble.paths")):
include "nimble.paths"
# end Nimble config