OSDN Git Service

* Makefile.am: Add CRIS support.
authorhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Apr 2005 17:08:58 +0000 (17:08 +0000)
committerhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 18 Apr 2005 17:08:58 +0000 (17:08 +0000)
* configure.ac: Likewise.
* Makefile.in, configure, testsuite/Makefile.in: Regenerate.
* src/cris: New directory.
* src/cris/ffi.c, src/cris/sysv.S, src/cris/ffitarget.h: New files.
* src/prep_cif.c (ffi_prep_cif): Wrap in #ifndef __CRIS__.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@98332 138bc75d-0d04-0410-961f-82ee72b054a4

libffi/ChangeLog
libffi/Makefile.am
libffi/Makefile.in
libffi/configure
libffi/configure.ac
libffi/include/Makefile.in
libffi/src/cris/ffi.c [new file with mode: 0644]
libffi/src/cris/ffitarget.h [new file with mode: 0644]
libffi/src/cris/sysv.S [new file with mode: 0644]
libffi/src/prep_cif.c
libffi/testsuite/Makefile.in

index bea9a89..67f54d4 100644 (file)
@@ -1,4 +1,12 @@
-2005-04-18  Hans-Peter Nilsson  <hp@axis.com>
+2005-04-18  Simon Posnjak <simon.posnjak@siol.net> 
+           Hans-Peter Nilsson  <hp@axis.com>
+
+       * Makefile.am: Add CRIS support.
+       * configure.ac: Likewise.
+       * Makefile.in, configure, testsuite/Makefile.in: Regenerate.
+       * src/cris: New directory.
+       * src/cris/ffi.c, src/cris/sysv.S, src/cris/ffitarget.h: New files.
+       * src/prep_cif.c (ffi_prep_cif): Wrap in #ifndef __CRIS__.
 
        * testsuite/lib/libffi-dg.exp (libffi-dg-test-1): Replace \n with
        \r?\n in output tests.
index a91ccca..e82786c 100644 (file)
@@ -8,6 +8,7 @@ SUBDIRS = include testsuite
 EXTRA_DIST = LICENSE ChangeLog.v1 \
        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/cris/ffi.c src/cris/sysv.S src/cris/ffitarget.h \
        src/mips/ffi.c src/mips/n32.S src/mips/o32.S \
        src/mips/ffitarget.h \
        src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \
@@ -119,6 +120,9 @@ endif
 if ARM
 nodist_libffi_la_SOURCES += src/arm/sysv.S src/arm/ffi.c
 endif
+if LIBFFI_CRIS
+nodist_libffi_la_SOURCES += src/cris/sysv.S src/cris/ffi.c
+endif
 if FRV
 nodist_libffi_la_SOURCES += src/frv/eabi.S src/frv/ffi.c
 endif
index bd2dc02..f641e80 100644 (file)
@@ -52,12 +52,13 @@ target_triplet = @target@
 @POWERPC_AIX_TRUE@am__append_11 = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
 @POWERPC_DARWIN_TRUE@am__append_12 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
 @ARM_TRUE@am__append_13 = src/arm/sysv.S src/arm/ffi.c
-@FRV_TRUE@am__append_14 = src/frv/eabi.S src/frv/ffi.c
-@S390_TRUE@am__append_15 = src/s390/sysv.S src/s390/ffi.c
-@X86_64_TRUE@am__append_16 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
-@SH_TRUE@am__append_17 = src/sh/sysv.S src/sh/ffi.c
-@SH64_TRUE@am__append_18 = src/sh64/sysv.S src/sh64/ffi.c
-@PA_TRUE@am__append_19 = src/pa/linux.S src/pa/ffi.c
+@LIBFFI_CRIS_TRUE@am__append_14 = src/cris/sysv.S src/cris/ffi.c
+@FRV_TRUE@am__append_15 = src/frv/eabi.S src/frv/ffi.c
+@S390_TRUE@am__append_16 = src/s390/sysv.S src/s390/ffi.c
+@X86_64_TRUE@am__append_17 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
+@SH_TRUE@am__append_18 = src/sh/sysv.S src/sh/ffi.c
+@SH64_TRUE@am__append_19 = src/sh64/sysv.S src/sh64/ffi.c
+@PA_TRUE@am__append_20 = src/pa/linux.S src/pa/ffi.c
 DIST_COMMON = README $(am__configure_deps) $(srcdir)/../compile \
        $(srcdir)/../config.guess $(srcdir)/../config.sub \
        $(srcdir)/../depcomp $(srcdir)/../install-sh \
@@ -112,34 +113,35 @@ am_libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \
 @POWERPC_DARWIN_TRUE@  src/powerpc/darwin.lo \
 @POWERPC_DARWIN_TRUE@  src/powerpc/darwin_closure.lo
 @ARM_TRUE@am__objects_13 = src/arm/sysv.lo src/arm/ffi.lo
