This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Ensure that the IV in struct pmop (for ithreads) is aligned properly.
authorNicholas Clark <nick@ccl4.org>
Thu, 23 May 2013 11:46:05 +0000 (13:46 +0200)
committerNicholas Clark <nick@ccl4.org>
Fri, 24 May 2013 19:24:38 +0000 (21:24 +0200)
commitc2a50ddb1bed657609ef5e85c7ac5c0bfcaa2c9a
treeff9c078ad470966531f5e91f7917e7dc2bb8698e
parent1a72e160c417a912e69c85d4171a406daa388a27
Ensure that the IV in struct pmop (for ithreads) is aligned properly.

The members of struct pmop vary between ithreads and non-ithreads builds.
For ithreads, an IV is used for op_pmoffset. For 32 bit platforms built
with -Duse64bitint, IVs are 64 bits, but pointers (and all other members of
all OP structures) are 32 bits, hence on 32 bit platforms OP structure sizes
can be an odd multiple of 4 bytes. Since the swap to the slab allocator,
this is causing problems on architectures where 8 byte IVs have to be 8
byte aligned, notably sparcs. The long-term fix is to replace the IV with
an appropriate 32 bit type, as it is being used for an array index. However,
for maint-5.18 we need a work around which doesn't change the public headers
and ideally doesn't impose a large speed or memory penalty.

Hence for now, simply avoid using the slab allocator when allocating a
struct pmop. Only do this for 32 bit platforms build with 8 byte IVs and
ithreads.

This is the interim fix for RT #118055.
op.c
pod/perldelta.pod