diff mbox

[libffi] : Fix problem 52221

Message ID CAEwic4bAeOTEEbb=tFpo=aW++G5awLKsv9tWL6qrZjp5a1wPLw@mail.gmail.com
State New
Headers show

Commit Message

Kai Tietz Feb. 22, 2012, 7:30 p.m. UTC
Hi,

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

ChangeLog

2012-02-22  Kai Tietz  <ktietz@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
diff mbox

Patch

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 */