-@FRV_TRUE@am__objects_14 = src/frv/eabi.lo src/frv/ffi.lo
-@S390_TRUE@am__objects_15 = src/s390/sysv.lo src/s390/ffi.lo
-@X86_64_TRUE@am__objects_16 = src/x86/ffi64.lo src/x86/unix64.lo \
+@LIBFFI_CRIS_TRUE@am__objects_14 = src/cris/sysv.lo src/cris/ffi.lo
+@FRV_TRUE@am__objects_15 = src/frv/eabi.lo src/frv/ffi.lo
+@S390_TRUE@am__objects_16 = src/s390/sysv.lo src/s390/ffi.lo
+@X86_64_TRUE@am__objects_17 = src/x86/ffi64.lo src/x86/unix64.lo \
 @X86_64_TRUE@  src/x86/ffi.lo src/x86/sysv.lo
-@SH_TRUE@am__objects_17 = src/sh/sysv.lo src/sh/ffi.lo
-@SH64_TRUE@am__objects_18 = src/sh64/sysv.lo src/sh64/ffi.lo
-@PA_TRUE@am__objects_19 = src/pa/linux.lo src/pa/ffi.lo
+@SH_TRUE@am__objects_18 = src/sh/sysv.lo src/sh/ffi.lo
+@SH64_TRUE@am__objects_19 = src/sh64/sysv.lo src/sh64/ffi.lo
+@PA_TRUE@am__objects_20 = src/pa/linux.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) \
        $(am__objects_9) $(am__objects_10) $(am__objects_11) \
        $(am__objects_12) $(am__objects_13) $(am__objects_14) \
        $(am__objects_15) $(am__objects_16) $(am__objects_17) \
-       $(am__objects_18) $(am__objects_19)
+       $(am__objects_18) $(am__objects_19) $(am__objects_20)
 libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \
        $(nodist_libffi_la_OBJECTS)
 libffi_convenience_la_LIBADD =
-am__objects_20 = src/debug.lo src/prep_cif.lo src/types.lo \
+am__objects_21 = src/debug.lo src/prep_cif.lo src/types.lo \
        src/raw_api.lo src/java_raw_api.lo
-am_libffi_convenience_la_OBJECTS = $(am__objects_20)
-am__objects_21 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
+am_libffi_convenience_la_OBJECTS = $(am__objects_21)
+am__objects_22 = $(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) \
        $(am__objects_13) $(am__objects_14) $(am__objects_15) \
        $(am__objects_16) $(am__objects_17) $(am__objects_18) \
-       $(am__objects_19)
-nodist_libffi_convenience_la_OBJECTS = $(am__objects_21)
+       $(am__objects_19) $(am__objects_20)
+nodist_libffi_convenience_la_OBJECTS = $(am__objects_22)
 libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \
        $(nodist_libffi_convenience_la_OBJECTS)
 DEFAULT_INCLUDES = -I. -I$(srcdir) -I.
@@ -224,6 +226,8 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBFFI_CRIS_FALSE = @LIBFFI_CRIS_FALSE@
+LIBFFI_CRIS_TRUE = @LIBFFI_CRIS_TRUE@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
@@ -331,6 +335,7 @@ SUBDIRS = include testsuite
 EXTRA_DIST = LICENSE ChangeLog.v1 \
        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/cris/ffi.c src/cris/sysv.S src/cris/ffitarget.h \
        src/mips/ffi.c src/mips/n32.S src/mips/o32.S \
        src/mips/ffitarget.h \
        src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \
@@ -400,7 +405,7 @@ nodist_libffi_la_SOURCES = $(am__append_1) $(am__append_2) \
        $(am__append_9) $(am__append_10) $(am__append_11) \
        $(am__append_12) $(am__append_13) $(am__append_14) \
        $(am__append_15) $(am__append_16) $(am__append_17) \
-       $(am__append_18) $(am__append_19)
+       $(am__append_18) $(am__append_19) $(am__append_20)
 libffi_convenience_la_SOURCES = $(libffi_la_SOURCES)
 nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES)
 AM_CFLAGS = -Wall -g -fexceptions
@@ -621,6 +626,16 @@ src/arm/sysv.lo: src/arm/$(am__dirstamp) \
        src/arm/$(DEPDIR)/$(am__dirstamp)
 src/arm/ffi.lo: src/arm/$(am__dirstamp) \
        src/arm/$(DEPDIR)/$(am__dirstamp)
+src/cris/$(am__dirstamp):
+       @$(mkdir_p) src/cris
+       @: > src/cris/$(am__dirstamp)
+src/cris/$(DEPDIR)/$(am__dirstamp):
+       @$(mkdir_p) src/cris/$(DEPDIR)
+       @: > src/cris/$(DEPDIR)/$(am__dirstamp)
+src/cris/sysv.lo: src/cris/$(am__dirstamp) \
+       src/cris/$(DEPDIR)/$(am__dirstamp)
+src/cris/ffi.lo: src/cris/$(am__dirstamp) \
+       src/cris/$(DEPDIR)/$(am__dirstamp)
 src/frv/$(am__dirstamp):
        @$(mkdir_p) src/frv
        @: > src/frv/$(am__dirstamp)
