One program, three backend gaps
From the cross attempt (umbrella-cross-target-codegen-is-correct, 2026-09-02):
uses_tkinter_and_configparser | i386:BUILD arm32:BUILD riscv32:BUILD aarch64:BUILD xtensa:BUILD
Five refusals, and reading them is the whole finding — they are not one cause wearing five hats:
| target | message |
|---|---|
| i386 | pascal26:5563: target i386: symbol kind not supported yet (load) |
| arm32 | pascal26:2345: target arm32: constructor with more than 4 parameter words not supported — FIXED, see below |
| aarch64 | pascal26:399: target aarch64: call argument count mismatch |
| riscv32 | target riscv32: external (dynamic) symbols are not supported on this target (first one: Tcl_FindExecutable) |
| xtensa | same as riscv32 |
The two that are not defects
riscv32 and xtensa say the true thing: they emit no dynamic segment, and this
demo needs libtcl at runtime. That refusal names its own reason and its own
alternatives. Out of scope here — it is a target capability, not a gap in
this program's lowering.
The one to look at first — done, and it was a defect
aarch64's call argument count mismatch was the odd one out: the other two
name a feature nobody has written, this one named an internal disagreement. A
refusal that reports a count mismatch describes a state the compiler believes is
impossible, so it was a defect until shown otherwise.
It was. Fixed 2026-09-02 —
bug-p-a-write-call-inside-a-method-named-write-binds-to-the-member-whatever-its-arity.
aarch64 builds the demo now. The reading was worth more than the ranking: the
same defect was silently writing an EMPTY FILE on x86-64, where no guard
caught it.
Rank
Low against the other cross work because the program is a binding demo rather than a core one — but it is the ONLY example in the tree that fails on every cross target, so it names gaps nothing else reaches.
2026-09-02 — arm32 fixed too, and it was worth more than the demo
The arm32 refusal was honest but the ground under it was not. Lifting it needed
a test, the test was written to cover the BOUNDARY rather than the reported
failure, and one row with an Int64 first parameter — so that the word count
and the argument count stop being the same number — found that every 32-bit
backend's constructor arm pushed one word per argument. i386 segfaulted on it,
xtensa answered wrong values, riscv32 had its own arity refusal on top.
bug-a-the-constructor-argument-ladder-is-the-copy-that-never-learned-argument-classes.
So of this demo's four causes, two were unwritten features and two were
defects, and both defects reached far outside it. The remaining i386 one
(symbol kind not supported yet (load)) is the last, and on that record it
deserves opening rather than ranking.
Resolved 2026-09-02 (frankC) — all three of ours, and every one was a defect
i386 BUILDS was: symbol kind not supported yet (load)
arm32 BUILDS was: constructor with more than 4 parameter words
aarch64 BUILDS was: call argument count mismatch
riscv32 refuses dynamic symbols -- correct, out of scope
xtensa refuses dynamic symbols -- correct, out of scope
The ticket predicted one defect among three refusals, on the grounds that aarch64's message named an internal disagreement rather than an unwritten feature. All three turned out to be defects, and each reached far outside this demo:
| cause | what it really was |
|---|---|
| aarch64 | Write(f, x) inside a method named write bound to the member whatever its arity; x86-64 emitted the call and wrote an EMPTY FILE reporting success — bug-p-a-write-call-inside-a-method-named-write-binds-to-the-member-whatever-its-arity |
| arm32 | the constructor argument ladder never learned argument classes, on all four 32-bit backends; i386 segfaulted on it — bug-a-the-constructor-argument-ladder-is-the-copy-that-never-learned-argument-classes |
| i386 | PYITER_MAP the const and pyiter_map the function are ONE identifier; the call answered 4 — bug-a-a-const-and-a-routine-of-the-same-name-silently-resolve-to-the-const |
A demo nobody runs was the best bug-finding instrument in the tree, because it is the one program that touches the RTL, the NilPy builtins and a binding layer at once, and because three backends' refusals were reading a source x86-64 accepted quietly.