xref: /aosp_15_r20/external/libffi/include/ffi.h.in (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
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