From bea7f0cc7c9cdd883340c80697abc0be028bf944 Mon Sep 17 00:00:00 2001 From: Valery Ushakov Date: Thu, 19 Dec 2019 14:01:01 +0300 Subject: Properly ensure 16-byte alignment on NetBSD. --- emu/port/alloc.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'emu/port/alloc.c') diff --git a/emu/port/alloc.c b/emu/port/alloc.c index 8b623de0..3cb45552 100644 --- a/emu/port/alloc.c +++ b/emu/port/alloc.c @@ -75,11 +75,7 @@ enum { /* tracing */ enum { -#ifdef __NetBSD__ - Npadlong = 4, /* XXX: preserve 16-byte alignment */ -#else Npadlong = 2, -#endif MallocOffset = 0, ReallocOffset = 1 }; @@ -383,9 +379,22 @@ dopoolalloc(Pool *p, ulong asize, ulong pc) unlock(&p->l); return nil; } +#ifdef __NetBSD__ + /* Align allocations to 16 bytes */ + { + const size_t off = __builtin_offsetof(struct Bhdr, u.data) + + Npadlong*sizeof(ulong); + struct assert_align { + unsigned int align_ok : (off % 8 == 0) ? 1 : -1; + }; + + const ulong align = (off - 1) % 16; + t = (Bhdr *)(((ulong)t + align) & ~align); + } +#else /* Double alignment */ t = (Bhdr *)(((ulong)t + 7) & ~7); - +#endif if(p->chain != nil && (char*)t-(char*)B2LIMIT(p->chain)-ldr == 0){ /* can merge chains */ if(0)print("merging chains %p and %p in %s\n", p->chain, t, p->name); -- cgit v1.2.3