diff options
| -rw-r--r-- | package/libffi/libffi-0001-Add-support-for-Blackfin.patch | 1044 | ||||
| -rw-r--r-- | package/libffi/libffi-0002-Add-aarch64-support-from-upstream.patch | 2326 | ||||
| -rw-r--r-- | package/libffi/libffi.mk | 29 | 
3 files changed, 23 insertions, 3376 deletions
diff --git a/package/libffi/libffi-0001-Add-support-for-Blackfin.patch b/package/libffi/libffi-0001-Add-support-for-Blackfin.patch deleted file mode 100644 index 7a55b402a..000000000 --- a/package/libffi/libffi-0001-Add-support-for-Blackfin.patch +++ /dev/null @@ -1,1044 +0,0 @@ -From 643764d29559e2ca6280837069972b1d4790d61a Mon Sep 17 00:00:00 2001 -From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> -Date: Fri, 16 Nov 2012 01:10:10 +0100 -Subject: [PATCH 1/2] Add support for Blackfin - -Taken upstream from -https://github.com/atgreen/libffi/commit/213ed15c70e72d666154c08e2b41dae3f61f20d3. Will -be part of the upcoming 3.0.12 release. - -We have kept the part of the patches changing configure and -Makefile.in in order to avoid having to autoreconf the package, which -requires autoconf 2.68. - -Code written by Alexandre Keunecke. - -Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> ---- - ChangeLog            |    8 +++ - Makefile.am          |    4 ++ - Makefile.in          |  160 ++++++++++++++++++++++------------------- - README               |    8 ++- - configure            |  113 +++++++++++++---------------- - configure.ac         |    5 ++ - src/bfin/ffi.c       |  195 ++++++++++++++++++++++++++++++++++++++++++++++++++ - src/bfin/ffitarget.h |   43 +++++++++++ - src/bfin/sysv.S      |  177 +++++++++++++++++++++++++++++++++++++++++++++ - 9 files changed, 574 insertions(+), 139 deletions(-) - create mode 100644 src/bfin/ffi.c - create mode 100644 src/bfin/ffitarget.h - create mode 100644 src/bfin/sysv.S - -diff --git a/ChangeLog b/ChangeLog -index f4148a9..376edf7 100644 ---- a/ChangeLog -+++ b/ChangeLog -@@ -1,3 +1,11 @@ -+2012-04-23  Alexandre Keunecke I. de Mendonca <alexandre.keunecke@gmail.com> -+ -+	* configure.ac: Add Blackfin/sysv support -+	* Makefile.am: Add Blackfin/sysv support -+	* src/bfin/ffi.c:  Add Blackfin/sysv support -+	* src/bfin/ffitarget.h: Add Blackfin/sysv support -+	* src/bfin/sysv.S: Add Blackfin/sysv support -+ - 2012-04-11  Anthony Green  <green@moxielogic.com> -  - 	* Makefile.am (EXTRA_DIST): Add new script. -diff --git a/Makefile.am b/Makefile.am -index 4a855d7..16f32a6 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -27,6 +27,7 @@ EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \ - 	src/x86/win64.S src/x86/freebsd.S src/x86/ffi64.c \ - 	src/x86/unix64.S src/x86/ffitarget.h src/pa/ffitarget.h	\ - 	src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c \ -+	src/bfin/ffi.c src/bfin/ffitarget.h src/bfin/sysv.S \ - 	src/frv/eabi.S src/frv/ffitarget.h src/dlmalloc.c \ - 	src/moxie/ffi.c src/moxie/eabi.S libtool-version \ - 	ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4 \ -@@ -105,6 +106,9 @@ endif - if MIPS - nodist_libffi_la_SOURCES += src/mips/ffi.c src/mips/o32.S src/mips/n32.S - endif -+if BFIN -+nodist_libffi_la_SOURCES += src/bfin/ffi.c src/bfin/sysv.S -+endif - if X86 - nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/sysv.S - endif -diff --git a/Makefile.in b/Makefile.in -index 4308193..f5c10af 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -38,35 +38,36 @@ host_triplet = @host@ - target_triplet = @target@ - @FFI_DEBUG_TRUE@am__append_1 = src/debug.c - @MIPS_TRUE@am__append_2 = src/mips/ffi.c src/mips/o32.S src/mips/n32.S --@X86_TRUE@am__append_3 = src/x86/ffi.c src/x86/sysv.S --@X86_FREEBSD_TRUE@am__append_4 = src/x86/ffi.c src/x86/freebsd.S --@X86_WIN32_TRUE@am__append_5 = src/x86/ffi.c src/x86/win32.S --@X86_WIN64_TRUE@am__append_6 = src/x86/ffi.c src/x86/win64.S --@X86_DARWIN_TRUE@am__append_7 = src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S --@SPARC_TRUE@am__append_8 = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S --@ALPHA_TRUE@am__append_9 = src/alpha/ffi.c src/alpha/osf.S --@IA64_TRUE@am__append_10 = src/ia64/ffi.c src/ia64/unix.S --@M32R_TRUE@am__append_11 = src/m32r/sysv.S src/m32r/ffi.c --@M68K_TRUE@am__append_12 = src/m68k/ffi.c src/m68k/sysv.S --@POWERPC_TRUE@am__append_13 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S --@POWERPC_AIX_TRUE@am__append_14 = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S --@POWERPC_DARWIN_TRUE@am__append_15 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S --@POWERPC_FREEBSD_TRUE@am__append_16 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S --@ARM_TRUE@am__append_17 = src/arm/sysv.S src/arm/ffi.c --@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__append_18 = src/arm/trampoline.S --@AVR32_TRUE@am__append_19 = src/avr32/sysv.S src/avr32/ffi.c --@LIBFFI_CRIS_TRUE@am__append_20 = src/cris/sysv.S src/cris/ffi.c --@FRV_TRUE@am__append_21 = src/frv/eabi.S src/frv/ffi.c --@MOXIE_TRUE@am__append_22 = src/moxie/eabi.S src/moxie/ffi.c --@S390_TRUE@am__append_23 = src/s390/sysv.S src/s390/ffi.c --@X86_64_TRUE@am__append_24 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S --@SH_TRUE@am__append_25 = src/sh/sysv.S src/sh/ffi.c --@SH64_TRUE@am__append_26 = src/sh64/sysv.S src/sh64/ffi.c --@PA_LINUX_TRUE@am__append_27 = src/pa/linux.S src/pa/ffi.c --@PA_HPUX_TRUE@am__append_28 = src/pa/hpux32.S src/pa/ffi.c -+@BFIN_TRUE@am__append_3 = src/bfin/ffi.c src/bfin/sysv.S -+@X86_TRUE@am__append_4 = src/x86/ffi.c src/x86/sysv.S -+@X86_FREEBSD_TRUE@am__append_5 = src/x86/ffi.c src/x86/freebsd.S -+@X86_WIN32_TRUE@am__append_6 = src/x86/ffi.c src/x86/win32.S -+@X86_WIN64_TRUE@am__append_7 = src/x86/ffi.c src/x86/win64.S -+@X86_DARWIN_TRUE@am__append_8 = src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S -+@SPARC_TRUE@am__append_9 = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S -+@ALPHA_TRUE@am__append_10 = src/alpha/ffi.c src/alpha/osf.S -+@IA64_TRUE@am__append_11 = src/ia64/ffi.c src/ia64/unix.S -+@M32R_TRUE@am__append_12 = src/m32r/sysv.S src/m32r/ffi.c -+@M68K_TRUE@am__append_13 = src/m68k/ffi.c src/m68k/sysv.S -+@POWERPC_TRUE@am__append_14 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S -+@POWERPC_AIX_TRUE@am__append_15 = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S -+@POWERPC_DARWIN_TRUE@am__append_16 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S -+@POWERPC_FREEBSD_TRUE@am__append_17 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S -+@ARM_TRUE@am__append_18 = src/arm/sysv.S src/arm/ffi.c -+@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__append_19 = src/arm/trampoline.S -+@AVR32_TRUE@am__append_20 = src/avr32/sysv.S src/avr32/ffi.c -+@LIBFFI_CRIS_TRUE@am__append_21 = src/cris/sysv.S src/cris/ffi.c -+@FRV_TRUE@am__append_22 = src/frv/eabi.S src/frv/ffi.c -+@MOXIE_TRUE@am__append_23 = src/moxie/eabi.S src/moxie/ffi.c -+@S390_TRUE@am__append_24 = src/s390/sysv.S src/s390/ffi.c -+@X86_64_TRUE@am__append_25 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S -+@SH_TRUE@am__append_26 = src/sh/sysv.S src/sh/ffi.c -+@SH64_TRUE@am__append_27 = src/sh64/sysv.S src/sh64/ffi.c -+@PA_LINUX_TRUE@am__append_28 = src/pa/linux.S src/pa/ffi.c -+@PA_HPUX_TRUE@am__append_29 = src/pa/hpux32.S src/pa/ffi.c - # Build debug. Define FFI_DEBUG on the commandline so that, when building with - # MSVC, it can link against the debug CRT. --@FFI_DEBUG_TRUE@am__append_29 = -DFFI_DEBUG -+@FFI_DEBUG_TRUE@am__append_30 = -DFFI_DEBUG - subdir = . - DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ - 	$(srcdir)/Makefile.in $(srcdir)/doc/stamp-vti \ -@@ -75,17 +76,7 @@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ - 	compile config.guess config.sub depcomp install-sh ltmain.sh \ - 	mdate-sh missing texinfo.tex - ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 --am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ --	$(top_srcdir)/m4/ax_cc_maxopt.m4 \ --	$(top_srcdir)/m4/ax_cflags_warn_all.m4 \ --	$(top_srcdir)/m4/ax_compiler_vendor.m4 \ --	$(top_srcdir)/m4/ax_configure_args.m4 \ --	$(top_srcdir)/m4/ax_enable_builddir.m4 \ --	$(top_srcdir)/m4/ax_gcc_archflag.m4 \ --	$(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \ --	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ --	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ --	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ -+am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ - 	$(top_srcdir)/configure.ac - am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - 	$(ACLOCAL_M4) -@@ -126,44 +117,45 @@ am_libffi_la_OBJECTS = src/prep_cif.lo src/types.lo src/raw_api.lo \ - @FFI_DEBUG_TRUE@am__objects_1 = src/debug.lo - @MIPS_TRUE@am__objects_2 = src/mips/ffi.lo src/mips/o32.lo \ - @MIPS_TRUE@	src/mips/n32.lo --@X86_TRUE@am__objects_3 = src/x86/ffi.lo src/x86/sysv.lo --@X86_FREEBSD_TRUE@am__objects_4 = src/x86/ffi.lo src/x86/freebsd.lo --@X86_WIN32_TRUE@am__objects_5 = src/x86/ffi.lo src/x86/win32.lo --@X86_WIN64_TRUE@am__objects_6 = src/x86/ffi.lo src/x86/win64.lo --@X86_DARWIN_TRUE@am__objects_7 = src/x86/ffi.lo src/x86/darwin.lo \ -+@BFIN_TRUE@am__objects_3 = src/bfin/ffi.lo src/bfin/sysv.lo -+@X86_TRUE@am__objects_4 = src/x86/ffi.lo src/x86/sysv.lo -+@X86_FREEBSD_TRUE@am__objects_5 = src/x86/ffi.lo src/x86/freebsd.lo -+@X86_WIN32_TRUE@am__objects_6 = src/x86/ffi.lo src/x86/win32.lo -+@X86_WIN64_TRUE@am__objects_7 = src/x86/ffi.lo src/x86/win64.lo -+@X86_DARWIN_TRUE@am__objects_8 = src/x86/ffi.lo src/x86/darwin.lo \ - @X86_DARWIN_TRUE@	src/x86/ffi64.lo src/x86/darwin64.lo --@SPARC_TRUE@am__objects_8 = src/sparc/ffi.lo src/sparc/v8.lo \ -+@SPARC_TRUE@am__objects_9 = src/sparc/ffi.lo src/sparc/v8.lo \ - @SPARC_TRUE@	src/sparc/v9.lo --@ALPHA_TRUE@am__objects_9 = src/alpha/ffi.lo src/alpha/osf.lo --@IA64_TRUE@am__objects_10 = src/ia64/ffi.lo src/ia64/unix.lo --@M32R_TRUE@am__objects_11 = src/m32r/sysv.lo src/m32r/ffi.lo --@M68K_TRUE@am__objects_12 = src/m68k/ffi.lo src/m68k/sysv.lo --@POWERPC_TRUE@am__objects_13 = src/powerpc/ffi.lo src/powerpc/sysv.lo \ -+@ALPHA_TRUE@am__objects_10 = src/alpha/ffi.lo src/alpha/osf.lo -+@IA64_TRUE@am__objects_11 = src/ia64/ffi.lo src/ia64/unix.lo -+@M32R_TRUE@am__objects_12 = src/m32r/sysv.lo src/m32r/ffi.lo -+@M68K_TRUE@am__objects_13 = src/m68k/ffi.lo src/m68k/sysv.lo -+@POWERPC_TRUE@am__objects_14 = src/powerpc/ffi.lo src/powerpc/sysv.lo \ - @POWERPC_TRUE@	src/powerpc/ppc_closure.lo \ - @POWERPC_TRUE@	src/powerpc/linux64.lo \ - @POWERPC_TRUE@	src/powerpc/linux64_closure.lo --@POWERPC_AIX_TRUE@am__objects_14 = src/powerpc/ffi_darwin.lo \ -+@POWERPC_AIX_TRUE@am__objects_15 = src/powerpc/ffi_darwin.lo \ - @POWERPC_AIX_TRUE@	src/powerpc/aix.lo \ - @POWERPC_AIX_TRUE@	src/powerpc/aix_closure.lo --@POWERPC_DARWIN_TRUE@am__objects_15 = src/powerpc/ffi_darwin.lo \ -+@POWERPC_DARWIN_TRUE@am__objects_16 = src/powerpc/ffi_darwin.lo \ - @POWERPC_DARWIN_TRUE@	src/powerpc/darwin.lo \ - @POWERPC_DARWIN_TRUE@	src/powerpc/darwin_closure.lo --@POWERPC_FREEBSD_TRUE@am__objects_16 = src/powerpc/ffi.lo \ -+@POWERPC_FREEBSD_TRUE@am__objects_17 = src/powerpc/ffi.lo \ - @POWERPC_FREEBSD_TRUE@	src/powerpc/sysv.lo \ - @POWERPC_FREEBSD_TRUE@	src/powerpc/ppc_closure.lo --@ARM_TRUE@am__objects_17 = src/arm/sysv.lo src/arm/ffi.lo --@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__objects_18 = src/arm/trampoline.lo --@AVR32_TRUE@am__objects_19 = src/avr32/sysv.lo src/avr32/ffi.lo --@LIBFFI_CRIS_TRUE@am__objects_20 = src/cris/sysv.lo src/cris/ffi.lo --@FRV_TRUE@am__objects_21 = src/frv/eabi.lo src/frv/ffi.lo --@MOXIE_TRUE@am__objects_22 = src/moxie/eabi.lo src/moxie/ffi.lo --@S390_TRUE@am__objects_23 = src/s390/sysv.lo src/s390/ffi.lo --@X86_64_TRUE@am__objects_24 = src/x86/ffi64.lo src/x86/unix64.lo \ -+@ARM_TRUE@am__objects_18 = src/arm/sysv.lo src/arm/ffi.lo -+@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__objects_19 = src/arm/trampoline.lo -+@AVR32_TRUE@am__objects_20 = src/avr32/sysv.lo src/avr32/ffi.lo -+@LIBFFI_CRIS_TRUE@am__objects_21 = src/cris/sysv.lo src/cris/ffi.lo -+@FRV_TRUE@am__objects_22 = src/frv/eabi.lo src/frv/ffi.lo -+@MOXIE_TRUE@am__objects_23 = src/moxie/eabi.lo src/moxie/ffi.lo -+@S390_TRUE@am__objects_24 = src/s390/sysv.lo src/s390/ffi.lo -+@X86_64_TRUE@am__objects_25 = src/x86/ffi64.lo src/x86/unix64.lo \ - @X86_64_TRUE@	src/x86/ffi.lo src/x86/sysv.lo --@SH_TRUE@am__objects_25 = src/sh/sysv.lo src/sh/ffi.lo --@SH64_TRUE@am__objects_26 = src/sh64/sysv.lo src/sh64/ffi.lo --@PA_LINUX_TRUE@am__objects_27 = src/pa/linux.lo src/pa/ffi.lo --@PA_HPUX_TRUE@am__objects_28 = src/pa/hpux32.lo src/pa/ffi.lo -+@SH_TRUE@am__objects_26 = src/sh/sysv.lo src/sh/ffi.lo -+@SH64_TRUE@am__objects_27 = src/sh64/sysv.lo src/sh64/ffi.lo -+@PA_LINUX_TRUE@am__objects_28 = src/pa/linux.lo src/pa/ffi.lo -+@PA_HPUX_TRUE@am__objects_29 = src/pa/hpux32.lo src/pa/ffi.lo - nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ - 	$(am__objects_3) $(am__objects_4) $(am__objects_5) \ - 	$(am__objects_6) $(am__objects_7) $(am__objects_8) \ -@@ -173,17 +165,17 @@ nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ - 	$(am__objects_18) $(am__objects_19) $(am__objects_20) \ - 	$(am__objects_21) $(am__objects_22) $(am__objects_23) \ - 	$(am__objects_24) $(am__objects_25) $(am__objects_26) \ --	$(am__objects_27) $(am__objects_28) -+	$(am__objects_27) $(am__objects_28) $(am__objects_29) - libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \ - 	$(nodist_libffi_la_OBJECTS) - libffi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - 	$(libffi_la_LDFLAGS) $(LDFLAGS) -o $@ - libffi_convenience_la_LIBADD = --am__objects_29 = src/prep_cif.lo src/types.lo src/raw_api.lo \ -+am__objects_30 = src/prep_cif.lo src/types.lo src/raw_api.lo \ - 	src/java_raw_api.lo src/closures.lo --am_libffi_convenience_la_OBJECTS = $(am__objects_29) --am__objects_30 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ -+am_libffi_convenience_la_OBJECTS = $(am__objects_30) -+am__objects_31 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ - 	$(am__objects_4) $(am__objects_5) $(am__objects_6) \ - 	$(am__objects_7) $(am__objects_8) $(am__objects_9) \ - 	$(am__objects_10) $(am__objects_11) $(am__objects_12) \ -@@ -192,8 +184,8 @@ am__objects_30 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ - 	$(am__objects_19) $(am__objects_20) $(am__objects_21) \ - 	$(am__objects_22) $(am__objects_23) $(am__objects_24) \ - 	$(am__objects_25) $(am__objects_26) $(am__objects_27) \ --	$(am__objects_28) --nodist_libffi_convenience_la_OBJECTS = $(am__objects_30) -+	$(am__objects_28) $(am__objects_29) -+nodist_libffi_convenience_la_OBJECTS = $(am__objects_31) - libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \ - 	$(nodist_libffi_convenience_la_OBJECTS) - DEFAULT_INCLUDES = -I.@am__isrc@ -@@ -440,6 +432,7 @@ EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \ - 	src/x86/win64.S src/x86/freebsd.S src/x86/ffi64.c \ - 	src/x86/unix64.S src/x86/ffitarget.h src/pa/ffitarget.h	\ - 	src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c \ -+	src/bfin/ffi.c src/bfin/ffitarget.h src/bfin/sysv.S \ - 	src/frv/eabi.S src/frv/ffitarget.h src/dlmalloc.c \ - 	src/moxie/ffi.c src/moxie/eabi.S libtool-version \ - 	ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4 \ -@@ -508,10 +501,10 @@ nodist_libffi_la_SOURCES = $(am__append_1) $(am__append_2) \ - 	$(am__append_18) $(am__append_19) $(am__append_20) \ - 	$(am__append_21) $(am__append_22) $(am__append_23) \ - 	$(am__append_24) $(am__append_25) $(am__append_26) \ --	$(am__append_27) $(am__append_28) -+	$(am__append_27) $(am__append_28) $(am__append_29) - libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) - nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) --AM_CFLAGS = -g $(am__append_29) -+AM_CFLAGS = -g $(am__append_30) - libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS) - AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src -DFFI_BUILDING - AM_CCASFLAGS = $(AM_CPPFLAGS) -g -@@ -637,6 +630,16 @@ src/mips/o32.lo: src/mips/$(am__dirstamp) \ - 	src/mips/$(DEPDIR)/$(am__dirstamp) - src/mips/n32.lo: src/mips/$(am__dirstamp) \ - 	src/mips/$(DEPDIR)/$(am__dirstamp) -+src/bfin/$(am__dirstamp): -+	@$(MKDIR_P) src/bfin -+	@: > src/bfin/$(am__dirstamp) -+src/bfin/$(DEPDIR)/$(am__dirstamp): -+	@$(MKDIR_P) src/bfin/$(DEPDIR) -+	@: > src/bfin/$(DEPDIR)/$(am__dirstamp) -+src/bfin/ffi.lo: src/bfin/$(am__dirstamp) \ -+	src/bfin/$(DEPDIR)/$(am__dirstamp) -+src/bfin/sysv.lo: src/bfin/$(am__dirstamp) \ -+	src/bfin/$(DEPDIR)/$(am__dirstamp) - src/x86/$(am__dirstamp): - 	@$(MKDIR_P) src/x86 - 	@: > src/x86/$(am__dirstamp) -@@ -852,6 +855,10 @@ mostlyclean-compile: - 	-rm -f src/avr32/ffi.lo - 	-rm -f src/avr32/sysv.$(OBJEXT) - 	-rm -f src/avr32/sysv.lo -+	-rm -f src/bfin/ffi.$(OBJEXT) -+	-rm -f src/bfin/ffi.lo -+	-rm -f src/bfin/sysv.$(OBJEXT) -+	-rm -f src/bfin/sysv.lo - 	-rm -f src/closures.$(OBJEXT) - 	-rm -f src/closures.lo - 	-rm -f src/cris/ffi.$(OBJEXT) -@@ -973,6 +980,8 @@ distclean-compile: - @AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/trampoline.Plo@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/ffi.Plo@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/sysv.Plo@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@src/bfin/$(DEPDIR)/ffi.Plo@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@src/bfin/$(DEPDIR)/sysv.Plo@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/ffi.Plo@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/sysv.Plo@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@src/frv/$(DEPDIR)/eabi.Plo@am__quote@ -@@ -1077,6 +1086,7 @@ clean-libtool: - 	-rm -rf src/alpha/.libs src/alpha/_libs - 	-rm -rf src/arm/.libs src/arm/_libs - 	-rm -rf src/avr32/.libs src/avr32/_libs -+	-rm -rf src/bfin/.libs src/bfin/_libs - 	-rm -rf src/cris/.libs src/cris/_libs - 	-rm -rf src/frv/.libs src/frv/_libs - 	-rm -rf src/ia64/.libs src/ia64/_libs -@@ -1631,6 +1641,8 @@ distclean-generic: - 	-rm -f src/arm/$(am__dirstamp) - 	-rm -f src/avr32/$(DEPDIR)/$(am__dirstamp) - 	-rm -f src/avr32/$(am__dirstamp) -+	-rm -f src/bfin/$(DEPDIR)/$(am__dirstamp) -+	-rm -f src/bfin/$(am__dirstamp) - 	-rm -f src/cris/$(DEPDIR)/$(am__dirstamp) - 	-rm -f src/cris/$(am__dirstamp) - 	-rm -f src/frv/$(DEPDIR)/$(am__dirstamp) -@@ -1670,7 +1682,7 @@ clean-am: clean-aminfo clean-generic clean-libLTLIBRARIES \ -  - distclean: distclean-recursive - 	-rm -f $(am__CONFIG_DISTCLEAN_FILES) --	-rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) -+	-rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) - 	-rm -f Makefile - distclean-am: clean-am distclean-compile distclean-generic \ - 	distclean-hdr distclean-libtool distclean-tags -@@ -1790,7 +1802,7 @@ installcheck-am: - maintainer-clean: maintainer-clean-recursive - 	-rm -f $(am__CONFIG_DISTCLEAN_FILES) - 	-rm -rf $(top_srcdir)/autom4te.cache --	-rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) -+	-rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) - 	-rm -f Makefile - maintainer-clean-am: distclean-am maintainer-clean-aminfo \ - 	maintainer-clean-generic maintainer-clean-vti -diff --git a/README b/README -index bcc7178..ec240a4 100644 ---- a/README -+++ b/README -@@ -1,8 +1,8 @@ - Status - ====== -  --libffi-3.0.11 was released on April 11, 2012.  Check the libffi web --page for updates: <URL:http://sourceware.org/libffi/>. -+libffi-3.0.XX was released on XXXXXXX.  Check the libffi web page for -+updates: <URL:http://sourceware.org/libffi/>. -  -  - What is libffi? -@@ -56,6 +56,7 @@ tested: - | ARM          | Linux            | - | ARM          | iOS              | - | AVR32        | Linux            | -+| Blackfin     | uClinux          | - | HPPA         | HPUX             | - | IA-64        | Linux            | - | M68K         | FreeMiNT         | -@@ -148,6 +149,9 @@ History -  - See the ChangeLog files for details. -  -+3.0.12 XXX-XX-XX -+        Add Blackfin support. -+ - 3.0.11 Apr-11-12 -         Add support for variadic functions (ffi_prep_cif_var). - 	Add Linux/x32 support. -diff --git a/configure b/configure -index 91b2317..4ccba55 100755 ---- a/configure -+++ b/configure -@@ -679,6 +679,8 @@ X86_FALSE - X86_TRUE - SPARC_FALSE - SPARC_TRUE -+BFIN_FALSE -+BFIN_TRUE - MIPS_FALSE - MIPS_TRUE - AM_LTLDFLAGS -@@ -6840,14 +6842,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - 	    LD="${LD-ld} -m elf_i386_fbsd" - 	    ;; - 	  x86_64-*linux*) --	    case `/usr/bin/file conftest.o` in --	      *x86-64*) --	         LD="${LD-ld} -m elf32_x86_64" --	         ;; --	      *) --	         LD="${LD-ld} -m elf_i386" --	         ;; --	    esac -+	    LD="${LD-ld} -m elf_i386" - 	    ;; - 	  ppc64-*linux*|powerpc64-*linux*) - 	    LD="${LD-ld} -m elf32ppclinux" -@@ -8418,10 +8413,6 @@ _lt_linker_boilerplate=`cat conftest.err` - $RM -r conftest* -  -  --## CAVEAT EMPTOR: --## There is no encapsulation within the following macros, do not change --## the running order or otherwise move them around unless you know exactly --## what you are doing... - if test -n "$compiler"; then -  - lt_prog_compiler_no_builtin_flag= -@@ -10972,10 +10963,14 @@ fi -   # before this can be enabled. -   hardcode_into_libs=yes -  -+  # Add ABI-specific directories to the system library path. -+  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib" -+ -   # Append ld.so.conf contents to the search path -   if test -f /etc/ld.so.conf; then -     lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` --    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" -+    sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" -+ -   fi -  -   # We used to test for /lib/ld.so.1 and disable shared libraries on -@@ -12419,7 +12414,7 @@ if test "x$ax_gcc_arch" = xyes; then - ax_gcc_arch="" - if test "$cross_compiling" = no; then - case $host_cpu in --  i[3456]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones -+  i[3456]86*|x86_64*) # use cpuid codes -  - ac_ext=c - ac_cpp='$CPP $CPPFLAGS' -@@ -12535,18 +12530,24 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -           case $ax_cv_gcc_x86_cpuid_1 in - 	    *5[48]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;; - 	    *5??:*:*:*) ax_gcc_arch=pentium ;; --	    *6[3456]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; --	    *6a?:*[01]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; --	    *6a?:*[234]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; --	    *6[9d]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;; --	    *6[78b]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; --	    *6??:*:*:*) ax_gcc_arch=pentiumpro ;; --            *f3[347]:*:*:*|*f41347:*:*:*) -+	    *0?6[3456]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; -+	    *0?6a?:*[01]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; -+	    *0?6a?:*[234]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; -+	    *0?6[9de]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;; -+	    *0?6[78b]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; -+	    *0?6f?:*:*:*|*1?66?:*:*:*) ax_gcc_arch="core2 pentium-m pentium3 pentiumpro" ;; -+	    *1?6[7d]?:*:*:*) ax_gcc_arch="penryn core2 pentium-m pentium3 pentiumpro" ;; -+	    *1?6[aef]?:*:*:*|*2?6[5cef]?:*:*:*) ax_gcc_arch="corei7 core2 pentium-m pentium3 pentiumpro" ;; -+	    *1?6c?:*:*:*|*[23]?66?:*:*:*) ax_gcc_arch="atom core2 pentium-m pentium3 pentiumpro" ;; -+	    *2?6[ad]?:*:*:*) ax_gcc_arch="corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; -+	    *0?6??:*:*:*) ax_gcc_arch=pentiumpro ;; -+	    *6??:*:*:*) ax_gcc_arch="core2 pentiumpro" ;; -+	    ?000?f3[347]:*:*:*|?000?f41347:*:*:*|?000?f6?:*:*:*) - 		case $host_cpu in --                  x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;; --                  *) ax_gcc_arch="prescott pentium4 pentiumpro" ;; --                esac ;; --            *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";; -+	          x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;; -+	          *) ax_gcc_arch="prescott pentium4 pentiumpro" ;; -+	        esac ;; -+	    ?000?f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";; -           esac ;; -        *:68747541:*:*) # AMD -           case $ax_cv_gcc_x86_cpuid_1 in -@@ -12618,10 +12619,13 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu - 			ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;; -                  *) ax_gcc_arch="athlon-4 athlon k7" ;; - 	       esac ;; --	    *f[4cef8b]?:*:*:*) ax_gcc_arch="athlon64 k8" ;; --	    *f5?:*:*:*) ax_gcc_arch="opteron k8" ;; --	    *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;; --	    *f??:*:*:*) ax_gcc_arch="k8" ;; -+	    ?00??f[4cef8b]?:*:*:*) ax_gcc_arch="athlon64 k8" ;; -+	    ?00??f5?:*:*:*) ax_gcc_arch="opteron k8" ;; -+	    ?00??f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;; -+	    ?00??f??:*:*:*) ax_gcc_arch="k8" ;; -+	    ?05??f??:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; -+	    ?06??f??:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; -+	    *f??:*:*:*) ax_gcc_arch="amdfam10 k8" ;; -           esac ;; - 	*:746e6543:*:*) # IDT - 	   case $ax_cv_gcc_x86_cpuid_1 in -@@ -13150,6 +13154,10 @@ case "$host" in - 	TARGET=AVR32; TARGETDIR=avr32 - 	;; -  -+  bfin*) -+  	TARGET=BFIN; TARGETDIR=bfin -+  	;; -+ -   cris-*-*) - 	TARGET=LIBFFI_CRIS; TARGETDIR=cris - 	;; -@@ -13295,6 +13303,14 @@ else -   MIPS_FALSE= - fi -  -+ if test x$TARGET = xBFIN; then -+  BFIN_TRUE= -+  BFIN_FALSE='#' -+else -+  BFIN_TRUE='#' -+  BFIN_FALSE= -+fi -+ -  if test x$TARGET = xSPARC; then -   SPARC_TRUE= -   SPARC_FALSE='#' -@@ -14134,40 +14150,7 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h -  esac -  -  --{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .cfi pseudo-op support" >&5 --$as_echo_n "checking assembler .cfi pseudo-op support... " >&6; } --if ${gcc_cv_as_cfi_pseudo_op+:} false; then : --  $as_echo_n "(cached) " >&6 --else -- --    gcc_cv_as_cfi_pseudo_op=unknown --    cat confdefs.h - <<_ACEOF >conftest.$ac_ext --/* end confdefs.h.  */ --asm (".cfi_startproc\n\t.cfi_endproc"); --int --main () --{ -- --  ; --  return 0; --} --_ACEOF --if ac_fn_c_try_compile "$LINENO"; then : --  gcc_cv_as_cfi_pseudo_op=yes --else --  gcc_cv_as_cfi_pseudo_op=no --fi --rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -- --fi --{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_cfi_pseudo_op" >&5 --$as_echo "$gcc_cv_as_cfi_pseudo_op" >&6; } -- if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then -- --$as_echo "#define HAVE_AS_CFI_PSEUDO_OP 1" >>confdefs.h -- -- fi -- -+GCC_AS_CFI_PSEUDO_OP -  - if test x$TARGET = xSPARC; then -     { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler and linker support unaligned pc related relocs" >&5 -@@ -14739,6 +14722,10 @@ if test -z "${MIPS_TRUE}" && test -z "${MIPS_FALSE}"; then -   as_fn_error $? "conditional \"MIPS\" was never defined. - Usually this means the macro was only invoked conditionally." "$LINENO" 5 - fi -+if test -z "${BFIN_TRUE}" && test -z "${BFIN_FALSE}"; then -+  as_fn_error $? "conditional \"BFIN\" was never defined. -+Usually this means the macro was only invoked conditionally." "$LINENO" 5 -+fi - if test -z "${SPARC_TRUE}" && test -z "${SPARC_FALSE}"; then -   as_fn_error $? "conditional \"SPARC\" was never defined. - Usually this means the macro was only invoked conditionally." "$LINENO" 5 -diff --git a/configure.ac b/configure.ac -index 1021769..9b946a2 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -75,6 +75,10 @@ case "$host" in - 	TARGET=AVR32; TARGETDIR=avr32 - 	;; -  -+  bfin*) -+  	TARGET=BFIN; TARGETDIR=bfin -+  	;; -+ -   cris-*-*) - 	TARGET=LIBFFI_CRIS; TARGETDIR=cris - 	;; -@@ -213,6 +217,7 @@ if test $TARGETDIR = unknown; then - fi -  - AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS) -+AM_CONDITIONAL(BFIN, test x$TARGET = xBFIN) - AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC) - AM_CONDITIONAL(X86, test x$TARGET = xX86) - AM_CONDITIONAL(X86_FREEBSD, test x$TARGET = xX86_FREEBSD) -diff --git a/src/bfin/ffi.c b/src/bfin/ffi.c -new file mode 100644 -index 0000000..0beccc1 ---- /dev/null -+++ b/src/bfin/ffi.c -@@ -0,0 +1,195 @@ -+/* ----------------------------------------------------------------------- -+   ffi.c - Copyright (c) 2012  Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com> -+ -+   Blackfin Foreign Function Interface -+ -+   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. -+   ----------------------------------------------------------------------- */ -+#include <ffi.h> -+#include <ffi_common.h> -+ -+#include <stdlib.h> -+#include <stdio.h> -+ -+/* Maximum number of GPRs available for argument passing.  */ -+#define MAX_GPRARGS 3 -+ -+/* -+ * Return types -+ */ -+#define FFIBFIN_RET_VOID 0 -+#define FFIBFIN_RET_BYTE 1 -+#define FFIBFIN_RET_HALFWORD 2 -+#define FFIBFIN_RET_INT64 3 -+#define FFIBFIN_RET_INT32 4 -+ -+/*====================================================================*/ -+/*                          PROTOTYPE          * -+ /*====================================================================*/ -+void ffi_prep_args(unsigned char *, extended_cif *); -+ -+/*====================================================================*/ -+/*                          Externals                                 */ -+/*                          (Assembly)                                */ -+/*====================================================================*/ -+ -+extern void ffi_call_SYSV(unsigned, extended_cif *, void(*)(unsigned char *, extended_cif *), unsigned, void *, void(*fn)(void)); -+ -+/*====================================================================*/ -+/*                          Implementation                            */ -+/*                                                            */ -+/*====================================================================*/ -+ -+ -+/* -+ * This function calculates the return type (size) based on type. -+ */ -+ -+ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -+{ -+   /* --------------------------------------* -+    *   Return handling                * -+    * --------------------------------------*/ -+   switch (cif->rtype->type) { -+      case FFI_TYPE_VOID: -+         cif->flags = FFIBFIN_RET_VOID; -+         break; -+      case FFI_TYPE_UINT16: -+      case FFI_TYPE_SINT16: -+         cif->flags = FFIBFIN_RET_HALFWORD; -+         break; -+      case FFI_TYPE_UINT8: -+         cif->flags = FFIBFIN_RET_BYTE; -+         break; -+      case FFI_TYPE_INT: -+      case FFI_TYPE_UINT32: -+      case FFI_TYPE_SINT32: -+      case FFI_TYPE_FLOAT: -+      case FFI_TYPE_POINTER: -+      case FFI_TYPE_SINT8: -+         cif->flags = FFIBFIN_RET_INT32; -+         break; -+      case FFI_TYPE_SINT64: -+      case FFI_TYPE_UINT64: -+      case FFI_TYPE_DOUBLE: -+          cif->flags = FFIBFIN_RET_INT64; -+          break; -+      case FFI_TYPE_STRUCT: -+         if (cif->rtype->size <= 4){ -+        	 cif->flags = FFIBFIN_RET_INT32; -+         }else if (cif->rtype->size == 8){ -+        	 cif->flags = FFIBFIN_RET_INT64; -+         }else{ -+        	 //it will return via a hidden pointer in P0 -+        	 cif->flags = FFIBFIN_RET_VOID; -+         } -+         break; -+      default: -+         FFI_ASSERT(0); -+         break; -+   } -+   return FFI_OK; -+} -+ -+/* -+ * This will prepare the arguments and will call the assembly routine -+ * cif = the call interface -+ * fn = the function to be called -+ * rvalue = the return value -+ * avalue = the arguments -+ */ -+void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue) -+{ -+   int ret_type = cif->flags; -+   extended_cif ecif; -+   ecif.cif = cif; -+   ecif.avalue = avalue; -+   ecif.rvalue = rvalue; -+ -+   switch (cif->abi) { -+      case FFI_SYSV: -+         ffi_call_SYSV(cif->bytes, &ecif, ffi_prep_args, ret_type, ecif.rvalue, fn); -+         break; -+      default: -+         FFI_ASSERT(0); -+         break; -+   } -+} -+ -+ -+/* -+* This function prepares the parameters (copies them from the ecif to the stack) -+*  to call the function (ffi_prep_args is called by the assembly routine in file -+*  sysv.S, which also calls the actual function) -+*/ -+void ffi_prep_args(unsigned char *stack, extended_cif *ecif) -+{ -+   register unsigned int i = 0; -+   void **p_argv; -+   unsigned char *argp; -+   ffi_type **p_arg; -+   argp = stack; -+   p_argv = ecif->avalue; -+   for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; -+        (i != 0); -+        i--, p_arg++) { -+      size_t z; -+      z = (*p_arg)->size; -+      if (z < sizeof(int)) { -+         z = sizeof(int); -+         switch ((*p_arg)->type) { -+            case FFI_TYPE_SINT8: { -+                  signed char v = *(SINT8 *)(* p_argv); -+                  signed int t = v; -+                  *(signed int *) argp = t; -+               } -+               break; -+            case FFI_TYPE_UINT8: { -+                  unsigned char v = *(UINT8 *)(* p_argv); -+                  unsigned int t = v; -+                  *(unsigned int *) argp = t; -+               } -+               break; -+            case FFI_TYPE_SINT16: -+               *(signed int *) argp = (signed int) * (SINT16 *)(* p_argv); -+               break; -+            case FFI_TYPE_UINT16: -+               *(unsigned int *) argp = (unsigned int) * (UINT16 *)(* p_argv); -+               break; -+            case FFI_TYPE_STRUCT: -+               memcpy(argp, *p_argv, (*p_arg)->size); -+               break; -+            default: -+               FFI_ASSERT(0); -+               break; -+         } -+      } else if (z == sizeof(int)) { -+         *(unsigned int *) argp = (unsigned int) * (UINT32 *)(* p_argv); -+      } else { -+         memcpy(argp, *p_argv, z); -+      } -+      p_argv++; -+      argp += z; -+   } -+} -+ -+ -+ -diff --git a/src/bfin/ffitarget.h b/src/bfin/ffitarget.h -new file mode 100644 -index 0000000..2175c01 ---- /dev/null -+++ b/src/bfin/ffitarget.h -@@ -0,0 +1,43 @@ -+/* ----------------------------------------------------------------------- -+   ffitarget.h - Copyright (c) 2012  Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com> -+ -+   Blackfin Foreign Function Interface -+ -+   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_ASM -+typedef unsigned long          ffi_arg; -+typedef signed 	 long          ffi_sarg; -+ -+typedef enum ffi_abi { -+  FFI_FIRST_ABI = 0, -+  FFI_SYSV, -+  FFI_LAST_ABI, -+  FFI_DEFAULT_ABI = FFI_SYSV -+} ffi_abi; -+#endif -+ -+#endif -+ -diff --git a/src/bfin/sysv.S b/src/bfin/sysv.S -new file mode 100644 -index 0000000..ae7a152 ---- /dev/null -+++ b/src/bfin/sysv.S -@@ -0,0 +1,177 @@ -+/* ----------------------------------------------------------------------- -+   sysv.S - Copyright (c) 2012  Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com> -+ -+   Blackfin Foreign Function Interface -+ -+   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. -+   ----------------------------------------------------------------------- */ -+ -+#define LIBFFI_ASM -+#include <fficonfig.h> -+#include <ffi.h> -+ -+.text -+.align 4 -+ -+	/* -+	 There is a "feature" in the bfin toolchain that it puts a _ before funcion names -+	 that's why the function here it's called _ffi_call_SYSV and not ffi_call_SYSV -+	 */ -+	.global _ffi_call_SYSV; -+	.type _ffi_call_SYSV, STT_FUNC; -+	.func ffi_call_SYSV -+ -+	/* -+	cif->bytes  	= R0	(fp+8) -+	&ecif			= R1	(fp+12) -+	ffi_prep_args	= R2	(fp+16) -+	ret_type		= stack (fp+20) -+	ecif.rvalue		= stack (fp+24) -+	fn				= stack	(fp+28) -+					  got	(fp+32) -+    There is room for improvement here (we can use temporary registers -+        instead of saving the values in the memory) -+	REGS: -+		P5 => Stack pointer (function arguments) -+		R5 => cif->bytes -+		R4 => ret->type -+ -+		FP-20 = P3 -+		FP-16 = SP (parameters area) -+		FP-12 = SP (temp) -+		FP-08 = function return part 1 [R0] -+		FP-04 = function return part 2 [R1] -+	*/ -+ -+_ffi_call_SYSV: -+.prologue: -+	LINK 20; -+	[FP-20] = P3; -+	[FP+8] = R0; -+	[FP+12] = R1; -+	[FP+16] = R2; -+ -+.allocate_stack: -+	//alocate cif->bytes into the stack -+	R1 = [FP+8]; -+	R0 = SP; -+	R0 = R0 - R1; -+	R1 = 4; -+	R0 = R0 - R1; -+	[FP-12] = SP; -+	SP = R0; -+	[FP-16] = SP; -+ -+.call_prep_args: -+	//get the addr of prep_args -+	P0 = [P3 + _ffi_prep_args@FUNCDESC_GOT17M4]; -+	P1 = [P0]; -+	P3 = [P0+4]; -+	R0 = [FP-16];//SP (parameter area) -+	R1 = [FP+12];//ecif -+	call (P1); -+ -+.call_user_function: -+	//ajust SP so as to allow the user function access the parameters on the stack -+	SP = [FP-16]; //point to function parameters -+	R0 = [SP]; -+	R1 = [SP+4]; -+	R2 = [SP+8]; -+	//load user function address -+	P0 = FP; -+	P0 +=28; -+	P1 = [P0]; -+	P1 = [P1]; -+	P3 = [P0+4]; -+	/* -+		For functions returning aggregate values (struct) occupying more than 8 bytes, -+		the caller allocates the return value object on the stack and the address -+		of this object is passed to the callee as a hidden argument in register P0. -+	*/ -+	P0 = [FP+24]; -+ -+	call (P1); -+	SP = [FP-12]; -+.compute_return: -+	P2 = [FP-20]; -+	[FP-8] = R0; -+	[FP-4] = R1; -+ -+	R0 = [FP+20]; -+	R1 = R0 << 2; -+ -+	R0 = [P2+.rettable@GOT17M4]; -+	R0 = R1 + R0; -+	P2 = R0; -+	R1 = [P2]; -+ -+	P2 = [FP+-20]; -+	R0 = [P2+.rettable@GOT17M4]; -+	R0 = R1 + R0; -+	P2 = R0; -+	R0 = [FP-8]; -+	R1 = [FP-4]; -+	jump (P2); -+ -+/* -+#define FFIBFIN_RET_VOID 0 -+#define FFIBFIN_RET_BYTE 1 -+#define FFIBFIN_RET_HALFWORD 2 -+#define FFIBFIN_RET_INT64 3 -+#define FFIBFIN_RET_INT32 4 -+*/ -+.align 4 -+.align 4 -+.rettable: -+	.dd .epilogue - .rettable -+	.dd	.rbyte - .rettable; -+	.dd	.rhalfword - .rettable; -+	.dd	.rint64 - .rettable; -+	.dd	.rint32 - .rettable; -+ -+.rbyte: -+	P0 = [FP+24]; -+	R0 = R0.B (Z); -+	[P0] = R0; -+	JUMP .epilogue -+.rhalfword: -+	P0 = [FP+24]; -+	R0 = R0.L; -+	[P0] = R0; -+	JUMP .epilogue -+.rint64: -+	P0 = [FP+24];// &rvalue -+	[P0] = R0; -+	[P0+4] = R1; -+	JUMP .epilogue -+.rint32: -+	P0 = [FP+24]; -+	[P0] = R0; -+.epilogue: -+	R0 = [FP+8]; -+	R1 = [FP+12]; -+	R2 = [FP+16]; -+	P3 = [FP-20]; -+	UNLINK; -+	RTS; -+ -+.size _ffi_call_SYSV,.-_ffi_call_SYSV; -+.endfunc ---  -1.7.9.5 - diff --git a/package/libffi/libffi-0002-Add-aarch64-support-from-upstream.patch b/package/libffi/libffi-0002-Add-aarch64-support-from-upstream.patch deleted file mode 100644 index a4071302a..000000000 --- a/package/libffi/libffi-0002-Add-aarch64-support-from-upstream.patch +++ /dev/null @@ -1,2326 +0,0 @@ -From c77c9625dd63138512ce0f67e07dd254771e566f Mon Sep 17 00:00:00 2001 -From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> -Date: Fri, 16 Nov 2012 01:15:28 +0100 -Subject: [PATCH 2/2] Add aarch64 support from upstream - -Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> ---- - ChangeLog                |   27 ++ - Makefile.am              |    4 + - Makefile.in              |   44 +- - README                   |    3 + - configure                |  185 +++++--- - configure.ac             |    5 + - src/aarch64/ffi.c        | 1076 ++++++++++++++++++++++++++++++++++++++++++++++ - src/aarch64/ffitarget.h  |   59 +++ - src/aarch64/sysv.S       |  307 +++++++++++++ - testsuite/lib/libffi.exp |    4 + - 10 files changed, 1647 insertions(+), 67 deletions(-) - create mode 100644 src/aarch64/ffi.c - create mode 100644 src/aarch64/ffitarget.h - create mode 100644 src/aarch64/sysv.S - -diff --git a/ChangeLog b/ChangeLog -index 376edf7..4e8ea91 100644 ---- a/ChangeLog -+++ b/ChangeLog -@@ -1,3 +1,30 @@ -+2012-10-30  James Greenhalgh  <james.greenhalgh at arm.com> -+            Marcus Shawcroft  <marcus.shawcroft at arm.com> -+ -+        * README: Add details of aarch64 port. -+        * src/aarch64/ffi.c: New. -+        * src/aarch64/ffitarget.h: Likewise. -+        * src/aarch64/sysv.S: Likewise. -+	* Makefile.am: Support aarch64. -+	* configure.ac: Support aarch64. -+	* Makefile.in, configure: Rebuilt. -+ -+2012-10-30  James Greenhalgh  <james.greenhalgh at arm.com> -+            Marcus Shawcroft  <marcus.shawcroft at arm.com> -+ -+        * testsuite/lib/libffi.exp: Add support for aarch64. -+        * testsuite/libffi.call/cls_struct_va1.c: New. -+        * testsuite/libffi.call/cls_uchar_va.c: Likewise. -+        * testsuite/libffi.call/cls_uint_va.c: Likewise. -+        * testsuite/libffi.call/cls_ulong_va.c: Liekwise. -+        * testsuite/libffi.call/cls_ushort_va.c: Likewise. -+        * testsuite/libffi.call/nested_struct11.c: Likewise. -+        * testsuite/libffi.call/uninitialized.c: Likewise. -+        * testsuite/libffi.call/va_1.c: Likewise. -+        * testsuite/libffi.call/va_struct1.c: Likewise. -+        * testsuite/libffi.call/va_struct2.c: Likewise. -+        * testsuite/libffi.call/va_struct3.c: Likewise. -+ - 2012-04-23  Alexandre Keunecke I. de Mendonca <alexandre.keunecke@gmail.com> -  - 	* configure.ac: Add Blackfin/sysv support -diff --git a/Makefile.am b/Makefile.am -index 16f32a6..bd4d5c4 100644 ---- a/Makefile.am -+++ b/Makefile.am -@@ -5,6 +5,7 @@ AUTOMAKE_OPTIONS = foreign subdir-objects - SUBDIRS = include testsuite man -  - EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \ -+	src/aarch64/ffi.c src/aarch64/ffitarget.h \ - 	src/alpha/ffi.c src/alpha/osf.S src/alpha/ffitarget.h \ - 	src/arm/ffi.c src/arm/sysv.S src/arm/ffitarget.h \ - 	src/avr32/ffi.c src/avr32/sysv.S src/avr32/ffitarget.h \ -@@ -151,6 +152,9 @@ endif - if POWERPC_FREEBSD - nodist_libffi_la_SOURCES += src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S - endif -+if AARCH64 -+nodist_libffi_la_SOURCES += src/aarch64/sysv.S src/aarch64/ffi.c -+endif - if ARM - nodist_libffi_la_SOURCES += src/arm/sysv.S src/arm/ffi.c - if FFI_EXEC_TRAMPOLINE_TABLE -diff --git a/Makefile.in b/Makefile.in -index f5c10af..c4f4470 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -65,9 +65,10 @@ target_triplet = @target@ - @SH64_TRUE@am__append_27 = src/sh64/sysv.S src/sh64/ffi.c - @PA_LINUX_TRUE@am__append_28 = src/pa/linux.S src/pa/ffi.c - @PA_HPUX_TRUE@am__append_29 = src/pa/hpux32.S src/pa/ffi.c -+@AARCH64_TRUE@am__append_30 = src/aarch64/sysv.S src/aarch64/ffi.c - # Build debug. Define FFI_DEBUG on the commandline so that, when building with - # MSVC, it can link against the debug CRT. --@FFI_DEBUG_TRUE@am__append_30 = -DFFI_DEBUG -+@FFI_DEBUG_TRUE@am__append_31 = -DFFI_DEBUG - subdir = . - DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ - 	$(srcdir)/Makefile.in $(srcdir)/doc/stamp-vti \ -@@ -156,6 +157,7 @@ am_libffi_la_OBJECTS = src/prep_cif.lo src/types.lo src/raw_api.lo \ - @SH64_TRUE@am__objects_27 = src/sh64/sysv.lo src/sh64/ffi.lo - @PA_LINUX_TRUE@am__objects_28 = src/pa/linux.lo src/pa/ffi.lo - @PA_HPUX_TRUE@am__objects_29 = src/pa/hpux32.lo src/pa/ffi.lo -+@AARCH64_TRUE@am__objects_29 = src/aarch64/sysv.lo src/aarch64/ffi.lo - nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ - 	$(am__objects_3) $(am__objects_4) $(am__objects_5) \ - 	$(am__objects_6) $(am__objects_7) $(am__objects_8) \ -@@ -165,17 +167,18 @@ nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \ - 	$(am__objects_18) $(am__objects_19) $(am__objects_20) \ - 	$(am__objects_21) $(am__objects_22) $(am__objects_23) \ - 	$(am__objects_24) $(am__objects_25) $(am__objects_26) \ --	$(am__objects_27) $(am__objects_28) $(am__objects_29) -+	$(am__objects_27) $(am__objects_28) $(am__objects_29) \ -+	$(am__objects_30) - libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \ - 	$(nodist_libffi_la_OBJECTS) - libffi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ - 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - 	$(libffi_la_LDFLAGS) $(LDFLAGS) -o $@ - libffi_convenience_la_LIBADD = --am__objects_30 = src/prep_cif.lo src/types.lo src/raw_api.lo \ -+am__objects_31 = src/prep_cif.lo src/types.lo src/raw_api.lo \ - 	src/java_raw_api.lo src/closures.lo --am_libffi_convenience_la_OBJECTS = $(am__objects_30) --am__objects_31 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ -+am_libffi_convenience_la_OBJECTS = $(am__objects_31) -+am__objects_32 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ - 	$(am__objects_4) $(am__objects_5) $(am__objects_6) \ - 	$(am__objects_7) $(am__objects_8) $(am__objects_9) \ - 	$(am__objects_10) $(am__objects_11) $(am__objects_12) \ -@@ -185,7 +188,7 @@ am__objects_31 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \ - 	$(am__objects_22) $(am__objects_23) $(am__objects_24) \ - 	$(am__objects_25) $(am__objects_26) $(am__objects_27) \ - 	$(am__objects_28) $(am__objects_29) --nodist_libffi_convenience_la_OBJECTS = $(am__objects_31) -+nodist_libffi_convenience_la_OBJECTS = $(am__objects_32) - libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \ - 	$(nodist_libffi_convenience_la_OBJECTS) - DEFAULT_INCLUDES = -I.@am__isrc@ -@@ -410,6 +413,7 @@ top_srcdir = @top_srcdir@ - AUTOMAKE_OPTIONS = foreign subdir-objects - SUBDIRS = include testsuite man - EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj configure.host \ -+	src/aarch64/ffi.c src/aarch64/ffitarget.h \ - 	src/alpha/ffi.c src/alpha/osf.S src/alpha/ffitarget.h \ - 	src/arm/ffi.c src/arm/sysv.S src/arm/ffitarget.h \ - 	src/avr32/ffi.c src/avr32/sysv.S src/avr32/ffitarget.h \ -@@ -501,10 +505,11 @@ nodist_libffi_la_SOURCES = $(am__append_1) $(am__append_2) \ - 	$(am__append_18) $(am__append_19) $(am__append_20) \ - 	$(am__append_21) $(am__append_22) $(am__append_23) \ - 	$(am__append_24) $(am__append_25) $(am__append_26) \ --	$(am__append_27) $(am__append_28) $(am__append_29) -+	$(am__append_27) $(am__append_28) $(am__append_29) \ -+	$(am__append_30) - libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) - nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) --AM_CFLAGS = -g $(am__append_30) -+AM_CFLAGS = -g $(am__append_31) - libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS) - AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src -DFFI_BUILDING - AM_CCASFLAGS = $(AM_CPPFLAGS) -g -@@ -640,6 +645,16 @@ src/bfin/ffi.lo: src/bfin/$(am__dirstamp) \ - 	src/bfin/$(DEPDIR)/$(am__dirstamp) - src/bfin/sysv.lo: src/bfin/$(am__dirstamp) \ - 	src/bfin/$(DEPDIR)/$(am__dirstamp) -+src/aarch64/$(am__dirstamp): -+	@$(MKDIR_P) src/aarch64 -+	@: > src/aarch64/$(am__dirstamp) -+src/aarch64/$(DEPDIR)/$(am__dirstamp): -+	@$(MKDIR_P) src/aarch64/$(DEPDIR) -+	@: > src/aarch64/$(DEPDIR)/$(am__dirstamp) -+src/aarch64/ffi.lo: src/aarch64/$(am__dirstamp) \ -+	src/aarch64/$(DEPDIR)/$(am__dirstamp) -+src/aarch64/sysv.lo: src/aarch64/$(am__dirstamp) \ -+	src/aarch64/$(DEPDIR)/$(am__dirstamp) - src/x86/$(am__dirstamp): - 	@$(MKDIR_P) src/x86 - 	@: > src/x86/$(am__dirstamp) -@@ -859,6 +874,10 @@ mostlyclean-compile: - 	-rm -f src/bfin/ffi.lo - 	-rm -f src/bfin/sysv.$(OBJEXT) - 	-rm -f src/bfin/sysv.lo -+	-rm -f src/aarch64/ffi.$(OBJEXT) -+	-rm -f src/aarch64/ffi.lo -+	-rm -f src/aarch64/sysv.$(OBJEXT) -+	-rm -f src/aarch64/sysv.lo - 	-rm -f src/closures.$(OBJEXT) - 	-rm -f src/closures.lo - 	-rm -f src/cris/ffi.$(OBJEXT) -@@ -973,6 +992,8 @@ distclean-compile: - @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/prep_cif.Plo@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/raw_api.Plo@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/types.Plo@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@src/aarch64/$(DEPDIR)/ffi.Plo@am__quote@ -+@AMDEP_TRUE@@am__include@ @am__quote@src/aarch64/$(DEPDIR)/sysv.Plo@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/ffi.Plo@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/osf.Plo@am__quote@ - @AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/ffi.Plo@am__quote@ -@@ -1083,6 +1104,7 @@ mostlyclean-libtool: - clean-libtool: - 	-rm -rf .libs _libs - 	-rm -rf src/.libs src/_libs -+	-rm -rf src/aarch64/.libs src/aarch64/_libs - 	-rm -rf src/alpha/.libs src/alpha/_libs - 	-rm -rf src/arm/.libs src/arm/_libs - 	-rm -rf src/avr32/.libs src/avr32/_libs -@@ -1635,6 +1657,8 @@ distclean-generic: - 	-rm -f doc/$(am__dirstamp) - 	-rm -f src/$(DEPDIR)/$(am__dirstamp) - 	-rm -f src/$(am__dirstamp) -+	-rm -f src/aarch64/$(DEPDIR)/$(am__dirstamp) -+	-rm -f src/aarch64/$(am__dirstamp) - 	-rm -f src/alpha/$(DEPDIR)/$(am__dirstamp) - 	-rm -f src/alpha/$(am__dirstamp) - 	-rm -f src/arm/$(DEPDIR)/$(am__dirstamp) -@@ -1682,7 +1706,7 @@ clean-am: clean-aminfo clean-generic clean-libLTLIBRARIES \ -  - distclean: distclean-recursive - 	-rm -f $(am__CONFIG_DISTCLEAN_FILES) --	-rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) -+	-rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) - 	-rm -f Makefile - distclean-am: clean-am distclean-compile distclean-generic \ - 	distclean-hdr distclean-libtool distclean-tags -@@ -1802,7 +1826,7 @@ installcheck-am: - maintainer-clean: maintainer-clean-recursive - 	-rm -f $(am__CONFIG_DISTCLEAN_FILES) - 	-rm -rf $(top_srcdir)/autom4te.cache --	-rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) -+	-rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR) - 	-rm -f Makefile - maintainer-clean-am: distclean-am maintainer-clean-aminfo \ - 	maintainer-clean-generic maintainer-clean-vti -diff --git a/README b/README -index ec240a4..9aa99f4 100644 ---- a/README -+++ b/README -@@ -51,6 +51,7 @@ tested: - |--------------+------------------| - | Architecture | Operating System | - |--------------+------------------| -+| AArch64         | Linux            | - | Alpha        | Linux            | - | Alpha        | Tru64            | - | ARM          | Linux            | -@@ -151,6 +152,7 @@ See the ChangeLog files for details. -  - 3.0.12 XXX-XX-XX -         Add Blackfin support. -+	Add AArch64 support. -  - 3.0.11 Apr-11-12 -         Add support for variadic functions (ffi_prep_cif_var). -@@ -320,6 +322,7 @@ Thorup. - Major processor architecture ports were contributed by the following - developers: -  -+aarch64		Marcus Shawcroft, James Greenhalgh - alpha		Richard Henderson - arm		Raffaele Sena - cris		Simon Posnjak, Hans-Peter Nilsson -diff --git a/configure b/configure -index 4ccba55..419275b 100755 ---- a/configure -+++ b/configure -@@ -649,6 +649,8 @@ AVR32_FALSE - AVR32_TRUE - ARM_FALSE - ARM_TRUE -+AARCH64_FALSE -+AARCH64_TRUE - POWERPC_FREEBSD_FALSE - POWERPC_FREEBSD_TRUE - POWERPC_DARWIN_FALSE -@@ -1478,7 +1480,7 @@ Optional Features: - Optional Packages: -   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes] -   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no) --  --with-pic              try to use only PIC/non-PIC objects [default=use -+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use -                           both] -   --with-gnu-ld           assume the C compiler uses GNU ld [default=no] -   --with-sysroot=DIR Search for dependent libraries within DIR -@@ -5276,6 +5278,11 @@ else -     lt_cv_sys_max_cmd_len=196608 -     ;; -  -+  os2*) -+    # The test takes a long time on OS/2. -+    lt_cv_sys_max_cmd_len=8192 -+    ;; -+ -   osf*) -     # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure -     # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not -@@ -5315,7 +5322,7 @@ else -       # If test is not a shell built-in, we'll probably end up computing a -       # maximum length that is only half of the actual maximum length, but -       # we can't tell. --      while { test "X"`func_fallback_echo "$teststring$teststring" 2>/dev/null` \ -+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - 	         = "X$teststring$teststring"; } >/dev/null 2>&1 && - 	      test $i != 17 # 1/2 MB should be enough -       do -@@ -5744,7 +5751,7 @@ irix5* | irix6* | nonstopux*) -   lt_cv_deplibs_check_method=pass_all -   ;; -  --# This must be Linux ELF. -+# This must be glibc/ELF. - linux* | k*bsd*-gnu | kopensolaris*-gnu) -   lt_cv_deplibs_check_method=pass_all -   ;; -@@ -6538,6 +6545,7 @@ for ac_symprfx in "" "_"; do -     # which start with @ or ?. -     lt_cv_sys_global_symbol_pipe="$AWK '"\ - "     {last_section=section; section=\$ 3};"\ -+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ - "     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ - "     \$ 0!~/External *\|/{next};"\ - "     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -@@ -6926,7 +6934,7 @@ $as_echo "$lt_cv_cc_needs_belf" >&6; } -     CFLAGS="$SAVE_CFLAGS" -   fi -   ;; --sparc*-*solaris*) -+*-*solaris*) -   # Find out which ABI we are using. -   echo 'int i;' > conftest.$ac_ext -   if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 -@@ -6937,7 +6945,20 @@ sparc*-*solaris*) -     case `/usr/bin/file conftest.o` in -     *64-bit*) -       case $lt_cv_prog_gnu_ld in --      yes*) LD="${LD-ld} -m elf64_sparc" ;; -+      yes*) -+        case $host in -+        i?86-*-solaris*) -+          LD="${LD-ld} -m elf_x86_64" -+          ;; -+        sparc*-*-solaris*) -+          LD="${LD-ld} -m elf64_sparc" -+          ;; -+        esac -+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available. -+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then -+          LD="${LD-ld}_sol2" -+        fi -+        ;; -       *) - 	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - 	  LD="${LD-ld} -64" -@@ -7577,7 +7598,13 @@ else - 	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - 	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err -         _lt_result=$? --	if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then -+	# If there is a non-empty error log, and "single_module" -+	# appears in it, assume the flag caused a linker warning -+        if test -s conftest.err && $GREP single_module conftest.err; then -+	  cat conftest.err >&5 -+	# Otherwise, if the output was created with a 0 exit code from -+	# the compiler, it worked. -+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then - 	  lt_cv_apple_cc_single_mod=yes - 	else - 	  cat conftest.err >&5 -@@ -7588,6 +7615,7 @@ else - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 - $as_echo "$lt_cv_apple_cc_single_mod" >&6; } -+ -     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 - $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } - if ${lt_cv_ld_exported_symbols_list+:} false; then : -@@ -7620,6 +7648,7 @@ rm -f core conftest.err conftest.$ac_objext \ - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 - $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } -+ -     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 - $as_echo_n "checking for -force_load linker flag... " >&6; } - if ${lt_cv_ld_force_load+:} false; then : -@@ -7641,7 +7670,9 @@ _LT_EOF -       echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 -       $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err -       _lt_result=$? --      if test -f conftest && test ! -s conftest.err && test $_lt_result = 0 && $GREP forced_load conftest 2>&1 >/dev/null; then -+      if test -s conftest.err && $GREP force_load conftest.err; then -+	cat conftest.err >&5 -+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then - 	lt_cv_ld_force_load=yes -       else - 	cat conftest.err >&5 -@@ -8046,7 +8077,22 @@ fi -  - # Check whether --with-pic was given. - if test "${with_pic+set}" = set; then : --  withval=$with_pic; pic_mode="$withval" -+  withval=$with_pic; lt_p=${PACKAGE-default} -+    case $withval in -+    yes|no) pic_mode=$withval ;; -+    *) -+      pic_mode=default -+      # Look at the argument we got.  We use all the common list separators. -+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," -+      for lt_pkg in $withval; do -+	IFS="$lt_save_ifs" -+	if test "X$lt_pkg" = "X$lt_p"; then -+	  pic_mode=yes -+	fi -+      done -+      IFS="$lt_save_ifs" -+      ;; -+    esac - else -   pic_mode=default - fi -@@ -8124,6 +8170,10 @@ LIBTOOL='$(SHELL) $(top_builddir)/libtool' -  -  -  -+ -+ -+ -+ - test -z "$LN_S" && LN_S="ln -s" -  -  -@@ -8579,7 +8629,9 @@ lt_prog_compiler_static= -     case $cc_basename in -     nvcc*) # Cuda Compiler Driver 2.2 -       lt_prog_compiler_wl='-Xlinker ' --      lt_prog_compiler_pic='-Xcompiler -fPIC' -+      if test -n "$lt_prog_compiler_pic"; then -+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" -+      fi -       ;; -     esac -   else -@@ -8670,18 +8722,33 @@ lt_prog_compiler_static= - 	;; -       *) - 	case `$CC -V 2>&1 | sed 5q` in --	*Sun\ F* | *Sun*Fortran*) -+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) - 	  # Sun Fortran 8.3 passes all unrecognized flags to the linker - 	  lt_prog_compiler_pic='-KPIC' - 	  lt_prog_compiler_static='-Bstatic' - 	  lt_prog_compiler_wl='' - 	  ;; -+	*Sun\ F* | *Sun*Fortran*) -+	  lt_prog_compiler_pic='-KPIC' -+	  lt_prog_compiler_static='-Bstatic' -+	  lt_prog_compiler_wl='-Qoption ld ' -+	  ;; - 	*Sun\ C*) - 	  # Sun C 5.9 - 	  lt_prog_compiler_pic='-KPIC' - 	  lt_prog_compiler_static='-Bstatic' - 	  lt_prog_compiler_wl='-Wl,' - 	  ;; -+        *Intel*\ [CF]*Compiler*) -+	  lt_prog_compiler_wl='-Wl,' -+	  lt_prog_compiler_pic='-fPIC' -+	  lt_prog_compiler_static='-static' -+	  ;; -+	*Portland\ Group*) -+	  lt_prog_compiler_wl='-Wl,' -+	  lt_prog_compiler_pic='-fpic' -+	  lt_prog_compiler_static='-Bstatic' -+	  ;; - 	esac - 	;; -       esac -@@ -9043,7 +9110,6 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie -   hardcode_direct=no -   hardcode_direct_absolute=no -   hardcode_libdir_flag_spec= --  hardcode_libdir_flag_spec_ld= -   hardcode_libdir_separator= -   hardcode_minus_L=no -   hardcode_shlibpath_var=unsupported -@@ -9293,8 +9359,7 @@ _LT_EOF - 	xlf* | bgf* | bgxlf* | mpixlf*) - 	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - 	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' --	  hardcode_libdir_flag_spec= --	  hardcode_libdir_flag_spec_ld='-rpath $libdir' -+	  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - 	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - 	  if test "x$supports_anon_versioning" = xyes; then - 	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ -@@ -9673,6 +9738,7 @@ fi - 	# The linker will not automatically build a static lib if we build a DLL. - 	# _LT_TAGVAR(old_archive_from_new_cmds, )='true' - 	enable_shared_with_static_runtimes=yes -+	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - 	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - 	# Don't use ranlib - 	old_postinstall_cmds='chmod 644 $oldlib' -@@ -9718,6 +9784,7 @@ fi -   hardcode_shlibpath_var=unsupported -   if test "$lt_cv_ld_force_load" = "yes"; then -     whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' -+ -   else -     whole_archive_flag_spec='' -   fi -@@ -9746,10 +9813,6 @@ fi -       hardcode_shlibpath_var=no -       ;; -  --    freebsd1*) --      ld_shlibs=no --      ;; -- -     # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor -     # support.  Future versions do this automatically, but an explicit c++rt0.o -     # does not break anything, and helps significantly (at the cost of a little -@@ -9762,7 +9825,7 @@ fi -       ;; -  -     # Unfortunately, older versions of FreeBSD 2 do not have this feature. --    freebsd2*) -+    freebsd2.*) -       archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' -       hardcode_direct=yes -       hardcode_minus_L=yes -@@ -9801,7 +9864,6 @@ fi -       fi -       if test "$with_gnu_ld" = no; then - 	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' --	hardcode_libdir_flag_spec_ld='+b $libdir' - 	hardcode_libdir_separator=: - 	hardcode_direct=yes - 	hardcode_direct_absolute=yes -@@ -10425,11 +10487,6 @@ esac -  -  -  -- -- -- -- -- -   { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 - $as_echo_n "checking dynamic linker characteristics... " >&6; } -  -@@ -10519,7 +10576,7 @@ need_version=unknown -  - case $host_os in - aix3*) --  version_type=linux -+  version_type=linux # correct to gnu/linux during the next big refactor -   library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' -   shlibpath_var=LIBPATH -  -@@ -10528,7 +10585,7 @@ aix3*) -   ;; -  - aix[4-9]*) --  version_type=linux -+  version_type=linux # correct to gnu/linux during the next big refactor -   need_lib_prefix=no -   need_version=no -   hardcode_into_libs=yes -@@ -10593,7 +10650,7 @@ beos*) -   ;; -  - bsdi[45]*) --  version_type=linux -+  version_type=linux # correct to gnu/linux during the next big refactor -   need_version=no -   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' -   soname_spec='${libname}${release}${shared_ext}$major' -@@ -10732,7 +10789,7 @@ darwin* | rhapsody*) -   ;; -  - dgux*) --  version_type=linux -+  version_type=linux # correct to gnu/linux during the next big refactor -   need_lib_prefix=no -   need_version=no -   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' -@@ -10740,10 +10797,6 @@ dgux*) -   shlibpath_var=LD_LIBRARY_PATH -   ;; -  --freebsd1*) --  dynamic_linker=no --  ;; -- - freebsd* | dragonfly*) -   # DragonFly does not have aout.  When/if they implement a new -   # versioning mechanism, adjust this. -@@ -10751,7 +10804,7 @@ freebsd* | dragonfly*) -     objformat=`/usr/bin/objformat` -   else -     case $host_os in --    freebsd[123]*) objformat=aout ;; -+    freebsd[23].*) objformat=aout ;; -     *) objformat=elf ;; -     esac -   fi -@@ -10769,7 +10822,7 @@ freebsd* | dragonfly*) -   esac -   shlibpath_var=LD_LIBRARY_PATH -   case $host_os in --  freebsd2*) -+  freebsd2.*) -     shlibpath_overrides_runpath=yes -     ;; -   freebsd3.[01]* | freebsdelf3.[01]*) -@@ -10789,17 +10842,18 @@ freebsd* | dragonfly*) -   ;; -  - gnu*) --  version_type=linux -+  version_type=linux # correct to gnu/linux during the next big refactor -   need_lib_prefix=no -   need_version=no -   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' -   soname_spec='${libname}${release}${shared_ext}$major' -   shlibpath_var=LD_LIBRARY_PATH -+  shlibpath_overrides_runpath=no -   hardcode_into_libs=yes -   ;; -  - haiku*) --  version_type=linux -+  version_type=linux # correct to gnu/linux during the next big refactor -   need_lib_prefix=no -   need_version=no -   dynamic_linker="$host_os runtime_loader" -@@ -10860,7 +10914,7 @@ hpux9* | hpux10* | hpux11*) -   ;; -  - interix[3-9]*) --  version_type=linux -+  version_type=linux # correct to gnu/linux during the next big refactor -   need_lib_prefix=no -   need_version=no -   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' -@@ -10876,7 +10930,7 @@ irix5* | irix6* | nonstopux*) -     nonstopux*) version_type=nonstopux ;; -     *) - 	if test "$lt_cv_prog_gnu_ld" = yes; then --		version_type=linux -+		version_type=linux # correct to gnu/linux during the next big refactor - 	else - 		version_type=irix - 	fi ;; -@@ -10913,9 +10967,9 @@ linux*oldld* | linux*aout* | linux*coff*) -   dynamic_linker=no -   ;; -  --# This must be Linux ELF. -+# This must be glibc/ELF. - linux* | k*bsd*-gnu | kopensolaris*-gnu) --  version_type=linux -+  version_type=linux # correct to gnu/linux during the next big refactor -   need_lib_prefix=no -   need_version=no -   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' -@@ -11001,7 +11055,7 @@ netbsd*) -   ;; -  - newsos6) --  version_type=linux -+  version_type=linux # correct to gnu/linux during the next big refactor -   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' -   shlibpath_var=LD_LIBRARY_PATH -   shlibpath_overrides_runpath=yes -@@ -11070,7 +11124,7 @@ rdos*) -   ;; -  - solaris*) --  version_type=linux -+  version_type=linux # correct to gnu/linux during the next big refactor -   need_lib_prefix=no -   need_version=no -   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' -@@ -11095,7 +11149,7 @@ sunos4*) -   ;; -  - sysv4 | sysv4.3*) --  version_type=linux -+  version_type=linux # correct to gnu/linux during the next big refactor -   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' -   soname_spec='${libname}${release}${shared_ext}$major' -   shlibpath_var=LD_LIBRARY_PATH -@@ -11119,7 +11173,7 @@ sysv4 | sysv4.3*) -  - sysv4*MP*) -   if test -d /usr/nec ;then --    version_type=linux -+    version_type=linux # correct to gnu/linux during the next big refactor -     library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' -     soname_spec='$libname${shared_ext}.$major' -     shlibpath_var=LD_LIBRARY_PATH -@@ -11150,7 +11204,7 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) -  - tpf*) -   # TPF is a cross-target only.  Preferred cross-host = GNU/Linux. --  version_type=linux -+  version_type=linux # correct to gnu/linux during the next big refactor -   need_lib_prefix=no -   need_version=no -   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' -@@ -11160,7 +11214,7 @@ tpf*) -   ;; -  - uts4*) --  version_type=linux -+  version_type=linux # correct to gnu/linux during the next big refactor -   library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' -   soname_spec='${libname}${release}${shared_ext}$major' -   shlibpath_var=LD_LIBRARY_PATH -@@ -11942,6 +11996,8 @@ CC="$lt_save_CC" -  -  -  -+ -+ -         ac_config_commands="$ac_config_commands libtool" -  -  -@@ -13132,6 +13188,10 @@ fi -  - TARGETDIR="unknown" - case "$host" in -+  aarch64*-*-*) -+	TARGET=AARCH64; TARGETDIR=aarch64 -+	;; -+ -   alpha*-*-*) - 	TARGET=ALPHA; TARGETDIR=alpha; - 	# Support 128-bit long double, changeable via command-line switch. -@@ -13431,6 +13491,14 @@ else -   POWERPC_FREEBSD_FALSE= - fi -  -+ if test x$TARGET = xAARCH64; then -+  AARCH64_TRUE= -+  AARCH64_FALSE='#' -+else -+  AARCH64_TRUE='#' -+  AARCH64_FALSE= -+fi -+ -  if test x$TARGET = xARM; then -   ARM_TRUE= -   ARM_FALSE='#' -@@ -14786,6 +14854,10 @@ if test -z "${POWERPC_FREEBSD_TRUE}" && test -z "${POWERPC_FREEBSD_FALSE}"; then -   as_fn_error $? "conditional \"POWERPC_FREEBSD\" was never defined. - Usually this means the macro was only invoked conditionally." "$LINENO" 5 - fi -+if test -z "${AARCH64_TRUE}" && test -z "${AARCH64_FALSE}"; then -+  as_fn_error $? "conditional \"AARCH64\" was never defined. -+Usually this means the macro was only invoked conditionally." "$LINENO" 5 -+fi - if test -z "${ARM_TRUE}" && test -z "${ARM_FALSE}"; then -   as_fn_error $? "conditional \"ARM\" was never defined. - Usually this means the macro was only invoked conditionally." "$LINENO" 5 -@@ -15463,6 +15535,7 @@ pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' - enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' - SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' - ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' -+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' - host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' - host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' - host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' -@@ -15545,7 +15618,6 @@ with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' - allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' - no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' - hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' --hardcode_libdir_flag_spec_ld='`$ECHO "$hardcode_libdir_flag_spec_ld" | $SED "$delay_single_quote_subst"`' - hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' - hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' - hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' -@@ -15601,6 +15673,7 @@ _LTECHO_EOF' - # Quote evaled strings. - for var in SHELL \ - ECHO \ -+PATH_SEPARATOR \ - SED \ - GREP \ - EGREP \ -@@ -15651,7 +15724,6 @@ with_gnu_ld \ - allow_undefined_flag \ - no_undefined_flag \ - hardcode_libdir_flag_spec \ --hardcode_libdir_flag_spec_ld \ - hardcode_libdir_separator \ - exclude_expsyms \ - include_expsyms \ -@@ -16633,8 +16705,8 @@ $as_echo X"$file" | - # NOTE: Changes made to this file will be lost: look at ltmain.sh. - # - #   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, --#                 2006, 2007, 2008, 2009, 2010 Free Software Foundation, --#                 Inc. -+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software -+#                 Foundation, Inc. - #   Written by Gordon Matzigkeit, 1996 - # - #   This file is part of GNU Libtool. -@@ -16688,6 +16760,9 @@ SHELL=$lt_SHELL - # An echo program that protects backslashes. - ECHO=$lt_ECHO -  -+# The PATH separator for the build system. -+PATH_SEPARATOR=$lt_PATH_SEPARATOR -+ - # The host system. - host_alias=$host_alias - host=$host -@@ -16989,10 +17064,6 @@ no_undefined_flag=$lt_no_undefined_flag - # This must work even if \$libdir does not exist - hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec -  --# If ld is used when linking, flag to hardcode \$libdir into a binary --# during linking.  This must work even if \$libdir does not exist. --hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld -- - # Whether we need a single "-rpath" flag with a separated argument. - hardcode_libdir_separator=$lt_hardcode_libdir_separator -  -diff --git a/configure.ac b/configure.ac -index 9b946a2..8c3f40c 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -53,6 +53,10 @@ AM_CONDITIONAL(TESTSUBDIR, test -d $srcdir/testsuite) -  - TARGETDIR="unknown" - case "$host" in -+  aarch64*-*-*) -+	TARGET=AARCH64; TARGETDIR=aarch64 -+	;; -+ -   alpha*-*-*) - 	TARGET=ALPHA; TARGETDIR=alpha; - 	# Support 128-bit long double, changeable via command-line switch. -@@ -233,6 +237,7 @@ AM_CONDITIONAL(POWERPC, test x$TARGET = xPOWERPC) - AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX) - AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN) - AM_CONDITIONAL(POWERPC_FREEBSD, test x$TARGET = xPOWERPC_FREEBSD) -+AM_CONDITIONAL(AARCH64, test x$TARGET = xAARCH64) - AM_CONDITIONAL(ARM, test x$TARGET = xARM) - AM_CONDITIONAL(AVR32, test x$TARGET = xAVR32) - AM_CONDITIONAL(LIBFFI_CRIS, test x$TARGET = xLIBFFI_CRIS) -diff --git a/src/aarch64/ffi.c b/src/aarch64/ffi.c -new file mode 100644 -index 0000000..1405665 ---- /dev/null -+++ b/src/aarch64/ffi.c -@@ -0,0 +1,1076 @@ -+/* 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.  */ -+ -+#include <stdio.h> -+ -+#include <ffi.h> -+#include <ffi_common.h> -+ -+#include <stdlib.h> -+ -+/* Stack alignment requirement in bytes */ -+#define AARCH64_STACK_ALIGN 16 -+ -+#define N_X_ARG_REG 8 -+#define N_V_ARG_REG 8 -+ -+#define AARCH64_FFI_WITH_V (1 << AARCH64_FFI_WITH_V_BIT) -+ -+union _d -+{ -+  UINT64 d; -+  UINT32 s[2]; -+}; -+ -+struct call_context -+{ -+  UINT64 x [AARCH64_N_XREG]; -+  struct -+  { -+    union _d d[2]; -+  } v [AARCH64_N_VREG]; -+}; -+ -+static void * -+get_x_addr (struct call_context *context, unsigned n) -+{ -+  return &context->x[n]; -+} -+ -+static void * -+get_s_addr (struct call_context *context, unsigned n) -+{ -+#if defined __AARCH64EB__ -+  return &context->v[n].d[1].s[1]; -+#else -+  return &context->v[n].d[0].s[0]; -+#endif -+} -+ -+static void * -+get_d_addr (struct call_context *context, unsigned n) -+{ -+#if defined __AARCH64EB__ -+  return &context->v[n].d[1]; -+#else -+  return &context->v[n].d[0]; -+#endif -+} -+ -+static void * -+get_v_addr (struct call_context *context, unsigned n) -+{ -+  return &context->v[n]; -+} -+ -+/* Return the memory location at which a basic type would reside -+   were it to have been stored in register n.  */ -+ -+static void * -+get_basic_type_addr (unsigned short type, struct call_context *context, -+		     unsigned n) -+{ -+  switch (type) -+    { -+    case FFI_TYPE_FLOAT: -+      return get_s_addr (context, n); -+    case FFI_TYPE_DOUBLE: -+      return get_d_addr (context, n); -+    case FFI_TYPE_LONGDOUBLE: -+      return get_v_addr (context, n); -+    case FFI_TYPE_UINT8: -+    case FFI_TYPE_SINT8: -+    case FFI_TYPE_UINT16: -+    case FFI_TYPE_SINT16: -+    case FFI_TYPE_UINT32: -+    case FFI_TYPE_SINT32: -+    case FFI_TYPE_INT: -+    case FFI_TYPE_POINTER: -+    case FFI_TYPE_UINT64: -+    case FFI_TYPE_SINT64: -+      return get_x_addr (context, n); -+    default: -+      FFI_ASSERT (0); -+      return NULL; -+    } -+} -+ -+/* Return the alignment width for each of the basic types.  */ -+ -+static size_t -+get_basic_type_alignment (unsigned short type) -+{ -+  switch (type) -+    { -+    case FFI_TYPE_FLOAT: -+    case FFI_TYPE_DOUBLE: -+      return sizeof (UINT64); -+    case FFI_TYPE_LONGDOUBLE: -+      return sizeof (long double); -+    case FFI_TYPE_UINT8: -+    case FFI_TYPE_SINT8: -+    case FFI_TYPE_UINT16: -+    case FFI_TYPE_SINT16: -+    case FFI_TYPE_UINT32: -+    case FFI_TYPE_INT: -+    case FFI_TYPE_SINT32: -+    case FFI_TYPE_POINTER: -+    case FFI_TYPE_UINT64: -+    case FFI_TYPE_SINT64: -+      return sizeof (UINT64); -+ -+    default: -+      FFI_ASSERT (0); -+      return 0; -+    } -+} -+ -+/* Return the size in bytes for each of the basic types.  */ -+ -+static size_t -+get_basic_type_size (unsigned short type) -+{ -+  switch (type) -+    { -+    case FFI_TYPE_FLOAT: -+      return sizeof (UINT32); -+    case FFI_TYPE_DOUBLE: -+      return sizeof (UINT64); -+    case FFI_TYPE_LONGDOUBLE: -+      return sizeof (long double); -+    case FFI_TYPE_UINT8: -+      return sizeof (UINT8); -+    case FFI_TYPE_SINT8: -+      return sizeof (SINT8); -+    case FFI_TYPE_UINT16: -+      return sizeof (UINT16); -+    case FFI_TYPE_SINT16: -+      return sizeof (SINT16); -+    case FFI_TYPE_UINT32: -+      return sizeof (UINT32); -+    case FFI_TYPE_INT: -+    case FFI_TYPE_SINT32: -+      return sizeof (SINT32); -+    case FFI_TYPE_POINTER: -+    case FFI_TYPE_UINT64: -+      return sizeof (UINT64); -+    case FFI_TYPE_SINT64: -+      return sizeof (SINT64); -+ -+    default: -+      FFI_ASSERT (0); -+      return 0; -+    } -+} -+ -+extern void -+ffi_call_SYSV (unsigned (*)(struct call_context *context, unsigned char *, -+			    extended_cif *), -+               struct call_context *context, -+               extended_cif *, -+               unsigned, -+               void (*fn)(void)); -+ -+extern void -+ffi_closure_SYSV (ffi_closure *); -+ -+/* Test for an FFI floating point representation.  */ -+ -+static unsigned -+is_floating_type (unsigned short type) -+{ -+  return (type == FFI_TYPE_FLOAT || type == FFI_TYPE_DOUBLE -+	  || type == FFI_TYPE_LONGDOUBLE); -+} -+ -+/* Test for a homogeneous structure.  */ -+ -+static unsigned short -+get_homogeneous_type (ffi_type *ty) -+{ -+  if (ty->type == FFI_TYPE_STRUCT && ty->elements) -+    { -+      unsigned i; -+      unsigned short candidate_type -+	= get_homogeneous_type (ty->elements[0]); -+      for (i =1; ty->elements[i]; i++) -+	{ -+	  unsigned short iteration_type = 0; -+	  /* If we have a nested struct, we must find its homogeneous type. -+	     If that fits with our candidate type, we are still -+	     homogeneous.  */ -+	  if (ty->elements[i]->type == FFI_TYPE_STRUCT -+	      && ty->elements[i]->elements) -+	    { -+	      iteration_type = get_homogeneous_type (ty->elements[i]); -+	    } -+	  else -+	    { -+	      iteration_type = ty->elements[i]->type; -+	    } -+ -+	  /* If we are not homogeneous, return FFI_TYPE_STRUCT.  */ -+	  if (candidate_type != iteration_type) -+	    return FFI_TYPE_STRUCT; -+	} -+      return candidate_type; -+    } -+ -+  /* Base case, we have no more levels of nesting, so we -+     are a basic type, and so, trivially homogeneous in that type.  */ -+  return ty->type; -+} -+ -+/* Determine the number of elements within a STRUCT. -+ -+   Note, we must handle nested structs. -+ -+   If ty is not a STRUCT this function will return 0.  */ -+ -+static unsigned -+element_count (ffi_type *ty) -+{ -+  if (ty->type == FFI_TYPE_STRUCT && ty->elements) -+    { -+      unsigned n; -+      unsigned elems = 0; -+      for (n = 0; ty->elements[n]; n++) -+	{ -+	  if (ty->elements[n]->type == FFI_TYPE_STRUCT -+	      && ty->elements[n]->elements) -+	    elems += element_count (ty->elements[n]); -+	  else -+	    elems++; -+	} -+      return elems; -+    } -+  return 0; -+} -+ -+/* Test for a homogeneous floating point aggregate. -+ -+   A homogeneous floating point aggregate is a homogeneous aggregate of -+   a half- single- or double- precision floating point type with one -+   to four elements.  Note that this includes nested structs of the -+   basic type.  */ -+ -+static int -+is_hfa (ffi_type *ty) -+{ -+  if (ty->type == FFI_TYPE_STRUCT -+      && ty->elements[0] -+      && is_floating_type (get_homogeneous_type (ty))) -+    { -+      unsigned n = element_count (ty); -+      return n >= 1 && n <= 4; -+    } -+  return 0; -+} -+ -+/* Test if an ffi_type is a candidate for passing in a register. -+ -+   This test does not check that sufficient registers of the -+   appropriate class are actually available, merely that IFF -+   sufficient registers are available then the argument will be passed -+   in register(s). -+ -+   Note that an ffi_type that is deemed to be a register candidate -+   will always be returned in registers. -+ -+   Returns 1 if a register candidate else 0.  */ -+ -+static int -+is_register_candidate (ffi_type *ty) -+{ -+  switch (ty->type) -+    { -+    case FFI_TYPE_VOID: -+    case FFI_TYPE_FLOAT: -+    case FFI_TYPE_DOUBLE: -+    case FFI_TYPE_LONGDOUBLE: -+    case FFI_TYPE_UINT8: -+    case FFI_TYPE_UINT16: -+    case FFI_TYPE_UINT32: -+    case FFI_TYPE_UINT64: -+    case FFI_TYPE_POINTER: -+    case FFI_TYPE_SINT8: -+    case FFI_TYPE_SINT16: -+    case FFI_TYPE_SINT32: -+    case FFI_TYPE_INT: -+    case FFI_TYPE_SINT64: -+      return 1; -+ -+    case FFI_TYPE_STRUCT: -+      if (is_hfa (ty)) -+        { -+          return 1; -+        } -+      else if (ty->size > 16) -+        { -+          /* Too large. Will be replaced with a pointer to memory. The -+             pointer MAY be passed in a register, but the value will -+             not. This test specifically fails since the argument will -+             never be passed by value in registers. */ -+          return 0; -+        } -+      else -+        { -+          /* Might be passed in registers depending on the number of -+             registers required. */ -+          return (ty->size + 7) / 8 < N_X_ARG_REG; -+        } -+      break; -+ -+    default: -+      FFI_ASSERT (0); -+      break; -+    } -+ -+  return 0; -+} -+ -+/* Test if an ffi_type argument or result is a candidate for a vector -+   register.  */ -+ -+static int -+is_v_register_candidate (ffi_type *ty) -+{ -+  return is_floating_type (ty->type) -+	   || (ty->type == FFI_TYPE_STRUCT && is_hfa (ty)); -+} -+ -+/* Representation of the procedure call argument marshalling -+   state. -+ -+   The terse state variable names match the names used in the AARCH64 -+   PCS. */ -+ -+struct arg_state -+{ -+  unsigned ngrn;                /* Next general-purpose register number. */ -+  unsigned nsrn;                /* Next vector register number. */ -+  unsigned nsaa;                /* Next stack offset. */ -+}; -+ -+/* Initialize a procedure call argument marshalling state.  */ -+static void -+arg_init (struct arg_state *state, unsigned call_frame_size) -+{ -+  state->ngrn = 0; -+  state->nsrn = 0; -+  state->nsaa = 0; -+} -+ -+/* Return the number of available consecutive core argument -+   registers.  */ -+ -+static unsigned -+available_x (struct arg_state *state) -+{ -+  return N_X_ARG_REG - state->ngrn; -+} -+ -+/* Return the number of available consecutive vector argument -+   registers.  */ -+ -+static unsigned -+available_v (struct arg_state *state) -+{ -+  return N_V_ARG_REG - state->nsrn; -+} -+ -+static void * -+allocate_to_x (struct call_context *context, struct arg_state *state) -+{ -+  FFI_ASSERT (state->ngrn < N_X_ARG_REG) -+  return get_x_addr (context, (state->ngrn)++); -+} -+ -+static void * -+allocate_to_s (struct call_context *context, struct arg_state *state) -+{ -+  FFI_ASSERT (state->nsrn < N_V_ARG_REG) -+  return get_s_addr (context, (state->nsrn)++); -+} -+ -+static void * -+allocate_to_d (struct call_context *context, struct arg_state *state) -+{ -+  FFI_ASSERT (state->nsrn < N_V_ARG_REG) -+  return get_d_addr (context, (state->nsrn)++); -+} -+ -+static void * -+allocate_to_v (struct call_context *context, struct arg_state *state) -+{ -+  FFI_ASSERT (state->nsrn < N_V_ARG_REG) -+  return get_v_addr (context, (state->nsrn)++); -+} -+ -+/* Allocate an aligned slot on the stack and return a pointer to it.  */ -+static void * -+allocate_to_stack (struct arg_state *state, void *stack, unsigned alignment, -+		   unsigned size) -+{ -+  void *allocation; -+ -+  /* Round up the NSAA to the larger of 8 or the natural -+     alignment of the argument's type.  */ -+  state->nsaa = ALIGN (state->nsaa, alignment); -+  state->nsaa = ALIGN (state->nsaa, alignment); -+  state->nsaa = ALIGN (state->nsaa, 8); -+ -+  allocation = stack + state->nsaa; -+ -+  state->nsaa += size; -+  return allocation; -+} -+ -+static void -+copy_basic_type (void *dest, void *source, unsigned short type) -+{ -+  /* This is neccessary to ensure that basic types are copied -+     sign extended to 64-bits as libffi expects.  */ -+  switch (type) -+    { -+    case FFI_TYPE_FLOAT: -+      *(float *) dest = *(float *) source; -+      break; -+    case FFI_TYPE_DOUBLE: -+      *(double *) dest = *(double *) source; -+      break; -+    case FFI_TYPE_LONGDOUBLE: -+      *(long double *) dest = *(long double *) source; -+      break; -+    case FFI_TYPE_UINT8: -+      *(ffi_arg *) dest = *(UINT8 *) source; -+      break; -+    case FFI_TYPE_SINT8: -+      *(ffi_sarg *) dest = *(SINT8 *) source; -+      break; -+    case FFI_TYPE_UINT16: -+      *(ffi_arg *) dest = *(UINT16 *) source; -+      break; -+    case FFI_TYPE_SINT16: -+      *(ffi_sarg *) dest = *(SINT16 *) source; -+      break; -+    case FFI_TYPE_UINT32: -+      *(ffi_arg *) dest = *(UINT32 *) source; -+      break; -+    case FFI_TYPE_INT: -+    case FFI_TYPE_SINT32: -+      *(ffi_sarg *) dest = *(SINT32 *) source; -+      break; -+    case FFI_TYPE_POINTER: -+    case FFI_TYPE_UINT64: -+      *(ffi_arg *) dest = *(UINT64 *) source; -+      break; -+    case FFI_TYPE_SINT64: -+      *(ffi_sarg *) dest = *(SINT64 *) source; -+      break; -+ -+    default: -+      FFI_ASSERT (0); -+    } -+} -+ -+static void -+copy_hfa_to_reg_or_stack (void *memory, -+			  ffi_type *ty, -+			  struct call_context *context, -+			  unsigned char *stack, -+			  struct arg_state *state) -+{ -+  unsigned elems = element_count (ty); -+  if (available_v (state) < elems) -+    { -+      /* There are insufficient V registers. Further V register allocations -+	 are prevented, the NSAA is adjusted (by allocate_to_stack ()) -+	 and the argument is copied to memory at the adjusted NSAA.  */ -+      state->nsrn = N_V_ARG_REG; -+      memcpy (allocate_to_stack (state, stack, ty->alignment, ty->size), -+	      memory, -+	      ty->size); -+    } -+  else -+    { -+      int i; -+      unsigned short type = get_homogeneous_type (ty); -+      unsigned elems = element_count (ty); -+      for (i = 0; i < elems; i++) -+	{ -+	  void *reg = allocate_to_v (context, state); -+	  copy_basic_type (reg, memory, type); -+	  memory += get_basic_type_size (type); -+	} -+    } -+} -+ -+/* Either allocate an appropriate register for the argument type, or if -+   none are available, allocate a stack slot and return a pointer -+   to the allocated space.  */ -+ -+static void * -+allocate_to_register_or_stack (struct call_context *context, -+			       unsigned char *stack, -+			       struct arg_state *state, -+			       unsigned short type) -+{ -+  size_t alignment = get_basic_type_alignment (type); -+  size_t size = alignment; -+  switch (type) -+    { -+    case FFI_TYPE_FLOAT: -+      /* This is the only case for which the allocated stack size -+	 should not match the alignment of the type.  */ -+      size = sizeof (UINT32); -+      /* Fall through.  */ -+    case FFI_TYPE_DOUBLE: -+      if (state->nsrn < N_V_ARG_REG) -+	return allocate_to_d (context, state); -+      state->nsrn = N_V_ARG_REG; -+      break; -+    case FFI_TYPE_LONGDOUBLE: -+      if (state->nsrn < N_V_ARG_REG) -+	return allocate_to_v (context, state); -+      state->nsrn = N_V_ARG_REG; -+      break; -+    case FFI_TYPE_UINT8: -+    case FFI_TYPE_SINT8: -+    case FFI_TYPE_UINT16: -+    case FFI_TYPE_SINT16: -+    case FFI_TYPE_UINT32: -+    case FFI_TYPE_SINT32: -+    case FFI_TYPE_INT: -+    case FFI_TYPE_POINTER: -+    case FFI_TYPE_UINT64: -+    case FFI_TYPE_SINT64: -+      if (state->ngrn < N_X_ARG_REG) -+	return allocate_to_x (context, state); -+      state->ngrn = N_X_ARG_REG; -+      break; -+    default: -+      FFI_ASSERT (0); -+    } -+ -+    return allocate_to_stack (state, stack, alignment, size); -+} -+ -+/* Copy a value to an appropriate register, or if none are -+   available, to the stack.  */ -+ -+static void -+copy_to_register_or_stack (struct call_context *context, -+			   unsigned char *stack, -+			   struct arg_state *state, -+			   void *value, -+			   unsigned short type) -+{ -+  copy_basic_type ( -+	  allocate_to_register_or_stack (context, stack, state, type), -+	  value, -+	  type); -+} -+ -+/* Marshall the arguments from FFI representation to procedure call -+   context and stack.  */ -+ -+static unsigned -+aarch64_prep_args (struct call_context *context, unsigned char *stack, -+		   extended_cif *ecif) -+{ -+  int i; -+  struct arg_state state; -+ -+  arg_init (&state, ALIGN(ecif->cif->bytes, 16)); -+ -+  for (i = 0; i < ecif->cif->nargs; i++) -+    { -+      ffi_type *ty = ecif->cif->arg_types[i]; -+      switch (ty->type) -+	{ -+	case FFI_TYPE_VOID: -+	  FFI_ASSERT (0); -+	  break; -+ -+	/* If the argument is a basic type the argument is allocated to an -+	   appropriate register, or if none are available, to the stack.  */ -+	case FFI_TYPE_FLOAT: -+	case FFI_TYPE_DOUBLE: -+	case FFI_TYPE_LONGDOUBLE: -+	case FFI_TYPE_UINT8: -+	case FFI_TYPE_SINT8: -+	case FFI_TYPE_UINT16: -+	case FFI_TYPE_SINT16: -+	case FFI_TYPE_UINT32: -+	case FFI_TYPE_INT: -+	case FFI_TYPE_SINT32: -+	case FFI_TYPE_POINTER: -+	case FFI_TYPE_UINT64: -+	case FFI_TYPE_SINT64: -+	  copy_to_register_or_stack (context, stack, &state, -+				     ecif->avalue[i], ty->type); -+	  break; -+ -+	case FFI_TYPE_STRUCT: -+	  if (is_hfa (ty)) -+	    { -+	      copy_hfa_to_reg_or_stack (ecif->avalue[i], ty, context, -+					stack, &state); -+	    } -+	  else if (ty->size > 16) -+	    { -+	      /* If the argument is a composite type that is larger than 16 -+		 bytes, then the argument has been copied to memory, and -+		 the argument is replaced by a pointer to the copy.  */ -+ -+	      copy_to_register_or_stack (context, stack, &state, -+					 &(ecif->avalue[i]), FFI_TYPE_POINTER); -+	    } -+	  else if (available_x (&state) >= (ty->size + 7) / 8) -+	    { -+	      /* If the argument is a composite type and the size in -+		 double-words is not more than the number of available -+		 X registers, then the argument is copied into consecutive -+		 X registers.  */ -+	      int j; -+	      for (j = 0; j < (ty->size + 7) / 8; j++) -+		{ -+		  memcpy (allocate_to_x (context, &state), -+			  &(((UINT64 *) ecif->avalue[i])[j]), -+			  sizeof (UINT64)); -+		} -+	    } -+	  else -+	    { -+	      /* Otherwise, there are insufficient X registers. Further X -+		 register allocations are prevented, the NSAA is adjusted -+		 (by allocate_to_stack ()) and the argument is copied to -+		 memory at the adjusted NSAA.  */ -+	      state.ngrn = N_X_ARG_REG; -+ -+	      memcpy (allocate_to_stack (&state, stack, ty->alignment, -+					 ty->size), ecif->avalue + i, ty->size); -+	    } -+	  break; -+ -+	default: -+	  FFI_ASSERT (0); -+	  break; -+	} -+    } -+ -+  return ecif->cif->aarch64_flags; -+} -+ -+ffi_status -+ffi_prep_cif_machdep (ffi_cif *cif) -+{ -+  /* Round the stack up to a multiple of the stack alignment requirement. */ -+  cif->bytes = -+    (cif->bytes + (AARCH64_STACK_ALIGN - 1)) & ~ (AARCH64_STACK_ALIGN - 1); -+ -+  /* Initialize our flags. We are interested if this CIF will touch a -+     vector register, if so we will enable context save and load to -+     those registers, otherwise not. This is intended to be friendly -+     to lazy float context switching in the kernel.  */ -+  cif->aarch64_flags = 0; -+ -+  if (is_v_register_candidate (cif->rtype)) -+    { -+      cif->aarch64_flags |= AARCH64_FFI_WITH_V; -+    } -+  else -+    { -+      int i; -+      for (i = 0; i < cif->nargs; i++) -+        if (is_v_register_candidate (cif->arg_types[i])) -+          { -+            cif->aarch64_flags |= AARCH64_FFI_WITH_V; -+            break; -+          } -+    } -+ -+  return FFI_OK; -+} -+ -+/* Call a function with the provided arguments and capture the return -+   value.  */ -+void -+ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -+{ -+  extended_cif ecif; -+ -+  ecif.cif = cif; -+  ecif.avalue = avalue; -+  ecif.rvalue = rvalue; -+ -+  switch (cif->abi) -+    { -+    case FFI_SYSV: -+      { -+        struct call_context context; -+	unsigned stack_bytes; -+ -+	/* Figure out the total amount of stack space we need, the -+	   above call frame space needs to be 16 bytes aligned to -+	   ensure correct alignment of the first object inserted in -+	   that space hence the ALIGN applied to cif->bytes.*/ -+	stack_bytes = ALIGN(cif->bytes, 16); -+ -+	memset (&context, 0, sizeof (context)); -+        if (is_register_candidate (cif->rtype)) -+          { -+            ffi_call_SYSV (aarch64_prep_args, &context, &ecif, stack_bytes, fn); -+            switch (cif->rtype->type) -+              { -+              case FFI_TYPE_VOID: -+              case FFI_TYPE_FLOAT: -+              case FFI_TYPE_DOUBLE: -+              case FFI_TYPE_LONGDOUBLE: -+              case FFI_TYPE_UINT8: -+              case FFI_TYPE_SINT8: -+              case FFI_TYPE_UINT16: -+              case FFI_TYPE_SINT16: -+              case FFI_TYPE_UINT32: -+              case FFI_TYPE_SINT32: -+              case FFI_TYPE_POINTER: -+              case FFI_TYPE_UINT64: -+              case FFI_TYPE_INT: -+              case FFI_TYPE_SINT64: -+		{ -+		  void *addr = get_basic_type_addr (cif->rtype->type, -+						    &context, 0); -+		  copy_basic_type (rvalue, addr, cif->rtype->type); -+		  break; -+		} -+ -+              case FFI_TYPE_STRUCT: -+                if (is_hfa (cif->rtype)) -+		  { -+		    int j; -+		    unsigned short type = get_homogeneous_type (cif->rtype); -+		    unsigned elems = element_count (cif->rtype); -+		    for (j = 0; j < elems; j++) -+		      { -+			void *reg = get_basic_type_addr (type, &context, j); -+			copy_basic_type (rvalue, reg, type); -+			rvalue += get_basic_type_size (type); -+		      } -+		  } -+                else if ((cif->rtype->size + 7) / 8 < N_X_ARG_REG) -+                  { -+                    unsigned size = ALIGN (cif->rtype->size, sizeof (UINT64)); -+                    memcpy (rvalue, get_x_addr (&context, 0), size); -+                  } -+                else -+                  { -+                    FFI_ASSERT (0); -+                  } -+                break; -+ -+              default: -+                FFI_ASSERT (0); -+                break; -+              } -+          } -+        else -+          { -+            memcpy (get_x_addr (&context, 8), &rvalue, sizeof (UINT64)); -+            ffi_call_SYSV (aarch64_prep_args, &context, &ecif, -+			   stack_bytes, fn); -+          } -+        break; -+      } -+ -+    default: -+      FFI_ASSERT (0); -+      break; -+    } -+} -+ -+static unsigned char trampoline [] = -+{ 0x70, 0x00, 0x00, 0x58,	/* ldr	x16, 1f	*/ -+  0x91, 0x00, 0x00, 0x10,	/* adr	x17, 2f	*/ -+  0x00, 0x02, 0x1f, 0xd6	/* br	x16	*/ -+}; -+ -+/* Build a trampoline.  */ -+ -+#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX,FLAGS)			\ -+  ({unsigned char *__tramp = (unsigned char*)(TRAMP);			\ -+    UINT64  __fun = (UINT64)(FUN);					\ -+    UINT64  __ctx = (UINT64)(CTX);					\ -+    UINT64  __flags = (UINT64)(FLAGS);					\ -+    memcpy (__tramp, trampoline, sizeof (trampoline));			\ -+    memcpy (__tramp + 12, &__fun, sizeof (__fun));			\ -+    memcpy (__tramp + 20, &__ctx, sizeof (__ctx));			\ -+    memcpy (__tramp + 28, &__flags, sizeof (__flags));			\ -+    __clear_cache(__tramp, __tramp + FFI_TRAMPOLINE_SIZE);		\ -+  }) -+ -+ffi_status -+ffi_prep_closure_loc (ffi_closure* closure, -+                      ffi_cif* cif, -+                      void (*fun)(ffi_cif*,void*,void**,void*), -+                      void *user_data, -+                      void *codeloc) -+{ -+  if (cif->abi != FFI_SYSV) -+    return FFI_BAD_ABI; -+ -+  FFI_INIT_TRAMPOLINE (&closure->tramp[0], &ffi_closure_SYSV, codeloc, -+		       cif->aarch64_flags); -+ -+  closure->cif  = cif; -+  closure->user_data = user_data; -+  closure->fun  = fun; -+ -+  return FFI_OK; -+} -+ -+/* Primary handler to setup and invoke a function within a closure. -+ -+   A closure when invoked enters via the assembler wrapper -+   ffi_closure_SYSV(). The wrapper allocates a call context on the -+   stack, saves the interesting registers (from the perspective of -+   the calling convention) into the context then passes control to -+   ffi_closure_SYSV_inner() passing the saved context and a pointer to -+   the stack at the point ffi_closure_SYSV() was invoked. -+ -+   On the return path the assembler wrapper will reload call context -+   regsiters. -+ -+   ffi_closure_SYSV_inner() marshalls the call context into ffi value -+   desriptors, invokes the wrapped function, then marshalls the return -+   value back into the call context.  */ -+ -+void -+ffi_closure_SYSV_inner (ffi_closure *closure, struct call_context *context, -+			void *stack) -+{ -+  ffi_cif *cif = closure->cif; -+  void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); -+  void *rvalue = NULL; -+  int i; -+  struct arg_state state; -+ -+  arg_init (&state, ALIGN(cif->bytes, 16)); -+ -+  for (i = 0; i < cif->nargs; i++) -+    { -+      ffi_type *ty = cif->arg_types[i]; -+ -+      switch (ty->type) -+	{ -+	case FFI_TYPE_VOID: -+	  FFI_ASSERT (0); -+	  break; -+ -+	case FFI_TYPE_UINT8: -+	case FFI_TYPE_SINT8: -+	case FFI_TYPE_UINT16: -+	case FFI_TYPE_SINT16: -+	case FFI_TYPE_UINT32: -+	case FFI_TYPE_SINT32: -+	case FFI_TYPE_INT: -+	case FFI_TYPE_POINTER: -+	case FFI_TYPE_UINT64: -+	case FFI_TYPE_SINT64: -+	case  FFI_TYPE_FLOAT: -+	case  FFI_TYPE_DOUBLE: -+	case  FFI_TYPE_LONGDOUBLE: -+	  avalue[i] = allocate_to_register_or_stack (context, stack, -+						     &state, ty->type); -+	  break; -+ -+	case FFI_TYPE_STRUCT: -+	  if (is_hfa (ty)) -+	    { -+	      unsigned n = element_count (ty); -+	      if (available_v (&state) < n) -+		{ -+		  state.nsrn = N_V_ARG_REG; -+		  avalue[i] = allocate_to_stack (&state, stack, ty->alignment, -+						 ty->size); -+		} -+	      else -+		{ -+		  switch (get_homogeneous_type (ty)) -+		    { -+		    case FFI_TYPE_FLOAT: -+		      { -+			/* Eeek! We need a pointer to the structure, -+			   however the homogeneous float elements are -+			   being passed in individual S registers, -+			   therefore the structure is not represented as -+			   a contiguous sequence of bytes in our saved -+			   register context. We need to fake up a copy -+			   of the structure layed out in memory -+			   correctly. The fake can be tossed once the -+			   closure function has returned hence alloca() -+			   is sufficient. */ -+			int j; -+			UINT32 *p = avalue[i] = alloca (ty->size); -+			for (j = 0; j < element_count (ty); j++) -+			  memcpy (&p[j], -+				  allocate_to_s (context, &state), -+				  sizeof (*p)); -+			break; -+		      } -+ -+		    case FFI_TYPE_DOUBLE: -+		      { -+			/* Eeek! We need a pointer to the structure, -+			   however the homogeneous float elements are -+			   being passed in individual S registers, -+			   therefore the structure is not represented as -+			   a contiguous sequence of bytes in our saved -+			   register context. We need to fake up a copy -+			   of the structure layed out in memory -+			   correctly. The fake can be tossed once the -+			   closure function has returned hence alloca() -+			   is sufficient. */ -+			int j; -+			UINT64 *p = avalue[i] = alloca (ty->size); -+			for (j = 0; j < element_count (ty); j++) -+			  memcpy (&p[j], -+				  allocate_to_d (context, &state), -+				  sizeof (*p)); -+			break; -+		      } -+ -+		    case FFI_TYPE_LONGDOUBLE: -+			  memcpy (&avalue[i], -+				  allocate_to_v (context, &state), -+				  sizeof (*avalue)); -+		      break; -+ -+		    default: -+		      FFI_ASSERT (0); -+		      break; -+		    } -+		} -+	    } -+	  else if (ty->size > 16) -+	    { -+	      /* Replace Composite type of size greater than 16 with a -+		 pointer.  */ -+	      memcpy (&avalue[i], -+		      allocate_to_register_or_stack (context, stack, -+						     &state, FFI_TYPE_POINTER), -+		      sizeof (avalue[i])); -+	    } -+	  else if (available_x (&state) >= (ty->size + 7) / 8) -+	    { -+	      avalue[i] = get_x_addr (context, state.ngrn); -+	      state.ngrn += (ty->size + 7) / 8; -+	    } -+	  else -+	    { -+	      state.ngrn = N_X_ARG_REG; -+ -+	      avalue[i] = allocate_to_stack (&state, stack, ty->alignment, -+					     ty->size); -+	    } -+	  break; -+ -+	default: -+	  FFI_ASSERT (0); -+	  break; -+	} -+    } -+ -+  /* Figure out where the return value will be passed, either in -+     registers or in a memory block allocated by the caller and passed -+     in x8.  */ -+ -+  if (is_register_candidate (cif->rtype)) -+    { -+      /* Register candidates are *always* returned in registers. */ -+ -+      /* Allocate a scratchpad for the return value, we will let the -+         callee scrible the result into the scratch pad then move the -+         contents into the appropriate return value location for the -+         call convention.  */ -+      rvalue = alloca (cif->rtype->size); -+      (closure->fun) (cif, rvalue, avalue, closure->user_data); -+ -+      /* Copy the return value into the call context so that it is returned -+         as expected to our caller.  */ -+      switch (cif->rtype->type) -+        { -+        case FFI_TYPE_VOID: -+          break; -+ -+        case FFI_TYPE_UINT8: -+        case FFI_TYPE_UINT16: -+        case FFI_TYPE_UINT32: -+        case FFI_TYPE_POINTER: -+        case FFI_TYPE_UINT64: -+        case FFI_TYPE_SINT8: -+        case FFI_TYPE_SINT16: -+        case FFI_TYPE_INT: -+        case FFI_TYPE_SINT32: -+        case FFI_TYPE_SINT64: -+        case FFI_TYPE_FLOAT: -+        case FFI_TYPE_DOUBLE: -+        case FFI_TYPE_LONGDOUBLE: -+	  { -+	    void *addr = get_basic_type_addr (cif->rtype->type, context, 0); -+	    copy_basic_type (addr, rvalue, cif->rtype->type); -+            break; -+	  } -+        case FFI_TYPE_STRUCT: -+          if (is_hfa (cif->rtype)) -+	    { -+	      int i; -+	      unsigned short type = get_homogeneous_type (cif->rtype); -+	      unsigned elems = element_count (cif->rtype); -+	      for (i = 0; i < elems; i++) -+		{ -+		  void *reg = get_basic_type_addr (type, context, i); -+		  copy_basic_type (reg, rvalue, type); -+		  rvalue += get_basic_type_size (type); -+		} -+	    } -+          else if ((cif->rtype->size + 7) / 8 < N_X_ARG_REG) -+            { -+              unsigned size = ALIGN (cif->rtype->size, sizeof (UINT64)) ; -+              memcpy (get_x_addr (context, 0), rvalue, size); -+            } -+          else -+            { -+              FFI_ASSERT (0); -+            } -+          break; -+        default: -+          FFI_ASSERT (0); -+          break; -+        } -+    } -+  else -+    { -+      memcpy (&rvalue, get_x_addr (context, 8), sizeof (UINT64)); -+      (closure->fun) (cif, rvalue, avalue, closure->user_data); -+    } -+} -+ -diff --git a/src/aarch64/ffitarget.h b/src/aarch64/ffitarget.h -new file mode 100644 -index 0000000..6f1a348 ---- /dev/null -+++ b/src/aarch64/ffitarget.h -@@ -0,0 +1,59 @@ -+/* 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 -+typedef unsigned long ffi_arg; -+typedef signed long ffi_sarg; -+ -+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_TRAMPOLINE_SIZE 36 -+#define FFI_NATIVE_RAW_API 0 -+ -+/* ---- Internal ---- */ -+ -+ -+#define FFI_EXTRA_CIF_FIELDS unsigned aarch64_flags -+ -+#define AARCH64_FFI_WITH_V_BIT 0 -+ -+#define AARCH64_N_XREG 32 -+#define AARCH64_N_VREG 32 -+#define AARCH64_CALL_CONTEXT_SIZE (AARCH64_N_XREG * 8 + AARCH64_N_VREG * 16) -+ -+#endif -diff --git a/src/aarch64/sysv.S b/src/aarch64/sysv.S -new file mode 100644 -index 0000000..b8cd421 ---- /dev/null -+++ b/src/aarch64/sysv.S -@@ -0,0 +1,307 @@ -+/* 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.  */ -+ -+#define LIBFFI_ASM -+#include <fficonfig.h> -+#include <ffi.h> -+ -+#define cfi_adjust_cfa_offset(off)	.cfi_adjust_cfa_offset off -+#define cfi_rel_offset(reg, off)	.cfi_rel_offset reg, off -+#define cfi_restore(reg)		.cfi_restore reg -+#define cfi_def_cfa_register(reg)	.cfi_def_cfa_register reg -+ -+        .text -+        .globl ffi_call_SYSV -+        .type ffi_call_SYSV, #function -+ -+/* ffi_call_SYSV() -+ -+   Create a stack frame, setup an argument context, call the callee -+   and extract the result. -+ -+   The maximum required argument stack size is provided, -+   ffi_call_SYSV() allocates that stack space then calls the -+   prepare_fn to populate register context and stack.  The -+   argument passing registers are loaded from the register -+   context and the callee called, on return the register passing -+   register are saved back to the context.  Our caller will -+   extract the return value from the final state of the saved -+   register context. -+ -+   Prototype: -+ -+   extern unsigned -+   ffi_call_SYSV (void (*)(struct call_context *context, unsigned char *, -+			   extended_cif *), -+                  struct call_context *context, -+                  extended_cif *, -+                  unsigned required_stack_size, -+                  void (*fn)(void)); -+ -+   Therefore on entry we have: -+ -+   x0 prepare_fn -+   x1 &context -+   x2 &ecif -+   x3 bytes -+   x4 fn -+ -+   This function uses the following stack frame layout: -+ -+   == -+                saved x30(lr) -+   x29(fp)->    saved x29(fp) -+                saved x24 -+                saved x23 -+                saved x22 -+   sp'    ->    saved x21 -+                ... -+   sp     ->    (constructed callee stack arguments) -+   == -+ -+   Voila! */ -+ -+#define ffi_call_SYSV_FS (8 * 4) -+ -+        .cfi_startproc -+ffi_call_SYSV: -+        stp     x29, x30, [sp, #-16]! -+	cfi_adjust_cfa_offset (16) -+        cfi_rel_offset (x29, 0) -+        cfi_rel_offset (x30, 8) -+ -+        mov     x29, sp -+	cfi_def_cfa_register (x29) -+        sub     sp, sp, #ffi_call_SYSV_FS -+ -+        stp     x21, x22, [sp, 0] -+        cfi_rel_offset (x21, 0 - ffi_call_SYSV_FS) -+        cfi_rel_offset (x22, 8 - ffi_call_SYSV_FS) -+ -+        stp     x23, x24, [sp, 16] -+        cfi_rel_offset (x23, 16 - ffi_call_SYSV_FS) -+        cfi_rel_offset (x24, 24 - ffi_call_SYSV_FS) -+ -+        mov     x21, x1 -+        mov     x22, x2 -+        mov     x24, x4 -+ -+        /* Allocate the stack space for the actual arguments, many -+           arguments will be passed in registers, but we assume -+           worst case and allocate sufficient stack for ALL of -+           the arguments.  */ -+        sub     sp, sp, x3 -+ -+        /* unsigned (*prepare_fn) (struct call_context *context, -+				   unsigned char *stack, extended_cif *ecif); -+	 */ -+        mov     x23, x0 -+        mov     x0, x1 -+        mov     x1, sp -+        /* x2 already in place */ -+        blr     x23 -+ -+        /* Preserve the flags returned.  */ -+        mov     x23, x0 -+ -+        /* Figure out if we should touch the vector registers.  */ -+        tbz     x23, #AARCH64_FFI_WITH_V_BIT, 1f -+ -+        /* Load the vector argument passing registers.  */ -+        ldp     q0, q1, [x21, #8*32 +  0] -+        ldp     q2, q3, [x21, #8*32 + 32] -+        ldp     q4, q5, [x21, #8*32 + 64] -+        ldp     q6, q7, [x21, #8*32 + 96] -+1: -+        /* Load the core argument passing registers.  */ -+        ldp     x0, x1, [x21,  #0] -+        ldp     x2, x3, [x21, #16] -+        ldp     x4, x5, [x21, #32] -+        ldp     x6, x7, [x21, #48] -+ -+        /* Don't forget x8 which may be holding the address of a return buffer. -+	 */ -+        ldr     x8,     [x21, #8*8] -+ -+        blr     x24 -+ -+        /* Save the core argument passing registers.  */ -+        stp     x0, x1, [x21,  #0] -+        stp     x2, x3, [x21, #16] -+        stp     x4, x5, [x21, #32] -+        stp     x6, x7, [x21, #48] -+ -+        /* Note nothing useful ever comes back in x8!  */ -+ -+        /* Figure out if we should touch the vector registers.  */ -+        tbz     x23, #AARCH64_FFI_WITH_V_BIT, 1f -+ -+        /* Save the vector argument passing registers.  */ -+        stp     q0, q1, [x21, #8*32 + 0] -+        stp     q2, q3, [x21, #8*32 + 32] -+        stp     q4, q5, [x21, #8*32 + 64] -+        stp     q6, q7, [x21, #8*32 + 96] -+1: -+        /* All done, unwind our stack frame.  */ -+        ldp     x21, x22, [x29,  # - ffi_call_SYSV_FS] -+        cfi_restore (x21) -+        cfi_restore (x22) -+ -+        ldp     x23, x24, [x29,  # - ffi_call_SYSV_FS + 16] -+        cfi_restore (x23) -+        cfi_restore (x24) -+ -+        mov     sp, x29 -+	cfi_def_cfa_register (sp) -+ -+        ldp     x29, x30, [sp], #16 -+	cfi_adjust_cfa_offset (-16) -+        cfi_restore (x29) -+        cfi_restore (x30) -+ -+        ret -+ -+        .cfi_endproc -+        .size ffi_call_SYSV, .-ffi_call_SYSV -+ -+#define ffi_closure_SYSV_FS (8 * 2 + AARCH64_CALL_CONTEXT_SIZE) -+ -+/* ffi_closure_SYSV -+ -+   Closure invocation glue. This is the low level code invoked directly by -+   the closure trampoline to setup and call a closure. -+ -+   On entry x17 points to a struct trampoline_data, x16 has been clobbered -+   all other registers are preserved. -+ -+   We allocate a call context and save the argument passing registers, -+   then invoked the generic C ffi_closure_SYSV_inner() function to do all -+   the real work, on return we load the result passing registers back from -+   the call context. -+ -+   On entry -+ -+   extern void -+   ffi_closure_SYSV (struct trampoline_data *); -+ -+   struct trampoline_data -+   { -+        UINT64 *ffi_closure; -+        UINT64 flags; -+   }; -+ -+   This function uses the following stack frame layout: -+ -+   == -+                saved x30(lr) -+   x29(fp)->    saved x29(fp) -+                saved x22 -+                saved x21 -+                ... -+   sp     ->    call_context -+   == -+ -+   Voila!  */ -+ -+        .text -+        .globl ffi_closure_SYSV -+        .cfi_startproc -+ffi_closure_SYSV: -+        stp     x29, x30, [sp, #-16]! -+	cfi_adjust_cfa_offset (16) -+        cfi_rel_offset (x29, 0) -+        cfi_rel_offset (x30, 8) -+ -+        mov     x29, sp -+ -+        sub     sp, sp, #ffi_closure_SYSV_FS -+	cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) -+ -+        stp     x21, x22, [x29, #-16] -+        cfi_rel_offset (x21, 0) -+        cfi_rel_offset (x22, 8) -+ -+        /* Load x21 with &call_context.  */ -+        mov     x21, sp -+        /* Preserve our struct trampoline_data *  */ -+        mov     x22, x17 -+ -+        /* Save the rest of the argument passing registers.  */ -+        stp     x0, x1, [x21, #0] -+        stp     x2, x3, [x21, #16] -+        stp     x4, x5, [x21, #32] -+        stp     x6, x7, [x21, #48] -+        /* Don't forget we may have been given a result scratch pad address. -+	 */ -+        str     x8,     [x21, #64] -+ -+        /* Figure out if we should touch the vector registers.  */ -+        ldr     x0, [x22, #8] -+        tbz     x0, #AARCH64_FFI_WITH_V_BIT, 1f -+ -+        /* Save the argument passing vector registers.  */ -+        stp     q0, q1, [x21, #8*32 + 0] -+        stp     q2, q3, [x21, #8*32 + 32] -+        stp     q4, q5, [x21, #8*32 + 64] -+        stp     q6, q7, [x21, #8*32 + 96] -+1: -+        /* Load &ffi_closure..  */ -+        ldr     x0, [x22, #0] -+        mov     x1, x21 -+        /* Compute the location of the stack at the point that the -+           trampoline was called.  */ -+        add     x2, x29, #16 -+ -+        bl      ffi_closure_SYSV_inner -+ -+        /* Figure out if we should touch the vector registers.  */ -+        ldr     x0, [x22, #8] -+        tbz     x0, #AARCH64_FFI_WITH_V_BIT, 1f -+ -+        /* Load the result passing vector registers.  */ -+        ldp     q0, q1, [x21, #8*32 + 0] -+        ldp     q2, q3, [x21, #8*32 + 32] -+        ldp     q4, q5, [x21, #8*32 + 64] -+        ldp     q6, q7, [x21, #8*32 + 96] -+1: -+        /* Load the result passing core registers.  */ -+        ldp     x0, x1, [x21,  #0] -+        ldp     x2, x3, [x21, #16] -+        ldp     x4, x5, [x21, #32] -+        ldp     x6, x7, [x21, #48] -+        /* Note nothing usefull is returned in x8.  */ -+ -+        /* We are done, unwind our frame.  */ -+        ldp     x21, x22, [x29,  #-16] -+        cfi_restore (x21) -+        cfi_restore (x22) -+ -+        mov     sp, x29 -+	cfi_adjust_cfa_offset (-ffi_closure_SYSV_FS) -+ -+        ldp     x29, x30, [sp], #16 -+	cfi_adjust_cfa_offset (-16) -+        cfi_restore (x29) -+        cfi_restore (x30) -+ -+        ret -+        .cfi_endproc -+        .size ffi_closure_SYSV, .-ffi_closure_SYSV -diff --git a/testsuite/lib/libffi.exp b/testsuite/lib/libffi.exp -index 4a65ed1..8ee3f15 100644 ---- a/testsuite/lib/libffi.exp -+++ b/testsuite/lib/libffi.exp -@@ -203,6 +203,10 @@ proc libffi_target_compile { source dest type options } { -  -     lappend options "libs= -lffi" -  -+    if { [string match "aarch64*-*-linux*" $target_triplet] } { -+	lappend options "libs= -lpthread" -+    } -+ -     verbose "options: $options" -     return [target_compile $source $dest $type $options] - } ---  -1.7.9.5 - diff --git a/package/libffi/libffi.mk b/package/libffi/libffi.mk index 64b3eb412..9fb86d71c 100644 --- a/package/libffi/libffi.mk +++ b/package/libffi/libffi.mk @@ -4,12 +4,17 @@  #  ############################################################# -LIBFFI_VERSION = 3.0.11 -LIBFFI_SITE    = ftp://sources.redhat.com/pub/libffi/ +LIBFFI_VERSION = bcc0c28001b6d427d5cd8037d2e3c892babc6b4c +LIBFFI_SITE    = http://github.com/atgreen/libffi/tarball/$(LIBFFI_VERSION)  LIBFFI_LICENSE = MIT  LIBFFI_LICENSE_FILES = LICENSE  LIBFFI_INSTALL_STAGING = YES +# We're using a version from Git which strangely bundles a generated +# configure script, but it's broken (doesn't generate the libffi.pc +# file). +LIBFFI_AUTORECONF = YES +  # Newer CS MIPS toolchains use a different (compact) eh_frame format  # libffi don't like them, just switch to the older format  ifeq ($(BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_MIPS201209)$(BR2_TOOLCHAIN_EXTERNAL_CODESOURCERY_MIPS201203),y) @@ -17,9 +22,11 @@ LIBFFI_CONF_ENV = CFLAGS="$(TARGET_CFLAGS) -mno-compact-eh"  endif  # Move the headers to the usual location, and adjust the .pc file -# accordingly +# accordingly. For some reason, the libffi build system forgets to +# install the .pc file, so we do it manually.  define LIBFFI_MOVE_STAGING_HEADERS  	mv $(STAGING_DIR)/usr/lib/libffi-*/include/*.h $(STAGING_DIR)/usr/include/ +	$(INSTALL) -D -m 0644 $(@D)/libffi.pc $(STAGING_DIR)/usr/lib/pkgconfig/libffi.pc  	$(SED) '/^includedir.*/d' $(STAGING_DIR)/usr/lib/pkgconfig/libffi.pc  	$(SED) '/^Cflags:.*/d' $(STAGING_DIR)/usr/lib/pkgconfig/libffi.pc  	rm -rf $(TARGET_DIR)/usr/lib/libffi-* @@ -31,13 +38,23 @@ LIBFFI_POST_INSTALL_STAGING_HOOKS += LIBFFI_MOVE_STAGING_HEADERS  define LIBFFI_MOVE_TARGET_HEADERS  	install -d $(TARGET_DIR)/usr/include/  	mv $(TARGET_DIR)/usr/lib/libffi-*/include/*.h $(TARGET_DIR)/usr/include/ -	$(SED) '/^includedir.*/d' $(STAGING_DIR)/usr/lib/pkgconfig/libffi.pc -	$(SED) '/^Cflags:.*/d' $(STAGING_DIR)/usr/lib/pkgconfig/libffi.pc  	rm -rf $(TARGET_DIR)/usr/lib/libffi-*  endef  LIBFFI_POST_INSTALL_TARGET_HOOKS += LIBFFI_MOVE_TARGET_HEADERS +# We're using a version from Git which strangely bundles a generated +# configure script, but it's broken (doesn't generate the libffi.pc +# file). +HOST_LIBFFI_AUTORECONF = YES + +# For some reason, the libffi build system forgets to install the .pc +# file, so we do it manually. +define HOST_LIBFFI_INSTALL_PC_FILE +	$(INSTALL) -D $(@D)/libffi.pc $(HOST_DIR)/usr/lib/pkgconfig/libffi.pc +endef + +HOST_LIBFFI_POST_INSTALL_HOOKS += HOST_LIBFFI_INSTALL_PC_FILE +  $(eval $(autotools-package))  $(eval $(host-autotools-package)) -  | 
