From 11f14b52e58ec3c7985462873135814a6bde81d3 Mon Sep 17 00:00:00 2001 From: cyberbox <468042667@qq.com> Date: Wed, 15 May 2024 07:05:38 +0000 Subject: [PATCH] fix x86-64 bug Signed-off-by: cyberbox <468042667@qq.com> --- BUILD.gn | 19 +- patch/backport-openharmony-adapt.patch | 1972 +----------------------- 2 files changed, 35 insertions(+), 1956 deletions(-) diff --git a/BUILD.gn b/BUILD.gn index 1f15ab6..ac5a68f 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -115,7 +115,22 @@ action("libffi_action") { } config("ffi_public_config") { - include_dirs = [ "$libffi_dir/include" ] + if (target_cpu == "arm") { + include_dirs = [ + "$libffi_dir/include", + "$libffi_dir/src/arm", + ] + } else if (target_cpu == "x86_64") { + include_dirs = [ + "$libffi_dir/include", + "$libffi_dir/src/x86", + ] + } else { + include_dirs = [ + "$libffi_dir/include", + "$libffi_dir/src/aarch64", + ] + } } ohos_shared_library("ffi") { @@ -165,7 +180,9 @@ ohos_shared_library("ffi") { "$libffi_dir/src/tramp.c", "$libffi_dir/src/types.c", "$libffi_dir/src/x86/ffi64.c", + "$libffi_dir/src/x86/ffiw64.c", "$libffi_dir/src/x86/unix64.S", + "$libffi_dir/src/x86/win64.S", ] } else { include_dirs = [ diff --git a/patch/backport-openharmony-adapt.patch b/patch/backport-openharmony-adapt.patch index 892342e..7f6c73c 100644 --- a/patch/backport-openharmony-adapt.patch +++ b/patch/backport-openharmony-adapt.patch @@ -1,6 +1,6 @@ diff --git a/fficonfig.h b/fficonfig.h -new file mode 100644 -index 0000000..ed4bb15 +new file mode 100755 +index 0000000..d12db96 --- /dev/null +++ b/fficonfig.h @@ -0,0 +1,230 @@ @@ -63,10 +63,10 @@ index 0000000..ed4bb15 +/* #undef HAVE_AS_SPARC_UA_PCREL */ + +/* Define if your assembler supports unwind section type. */ -+/* #undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE */ ++#define HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1 + +/* Define if your assembler supports PC relative relocs. */ -+/* #undef HAVE_AS_X86_PCREL */ ++#define HAVE_AS_X86_PCREL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 @@ -234,1530 +234,12 @@ index 0000000..ed4bb15 +#endif +#endif + -diff --git a/include/ffi-aarch64.h b/include/ffi-aarch64.h -new file mode 100644 -index 0000000..ea557e6 ---- /dev/null -+++ b/include/ffi-aarch64.h -@@ -0,0 +1,500 @@ -+/* -----------------------------------------------------------------*-C-*- -+ libffi 3.2.9999 - Copyright (c) 2011, 2014 Anthony Green -+ - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. -+ -+ Permission is hereby granted, free of charge, to any person -+ obtaining a copy of this software and associated documentation -+ files (the ``Software''), to deal in the Software without -+ restriction, including without limitation the rights to use, copy, -+ modify, merge, publish, distribute, sublicense, and/or sell copies -+ of the Software, and to permit persons to whom the Software is -+ furnished to do so, subject to the following conditions: -+ -+ The above copyright notice and this permission notice shall be -+ included in all copies or substantial portions of the Software. -+ -+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, -+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ DEALINGS IN THE SOFTWARE. -+ -+ ----------------------------------------------------------------------- */ -+ -+/* ------------------------------------------------------------------- -+ Most of the API is documented in doc/libffi.texi. -+ -+ The raw API is designed to bypass some of the argument packing and -+ unpacking on architectures for which it can be avoided. Routines -+ are provided to emulate the raw API if the underlying platform -+ doesn't allow faster implementation. -+ -+ More details on the raw API can be found in: -+ -+ http://gcc.gnu.org/ml/java/1999-q3/msg00138.html -+ -+ and -+ -+ http://gcc.gnu.org/ml/java/1999-q3/msg00174.html -+ -------------------------------------------------------------------- */ -+ -+#ifndef LIBFFI_H -+#define LIBFFI_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+/* Specify which architecture libffi is configured for. */ -+#ifndef AARCH64 -+#define AARCH64 -+#endif -+ -+/* ---- System configuration information --------------------------------- */ -+ -+#include -+ -+/* Need minimal decorations for DLLs to works on Windows. GCC has -+ autoimport and autoexport. Rely on Libtool to help MSVC export -+ from a DLL, but always declare data to be imported for MSVC -+ clients. This costs an extra indirection for MSVC clients using -+ the static version of the library, but don't worry about that. -+ Besides, as a workaround, they can define FFI_BUILDING if they -+ *know* they are going to link with the static library. */ -+#if defined _WIN32 && !defined FFI_STATIC_BUILD -+#ifdef FFI_BUILDING -+#define FFI_EXTERN __declspec(dllexport) -+#else -+#define FFI_EXTERN __declspec(dllimport) -+#endif -+#else -+#define FFI_EXTERN extern -+#endif -+ -+#ifndef LIBFFI_ASM -+ -+#if defined(_MSC_VER) && !defined(__clang__) -+#define __attribute__(X) -+#endif -+ -+#include -+#include -+ -+/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). -+ But we can find it either under the correct ANSI name, or under GNU -+ C's internal name. */ -+ -+#define FFI_64_BIT_MAX 9223372036854775807 -+ -+#ifdef LONG_LONG_MAX -+# define FFI_LONG_LONG_MAX LONG_LONG_MAX -+#else -+# ifdef LLONG_MAX -+# define FFI_LONG_LONG_MAX LLONG_MAX -+# ifdef _AIX52 /* or newer has C99 LLONG_MAX */ -+# undef FFI_64_BIT_MAX -+# define FFI_64_BIT_MAX 9223372036854775807LL -+# endif /* _AIX52 or newer */ -+# else -+# ifdef __GNUC__ -+# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ -+# endif -+# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ -+# ifndef __PPC64__ -+# if defined (__IBMC__) || defined (__IBMCPP__) -+# define FFI_LONG_LONG_MAX LONGLONG_MAX -+# endif -+# endif /* __PPC64__ */ -+# undef FFI_64_BIT_MAX -+# define FFI_64_BIT_MAX 9223372036854775807LL -+# endif -+# endif -+#endif -+ -+/* The closure code assumes that this works on pointers, i.e. a size_t -+ can hold a pointer. */ -+ -+typedef struct _ffi_type -+{ -+ size_t size; -+ unsigned short alignment; -+ unsigned short type; -+ struct _ffi_type **elements; -+} ffi_type; -+ -+#ifndef LIBFFI_HIDE_BASIC_TYPES -+#if SCHAR_MAX == 127 -+# define ffi_type_uchar ffi_type_uint8 -+# define ffi_type_schar ffi_type_sint8 -+#else -+ #error "char size not supported" -+#endif -+ -+#if SHRT_MAX == 32767 -+# define ffi_type_ushort ffi_type_uint16 -+# define ffi_type_sshort ffi_type_sint16 -+#elif SHRT_MAX == 2147483647 -+# define ffi_type_ushort ffi_type_uint32 -+# define ffi_type_sshort ffi_type_sint32 -+#else -+ #error "short size not supported" -+#endif -+ -+#if INT_MAX == 32767 -+# define ffi_type_uint ffi_type_uint16 -+# define ffi_type_sint ffi_type_sint16 -+#elif INT_MAX == 2147483647 -+# define ffi_type_uint ffi_type_uint32 -+# define ffi_type_sint ffi_type_sint32 -+#elif INT_MAX == 9223372036854775807 -+# define ffi_type_uint ffi_type_uint64 -+# define ffi_type_sint ffi_type_sint64 -+#else -+ #error "int size not supported" -+#endif -+ -+#if LONG_MAX == 2147483647 -+# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX -+ #error "no 64-bit data type supported" -+# endif -+#elif LONG_MAX != FFI_64_BIT_MAX -+ #error "long size not supported" -+#endif -+ -+#if LONG_MAX == 2147483647 -+# define ffi_type_ulong ffi_type_uint32 -+# define ffi_type_slong ffi_type_sint32 -+#elif LONG_MAX == FFI_64_BIT_MAX -+# define ffi_type_ulong ffi_type_uint64 -+# define ffi_type_slong ffi_type_sint64 -+#else -+ #error "long size not supported" -+#endif -+ -+/* These are defined in types.c. */ -+FFI_EXTERN ffi_type ffi_type_void; -+FFI_EXTERN ffi_type ffi_type_uint8; -+FFI_EXTERN ffi_type ffi_type_sint8; -+FFI_EXTERN ffi_type ffi_type_uint16; -+FFI_EXTERN ffi_type ffi_type_sint16; -+FFI_EXTERN ffi_type ffi_type_uint32; -+FFI_EXTERN ffi_type ffi_type_sint32; -+FFI_EXTERN ffi_type ffi_type_uint64; -+FFI_EXTERN ffi_type ffi_type_sint64; -+FFI_EXTERN ffi_type ffi_type_float; -+FFI_EXTERN ffi_type ffi_type_double; -+FFI_EXTERN ffi_type ffi_type_pointer; -+ -+#if 1 -+FFI_EXTERN ffi_type ffi_type_longdouble; -+#else -+#define ffi_type_longdouble ffi_type_double -+#endif -+ -+#ifdef FFI_TARGET_HAS_COMPLEX_TYPE -+FFI_EXTERN ffi_type ffi_type_complex_float; -+FFI_EXTERN ffi_type ffi_type_complex_double; -+#if 1 -+FFI_EXTERN ffi_type ffi_type_complex_longdouble; -+#else -+#define ffi_type_complex_longdouble ffi_type_complex_double -+#endif -+#endif -+#endif /* LIBFFI_HIDE_BASIC_TYPES */ -+ -+typedef enum { -+ FFI_OK = 0, -+ FFI_BAD_TYPEDEF, -+ FFI_BAD_ABI -+} ffi_status; -+ -+typedef struct { -+ ffi_abi abi; -+ unsigned nargs; -+ ffi_type **arg_types; -+ ffi_type *rtype; -+ unsigned bytes; -+ unsigned flags; -+ unsigned isVariadic; -+#ifdef FFI_EXTRA_CIF_FIELDS -+ FFI_EXTRA_CIF_FIELDS; -+#endif -+} ffi_cif; -+ -+/* ---- Definitions for the raw API -------------------------------------- */ -+ -+#ifndef FFI_SIZEOF_ARG -+# if LONG_MAX == 2147483647 -+# define FFI_SIZEOF_ARG 4 -+# elif LONG_MAX == FFI_64_BIT_MAX -+# define FFI_SIZEOF_ARG 8 -+# endif -+#endif -+ -+#ifndef FFI_SIZEOF_JAVA_RAW -+# define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG -+#endif -+ -+typedef union { -+ ffi_sarg sint; -+ ffi_arg uint; -+ float flt; -+ char data[FFI_SIZEOF_ARG]; -+ void* ptr; -+} ffi_raw; -+ -+#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 -+/* This is a special case for mips64/n32 ABI (and perhaps others) where -+ sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ -+typedef union { -+ signed int sint; -+ unsigned int uint; -+ float flt; -+ char data[FFI_SIZEOF_JAVA_RAW]; -+ void* ptr; -+} ffi_java_raw; -+#else -+typedef ffi_raw ffi_java_raw; -+#endif -+ -+FFI_EXTERN -+void ffi_raw_call (ffi_cif *cif, -+ void (*fn)(void), -+ void *rvalue, -+ ffi_raw *avalue); -+ -+FFI_EXTERN void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -+FFI_EXTERN void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -+FFI_EXTERN size_t ffi_raw_size (ffi_cif *cif); -+ -+/* This is analogous to the raw API, except it uses Java parameter -+ packing, even on 64-bit machines. I.e. on 64-bit machines longs -+ and doubles are followed by an empty 64-bit word. */ -+FFI_EXTERN -+void ffi_java_raw_call (ffi_cif *cif, -+ void (*fn)(void), -+ void *rvalue, -+ ffi_java_raw *avalue); -+ -+FFI_EXTERN void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); -+FFI_EXTERN void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); -+FFI_EXTERN size_t ffi_java_raw_size (ffi_cif *cif); -+ -+/* ---- Definitions for closures ----------------------------------------- */ -+ -+#if FFI_CLOSURES -+ -+#ifdef _MSC_VER -+__declspec(align(8)) -+#endif -+typedef struct { -+#if 0 -+ void *trampoline_table; -+ void *trampoline_table_entry; -+#else -+ char tramp[FFI_TRAMPOLINE_SIZE]; -+#endif -+ ffi_cif *cif; -+ void (*fun)(ffi_cif*,void*,void**,void*); -+ void *user_data; -+} ffi_closure -+#ifdef __GNUC__ -+ __attribute__((aligned (8))) -+#endif -+ ; -+ -+#ifndef __GNUC__ -+# ifdef __sgi -+# pragma pack 0 -+# endif -+#endif -+ -+FFI_EXTERN void *ffi_closure_alloc (size_t size, void **code); -+FFI_EXTERN void ffi_closure_free (void *); -+ -+FFI_EXTERN ffi_status -+ffi_prep_closure (ffi_closure*, -+ ffi_cif *, -+ void (*fun)(ffi_cif*,void*,void**,void*), -+ void *user_data) -+#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 405) -+ __attribute__((deprecated ("use ffi_prep_closure_loc instead"))) -+#elif defined(__GNUC__) && __GNUC__ >= 3 -+ __attribute__((deprecated)) -+#endif -+ ; -+ -+FFI_EXTERN ffi_status -+ffi_prep_closure_loc (ffi_closure*, -+ ffi_cif *, -+ void (*fun)(ffi_cif*,void*,void**,void*), -+ void *user_data, -+ void*codeloc); -+ -+#ifdef __sgi -+# pragma pack 8 -+#endif -+typedef struct { -+#if 0 -+ void *trampoline_table; -+ void *trampoline_table_entry; -+#else -+ char tramp[FFI_TRAMPOLINE_SIZE]; -+#endif -+ ffi_cif *cif; -+ -+#if !FFI_NATIVE_RAW_API -+ -+ /* If this is enabled, then a raw closure has the same layout -+ as a regular closure. We use this to install an intermediate -+ handler to do the transaltion, void** -> ffi_raw*. */ -+ -+ void (*translate_args)(ffi_cif*,void*,void**,void*); -+ void *this_closure; -+ -+#endif -+ -+ void (*fun)(ffi_cif*,void*,ffi_raw*,void*); -+ void *user_data; -+ -+} ffi_raw_closure; -+ -+typedef struct { -+#if 0 -+ void *trampoline_table; -+ void *trampoline_table_entry; -+#else -+ char tramp[FFI_TRAMPOLINE_SIZE]; -+#endif -+ -+ ffi_cif *cif; -+ -+#if !FFI_NATIVE_RAW_API -+ -+ /* If this is enabled, then a raw closure has the same layout -+ as a regular closure. We use this to install an intermediate -+ handler to do the translation, void** -> ffi_raw*. */ -+ -+ void (*translate_args)(ffi_cif*,void*,void**,void*); -+ void *this_closure; -+ -+#endif -+ -+ void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); -+ void *user_data; -+ -+} ffi_java_raw_closure; -+ -+FFI_EXTERN ffi_status -+ffi_prep_raw_closure (ffi_raw_closure*, -+ ffi_cif *cif, -+ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), -+ void *user_data); -+ -+FFI_EXTERN ffi_status -+ffi_prep_raw_closure_loc (ffi_raw_closure*, -+ ffi_cif *cif, -+ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), -+ void *user_data, -+ void *codeloc); -+ -+FFI_EXTERN ffi_status -+ffi_prep_java_raw_closure (ffi_java_raw_closure*, -+ ffi_cif *cif, -+ void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), -+ void *user_data); -+ -+FFI_EXTERN ffi_status -+ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, -+ ffi_cif *cif, -+ void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), -+ void *user_data, -+ void *codeloc); -+ -+#endif /* FFI_CLOSURES */ -+ -+#if FFI_GO_CLOSURES -+ -+typedef struct { -+ void *tramp; -+ ffi_cif *cif; -+ void (*fun)(ffi_cif*,void*,void**,void*); -+} ffi_go_closure; -+ -+FFI_EXTERN -+ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, -+ void (*fun)(ffi_cif*,void*,void**,void*)); -+ -+FFI_EXTERN -+void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, -+ void **avalue, void *closure); -+ -+#endif /* FFI_GO_CLOSURES */ -+ -+/* ---- Public interface definition -------------------------------------- */ -+ -+FFI_EXTERN -+ffi_status ffi_prep_cif(ffi_cif *cif, -+ ffi_abi abi, -+ unsigned int nargs, -+ ffi_type *rtype, -+ ffi_type **atypes); -+ -+FFI_EXTERN -+ffi_status ffi_prep_cif_var(ffi_cif *cif, -+ ffi_abi abi, -+ unsigned int nfixedargs, -+ unsigned int ntotalargs, -+ ffi_type *rtype, -+ ffi_type **atypes); -+ -+FFI_EXTERN -+void ffi_call(ffi_cif *cif, -+ void (*fn)(void), -+ void *rvalue, -+ void **avalue); -+ -+FFI_EXTERN -+ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, -+ size_t *offsets); -+ -+/* Useful for eliminating compiler warnings. */ -+#define FFI_FN(f) ((void (*)(void))f) -+ -+/* ---- Definitions shared with assembly code ---------------------------- */ -+ -+#endif /* !LIBFFI_ASM */ -+ -+/* If these change, update src/mips/ffitarget.h. */ -+#define FFI_TYPE_VOID 0 -+#define FFI_TYPE_INT 1 -+#define FFI_TYPE_FLOAT 2 -+#define FFI_TYPE_DOUBLE 3 -+#if 1 -+#define FFI_TYPE_LONGDOUBLE 4 -+#else -+#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE -+#endif -+#define FFI_TYPE_UINT8 5 -+#define FFI_TYPE_SINT8 6 -+#define FFI_TYPE_UINT16 7 -+#define FFI_TYPE_SINT16 8 -+#define FFI_TYPE_UINT32 9 -+#define FFI_TYPE_SINT32 10 -+#define FFI_TYPE_UINT64 11 -+#define FFI_TYPE_SINT64 12 -+#define FFI_TYPE_STRUCT 13 -+#define FFI_TYPE_POINTER 14 -+#define FFI_TYPE_COMPLEX 15 -+ -+/* This should always refer to the last type code (for sanity checks). */ -+#define FFI_TYPE_LAST FFI_TYPE_COMPLEX -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif -diff --git a/include/ffi-arm.h b/include/ffi-arm.h -new file mode 100644 -index 0000000..e78adf2 ---- /dev/null -+++ b/include/ffi-arm.h -@@ -0,0 +1,500 @@ -+/* -----------------------------------------------------------------*-C-*- -+ libffi 3.2.9999 - Copyright (c) 2011, 2014 Anthony Green -+ - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. -+ -+ Permission is hereby granted, free of charge, to any person -+ obtaining a copy of this software and associated documentation -+ files (the ``Software''), to deal in the Software without -+ restriction, including without limitation the rights to use, copy, -+ modify, merge, publish, distribute, sublicense, and/or sell copies -+ of the Software, and to permit persons to whom the Software is -+ furnished to do so, subject to the following conditions: -+ -+ The above copyright notice and this permission notice shall be -+ included in all copies or substantial portions of the Software. -+ -+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, -+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ DEALINGS IN THE SOFTWARE. -+ -+ ----------------------------------------------------------------------- */ -+ -+/* ------------------------------------------------------------------- -+ Most of the API is documented in doc/libffi.texi. -+ -+ The raw API is designed to bypass some of the argument packing and -+ unpacking on architectures for which it can be avoided. Routines -+ are provided to emulate the raw API if the underlying platform -+ doesn't allow faster implementation. -+ -+ More details on the raw API can be found in: -+ -+ http://gcc.gnu.org/ml/java/1999-q3/msg00138.html -+ -+ and -+ -+ http://gcc.gnu.org/ml/java/1999-q3/msg00174.html -+ -------------------------------------------------------------------- */ -+ -+#ifndef LIBFFI_H -+#define LIBFFI_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+/* Specify which architecture libffi is configured for. */ -+#ifndef ARM -+#define ARM -+#endif -+ -+/* ---- System configuration information --------------------------------- */ -+ -+#include -+ -+/* Need minimal decorations for DLLs to works on Windows. GCC has -+ autoimport and autoexport. Rely on Libtool to help MSVC export -+ from a DLL, but always declare data to be imported for MSVC -+ clients. This costs an extra indirection for MSVC clients using -+ the static version of the library, but don't worry about that. -+ Besides, as a workaround, they can define FFI_BUILDING if they -+ *know* they are going to link with the static library. */ -+#if defined _MSC_VER && !defined FFI_STATIC_BUILD -+#ifdef FFI_BUILDING -+#define FFI_EXTERN __declspec(dllexport) -+#else -+#define FFI_EXTERN __declspec(dllimport) -+#endif -+#else -+#define FFI_EXTERN extern -+#endif -+ -+#ifndef LIBFFI_ASM -+ -+#if defined(_MSC_VER) && !defined(__clang__) -+#define __attribute__(X) -+#endif -+ -+#include -+#include -+ -+/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). -+ But we can find it either under the correct ANSI name, or under GNU -+ C's internal name. */ -+ -+#define FFI_64_BIT_MAX 9223372036854775807 -+ -+#ifdef LONG_LONG_MAX -+# define FFI_LONG_LONG_MAX LONG_LONG_MAX -+#else -+# ifdef LLONG_MAX -+# define FFI_LONG_LONG_MAX LLONG_MAX -+# ifdef _AIX52 /* or newer has C99 LLONG_MAX */ -+# undef FFI_64_BIT_MAX -+# define FFI_64_BIT_MAX 9223372036854775807LL -+# endif /* _AIX52 or newer */ -+# else -+# ifdef __GNUC__ -+# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ -+# endif -+# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ -+# ifndef __PPC64__ -+# if defined (__IBMC__) || defined (__IBMCPP__) -+# define FFI_LONG_LONG_MAX LONGLONG_MAX -+# endif -+# endif /* __PPC64__ */ -+# undef FFI_64_BIT_MAX -+# define FFI_64_BIT_MAX 9223372036854775807LL -+# endif -+# endif -+#endif -+ -+/* The closure code assumes that this works on pointers, i.e. a size_t -+ can hold a pointer. */ -+ -+typedef struct _ffi_type -+{ -+ size_t size; -+ unsigned short alignment; -+ unsigned short type; -+ struct _ffi_type **elements; -+} ffi_type; -+ -+#ifndef LIBFFI_HIDE_BASIC_TYPES -+#if SCHAR_MAX == 127 -+# define ffi_type_uchar ffi_type_uint8 -+# define ffi_type_schar ffi_type_sint8 -+#else -+ #error "char size not supported" -+#endif -+ -+#if SHRT_MAX == 32767 -+# define ffi_type_ushort ffi_type_uint16 -+# define ffi_type_sshort ffi_type_sint16 -+#elif SHRT_MAX == 2147483647 -+# define ffi_type_ushort ffi_type_uint32 -+# define ffi_type_sshort ffi_type_sint32 -+#else -+ #error "short size not supported" -+#endif -+ -+#if INT_MAX == 32767 -+# define ffi_type_uint ffi_type_uint16 -+# define ffi_type_sint ffi_type_sint16 -+#elif INT_MAX == 2147483647 -+# define ffi_type_uint ffi_type_uint32 -+# define ffi_type_sint ffi_type_sint32 -+#elif INT_MAX == 9223372036854775807 -+# define ffi_type_uint ffi_type_uint64 -+# define ffi_type_sint ffi_type_sint64 -+#else -+ #error "int size not supported" -+#endif -+ -+#if LONG_MAX == 2147483647 -+# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX -+ #error "no 64-bit data type supported" -+# endif -+#elif LONG_MAX != FFI_64_BIT_MAX -+ #error "long size not supported" -+#endif -+ -+#if LONG_MAX == 2147483647 -+# define ffi_type_ulong ffi_type_uint32 -+# define ffi_type_slong ffi_type_sint32 -+#elif LONG_MAX == FFI_64_BIT_MAX -+# define ffi_type_ulong ffi_type_uint64 -+# define ffi_type_slong ffi_type_sint64 -+#else -+ #error "long size not supported" -+#endif -+ -+/* These are defined in types.c. */ -+FFI_EXTERN ffi_type ffi_type_void; -+FFI_EXTERN ffi_type ffi_type_uint8; -+FFI_EXTERN ffi_type ffi_type_sint8; -+FFI_EXTERN ffi_type ffi_type_uint16; -+FFI_EXTERN ffi_type ffi_type_sint16; -+FFI_EXTERN ffi_type ffi_type_uint32; -+FFI_EXTERN ffi_type ffi_type_sint32; -+FFI_EXTERN ffi_type ffi_type_uint64; -+FFI_EXTERN ffi_type ffi_type_sint64; -+FFI_EXTERN ffi_type ffi_type_float; -+FFI_EXTERN ffi_type ffi_type_double; -+FFI_EXTERN ffi_type ffi_type_pointer; -+ -+#if 0 -+FFI_EXTERN ffi_type ffi_type_longdouble; -+#else -+#define ffi_type_longdouble ffi_type_double -+#endif -+ -+#ifdef FFI_TARGET_HAS_COMPLEX_TYPE -+FFI_EXTERN ffi_type ffi_type_complex_float; -+FFI_EXTERN ffi_type ffi_type_complex_double; -+#if 0 -+FFI_EXTERN ffi_type ffi_type_complex_longdouble; -+#else -+#define ffi_type_complex_longdouble ffi_type_complex_double -+#endif -+#endif -+#endif /* LIBFFI_HIDE_BASIC_TYPES */ -+ -+typedef enum { -+ FFI_OK = 0, -+ FFI_BAD_TYPEDEF, -+ FFI_BAD_ABI -+} ffi_status; -+ -+typedef struct { -+ ffi_abi abi; -+ unsigned nargs; -+ ffi_type **arg_types; -+ ffi_type *rtype; -+ unsigned bytes; -+ unsigned flags; -+ unsigned isVariadic; -+#ifdef FFI_EXTRA_CIF_FIELDS -+ FFI_EXTRA_CIF_FIELDS; -+#endif -+} ffi_cif; -+ -+/* ---- Definitions for the raw API -------------------------------------- */ -+ -+#ifndef FFI_SIZEOF_ARG -+# if LONG_MAX == 2147483647 -+# define FFI_SIZEOF_ARG 4 -+# elif LONG_MAX == FFI_64_BIT_MAX -+# define FFI_SIZEOF_ARG 8 -+# endif -+#endif -+ -+#ifndef FFI_SIZEOF_JAVA_RAW -+# define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG -+#endif -+ -+typedef union { -+ ffi_sarg sint; -+ ffi_arg uint; -+ float flt; -+ char data[FFI_SIZEOF_ARG]; -+ void* ptr; -+} ffi_raw; -+ -+#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 -+/* This is a special case for mips64/n32 ABI (and perhaps others) where -+ sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ -+typedef union { -+ signed int sint; -+ unsigned int uint; -+ float flt; -+ char data[FFI_SIZEOF_JAVA_RAW]; -+ void* ptr; -+} ffi_java_raw; -+#else -+typedef ffi_raw ffi_java_raw; -+#endif -+ -+FFI_EXTERN -+void ffi_raw_call (ffi_cif *cif, -+ void (*fn)(void), -+ void *rvalue, -+ ffi_raw *avalue); -+ -+FFI_EXTERN void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -+FFI_EXTERN void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -+FFI_EXTERN size_t ffi_raw_size (ffi_cif *cif); -+ -+/* This is analogous to the raw API, except it uses Java parameter -+ packing, even on 64-bit machines. I.e. on 64-bit machines longs -+ and doubles are followed by an empty 64-bit word. */ -+FFI_EXTERN -+void ffi_java_raw_call (ffi_cif *cif, -+ void (*fn)(void), -+ void *rvalue, -+ ffi_java_raw *avalue); -+ -+FFI_EXTERN void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); -+FFI_EXTERN void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); -+FFI_EXTERN size_t ffi_java_raw_size (ffi_cif *cif); -+ -+/* ---- Definitions for closures ----------------------------------------- */ -+ -+#if FFI_CLOSURES -+ -+#ifdef _MSC_VER -+__declspec(align(8)) -+#endif -+typedef struct { -+#if 0 -+ void *trampoline_table; -+ void *trampoline_table_entry; -+#else -+ char tramp[FFI_TRAMPOLINE_SIZE]; -+#endif -+ ffi_cif *cif; -+ void (*fun)(ffi_cif*,void*,void**,void*); -+ void *user_data; -+} ffi_closure -+#ifdef __GNUC__ -+ __attribute__((aligned (8))) -+#endif -+ ; -+ -+#ifndef __GNUC__ -+# ifdef __sgi -+# pragma pack 0 -+# endif -+#endif -+ -+FFI_EXTERN void *ffi_closure_alloc (size_t size, void **code); -+FFI_EXTERN void ffi_closure_free (void *); -+ -+FFI_EXTERN ffi_status -+ffi_prep_closure (ffi_closure*, -+ ffi_cif *, -+ void (*fun)(ffi_cif*,void*,void**,void*), -+ void *user_data) -+#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 405) -+ __attribute__((deprecated ("use ffi_prep_closure_loc instead"))) -+#elif defined(__GNUC__) && __GNUC__ >= 3 -+ __attribute__((deprecated)) -+#endif -+ ; -+ -+FFI_EXTERN ffi_status -+ffi_prep_closure_loc (ffi_closure*, -+ ffi_cif *, -+ void (*fun)(ffi_cif*,void*,void**,void*), -+ void *user_data, -+ void*codeloc); -+ -+#ifdef __sgi -+# pragma pack 8 -+#endif -+typedef struct { -+#if 0 -+ void *trampoline_table; -+ void *trampoline_table_entry; -+#else -+ char tramp[FFI_TRAMPOLINE_SIZE]; -+#endif -+ ffi_cif *cif; -+ -+#if !FFI_NATIVE_RAW_API -+ -+ /* If this is enabled, then a raw closure has the same layout -+ as a regular closure. We use this to install an intermediate -+ handler to do the transaltion, void** -> ffi_raw*. */ -+ -+ void (*translate_args)(ffi_cif*,void*,void**,void*); -+ void *this_closure; -+ -+#endif -+ -+ void (*fun)(ffi_cif*,void*,ffi_raw*,void*); -+ void *user_data; -+ -+} ffi_raw_closure; -+ -+typedef struct { -+#if 0 -+ void *trampoline_table; -+ void *trampoline_table_entry; -+#else -+ char tramp[FFI_TRAMPOLINE_SIZE]; -+#endif -+ -+ ffi_cif *cif; -+ -+#if !FFI_NATIVE_RAW_API -+ -+ /* If this is enabled, then a raw closure has the same layout -+ as a regular closure. We use this to install an intermediate -+ handler to do the translation, void** -> ffi_raw*. */ -+ -+ void (*translate_args)(ffi_cif*,void*,void**,void*); -+ void *this_closure; -+ -+#endif -+ -+ void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); -+ void *user_data; -+ -+} ffi_java_raw_closure; -+ -+FFI_EXTERN ffi_status -+ffi_prep_raw_closure (ffi_raw_closure*, -+ ffi_cif *cif, -+ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), -+ void *user_data); -+ -+FFI_EXTERN ffi_status -+ffi_prep_raw_closure_loc (ffi_raw_closure*, -+ ffi_cif *cif, -+ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), -+ void *user_data, -+ void *codeloc); -+ -+FFI_EXTERN ffi_status -+ffi_prep_java_raw_closure (ffi_java_raw_closure*, -+ ffi_cif *cif, -+ void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), -+ void *user_data); -+ -+FFI_EXTERN ffi_status -+ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, -+ ffi_cif *cif, -+ void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), -+ void *user_data, -+ void *codeloc); -+ -+#endif /* FFI_CLOSURES */ -+ -+#if FFI_GO_CLOSURES -+ -+typedef struct { -+ void *tramp; -+ ffi_cif *cif; -+ void (*fun)(ffi_cif*,void*,void**,void*); -+} ffi_go_closure; -+ -+FFI_EXTERN -+ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, -+ void (*fun)(ffi_cif*,void*,void**,void*)); -+ -+FFI_EXTERN -+void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, -+ void **avalue, void *closure); -+ -+#endif /* FFI_GO_CLOSURES */ -+ -+/* ---- Public interface definition -------------------------------------- */ -+ -+FFI_EXTERN -+ffi_status ffi_prep_cif(ffi_cif *cif, -+ ffi_abi abi, -+ unsigned int nargs, -+ ffi_type *rtype, -+ ffi_type **atypes); -+ -+FFI_EXTERN -+ffi_status ffi_prep_cif_var(ffi_cif *cif, -+ ffi_abi abi, -+ unsigned int nfixedargs, -+ unsigned int ntotalargs, -+ ffi_type *rtype, -+ ffi_type **atypes); -+ -+FFI_EXTERN -+void ffi_call(ffi_cif *cif, -+ void (*fn)(void), -+ void *rvalue, -+ void **avalue); -+ -+FFI_EXTERN -+ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, -+ size_t *offsets); -+ -+/* Useful for eliminating compiler warnings. */ -+#define FFI_FN(f) ((void (*)(void))f) -+ -+/* ---- Definitions shared with assembly code ---------------------------- */ -+ -+#endif /* !LIBFFI_ASM */ -+ -+/* If these change, update src/mips/ffitarget.h. */ -+#define FFI_TYPE_VOID 0 -+#define FFI_TYPE_INT 1 -+#define FFI_TYPE_FLOAT 2 -+#define FFI_TYPE_DOUBLE 3 -+#if 0 -+#define FFI_TYPE_LONGDOUBLE 4 -+#else -+#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE -+#endif -+#define FFI_TYPE_UINT8 5 -+#define FFI_TYPE_SINT8 6 -+#define FFI_TYPE_UINT16 7 -+#define FFI_TYPE_SINT16 8 -+#define FFI_TYPE_UINT32 9 -+#define FFI_TYPE_SINT32 10 -+#define FFI_TYPE_UINT64 11 -+#define FFI_TYPE_SINT64 12 -+#define FFI_TYPE_STRUCT 13 -+#define FFI_TYPE_POINTER 14 -+#define FFI_TYPE_COMPLEX 15 -+ -+/* This should always refer to the last type code (for sanity checks). */ -+#define FFI_TYPE_LAST FFI_TYPE_COMPLEX -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif -diff --git a/include/ffi-x86_64.h b/include/ffi-x86_64.h -new file mode 100644 -index 0000000..68e355d ---- /dev/null -+++ b/include/ffi-x86_64.h -@@ -0,0 +1,500 @@ -+/* -----------------------------------------------------------------*-C-*- -+ libffi 3.2.9999 - Copyright (c) 2011, 2014 Anthony Green -+ - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc. -+ -+ Permission is hereby granted, free of charge, to any person -+ obtaining a copy of this software and associated documentation -+ files (the ``Software''), to deal in the Software without -+ restriction, including without limitation the rights to use, copy, -+ modify, merge, publish, distribute, sublicense, and/or sell copies -+ of the Software, and to permit persons to whom the Software is -+ furnished to do so, subject to the following conditions: -+ -+ The above copyright notice and this permission notice shall be -+ included in all copies or substantial portions of the Software. -+ -+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, -+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ DEALINGS IN THE SOFTWARE. -+ -+ ----------------------------------------------------------------------- */ -+ -+/* ------------------------------------------------------------------- -+ Most of the API is documented in doc/libffi.texi. -+ -+ The raw API is designed to bypass some of the argument packing and -+ unpacking on architectures for which it can be avoided. Routines -+ are provided to emulate the raw API if the underlying platform -+ doesn't allow faster implementation. -+ -+ More details on the raw API can be found in: -+ -+ http://gcc.gnu.org/ml/java/1999-q3/msg00138.html -+ -+ and -+ -+ http://gcc.gnu.org/ml/java/1999-q3/msg00174.html -+ -------------------------------------------------------------------- */ -+ -+#ifndef LIBFFI_H -+#define LIBFFI_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+/* Specify which architecture libffi is configured for. */ -+#ifndef X86_64 -+#define X86_64 -+#endif -+ -+/* ---- System configuration information --------------------------------- */ -+ -+#include -+ -+/* Need minimal decorations for DLLs to works on Windows. GCC has -+ autoimport and autoexport. Rely on Libtool to help MSVC export -+ from a DLL, but always declare data to be imported for MSVC -+ clients. This costs an extra indirection for MSVC clients using -+ the static version of the library, but don't worry about that. -+ Besides, as a workaround, they can define FFI_BUILDING if they -+ *know* they are going to link with the static library. */ -+#if defined _MSC_VER && !defined FFI_STATIC_BUILD -+#ifdef FFI_BUILDING -+#define FFI_EXTERN __declspec(dllexport) -+#else -+#define FFI_EXTERN __declspec(dllimport) -+#endif -+#else -+#define FFI_EXTERN extern -+#endif -+ -+#ifndef LIBFFI_ASM -+ -+#if defined(_MSC_VER) && !defined(__clang__) -+#define __attribute__(X) -+#endif -+ -+#include -+#include -+ -+/* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example). -+ But we can find it either under the correct ANSI name, or under GNU -+ C's internal name. */ -+ -+#define FFI_64_BIT_MAX 9223372036854775807 -+ -+#ifdef LONG_LONG_MAX -+# define FFI_LONG_LONG_MAX LONG_LONG_MAX -+#else -+# ifdef LLONG_MAX -+# define FFI_LONG_LONG_MAX LLONG_MAX -+# ifdef _AIX52 /* or newer has C99 LLONG_MAX */ -+# undef FFI_64_BIT_MAX -+# define FFI_64_BIT_MAX 9223372036854775807LL -+# endif /* _AIX52 or newer */ -+# else -+# ifdef __GNUC__ -+# define FFI_LONG_LONG_MAX __LONG_LONG_MAX__ -+# endif -+# ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */ -+# ifndef __PPC64__ -+# if defined (__IBMC__) || defined (__IBMCPP__) -+# define FFI_LONG_LONG_MAX LONGLONG_MAX -+# endif -+# endif /* __PPC64__ */ -+# undef FFI_64_BIT_MAX -+# define FFI_64_BIT_MAX 9223372036854775807LL -+# endif -+# endif -+#endif -+ -+/* The closure code assumes that this works on pointers, i.e. a size_t -+ can hold a pointer. */ -+ -+typedef struct _ffi_type -+{ -+ size_t size; -+ unsigned short alignment; -+ unsigned short type; -+ struct _ffi_type **elements; -+} ffi_type; -+ -+#ifndef LIBFFI_HIDE_BASIC_TYPES -+#if SCHAR_MAX == 127 -+# define ffi_type_uchar ffi_type_uint8 -+# define ffi_type_schar ffi_type_sint8 -+#else -+ #error "char size not supported" -+#endif -+ -+#if SHRT_MAX == 32767 -+# define ffi_type_ushort ffi_type_uint16 -+# define ffi_type_sshort ffi_type_sint16 -+#elif SHRT_MAX == 2147483647 -+# define ffi_type_ushort ffi_type_uint32 -+# define ffi_type_sshort ffi_type_sint32 -+#else -+ #error "short size not supported" -+#endif -+ -+#if INT_MAX == 32767 -+# define ffi_type_uint ffi_type_uint16 -+# define ffi_type_sint ffi_type_sint16 -+#elif INT_MAX == 2147483647 -+# define ffi_type_uint ffi_type_uint32 -+# define ffi_type_sint ffi_type_sint32 -+#elif INT_MAX == 9223372036854775807 -+# define ffi_type_uint ffi_type_uint64 -+# define ffi_type_sint ffi_type_sint64 -+#else -+ #error "int size not supported" -+#endif -+ -+#if LONG_MAX == 2147483647 -+# if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX -+ #error "no 64-bit data type supported" -+# endif -+#elif LONG_MAX != FFI_64_BIT_MAX -+ #error "long size not supported" -+#endif -+ -+#if LONG_MAX == 2147483647 -+# define ffi_type_ulong ffi_type_uint32 -+# define ffi_type_slong ffi_type_sint32 -+#elif LONG_MAX == FFI_64_BIT_MAX -+# define ffi_type_ulong ffi_type_uint64 -+# define ffi_type_slong ffi_type_sint64 -+#else -+ #error "long size not supported" -+#endif -+ -+/* These are defined in types.c. */ -+FFI_EXTERN ffi_type ffi_type_void; -+FFI_EXTERN ffi_type ffi_type_uint8; -+FFI_EXTERN ffi_type ffi_type_sint8; -+FFI_EXTERN ffi_type ffi_type_uint16; -+FFI_EXTERN ffi_type ffi_type_sint16; -+FFI_EXTERN ffi_type ffi_type_uint32; -+FFI_EXTERN ffi_type ffi_type_sint32; -+FFI_EXTERN ffi_type ffi_type_uint64; -+FFI_EXTERN ffi_type ffi_type_sint64; -+FFI_EXTERN ffi_type ffi_type_float; -+FFI_EXTERN ffi_type ffi_type_double; -+FFI_EXTERN ffi_type ffi_type_pointer; -+ -+#if 1 -+FFI_EXTERN ffi_type ffi_type_longdouble; -+#else -+#define ffi_type_longdouble ffi_type_double -+#endif -+ -+#ifdef FFI_TARGET_HAS_COMPLEX_TYPE -+FFI_EXTERN ffi_type ffi_type_complex_float; -+FFI_EXTERN ffi_type ffi_type_complex_double; -+#if 1 -+FFI_EXTERN ffi_type ffi_type_complex_longdouble; -+#else -+#define ffi_type_complex_longdouble ffi_type_complex_double -+#endif -+#endif -+#endif /* LIBFFI_HIDE_BASIC_TYPES */ -+ -+typedef enum { -+ FFI_OK = 0, -+ FFI_BAD_TYPEDEF, -+ FFI_BAD_ABI -+} ffi_status; -+ -+typedef struct { -+ ffi_abi abi; -+ unsigned nargs; -+ ffi_type **arg_types; -+ ffi_type *rtype; -+ unsigned bytes; -+ unsigned flags; -+ unsigned isVariadic; -+#ifdef FFI_EXTRA_CIF_FIELDS -+ FFI_EXTRA_CIF_FIELDS; -+#endif -+} ffi_cif; -+ -+/* ---- Definitions for the raw API -------------------------------------- */ -+ -+#ifndef FFI_SIZEOF_ARG -+# if LONG_MAX == 2147483647 -+# define FFI_SIZEOF_ARG 4 -+# elif LONG_MAX == FFI_64_BIT_MAX -+# define FFI_SIZEOF_ARG 8 -+# endif -+#endif -+ -+#ifndef FFI_SIZEOF_JAVA_RAW -+# define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG -+#endif -+ -+typedef union { -+ ffi_sarg sint; -+ ffi_arg uint; -+ float flt; -+ char data[FFI_SIZEOF_ARG]; -+ void* ptr; -+} ffi_raw; -+ -+#if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8 -+/* This is a special case for mips64/n32 ABI (and perhaps others) where -+ sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */ -+typedef union { -+ signed int sint; -+ unsigned int uint; -+ float flt; -+ char data[FFI_SIZEOF_JAVA_RAW]; -+ void* ptr; -+} ffi_java_raw; -+#else -+typedef ffi_raw ffi_java_raw; -+#endif -+ -+FFI_EXTERN -+void ffi_raw_call (ffi_cif *cif, -+ void (*fn)(void), -+ void *rvalue, -+ ffi_raw *avalue); -+ -+FFI_EXTERN void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -+FFI_EXTERN void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -+FFI_EXTERN size_t ffi_raw_size (ffi_cif *cif); -+ -+/* This is analogous to the raw API, except it uses Java parameter -+ packing, even on 64-bit machines. I.e. on 64-bit machines longs -+ and doubles are followed by an empty 64-bit word. */ -+FFI_EXTERN -+void ffi_java_raw_call (ffi_cif *cif, -+ void (*fn)(void), -+ void *rvalue, -+ ffi_java_raw *avalue); -+ -+FFI_EXTERN void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); -+FFI_EXTERN void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); -+FFI_EXTERN size_t ffi_java_raw_size (ffi_cif *cif); -+ -+/* ---- Definitions for closures ----------------------------------------- */ -+ -+#if FFI_CLOSURES -+ -+#ifdef _MSC_VER -+__declspec(align(8)) -+#endif -+typedef struct { -+#if 0 -+ void *trampoline_table; -+ void *trampoline_table_entry; -+#else -+ char tramp[FFI_TRAMPOLINE_SIZE]; -+#endif -+ ffi_cif *cif; -+ void (*fun)(ffi_cif*,void*,void**,void*); -+ void *user_data; -+} ffi_closure -+#ifdef __GNUC__ -+ __attribute__((aligned (8))) -+#endif -+ ; -+ -+#ifndef __GNUC__ -+# ifdef __sgi -+# pragma pack 0 -+# endif -+#endif -+ -+FFI_EXTERN void *ffi_closure_alloc (size_t size, void **code); -+FFI_EXTERN void ffi_closure_free (void *); -+ -+FFI_EXTERN ffi_status -+ffi_prep_closure (ffi_closure*, -+ ffi_cif *, -+ void (*fun)(ffi_cif*,void*,void**,void*), -+ void *user_data) -+#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 405) -+ __attribute__((deprecated ("use ffi_prep_closure_loc instead"))) -+#elif defined(__GNUC__) && __GNUC__ >= 3 -+ __attribute__((deprecated)) -+#endif -+ ; -+ -+FFI_EXTERN ffi_status -+ffi_prep_closure_loc (ffi_closure*, -+ ffi_cif *, -+ void (*fun)(ffi_cif*,void*,void**,void*), -+ void *user_data, -+ void*codeloc); -+ -+#ifdef __sgi -+# pragma pack 8 -+#endif -+typedef struct { -+#if 0 -+ void *trampoline_table; -+ void *trampoline_table_entry; -+#else -+ char tramp[FFI_TRAMPOLINE_SIZE]; -+#endif -+ ffi_cif *cif; -+ -+#if !FFI_NATIVE_RAW_API -+ -+ /* If this is enabled, then a raw closure has the same layout -+ as a regular closure. We use this to install an intermediate -+ handler to do the transaltion, void** -> ffi_raw*. */ -+ -+ void (*translate_args)(ffi_cif*,void*,void**,void*); -+ void *this_closure; -+ -+#endif -+ -+ void (*fun)(ffi_cif*,void*,ffi_raw*,void*); -+ void *user_data; -+ -+} ffi_raw_closure; -+ -+typedef struct { -+#if 0 -+ void *trampoline_table; -+ void *trampoline_table_entry; -+#else -+ char tramp[FFI_TRAMPOLINE_SIZE]; -+#endif -+ -+ ffi_cif *cif; -+ -+#if !FFI_NATIVE_RAW_API -+ -+ /* If this is enabled, then a raw closure has the same layout -+ as a regular closure. We use this to install an intermediate -+ handler to do the translation, void** -> ffi_raw*. */ -+ -+ void (*translate_args)(ffi_cif*,void*,void**,void*); -+ void *this_closure; -+ -+#endif -+ -+ void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*); -+ void *user_data; -+ -+} ffi_java_raw_closure; -+ -+FFI_EXTERN ffi_status -+ffi_prep_raw_closure (ffi_raw_closure*, -+ ffi_cif *cif, -+ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), -+ void *user_data); -+ -+FFI_EXTERN ffi_status -+ffi_prep_raw_closure_loc (ffi_raw_closure*, -+ ffi_cif *cif, -+ void (*fun)(ffi_cif*,void*,ffi_raw*,void*), -+ void *user_data, -+ void *codeloc); -+ -+FFI_EXTERN ffi_status -+ffi_prep_java_raw_closure (ffi_java_raw_closure*, -+ ffi_cif *cif, -+ void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), -+ void *user_data); -+ -+FFI_EXTERN ffi_status -+ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*, -+ ffi_cif *cif, -+ void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*), -+ void *user_data, -+ void *codeloc); -+ -+#endif /* FFI_CLOSURES */ -+ -+#if FFI_GO_CLOSURES -+ -+typedef struct { -+ void *tramp; -+ ffi_cif *cif; -+ void (*fun)(ffi_cif*,void*,void**,void*); -+} ffi_go_closure; -+ -+FFI_EXTERN -+ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, -+ void (*fun)(ffi_cif*,void*,void**,void*)); -+ -+FFI_EXTERN -+void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, -+ void **avalue, void *closure); -+ -+#endif /* FFI_GO_CLOSURES */ -+ -+/* ---- Public interface definition -------------------------------------- */ -+ -+FFI_EXTERN -+ffi_status ffi_prep_cif(ffi_cif *cif, -+ ffi_abi abi, -+ unsigned int nargs, -+ ffi_type *rtype, -+ ffi_type **atypes); -+ -+FFI_EXTERN -+ffi_status ffi_prep_cif_var(ffi_cif *cif, -+ ffi_abi abi, -+ unsigned int nfixedargs, -+ unsigned int ntotalargs, -+ ffi_type *rtype, -+ ffi_type **atypes); -+ -+FFI_EXTERN -+void ffi_call(ffi_cif *cif, -+ void (*fn)(void), -+ void *rvalue, -+ void **avalue); -+ -+FFI_EXTERN -+ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, -+ size_t *offsets); -+ -+/* Useful for eliminating compiler warnings. */ -+#define FFI_FN(f) ((void (*)(void))f) -+ -+/* ---- Definitions shared with assembly code ---------------------------- */ -+ -+#endif /* !LIBFFI_ASM */ -+ -+/* If these change, update src/mips/ffitarget.h. */ -+#define FFI_TYPE_VOID 0 -+#define FFI_TYPE_INT 1 -+#define FFI_TYPE_FLOAT 2 -+#define FFI_TYPE_DOUBLE 3 -+#if 1 -+#define FFI_TYPE_LONGDOUBLE 4 -+#else -+#define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE -+#endif -+#define FFI_TYPE_UINT8 5 -+#define FFI_TYPE_SINT8 6 -+#define FFI_TYPE_UINT16 7 -+#define FFI_TYPE_SINT16 8 -+#define FFI_TYPE_UINT32 9 -+#define FFI_TYPE_SINT32 10 -+#define FFI_TYPE_UINT64 11 -+#define FFI_TYPE_SINT64 12 -+#define FFI_TYPE_STRUCT 13 -+#define FFI_TYPE_POINTER 14 -+#define FFI_TYPE_COMPLEX 15 -+ -+/* This should always refer to the last type code (for sanity checks). */ -+#define FFI_TYPE_LAST FFI_TYPE_COMPLEX -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif diff --git a/include/ffi.h b/include/ffi.h -new file mode 100644 -index 0000000..73b72fa +new file mode 100755 +index 0000000..48b7f3a --- /dev/null +++ b/include/ffi.h -@@ -0,0 +1,528 @@ +@@ -0,0 +1,538 @@ +/* -----------------------------------------------------------------*-C-*- + libffi 3.4.2 + - Copyright (c) 2011, 2014, 2019, 2021 Anthony Green @@ -1810,9 +292,19 @@ index 0000000..73b72fa +#endif + +/* Specify which architecture libffi is configured for. */ ++#ifdef __x86_64__ ++#ifndef X86_64 ++#define X86_64 ++#endif ++#elif defined(__i386__) || defined(_M_IX86) || defined(_M_X64) ++#ifndef X86_64 ++#define X86_64 ++#endif ++#else +#ifndef AARCH64 +#define AARCH64 +#endif ++#endif + +/* ---- System configuration information --------------------------------- */ + @@ -2286,433 +778,3 @@ index 0000000..73b72fa +#endif + +#endif -diff --git a/include/ffitarget-aarch64.h b/include/ffitarget-aarch64.h -new file mode 100644 -index 0000000..32c4f08 ---- /dev/null -+++ b/include/ffitarget-aarch64.h -@@ -0,0 +1,88 @@ -+/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. -+ -+Permission is hereby granted, free of charge, to any person obtaining -+a copy of this software and associated documentation files (the -+``Software''), to deal in the Software without restriction, including -+without limitation the rights to use, copy, modify, merge, publish, -+distribute, sublicense, and/or sell copies of the Software, and to -+permit persons to whom the Software is furnished to do so, subject to -+the following conditions: -+ -+The above copyright notice and this permission notice shall be -+included in all copies or substantial portions of the Software. -+ -+THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, -+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -+ -+#ifndef LIBFFI_TARGET_H -+#define LIBFFI_TARGET_H -+ -+#ifndef LIBFFI_H -+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -+#endif -+ -+#ifndef LIBFFI_ASM -+#ifdef __ILP32__ -+#define FFI_SIZEOF_ARG 8 -+#define FFI_SIZEOF_JAVA_RAW 4 -+typedef unsigned long long ffi_arg; -+typedef signed long long ffi_sarg; -+#elif defined(_M_ARM64) -+#define FFI_SIZEOF_ARG 8 -+typedef unsigned long long ffi_arg; -+typedef signed long long ffi_sarg; -+#else -+typedef unsigned long ffi_arg; -+typedef signed long ffi_sarg; -+#endif -+ -+typedef enum ffi_abi -+ { -+ FFI_FIRST_ABI = 0, -+ FFI_SYSV, -+ FFI_LAST_ABI, -+ FFI_DEFAULT_ABI = FFI_SYSV -+ } ffi_abi; -+#endif -+ -+/* ---- Definitions for closures ----------------------------------------- */ -+ -+#define FFI_CLOSURES 1 -+#define FFI_NATIVE_RAW_API 0 -+ -+#if defined (FFI_EXEC_TRAMPOLINE_TABLE) && FFI_EXEC_TRAMPOLINE_TABLE -+ -+#ifdef __MACH__ -+#define FFI_TRAMPOLINE_SIZE 16 -+#define FFI_TRAMPOLINE_CLOSURE_OFFSET 16 -+#else -+#error "No trampoline table implementation" -+#endif -+ -+#else -+#define FFI_TRAMPOLINE_SIZE 24 -+#define FFI_TRAMPOLINE_CLOSURE_OFFSET FFI_TRAMPOLINE_SIZE -+#endif -+ -+/* ---- Internal ---- */ -+ -+#if defined (__APPLE__) -+#define FFI_TARGET_SPECIFIC_VARIADIC -+#define FFI_EXTRA_CIF_FIELDS unsigned aarch64_nfixedargs -+#elif !defined(_M_ARM64) -+/* iOS and Windows reserve x18 for the system. Disable Go closures until -+ a new static chain is chosen. */ -+#define FFI_GO_CLOSURES 1 -+#endif -+ -+#ifndef _M_ARM64 -+/* No complex type on Windows */ -+#define FFI_TARGET_HAS_COMPLEX_TYPE -+#endif -+ -+#endif -diff --git a/include/ffitarget-arm.h b/include/ffitarget-arm.h -new file mode 100644 -index 0000000..1cf1036 ---- /dev/null -+++ b/include/ffitarget-arm.h -@@ -0,0 +1,82 @@ -+/* -----------------------------------------------------------------*-C-*- -+ ffitarget.h - Copyright (c) 2012 Anthony Green -+ Copyright (c) 2010 CodeSourcery -+ Copyright (c) 1996-2003 Red Hat, Inc. -+ -+ Target configuration macros for ARM. -+ -+ Permission is hereby granted, free of charge, to any person obtaining -+ a copy of this software and associated documentation files (the -+ ``Software''), to deal in the Software without restriction, including -+ without limitation the rights to use, copy, modify, merge, publish, -+ distribute, sublicense, and/or sell copies of the Software, and to -+ permit persons to whom the Software is furnished to do so, subject to -+ the following conditions: -+ -+ The above copyright notice and this permission notice shall be included -+ in all copies or substantial portions of the Software. -+ -+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, -+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ DEALINGS IN THE SOFTWARE. -+ -+ ----------------------------------------------------------------------- */ -+ -+#ifndef LIBFFI_TARGET_H -+#define LIBFFI_TARGET_H -+ -+#ifndef LIBFFI_H -+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -+#endif -+ -+#ifndef LIBFFI_ASM -+typedef unsigned long ffi_arg; -+typedef signed long ffi_sarg; -+ -+typedef enum ffi_abi { -+ FFI_FIRST_ABI = 0, -+ FFI_SYSV, -+ FFI_VFP, -+ FFI_LAST_ABI, -+#ifdef __ARM_PCS_VFP -+ FFI_DEFAULT_ABI = FFI_VFP, -+#else -+ FFI_DEFAULT_ABI = FFI_SYSV, -+#endif -+} ffi_abi; -+#endif -+ -+#define FFI_EXTRA_CIF_FIELDS \ -+ int vfp_used; \ -+ unsigned short vfp_reg_free, vfp_nargs; \ -+ signed char vfp_args[16] \ -+ -+#define FFI_TARGET_SPECIFIC_VARIADIC -+#define FFI_TARGET_HAS_COMPLEX_TYPE -+ -+/* ---- Definitions for closures ----------------------------------------- */ -+ -+#define FFI_CLOSURES 1 -+#define FFI_GO_CLOSURES 1 -+#define FFI_NATIVE_RAW_API 0 -+ -+#if defined (FFI_EXEC_TRAMPOLINE_TABLE) && FFI_EXEC_TRAMPOLINE_TABLE -+ -+#ifdef __MACH__ -+#define FFI_TRAMPOLINE_SIZE 12 -+#define FFI_TRAMPOLINE_CLOSURE_OFFSET 8 -+#else -+#error "No trampoline table implementation" -+#endif -+ -+#else -+#define FFI_TRAMPOLINE_SIZE 12 -+#define FFI_TRAMPOLINE_CLOSURE_OFFSET FFI_TRAMPOLINE_SIZE -+#endif -+ -+#endif -diff --git a/include/ffitarget-x86_64.h b/include/ffitarget-x86_64.h -new file mode 100644 -index 0000000..85ccedf ---- /dev/null -+++ b/include/ffitarget-x86_64.h -@@ -0,0 +1,147 @@ -+/* -----------------------------------------------------------------*-C-*- -+ ffitarget.h - Copyright (c) 2012, 2014, 2018 Anthony Green -+ Copyright (c) 1996-2003, 2010 Red Hat, Inc. -+ Copyright (C) 2008 Free Software Foundation, Inc. -+ -+ Target configuration macros for x86 and x86-64. -+ -+ Permission is hereby granted, free of charge, to any person obtaining -+ a copy of this software and associated documentation files (the -+ ``Software''), to deal in the Software without restriction, including -+ without limitation the rights to use, copy, modify, merge, publish, -+ distribute, sublicense, and/or sell copies of the Software, and to -+ permit persons to whom the Software is furnished to do so, subject to -+ the following conditions: -+ -+ The above copyright notice and this permission notice shall be included -+ in all copies or substantial portions of the Software. -+ -+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, -+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ DEALINGS IN THE SOFTWARE. -+ -+ ----------------------------------------------------------------------- */ -+ -+#ifndef LIBFFI_TARGET_H -+#define LIBFFI_TARGET_H -+ -+#ifndef LIBFFI_H -+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -+#endif -+ -+/* ---- System specific configurations ----------------------------------- */ -+ -+/* For code common to all platforms on x86 and x86_64. */ -+#define X86_ANY -+ -+#if defined (X86_64) && defined (__i386__) -+#undef X86_64 -+#define X86 -+#endif -+ -+#ifdef X86_WIN64 -+#define FFI_SIZEOF_ARG 8 -+#define USE_BUILTIN_FFS 0 /* not yet implemented in mingw-64 */ -+#endif -+ -+#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION -+#ifndef _MSC_VER -+#define FFI_TARGET_HAS_COMPLEX_TYPE -+#endif -+ -+/* ---- Generic type definitions ----------------------------------------- */ -+ -+#ifndef LIBFFI_ASM -+#ifdef X86_WIN64 -+#ifdef _MSC_VER -+typedef unsigned __int64 ffi_arg; -+typedef __int64 ffi_sarg; -+#else -+typedef unsigned long long ffi_arg; -+typedef long long ffi_sarg; -+#endif -+#else -+#if defined __x86_64__ && defined __ILP32__ -+#define FFI_SIZEOF_ARG 8 -+#define FFI_SIZEOF_JAVA_RAW 4 -+typedef unsigned long long ffi_arg; -+typedef long long ffi_sarg; -+#else -+typedef unsigned long ffi_arg; -+typedef signed long ffi_sarg; -+#endif -+#endif -+ -+typedef enum ffi_abi { -+#if defined(X86_WIN64) -+ FFI_FIRST_ABI = 0, -+ FFI_WIN64, /* sizeof(long double) == 8 - microsoft compilers */ -+ FFI_GNUW64, /* sizeof(long double) == 16 - GNU compilers */ -+ FFI_LAST_ABI, -+#ifdef __GNUC__ -+ FFI_DEFAULT_ABI = FFI_GNUW64 -+#else -+ FFI_DEFAULT_ABI = FFI_WIN64 -+#endif -+ -+#elif defined(X86_64) || (defined (__x86_64__) && defined (X86_DARWIN)) -+ FFI_FIRST_ABI = 1, -+ FFI_UNIX64, -+ FFI_WIN64, -+ FFI_EFI64 = FFI_WIN64, -+ FFI_GNUW64, -+ FFI_LAST_ABI, -+ FFI_DEFAULT_ABI = FFI_UNIX64 -+ -+#elif defined(X86_WIN32) -+ FFI_FIRST_ABI = 0, -+ FFI_SYSV = 1, -+ FFI_STDCALL = 2, -+ FFI_THISCALL = 3, -+ FFI_FASTCALL = 4, -+ FFI_MS_CDECL = 5, -+ FFI_PASCAL = 6, -+ FFI_REGISTER = 7, -+ FFI_LAST_ABI, -+ FFI_DEFAULT_ABI = FFI_MS_CDECL -+#else -+ FFI_FIRST_ABI = 0, -+ FFI_SYSV = 1, -+ FFI_THISCALL = 3, -+ FFI_FASTCALL = 4, -+ FFI_STDCALL = 5, -+ FFI_PASCAL = 6, -+ FFI_REGISTER = 7, -+ FFI_MS_CDECL = 8, -+ FFI_LAST_ABI, -+ FFI_DEFAULT_ABI = FFI_SYSV -+#endif -+} ffi_abi; -+#endif -+ -+/* ---- Definitions for closures ----------------------------------------- */ -+ -+#define FFI_CLOSURES 1 -+#define FFI_GO_CLOSURES 1 -+ -+#define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1) -+#define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2) -+#define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3) -+#define FFI_TYPE_MS_STRUCT (FFI_TYPE_LAST + 4) -+ -+#if defined (X86_64) || defined(X86_WIN64) \ -+ || (defined (__x86_64__) && defined (X86_DARWIN)) -+# define FFI_TRAMPOLINE_SIZE 24 -+# define FFI_NATIVE_RAW_API 0 -+#else -+# define FFI_TRAMPOLINE_SIZE 12 -+# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ -+#endif -+ -+#endif -+ -diff --git a/include/ffitarget.h b/include/ffitarget.h -new file mode 100644 -index 0000000..12d5d20 ---- /dev/null -+++ b/include/ffitarget.h -@@ -0,0 +1,89 @@ -+/* -----------------------------------------------------------------*-C-*- -+ ffitarget.h - Copyright (c) 2012 Anthony Green -+ Copyright (c) 2010 CodeSourcery -+ Copyright (c) 1996-2003 Red Hat, Inc. -+ -+ Target configuration macros for ARM. -+ -+ Permission is hereby granted, free of charge, to any person obtaining -+ a copy of this software and associated documentation files (the -+ ``Software''), to deal in the Software without restriction, including -+ without limitation the rights to use, copy, modify, merge, publish, -+ distribute, sublicense, and/or sell copies of the Software, and to -+ permit persons to whom the Software is furnished to do so, subject to -+ the following conditions: -+ -+ The above copyright notice and this permission notice shall be included -+ in all copies or substantial portions of the Software. -+ -+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, -+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT -+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -+ DEALINGS IN THE SOFTWARE. -+ -+ ----------------------------------------------------------------------- */ -+ -+#ifndef LIBFFI_TARGET_H -+#define LIBFFI_TARGET_H -+ -+#ifndef LIBFFI_H -+#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -+#endif -+ -+#ifndef LIBFFI_ASM -+typedef unsigned long ffi_arg; -+typedef signed long ffi_sarg; -+ -+typedef enum ffi_abi { -+ FFI_FIRST_ABI = 0, -+ FFI_SYSV, -+ FFI_VFP, -+ FFI_LAST_ABI, -+#if defined(__ARM_PCS_VFP) || defined(_WIN32) -+ FFI_DEFAULT_ABI = FFI_VFP, -+#else -+ FFI_DEFAULT_ABI = FFI_SYSV, -+#endif -+} ffi_abi; -+#endif -+ -+#define FFI_EXTRA_CIF_FIELDS \ -+ int vfp_used; \ -+ unsigned short vfp_reg_free, vfp_nargs; \ -+ signed char vfp_args[16] \ -+ -+#define FFI_TARGET_SPECIFIC_VARIADIC -+#ifndef _WIN32 -+#define FFI_TARGET_HAS_COMPLEX_TYPE -+#endif -+ -+/* ---- Definitions for closures ----------------------------------------- */ -+ -+#define FFI_CLOSURES 1 -+#define FFI_GO_CLOSURES 1 -+#define FFI_NATIVE_RAW_API 0 -+ -+#if defined (FFI_EXEC_TRAMPOLINE_TABLE) && FFI_EXEC_TRAMPOLINE_TABLE -+ -+#ifdef __MACH__ -+#define FFI_TRAMPOLINE_SIZE 12 -+#define FFI_TRAMPOLINE_CLOSURE_OFFSET 8 -+#else -+#error "No trampoline table implementation" -+#endif -+ -+#else -+#ifdef _WIN32 -+#define FFI_TRAMPOLINE_SIZE 16 -+#define FFI_TRAMPOLINE_CLOSURE_FUNCTION 12 -+#else -+#define FFI_TRAMPOLINE_SIZE 12 -+#endif -+#define FFI_TRAMPOLINE_CLOSURE_OFFSET FFI_TRAMPOLINE_SIZE -+#endif -+ -+#endif