1*1fd5a2e1SPrashanth Swaminathan /* -----------------------------------------------------------------*-C-*- 2*1fd5a2e1SPrashanth Swaminathan ffitarget.h - Copyright (c) 2012 Anthony Green 3*1fd5a2e1SPrashanth Swaminathan Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc 4*1fd5a2e1SPrashanth Swaminathan Copyright (c) 1996-2003 Red Hat, Inc. 5*1fd5a2e1SPrashanth Swaminathan 6*1fd5a2e1SPrashanth Swaminathan Target configuration macros for PowerPC. 7*1fd5a2e1SPrashanth Swaminathan 8*1fd5a2e1SPrashanth Swaminathan Permission is hereby granted, free of charge, to any person obtaining 9*1fd5a2e1SPrashanth Swaminathan a copy of this software and associated documentation files (the 10*1fd5a2e1SPrashanth Swaminathan ``Software''), to deal in the Software without restriction, including 11*1fd5a2e1SPrashanth Swaminathan without limitation the rights to use, copy, modify, merge, publish, 12*1fd5a2e1SPrashanth Swaminathan distribute, sublicense, and/or sell copies of the Software, and to 13*1fd5a2e1SPrashanth Swaminathan permit persons to whom the Software is furnished to do so, subject to 14*1fd5a2e1SPrashanth Swaminathan the following conditions: 15*1fd5a2e1SPrashanth Swaminathan 16*1fd5a2e1SPrashanth Swaminathan The above copyright notice and this permission notice shall be included 17*1fd5a2e1SPrashanth Swaminathan in all copies or substantial portions of the Software. 18*1fd5a2e1SPrashanth Swaminathan 19*1fd5a2e1SPrashanth Swaminathan THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, 20*1fd5a2e1SPrashanth Swaminathan EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21*1fd5a2e1SPrashanth Swaminathan MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22*1fd5a2e1SPrashanth Swaminathan NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 23*1fd5a2e1SPrashanth Swaminathan HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24*1fd5a2e1SPrashanth Swaminathan WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25*1fd5a2e1SPrashanth Swaminathan OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26*1fd5a2e1SPrashanth Swaminathan DEALINGS IN THE SOFTWARE. 27*1fd5a2e1SPrashanth Swaminathan 28*1fd5a2e1SPrashanth Swaminathan ----------------------------------------------------------------------- */ 29*1fd5a2e1SPrashanth Swaminathan 30*1fd5a2e1SPrashanth Swaminathan #ifndef LIBFFI_TARGET_H 31*1fd5a2e1SPrashanth Swaminathan #define LIBFFI_TARGET_H 32*1fd5a2e1SPrashanth Swaminathan 33*1fd5a2e1SPrashanth Swaminathan #ifndef LIBFFI_H 34*1fd5a2e1SPrashanth Swaminathan #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." 35*1fd5a2e1SPrashanth Swaminathan #endif 36*1fd5a2e1SPrashanth Swaminathan 37*1fd5a2e1SPrashanth Swaminathan /* ---- System specific configurations ----------------------------------- */ 38*1fd5a2e1SPrashanth Swaminathan 39*1fd5a2e1SPrashanth Swaminathan #if defined (POWERPC) && defined (__powerpc64__) /* linux64 */ 40*1fd5a2e1SPrashanth Swaminathan #ifndef POWERPC64 41*1fd5a2e1SPrashanth Swaminathan #define POWERPC64 42*1fd5a2e1SPrashanth Swaminathan #endif 43*1fd5a2e1SPrashanth Swaminathan #elif defined (POWERPC_DARWIN) && defined (__ppc64__) /* Darwin64 */ 44*1fd5a2e1SPrashanth Swaminathan #ifndef POWERPC64 45*1fd5a2e1SPrashanth Swaminathan #define POWERPC64 46*1fd5a2e1SPrashanth Swaminathan #endif 47*1fd5a2e1SPrashanth Swaminathan #ifndef POWERPC_DARWIN64 48*1fd5a2e1SPrashanth Swaminathan #define POWERPC_DARWIN64 49*1fd5a2e1SPrashanth Swaminathan #endif 50*1fd5a2e1SPrashanth Swaminathan #elif defined (POWERPC_AIX) && defined (__64BIT__) /* AIX64 */ 51*1fd5a2e1SPrashanth Swaminathan #ifndef POWERPC64 52*1fd5a2e1SPrashanth Swaminathan #define POWERPC64 53*1fd5a2e1SPrashanth Swaminathan #endif 54*1fd5a2e1SPrashanth Swaminathan #endif 55*1fd5a2e1SPrashanth Swaminathan 56*1fd5a2e1SPrashanth Swaminathan #ifndef LIBFFI_ASM 57*1fd5a2e1SPrashanth Swaminathan typedef unsigned long ffi_arg; 58*1fd5a2e1SPrashanth Swaminathan typedef signed long ffi_sarg; 59*1fd5a2e1SPrashanth Swaminathan 60*1fd5a2e1SPrashanth Swaminathan typedef enum ffi_abi { 61*1fd5a2e1SPrashanth Swaminathan FFI_FIRST_ABI = 0, 62*1fd5a2e1SPrashanth Swaminathan 63*1fd5a2e1SPrashanth Swaminathan #if defined (POWERPC_AIX) 64*1fd5a2e1SPrashanth Swaminathan FFI_AIX, 65*1fd5a2e1SPrashanth Swaminathan FFI_DARWIN, 66*1fd5a2e1SPrashanth Swaminathan FFI_DEFAULT_ABI = FFI_AIX, 67*1fd5a2e1SPrashanth Swaminathan FFI_LAST_ABI 68*1fd5a2e1SPrashanth Swaminathan 69*1fd5a2e1SPrashanth Swaminathan #elif defined (POWERPC_DARWIN) 70*1fd5a2e1SPrashanth Swaminathan FFI_AIX, 71*1fd5a2e1SPrashanth Swaminathan FFI_DARWIN, 72*1fd5a2e1SPrashanth Swaminathan FFI_DEFAULT_ABI = FFI_DARWIN, 73*1fd5a2e1SPrashanth Swaminathan FFI_LAST_ABI 74*1fd5a2e1SPrashanth Swaminathan 75*1fd5a2e1SPrashanth Swaminathan #else 76*1fd5a2e1SPrashanth Swaminathan /* The FFI_COMPAT values are used by old code. Since libffi may be 77*1fd5a2e1SPrashanth Swaminathan a shared library we have to support old values for backwards 78*1fd5a2e1SPrashanth Swaminathan compatibility. */ 79*1fd5a2e1SPrashanth Swaminathan FFI_COMPAT_SYSV, 80*1fd5a2e1SPrashanth Swaminathan FFI_COMPAT_GCC_SYSV, 81*1fd5a2e1SPrashanth Swaminathan FFI_COMPAT_LINUX64, 82*1fd5a2e1SPrashanth Swaminathan FFI_COMPAT_LINUX, 83*1fd5a2e1SPrashanth Swaminathan FFI_COMPAT_LINUX_SOFT_FLOAT, 84*1fd5a2e1SPrashanth Swaminathan 85*1fd5a2e1SPrashanth Swaminathan # if defined (POWERPC64) 86*1fd5a2e1SPrashanth Swaminathan /* This bit, always set in new code, must not be set in any of the 87*1fd5a2e1SPrashanth Swaminathan old FFI_COMPAT values that might be used for 64-bit linux. We 88*1fd5a2e1SPrashanth Swaminathan only need worry about FFI_COMPAT_LINUX64, but to be safe avoid 89*1fd5a2e1SPrashanth Swaminathan all old values. */ 90*1fd5a2e1SPrashanth Swaminathan FFI_LINUX = 8, 91*1fd5a2e1SPrashanth Swaminathan /* This and following bits can reuse FFI_COMPAT values. */ 92*1fd5a2e1SPrashanth Swaminathan FFI_LINUX_STRUCT_ALIGN = 1, 93*1fd5a2e1SPrashanth Swaminathan FFI_LINUX_LONG_DOUBLE_128 = 2, 94*1fd5a2e1SPrashanth Swaminathan FFI_LINUX_LONG_DOUBLE_IEEE128 = 4, 95*1fd5a2e1SPrashanth Swaminathan FFI_DEFAULT_ABI = (FFI_LINUX 96*1fd5a2e1SPrashanth Swaminathan # ifdef __STRUCT_PARM_ALIGN__ 97*1fd5a2e1SPrashanth Swaminathan | FFI_LINUX_STRUCT_ALIGN 98*1fd5a2e1SPrashanth Swaminathan # endif 99*1fd5a2e1SPrashanth Swaminathan # ifdef __LONG_DOUBLE_128__ 100*1fd5a2e1SPrashanth Swaminathan | FFI_LINUX_LONG_DOUBLE_128 101*1fd5a2e1SPrashanth Swaminathan # ifdef __LONG_DOUBLE_IEEE128__ 102*1fd5a2e1SPrashanth Swaminathan | FFI_LINUX_LONG_DOUBLE_IEEE128 103*1fd5a2e1SPrashanth Swaminathan # endif 104*1fd5a2e1SPrashanth Swaminathan # endif 105*1fd5a2e1SPrashanth Swaminathan ), 106*1fd5a2e1SPrashanth Swaminathan FFI_LAST_ABI = 16 107*1fd5a2e1SPrashanth Swaminathan 108*1fd5a2e1SPrashanth Swaminathan # else 109*1fd5a2e1SPrashanth Swaminathan /* This bit, always set in new code, must not be set in any of the 110*1fd5a2e1SPrashanth Swaminathan old FFI_COMPAT values that might be used for 32-bit linux/sysv/bsd. */ 111*1fd5a2e1SPrashanth Swaminathan FFI_SYSV = 8, 112*1fd5a2e1SPrashanth Swaminathan /* This and following bits can reuse FFI_COMPAT values. */ 113*1fd5a2e1SPrashanth Swaminathan FFI_SYSV_SOFT_FLOAT = 1, 114*1fd5a2e1SPrashanth Swaminathan FFI_SYSV_STRUCT_RET = 2, 115*1fd5a2e1SPrashanth Swaminathan FFI_SYSV_IBM_LONG_DOUBLE = 4, 116*1fd5a2e1SPrashanth Swaminathan FFI_SYSV_LONG_DOUBLE_128 = 16, 117*1fd5a2e1SPrashanth Swaminathan 118*1fd5a2e1SPrashanth Swaminathan FFI_DEFAULT_ABI = (FFI_SYSV 119*1fd5a2e1SPrashanth Swaminathan # ifdef __NO_FPRS__ 120*1fd5a2e1SPrashanth Swaminathan | FFI_SYSV_SOFT_FLOAT 121*1fd5a2e1SPrashanth Swaminathan # endif 122*1fd5a2e1SPrashanth Swaminathan # if (defined (__SVR4_STRUCT_RETURN) \ 123*1fd5a2e1SPrashanth Swaminathan || defined (POWERPC_FREEBSD) && !defined (__AIX_STRUCT_RETURN)) 124*1fd5a2e1SPrashanth Swaminathan | FFI_SYSV_STRUCT_RET 125*1fd5a2e1SPrashanth Swaminathan # endif 126*1fd5a2e1SPrashanth Swaminathan # if __LDBL_MANT_DIG__ == 106 127*1fd5a2e1SPrashanth Swaminathan | FFI_SYSV_IBM_LONG_DOUBLE 128*1fd5a2e1SPrashanth Swaminathan # endif 129*1fd5a2e1SPrashanth Swaminathan # ifdef __LONG_DOUBLE_128__ 130*1fd5a2e1SPrashanth Swaminathan | FFI_SYSV_LONG_DOUBLE_128 131*1fd5a2e1SPrashanth Swaminathan # endif 132*1fd5a2e1SPrashanth Swaminathan ), 133*1fd5a2e1SPrashanth Swaminathan FFI_LAST_ABI = 32 134*1fd5a2e1SPrashanth Swaminathan # endif 135*1fd5a2e1SPrashanth Swaminathan #endif 136*1fd5a2e1SPrashanth Swaminathan 137*1fd5a2e1SPrashanth Swaminathan } ffi_abi; 138*1fd5a2e1SPrashanth Swaminathan #endif 139*1fd5a2e1SPrashanth Swaminathan 140*1fd5a2e1SPrashanth Swaminathan /* ---- Definitions for closures ----------------------------------------- */ 141*1fd5a2e1SPrashanth Swaminathan 142*1fd5a2e1SPrashanth Swaminathan #define FFI_CLOSURES 1 143*1fd5a2e1SPrashanth Swaminathan #define FFI_NATIVE_RAW_API 0 144*1fd5a2e1SPrashanth Swaminathan #if defined (POWERPC) || defined (POWERPC_FREEBSD) 145*1fd5a2e1SPrashanth Swaminathan # define FFI_GO_CLOSURES 1 146*1fd5a2e1SPrashanth Swaminathan # define FFI_TARGET_SPECIFIC_VARIADIC 1 147*1fd5a2e1SPrashanth Swaminathan # define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs 148*1fd5a2e1SPrashanth Swaminathan #endif 149*1fd5a2e1SPrashanth Swaminathan #if defined (POWERPC_AIX) 150*1fd5a2e1SPrashanth Swaminathan # define FFI_GO_CLOSURES 1 151*1fd5a2e1SPrashanth Swaminathan #endif 152*1fd5a2e1SPrashanth Swaminathan 153*1fd5a2e1SPrashanth Swaminathan /* ppc_closure.S and linux64_closure.S expect this. */ 154*1fd5a2e1SPrashanth Swaminathan #define FFI_PPC_TYPE_LAST FFI_TYPE_POINTER 155*1fd5a2e1SPrashanth Swaminathan 156*1fd5a2e1SPrashanth Swaminathan /* We define additional types below. If generic types are added that 157*1fd5a2e1SPrashanth Swaminathan must be supported by powerpc libffi then it is likely that 158*1fd5a2e1SPrashanth Swaminathan FFI_PPC_TYPE_LAST needs increasing *and* the jump tables in 159*1fd5a2e1SPrashanth Swaminathan ppc_closure.S and linux64_closure.S be extended. */ 160*1fd5a2e1SPrashanth Swaminathan 161*1fd5a2e1SPrashanth Swaminathan #if !(FFI_TYPE_LAST == FFI_PPC_TYPE_LAST \ 162*1fd5a2e1SPrashanth Swaminathan || (FFI_TYPE_LAST == FFI_TYPE_COMPLEX \ 163*1fd5a2e1SPrashanth Swaminathan && !defined FFI_TARGET_HAS_COMPLEX_TYPE)) 164*1fd5a2e1SPrashanth Swaminathan # error "You likely have a broken powerpc libffi" 165*1fd5a2e1SPrashanth Swaminathan #endif 166*1fd5a2e1SPrashanth Swaminathan 167*1fd5a2e1SPrashanth Swaminathan /* Needed for soft-float long-double-128 support. */ 168*1fd5a2e1SPrashanth Swaminathan #define FFI_TYPE_UINT128 (FFI_PPC_TYPE_LAST + 1) 169*1fd5a2e1SPrashanth Swaminathan 170*1fd5a2e1SPrashanth Swaminathan /* Needed for FFI_SYSV small structure returns. */ 171*1fd5a2e1SPrashanth Swaminathan #define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 2) 172*1fd5a2e1SPrashanth Swaminathan 173*1fd5a2e1SPrashanth Swaminathan /* Used by ELFv2 for homogenous structure returns. */ 174*1fd5a2e1SPrashanth Swaminathan #define FFI_V2_TYPE_VECTOR (FFI_PPC_TYPE_LAST + 1) 175*1fd5a2e1SPrashanth Swaminathan #define FFI_V2_TYPE_VECTOR_HOMOG (FFI_PPC_TYPE_LAST + 2) 176*1fd5a2e1SPrashanth Swaminathan #define FFI_V2_TYPE_FLOAT_HOMOG (FFI_PPC_TYPE_LAST + 3) 177*1fd5a2e1SPrashanth Swaminathan #define FFI_V2_TYPE_DOUBLE_HOMOG (FFI_PPC_TYPE_LAST + 4) 178*1fd5a2e1SPrashanth Swaminathan #define FFI_V2_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 5) 179*1fd5a2e1SPrashanth Swaminathan 180*1fd5a2e1SPrashanth Swaminathan #if _CALL_ELF == 2 181*1fd5a2e1SPrashanth Swaminathan # define FFI_TRAMPOLINE_SIZE 32 182*1fd5a2e1SPrashanth Swaminathan #else 183*1fd5a2e1SPrashanth Swaminathan # if defined(POWERPC64) || defined(POWERPC_AIX) 184*1fd5a2e1SPrashanth Swaminathan # if defined(POWERPC_DARWIN64) 185*1fd5a2e1SPrashanth Swaminathan # define FFI_TRAMPOLINE_SIZE 48 186*1fd5a2e1SPrashanth Swaminathan # else 187*1fd5a2e1SPrashanth Swaminathan # define FFI_TRAMPOLINE_SIZE 24 188*1fd5a2e1SPrashanth Swaminathan # endif 189*1fd5a2e1SPrashanth Swaminathan # else /* POWERPC || POWERPC_AIX */ 190*1fd5a2e1SPrashanth Swaminathan # define FFI_TRAMPOLINE_SIZE 40 191*1fd5a2e1SPrashanth Swaminathan # endif 192*1fd5a2e1SPrashanth Swaminathan #endif 193*1fd5a2e1SPrashanth Swaminathan 194*1fd5a2e1SPrashanth Swaminathan #ifndef LIBFFI_ASM 195*1fd5a2e1SPrashanth Swaminathan #if defined(POWERPC_DARWIN) || defined(POWERPC_AIX) 196*1fd5a2e1SPrashanth Swaminathan struct ffi_aix_trampoline_struct { 197*1fd5a2e1SPrashanth Swaminathan void * code_pointer; /* Pointer to ffi_closure_ASM */ 198*1fd5a2e1SPrashanth Swaminathan void * toc; /* TOC */ 199*1fd5a2e1SPrashanth Swaminathan void * static_chain; /* Pointer to closure */ 200*1fd5a2e1SPrashanth Swaminathan }; 201*1fd5a2e1SPrashanth Swaminathan #endif 202*1fd5a2e1SPrashanth Swaminathan #endif 203*1fd5a2e1SPrashanth Swaminathan 204*1fd5a2e1SPrashanth Swaminathan #endif 205