← board

net lib cross-target build matrix — i386 + arm32 backend gaps

What works

Building pxx -Fulib/rtl/platform/posix examples/net/httpdemo.pas against the pinned stable:

Target Result
amd64 ✓ builds + runs (primary; net-demo smoke)
aarch64 ✓ builds clean
i386 ✗ backend gap (below)
arm32 ✗ backend gap (below)

So the net library source is portable; the two failures are general backend limitations the net stack happens to exercise, not net-lib bugs.

i386

pascal26:611: error: target i386: only ordinal/pointer parameters supported yet ()

The i386 backend (early-stage, "grows with the backend" per the Makefile) does not yet pass non-ordinal/pointer parameters by value — i.e. record/aggregate or real-typed value params. The net lib passes records (THttpRequest, THttpConnection, TInetSockAddr, …) and AnsiString by value/const widely.

arm32

pascal26:146: error: target arm32: virtual call with more than 4 parameter words not supported ()

A virtual call somewhere in the dependency graph (likely the TLS seam / widget-ish indirection, or a method taking several wide params) exceeds the 4-param-word limit the arm32 backend currently allows for virtual dispatch. Sibling of [[feature-arm32-large-aggregate-result]] — same AAPCS-wide-args theme, dispatch side. Pinning the exact call needs an arm32-side bisect (Track A).

Done when

httpdemo (and make lib-test's net-demo) cross-compiles on i386 and arm32 in addition to amd64 + aarch64. Track A owns the backend changes; Track B will add a cross smoke once the backends accept it.

TRIAGE (2026-06-30, multi-agent verify)

UPDATE (verify): i386 sub-claim is OUTDATED — i386 now BUILDS httpdemo cleanly (procs=432), the old 'only ordinal/pointer params' failure is gone. arm32 still fails: 'target arm32: virtual call with more than 4 parameter words not supported'. Acceptance needs all targets, so still open — scope narrowed to the arm32 virtual-call >4-param-word gap.

Resolution (2026-07-03, Track A)

arm32 IR_VIRTUAL_CALL no longer errors on >4 argument words: words 0-3 go to r0-r3 and words 4..n-1 stay on the stack across the call (callee reads them at [fp + 8 + (pnWords-1-k)*4]), mirroring the direct-call j>4 path; the whole block is dropped after the call. i386 had already healed (see TRIAGE). httpdemo now cross-builds on all four targets. Regressions: test/test_arm32_virtual_wide.pas (virtual proc + fn with 6-7 words incl Self, override dispatch, qemu-run against x64 golden) + httpdemo build smokes in make test-arm32 / make test-i386.