Hi,

this fixes the remaining issues found by libjava for use of libffi.

ChangeLog

2012-02-22  Kai Tietz  <kti...@redhat.com>

        PR libffi/52221
        * src/x86/ffi.c (ffi_closure_raw_THISCALL): New
        prototype.
        (ffi_prep_raw_closure_loc): Use ffi_closure_raw_THISCALL for
        thiscall-convention.
        (ffi_raw_call): Use ffi_prep_args_raw.
        * src/x86/win32.S (ffi_closure_raw_THISCALL): Add
        implementation for stub.

Tested for i686-w64-mingw32, and regression-tested for
x86_64-unknown-linux-gnu.  Ok for apply?

Regards,
Kai

Index: src/x86/ffi.c
===================================================================
--- src/x86/ffi.c       (revision 184486)
+++ src/x86/ffi.c       (working copy)
@@ -447,6 +447,8 @@
 void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *)
      __attribute__ ((regparm(1)));
 #ifdef X86_WIN32
+void FFI_HIDDEN ffi_closure_raw_THISCALL (ffi_raw_closure *)
+     __attribute__ ((regparm(1)));
 void FFI_HIDDEN ffi_closure_STDCALL (ffi_closure *)
      __attribute__ ((regparm(1)));
 void FFI_HIDDEN ffi_closure_THISCALL (ffi_closure *)
@@ -747,7 +749,7 @@
     }
   else if (cif->abi == FFI_THISCALL)
     {
-      FFI_INIT_TRAMPOLINE_THISCALL (&closure->tramp[0], &ffi_closure_raw_SYSV,
+      FFI_INIT_TRAMPOLINE_THISCALL (&closure->tramp[0],
&ffi_closure_raw_THISCALL,
                                    codeloc, cif->bytes);
     }
 #endif
@@ -795,7 +797,7 @@
 #ifdef X86_WIN32
     case FFI_SYSV:
     case FFI_STDCALL:
-      ffi_call_win32(ffi_prep_args, &ecif, cif->abi, cif->bytes, cif->flags,
+      ffi_call_win32(ffi_prep_args_raw, &ecif, cif->abi, cif->bytes,
cif->flags,
                     ecif.rvalue, fn);
       break;
     case FFI_THISCALL:
@@ -823,7 +825,7 @@
          cif->abi = abi = FFI_THISCALL;
        if (passed_regs < 1 && abi == FFI_THISCALL)
          cif->abi = abi = FFI_STDCALL;
-        ffi_call_win32(ffi_prep_args, &ecif, abi, cif->bytes, cif->flags,
+        ffi_call_win32(ffi_prep_args_raw, &ecif, abi, cif->bytes, cif->flags,
                        ecif.rvalue, fn);
       }
       break;
Index: src/x86/win32.S
===================================================================
--- src/x86/win32.S     (revision 184486)
+++ src/x86/win32.S     (working copy)
@@ -264,6 +264,18 @@
 #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
 #define CIF_FLAGS_OFFSET 20

+ffi_closure_raw_THISCALL PROC NEAR
+       push ebp
+       mov  ebp, esp
+       push esi
+       sub esp, 36
+       mov  esi, [eax + RAW_CLOSURE_CIF_OFFSET]        ;; closure->cif
+       mov  edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET]  ;; closure->user_data
+       mov [esp + 12], edx
+       lea edx, [ebp + 12], edx
+       jmp stubraw
+ffi_closure_raw_SYSV ENDP
+
 ffi_closure_raw_SYSV PROC NEAR USES esi
     ;; the ffi_closure ctx is passed in eax by the trampoline.

@@ -272,6 +284,7 @@
         mov  edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET]  ;; closure->user_data
         mov  [esp + 12], edx                            ;; user_data
         lea  edx, [ebp + 8]
+stubraw:
         mov  [esp + 8], edx                             ;; raw_args
         lea  edx, [ebp - 24]
         mov  [esp + 4], edx                             ;; &res
@@ -722,7 +735,21 @@
 #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
 #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
 #define CIF_FLAGS_OFFSET 20
-
+        .balign 16
+       .globl  _ffi_closure_raw_THISCALL
+#ifndef __OS2__
+       .def    _ffi_closure_raw_THISCALL;      .scl    2;      .type   32;     
.endef
+#endif
+_ffi_closure_raw_THISCALL:
+       pushl   %ebp
+       movl    %esp, %ebp
+       pushl   %esi
+       subl    $36, %esp
+       movl    RAW_CLOSURE_CIF_OFFSET(%eax), %esi       /* closure->cif */
+       movl    RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data 
*/
+       movl    %edx, 12(%esp)  /* user_data */
+       leal    12(%ebp), %edx  /* __builtin_dwarf_cfa () */
+       jmp     .stubraw
         # This assumes we are using gas.
         .balign 16
        .globl  _ffi_closure_raw_SYSV
@@ -742,6 +769,7 @@
        movl    RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data 
*/
        movl    %edx, 12(%esp)  /* user_data */
        leal    8(%ebp), %edx   /* __builtin_dwarf_cfa () */
+.stubraw:
        movl    %edx, 8(%esp)   /* raw_args */
        leal    -24(%ebp), %edx
        movl    %edx, 4(%esp)   /* &res */

Reply via email to