@@ -688,6 +703,10 @@ mostlyclean-compile:
        -rm -f src/arm/ffi.lo
        -rm -f src/arm/sysv.$(OBJEXT)
        -rm -f src/arm/sysv.lo
+       -rm -f src/cris/ffi.$(OBJEXT)
+       -rm -f src/cris/ffi.lo
+       -rm -f src/cris/sysv.$(OBJEXT)
+       -rm -f src/cris/sysv.lo
        -rm -f src/debug.$(OBJEXT)
        -rm -f src/debug.lo
        -rm -f src/frv/eabi.$(OBJEXT)
@@ -783,6 +802,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/types.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/ffi.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/ffi.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/ffi.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/frv/$(DEPDIR)/ffi.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/ia64/$(DEPDIR)/ffi.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/m32r/$(DEPDIR)/ffi.Plo@am__quote@
@@ -839,6 +859,7 @@ clean-libtool:
        -rm -rf src/.libs src/_libs
        -rm -rf src/alpha/.libs src/alpha/_libs
        -rm -rf src/arm/.libs src/arm/_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
        -rm -rf src/m32r/.libs src/m32r/_libs
@@ -996,7 +1017,7 @@ distclean-tags:
 distdir: $(DISTFILES)
        $(am__remove_distdir)
        mkdir $(distdir)
-       $(mkdir_p) $(distdir)/.. $(distdir)/../config $(distdir)/include $(distdir)/src/alpha $(distdir)/src/arm $(distdir)/src/frv $(distdir)/src/m32r $(distdir)/src/m68k $(distdir)/src/mips $(distdir)/src/pa $(distdir)/src/powerpc $(distdir)/src/s390 $(distdir)/src/sh $(distdir)/src/sh64 $(distdir)/src/sparc $(distdir)/src/x86
+       $(mkdir_p) $(distdir)/.. $(distdir)/../config $(distdir)/include $(distdir)/src/alpha $(distdir)/src/arm $(distdir)/src/cris $(distdir)/src/frv $(distdir)/src/m32r $(distdir)/src/m68k $(distdir)/src/mips $(distdir)/src/pa $(distdir)/src/powerpc $(distdir)/src/s390 $(distdir)/src/sh $(distdir)/src/sh64 $(distdir)/src/sparc $(distdir)/src/x86
        @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
        topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
        list='$(DISTFILES)'; for file in $$list; do \
@@ -1169,6 +1190,8 @@ distclean-generic:
        -rm -f src/alpha/$(am__dirstamp)
        -rm -f src/arm/$(DEPDIR)/$(am__dirstamp)
        -rm -f src/arm/$(am__dirstamp)
+       -rm -f src/cris/$(DEPDIR)/$(am__dirstamp)
+       -rm -f src/cris/$(am__dirstamp)
        -rm -f src/frv/$(DEPDIR)/$(am__dirstamp)
        -rm -f src/frv/$(am__dirstamp)
        -rm -f src/ia64/$(DEPDIR)/$(am__dirstamp)
@@ -1204,7 +1227,7 @@ clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \
 
 distclean: distclean-multi distclean-recursive
        -rm -f $(am__CONFIG_DISTCLEAN_FILES)
