| /* ----------------------------------------------------------------------- |
| ffi_common.h - Copyright (C) 2011, 2012, 2013 Anthony Green |
| Copyright (C) 2007 Free Software Foundation, Inc |
| Copyright (c) 1996 Red Hat, Inc. |
| |
| Common internal definitions and macros. Only necessary for building |
| libffi. |
| |
| Permission is hereby granted, free of charge, to any person |
| obtaining a copy of this software and associated documentation |
| files (the ``Software''), to deal in the Software without |
| restriction, including without limitation the rights to use, copy, |
| modify, merge, publish, distribute, sublicense, and/or sell copies |
| of the Software, and to permit persons to whom the Software is |
| furnished to do so, subject to the following conditions: |
| |
| The above copyright notice and this permission notice shall be |
| included in all copies or substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, |
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT |
| HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
| WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
| DEALINGS IN THE SOFTWARE. |
| |
| ----------------------------------------------------------------------- */ |
| |
| #ifndef FFI_COMMON_H |
| #define FFI_COMMON_H |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #include <fficonfig.h> |
| |
| /* Do not move this. Some versions of AIX are very picky about where |
| this is positioned. */ |
| #ifdef __GNUC__ |
| # if HAVE_ALLOCA_H |
| # include <alloca.h> |
| # else |
| /* mingw64 defines this already in malloc.h. */ |
| # ifndef alloca |
| # define alloca __builtin_alloca |
| # endif |
| # endif |
| # define MAYBE_UNUSED __attribute__((__unused__)) |
| #else |
| # define MAYBE_UNUSED |
| # if HAVE_ALLOCA_H |
| # include <alloca.h> |
| # else |
| # ifdef _AIX |
| # pragma alloca |
| # else |
| # ifndef alloca /* predefined by HP cc +Olibcalls */ |
| # ifdef _MSC_VER |
| # define alloca _alloca |
| # else |
| char *alloca (); |
| # endif |
| # endif |
| # endif |
| # endif |
| #endif |
| |
| /* Check for the existence of memcpy. */ |
| #if STDC_HEADERS |
| # include <string.h> |
| #else |
| # ifndef HAVE_MEMCPY |
| # define memcpy(d, s, n) bcopy ((s), (d), (n)) |
| # endif |
| #endif |
| |
| #if defined(FFI_DEBUG) |
| #include <stdio.h> |
| #endif |
| |
| #ifdef FFI_DEBUG |
| void ffi_assert(char *expr, char *file, int line); |
| void ffi_stop_here(void); |
| void ffi_type_test(ffi_type *a, char *file, int line); |
| |
| #define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) |
| #define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) |
| #define FFI_ASSERT_VALID_TYPE(x) ffi_type_test (x, __FILE__, __LINE__) |
| #else |
| #define FFI_ASSERT(x) |
| #define FFI_ASSERT_AT(x, f, l) |
| #define FFI_ASSERT_VALID_TYPE(x) |
| #endif |
| |
| /* v cast to size_t and aligned up to a multiple of a */ |
| #define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) |
| /* v cast to size_t and aligned down to a multiple of a */ |
| #define FFI_ALIGN_DOWN(v, a) (((size_t) (v)) & -a) |
| |
| /* Perform machine dependent cif processing */ |
| ffi_status ffi_prep_cif_machdep(ffi_cif *cif); |
| ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, |
| unsigned int nfixedargs, unsigned int ntotalargs); |
| |
| |
| #if HAVE_LONG_DOUBLE_VARIANT |
| /* Used to adjust size/alignment of ffi types. */ |
| void ffi_prep_types (ffi_abi abi); |
| #endif |
| |
| /* Used internally, but overridden by some architectures */ |
| ffi_status ffi_prep_cif_core(ffi_cif *cif, |
| ffi_abi abi, |
| unsigned int isvariadic, |
| unsigned int nfixedargs, |
| unsigned int ntotalargs, |
| ffi_type *rtype, |
| ffi_type **atypes); |
| |
| /* Translate a data pointer to a code pointer. Needed for closures on |
| some targets. */ |
| void *ffi_data_to_code_pointer (void *data) FFI_HIDDEN; |
| |
| /* The arch code calls this to determine if a given closure has a |
| static trampoline. */ |
| int ffi_tramp_is_present (void *closure); |
| |
| /* Extended cif, used in callback from assembly routine */ |
| typedef struct |
| { |
| ffi_cif *cif; |
| void *rvalue; |
| void **avalue; |
| } extended_cif; |
| |
| /* Terse sized type definitions. */ |
| #if defined(_MSC_VER) || defined(__sgi) || defined(__SUNPRO_C) |
| typedef unsigned char UINT8; |
| typedef signed char SINT8; |
| typedef unsigned short UINT16; |
| typedef signed short SINT16; |
| typedef unsigned int UINT32; |
| typedef signed int SINT32; |
| # ifdef _MSC_VER |
| typedef unsigned __int64 UINT64; |
| typedef signed __int64 SINT64; |
| # else |
| # include <inttypes.h> |
| typedef uint64_t UINT64; |
| typedef int64_t SINT64; |
| # endif |
| #else |
| typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); |
| typedef signed int SINT8 __attribute__((__mode__(__QI__))); |
| typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); |
| typedef signed int SINT16 __attribute__((__mode__(__HI__))); |
| typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); |
| typedef signed int SINT32 __attribute__((__mode__(__SI__))); |
| typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); |
| typedef signed int SINT64 __attribute__((__mode__(__DI__))); |
| #endif |
| |
| typedef float FLOAT32; |
| |
| #ifndef __GNUC__ |
| #define __builtin_expect(x, expected_value) (x) |
| #endif |
| #define LIKELY(x) __builtin_expect(!!(x),1) |
| #define UNLIKELY(x) __builtin_expect((x)!=0,0) |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif |