[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Minios-devel] [UNIKRAFT/GCC PATCH v2 4/5] Port libffi library



Hi Charalampos, this patch looks good.

Thanks,

-- Felipe

Reviewed-by: Felipe Huici <felipe.huici@xxxxxxxxx>

On 26.09.19, 17:19, "Charalampos Mainas" <Charalampos.Mainas@xxxxxxxxx> wrote:

    This port also adds the generated ffi.h and fficonfig.h headers. Another
    option would have been to generate them during the build.
    
    Signed-off-by: Charalampos Mainas <Charalampos.Mainas@xxxxxxxxx>
    Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx>
    ---
     Config.uk                         |  14 +-
     Makefile.uk                       |  28 ++
     libffi/exportsyms.uk              |  21 ++
     libffi/include/config/fficonfig.h | 206 ++++++++++++
     libffi/include/ffi.h              | 509 ++++++++++++++++++++++++++++++
     libffi/include/ffitarget.h        | 141 +++++++++
     6 files changed, 915 insertions(+), 4 deletions(-)
     create mode 100644 libffi/exportsyms.uk
     create mode 100644 libffi/include/config/fficonfig.h
     create mode 100644 libffi/include/ffi.h
     create mode 100644 libffi/include/ffitarget.h
    
    diff --git a/Config.uk b/Config.uk
    index ea411b0..5aaca7c 100644
    --- a/Config.uk
    +++ b/Config.uk
    @@ -1,23 +1,29 @@
     menuconfig LIBGCC
        bool "gcc - GNU Compiler Collection libraries"
        default n
    -   select LIBNOLIBC if !HAVE_LIBC
        select LIBUKDEBUG
        select LIBUKALLOC
    +   select LIBNEWLIBC
    +   select LIBUKMMAP
    +   select UKSYSINFO
     
     if LIBGCC
     
     config LIBBACKTRACE
        bool "libbacktrace library"
        default n
    -   select LIBNEWLIBC
        select LIBCOMPILER_RT
        select LIBUNWIND
        select LIBCXX
        select LIBCXXABI
    -   select LIBUKMMAP
    -   select UKSYSINFO
     if LIBBACKTRACE
     endif
     
    +config LIBFFI
    +       bool "libffi - A Portable Foreign Function Interface Library"
    +       default n
    +       select LIBPTHREAD_EMBEDDED
    +if LIBFFI
    +endif
    +
     endif
    diff --git a/Makefile.uk b/Makefile.uk
    index 2e763f9..ce86cfb 100644
    --- a/Makefile.uk
    +++ b/Makefile.uk
    @@ -41,6 +41,7 @@
     
################################################################################
     $(eval $(call addlib_s,libgcc,$(CONFIG_LIBGCC)))
     $(eval $(call addlib_s,libbacktrace,$(CONFIG_LIBBACKTRACE)))
    +$(eval $(call addlib_s,libffi,$(CONFIG_LIBFFI)))
     
     
################################################################################
     # Original sources
    @@ -55,6 +56,7 @@ $(eval $(call fetch,libgcc,$(LIBGCC_URL)))
     
################################################################################
     LIBGCC_EXTRACTED = $(LIBGCC_ORIGIN)/gcc-$(LIBGCC_VERSION)
     LIBBACKTRACE_EXTRACTED = $(LIBGCC_EXTRACTED)/libbacktrace
    +LIBFFI_EXTRACTED = $(LIBGCC_EXTRACTED)/libffi
     
     
################################################################################
     # Library includes
    @@ -65,6 +67,9 @@ CXXINCLUDES-$(CONFIG_LIBGCC) += -I$(LIBGCC_BASE)/include
     CINCLUDES-$(CONFIG_LIBBACKTRACE)   += -I$(LIBGCC_BASE)/libbacktrace/include
     CXXINCLUDES-$(CONFIG_LIBBACKTRACE) += -I$(LIBGCC_BASE)/libbacktrace/include
     
    +CINCLUDES-$(CONFIG_LIBFFI)   += -I$(LIBGCC_BASE)/libffi/include
    +CXXINCLUDES-$(CONFIG_LIBFFI) += -I$(LIBGCC_BASE)/libffi/include
    +
     
################################################################################
     # libbacktrace code
     
################################################################################
    @@ -92,3 +97,26 @@ LIBBACKTRACE_SRCS-y += $(LIBBACKTRACE_EXTRACTED)/mmap.c
     
     LIBBACKTRACE_EXPORTS = $(LIBGCC_BASE)/libbacktrace/exportsyms.uk
     
    
+################################################################################
    +# libffi code
    
+################################################################################
    +LIBFFI_COMMON_CINCLUDES-y = -I$(LIBGCC_BASE)/libffi/include \
    +       -I$(LIBGCC_EXTRACTED)/include -I$(LIBFFI_EXTRACTED)/include \
    +       -I$(LIBGCC_BASE)/libffi/include/config
    +LIBFFI_COMMON_CINCLUDES-$(CONFIG_ARCH_X86_64) += 
-I$(LIBFFI_EXTRACTED)/src/x86
    +LIBFFI_ASINCLUDES-y = $(LIBFFI_COMMON_CINCLUDES-y)
    +LIBFFI_CINCLUDES-y  = $(LIBFFI_COMMON_CINCLUDES-y)
    +
    +LIBFFI_CFLAGS-y += -DHAVE_CONFIG_H -fexceptions -Wall \
    +   -Wno-implicit-function-declaration -Wno-sign-compare \
    +   -Wno-unused-parameter -Wno-empty-body -Wno-implicit-fallthrough
    +
    +LIBFFI_SRCS-y += $(LIBFFI_EXTRACTED)/src/closures.c
    +LIBFFI_SRCS-y += $(LIBFFI_EXTRACTED)/src/java_raw_api.c
    +LIBFFI_SRCS-y += $(LIBFFI_EXTRACTED)/src/prep_cif.c
    +LIBFFI_SRCS-y += $(LIBFFI_EXTRACTED)/src/raw_api.c
    +LIBFFI_SRCS-y += $(LIBFFI_EXTRACTED)/src/types.c
    +LIBFFI_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBFFI_EXTRACTED)/src/x86/ffi64.c
    +LIBFFI_SRCS-$(CONFIG_ARCH_X86_64) += $(LIBFFI_EXTRACTED)/src/x86/unix64.S
    +
    +LIBFFI_EXPORTS = $(LIBGCC_BASE)/libffi/exportsyms.uk
    diff --git a/libffi/exportsyms.uk b/libffi/exportsyms.uk
    new file mode 100644
    index 0000000..c7640a6
    --- /dev/null
    +++ b/libffi/exportsyms.uk
    @@ -0,0 +1,21 @@
    +ffi_call
    +ffi_call_go
    +ffi_prep_cif
    +ffi_prep_cif_var
    +ffi_prep_go_closure
    +ffi_type_complex_double
    +ffi_type_complex_float
    +ffi_type_complex_longdouble
    +ffi_type_double
    +ffi_type_float
    +ffi_type_longdouble
    +ffi_type_pointer
    +ffi_type_sint16
    +ffi_type_sint32
    +ffi_type_sint64
    +ffi_type_sint8
    +ffi_type_uint16
    +ffi_type_uint32
    +ffi_type_uint64
    +ffi_type_uint8
    +ffi_type_void
    diff --git a/libffi/include/config/fficonfig.h 
b/libffi/include/config/fficonfig.h
    new file mode 100644
    index 0000000..bf3f12c
    --- /dev/null
    +++ b/libffi/include/config/fficonfig.h
    @@ -0,0 +1,206 @@
    +/* fficonfig.h.  Generated from fficonfig.h.in by configure.  */
    +/* fficonfig.h.in.  Generated from configure.ac by autoheader.  */
    +
    +/* Define if building universal (internal helper macro) */
    +/* #undef AC_APPLE_UNIVERSAL_BUILD */
    +
    +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
    +   systems. This function is required for `alloca.c' support on those 
systems.
    +   */
    +/* #undef CRAY_STACKSEG_END */
    +
    +/* Define to 1 if using `alloca.c'. */
    +/* #undef C_ALLOCA */
    +
    +/* Define to the flags needed for the .section .eh_frame directive. */
    +#define EH_FRAME_FLAGS "a"
    +
    +/* Define this if you want extra debugging. */
    +/* #undef FFI_DEBUG */
    +
    +/* Cannot use PROT_EXEC on this target, so, we revert to alternative means 
*/
    +/* #undef FFI_EXEC_TRAMPOLINE_TABLE */
    +
    +/* Define this if you want to enable pax emulated trampolines */
    +/* #undef FFI_MMAP_EXEC_EMUTRAMP_PAX */
    +
    +/* Cannot use malloc on this target, so, we revert to alternative means */
    +/* #undef FFI_MMAP_EXEC_WRIT */
    +
    +/* Define this if you do not want support for the raw API. */
    +/* #undef FFI_NO_RAW_API */
    +
    +/* Define this if you do not want support for aggregate types. */
    +/* #undef FFI_NO_STRUCTS */
    +
    +/* Define to 1 if you have `alloca', as a function or macro. */
    +#define HAVE_ALLOCA 1
    +
    +/* Define to 1 if you have <alloca.h> and it should be used (not on 
Ultrix).
    +   */
    +#define HAVE_ALLOCA_H 1
    +
    +/* Define if your assembler supports .cfi_* directives. */
    +#define HAVE_AS_CFI_PSEUDO_OP 1
    +
    +/* Define if your assembler supports .register. */
    +/* #undef HAVE_AS_REGISTER_PSEUDO_OP */
    +
    +/* Define if the compiler uses zarch features. */
    +/* #undef HAVE_AS_S390_ZARCH */
    +
    +/* Define if your assembler and linker support unaligned PC relative 
relocs.
    +   */
    +/* #undef HAVE_AS_SPARC_UA_PCREL */
    +
    +/* Define if your assembler supports unwind section type. */
    +#define HAVE_AS_X86_64_UNWIND_SECTION_TYPE 1
    +
    +/* Define if your assembler supports PC relative relocs. */
    +#define HAVE_AS_X86_PCREL 1
    +
    +/* Define to 1 if you have the <dlfcn.h> header file. */
    +#define HAVE_DLFCN_H 1
    +
    +/* Define if __attribute__((visibility("hidden"))) is supported. */
    +#define HAVE_HIDDEN_VISIBILITY_ATTRIBUTE 1
    +
    +/* Define to 1 if you have the <inttypes.h> header file. */
    +#define HAVE_INTTYPES_H 1
    +
    +/* Define if you have the long double type and it is bigger than a double 
*/
    +#define HAVE_LONG_DOUBLE 1
    +
    +/* Define if you support more than one size of the long double type */
    +/* #undef HAVE_LONG_DOUBLE_VARIANT */
    +
    +/* Define to 1 if you have the `memcpy' function. */
    +#define HAVE_MEMCPY 1
    +
    +/* Define to 1 if you have the <memory.h> header file. */
    +#define HAVE_MEMORY_H 1
    +
    +/* Define to 1 if you have the `mkostemp' function. */
    +#define HAVE_MKOSTEMP 1
    +
    +/* Define to 1 if you have the `mmap' function. */
    +#define HAVE_MMAP 1
    +
    +/* Define if mmap with MAP_ANON(YMOUS) works. */
    +#define HAVE_MMAP_ANON 1
    +
    +/* Define if mmap of /dev/zero works. */
    +#define HAVE_MMAP_DEV_ZERO 1
    +
    +/* Define if read-only mmap of a plain file works. */
    +#define HAVE_MMAP_FILE 1
    +
    +/* Define if .eh_frame sections should be read-only. */
    +#define HAVE_RO_EH_FRAME 1
    +
    +/* Define to 1 if you have the <stdint.h> header file. */
    +#define HAVE_STDINT_H 1
    +
    +/* Define to 1 if you have the <stdlib.h> header file. */
    +#define HAVE_STDLIB_H 1
    +
    +/* Define to 1 if you have the <strings.h> header file. */
    +#define HAVE_STRINGS_H 1
    +
    +/* Define to 1 if you have the <string.h> header file. */
    +#define HAVE_STRING_H 1
    +
    +/* Define to 1 if you have the <sys/mman.h> header file. */
    +#define HAVE_SYS_MMAN_H 1
    +
    +/* Define to 1 if you have the <sys/stat.h> header file. */
    +#define HAVE_SYS_STAT_H 1
    +
    +/* Define to 1 if you have the <sys/types.h> header file. */
    +#define HAVE_SYS_TYPES_H 1
    +
    +/* Define to 1 if you have the <unistd.h> header file. */
    +#define HAVE_UNISTD_H 1
    +
    +/* Define to the sub-directory in which libtool stores uninstalled 
libraries.
    +   */
    +#define LT_OBJDIR ".libs/"
    +
    +/* Define to 1 if your C compiler doesn't accept -c and -o together. */
    +/* #undef NO_MINUS_C_MINUS_O */
    +
    +/* Name of package */
    +#define PACKAGE "libffi"
    +
    +/* Define to the address where bug reports for this package should be 
sent. */
    +#define PACKAGE_BUGREPORT "http://github.com/atgreen/libffi/issues";
    +
    +/* Define to the full name of this package. */
    +#define PACKAGE_NAME "libffi"
    +
    +/* Define to the full name and version of this package. */
    +#define PACKAGE_STRING "libffi 3.99999"
    +
    +/* Define to the one symbol short name of this package. */
    +#define PACKAGE_TARNAME "libffi"
    +
    +/* Define to the home page for this package. */
    +#define PACKAGE_URL ""
    +
    +/* Define to the version of this package. */
    +#define PACKAGE_VERSION "3.99999"
    +
    +/* The size of `double', as computed by sizeof. */
    +#define SIZEOF_DOUBLE 8
    +
    +/* The size of `long double', as computed by sizeof. */
    +#define SIZEOF_LONG_DOUBLE 16
    +
    +/* The size of `size_t', as computed by sizeof. */
    +#define SIZEOF_SIZE_T 8
    +
    +/* If using the C implementation of alloca, define if you know the
    +   direction of stack growth for your system; otherwise it will be
    +   automatically deduced at runtime.
    +   STACK_DIRECTION > 0 => grows toward higher addresses
    +   STACK_DIRECTION < 0 => grows toward lower addresses
    +   STACK_DIRECTION = 0 => direction of growth unknown */
    +/* #undef STACK_DIRECTION */
    +
    +/* Define to 1 if you have the ANSI C header files. */
    +#define STDC_HEADERS 1
    +
    +/* Define this if you are using Purify and want to suppress spurious 
messages.
    +   */
    +/* #undef USING_PURIFY */
    +
    +/* Version number of package */
    +#define VERSION "3.99999"
    +
    +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
    +   significant byte first (like Motorola and SPARC, unlike Intel). */
    +#if defined AC_APPLE_UNIVERSAL_BUILD
    +# if defined __BIG_ENDIAN__
    +#  define WORDS_BIGENDIAN 1
    +# endif
    +#else
    +# ifndef WORDS_BIGENDIAN
    +/* #  undef WORDS_BIGENDIAN */
    +# endif
    +#endif
    +
    +
    +#ifdef HAVE_HIDDEN_VISIBILITY_ATTRIBUTE
    +#ifdef LIBFFI_ASM
    +#define FFI_HIDDEN(name) .hidden name
    +#else
    +#define FFI_HIDDEN __attribute__ ((visibility ("hidden")))
    +#endif
    +#else
    +#ifdef LIBFFI_ASM
    +#define FFI_HIDDEN(name)
    +#else
    +#define FFI_HIDDEN
    +#endif
    +#endif
    +
    diff --git a/libffi/include/ffi.h b/libffi/include/ffi.h
    new file mode 100644
    index 0000000..de77109
    --- /dev/null
    +++ b/libffi/include/ffi.h
    @@ -0,0 +1,509 @@
    +/* -----------------------------------------------------------------*-C-*-
    +   libffi 3.99999 - 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.
    +
    +   ----------------------------------------------------------------------- 
*/
    +
    +/* -------------------------------------------------------------------
    +   The basic API is described in the README file.
    +
    +   The raw API is designed to bypass some of the argument packing
    +   and unpacking on architectures for which it can be avoided.
    +
    +   The closure API allows interpreted functions to be packaged up
    +   inside a C function pointer, so that they can be called as C functions,
    +   with no understanding on the client side that they are interpreted.
    +   It can also be used in other cases in which it is necessary to package
    +   up a user specified parameter and a function pointer as a single
    +   function pointer.
    +
    +   The closure API must be implemented in order to get its functionality,
    +   e.g. for use by gij.  Routines are provided to emulate the raw API
    +   if the underlying platform doesn't allow faster implementation.
    +
    +   More details on the raw and cloure 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 <ffitarget.h>
    +
    +#ifndef LIBFFI_ASM
    +
    +#if defined(_MSC_VER) && !defined(__clang__)
    +#define __attribute__(X)
    +#endif
    +
    +#include <stddef.h>
    +#include <limits.h>
    +
    +/* 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
    +
    +/* 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_BUILDING
    +#define FFI_EXTERN extern __declspec(dllimport)
    +#else
    +#define FFI_EXTERN extern
    +#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 unsigned FFI_TYPE;
    +
    +typedef struct {
    +  ffi_abi abi;
    +  unsigned nargs;
    +  ffi_type **arg_types;
    +  ffi_type *rtype;
    +  unsigned bytes;
    +  unsigned flags;
    +#ifdef FFI_EXTRA_CIF_FIELDS
    +  FFI_EXTRA_CIF_FIELDS;
    +#endif
    +} ffi_cif;
    +
    +#if 0
    +/* Used to adjust size/alignment of ffi types.  */
    +void ffi_prep_types (ffi_abi abi);
    +#endif
    +
    +/* Used internally, but overridden by some architectures */
    +ffi_status ffi_prep_cif_core(ffi_cif *cif,
    +                        ffi_abi abi,
    +                        unsigned int isvariadic,
    +                        unsigned int nfixedargs,
    +                        unsigned int ntotalargs,
    +                        ffi_type *rtype,
    +                        ffi_type **atypes);
    +
    +/* ---- 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
    +
    +
    +void ffi_raw_call (ffi_cif *cif,
    +              void (*fn)(void),
    +              void *rvalue,
    +              ffi_raw *avalue);
    +
    +void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw);
    +void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args);
    +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.         */
    +
    +void ffi_java_raw_call (ffi_cif *cif,
    +                   void (*fn)(void),
    +                   void *rvalue,
    +                   ffi_java_raw *avalue);
    +
    +void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw 
