← board

--target=esp32s3 builds call0; IDF on the s3 is windowed

Found 2026-09-24 (frankS) while adding the s3 leg of the ESP C conformance run.

Measured

Why it was not fixed with the finding

The decide ticket (decide-esp-soc-axis-and-capability-table) says a SoC target implies the capability row, and the ABI is in that table's axes, so the implication itself looks decided. Two things stand in the way:

  1. Makefile test-xtensa: --target=esp32s3 --emit-obj test/lib_asyncnet6.pas ("THE ESP PARITY THIS WAS ACTUALLY FOR") goes red under windowed, because CoSwitch is call0-only and its negative control asserts windowed refuses. Making the chip imply windowed turns that parity row into a refusal. That is arguably the TRUE answer for IDF on the s3, but it changes a row someone wrote deliberately.
  2. c_crtl_s3.o in test-emit-obj builds as call0 today for the same reason.

Condition that would retire this

--target=esp32s3 --emit-obj producing an object whose app_main at .text+0 begins with entry (bytes 36 xx 00), and a booted tools/esp_run.sh --chip esp32s3 of a program built with only the chip name.

Resolution (2026-09-24, frankH)

Both halves were done in one change, since neither is correct alone.

The retire condition, both halves measured:

What the s3 asyncnet6 row now asserts: the same command line, and it now builds a WINDOWED object. It still passes, now for the right reason.

Not changed: esp_flash.sh's esp32s2 case still spells the generic xtensa. --target=esp32s2 would also move the SoC from the implied s3 to a real s2, and no s2 was available to verify that.

Log