Branch: refs/heads/blead
  Home:   https://github.com/Perl/perl5
  Commit: 914b0076e0ecf29ef800cad16518e6d8d3cb3f67
      
https://github.com/Perl/perl5/commit/914b0076e0ecf29ef800cad16518e6d8d3cb3f67
  Author: Tony Cook <t...@develop-help.com>
  Date:   2024-11-18 (Mon, 18 Nov 2024)

  Changed paths:
    M sv_inline.h

  Log Message:
  -----------
  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



To unsubscribe from these emails, change your notification settings at 
https://github.com/Perl/perl5/settings/notifications

Reply via email to