X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Flibjit.c;h=51bdec5830cf63e524954c49f4b8df3c2c1c07d4;hb=70096a9b1fd886aa99ab51042db57c8ef6395488;hp=338e8a73de2b830457b67228204eae3433ae8cfb;hpb=ddeb4918bce67ed63c5f4c8c4e250e92ebdef89d;p=m6w6%2Fext-psi diff --git a/src/libjit.c b/src/libjit.c index 338e8a7..51bdec5 100644 --- a/src/libjit.c +++ b/src/libjit.c @@ -36,6 +36,12 @@ static inline jit_type_t psi_jit_decl_arg_type(struct psi_decl_arg *darg); static inline jit_abi_t psi_jit_abi(const char *convention) { + if (!strcasecmp(convention, "stdcall")) { + return jit_abi_stdcall; + } + if (!strcasecmp(convention, "fastcall")) { + return jit_abi_fastcall; + } return jit_abi_cdecl; } static inline jit_type_t psi_jit_token_type(token_t t) @@ -122,15 +128,23 @@ static unsigned psi_jit_struct_type_elements(struct psi_decl_struct *strct, jit_type_t **fields) { size_t i = 0, argc = psi_plist_count(strct->args), nels = 0, offset = 0, - maxalign; + maxalign, last_arg_pos = -1; struct psi_decl_arg *darg; *fields = calloc(argc + 1, sizeof(*fields)); while (psi_plist_get(strct->args, i++, &darg)) { - jit_type_t type = jit_type_copy(psi_jit_decl_arg_type(darg)); + jit_type_t type; size_t padding, alignment; + if (darg->layout->pos == last_arg_pos) { + /* skip bit fields */ + continue; + } + last_arg_pos = darg->layout->pos; + + type = jit_type_copy(psi_jit_decl_arg_type(darg)); + if ((alignment = jit_type_get_alignment(type)) > maxalign) { maxalign = alignment; }