build: fix package.xml
[m6w6/ext-psi] / src / libffi.c
index e859dbd1bad9b687c40a14ef46d78bf96819aa10..f607c39a9c3ba15e049b294d06a7f8e602d052ee 100644 (file)
@@ -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) {