Commit 90409e4c by Andrew Haley Committed by Andrew Haley

ffitarget.h, [...]: Back out stdcall changes.

2009-06-04  Andrew Haley  <aph@redhat.com>

	* src/x86/ffitarget.h, src/x86/win32.S, src/x86/ffi.c: Back out
	stdcall changes.

From-SVN: r148178
parent d46c937c
2009-06-04 Andrew Haley <aph@redhat.com>
* src/x86/ffitarget.h, src/x86/win32.S, src/x86/ffi.c: Back out
stdcall changes.
2008-02-26 Anthony Green <green@redhat.com> 2008-02-26 Anthony Green <green@redhat.com>
Thomas Heller <theller@ctypes.org> Thomas Heller <theller@ctypes.org>
......
/* ----------------------------------------------------------------------- /* -----------------------------------------------------------------------
ffi.c - Copyright (c) 1996, 1998, 1999, 2001, 2007, 2008 Red Hat, Inc. ffi.c - Copyright (c) 1996, 1998, 1999, 2001, 2007 Red Hat, Inc.
Copyright (c) 2002 Ranjit Mathew Copyright (c) 2002 Ranjit Mathew
Copyright (c) 2002 Bo Thorsen Copyright (c) 2002 Bo Thorsen
Copyright (c) 2002 Roger Sayle Copyright (c) 2002 Roger Sayle
...@@ -236,10 +236,6 @@ unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *) ...@@ -236,10 +236,6 @@ unsigned int FFI_HIDDEN ffi_closure_SYSV_inner (ffi_closure *, void **, void *)
__attribute__ ((regparm(1))); __attribute__ ((regparm(1)));
void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *) void FFI_HIDDEN ffi_closure_raw_SYSV (ffi_raw_closure *)
__attribute__ ((regparm(1))); __attribute__ ((regparm(1)));
#ifdef X86_WIN32
void FFI_HIDDEN ffi_closure_STDCALL (ffi_closure *)
__attribute__ ((regparm(1)));
#endif
/* This function is jumped to by the trampoline */ /* This function is jumped to by the trampoline */
...@@ -249,7 +245,7 @@ ffi_closure_SYSV_inner (closure, respp, args) ...@@ -249,7 +245,7 @@ ffi_closure_SYSV_inner (closure, respp, args)
void **respp; void **respp;
void *args; void *args;
{ {
/* our various things... */ // our various things...
ffi_cif *cif; ffi_cif *cif;
void **arg_area; void **arg_area;
...@@ -315,26 +311,13 @@ ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue, ...@@ -315,26 +311,13 @@ ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, void **avalue,
({ unsigned char *__tramp = (unsigned char*)(TRAMP); \ ({ unsigned char *__tramp = (unsigned char*)(TRAMP); \
unsigned int __fun = (unsigned int)(FUN); \ unsigned int __fun = (unsigned int)(FUN); \
unsigned int __ctx = (unsigned int)(CTX); \ unsigned int __ctx = (unsigned int)(CTX); \
unsigned int __dis = __fun - (__ctx + 10); \ unsigned int __dis = __fun - (__ctx + FFI_TRAMPOLINE_SIZE); \
*(unsigned char*) &__tramp[0] = 0xb8; \ *(unsigned char*) &__tramp[0] = 0xb8; \
*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \ *(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \
*(unsigned char *) &__tramp[5] = 0xe9; \ *(unsigned char *) &__tramp[5] = 0xe9; \
*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ *(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \
}) })
#define FFI_INIT_TRAMPOLINE_STDCALL(TRAMP,FUN,CTX,SIZE) \
({ unsigned char *__tramp = (unsigned char*)(TRAMP); \
unsigned int __fun = (unsigned int)(FUN); \
unsigned int __ctx = (unsigned int)(CTX); \
unsigned int __dis = __fun - (__ctx + 10); \
unsigned short __size = (unsigned short)(SIZE); \
*(unsigned char*) &__tramp[0] = 0xb8; \
*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \
*(unsigned char *) &__tramp[5] = 0xe8; \
*(unsigned int*) &__tramp[6] = __dis; /* call __fun */ \
*(unsigned char *) &__tramp[10] = 0xc2; \
*(unsigned short*) &__tramp[11] = __size; /* ret __size */ \
})
/* the cif must already be prep'ed */ /* the cif must already be prep'ed */
...@@ -345,24 +328,11 @@ ffi_prep_closure_loc (ffi_closure* closure, ...@@ -345,24 +328,11 @@ ffi_prep_closure_loc (ffi_closure* closure,
void *user_data, void *user_data,
void *codeloc) void *codeloc)
{ {
if (cif->abi == FFI_SYSV) FFI_ASSERT (cif->abi == FFI_SYSV);
{
FFI_INIT_TRAMPOLINE (&closure->tramp[0], FFI_INIT_TRAMPOLINE (&closure->tramp[0], \
&ffi_closure_SYSV, &ffi_closure_SYSV, \
(void*)codeloc); codeloc);
}
#ifdef X86_WIN32
else if (cif->abi == FFI_STDCALL)
{
FFI_INIT_TRAMPOLINE_STDCALL (&closure->tramp[0],
&ffi_closure_STDCALL,
(void*)codeloc, cif->bytes);
}
#endif
else
{
return FFI_BAD_ABI;
}
closure->cif = cif; closure->cif = cif;
closure->user_data = user_data; closure->user_data = user_data;
...@@ -384,9 +354,7 @@ ffi_prep_raw_closure_loc (ffi_raw_closure* closure, ...@@ -384,9 +354,7 @@ ffi_prep_raw_closure_loc (ffi_raw_closure* closure,
{ {
int i; int i;
if (cif->abi != FFI_SYSV) { FFI_ASSERT (cif->abi == FFI_SYSV);
return FFI_BAD_ABI;
}
// we currently don't support certain kinds of arguments for raw // we currently don't support certain kinds of arguments for raw
// closures. This should be implemented by a separate assembly language // closures. This should be implemented by a separate assembly language
......
...@@ -78,11 +78,7 @@ typedef enum ffi_abi { ...@@ -78,11 +78,7 @@ typedef enum ffi_abi {
#define FFI_TRAMPOLINE_SIZE 24 #define FFI_TRAMPOLINE_SIZE 24
#define FFI_NATIVE_RAW_API 0 #define FFI_NATIVE_RAW_API 0
#else #else
#ifdef X86_WIN32
#define FFI_TRAMPOLINE_SIZE 13
#else
#define FFI_TRAMPOLINE_SIZE 10 #define FFI_TRAMPOLINE_SIZE 10
#endif
#define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ #define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */
#endif #endif
......
...@@ -264,22 +264,6 @@ sc_epilogue: ...@@ -264,22 +264,6 @@ sc_epilogue:
.ffi_call_STDCALL_end: .ffi_call_STDCALL_end:
.LFE2: .LFE2:
.globl _ffi_closure_STDCALL
_ffi_closure_STDCALL:
pushl %ebp
movl %esp, %ebp
subl $40, %esp
leal -24(%ebp), %edx
movl %edx, -12(%ebp) /* resp */
leal 12(%ebp), %edx /* account for stub return address on stack */
movl %edx, 4(%esp) /* args */
leal -12(%ebp), %edx
movl %edx, (%esp) /* &resp */
call _ffi_closure_SYSV_inner
movl -12(%ebp), %ecx
jmp .Lcls_return_result
.ffi_closure_STDCALL_end:
# This assumes we are using gas. # This assumes we are using gas.
.balign 16 .balign 16
.globl _ffi_closure_SYSV .globl _ffi_closure_SYSV
...@@ -299,7 +283,6 @@ _ffi_closure_SYSV: ...@@ -299,7 +283,6 @@ _ffi_closure_SYSV:
movl %edx, (%esp) /* &resp */ movl %edx, (%esp) /* &resp */
call _ffi_closure_SYSV_inner call _ffi_closure_SYSV_inner
movl -12(%ebp), %ecx movl -12(%ebp), %ecx
.Lcls_return_result:
cmpl $FFI_TYPE_INT, %eax cmpl $FFI_TYPE_INT, %eax
je .Lcls_retint je .Lcls_retint
cmpl $FFI_TYPE_FLOAT, %eax cmpl $FFI_TYPE_FLOAT, %eax
...@@ -409,6 +392,70 @@ _ffi_closure_raw_SYSV: ...@@ -409,6 +392,70 @@ _ffi_closure_raw_SYSV:
#endif /* !FFI_NO_RAW_API */ #endif /* !FFI_NO_RAW_API */
# This assumes we are using gas.
.balign 16
.globl _ffi_closure_STDCALL
.def _ffi_closure_STDCALL; .scl 2; .type 32; .endef
_ffi_closure_STDCALL:
.LFB5:
pushl %ebp
.LCFI9:
movl %esp, %ebp
.LCFI10:
subl $40, %esp
leal -24(%ebp), %edx
movl %edx, -12(%ebp) /* resp */
leal 12(%ebp), %edx /* account for stub return address on stack */
movl %edx, 4(%esp) /* args */
leal -12(%ebp), %edx
movl %edx, (%esp) /* &resp */
call _ffi_closure_SYSV_inner
movl -12(%ebp), %ecx
/* It would be nice to just share this code with the
duplicate sequence in _ffi_closure_SYSV, if only
there were some way to represent that in the EH info. */
cmpl $FFI_TYPE_INT, %eax
je .Lscls_retint
cmpl $FFI_TYPE_FLOAT, %eax
je .Lscls_retfloat
cmpl $FFI_TYPE_DOUBLE, %eax
je .Lscls_retdouble
cmpl $FFI_TYPE_LONGDOUBLE, %eax
je .Lscls_retldouble
cmpl $FFI_TYPE_SINT64, %eax
je .Lscls_retllong
cmpl $FFI_TYPE_SINT8, %eax /* 1-byte struct */
je .Lscls_retstruct1
cmpl $FFI_TYPE_SINT16, %eax /* 2-bytes struct */
je .Lscls_retstruct2
.Lscls_epilogue:
movl %ebp, %esp
popl %ebp
ret
.Lscls_retint:
movl (%ecx), %eax
jmp .Lscls_epilogue
.Lscls_retfloat:
flds (%ecx)
jmp .Lscls_epilogue
.Lscls_retdouble:
fldl (%ecx)
jmp .Lscls_epilogue
.Lscls_retldouble:
fldt (%ecx)
jmp .Lscls_epilogue
.Lscls_retllong:
movl (%ecx), %eax
movl 4(%ecx), %edx
jmp .Lscls_epilogue
.Lscls_retstruct1:
movsbl (%ecx), %eax
jmp .Lscls_epilogue
.Lscls_retstruct2:
movswl (%ecx), %eax
jmp .Lscls_epilogue
.ffi_closure_STDCALL_end:
.LFE5:
.section .eh_frame,"w" .section .eh_frame,"w"
.Lframe1: .Lframe1:
...@@ -571,3 +618,34 @@ _ffi_closure_raw_SYSV: ...@@ -571,3 +618,34 @@ _ffi_closure_raw_SYSV:
.LEFDE4: .LEFDE4:
#endif /* !FFI_NO_RAW_API */ #endif /* !FFI_NO_RAW_API */
.LSFDE5:
.long .LEFDE5-.LASFDE5 /* FDE Length */
.LASFDE5:
.long .LASFDE5-.Lframe1 /* FDE CIE offset */
#if defined __PIC__ && defined HAVE_AS_X86_PCREL
.long .LFB5-. /* FDE initial location */
#else
.long .LFB5
#endif
.long .LFE5-.LFB5 /* FDE address range */
#ifdef __PIC__
.byte 0x0 /* .uleb128 0x0; Augmentation size */
#endif
/* DW_CFA_xxx CFI instructions go here. */
.byte 0x4 /* DW_CFA_advance_loc4 */
.long .LCFI9-.LFB5
.byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
.byte 0x8 /* .uleb128 0x8 */
.byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
.byte 0x2 /* .uleb128 0x2 */
.byte 0x4 /* DW_CFA_advance_loc4 */
.long .LCFI10-.LCFI9
.byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
.byte 0x5 /* .uleb128 0x5 */
/* End of DW_CFA_xxx CFI instructions. */
.align 4
.LEFDE5:
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment