Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
bodies_by_type[SVt_PVNV]: handle __float128 NV alignment on 32-bit
Perl SV body structures include xmg_stash and xmg_u fields at the front, which are only valid for type SVt_PVMG and higher. This allows those fields to be at a constant offset from the start of the body. To save memory perl generally allocates the bodies where type < SVt_PVMG without the space needed for these two fields, offsetting the body pointer back by the size of the two fields. At least for the first body in an arena this is technically undefined behaviour, but we've done it forever. With -msse __float128 requires 16 byte alignment, but for XPVNV bodies the hack used here means that the base of the XPVNV body ends up mis-aligned on 32-bit systems. On 64-bit systems the combined size of those fields is 16-bytes so the modified pointer is still properly aligned. To fix this allocate the full XPVNV structure when 16 byte alignment is required for NV, NV is more than 8 bytes and pointers are small enough that the NV would have been mis-aligned. Fixes #22577
- Loading branch information