Partial fix for #2917
authorSimon Marlow <marlowsd@gmail.com>
Fri, 6 Mar 2009 10:00:18 +0000 (10:00 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Fri, 6 Mar 2009 10:00:18 +0000 (10:00 +0000)
commit1b62aecee4a58f52999cfa53f1c6b7744b29b808
tree94ef6f6bb4e555c5ec27fa85e01ce12068bc1b3d
parenta0b4833f77f420053e4b78e40ac17d9687d382e0
Partial fix for #2917

 - add newAlignedPinnedByteArray# for allocating pinned BAs with
   arbitrary alignment

 - the old newPinnedByteArray# now aligns to 16 bytes

Foreign.alloca will use newAlignedPinnedByteArray#, and so might end
up wasting less space than before (we used to align to 8 by default).
Foreign.allocaBytes and Foreign.mallocForeignPtrBytes will get 16-byte
aligned memory, which is enough to avoid problems with SSE
instructions on x86, for example.

There was a bug in the old newPinnedByteArray#: it aligned to 8 bytes,
but would have failed if the header was not a multiple of 8
(fortunately it always was, even with profiling).  Also we
occasionally wasted some space unnecessarily due to alignment in
allocatePinned().

I haven't done anything about Foreign.malloc/mallocBytes, which will
give you the same alignment guarantees as malloc() (8 bytes on
Linux/x86 here).
compiler/prelude/primops.txt.pp
includes/StgMiscClosures.h
rts/Linker.c
rts/PrimOps.cmm
rts/sm/Compact.c
rts/sm/Evac.c
rts/sm/Storage.c