*raw);
    +void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void 
**args);
    +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;
    +#ifdef __GNUC__
    +} ffi_closure __attribute__((aligned (8)));
    +#else
    +} ffi_closure;
    +# ifdef __sgi
    +#  pragma pack 0
    +# endif
    +#endif
    +
    +void *ffi_closure_alloc (size_t size, void **code);
    +void ffi_closure_free (void *);
    +
    +ffi_status
    +ffi_prep_closure (ffi_closure*,
    +             ffi_cif *,
    +             void (*fun)(ffi_cif*,void*,void**,void*),
    +             void *user_data);
    +
    +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 transaltion, 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_status
    +ffi_prep_raw_closure (ffi_raw_closure*,
    +                 ffi_cif *cif,
    +                 void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
    +                 void *user_data);
    +
    +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_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_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_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *,
    +                           void (*fun)(ffi_cif*,void*,void**,void*));
    +
    +void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
    +             void **avalue, void *closure);
    +
    +#endif /* FFI_GO_CLOSURES */
    +
    +/* ---- Public interface definition -------------------------------------- 
*/
    +
    +ffi_status ffi_prep_cif(ffi_cif *cif,
    +                   ffi_abi abi,
    +                   unsigned int nargs,
    +                   ffi_type *rtype,
    +                   ffi_type **atypes);
    +
    +ffi_status ffi_prep_cif_var(ffi_cif *cif,
    +                       ffi_abi abi,
    +                       unsigned int nfixedargs,
    +                       unsigned int ntotalargs,
    +                       ffi_type *rtype,
    +                       ffi_type **atypes);
    +
    +void ffi_call(ffi_cif *cif,
    +         void (*fn)(void),
    +         void *rvalue,
    +         void **avalue);
    +
    +/* Useful for eliminating compiler warnings */
    +#define FFI_FN(f) ((void (*)(void))f)
    +
    +/* ---- Definitions shared with assembly code ---------------------------- 
*/
    +
    +#endif
    +
    +/* 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) */
    +/* ??? Ideally, anyway.  There are assembly files that still depend
    +   on this not including COMPLEX.  */
    +#ifdef FFI_TARGET_HAS_COMPLEX_TYPE
    +# define FFI_TYPE_LAST      FFI_TYPE_COMPLEX
    +#else
    +# define FFI_TYPE_LAST      FFI_TYPE_POINTER
    +#endif
    +
    +#ifdef __cplusplus
    +}
    +#endif
    +
    +#endif
    diff --git a/libffi/include/ffitarget.h b/libffi/include/ffitarget.h
    new file mode 100644
    index 0000000..8a7c68e
    --- /dev/null
    +++ b/libffi/include/ffitarget.h
    @@ -0,0 +1,141 @@
    +/* -----------------------------------------------------------------*-C-*-
    +   ffitarget.h - Copyright (c) 2012, 2014  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
    +
    +#if !defined(_MSC_VER) && !defined(X86_DARWIN) && !defined(X86_64_DARWIN)
    +#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,
    +  FFI_LAST_ABI,
    +  FFI_DEFAULT_ABI = FFI_WIN64
    +
    +#elif defined(X86_64) || defined(X86_64_DARWIN)
    +  FFI_FIRST_ABI = 1,
    +  FFI_UNIX64,
    +  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
    +
    +#if !defined(X86_DARWIN) && !defined(X86_64_DARWIN)
    +#define FFI_GO_CLOSURES 1
    +#endif
    +
    +#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_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
    -- 
    2.17.1
    
    

_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.