Summary
On the arm backend, synth compile skips (emits no code for) any function whose call signature needs the AAPCS stack-argument path — i.e. more than 8 scalar params, or any 64-bit (i64/f64) param that would land on the stack. The function is dropped from the ELF rather than lowered. This is a completeness gap on the road to self-contained firmware (and to the #494 0.7× goal): every reachable function must lower.
Verified on synth v0.15.1 (released aarch64-apple-darwin binary).
Minimal repro
sum10.wat — 10 i32 params:
(module
(func (export "sum10") (param i32 i32 i32 i32 i32 i32 i32 i32 i32 i32) (result i32)
local.get 0 local.get 1 i32.add local.get 2 i32.add local.get 3 i32.add
local.get 4 i32.add local.get 5 i32.add local.get 6 i32.add local.get 7 i32.add
local.get 8 i32.add local.get 9 i32.add))
$ synth compile sum10.wat -t cortex-m3 --cortex-m -o /tmp/r.elf
warning: skipping function 'sum10': backend 'arm' failed: ... Synthesis failed:
#359: function has 10 params; the AAPCS stack-argument path supports at most 8 scalar params
Error: no functions compiled successfully (1 skipped) — nothing to emit
mix.wat — 5 params, one i64 on the stack:
(module
(func (export "mix") (param i32 i32 i32 i32 i64) (result i64)
local.get 4 local.get 0 i64.extend_i32_u i64.add))
warning: skipping function 'mix': ... Synthesis failed:
#359: function has 5 params including a 64-bit (i64/f64) param; the AAPCS stack-argument path supports only i32 params
Control: the same shape with 8 i32 params compiles cleanly and emits an ELF.
Impact (real workload)
Compiling the falcon flight component (falcon-flight-v1.94 → meld-fused → loom-optimized → synth compile -t cortex-m3), 3 of the 29 skipped functions fail on exactly this: func_57 (10 params), func_58 (25 params), func_163 (5 params incl. a 64-bit). These survive meld/loom as legitimate lowered helpers; the arm backend just can't pass their args. (The other 26 skips are the known float #369 (23) and register-exhaustion (3) buckets — tracked separately.)
Two asks
- Lower these per AAPCS — r0–r3 for the first 4 words, the rest spilled to the stack (with 8-byte alignment for 64-bit params), and the i64/f64 stack-passing case. This unblocks 3 falcon functions today and is on the critical path for self-contained firmware +
#494.
- Fix the diagnostic label — the warning cites
#359, which is closed and about a different bug (sret first-arg shift). There's no open issue for the stack-arg-path limitation itself; this is it.
Summary
On the
armbackend,synth compileskips (emits no code for) any function whose call signature needs the AAPCS stack-argument path — i.e. more than 8 scalar params, or any 64-bit (i64/f64) param that would land on the stack. The function is dropped from the ELF rather than lowered. This is a completeness gap on the road to self-contained firmware (and to the#4940.7× goal): every reachable function must lower.Verified on synth v0.15.1 (released aarch64-apple-darwin binary).
Minimal repro
sum10.wat— 10 i32 params:mix.wat— 5 params, one i64 on the stack:Control: the same shape with 8 i32 params compiles cleanly and emits an ELF.
Impact (real workload)
Compiling the falcon flight component (
falcon-flight-v1.94→ meld-fused → loom-optimized →synth compile -t cortex-m3), 3 of the 29 skipped functions fail on exactly this:func_57(10 params),func_58(25 params),func_163(5 params incl. a 64-bit). These survive meld/loom as legitimate lowered helpers; the arm backend just can't pass their args. (The other 26 skips are the known float#369(23) and register-exhaustion (3) buckets — tracked separately.)Two asks
#494.#359, which is closed and about a different bug (sret first-arg shift). There's no open issue for the stack-arg-path limitation itself; this is it.