-       -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(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/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(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
@@ -1232,7 +1255,7 @@ installcheck-am:
 maintainer-clean: maintainer-clean-multi 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/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(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/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(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-generic
 
index 9de0e6f..2f03f25 100755 (executable)
@@ -310,7 +310,7 @@ ac_includes_default="\
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS multi_basedir build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CFLAGS CCAS CCASFLAGS LN_S RANLIB ac_ct_RANLIB LIBTOOL MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CPP CPPFLAGS EGREP TESTSUBDIR_TRUE TESTSUBDIR_FALSE AM_RUNTESTFLAGS MIPS_IRIX_TRUE MIPS_IRIX_FALSE MIPS_LINUX_TRUE MIPS_LINUX_FALSE SPARC_TRUE SPARC_FALSE X86_TRUE X86_FALSE X86_WIN32_TRUE X86_WIN32_FALSE ALPHA_TRUE ALPHA_FALSE IA64_TRUE IA64_FALSE M32R_TRUE M32R_FALSE M68K_TRUE M68K_FALSE POWERPC_TRUE POWERPC_FALSE POWERPC_AIX_TRUE POWERPC_AIX_FALSE POWERPC_DARWIN_TRUE POWERPC_DARWIN_FALSE ARM_TRUE ARM_FALSE FRV_TRUE FRV_FALSE S390_TRUE S390_FALSE X86_64_TRUE X86_64_FALSE SH_TRUE SH_FALSE SH64_TRUE SH64_FALSE PA_TRUE PA_FALSE ALLOCA HAVE_LONG_DOUBLE TARGET TARGETDIR toolexecdir toolexeclibdir LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS multi_basedir build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar CC ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CFLAGS CCAS CCASFLAGS LN_S RANLIB ac_ct_RANLIB LIBTOOL MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT CPP CPPFLAGS EGREP TESTSUBDIR_TRUE TESTSUBDIR_FALSE AM_RUNTESTFLAGS MIPS_IRIX_TRUE MIPS_IRIX_FALSE MIPS_LINUX_TRUE MIPS_LINUX_FALSE SPARC_TRUE SPARC_FALSE X86_TRUE X86_FALSE X86_WIN32_TRUE X86_WIN32_FALSE ALPHA_TRUE ALPHA_FALSE IA64_TRUE IA64_FALSE M32R_TRUE M32R_FALSE M68K_TRUE M68K_FALSE POWERPC_TRUE POWERPC_FALSE POWERPC_AIX_TRUE POWERPC_AIX_FALSE POWERPC_DARWIN_TRUE POWERPC_DARWIN_FALSE ARM_TRUE ARM_FALSE LIBFFI_CRIS_TRUE LIBFFI_CRIS_FALSE FRV_TRUE FRV_FALSE S390_TRUE S390_FALSE X86_64_TRUE X86_64_FALSE SH_TRUE SH_FALSE SH64_TRUE SH64_FALSE PA_TRUE PA_FALSE ALLOCA HAVE_LONG_DOUBLE TARGET TARGETDIR toolexecdir toolexeclibdir LIBOBJS LTLIBOBJS'
 ac_subst_files=''
 
 # Initialize some variables set by options.
@@ -5403,6 +5403,7 @@ powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
 rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
 arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;;
 arm*-*-netbsdelf* | arm*-*-knetbsd*-gnu) TARGET=ARM; TARGETDIR=arm;;
+cris-*-*) TARGET=LIBFFI_CRIS; TARGETDIR=cris;;
 s390-*-linux-*) TARGET=S390; TARGETDIR=s390;;
 s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;;
 x86_64-*-linux* | x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu) TARGET=X86_64; TARGETDIR=x86;;
@@ -5551,6 +5552,16 @@ fi
 
 
 
+if test x$TARGET = xLIBFFI_CRIS; then
+  LIBFFI_CRIS_TRUE=
+  LIBFFI_CRIS_FALSE='#'
+else
+  LIBFFI_CRIS_TRUE='#'
+  LIBFFI_CRIS_FALSE=
+fi
+
+
+
 if test x$TARGET = xFRV; then
   FRV_TRUE=
   FRV_FALSE='#'
@@ -7083,6 +7094,13 @@ echo "$as_me: error: conditional \"ARM\" was never defined.
 Usually this means the macro was only invoked conditionally." >&2;}
    { (exit 1); exit 1; }; }
 fi
+if test -z "${LIBFFI_CRIS_TRUE}" && test -z "${LIBFFI_CRIS_FALSE}"; then
+  { { echo "$as_me:$LINENO: error: conditional \"LIBFFI_CRIS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"LIBFFI_CRIS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+   { (exit 1); exit 1; }; }
+fi
 if test -z "${FRV_TRUE}" && test -z "${FRV_FALSE}"; then
   { { echo "$as_me:$LINENO: error: conditional \"FRV\" was never defined.
 Usually this means the macro was only invoked conditionally." >&5
@@ -7770,6 +7788,8 @@ s,@POWERPC_DARWIN_TRUE@,$POWERPC_DARWIN_TRUE,;t t
 s,@POWERPC_DARWIN_FALSE@,$POWERPC_DARWIN_FALSE,;t t
 s,@ARM_TRUE@,$ARM_TRUE,;t t
 s,@ARM_FALSE@,$ARM_FALSE,;t t
+s,@LIBFFI_CRIS_TRUE@,$LIBFFI_CRIS_TRUE,;t t
+s,@LIBFFI_CRIS_FALSE@,$LIBFFI_CRIS_FALSE,;t t
 s,@FRV_TRUE@,$FRV_TRUE,;t t
 s,@FRV_FALSE@,$FRV_FALSE,;t t
 s,@S390_TRUE@,$S390_TRUE,;t t
index ba35e76..7bcdaaa 100644 (file)
@@ -68,6 +68,7 @@ powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
 rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
 arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;;
 arm*-*-netbsdelf* | arm*-*-knetbsd*-gnu) TARGET=ARM; TARGETDIR=arm;;
+cris-*-*) TARGET=LIBFFI_CRIS; TARGETDIR=cris;;
 s390-*-linux-*) TARGET=S390; TARGETDIR=s390;;
 s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;;
 x86_64-*-linux* | x86_64-*-freebsd* | x86_64-*-kfreebsd*-gnu) TARGET=X86_64; TARGETDIR=x86;;
@@ -95,6 +96,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(ARM, test x$TARGET = xARM)
+AM_CONDITIONAL(LIBFFI_CRIS, test x$TARGET = xLIBFFI_CRIS)
 AM_CONDITIONAL(FRV, test x$TARGET = xFRV)
 AM_CONDITIONAL(S390, test x$TARGET = xS390)
 AM_CONDITIONAL(X86_64, test x$TARGET = xX86_64)
