1*1fd5a2e1SPrashanth Swaminathan /* ----------------------------------------------------------------------- 2*1fd5a2e1SPrashanth Swaminathan ffi_common.h - Copyright (C) 2011, 2012, 2013 Anthony Green 3*1fd5a2e1SPrashanth Swaminathan Copyright (C) 2007 Free Software Foundation, Inc 4*1fd5a2e1SPrashanth Swaminathan Copyright (c) 1996 Red Hat, Inc. 5*1fd5a2e1SPrashanth Swaminathan 6*1fd5a2e1SPrashanth Swaminathan Common internal definitions and macros. Only necessary for building 7*1fd5a2e1SPrashanth Swaminathan libffi. 8*1fd5a2e1SPrashanth Swaminathan ----------------------------------------------------------------------- */ 9*1fd5a2e1SPrashanth Swaminathan 10*1fd5a2e1SPrashanth Swaminathan #ifndef FFI_COMMON_H 11*1fd5a2e1SPrashanth Swaminathan #define FFI_COMMON_H 12*1fd5a2e1SPrashanth Swaminathan 13*1fd5a2e1SPrashanth Swaminathan #ifdef __cplusplus 14*1fd5a2e1SPrashanth Swaminathan extern "C" { 15*1fd5a2e1SPrashanth Swaminathan #endif 16*1fd5a2e1SPrashanth Swaminathan 17*1fd5a2e1SPrashanth Swaminathan #include <fficonfig.h> 18*1fd5a2e1SPrashanth Swaminathan 19*1fd5a2e1SPrashanth Swaminathan /* Do not move this. Some versions of AIX are very picky about where 20*1fd5a2e1SPrashanth Swaminathan this is positioned. */ 21*1fd5a2e1SPrashanth Swaminathan #ifdef __GNUC__ 22*1fd5a2e1SPrashanth Swaminathan # if HAVE_ALLOCA_H 23*1fd5a2e1SPrashanth Swaminathan # include <alloca.h> 24*1fd5a2e1SPrashanth Swaminathan # else 25*1fd5a2e1SPrashanth Swaminathan /* mingw64 defines this already in malloc.h. */ 26*1fd5a2e1SPrashanth Swaminathan # ifndef alloca 27*1fd5a2e1SPrashanth Swaminathan # define alloca __builtin_alloca 28*1fd5a2e1SPrashanth Swaminathan # endif 29*1fd5a2e1SPrashanth Swaminathan # endif 30*1fd5a2e1SPrashanth Swaminathan # define MAYBE_UNUSED __attribute__((__unused__)) 31*1fd5a2e1SPrashanth Swaminathan #else 32*1fd5a2e1SPrashanth Swaminathan # define MAYBE_UNUSED 33*1fd5a2e1SPrashanth Swaminathan # if HAVE_ALLOCA_H 34*1fd5a2e1SPrashanth Swaminathan # include <alloca.h> 35*1fd5a2e1SPrashanth Swaminathan # else 36*1fd5a2e1SPrashanth Swaminathan # ifdef _AIX 37*1fd5a2e1SPrashanth Swaminathan # pragma alloca 38*1fd5a2e1SPrashanth Swaminathan # else 39*1fd5a2e1SPrashanth Swaminathan # ifndef alloca /* predefined by HP cc +Olibcalls */ 40*1fd5a2e1SPrashanth Swaminathan # ifdef _MSC_VER 41*1fd5a2e1SPrashanth Swaminathan # define alloca _alloca 42*1fd5a2e1SPrashanth Swaminathan # else 43*1fd5a2e1SPrashanth Swaminathan char *alloca (); 44*1fd5a2e1SPrashanth Swaminathan # endif 45*1fd5a2e1SPrashanth Swaminathan # endif 46*1fd5a2e1SPrashanth Swaminathan # endif 47*1fd5a2e1SPrashanth Swaminathan # endif 48*1fd5a2e1SPrashanth Swaminathan #endif 49*1fd5a2e1SPrashanth Swaminathan 50*1fd5a2e1SPrashanth Swaminathan /* Check for the existence of memcpy. */ 51*1fd5a2e1SPrashanth Swaminathan #if STDC_HEADERS 52*1fd5a2e1SPrashanth Swaminathan # include <string.h> 53*1fd5a2e1SPrashanth Swaminathan #else 54*1fd5a2e1SPrashanth Swaminathan # ifndef HAVE_MEMCPY 55*1fd5a2e1SPrashanth Swaminathan # define memcpy(d, s, n) bcopy ((s), (d), (n)) 56*1fd5a2e1SPrashanth Swaminathan # endif 57*1fd5a2e1SPrashanth Swaminathan #endif 58*1fd5a2e1SPrashanth Swaminathan 59*1fd5a2e1SPrashanth Swaminathan #if defined(FFI_DEBUG) 60*1fd5a2e1SPrashanth Swaminathan #include <stdio.h> 61*1fd5a2e1SPrashanth Swaminathan #endif 62*1fd5a2e1SPrashanth Swaminathan 63*1fd5a2e1SPrashanth Swaminathan #ifdef FFI_DEBUG 64*1fd5a2e1SPrashanth Swaminathan void ffi_assert(char *expr, char *file, int line); 65*1fd5a2e1SPrashanth Swaminathan void ffi_stop_here(void); 66*1fd5a2e1SPrashanth Swaminathan void ffi_type_test(ffi_type *a, char *file, int line); 67*1fd5a2e1SPrashanth Swaminathan 68*1fd5a2e1SPrashanth Swaminathan #define FFI_ASSERT(x) ((x) ? (void)0 : ffi_assert(#x, __FILE__,__LINE__)) 69*1fd5a2e1SPrashanth Swaminathan #define FFI_ASSERT_AT(x, f, l) ((x) ? 0 : ffi_assert(#x, (f), (l))) 70*1fd5a2e1SPrashanth Swaminathan #define FFI_ASSERT_VALID_TYPE(x) ffi_type_test (x, __FILE__, __LINE__) 71*1fd5a2e1SPrashanth Swaminathan #else 72*1fd5a2e1SPrashanth Swaminathan #define FFI_ASSERT(x) 73*1fd5a2e1SPrashanth Swaminathan #define FFI_ASSERT_AT(x, f, l) 74*1fd5a2e1SPrashanth Swaminathan #define FFI_ASSERT_VALID_TYPE(x) 75*1fd5a2e1SPrashanth Swaminathan #endif 76*1fd5a2e1SPrashanth Swaminathan 77*1fd5a2e1SPrashanth Swaminathan /* v cast to size_t and aligned up to a multiple of a */ 78*1fd5a2e1SPrashanth Swaminathan #define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) 79*1fd5a2e1SPrashanth Swaminathan /* v cast to size_t and aligned down to a multiple of a */ 80*1fd5a2e1SPrashanth Swaminathan #define FFI_ALIGN_DOWN(v, a) (((size_t) (v)) & -a) 81*1fd5a2e1SPrashanth Swaminathan 82*1fd5a2e1SPrashanth Swaminathan /* Perform machine dependent cif processing */ 83*1fd5a2e1SPrashanth Swaminathan ffi_status ffi_prep_cif_machdep(ffi_cif *cif); 84*1fd5a2e1SPrashanth Swaminathan ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, 85*1fd5a2e1SPrashanth Swaminathan unsigned int nfixedargs, unsigned int ntotalargs); 86*1fd5a2e1SPrashanth Swaminathan 87*1fd5a2e1SPrashanth Swaminathan 88*1fd5a2e1SPrashanth Swaminathan #if HAVE_LONG_DOUBLE_VARIANT 89*1fd5a2e1SPrashanth Swaminathan /* Used to adjust size/alignment of ffi types. */ 90*1fd5a2e1SPrashanth Swaminathan void ffi_prep_types (ffi_abi abi); 91*1fd5a2e1SPrashanth Swaminathan #endif 92*1fd5a2e1SPrashanth Swaminathan 93*1fd5a2e1SPrashanth Swaminathan /* Used internally, but overridden by some architectures */ 94*1fd5a2e1SPrashanth Swaminathan ffi_status ffi_prep_cif_core(ffi_cif *cif, 95*1fd5a2e1SPrashanth Swaminathan ffi_abi abi, 96*1fd5a2e1SPrashanth Swaminathan unsigned int isvariadic, 97*1fd5a2e1SPrashanth Swaminathan unsigned int nfixedargs, 98*1fd5a2e1SPrashanth Swaminathan unsigned int ntotalargs, 99*1fd5a2e1SPrashanth Swaminathan ffi_type *rtype, 100*1fd5a2e1SPrashanth Swaminathan ffi_type **atypes); 101*1fd5a2e1SPrashanth Swaminathan 102*1fd5a2e1SPrashanth Swaminathan /* Translate a data pointer to a code pointer. Needed for closures on 103*1fd5a2e1SPrashanth Swaminathan some targets. */ 104*1fd5a2e1SPrashanth Swaminathan void *ffi_data_to_code_pointer (void *data) FFI_HIDDEN; 105*1fd5a2e1SPrashanth Swaminathan 106*1fd5a2e1SPrashanth Swaminathan /* Extended cif, used in callback from assembly routine */ 107*1fd5a2e1SPrashanth Swaminathan typedef struct 108*1fd5a2e1SPrashanth Swaminathan { 109*1fd5a2e1SPrashanth Swaminathan ffi_cif *cif; 110*1fd5a2e1SPrashanth Swaminathan void *rvalue; 111*1fd5a2e1SPrashanth Swaminathan void **avalue; 112*1fd5a2e1SPrashanth Swaminathan } extended_cif; 113*1fd5a2e1SPrashanth Swaminathan 114*1fd5a2e1SPrashanth Swaminathan /* Terse sized type definitions. */ 115*1fd5a2e1SPrashanth Swaminathan #if defined(_MSC_VER) || defined(__sgi) || defined(__SUNPRO_C) 116*1fd5a2e1SPrashanth Swaminathan typedef unsigned char UINT8; 117*1fd5a2e1SPrashanth Swaminathan typedef signed char SINT8; 118*1fd5a2e1SPrashanth Swaminathan typedef unsigned short UINT16; 119*1fd5a2e1SPrashanth Swaminathan typedef signed short SINT16; 120*1fd5a2e1SPrashanth Swaminathan typedef unsigned int UINT32; 121*1fd5a2e1SPrashanth Swaminathan typedef signed int SINT32; 122*1fd5a2e1SPrashanth Swaminathan # ifdef _MSC_VER 123*1fd5a2e1SPrashanth Swaminathan typedef unsigned __int64 UINT64; 124*1fd5a2e1SPrashanth Swaminathan typedef signed __int64 SINT64; 125*1fd5a2e1SPrashanth Swaminathan # else 126*1fd5a2e1SPrashanth Swaminathan # include <inttypes.h> 127*1fd5a2e1SPrashanth Swaminathan typedef uint64_t UINT64; 128*1fd5a2e1SPrashanth Swaminathan typedef int64_t SINT64; 129*1fd5a2e1SPrashanth Swaminathan # endif 130*1fd5a2e1SPrashanth Swaminathan #else 131*1fd5a2e1SPrashanth Swaminathan typedef unsigned int UINT8 __attribute__((__mode__(__QI__))); 132*1fd5a2e1SPrashanth Swaminathan typedef signed int SINT8 __attribute__((__mode__(__QI__))); 133*1fd5a2e1SPrashanth Swaminathan typedef unsigned int UINT16 __attribute__((__mode__(__HI__))); 134*1fd5a2e1SPrashanth Swaminathan typedef signed int SINT16 __attribute__((__mode__(__HI__))); 135*1fd5a2e1SPrashanth Swaminathan typedef unsigned int UINT32 __attribute__((__mode__(__SI__))); 136*1fd5a2e1SPrashanth Swaminathan typedef signed int SINT32 __attribute__((__mode__(__SI__))); 137*1fd5a2e1SPrashanth Swaminathan typedef unsigned int UINT64 __attribute__((__mode__(__DI__))); 138*1fd5a2e1SPrashanth Swaminathan typedef signed int SINT64 __attribute__((__mode__(__DI__))); 139*1fd5a2e1SPrashanth Swaminathan #endif 140*1fd5a2e1SPrashanth Swaminathan 141*1fd5a2e1SPrashanth Swaminathan typedef float FLOAT32; 142*1fd5a2e1SPrashanth Swaminathan 143*1fd5a2e1SPrashanth Swaminathan #ifndef __GNUC__ 144*1fd5a2e1SPrashanth Swaminathan #define __builtin_expect(x, expected_value) (x) 145*1fd5a2e1SPrashanth Swaminathan #endif 146*1fd5a2e1SPrashanth Swaminathan #define LIKELY(x) __builtin_expect(!!(x),1) 147*1fd5a2e1SPrashanth Swaminathan #define UNLIKELY(x) __builtin_expect((x)!=0,0) 148*1fd5a2e1SPrashanth Swaminathan 149*1fd5a2e1SPrashanth Swaminathan #ifdef __cplusplus 150*1fd5a2e1SPrashanth Swaminathan } 151*1fd5a2e1SPrashanth Swaminathan #endif 152*1fd5a2e1SPrashanth Swaminathan 153*1fd5a2e1SPrashanth Swaminathan #endif 154