aboutsummaryrefslogtreecommitdiff
path: root/src/lj_cparse.c
diff options
context:
space:
mode:
authorMike Pall <mike>2026-05-25 01:15:29 +0200
committerMike Pall <mike>2026-05-25 01:15:29 +0200
commit5b2e51db2c5e445cb98e026fc1e290c14eca67c1 (patch)
tree8eeb8aa6fcdf56e54145636e96255136e667beb2 /src/lj_cparse.c
parent18b087cd2cd4ddc4a79782bf155383a689d5093d (diff)
downloadluajit-5b2e51db2c5e445cb98e026fc1e290c14eca67c1.tar.gz
luajit-5b2e51db2c5e445cb98e026fc1e290c14eca67c1.tar.bz2
luajit-5b2e51db2c5e445cb98e026fc1e290c14eca67c1.zip
FFI: Various ABI and calling convention fixes.
Thanks to Sergey Kaplun. #1455
Diffstat (limited to 'src/lj_cparse.c')
-rw-r--r--src/lj_cparse.c9
1 files changed, 6 insertions, 3 deletions
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)
1309 align = ctype_align(attr); 1309 align = ctype_align(attr);
1310 if (cp->packstack[cp->curpack] < align) 1310 if (cp->packstack[cp->curpack] < align)
1311 align = cp->packstack[cp->curpack]; 1311 align = cp->packstack[cp->curpack];
1312 if (align > maxalign) maxalign = align; 1312 bsz = ctype_bitcsz(ct->info); /* Bitfield size (temp.). */
1313 if (align > maxalign && bsz) maxalign = align;
1313 amask = (8u << align) - 1; 1314 amask = (8u << align) - 1;
1314 1315
1315 bsz = ctype_bitcsz(ct->info); /* Bitfield size (temp.). */
1316 if (bsz == CTBSZ_FIELD || !ctype_isfield(ct->info)) { 1316 if (bsz == CTBSZ_FIELD || !ctype_isfield(ct->info)) {
1317 bsz = csz; /* Regular fields or subtypes always fill the container. */ 1317 bsz = csz; /* Regular fields or subtypes always fill the container. */
1318 bofs = (bofs + amask) & ~amask; /* Start new aligned field. */ 1318 bofs = (bofs + amask) & ~amask; /* Start new aligned field. */
1319 ct->size = (bofs >> 3); /* Store field offset. */ 1319 ct->size = (bofs >> 3); /* Store field offset. */
1320 if (ctype_isfield(ct->info))
1321 ct->info = CTINFO(CT_FIELD, ctype_cid(ct->info)) + CTALIGN(align);
1320 } else { /* Bitfield. */ 1322 } else { /* Bitfield. */
1321 if (bsz == 0 || (attr & CTFP_ALIGNED) || 1323 if (bsz == 0 || (attr & CTFP_ALIGNED) ||
1322 (!((attr|sattr) & CTFP_PACKED) && (bofs & amask) + bsz > csz)) 1324 (!((attr|sattr) & CTFP_PACKED) && (bofs & amask) + bsz > csz))
@@ -1324,7 +1326,8 @@ static void cp_struct_layout(CPState *cp, CTypeID sid, CTInfo sattr)
1324 1326
1325 /* Prefer regular field over bitfield. */ 1327 /* Prefer regular field over bitfield. */
1326 if (bsz == csz && (bofs & amask) == 0) { 1328 if (bsz == csz && (bofs & amask) == 0) {
1327 ct->info = CTINFO(CT_FIELD, ctype_cid(ct->info)); 1329 ct->info = CTINFO(CT_FIELD, ctype_cid(ct->info)) +
1330 CTALIGN(lj_fls(sz));
1328 ct->size = (bofs >> 3); /* Store field offset. */ 1331 ct->size = (bofs >> 3); /* Store field offset. */
1329 } else { 1332 } else {
1330 if (csz > amask+1 && bsz <= amask+1) 1333 if (csz > amask+1 && bsz <= amask+1)