index 5812268..e02253b 100644 (file)
@@ -104,6 +104,8 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBFFI_CRIS_FALSE = @LIBFFI_CRIS_FALSE@
+LIBFFI_CRIS_TRUE = @LIBFFI_CRIS_TRUE@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
diff --git a/libffi/src/cris/ffi.c b/libffi/src/cris/ffi.c
new file mode 100644 (file)
index 0000000..364c990
--- /dev/null
@@ -0,0 +1,381 @@
+/* -----------------------------------------------------------------------
+   ffi.c - Copyright (c) 1998 Cygnus Solutions
+           Copyright (c) 2004 Simon Posnjak
+          Copyright (c) 2005 Axis Communications AB
+
+   CRIS 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 SIMON POSNJAK 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>
+
+#define STACK_ARG_SIZE(x) ALIGN(x, FFI_SIZEOF_ARG)
+
+static ffi_status
+initialize_aggregate_packed_struct (ffi_type * arg)
+{
+  ffi_type **ptr;
+
+  FFI_ASSERT (arg != NULL);
+
+  FFI_ASSERT (arg->elements != NULL);
+  FFI_ASSERT (arg->size == 0);
+  FFI_ASSERT (arg->alignment == 0);
+
+  ptr = &(arg->elements[0]);
+
+  while ((*ptr) != NULL)
+    {
+      if (((*ptr)->size == 0)
+         && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK))
+       return FFI_BAD_TYPEDEF;
+
+      FFI_ASSERT (ffi_type_test ((*ptr)));
+
+      arg->size += (*ptr)->size;
+
+      arg->alignment = (arg->alignment > (*ptr)->alignment) ?
+       arg->alignment : (*ptr)->alignment;
+
+      ptr++;
+    }
+
+  if (arg->size == 0)
+    return FFI_BAD_TYPEDEF;
+  else
+    return FFI_OK;
+}
+
+int
+ffi_prep_args (char *stack, extended_cif * ecif)
+{
+  unsigned int i;
+  unsigned int struct_count = 0;
+  void **p_argv;
+  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;
+
+      switch ((*p_arg)->type)
+       {
+       case FFI_TYPE_STRUCT:
+         {
+           z = (*p_arg)->size;
+           if (z <= 4)
+             {
+               memcpy (argp, *p_argv, z);
+               z = 4;
+             }
+           else if (z <= 8)
+             {
+               memcpy (argp, *p_argv, z);
+               z = 8;
+             }
+           else
+             {
+               unsigned int uiLocOnStack;
+               z = sizeof (void *);
+               uiLocOnStack = 4 * ecif->cif->nargs + struct_count;
+               struct_count = struct_count + (*p_arg)->size;
+               *(unsigned int *) argp =
+                 (unsigned int) (UINT32 *) (stack + uiLocOnStack);
+               memcpy ((stack + uiLocOnStack), *p_argv, (*p_arg)->size);
+             }
+           break;
+         }
+       default:
+         z = (*p_arg)->size;
+         if (z < sizeof (int))
+           {
+             switch ((*p_arg)->type)
+               {
+               case FFI_TYPE_SINT8:
+                 *(signed int *) argp = (signed int) *(SINT8 *) (*p_argv);
+                 break;
+
+               case FFI_TYPE_UINT8:
+                 *(unsigned int *) argp =
+                   (unsigned int) *(UINT8 *) (*p_argv);
+                 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;
+
+               default:
+                 FFI_ASSERT (0);
+               }
+             z = sizeof (int);
+           }
+         else if (z == sizeof (int))
+           *(unsigned int *) argp = (unsigned int) *(UINT32 *) (*p_argv);
+         else
+           memcpy (argp, *p_argv, z);
+         break;
+       }
+      p_argv++;
+      argp += z;
+    }
+
+  return (struct_count);
+}
+
+ffi_status
+ffi_prep_cif (ffi_cif * cif,
+             ffi_abi abi, unsigned int nargs,
+             ffi_type * rtype, ffi_type ** atypes)
+{
+  unsigned bytes = 0;
+  unsigned int i;
+  ffi_type **ptr;
+
+  FFI_ASSERT (cif != NULL);
+  FFI_ASSERT ((abi > FFI_FIRST_ABI) && (abi <= FFI_DEFAULT_ABI));
+
+  cif->abi = abi;
+  cif->arg_types = atypes;
+  cif->nargs = nargs;
+  cif->rtype = rtype;
+
+  cif->flags = 0;
+
+  if ((cif->rtype->size == 0)
+      && (initialize_aggregate_packed_struct (cif->rtype) != FFI_OK))
+    return FFI_BAD_TYPEDEF;
+
+  FFI_ASSERT_VALID_TYPE (cif->rtype);
+
+  for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++)
+    {
+      if (((*ptr)->size == 0)
+         && (initialize_aggregate_packed_struct ((*ptr)) != FFI_OK))
+       return FFI_BAD_TYPEDEF;
+
+      FFI_ASSERT_VALID_TYPE (*ptr);
+
+      if (((*ptr)->alignment - 1) & bytes)
+       bytes = ALIGN (bytes, (*ptr)->alignment);
+      if ((*ptr)->type == FFI_TYPE_STRUCT)
+       {
+         if ((*ptr)->size > 8)
+           {
+             bytes += (*ptr)->size;
+             bytes += sizeof (void *);
+           }
+         else
+           {
+             if ((*ptr)->size > 4)
+               bytes += 8;
+             else
+               bytes += 4;
+           }
+       }
+      else
+       bytes += STACK_ARG_SIZE ((*ptr)->size);
+    }
+
+  cif->bytes = bytes;
+
+  return ffi_prep_cif_machdep (cif);
+}
+
+ffi_status
+ffi_prep_cif_machdep (ffi_cif * cif)
+{
+  switch (cif->rtype->type)
+    {
+    case FFI_TYPE_VOID:
+    case FFI_TYPE_STRUCT:
+    case FFI_TYPE_FLOAT:
+    case FFI_TYPE_DOUBLE:
+    case FFI_TYPE_SINT64:
+    case FFI_TYPE_UINT64:
+      cif->flags = (unsigned) cif->rtype->type;
+      break;
+
+    default:
+      cif->flags = FFI_TYPE_INT;
+      break;
+    }
+
+  return FFI_OK;
+}
+
+extern void ffi_call_SYSV (int (*)(char *, extended_cif *),
+                          extended_cif *,
+                          unsigned, unsigned, unsigned *, void (*fn) ())
+     __attribute__ ((__visibility__ ("hidden")));
+
+void
+ffi_call (ffi_cif * cif, void (*fn) (), void *rvalue, void **avalue)
+{
+  extended_cif ecif;
+
+  ecif.cif = cif;
+  ecif.avalue = avalue;
+
+  if ((rvalue == NULL) && (cif->rtype->type == FFI_TYPE_STRUCT))
+    {
+      ecif.rvalue = alloca (cif->rtype->size);
+    }
+  else
+    ecif.rvalue = rvalue;
+
+  switch (cif->abi)
+    {
+    case FFI_SYSV:
+      ffi_call_SYSV (ffi_prep_args, &ecif, cif->bytes,
+                    cif->flags, ecif.rvalue, fn);
+      break;
+    default:
+      FFI_ASSERT (0);
+      break;
+    }
+}
+
+/* Because the following variables are not exported outside libffi, we
+   mark them hidden.  */
+
+/* Assembly code for the jump stub.  */
+extern const char ffi_cris_trampoline_template[]
+ __attribute__ ((__visibility__ ("hidden")));
+
+/* Offset into ffi_cris_trampoline_template of where to put the
+   ffi_prep_closure_inner function.  */
+extern const int ffi_cris_trampoline_fn_offset
+ __attribute__ ((__visibility__ ("hidden")));
+
+/* Offset into ffi_cris_trampoline_template of where to put the
+   closure data.  */
+extern const int ffi_cris_trampoline_closure_offset
+ __attribute__ ((__visibility__ ("hidden")));
+
+/* This function is sibling-called (jumped to) by the closure
+   trampoline.  We get R10..R13 at PARAMS[0..3] and a copy of [SP] at
+   PARAMS[4] to simplify handling of a straddling parameter.  A copy
+   of R9 is at PARAMS[5] and SP at PARAMS[6].  These parameters are
+   put at the appropriate place in CLOSURE which is then executed and
+   the return value is passed back to the caller.  */
+
+static unsigned long long
+ffi_prep_closure_inner (void **params, ffi_closure* closure)
+{
+  char *register_args = (char *) params;
+  void *struct_ret = params[5];
+  char *stack_args = params[6];
+  char *ptr = register_args;
+  ffi_cif *cif = closure->cif;
+  ffi_type **arg_types = cif->arg_types;
+
+  /* Max room needed is number of arguments as 64-bit values.  */
+  void **avalue = alloca (closure->cif->nargs * sizeof(void *));
+  int i;
+  int doing_regs;
+  long long llret = 0;
+
+  /* Find the address of each argument.  */
+  for (i = 0, doing_regs = 1; i < cif->nargs; i++)
+    {
+      /* Types up to and including 8 bytes go by-value.  */
+      if (arg_types[i]->size <= 4)
+       {
+         avalue[i] = ptr;
+         ptr += 4;
+       }
+      else if (arg_types[i]->size <= 8)
+       {
+         avalue[i] = ptr;
+         ptr += 8;
+       }
+      else
+       {
+         FFI_ASSERT (arg_types[i]->type == FFI_TYPE_STRUCT);
+
+         /* Passed by-reference, so copy the pointer.  */
+         avalue[i] = *(void **) ptr;
+         ptr += 4;
+       }
+
+      /* If we've handled more arguments than fit in registers, start
+        looking at the those passed on the stack.  Step over the
+        first one if we had a straddling parameter.  */
+      if (doing_regs && ptr >= register_args + 4*4)
+       {
+         ptr = stack_args + ((ptr > register_args + 4*4) ? 4 : 0);
+         doing_regs = 0;
+       }
+    }
+
+  /* Invoke the closure.  */
+  (closure->fun) (cif,
+
+                 cif->rtype->type == FFI_TYPE_STRUCT
+                 /* The caller allocated space for the return
+                    structure, and passed a pointer to this space in
+                    R9.  */
+                 ? struct_ret
+
+                 /* We take advantage of being able to ignore that
+                    the high part isn't set if the return value is
+                    not in R10:R11, but in R10 only.  */
+                 : (void *) &llret,
+
+                 avalue, closure->user_data);
+
+  return llret;
+}
+
+/* API function: Prepare the trampoline.  */
+
+ffi_status
+ffi_prep_closure (ffi_closure* closure,
+                 ffi_cif* cif,
+                 void (*fun)(ffi_cif *, void *, void **, void*),
+                 void *user_data)
+{
+  void *innerfn = ffi_prep_closure_inner;
+  FFI_ASSERT (cif->abi == FFI_SYSV);
+  closure->cif  = cif;
+  closure->user_data = user_data;
+  closure->fun  = fun;
+  memcpy (closure->tramp, ffi_cris_trampoline_template,
+         FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE);
+  memcpy (closure->tramp + ffi_cris_trampoline_fn_offset,
+         &innerfn, sizeof (void *));
+  memcpy (closure->tramp + ffi_cris_trampoline_closure_offset,
+         &closure, sizeof (void *));
+
+  return FFI_OK;
+}
diff --git a/libffi/src/cris/ffitarget.h b/libffi/src/cris/ffitarget.h
new file mode 100644 (file)
index 0000000..3fb937c
--- /dev/null
@@ -0,0 +1,50 @@
+/* -----------------------------------------------------------------*-C-*-
+   ffitarget.h - Copyright (c) 1996-2003  Red Hat, Inc.
+   Target configuration macros for CRIS.
+
+   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 CYGNUS SOLUTIONS 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_DEFAULT_ABI = FFI_SYSV,
+  FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
+} ffi_abi;
+#endif
+
+/* ---- Definitions for closures ----------------------------------------- */
+
+#define FFI_CLOSURES 1
+#define FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE 36
+#define FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE (7*4)
+#define FFI_TRAMPOLINE_SIZE \
+ (FFI_CRIS_TRAMPOLINE_CODE_PART_SIZE + FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE)
+#define FFI_NATIVE_RAW_API 0
+
+#endif
diff --git a/libffi/src/cris/sysv.S b/libffi/src/cris/sysv.S
new file mode 100644 (file)
index 0000000..79abaee
--- /dev/null
@@ -0,0 +1,215 @@
+/* -----------------------------------------------------------------------
+   sysv.S - Copyright (c) 2004 Simon Posnjak
+           Copyright (c) 2005 Axis Communications AB
+
+   CRIS 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 SIMON POSNJAK 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 <ffi.h>
+#define CONCAT(x,y) x ## y
+#define XCONCAT(x,y) CONCAT (x, y)
+#define L(x) XCONCAT (__USER_LABEL_PREFIX__, x)
+
+       .text
+
+       ;; OK, when we get called we should have this (according to
+       ;; AXIS ETRAX 100LX Programmer's Manual chapter 6.3).
+       ;;
+       ;; R10:  ffi_prep_args (func. pointer)
+       ;; R11:  &ecif
+       ;; R12:  cif->bytes
+       ;; R13:  fig->flags
+       ;; sp+0: ecif.rvalue
+       ;; sp+4: fn (function pointer to the function that we need to call)
+
+       .globl  L(ffi_call_SYSV)
+       .type   L(ffi_call_SYSV),@function
+       .hidden L(ffi_call_SYSV)
+
+L(ffi_call_SYSV):
+       ;; Save the regs to the stack.
+       push $srp
+       ;; Used for stack pointer saving.
+       push $r6
+       ;; Used for function address pointer.
+       push $r7
+       ;; Used for stack pointer saving.
+       push $r8
+       ;; We save fig->flags to stack we will need them after we
+       ;; call The Function.
+       push $r13
+
+       ;; Saving current stack pointer.
+       move.d $sp,$r8
+       move.d $sp,$r6
+
+       ;; Move address of ffi_prep_args to r13.
+       move.d $r10,$r13
+
+       ;; Make room on the stack for the args of fn.
+       sub.d  $r12,$sp
+
+       ;; Function void ffi_prep_args(char *stack, extended_cif *ecif) parameters are:
+       ;;      r10 <-- stack pointer
+       ;;      r11 <-- &ecif (already there)
+       move.d $sp,$r10
+
+       ;; Call the function.
+       jsr $r13
+
+       ;; Save the size of the structures which are passed on stack.
+       move.d $r10,$r7
+
+       ;; Move first four args in to r10..r13.
+       move.d [$sp+0],$r10
+       move.d [$sp+4],$r11
+       move.d [$sp+8],$r12
+       move.d [$sp+12],$r13
+
+       ;; Adjust the stack and check if any parameters are given on stack.
+       addq 16,$sp
+       sub.d $r7,$r6
+       cmp.d $sp,$r6
+
+       bpl go_on
+       nop
+
+go_on_no_params_on_stack:
+       move.d $r6,$sp
+
+go_on:
+       ;; Discover if we need to put rval address in to r9.
+       move.d [$r8+0],$r7
+       cmpq FFI_TYPE_STRUCT,$r7
+       bne call_now
+       nop
+
+       ;; Move rval address to $r9.
+       move.d [$r8+20],$r9
+
+call_now:
+       ;; Move address of The Function in to r7.
+       move.d [$r8+24],$r7
+
+       ;; Call The Function.
+       jsr $r7
+
+       ;; Reset stack.
+       move.d $r8,$sp
+
+       ;; Load rval type (fig->flags) in to r13.
+       pop $r13
+
+       ;; Detect rval type.
+       cmpq FFI_TYPE_VOID,$r13
+       beq epilogue
+
+       cmpq FFI_TYPE_STRUCT,$r13
+       beq epilogue
+
+       cmpq FFI_TYPE_DOUBLE,$r13
+       beq return_double_or_longlong
+
+       cmpq FFI_TYPE_UINT64,$r13
+       beq return_double_or_longlong
+
+       cmpq FFI_TYPE_SINT64,$r13
+       beq return_double_or_longlong
+       nop
+
+       ;; Just return the 32 bit value.
+       ba return
+       nop
+
+return_double_or_longlong:
+       ;; Load half of the rval to r10 and the other half to r11.
+       move.d [$sp+16],$r13
+       move.d $r10,[$r13]
+       addq 4,$r13
+       move.d $r11,[$r13]
+       ba epilogue
+       nop
+
+return:
+       ;; Load the rval to r10.
+       move.d [$sp+16],$r13
+       move.d $r10,[$r13]
+
+epilogue:
+       pop $r8
+       pop $r7
+       pop $r6
+       Jump [$sp+]
+
+       .size   ffi_call_SYSV,.-ffi_call_SYSV
+
+/* Save R10..R13 into an array, somewhat like varargs.  Copy the next
+   argument too, to simplify handling of any straddling parameter.
+   Save R9 and SP after those.  Jump to function handling the rest.
+   Since this is a template, copied and the main function filled in by
+   the user.  */
+
+       .globl  L(ffi_cris_trampoline_template)
+       .type   L(ffi_cris_trampoline_template),@function
+       .hidden L(ffi_cris_trampoline_template)
+
+L(ffi_cris_trampoline_template):
+0:
+       /* The value we get for "PC" is right after the prefix instruction,
+          two bytes from the beginning, i.e. 0b+2. */
+       move.d $r10,[$pc+2f-(0b+2)]
+       move.d $pc,$r10
+1:
+       addq 2f-1b+4,$r10
+       move.d $r11,[$r10+]
+       move.d $r12,[$r10+]
+       move.d $r13,[$r10+]
+       move.d [$sp],$r11
+       move.d $r11,[$r10+]
+       move.d $r9,[$r10+]
+       move.d $sp,[$r10+]
+       subq FFI_CRIS_TRAMPOLINE_DATA_PART_SIZE,$r10
+       move.d 0,$r11
+3:
+        jump 0
+2:
+       .size   ffi_cris_trampoline_template,.-0b
+
+/* This macro create a constant usable as "extern const int \name" in
+   C from within libffi, when \name has no prefix decoration.  */
+
+       .macro const name,value
+       .globl  \name
+       .type   \name,@object
+       .hidden \name
+\name:
+       .dword  \value
+       .size   \name,4
+       .endm
+
+/* Constants for offsets within the trampoline.  We could do this with
+   just symbols, avoiding memory contents and memory accesses, but the
+   C usage code would look a bit stranger.  */
+
+       const L(ffi_cris_trampoline_fn_offset),2b-4-0b
+       const L(ffi_cris_trampoline_closure_offset),3b-4-0b
index 3347756..0faa5dd 100644 (file)
@@ -81,6 +81,11 @@ static ffi_status initialize_aggregate(/*@out@*/ ffi_type *arg)
   /*@=usedef@*/
 }
 
+#ifndef __CRIS__
+/* The CRIS ABI specifies structure elements to have byte
+   alignment only, so it completely overrides this functions,
+   which assumes "natural" alignment and padding.  */
+
 /* Perform machine independent ffi_cif preparation, then call
    machine dependent routine. */
 
@@ -158,3 +163,4 @@ ffi_status ffi_prep_cif(/*@out@*/ /*@partial@*/ ffi_cif *cif,
   /* Perform machine dependent cif processing */
   return ffi_prep_cif_machdep(cif);
 }
+#endif /* not __CRIS__ */
index 7d51981..2dc56ce 100644 (file)
@@ -90,6 +90,8 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LIBFFI_CRIS_FALSE = @LIBFFI_CRIS_FALSE@
+LIBFFI_CRIS_TRUE = @LIBFFI_CRIS_TRUE@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@