xref: /aosp_15_r20/external/libffi/src/powerpc/ffitarget.h (revision 1fd5a2e1d639cd1ddf29dd0c484c123bbd850c21)
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