Home | History | Annotate | Download | only in libffi
      1 /* -----------------------------------------------------------------*-C-*-
      2    libffi 3.1 - Copyright (c) 2011 Anthony Green
      3                     - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
      4 
      5    Permission is hereby granted, free of charge, to any person
      6    obtaining a copy of this software and associated documentation
      7    files (the ``Software''), to deal in the Software without
      8    restriction, including without limitation the rights to use, copy,
      9    modify, merge, publish, distribute, sublicense, and/or sell copies
     10    of the Software, and to permit persons to whom the Software is
     11    furnished to do so, subject to the following conditions:
     12 
     13    The above copyright notice and this permission notice shall be
     14    included in all copies or substantial portions of the Software.
     15 
     16    THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
     17    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     18    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
     19    NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
     20    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
     21    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     22    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     23    DEALINGS IN THE SOFTWARE.
     24 
     25    ----------------------------------------------------------------------- */
     26 
     27 /* -------------------------------------------------------------------
     28    The basic API is described in the README file.
     29 
     30    The raw API is designed to bypass some of the argument packing
     31    and unpacking on architectures for which it can be avoided.
     32 
     33    The closure API allows interpreted functions to be packaged up
     34    inside a C function pointer, so that they can be called as C functions,
     35    with no understanding on the client side that they are interpreted.
     36    It can also be used in other cases in which it is necessary to package
     37    up a user specified parameter and a function pointer as a single
     38    function pointer.
     39 
     40    The closure API must be implemented in order to get its functionality,
     41    e.g. for use by gij.  Routines are provided to emulate the raw API
     42    if the underlying platform doesn't allow faster implementation.
     43 
     44    More details on the raw and cloure API can be found in:
     45 
     46    http://gcc.gnu.org/ml/java/1999-q3/msg00138.html
     47 
     48    and
     49 
     50    http://gcc.gnu.org/ml/java/1999-q3/msg00174.html
     51    -------------------------------------------------------------------- */
     52 
     53 #ifndef LIBFFI_H
     54 #define LIBFFI_H
     55 
     56 #ifdef __cplusplus
     57 extern "C" {
     58 #endif
     59 
     60 /* Specify which architecture libffi is configured for. */
     61 #ifndef X86_64
     62 #define X86_64
     63 #endif
     64 
     65 /* ---- System configuration information --------------------------------- */
     66 
     67 #include <ffitarget.h>
     68 
     69 #ifndef LIBFFI_ASM
     70 
     71 #ifdef _MSC_VER
     72 #define __attribute__(X)
     73 #endif
     74 
     75 #include <stddef.h>
     76 #include <limits.h>
     77 
     78 /* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example).
     79    But we can find it either under the correct ANSI name, or under GNU
     80    C's internal name.  */
     81 
     82 #define FFI_64_BIT_MAX 9223372036854775807
     83 
     84 #ifdef LONG_LONG_MAX
     85 # define FFI_LONG_LONG_MAX LONG_LONG_MAX
     86 #else
     87 # ifdef LLONG_MAX
     88 #  define FFI_LONG_LONG_MAX LLONG_MAX
     89 #  ifdef _AIX52 /* or newer has C99 LLONG_MAX */
     90 #   undef FFI_64_BIT_MAX
     91 #   define FFI_64_BIT_MAX 9223372036854775807LL
     92 #  endif /* _AIX52 or newer */
     93 # else
     94 #  ifdef __GNUC__
     95 #   define FFI_LONG_LONG_MAX __LONG_LONG_MAX__
     96 #  endif
     97 #  ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */
     98 #   ifndef __PPC64__
     99 #    if defined (__IBMC__) || defined (__IBMCPP__)
    100 #     define FFI_LONG_LONG_MAX LONGLONG_MAX
    101 #    endif
    102 #   endif /* __PPC64__ */
    103 #   undef  FFI_64_BIT_MAX
    104 #   define FFI_64_BIT_MAX 9223372036854775807LL
    105 #  endif
    106 # endif
    107 #endif
    108 
    109 /* The closure code assumes that this works on pointers, i.e. a size_t	*/
    110 /* can hold a pointer.							*/
    111 
    112 typedef struct _ffi_type
    113 {
    114   size_t size;
    115   unsigned short alignment;
    116   unsigned short type;
    117   struct _ffi_type **elements;
    118 } ffi_type;
    119 
    120 #ifndef LIBFFI_HIDE_BASIC_TYPES
    121 #if SCHAR_MAX == 127
    122 # define ffi_type_uchar                ffi_type_uint8
    123 # define ffi_type_schar                ffi_type_sint8
    124 #else
    125  #error "char size not supported"
    126 #endif
    127 
    128 #if SHRT_MAX == 32767
    129 # define ffi_type_ushort       ffi_type_uint16
    130 # define ffi_type_sshort       ffi_type_sint16
    131 #elif SHRT_MAX == 2147483647
    132 # define ffi_type_ushort       ffi_type_uint32
    133 # define ffi_type_sshort       ffi_type_sint32
    134 #else
    135  #error "short size not supported"
    136 #endif
    137 
    138 #if INT_MAX == 32767
    139 # define ffi_type_uint         ffi_type_uint16
    140 # define ffi_type_sint         ffi_type_sint16
    141 #elif INT_MAX == 2147483647
    142 # define ffi_type_uint         ffi_type_uint32
    143 # define ffi_type_sint         ffi_type_sint32
    144 #elif INT_MAX == 9223372036854775807
    145 # define ffi_type_uint         ffi_type_uint64
    146 # define ffi_type_sint         ffi_type_sint64
    147 #else
    148  #error "int size not supported"
    149 #endif
    150 
    151 #if LONG_MAX == 2147483647
    152 # if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX
    153  #error "no 64-bit data type supported"
    154 # endif
    155 #elif LONG_MAX != FFI_64_BIT_MAX
    156  #error "long size not supported"
    157 #endif
    158 
    159 #if LONG_MAX == 2147483647
    160 # define ffi_type_ulong        ffi_type_uint32
    161 # define ffi_type_slong        ffi_type_sint32
    162 #elif LONG_MAX == FFI_64_BIT_MAX
    163 # define ffi_type_ulong        ffi_type_uint64
    164 # define ffi_type_slong        ffi_type_sint64
    165 #else
    166  #error "long size not supported"
    167 #endif
    168 
    169 /* Need minimal decorations for DLLs to works on Windows. */
    170 /* GCC has autoimport and autoexport.  Rely on Libtool to */
    171 /* help MSVC export from a DLL, but always declare data   */
    172 /* to be imported for MSVC clients.  This costs an extra  */
    173 /* indirection for MSVC clients using the static version  */
    174 /* of the library, but don't worry about that.  Besides,  */
    175 /* as a workaround, they can define FFI_BUILDING if they  */
    176 /* *know* they are going to link with the static library. */
    177 #if defined _MSC_VER && !defined FFI_BUILDING
    178 #define FFI_EXTERN extern __declspec(dllimport)
    179 #else
    180 #define FFI_EXTERN extern
    181 #endif
    182 
    183 /* These are defined in types.c */
    184 FFI_EXTERN ffi_type ffi_type_void;
    185 FFI_EXTERN ffi_type ffi_type_uint8;
    186 FFI_EXTERN ffi_type ffi_type_sint8;
    187 FFI_EXTERN ffi_type ffi_type_uint16;
    188 FFI_EXTERN ffi_type ffi_type_sint16;
    189 FFI_EXTERN ffi_type ffi_type_uint32;
    190 FFI_EXTERN ffi_type ffi_type_sint32;
    191 FFI_EXTERN ffi_type ffi_type_uint64;
    192 FFI_EXTERN ffi_type ffi_type_sint64;
    193 FFI_EXTERN ffi_type ffi_type_float;
    194 FFI_EXTERN ffi_type ffi_type_double;
    195 FFI_EXTERN ffi_type ffi_type_pointer;
    196 
    197 #if 1
    198 FFI_EXTERN ffi_type ffi_type_longdouble;
    199 #else
    200 #define ffi_type_longdouble ffi_type_double
    201 #endif
    202 #endif /* LIBFFI_HIDE_BASIC_TYPES */
    203 
    204 typedef enum {
    205   FFI_OK = 0,
    206   FFI_BAD_TYPEDEF,
    207   FFI_BAD_ABI
    208 } ffi_status;
    209 
    210 typedef unsigned FFI_TYPE;
    211 
    212 typedef struct {
    213   ffi_abi abi;
    214   unsigned nargs;
    215   ffi_type **arg_types;
    216   ffi_type *rtype;
    217   unsigned bytes;
    218   unsigned flags;
    219 #ifdef FFI_EXTRA_CIF_FIELDS
    220   FFI_EXTRA_CIF_FIELDS;
    221 #endif
    222 } ffi_cif;
    223 
    224 #if HAVE_LONG_DOUBLE_VARIANT
    225 /* Used to adjust size/alignment of ffi types.  */
    226 void ffi_prep_types (ffi_abi abi);
    227 # endif
    228 
    229 /* Used internally, but overridden by some architectures */
    230 ffi_status ffi_prep_cif_core(ffi_cif *cif,
    231 			     ffi_abi abi,
    232 			     unsigned int isvariadic,
    233 			     unsigned int nfixedargs,
    234 			     unsigned int ntotalargs,
    235 			     ffi_type *rtype,
    236 			     ffi_type **atypes);
    237 
    238 /* ---- Definitions for the raw API -------------------------------------- */
    239 
    240 #ifndef FFI_SIZEOF_ARG
    241 # if LONG_MAX == 2147483647
    242 #  define FFI_SIZEOF_ARG        4
    243 # elif LONG_MAX == FFI_64_BIT_MAX
    244 #  define FFI_SIZEOF_ARG        8
    245 # endif
    246 #endif
    247 
    248 #ifndef FFI_SIZEOF_JAVA_RAW
    249 #  define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG
    250 #endif
    251 
    252 typedef union {
    253   ffi_sarg  sint;
    254   ffi_arg   uint;
    255   float	    flt;
    256   char      data[FFI_SIZEOF_ARG];
    257   void*     ptr;
    258 } ffi_raw;
    259 
    260 #if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8
    261 /* This is a special case for mips64/n32 ABI (and perhaps others) where
    262    sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8.  */
    263 typedef union {
    264   signed int	sint;
    265   unsigned int	uint;
    266   float		flt;
    267   char		data[FFI_SIZEOF_JAVA_RAW];
    268   void*		ptr;
    269 } ffi_java_raw;
    270 #else
    271 typedef ffi_raw ffi_java_raw;
    272 #endif
    273 
    274 
    275 void ffi_raw_call (ffi_cif *cif,
    276 		   void (*fn)(void),
    277 		   void *rvalue,
    278 		   ffi_raw *avalue);
    279 
    280 void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw);
    281 void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args);
    282 size_t ffi_raw_size (ffi_cif *cif);
    283 
    284 /* This is analogous to the raw API, except it uses Java parameter	*/
    285 /* packing, even on 64-bit machines.  I.e. on 64-bit machines		*/
    286 /* longs and doubles are followed by an empty 64-bit word.		*/
    287 
    288 void ffi_java_raw_call (ffi_cif *cif,
    289 			void (*fn)(void),
    290 			void *rvalue,
    291 			ffi_java_raw *avalue);
    292 
    293 void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw);
    294 void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args);
    295 size_t ffi_java_raw_size (ffi_cif *cif);
    296 
    297 /* ---- Definitions for closures ----------------------------------------- */
    298 
    299 #if FFI_CLOSURES
    300 
    301 #ifdef _MSC_VER
    302 __declspec(align(8))
    303 #endif
    304 typedef struct {
    305 #if 0
    306   void *trampoline_table;
    307   void *trampoline_table_entry;
    308 #else
    309   char tramp[FFI_TRAMPOLINE_SIZE];
    310 #endif
    311   ffi_cif   *cif;
    312   void     (*fun)(ffi_cif*,void*,void**,void*);
    313   void      *user_data;
    314 #ifdef __GNUC__
    315 } ffi_closure __attribute__((aligned (8)));
    316 #else
    317 } ffi_closure;
    318 # ifdef __sgi
    319 #  pragma pack 0
    320 # endif
    321 #endif
    322 
    323 void *ffi_closure_alloc (size_t size, void **code);
    324 void ffi_closure_free (void *);
    325 
    326 ffi_status
    327 ffi_prep_closure (ffi_closure*,
    328 		  ffi_cif *,
    329 		  void (*fun)(ffi_cif*,void*,void**,void*),
    330 		  void *user_data);
    331 
    332 ffi_status
    333 ffi_prep_closure_loc (ffi_closure*,
    334 		      ffi_cif *,
    335 		      void (*fun)(ffi_cif*,void*,void**,void*),
    336 		      void *user_data,
    337 		      void*codeloc);
    338 
    339 #ifdef __sgi
    340 # pragma pack 8
    341 #endif
    342 typedef struct {
    343 #if 0
    344   void *trampoline_table;
    345   void *trampoline_table_entry;
    346 #else
    347   char tramp[FFI_TRAMPOLINE_SIZE];
    348 #endif
    349   ffi_cif   *cif;
    350 
    351 #if !FFI_NATIVE_RAW_API
    352 
    353   /* if this is enabled, then a raw closure has the same layout
    354      as a regular closure.  We use this to install an intermediate
    355      handler to do the transaltion, void** -> ffi_raw*. */
    356 
    357   void     (*translate_args)(ffi_cif*,void*,void**,void*);
    358   void      *this_closure;
    359 
    360 #endif
    361 
    362   void     (*fun)(ffi_cif*,void*,ffi_raw*,void*);
    363   void      *user_data;
    364 
    365 } ffi_raw_closure;
    366 
    367 typedef struct {
    368 #if 0
    369   void *trampoline_table;
    370   void *trampoline_table_entry;
    371 #else
    372   char tramp[FFI_TRAMPOLINE_SIZE];
    373 #endif
    374 
    375   ffi_cif   *cif;
    376 
    377 #if !FFI_NATIVE_RAW_API
    378 
    379   /* if this is enabled, then a raw closure has the same layout
    380      as a regular closure.  We use this to install an intermediate
    381      handler to do the transaltion, void** -> ffi_raw*. */
    382 
    383   void     (*translate_args)(ffi_cif*,void*,void**,void*);
    384   void      *this_closure;
    385 
    386 #endif
    387 
    388   void     (*fun)(ffi_cif*,void*,ffi_java_raw*,void*);
    389   void      *user_data;
    390 
    391 } ffi_java_raw_closure;
    392 
    393 ffi_status
    394 ffi_prep_raw_closure (ffi_raw_closure*,
    395 		      ffi_cif *cif,
    396 		      void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
    397 		      void *user_data);
    398 
    399 ffi_status
    400 ffi_prep_raw_closure_loc (ffi_raw_closure*,
    401 			  ffi_cif *cif,
    402 			  void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
    403 			  void *user_data,
    404 			  void *codeloc);
    405 
    406 ffi_status
    407 ffi_prep_java_raw_closure (ffi_java_raw_closure*,
    408 		           ffi_cif *cif,
    409 		           void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
    410 		           void *user_data);
    411 
    412 ffi_status
    413 ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*,
    414 			       ffi_cif *cif,
    415 			       void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
    416 			       void *user_data,
    417 			       void *codeloc);
    418 
    419 #endif /* FFI_CLOSURES */
    420 
    421 /* ---- Public interface definition -------------------------------------- */
    422 
    423 ffi_status ffi_prep_cif(ffi_cif *cif,
    424 			ffi_abi abi,
    425 			unsigned int nargs,
    426 			ffi_type *rtype,
    427 			ffi_type **atypes);
    428 
    429 ffi_status ffi_prep_cif_var(ffi_cif *cif,
    430 			    ffi_abi abi,
    431 			    unsigned int nfixedargs,
    432 			    unsigned int ntotalargs,
    433 			    ffi_type *rtype,
    434 			    ffi_type **atypes);
    435 
    436 void ffi_call(ffi_cif *cif,
    437 	      void (*fn)(void),
    438 	      void *rvalue,
    439 	      void **avalue);
    440 
    441 /* Useful for eliminating compiler warnings */
    442 #define FFI_FN(f) ((void (*)(void))f)
    443 
    444 /* ---- Definitions shared with assembly code ---------------------------- */
    445 
    446 #endif
    447 
    448 /* If these change, update src/mips/ffitarget.h. */
    449 #define FFI_TYPE_VOID       0
    450 #define FFI_TYPE_INT        1
    451 #define FFI_TYPE_FLOAT      2
    452 #define FFI_TYPE_DOUBLE     3
    453 #if 1
    454 #define FFI_TYPE_LONGDOUBLE 4
    455 #else
    456 #define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE
    457 #endif
    458 #define FFI_TYPE_UINT8      5
    459 #define FFI_TYPE_SINT8      6
    460 #define FFI_TYPE_UINT16     7
    461 #define FFI_TYPE_SINT16     8
    462 #define FFI_TYPE_UINT32     9
    463 #define FFI_TYPE_SINT32     10
    464 #define FFI_TYPE_UINT64     11
    465 #define FFI_TYPE_SINT64     12
    466 #define FFI_TYPE_STRUCT     13
    467 #define FFI_TYPE_POINTER    14
    468 
    469 /* This should always refer to the last type code (for sanity checks) */
    470 #define FFI_TYPE_LAST       FFI_TYPE_POINTER
    471 
    472 #ifdef __cplusplus
    473 }
    474 #endif
    475 
    476 #endif
    477