OSDN Git Service

* configure.in (powerpc64*-*-linux*): Remove.
[pf3gnuchains/gcc-fork.git] / libffi / include / ffi.h.in
index c28ebf6..c51a809 100644 (file)
@@ -1,7 +1,5 @@
 /* -----------------------------------------------------------------*-C-*-
-   libffi @VERSION@ - Copyright (c) 1996-1999  Cygnus Solutions
-
-   $Id: ffi.h.in,v 1.3 1999/08/08 13:05:12 green Exp $
+   libffi @VERSION@ - Copyright (c) 1996-2003  Cygnus Solutions
 
    Permission is hereby granted, free of charge, to any person obtaining
    a copy of this software and associated documentation files (the
 
    ----------------------------------------------------------------------- */
 
+/* -------------------------------------------------------------------
+   The basic API is described in the README file.
+
+   The raw API is designed to bypass some of the argument packing
+   and unpacking on architectures for which it can be avoided.
+
+   The closure API allows interpreted functions to be packaged up
+   inside a C function pointer, so that they can be called as C functions,
+   with no understanding on the client side that they are interpreted.
+   It can also be used in other cases in which it is necessary to package
+   up a user specified parameter and a function pointer as a single
+   function pointer.
+
+   The closure API must be implemented in order to get its functionality,
+   e.g. for use by gij.  Routines are provided to emulate the raw API
+   if the underlying platform doesn't allow faster implementation.
+
+   More details on the raw and cloure API can be found in:
+
+   http://gcc.gnu.org/ml/java/1999-q3/msg00138.html
+
+   and
+
+   http://gcc.gnu.org/ml/java/1999-q3/msg00174.html
+   -------------------------------------------------------------------- */
+
 #ifndef LIBFFI_H
 #define LIBFFI_H
 
