~ubuntu-branches/ubuntu/trusty/python3.4/trusty-proposed

« back to all changes in this revision

Viewing changes to Modules/_ctypes/libffi/include/ffi.h.in

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2013-11-25 09:44:27 UTC
  • Revision ID: package-import@ubuntu.com-20131125094427-lzxj8ap5w01lmo7f
Tags: upstream-3.4~b1
ImportĀ upstreamĀ versionĀ 3.4~b1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -----------------------------------------------------------------*-C-*-
 
2
   libffi @VERSION@ - 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 @TARGET@
 
62
#define @TARGET@
 
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 @HAVE_LONG_DOUBLE@
 
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
/* Used internally, but overridden by some architectures */
 
225
ffi_status ffi_prep_cif_core(ffi_cif *cif,
 
226
                             ffi_abi abi,
 
227
                             unsigned int isvariadic,
 
228
                             unsigned int nfixedargs,
 
229
                             unsigned int ntotalargs,
 
230
                             ffi_type *rtype,
 
231
                             ffi_type **atypes);
 
232
 
 
233
/* ---- Definitions for the raw API -------------------------------------- */
 
234
 
 
235
#ifndef FFI_SIZEOF_ARG
 
236
# if LONG_MAX == 2147483647
 
237
#  define FFI_SIZEOF_ARG        4
 
238
# elif LONG_MAX == FFI_64_BIT_MAX
 
239
#  define FFI_SIZEOF_ARG        8
 
240
# endif
 
241
#endif
 
242
 
 
243
#ifndef FFI_SIZEOF_JAVA_RAW
 
244
#  define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG
 
245
#endif
 
246
 
 
247
typedef union {
 
248
  ffi_sarg  sint;
 
249
  ffi_arg   uint;
 
250
  float     flt;
 
251
  char      data[FFI_SIZEOF_ARG];
 
252
  void*     ptr;
 
253
} ffi_raw;
 
254
 
 
255
#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8
 
256
/* This is a special case for mips64/n32 ABI (and perhaps others) where
 
257
   sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8.  */
 
258
typedef union {
 
259
  signed int    sint;
 
260
  unsigned int  uint;
 
261
  float         flt;
 
262
  char          data[FFI_SIZEOF_JAVA_RAW];
 
263
  void*         ptr;
 
264
} ffi_java_raw;
 
265
#else
 
266
typedef ffi_raw ffi_java_raw;
 
267
#endif
 
268
 
 
269
 
 
270
void ffi_raw_call (ffi_cif *cif,
 
271
                   void (*fn)(void),
 
272
                   void *rvalue,
 
273
                   ffi_raw *avalue);
 
274
 
 
275
void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw);
 
276
void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args);
 
277
size_t ffi_raw_size (ffi_cif *cif);
 
278
 
 
279
/* This is analogous to the raw API, except it uses Java parameter      */
 
280
/* packing, even on 64-bit machines.  I.e. on 64-bit machines           */
 
281
/* longs and doubles are followed by an empty 64-bit word.              */
 
282
 
 
283
void ffi_java_raw_call (ffi_cif *cif,
 
284
                        void (*fn)(void),
 
285
                        void *rvalue,
 
286
                        ffi_java_raw *avalue);
 
287
 
 
288
void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw);
 
289
void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args);
 
290
size_t ffi_java_raw_size (ffi_cif *cif);
 
291
 
 
292
/* ---- Definitions for closures ----------------------------------------- */
 
293
 
 
294
#if FFI_CLOSURES
 
295
 
 
296
#ifdef _MSC_VER
 
297
__declspec(align(8))
 
298
#endif
 
299
typedef struct {
 
300
#if @FFI_EXEC_TRAMPOLINE_TABLE@
 
301
  void *trampoline_table;
 
302
  void *trampoline_table_entry;
 
303
#else
 
304
  char tramp[FFI_TRAMPOLINE_SIZE];
 
305
#endif
 
306
  ffi_cif   *cif;
 
307
  void     (*fun)(ffi_cif*,void*,void**,void*);
 
308
  void      *user_data;
 
309
#ifdef __GNUC__
 
310
} ffi_closure __attribute__((aligned (8)));
 
311
#else
 
312
} ffi_closure;
 
313
# ifdef __sgi
 
314
#  pragma pack 0
 
315
# endif
 
316
#endif
 
317
 
 
318
void *ffi_closure_alloc (size_t size, void **code);
 
319
void ffi_closure_free (void *);
 
320
 
 
321
ffi_status
 
322
ffi_prep_closure (ffi_closure*,
 
323
                  ffi_cif *,
 
324
                  void (*fun)(ffi_cif*,void*,void**,void*),
 
325
                  void *user_data);
 
326
 
 
327
ffi_status
 
328
ffi_prep_closure_loc (ffi_closure*,
 
329
                      ffi_cif *,
 
330
                      void (*fun)(ffi_cif*,void*,void**,void*),
 
331
                      void *user_data,
 
332
                      void*codeloc);
 
333
 
 
334
#ifdef __sgi
 
335
# pragma pack 8
 
336
#endif
 
