aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.8/libffi/src/powerpc/ffitarget.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc-4.8/libffi/src/powerpc/ffitarget.h')
-rw-r--r--gcc-4.8/libffi/src/powerpc/ffitarget.h110
1 files changed, 76 insertions, 34 deletions
diff --git a/gcc-4.8/libffi/src/powerpc/ffitarget.h b/gcc-4.8/libffi/src/powerpc/ffitarget.h
index 3c9db495f..b47b0f5d3 100644
--- a/gcc-4.8/libffi/src/powerpc/ffitarget.h
+++ b/gcc-4.8/libffi/src/powerpc/ffitarget.h
@@ -60,45 +60,76 @@ typedef signed long ffi_sarg;
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
-#ifdef POWERPC
- FFI_SYSV,
- FFI_GCC_SYSV,
- FFI_LINUX64,
- FFI_LINUX,
- FFI_LINUX_SOFT_FLOAT,
-# if defined(POWERPC64)
- FFI_DEFAULT_ABI = FFI_LINUX64,
-# elif defined(__NO_FPRS__)
- FFI_DEFAULT_ABI = FFI_LINUX_SOFT_FLOAT,
-# elif (__LDBL_MANT_DIG__ == 106)
- FFI_DEFAULT_ABI = FFI_LINUX,
-# else
- FFI_DEFAULT_ABI = FFI_GCC_SYSV,
-# endif
-#endif
-
-#ifdef POWERPC_AIX
+#if defined (POWERPC_AIX)
FFI_AIX,
FFI_DARWIN,
FFI_DEFAULT_ABI = FFI_AIX,
-#endif
+ FFI_LAST_ABI
-#ifdef POWERPC_DARWIN
+#elif defined (POWERPC_DARWIN)
FFI_AIX,
FFI_DARWIN,
FFI_DEFAULT_ABI = FFI_DARWIN,
-#endif
+ FFI_LAST_ABI
+
+#else
+ /* The FFI_COMPAT values are used by old code. Since libffi may be
+ a shared library we have to support old values for backwards
+ compatibility. */
+ FFI_COMPAT_SYSV,
+ FFI_COMPAT_GCC_SYSV,
+ FFI_COMPAT_LINUX64,
+ FFI_COMPAT_LINUX,
+ FFI_COMPAT_LINUX_SOFT_FLOAT,
+
+# if defined (POWERPC64)
+ /* This bit, always set in new code, must not be set in any of the
+ old FFI_COMPAT values that might be used for 64-bit linux. We
+ only need worry about FFI_COMPAT_LINUX64, but to be safe avoid
+ all old values. */
+ FFI_LINUX = 8,
+ /* This and following bits can reuse FFI_COMPAT values. */
+ FFI_LINUX_STRUCT_ALIGN = 1,
+ FFI_LINUX_LONG_DOUBLE_128 = 2,
+ FFI_DEFAULT_ABI = (FFI_LINUX
+# ifdef __STRUCT_PARM_ALIGN__
+ | FFI_LINUX_STRUCT_ALIGN
+# endif
+# ifdef __LONG_DOUBLE_128__
+ | FFI_LINUX_LONG_DOUBLE_128
+# endif
+ ),
+ FFI_LAST_ABI = 12
-#ifdef POWERPC_FREEBSD
- FFI_SYSV,
- FFI_GCC_SYSV,
- FFI_LINUX64,
- FFI_LINUX,
- FFI_LINUX_SOFT_FLOAT,
- FFI_DEFAULT_ABI = FFI_SYSV,
+# else
+ /* This bit, always set in new code, must not be set in any of the
+ old FFI_COMPAT values that might be used for 32-bit linux/sysv/bsd. */
+ FFI_SYSV = 8,
+ /* This and following bits can reuse FFI_COMPAT values. */
+ FFI_SYSV_SOFT_FLOAT = 1,
+ FFI_SYSV_STRUCT_RET = 2,
+ FFI_SYSV_IBM_LONG_DOUBLE = 4,
+ FFI_SYSV_LONG_DOUBLE_128 = 16,
+
+ FFI_DEFAULT_ABI = (FFI_SYSV
+# ifdef __NO_FPRS__
+ | FFI_SYSV_SOFT_FLOAT
+# endif
+# if (defined (__SVR4_STRUCT_RETURN) \
+ || defined (POWERPC_FREEBSD) && !defined (__AIX_STRUCT_RETURN))
+ | FFI_SYSV_STRUCT_RET
+# endif
+# if __LDBL_MANT_DIG__ == 106
+ | FFI_SYSV_IBM_LONG_DOUBLE
+# endif
+# ifdef __LONG_DOUBLE_128__
+ | FFI_SYSV_LONG_DOUBLE_128
+# endif
+ ),
+ FFI_LAST_ABI = 32
+# endif
#endif
- FFI_LAST_ABI
} ffi_abi;
#endif
@@ -106,6 +137,10 @@ typedef enum ffi_abi {
#define FFI_CLOSURES 1
#define FFI_NATIVE_RAW_API 0
+#if defined (POWERPC) || defined (POWERPC_FREEBSD)
+# define FFI_TARGET_SPECIFIC_VARIADIC 1
+# define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs
+#endif
/* For additional types like the below, take care about the order in
ppc_closures.S. They must follow after the FFI_TYPE_LAST. */
@@ -113,19 +148,26 @@ typedef enum ffi_abi {
/* Needed for soft-float long-double-128 support. */
#define FFI_TYPE_UINT128 (FFI_TYPE_LAST + 1)
-/* Needed for FFI_SYSV small structure returns.
- We use two flag bits, (FLAG_SYSV_SMST_R3, FLAG_SYSV_SMST_R4) which are
- defined in ffi.c, to determine the exact return type and its size. */
+/* Needed for FFI_SYSV small structure returns. */
#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 2)
-#if defined(POWERPC64) || defined(POWERPC_AIX)
+/* Used by ELFv2 for homogenous structure returns. */
+#define FFI_V2_TYPE_FLOAT_HOMOG (FFI_TYPE_LAST + 1)
+#define FFI_V2_TYPE_DOUBLE_HOMOG (FFI_TYPE_LAST + 2)
+#define FFI_V2_TYPE_SMALL_STRUCT (FFI_TYPE_LAST + 3)
+
+#if _CALL_ELF == 2
+# define FFI_TRAMPOLINE_SIZE 32
+#else
+# if defined(POWERPC64) || defined(POWERPC_AIX)
# if defined(POWERPC_DARWIN64)
# define FFI_TRAMPOLINE_SIZE 48
# else
# define FFI_TRAMPOLINE_SIZE 24
# endif
-#else /* POWERPC || POWERPC_AIX */
+# else /* POWERPC || POWERPC_AIX */
# define FFI_TRAMPOLINE_SIZE 40
+# endif
#endif
#ifndef LIBFFI_ASM