AArch64 AAPCS64 by-value aggregate passing is not modeled¶
Index: Known gaps
Status (re-verified 2026-10-25): OPEN. abicheck/dwarf_advanced.py:893-899 models only SysV AMD64 (_SYSV_AMD64_RETURN_ARCHES), and its comment says an AArch64 HFA flip is just a generic value-ABI change.
A struct passed or returned by value on AArch64 travels in SIMD registers
when it is a homogeneous floating-point or short-vector aggregate (HFA/HVA,
1-4 members of one type), in general registers when it is at most 16
bytes, and indirectly otherwise (AAPCS64 §5.9.5). A change that moves an
aggregate across one of those boundaries without changing its size -- one
float member becoming an int -- breaks every compiled caller, and no
ChangeKind reports it: the value-ABI trait diff
(dwarf_advanced._diff_value_abi_traits) models only the SysV AMD64
register/indirect rule and treats an AArch64 trait flip as a generic
value-ABI change. docs/reference/platforms.md already lists HFA/HVA
drift as not detected.
A classifier for those boundaries
(macho_metadata.classify_aapcs64_aggregate) existed as an unwired,
unit-tested "modeling primitive"; the plan that was to wire it (G1) closed
without doing so, and the dead-code plan's Stage D removed it (it is in git
history, with its unit tests, tests/test_macos_arm64_abi.py). Wiring it is not a
Mach-O concern -- AAPCS64 governs AArch64 ELF too -- so a fix belongs in the
value-ABI trait path for target_arch == "aarch64", needs member base
types from DWARF, and needs an AArch64 toolchain to validate against real
binaries, which this environment does not have.