337
typedef struct {
 
338
#if @FFI_EXEC_TRAMPOLINE_TABLE@
 
339
  void *trampoline_table;
 
340
  void *trampoline_table_entry;
 
341
#else
 
342
  char tramp[FFI_TRAMPOLINE_SIZE];
 
343
#endif
 
344
  ffi_cif   *cif;
 
345
 
 
346
#if !FFI_NATIVE_RAW_API
 
347
 
 
348
  /* if this is enabled, then a raw closure has the same layout 
 
349
     as a regular closure.  We use this to install an intermediate 
 
350
     handler to do the transaltion, void** -> ffi_raw*. */
 
351
 
 
352
  void     (*translate_args)(ffi_cif*,void*,void**,void*);
 
353
  void      *this_closure;
 
354
 
 
355
#endif
 
356
 
 
357
  void     (*fun)(ffi_cif*,void*,ffi_raw*,void*);
 
358
  void      *user_data;
 
359
 
 
360
} ffi_raw_closure;
 
361
 
 
362
typedef struct {
 
363
#if @FFI_EXEC_TRAMPOLINE_TABLE@
 
364
  void *trampoline_table;
 
365
  void *trampoline_table_entry;
 
366
#else
 
367
  char tramp[FFI_TRAMPOLINE_SIZE];
 
368
#endif
 
369
 
 
370
  ffi_cif   *cif;
 
371
 
 
372
#if !FFI_NATIVE_RAW_API
 
373
 
 
374
  /* if this is enabled, then a raw closure has the same layout 
 
375
     as a regular closure.  We use this to install an intermediate 
 
376
     handler to do the transaltion, void** -> ffi_raw*. */
 
377
 
 
378
  void     (*translate_args)(ffi_cif*,void*,void**,void*);
 
379
  void      *this_closure;
 
380
 
 
381
#endif
 
382
 
 
383
  void     (*fun)(ffi_cif*,void*,ffi_java_raw*,void*);
 
384
  void      *user_data;
 
385
 
 
386
} ffi_java_raw_closure;
 
387
 
 
388
ffi_status
 
389
ffi_prep_raw_closure (ffi_raw_closure*,
 
390
                      ffi_cif *cif,
 
391
                      void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
 
392
                      void *user_data);
 
393
 
 
394
ffi_status
 
395
ffi_prep_raw_closure_loc (ffi_raw_closure*,
 
396
                          ffi_cif *cif,
 
397
                          void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
 
398
                          void *user_data,
 
399
                          void *codeloc);
 
400
 
 
401
ffi_status
 
402
ffi_prep_java_raw_closure (ffi_java_raw_closure*,
 
403
                           ffi_cif *cif,
 
404
                           void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
 
405
                           void *user_data);
 
406
 
 
407
ffi_status
 
408
ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*,
 
409
                               ffi_cif *cif,
 
410
                               void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
 
411
                               void *user_data,
 
412
                               void *codeloc);
 
413
 
 
414
#endif /* FFI_CLOSURES */
 
415
 
 
416
/* ---- Public interface definition -------------------------------------- */
 
417
 
 
418
ffi_status ffi_prep_cif(ffi_cif *cif,
 
419
                        ffi_abi abi,
 
420
                        unsigned int nargs,
 
421
                        ffi_type *rtype,
 
422
                        ffi_type **atypes);
 
423
 
 
424
ffi_status ffi_prep_cif_var(ffi_cif *cif,
 
425
                            ffi_abi abi,
 
426
                            unsigned int nfixedargs,
 
427
                            unsigned int ntotalargs,
 
428
                            ffi_type *rtype,
 
429
                            ffi_type **atypes);
 
430
 
 
431
void ffi_call(ffi_cif *cif,
 
432
              void (*fn)(void),
 
433
              void *rvalue,
 
434
              void **avalue);
 
435
 
 
436
/* Useful for eliminating compiler warnings */
 
437
#define FFI_FN(f) ((void (*)(void))f)
 
438
 
 
439
/* ---- Definitions shared with assembly code ---------------------------- */
 
440
 
 
441
#endif
 
442
 
 
443
/* If these change, update src/mips/ffitarget.h. */
 
444
#define FFI_TYPE_VOID       0    
 
445
#define FFI_TYPE_INT        1
 
446
#define FFI_TYPE_FLOAT      2    
 
447
#define FFI_TYPE_DOUBLE     3
 
448
#if @HAVE_LONG_DOUBLE@
 
449
#define FFI_TYPE_LONGDOUBLE 4
 
450
#else
 
451
#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE
 
452
#endif
 
453
#define FFI_TYPE_UINT8      5   
 
454
#define FFI_TYPE_SINT8      6
 
455
#define FFI_TYPE_UINT16     7 
 
456
#define FFI_TYPE_SINT16     8
 
457
#define FFI_TYPE_UINT32     9
 
458
#define FFI_TYPE_SINT32     10
 
459
#define FFI_TYPE_UINT64     11
 
460
#define FFI_TYPE_SINT64     12
 
461
#define FFI_TYPE_STRUCT     13
 
462
#define FFI_TYPE_POINTER    14
 
463
 
 
464
/* This should always refer to the last type code (for sanity checks) */
 
465
#define FFI_TYPE_LAST       FFI_TYPE_POINTER
 
466
 
 
467
#ifdef __cplusplus
 
468
}
 
469
#endif
 
470
 
 
471
#endif