diff options
Diffstat (limited to 'package/libffi')
-rw-r--r-- | package/libffi/libffi-blackfin-support.patch | 1021 | ||||
-rw-r--r-- | package/libffi/libffi.mk | 2 |
2 files changed, 1022 insertions, 1 deletions
diff --git a/package/libffi/libffi-blackfin-support.patch b/package/libffi/libffi-blackfin-support.patch new file mode 100644 index 000000000..1af0fce15 --- /dev/null +++ b/package/libffi/libffi-blackfin-support.patch @@ -0,0 +1,1021 @@ +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> + +Index: libffi/ChangeLog +=================================================================== +--- libffi.orig/ChangeLog ++++ libffi/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. +Index: libffi/Makefile.am +=================================================================== +--- libffi.orig/Makefile.am ++++ libffi/Makefile.am +@@ -27,6 +27,7 @@ EXTRA_DIST = LICENSE ChangeLog.v1 Change + 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 +Index: libffi/Makefile.in +=================================================================== +--- libffi.orig/Makefile.in ++++ libffi/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_dep + 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 s + @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 + $(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__ + $(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 Change + 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_ + $(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 cle + + 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 +Index: libffi/configure +=================================================================== +--- libffi.orig/configure ++++ libffi/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_BUI + 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 "${ + 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 +Index: libffi/configure.ac +=================================================================== +--- libffi.orig/configure.ac ++++ libffi/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) +Index: libffi/src/bfin/ffi.c +=================================================================== +--- /dev/null ++++ libffi/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; ++ } ++} ++ ++ ++ +Index: libffi/src/bfin/ffitarget.h +=================================================================== +--- /dev/null ++++ libffi/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 ++ +Index: libffi/src/bfin/sysv.S +=================================================================== +--- /dev/null ++++ libffi/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 +Index: libffi/README +=================================================================== +--- libffi.orig/README ++++ libffi/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/package/libffi/libffi.mk b/package/libffi/libffi.mk index 2181ea1be..adcd6f81e 100644 --- a/package/libffi/libffi.mk +++ b/package/libffi/libffi.mk @@ -4,7 +4,7 @@ # ############################################################# -LIBFFI_VERSION = 3.0.10 +LIBFFI_VERSION = 3.0.11 LIBFFI_SITE = ftp://sources.redhat.com/pub/libffi/ LIBFFI_INSTALL_STAGING = YES |