From cc0efd85d670f3804aeda057420798045d8d5b74 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Thu, 9 Dec 2010 18:48:23 +0100 Subject: [PATCH] FFI: Fix alignment of scalars/vectors modified with mode attribute. --- src/lj_cparse.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/lj_cparse.c b/src/lj_cparse.c index ddb2e1c9..5a4df556 100644 --- a/src/lj_cparse.c +++ b/src/lj_cparse.c @@ -851,18 +851,23 @@ static CTypeID cp_decl_intern(CPState *cp, CPDecl *decl) if (!(info & CTF_BOOL)) { CTSize msize = ctype_msizeP(decl->attr); CTSize vsize = ctype_vsizeP(decl->attr); - if (msize && (!(info & CTF_FP) || (msize == 4 || msize == 8))) + if (msize && (!(info & CTF_FP) || (msize == 4 || msize == 8))) { + CTSize malign = lj_fls(msize); + if (malign > 4) malign = 4; /* Limit alignment. */ + CTF_INSERT(info, ALIGN, malign); size = msize; /* Override size via mode. */ + } if (vsize) { /* Vector size set? */ CTSize esize = lj_fls(size); if (vsize >= esize) { /* Intern the element type first. */ id = lj_ctype_intern(cp->cts, info, size); /* Then create a vector (array) with vsize alignment. */ + size = (1u << vsize); + if (vsize > 4) vsize = 4; /* Limit alignment. */ if (ctype_align(info) > vsize) vsize = ctype_align(info); info = CTINFO(CT_ARRAY, (info & CTF_QUAL) + CTF_VECTOR + CTALIGN(vsize)); - size = (1u << vsize); } } }