diff options
author | Mike Pall <mike> | 2010-12-09 18:48:23 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-12-09 18:48:23 +0100 |
commit | cc0efd85d670f3804aeda057420798045d8d5b74 (patch) | |
tree | cffb122456010d7b50fd1b5696dd7b96b5bc0274 | |
parent | 1d860909269ebc89f475793b4034d565544a0869 (diff) | |
download | luajit-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.c | 9 |
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 | } |