jpayne@69: /* -----------------------------------------------------------------*-C-*- jpayne@69: ffitarget.h - Copyright (c) 2012, 2014 Anthony Green jpayne@69: Copyright (c) 1996-2003, 2010 Red Hat, Inc. jpayne@69: Copyright (C) 2008 Free Software Foundation, Inc. jpayne@69: jpayne@69: Target configuration macros for x86 and x86-64. jpayne@69: jpayne@69: Permission is hereby granted, free of charge, to any person obtaining jpayne@69: a copy of this software and associated documentation files (the jpayne@69: ``Software''), to deal in the Software without restriction, including jpayne@69: without limitation the rights to use, copy, modify, merge, publish, jpayne@69: distribute, sublicense, and/or sell copies of the Software, and to jpayne@69: permit persons to whom the Software is furnished to do so, subject to jpayne@69: the following conditions: jpayne@69: jpayne@69: The above copyright notice and this permission notice shall be included jpayne@69: in all copies or substantial portions of the Software. jpayne@69: jpayne@69: THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, jpayne@69: EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF jpayne@69: MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND jpayne@69: NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT jpayne@69: HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, jpayne@69: WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, jpayne@69: OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER jpayne@69: DEALINGS IN THE SOFTWARE. jpayne@69: jpayne@69: ----------------------------------------------------------------------- */ jpayne@69: jpayne@69: #ifndef LIBFFI_TARGET_H jpayne@69: #define LIBFFI_TARGET_H jpayne@69: jpayne@69: #ifndef LIBFFI_H jpayne@69: #error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." jpayne@69: #endif jpayne@69: jpayne@69: /* ---- System specific configurations ----------------------------------- */ jpayne@69: jpayne@69: /* For code common to all platforms on x86 and x86_64. */ jpayne@69: #define X86_ANY jpayne@69: jpayne@69: #if defined (X86_64) && defined (__i386__) jpayne@69: #undef X86_64 jpayne@69: #define X86 jpayne@69: #endif jpayne@69: jpayne@69: #ifdef X86_WIN64 jpayne@69: #define FFI_SIZEOF_ARG 8 jpayne@69: #define USE_BUILTIN_FFS 0 /* not yet implemented in mingw-64 */ jpayne@69: #endif jpayne@69: jpayne@69: #define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION jpayne@69: #define FFI_TARGET_HAS_COMPLEX_TYPE jpayne@69: jpayne@69: /* ---- Generic type definitions ----------------------------------------- */ jpayne@69: jpayne@69: #ifndef LIBFFI_ASM jpayne@69: #ifdef X86_WIN64 jpayne@69: #ifdef _MSC_VER jpayne@69: typedef unsigned __int64 ffi_arg; jpayne@69: typedef __int64 ffi_sarg; jpayne@69: #else jpayne@69: typedef unsigned long long ffi_arg; jpayne@69: typedef long long ffi_sarg; jpayne@69: #endif jpayne@69: #else jpayne@69: #if defined __x86_64__ && defined __ILP32__ jpayne@69: #define FFI_SIZEOF_ARG 8 jpayne@69: #define FFI_SIZEOF_JAVA_RAW 4 jpayne@69: typedef unsigned long long ffi_arg; jpayne@69: typedef long long ffi_sarg; jpayne@69: #else jpayne@69: typedef unsigned long ffi_arg; jpayne@69: typedef signed long ffi_sarg; jpayne@69: #endif jpayne@69: #endif jpayne@69: jpayne@69: typedef enum ffi_abi { jpayne@69: FFI_FIRST_ABI = 0, jpayne@69: jpayne@69: /* ---- Intel x86 Win32 ---------- */ jpayne@69: #ifdef X86_WIN32 jpayne@69: FFI_SYSV, jpayne@69: FFI_STDCALL, jpayne@69: FFI_THISCALL, jpayne@69: FFI_FASTCALL, jpayne@69: FFI_MS_CDECL, jpayne@69: FFI_PASCAL, jpayne@69: FFI_REGISTER, jpayne@69: FFI_LAST_ABI, jpayne@69: #ifdef _MSC_VER jpayne@69: FFI_DEFAULT_ABI = FFI_MS_CDECL jpayne@69: #else jpayne@69: FFI_DEFAULT_ABI = FFI_SYSV jpayne@69: #endif jpayne@69: jpayne@69: #elif defined(X86_WIN64) jpayne@69: FFI_WIN64, jpayne@69: FFI_LAST_ABI, jpayne@69: FFI_DEFAULT_ABI = FFI_WIN64 jpayne@69: jpayne@69: #else jpayne@69: /* ---- Intel x86 and AMD x86-64 - */ jpayne@69: FFI_SYSV, jpayne@69: FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ jpayne@69: FFI_THISCALL, jpayne@69: FFI_FASTCALL, jpayne@69: FFI_STDCALL, jpayne@69: FFI_PASCAL, jpayne@69: FFI_REGISTER, jpayne@69: FFI_LAST_ABI, jpayne@69: #if defined(__i386__) || defined(__i386) jpayne@69: FFI_DEFAULT_ABI = FFI_SYSV jpayne@69: #else jpayne@69: FFI_DEFAULT_ABI = FFI_UNIX64 jpayne@69: #endif jpayne@69: #endif jpayne@69: } ffi_abi; jpayne@69: #endif jpayne@69: jpayne@69: /* ---- Definitions for closures ----------------------------------------- */ jpayne@69: jpayne@69: #define FFI_CLOSURES 1 jpayne@69: #define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1) jpayne@69: #define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2) jpayne@69: #define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3) jpayne@69: #define FFI_TYPE_MS_STRUCT (FFI_TYPE_LAST + 4) jpayne@69: jpayne@69: #if defined (X86_64) || (defined (__x86_64__) && defined (X86_DARWIN)) jpayne@69: #define FFI_TRAMPOLINE_SIZE 24 jpayne@69: #define FFI_NATIVE_RAW_API 0 jpayne@69: #else jpayne@69: #ifdef X86_WIN32 jpayne@69: #define FFI_TRAMPOLINE_SIZE 52 jpayne@69: #else jpayne@69: #ifdef X86_WIN64 jpayne@69: #define FFI_TRAMPOLINE_SIZE 29 jpayne@69: #define FFI_NATIVE_RAW_API 0 jpayne@69: #define FFI_NO_RAW_API 1 jpayne@69: #else jpayne@69: #define FFI_TRAMPOLINE_SIZE 10 jpayne@69: #endif jpayne@69: #endif jpayne@69: #ifndef X86_WIN64 jpayne@69: #define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ jpayne@69: #endif jpayne@69: #endif jpayne@69: jpayne@69: #endif jpayne@69: