aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2010-12-09 18:48:23 +0100
committerMike Pall <mike>2010-12-09 18:48:23 +0100
commitcc0efd85d670f3804aeda057420798045d8d5b74 (patch)
treecffb122456010d7b50fd1b5696dd7b96b5bc0274
parent1d860909269ebc89f475793b4034d565544a0869 (diff)
downloadluajit-cc0efd85d670f3804aeda057420798045d8d5b74.tar.gz
luajit-cc0efd85d670f3804aeda057420798045d8d5b74.tar.bz2
luajit-cc0efd85d670f3804aeda057420798045d8d5b74.zip
FFI: Fix alignment of scalars/vectors modified with mode attribute.
-rw-r--r--src/lj_cparse.c9
1 files 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)
851 if (!(info & CTF_BOOL)) { 851 if (!(info & CTF_BOOL)) {
852 CTSize msize = ctype_msizeP(decl->attr); 852 CTSize msize = ctype_msizeP(decl->attr);
853 CTSize vsize = ctype_vsizeP(decl->attr); 853 CTSize vsize = ctype_vsizeP(decl->attr);
854 if (msize && (!(info & CTF_FP) || (msize == 4 || msize == 8))) 854 if (msize && (!(info & CTF_FP) || (msize == 4 || msize == 8))) {
855 CTSize malign = lj_fls(msize);
856 if (malign > 4) malign = 4; /* Limit alignment. */
857 CTF_INSERT(info, ALIGN, malign);
855 size = msize; /* Override size via mode. */ 858 size = msize; /* Override size via mode. */
859 }
856 if (vsize) { /* Vector size set? */ 860 if (vsize) { /* Vector size set? */
857 CTSize esize = lj_fls(size); 861 CTSize esize = lj_fls(size);
858 if (vsize >= esize) { 862 if (vsize >= esize) {
859 /* Intern the element type first. */ 863 /* Intern the element type first. */
860 id = lj_ctype_intern(cp->cts, info, size); 864 id = lj_ctype_intern(cp->cts, info, size);
861 /* Then create a vector (array) with vsize alignment. */ 865 /* Then create a vector (array) with vsize alignment. */
866 size = (1u << vsize);
867 if (vsize > 4) vsize = 4; /* Limit alignment. */
862 if (ctype_align(info) > vsize) vsize = ctype_align(info); 868 if (ctype_align(info) > vsize) vsize = ctype_align(info);
863 info = CTINFO(CT_ARRAY, (info & CTF_QUAL) + CTF_VECTOR + 869 info = CTINFO(CT_ARRAY, (info & CTF_QUAL) + CTF_VECTOR +
864 CTALIGN(vsize)); 870 CTALIGN(vsize));
865 size = (1u << vsize);
866 } 871 }
867 } 872 }
868 } 873 }