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