llvm-project
bd7bb261 - [clang] Match MSVC ABI for over-aligned base tail padding on Arm64 (#210461)

Commit
49 days ago
[clang] Match MSVC ABI for over-aligned base tail padding on Arm64 (#210461) When targeting aarch64-pc-windows-msvc, clang laid out a base following an over-aligned, non-standard-layout base at the wrong offset. MSVC on Arm64 reuses the over-aligned base's tail padding for the subsequent base, but clang rounded the base up to a full slot, so the two disagreed on member offsets, breaking interop between clang- and MSVC-built binaries. Fix: store each record's natural non-virtual alignment (excluding `alignas`/`__declspec(align)` over-alignment) as `getNonRequiredNVAlignment()`, and on Arm64 fold in a base's natural alignment rather than its full alignment. This is gated to Arm64 only; Arm64EC and x64 follow the x64 rule (no reuse) and are unchanged. Validated against MSVC (Hostx64\arm64\cl.exe /d1reportSingleClassLayout): clang now matches MSVC Arm64 exactly for the reduced repro, the original polymorphic case (vftable + empty base + template), and a range of probe cases covering natural vs. over-alignment padding and field vs. base reuse. Arm64EC and x64 output is byte-identical to before. Fixes #210174
Author
Parents
Loading