catchup to cvs version of ctypes

svn: r3667
This commit is contained in:
Eli Barzilay 2006-07-09 22:27:22 +00:00
parent 794a1725e6
commit 3e049310a3
7 changed files with 40 additions and 109 deletions

View File

@ -26,8 +26,6 @@
OTHER DEALINGS IN THE SOFTWARE. OTHER DEALINGS IN THE SOFTWARE.
----------------------------------------------------------------------- */ ----------------------------------------------------------------------- */
#ifndef __x86_64__
#include <ffi.h> #include <ffi.h>
#include <ffi_common.h> #include <ffi_common.h>
@ -143,11 +141,7 @@ ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
/*@-declundef@*/ /*@-declundef@*/
/*@-exportheader@*/ /*@-exportheader@*/
#ifdef _MSC_VER
extern int extern int
#else
extern void
#endif
ffi_call_SYSV(void (*)(char *, extended_cif *), ffi_call_SYSV(void (*)(char *, extended_cif *),
/*@out@*/ extended_cif *, /*@out@*/ extended_cif *,
unsigned, unsigned, unsigned, unsigned,
@ -156,14 +150,9 @@ ffi_call_SYSV(void (*)(char *, extended_cif *),
/*@=declundef@*/ /*@=declundef@*/
/*@=exportheader@*/ /*@=exportheader@*/
#if defined(X86_WIN32) || defined(_MSC_VER)
/*@-declundef@*/ /*@-declundef@*/
/*@-exportheader@*/ /*@-exportheader@*/
#ifdef _MSC_VER
extern int extern int
#else
extern void
#endif
ffi_call_STDCALL(void (*)(char *, extended_cif *), ffi_call_STDCALL(void (*)(char *, extended_cif *),
/*@out@*/ extended_cif *, /*@out@*/ extended_cif *,
unsigned, unsigned, unsigned, unsigned,
@ -171,13 +160,8 @@ ffi_call_STDCALL(void (*)(char *, extended_cif *),
void (*fn)()); void (*fn)());
/*@=declundef@*/ /*@=declundef@*/
/*@=exportheader@*/ /*@=exportheader@*/
#endif /* X86_WIN32 || _MSC_VER*/
#ifdef _MSC_VER
int int
#else
void
#endif
ffi_call(/*@dependent@*/ ffi_cif *cif, ffi_call(/*@dependent@*/ ffi_cif *cif,
void (*fn)(), void (*fn)(),
/*@out@*/ void *rvalue, /*@out@*/ void *rvalue,
@ -206,24 +190,18 @@ ffi_call(/*@dependent@*/ ffi_cif *cif,
{ {
case FFI_SYSV: case FFI_SYSV:
/*@-usedef@*/ /*@-usedef@*/
#ifdef _MSC_VER return ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes,
return
#endif
ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes,
cif->flags, ecif.rvalue, fn); cif->flags, ecif.rvalue, fn);
/*@=usedef@*/ /*@=usedef@*/
break; break;
#if defined(X86_WIN32) || defined(_MSC_VER)
case FFI_STDCALL: case FFI_STDCALL:
/*@-usedef@*/ /*@-usedef@*/
#ifdef _MSC_VER return ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes,
return
#endif
ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes,
cif->flags, ecif.rvalue, fn); cif->flags, ecif.rvalue, fn);
/*@=usedef@*/ /*@=usedef@*/
break; break;
#endif /* X86_WIN32 */
default: default:
FFI_ASSERT(0); FFI_ASSERT(0);
break; break;
@ -236,23 +214,10 @@ ffi_call(/*@dependent@*/ ffi_cif *cif,
static void ffi_prep_incoming_args_SYSV (char *stack, void **ret, static void ffi_prep_incoming_args_SYSV (char *stack, void **ret,
void** args, ffi_cif* cif); void** args, ffi_cif* cif);
#ifndef _MSC_VER
static void ffi_closure_SYSV (ffi_closure *)
__attribute__ ((regparm(1)));
static void ffi_closure_raw_SYSV (ffi_raw_closure *)
__attribute__ ((regparm(1)));
#endif
/* This function is jumped to by the trampoline */ /* This function is jumped to by the trampoline */
#ifdef _MSC_VER
static void __fastcall static void __fastcall
ffi_closure_SYSV (ffi_closure *closure, int *argp) ffi_closure_SYSV (ffi_closure *closure, int *argp)
#else
static void
ffi_closure_SYSV (closure)
ffi_closure *closure;
#endif
{ {
// this is our return value storage // this is our return value storage
long double res; long double res;
@ -262,11 +227,7 @@ ffi_closure_SYSV (closure)
void **arg_area; void **arg_area;
unsigned short rtype; unsigned short rtype;
void *resp = (void*)&res; void *resp = (void*)&res;
#ifdef _MSC_VER
void *args = &argp[1]; void *args = &argp[1];
#else
void *args = __builtin_dwarf_cfa ();
#endif
cif = closure->cif; cif = closure->cif;
arg_area = (void**) alloca (cif->nargs * sizeof (void*)); arg_area = (void**) alloca (cif->nargs * sizeof (void*));
@ -388,10 +349,6 @@ ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
/* How to make a trampoline. Derived from gcc/config/i386/i386.c. */ /* How to make a trampoline. Derived from gcc/config/i386/i386.c. */
/* MOV EDX, ESP is 0x8b 0xd4 */
#ifdef _MSC_VER
#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX,BYTES) \ #define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX,BYTES) \
{ unsigned char *__tramp = (unsigned char*)(TRAMP); \ { unsigned char *__tramp = (unsigned char*)(TRAMP); \
unsigned int __fun = (unsigned int)(FUN); \ unsigned int __fun = (unsigned int)(FUN); \
@ -400,26 +357,13 @@ ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
*(unsigned char*) &__tramp[0] = 0xb9; \ *(unsigned char*) &__tramp[0] = 0xb9; \
*(unsigned int*) &__tramp[1] = __ctx; /* mov ecx, __ctx */ \ *(unsigned int*) &__tramp[1] = __ctx; /* mov ecx, __ctx */ \
*(unsigned char*) &__tramp[5] = 0x8b; \ *(unsigned char*) &__tramp[5] = 0x8b; \
*(unsigned char*) &__tramp[6] = 0xd4; \ *(unsigned char*) &__tramp[6] = 0xd4; /* mov edx, esp */ \
*(unsigned char*) &__tramp[7] = 0xe8; \ *(unsigned char*) &__tramp[7] = 0xe8; \
*(unsigned int*) &__tramp[8] = __dis; /* call __fun */ \ *(unsigned int*) &__tramp[8] = __dis; /* call __fun */ \
*(unsigned char*) &__tramp[12] = 0xC2; /* ret BYTES */ \ *(unsigned char*) &__tramp[12] = 0xC2; /* ret BYTES */ \
*(unsigned short*) &__tramp[13] = BYTES; \ *(unsigned short*) &__tramp[13] = BYTES; \
} }
#else
#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX,BYTES) \
({ unsigned char *__tramp = (unsigned char*)(TRAMP); \
unsigned int __fun = (unsigned int)(FUN); \
unsigned int __ctx = (unsigned int)(CTX); \
unsigned int __dis = __fun - ((unsigned int) __tramp + FFI_TRAMPOLINE_SIZE); \
*(unsigned char*) &__tramp[0] = 0xb8; \
*(unsigned int*) &__tramp[1] = __ctx; /* movl __ctx, %eax */ \
*(unsigned char *) &__tramp[5] = 0xe9; \
*(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \
})
#endif
/* the cif must already be prep'ed */ /* the cif must already be prep'ed */
ffi_status ffi_status
@ -433,10 +377,8 @@ ffi_prep_closure (ffi_closure* closure,
if (cif->abi == FFI_SYSV) if (cif->abi == FFI_SYSV)
bytes = 0; bytes = 0;
#ifdef _MSC_VER
else if (cif->abi == FFI_STDCALL) else if (cif->abi == FFI_STDCALL)
bytes = cif->bytes; bytes = cif->bytes;
#endif
else else
return FFI_BAD_ABI; return FFI_BAD_ABI;
@ -450,5 +392,3 @@ ffi_prep_closure (ffi_closure* closure,
return FFI_OK; return FFI_OK;
} }
#endif /* __x86_64__ */

View File

@ -272,11 +272,7 @@ ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif,
/*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type *rtype, /*@dependent@*/ /*@out@*/ /*@partial@*/ ffi_type *rtype,
/*@dependent@*/ ffi_type **atypes); /*@dependent@*/ ffi_type **atypes);
#ifdef _MSC_VER
int int
#else
void
#endif
ffi_call(/*@dependent@*/ ffi_cif *cif, ffi_call(/*@dependent@*/ ffi_cif *cif,
void (*fn)(), void (*fn)(),
/*@out@*/ void *rvalue, /*@out@*/ void *rvalue,

View File

@ -13,24 +13,7 @@ extern "C" {
#endif #endif
#include <fficonfig.h> #include <fficonfig.h>
#include <malloc.h>
/* Do not move this. Some versions of AIX are very picky about where
this is positioned. */
#ifdef __GNUC__
# define alloca __builtin_alloca
#else
# if HAVE_ALLOCA_H
# include <alloca.h>
# else
# ifdef _AIX
#pragma alloca
# else
# ifndef alloca /* predefined by HP cc +Olibcalls */
char *alloca ();
# endif
# endif
# endif
#endif
/* Check for the existence of memcpy. */ /* Check for the existence of memcpy. */
#if STDC_HEADERS #if STDC_HEADERS

View File

@ -3,8 +3,10 @@
/* fficonfig.h. Generated automatically by configure. */ /* fficonfig.h. Generated automatically by configure. */
/* fficonfig.h.in. Generated automatically from configure.in by autoheader. */ /* fficonfig.h.in. Generated automatically from configure.in by autoheader. */
/* Defines for MSVC */ /* Define this for MSVC, but not for mingw32! */
#ifdef _MSC_VER
#define __attribute__(x) /* */ #define __attribute__(x) /* */
#endif
#define alloca _alloca #define alloca _alloca
/*----------------------------------------------------------------*/ /*----------------------------------------------------------------*/

View File

@ -43,23 +43,21 @@ typedef enum ffi_abi {
FFI_FIRST_ABI = 0, FFI_FIRST_ABI = 0,
/* ---- Intel x86 Win32 ---------- */ /* ---- Intel x86 Win32 ---------- */
#if defined(X86_WIN32) || defined(_MSC_VER)
FFI_SYSV, FFI_SYSV,
FFI_STDCALL, FFI_STDCALL,
/* TODO: Add fastcall support for the sake of completeness */ /* TODO: Add fastcall support for the sake of completeness */
FFI_DEFAULT_ABI = FFI_SYSV, FFI_DEFAULT_ABI = FFI_SYSV,
#endif
/* ---- Intel x86 and AMD x86-64 - */ /* ---- Intel x86 and AMD x86-64 - */
#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) /* #if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) */
FFI_SYSV, /* FFI_SYSV, */
FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ /* FFI_UNIX64,*/ /* Unix variants all use the same ABI for x86-64 */
#ifdef __i386__ /* #ifdef __i386__ */
FFI_DEFAULT_ABI = FFI_SYSV, /* FFI_DEFAULT_ABI = FFI_SYSV, */
#else /* #else */
FFI_DEFAULT_ABI = FFI_UNIX64, /* FFI_DEFAULT_ABI = FFI_UNIX64, */
#endif /* #endif */
#endif /* #endif */
FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
} ffi_abi; } ffi_abi;
@ -73,11 +71,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 _MSC_VER #define FFI_TRAMPOLINE_SIZE 15
# define FFI_TRAMPOLINE_SIZE 15
#else
# 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

View File

@ -147,7 +147,7 @@ ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif,
else else
#endif #endif
{ {
#ifndef _MSC_VER #if !defined(_MSC_VER) && !defined(__MINGW32__)
/* Don't know if this is a libffi bug or not. At least on /* Don't know if this is a libffi bug or not. At least on
Windows with MSVC, function call parameters are *not* Windows with MSVC, function call parameters are *not*
aligned in the same way as structure fields are, they are aligned in the same way as structure fields are, they are

View File

@ -42,6 +42,10 @@ _ffi_call_SYSV:
pushl %ebp pushl %ebp
movl %esp,%ebp movl %esp,%ebp
#THe: save previous %esi, and store the current stack pointer in %esi
pushl %esi
movl %esp,%esi
# Make room for all of the new args. # Make room for all of the new args.
movl 16(%ebp),%ecx movl 16(%ebp),%ecx
subl %ecx,%esp subl %ecx,%esp
@ -65,6 +69,8 @@ _ffi_call_SYSV:
movl 16(%ebp),%ecx movl 16(%ebp),%ecx
addl %ecx,%esp addl %ecx,%esp
sub %esp,%esi # calculate stack pointer difference
# Load %ecx with the return type code # Load %ecx with the return type code
movl 20(%ebp),%ecx movl 20(%ebp),%ecx
@ -125,6 +131,8 @@ retstruct:
noretval: noretval:
epilogue: epilogue:
movl %esi,%eax # return the stack pointer detlta in %eax
popl %esi # restore previous %esi
movl %ebp,%esp movl %ebp,%esp
popl %ebp popl %ebp
ret ret
@ -139,6 +147,10 @@ _ffi_call_STDCALL:
pushl %ebp pushl %ebp
movl %esp,%ebp movl %esp,%ebp
#THe: save previous %esi, and store the current stack pointer in %esi
pushl %esi
movl %esp,%esi
# Make room for all of the new args. # Make room for all of the new args.
movl 16(%ebp),%ecx movl 16(%ebp),%ecx
subl %ecx,%esp subl %ecx,%esp
@ -158,6 +170,8 @@ _ffi_call_STDCALL:
call *28(%ebp) call *28(%ebp)
sub %esp,%esi # difference in stack
# stdcall functions pop arguments off the stack themselves # stdcall functions pop arguments off the stack themselves
# Load %ecx with the return type code # Load %ecx with the return type code
@ -220,6 +234,8 @@ sc_retstruct:
sc_noretval: sc_noretval:
sc_epilogue: sc_epilogue:
movl %esi,%eax # return the stack difference
popl %esi # restore previous %esi value
movl %ebp,%esp movl %ebp,%esp
popl %ebp popl %ebp
ret ret