From 5b2e51db2c5e445cb98e026fc1e290c14eca67c1 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Mon, 25 May 2026 01:15:29 +0200 Subject: FFI: Various ABI and calling convention fixes. Thanks to Sergey Kaplun. #1455 --- src/lj_cparse.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'src/lj_cparse.c') diff --git a/src/lj_cparse.c b/src/lj_cparse.c index a1361a128..56e3e8491 100644 --- a/src/lj_cparse.c +++ b/src/lj_cparse.c @@ -1309,14 +1309,16 @@ static void cp_struct_layout(CPState *cp, CTypeID sid, CTInfo sattr) align = ctype_align(attr); if (cp->packstack[cp->curpack] < align) align = cp->packstack[cp->curpack]; - if (align > maxalign) maxalign = align; + bsz = ctype_bitcsz(ct->info); /* Bitfield size (temp.). */ + if (align > maxalign && bsz) maxalign = align; amask = (8u << align) - 1; - bsz = ctype_bitcsz(ct->info); /* Bitfield size (temp.). */ if (bsz == CTBSZ_FIELD || !ctype_isfield(ct->info)) { bsz = csz; /* Regular fields or subtypes always fill the container. */ bofs = (bofs + amask) & ~amask; /* Start new aligned field. */ ct->size = (bofs >> 3); /* Store field offset. */ + if (ctype_isfield(ct->info)) + ct->info = CTINFO(CT_FIELD, ctype_cid(ct->info)) + CTALIGN(align); } else { /* Bitfield. */ if (bsz == 0 || (attr & CTFP_ALIGNED) || (!((attr|sattr) & CTFP_PACKED) && (bofs & amask) + bsz > csz)) @@ -1324,7 +1326,8 @@ static void cp_struct_layout(CPState *cp, CTypeID sid, CTInfo sattr) /* Prefer regular field over bitfield. */ if (bsz == csz && (bofs & amask) == 0) { - ct->info = CTINFO(CT_FIELD, ctype_cid(ct->info)); + ct->info = CTINFO(CT_FIELD, ctype_cid(ct->info)) + + CTALIGN(lj_fls(sz)); ct->size = (bofs >> 3); /* Store field offset. */ } else { if (csz > amask+1 && bsz <= amask+1) -- cgit v1.2.3-55-g6feb