@@ -36,27 +60,8 @@ extern "C" {
 
 /* ---- System configuration information --------------------------------- */
 
-#ifdef PACKAGE
-#define OLD_PACKAGE PACKAGE
-#undef PACKAGE
-#endif
-#ifdef VERSION
-#define OLD_VERSION VERSION
-#undef VERSION
-#endif
-
 #include <fficonfig.h>
 
-#undef PACKAGE
-#undef VERSION
-
-#ifdef OLD_PACKAGE
-#define PACKAGE OLD_PACKAGE
-#endif
-#ifdef OLD_VERSION
-#define VERSION OLD_VERSION
-#endif
-
 #if !defined(LIBFFI_ASM)
 #include <stddef.h>
 #if defined(FFI_DEBUG) 
@@ -153,11 +158,38 @@ extern "C" {
 #define SIZEOF_ARG SIZEOF_VOID_P
 #endif
 
+#ifdef POWERPC
+#if defined (__powerpc64__)
+#define POWERPC64
+#endif
+#endif
+
+#ifdef SPARC
+#if defined(__arch64__) || defined(__sparcv9)
+#define SPARC64
+#endif
+#endif
+
+#ifdef S390
+#if defined (__s390x__)
+#define S390X
+#endif
+#endif
+
+#ifdef X86_64
+#if defined (__i386__)
+#undef X86_64
+#define X86
+#endif
+#endif
+
 #ifndef LIBFFI_ASM
 
 /* ---- Generic type definitions ----------------------------------------- */
 
-#define ALIGN(v, a)  (((((unsigned) (v))-1) | ((a)-1))+1)
+#define ALIGN(v, a)  (((((size_t) (v))-1) | ((a)-1))+1)
+/* The closure code assumes that this works on pointers, i.e. a size_t */
+/* can hold a pointer.                                                 */
 
 typedef enum ffi_abi {
 
@@ -167,17 +199,40 @@ typedef enum ffi_abi {
   /* ---- Sparc -------------------- */
 #ifdef SPARC
   FFI_V8,
-  FFI_DEFAULT_ABI = FFI_V8,
   FFI_V8PLUS,
   FFI_V9,
+#ifdef SPARC64
+  FFI_DEFAULT_ABI = FFI_V9,
+#else
+  FFI_DEFAULT_ABI = FFI_V8,
+#endif
 #endif
 
-  /* ---- Intel x86 ---------------- */
-#ifdef X86
+  /* ---- Intel x86 Win32 ---------- */
+#ifdef X86_WIN32
   FFI_SYSV,
+  FFI_STDCALL,
+  /* TODO: Add fastcall support for the sake of completeness */
   FFI_DEFAULT_ABI = FFI_SYSV,
 #endif
 
+  /* ---- Intel x86 and AMD x86-64 - */
+#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__))
+  FFI_SYSV,
+  FFI_UNIX64,   /* Unix variants all use the same ABI for x86-64  */
+#ifdef __i386__
+  FFI_DEFAULT_ABI = FFI_SYSV,
+#else
+  FFI_DEFAULT_ABI = FFI_UNIX64,
+#endif
+#endif
+
+  /* ---- Intel ia64 ---------------- */
+#ifdef IA64
+  FFI_UNIX,    /* Linux and all Unix variants use the same conventions */
+  FFI_DEFAULT_ABI = FFI_UNIX,
+#endif
+
   /* ---- Mips --------------------- */
 #ifdef MIPS
   FFI_O32,
@@ -201,7 +256,24 @@ typedef enum ffi_abi {
 #ifdef POWERPC
   FFI_SYSV,
   FFI_GCC_SYSV,
+  FFI_LINUX64,
+# ifdef POWERPC64
+  FFI_DEFAULT_ABI = FFI_LINUX64,
+# else
   FFI_DEFAULT_ABI = FFI_GCC_SYSV,
+# endif
+#endif
+
+#ifdef POWERPC_AIX
+  FFI_AIX,
+  FFI_DARWIN,
+  FFI_DEFAULT_ABI = FFI_AIX,
+#endif
+
+#ifdef POWERPC_DARWIN
+  FFI_AIX,
+  FFI_DARWIN,
+  FFI_DEFAULT_ABI = FFI_DARWIN,
 #endif
 
   /* ---- ARM  --------------------- */
@@ -210,6 +282,18 @@ typedef enum ffi_abi {
   FFI_DEFAULT_ABI = FFI_SYSV,
 #endif
 
+  /* ---- S390 --------------------- */
+#ifdef S390
+  FFI_SYSV,
+  FFI_DEFAULT_ABI = FFI_SYSV,
+#endif
+
+  /* ---- SuperH ------------------- */
+#ifdef SH
+  FFI_SYSV,
+  FFI_DEFAULT_ABI = FFI_SYSV,
+#endif
+
   /* Leave this for debugging purposes */
   FFI_LAST_ABI
 
@@ -223,7 +307,7 @@ typedef struct _ffi_type
   /*@null@*/ struct _ffi_type **elements;
 } ffi_type;
 
-/* These are defined in ffi.c */
+/* These are defined in types.c */
 extern ffi_type ffi_type_void;
 extern ffi_type ffi_type_uint8;
 extern ffi_type ffi_type_sint8;
@@ -266,6 +350,16 @@ typedef struct {
 
 } ffi_cif;
 
+#if SIZEOF_ARG == 4
+typedef UINT32 ffi_arg;
+#else
+#if SIZEOF_ARG == 8
+typedef UINT64 ffi_arg;
+#else
+-- unsupported configuration
+#endif
+#endif
+
 /* ---- Definitions for the raw API -------------------------------------- */
 
 #if !FFI_NO_RAW_API
@@ -287,6 +381,7 @@ typedef struct {
 typedef union {
   SINT_ARG sint;
   UINT_ARG uint;
+  float           flt;
   char     data[SIZEOF_ARG];
   void*    ptr;
 } ffi_raw;
@@ -300,19 +395,110 @@ void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw);
 void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args);
 size_t ffi_raw_size (ffi_cif *cif);
 
+#if !NO_JAVA_RAW_API
+
+/* This is analogous to the raw API, except it uses Java parameter     */
+/* packing, even on 64-bit machines.  I.e. on 64-bit machines          */
+/* longs and doubles are followed by an empty 64-bit word.             */
+
+void ffi_java_raw_call (/*@dependent@*/ ffi_cif *cif, 
+                       void (*fn)(), 
+                       /*@out@*/ void *rvalue, 
+                       /*@dependent@*/ ffi_raw *avalue);
 
+void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw);
+void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args);
+size_t ffi_java_raw_size (ffi_cif *cif);
 
+#endif /* !NO_JAVA_RAW_API */
 
 #endif /* !FFI_NO_RAW_API */
 
 /* ---- Definitions for closures ----------------------------------------- */
 
-#ifdef X86
+#ifdef __i386__
 
 #define FFI_CLOSURES 1         /* x86 supports closures */
 #define FFI_TRAMPOLINE_SIZE 10
 #define FFI_NATIVE_RAW_API 1   /* and has native raw api support */
 
+#elif defined(IA64)
+
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 24  /* Really the following struct, which  */
+                               /* can be interpreted as a C function   */
+                               /* decriptor:                           */
+
+struct ffi_ia64_trampoline_struct {
+    void * code_pointer;       /* Pointer to ffi_closure_UNIX  */
+    void * fake_gp;            /* Pointer to closure, installed as gp  */
+    void * real_gp;            /* Real gp value, reinstalled by        */
+                               /* ffi_closure_UNIX.                    */
+};
+#define FFI_NATIVE_RAW_API 0
+
+#elif defined(ALPHA)
+
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 24
+#define FFI_NATIVE_RAW_API 0
+
+#elif defined(POWERPC)
+
+#define FFI_CLOSURES 1
+#ifdef POWERPC64
+#define FFI_TRAMPOLINE_SIZE 24
+#else
+#define FFI_TRAMPOLINE_SIZE 40
+#endif
+#define FFI_NATIVE_RAW_API 0
+
+#elif defined(POWERPC_DARWIN)
+
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 40
+#define FFI_NATIVE_RAW_API 0
+
+#elif defined(POWERPC_AIX)
+
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 24 /* see struct below */ 
+#define FFI_NATIVE_RAW_API 0
+
+#elif defined(SPARC64)
+
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 24
+#define FFI_NATIVE_RAW_API 0
+
+#elif defined(SPARC)
+
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 16
+#define FFI_NATIVE_RAW_API 0
+
+#elif defined(S390)
+
+#define FFI_CLOSURES 1
+#ifdef S390X
+#define FFI_TRAMPOLINE_SIZE 32
+#else
+#define FFI_TRAMPOLINE_SIZE 16
+#endif
+#define FFI_NATIVE_RAW_API 0
+
+#elif defined(SH)
+
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 16
+#define FFI_NATIVE_RAW_API 0
+
+#elif defined(__x86_64__)
+
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 24
+#define FFI_NATIVE_RAW_API 0
+
 #else 
 
 #define FFI_CLOSURES 0
@@ -320,6 +506,16 @@ size_t ffi_raw_size (ffi_cif *cif);
 
 #endif
 
+#if defined(POWERPC_DARWIN) || defined(POWERPC_AIX)
+
+struct ffi_aix_trampoline_struct {
+    void * code_pointer;       /* Pointer to ffi_closure_ASM */
+    void * toc;                        /* TOC */
+    void * static_chain;       /* Pointer to closure */
+};
+
+#endif
+
 
 
 #if FFI_CLOSURES
@@ -366,6 +562,14 @@ ffi_prep_raw_closure (ffi_raw_closure*,
                      void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
                      void *user_data);
 
+#ifndef NO_JAVA_RAW_API
+ffi_status
+ffi_prep_java_raw_closure (ffi_raw_closure*,
+                          ffi_cif *cif,
+                          void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
+                          void *user_data);
+#endif
+
 #endif /* !FFI_NO_RAW_API */
 #endif /* FFI_CLOSURES */
 
@@ -383,7 +587,7 @@ void ffi_call(/*@dependent@*/ ffi_cif *cif,
              /*@dependent@*/ void **avalue);
 
 /* Useful for eliminating compiler warnings */
-#define FFI_FN(f) ((void (*)(...))f)
+#define FFI_FN(f) ((void (*)())f)
 
 /* ---- Definitions shared with assembly code ---------------------------- */