X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Flibffi.c;h=f607c39a9c3ba15e049b294d06a7f8e602d052ee;hb=70096a9b1fd886aa99ab51042db57c8ef6395488;hp=e859dbd1bad9b687c40a14ef46d78bf96819aa10;hpb=ddeb4918bce67ed63c5f4c8c4e250e92ebdef89d;p=m6w6%2Fext-psi diff --git a/src/libffi.c b/src/libffi.c index e859dbd..f607c39 100644 --- a/src/libffi.c +++ b/src/libffi.c @@ -156,6 +156,18 @@ static void psi_ffi_callback(ffi_cif *sig, void *result, void **args, void *data } static inline ffi_abi psi_ffi_abi(const char *convention) { + if (FFI_LAST_ABI - 2 != FFI_FIRST_ABI) { +#ifdef HAVE_FFI_STDCALL + if (!strcasecmp(convention, "stdcall")) { + return FFI_STDCALL; + } +#endif +#ifdef HAVE_FFI_FASTCALL + if (!strcasecmp(convention, "fastcall")) { + return FFI_FASTCALL; + } +#endif + } return FFI_DEFAULT_ABI; } @@ -288,14 +300,21 @@ static size_t psi_ffi_struct_type_pad(ffi_type **els, size_t padding) { } static ffi_type **psi_ffi_struct_type_elements(struct psi_decl_struct *strct) { - size_t i = 0, argc = psi_plist_count(strct->args), nels = 0, offset = 0, maxalign = 0; + size_t i = 0, argc = psi_plist_count(strct->args), nels = 0, offset = 0, maxalign = 0, last_arg_pos = -1; ffi_type **tmp, **els = calloc(argc + 1, sizeof(*els)); struct psi_decl_arg *darg; while (psi_plist_get(strct->args, i++, &darg)) { - ffi_type *type = malloc(sizeof(*type)); + ffi_type *type; size_t padding; + if (darg->layout->pos == last_arg_pos) { + /* skip bit fields */ + continue; + } + last_arg_pos = darg->layout->pos; + + type = malloc(sizeof(*type)); *type = *psi_ffi_decl_arg_type(darg); if (type->alignment > maxalign) {