mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 23:24:09 +00:00
FFI: Fix alignment of scalars/vectors modified with mode attribute.
This commit is contained in:
parent
1d86090926
commit
cc0efd85d6
@ -851,18 +851,23 @@ static CTypeID cp_decl_intern(CPState *cp, CPDecl *decl)
|
|||||||
if (!(info & CTF_BOOL)) {
|
if (!(info & CTF_BOOL)) {
|
||||||
CTSize msize = ctype_msizeP(decl->attr);
|
CTSize msize = ctype_msizeP(decl->attr);
|
||||||
CTSize vsize = ctype_vsizeP(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. */
|
size = msize; /* Override size via mode. */
|
||||||
|
}
|
||||||
if (vsize) { /* Vector size set? */
|
if (vsize) { /* Vector size set? */
|
||||||
CTSize esize = lj_fls(size);
|
CTSize esize = lj_fls(size);
|
||||||
if (vsize >= esize) {
|
if (vsize >= esize) {
|
||||||
/* Intern the element type first. */
|
/* Intern the element type first. */
|
||||||
id = lj_ctype_intern(cp->cts, info, size);
|
id = lj_ctype_intern(cp->cts, info, size);
|
||||||
/* Then create a vector (array) with vsize alignment. */
|
/* 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);
|
if (ctype_align(info) > vsize) vsize = ctype_align(info);
|
||||||
info = CTINFO(CT_ARRAY, (info & CTF_QUAL) + CTF_VECTOR +
|
info = CTINFO(CT_ARRAY, (info & CTF_QUAL) + CTF_VECTOR +
|
||||||
CTALIGN(vsize));
|
CTALIGN(vsize));
|
||||||
size = (1u << vsize);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user