patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch
changeset 1 eeea35fbf182
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch	Sat Feb 24 11:00:05 2007 +0000
     1.3 @@ -0,0 +1,6864 @@
     1.4 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.am gcc/libffi/Makefile.am
     1.5 +--- gcc-3.2.2.orig/libffi/Makefile.am	Tue Jan 28 10:43:56 2003
     1.6 ++++ gcc/libffi/Makefile.am	Tue Jan 28 10:48:33 2003
     1.7 +@@ -8,14 +8,17 @@
     1.8 + 		src/mips/n32.s src/mips/o32.S src/mips/o32.s \
     1.9 + 		src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \
    1.10 + 		src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \
    1.11 ++		src/x86/ffi64.c src/x86/unix64.S \
    1.12 + 		src/alpha/ffi.c src/alpha/osf.S \
    1.13 + 		src/m68k/ffi.c src/m68k/sysv.S \
    1.14 + 		src/powerpc/ffi.c src/powerpc/sysv.S \
    1.15 + 		src/powerpc/ppc_closure.S src/powerpc/asm.h \
    1.16 + 		src/powerpc/ffi_darwin.c \
    1.17 + 		src/powerpc/darwin.S src/powerpc/aix.S \
    1.18 +-		src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \
    1.19 +-		src/arm/ffi.c src/arm/sysv.S
    1.20 ++		src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \
    1.21 ++		src/arm/ffi.c src/arm/sysv.S \
    1.22 ++		src/s390/ffi.c src/s390/sysv.S \
    1.23 ++		src/sh/ffi.c src/sh/sysv.S
    1.24 + 
    1.25 + VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@
    1.26 + 
    1.27 +@@ -83,6 +86,7 @@
    1.28 + ffitest_LDFLAGS = -shared-libgcc
    1.29 + 
    1.30 + TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S
    1.31 ++TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S
    1.32 + TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s
    1.33 + TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S
    1.34 + TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S
    1.35 +@@ -91,9 +95,12 @@
    1.36 + TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S
    1.37 + TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S
    1.38 + TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
    1.39 +-TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S
    1.40 ++TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
    1.41 + TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
    1.42 + TARGET_SRC_ARM =  src/arm/sysv.S src/arm/ffi.c
    1.43 ++TARGET_SRC_S390 =  src/s390/sysv.S src/s390/ffi.c
    1.44 ++TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
    1.45 ++TARGET_SRC_SH =  src/sh/sysv.S src/sh/ffi.c
    1.46 + 
    1.47 + ##libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c $(TARGET_SRC_@TARGET@)
    1.48 + ## Work around automake deficiency
    1.49 +@@ -103,6 +110,10 @@
    1.50 + libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
    1.51 + libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
    1.52 + endif
    1.53 ++if MIPS_LINUX
    1.54 ++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
    1.55 ++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
    1.56 ++endif
    1.57 + if MIPS_SGI
    1.58 + libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
    1.59 + libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
    1.60 +@@ -147,6 +158,18 @@
    1.61 + libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
    1.62 + libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
    1.63 + endif
    1.64 ++if S390
    1.65 ++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
    1.66 ++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
    1.67 ++endif
    1.68 ++if X86_64
    1.69 ++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
    1.70 ++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
    1.71 ++endif
    1.72 ++if SH
    1.73 ++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
    1.74 ++libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
    1.75 ++endif
    1.76 + 
    1.77 + AM_CFLAGS = -fexceptions
    1.78 + 
    1.79 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.in gcc/libffi/Makefile.in
    1.80 +--- gcc-3.2.2.orig/libffi/Makefile.in	Wed Jan 29 07:59:05 2003
    1.81 ++++ gcc/libffi/Makefile.in	Wed Jan 29 07:58:58 2003
    1.82 +@@ -91,14 +91,17 @@
    1.83 + 		src/mips/n32.s src/mips/o32.S src/mips/o32.s \
    1.84 + 		src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \
    1.85 + 		src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \
    1.86 ++		src/x86/ffi64.c src/x86/unix64.S \
    1.87 + 		src/alpha/ffi.c src/alpha/osf.S \
    1.88 + 		src/m68k/ffi.c src/m68k/sysv.S \
    1.89 + 		src/powerpc/ffi.c src/powerpc/sysv.S \
    1.90 + 		src/powerpc/ppc_closure.S src/powerpc/asm.h \
    1.91 + 		src/powerpc/ffi_darwin.c \
    1.92 + 		src/powerpc/darwin.S src/powerpc/aix.S \
    1.93 +-		src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \
    1.94 +-		src/arm/ffi.c src/arm/sysv.S
    1.95 ++		src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \
    1.96 ++		src/arm/ffi.c src/arm/sysv.S \
    1.97 ++		src/s390/ffi.c src/s390/sysv.S \
    1.98 ++		src/sh/ffi.c src/sh/sysv.S
    1.99 + 
   1.100 + 
   1.101 + VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@
   1.102 +@@ -162,6 +165,7 @@
   1.103 + ffitest_LDFLAGS = -shared-libgcc
   1.104 + 
   1.105 + TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S
   1.106 ++TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S
   1.107 + TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s
   1.108 + TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S
   1.109 + TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S
   1.110 +@@ -170,14 +174,18 @@
   1.111 + TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S
   1.112 + TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S
   1.113 + TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
   1.114 +-TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S
   1.115 ++TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
   1.116 + TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
   1.117 + TARGET_SRC_ARM = src/arm/sysv.S src/arm/ffi.c
   1.118 ++TARGET_SRC_S390 = src/s390/sysv.S src/s390/ffi.c
   1.119 ++TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
   1.120 ++TARGET_SRC_SH = src/sh/sysv.S src/sh/ffi.c
   1.121 + 
   1.122 + libffi_la_common_SOURCES = src/debug.c src/prep_cif.c src/types.c \
   1.123 + 		src/raw_api.c src/java_raw_api.c
   1.124 + 
   1.125 + @MIPS_GCC_TRUE@libffi_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
   1.126 ++@MIPS_LINUX_TRUE@libffi_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
   1.127 + @MIPS_SGI_TRUE@libffi_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
   1.128 + @X86_TRUE@libffi_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86)
   1.129 + @X86_WIN32_TRUE@libffi_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32)
   1.130 +@@ -189,7 +197,11 @@
   1.131 + @POWERPC_AIX_TRUE@libffi_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX)
   1.132 + @POWERPC_DARWIN_TRUE@libffi_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN)
   1.133 + @ARM_TRUE@libffi_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
   1.134 ++@S390_TRUE@libffi_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
   1.135 ++@X86_64_TRUE@libffi_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
   1.136 ++@SH_TRUE@libffi_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
   1.137 + @MIPS_GCC_TRUE@libffi_convenience_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
   1.138 ++@MIPS_LINUX_TRUE@libffi_convenience_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
   1.139 + @MIPS_SGI_TRUE@libffi_convenience_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
   1.140 + @X86_TRUE@libffi_convenience_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86)
   1.141 + @X86_WIN32_TRUE@libffi_convenience_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32)
   1.142 +@@ -201,6 +213,9 @@
   1.143 + @POWERPC_AIX_TRUE@libffi_convenience_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX)
   1.144 + @POWERPC_DARWIN_TRUE@libffi_convenience_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN)
   1.145 + @ARM_TRUE@libffi_convenience_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
   1.146 ++@S390_TRUE@libffi_convenience_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
   1.147 ++@X86_64_TRUE@libffi_convenience_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
   1.148 ++@SH_TRUE@libfficonvenience_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
   1.149 + 
   1.150 + AM_CFLAGS = -fexceptions
   1.151 + 
   1.152 +@@ -208,7 +223,7 @@
   1.153 + 
   1.154 + INCLUDES = -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
   1.155 + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
   1.156 +-mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
   1.157 ++mkinstalldirs = $(SHELL) $(top_srcdir)/${libffi_basedir}/../mkinstalldirs
   1.158 + CONFIG_HEADER = fficonfig.h
   1.159 + CONFIG_CLEAN_FILES = 
   1.160 + LTLIBRARIES =  $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES)
   1.161 +@@ -220,10 +235,6 @@
   1.162 + LIBS = @LIBS@
   1.163 + libffi_convenience_la_LDFLAGS = 
   1.164 + libffi_convenience_la_LIBADD = 
   1.165 +-@POWERPC_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
   1.166 +-@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
   1.167 +-@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \
   1.168 +-@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo
   1.169 + @ALPHA_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
   1.170 + @ALPHA_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
   1.171 + @ALPHA_TRUE@src/java_raw_api.lo src/alpha/ffi.lo src/alpha/osf.lo
   1.172 +@@ -234,12 +245,29 @@
   1.173 + @MIPS_GCC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
   1.174 + @MIPS_GCC_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \
   1.175 + @MIPS_GCC_TRUE@src/mips/n32.lo
   1.176 +-@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
   1.177 +-@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
   1.178 +-@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo
   1.179 ++@S390_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.180 ++@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.181 ++@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo
   1.182 + @M68K_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.183 + @M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.184 + @M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo
   1.185 ++@X86_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.186 ++@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.187 ++@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo
   1.188 ++@POWERPC_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
   1.189 ++@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
   1.190 ++@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \
   1.191 ++@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo
   1.192 ++@MIPS_LINUX_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
   1.193 ++@MIPS_LINUX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
   1.194 ++@MIPS_LINUX_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo
   1.195 ++@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
   1.196 ++@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
   1.197 ++@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo
   1.198 ++@X86_64_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
   1.199 ++@X86_64_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
   1.200 ++@X86_64_TRUE@src/java_raw_api.lo src/x86/ffi64.lo src/x86/unix64.lo \
   1.201 ++@X86_64_TRUE@src/x86/ffi.lo src/x86/sysv.lo
   1.202 + @SPARC_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
   1.203 + @SPARC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
   1.204 + @SPARC_TRUE@src/java_raw_api.lo src/sparc/ffi.lo src/sparc/v8.lo \
   1.205 +@@ -247,62 +275,75 @@
   1.206 + @POWERPC_AIX_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
   1.207 + @POWERPC_AIX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
   1.208 + @POWERPC_AIX_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \
   1.209 +-@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closures.lo
   1.210 +-@X86_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.211 +-@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.212 +-@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo
   1.213 +-@ARM_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.214 +-@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.215 +-@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo
   1.216 ++@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closure.lo
   1.217 ++@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
   1.218 ++@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
   1.219 ++@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \
   1.220 ++@MIPS_SGI_TRUE@src/mips/n32.lo
   1.221 + @POWERPC_DARWIN_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
   1.222 + @POWERPC_DARWIN_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
   1.223 + @POWERPC_DARWIN_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \
   1.224 + @POWERPC_DARWIN_TRUE@src/powerpc/darwin.lo \
   1.225 + @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo
   1.226 +-@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
   1.227 +-@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
   1.228 +-@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \
   1.229 +-@MIPS_SGI_TRUE@src/mips/n32.lo
   1.230 ++@ARM_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.231 ++@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.232 ++@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo
   1.233 ++@SH_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.234 ++@SH_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.235 ++@SH_TRUE@src/sh/sysv.lo src/sh/ffi.lo
   1.236 + libffi_la_LIBADD = 
   1.237 ++@SH_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo src/types.lo \
   1.238 ++@SH_TRUE@src/raw_api.lo src/java_raw_api.lo src/sh/sysv.lo \
   1.239 ++@SH_TRUE@src/sh/ffi.lo
   1.240 ++@IA64_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.241 ++@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.242 ++@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo
   1.243 ++@X86_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo src/types.lo \
   1.244 ++@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \
   1.245 ++@X86_TRUE@src/x86/sysv.lo
   1.246 + @POWERPC_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.247 + @POWERPC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.248 + @POWERPC_TRUE@src/powerpc/ffi.lo src/powerpc/sysv.lo \
   1.249 + @POWERPC_TRUE@src/powerpc/ppc_closure.lo
   1.250 +-@ALPHA_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.251 +-@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.252 +-@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo
   1.253 +-@IA64_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.254 +-@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.255 +-@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo
   1.256 +-@MIPS_GCC_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.257 +-@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.258 +-@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
   1.259 +-@X86_WIN32_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.260 +-@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.261 +-@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo
   1.262 +-@M68K_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.263 +-@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.264 +-@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo
   1.265 ++@MIPS_LINUX_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.266 ++@MIPS_LINUX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.267 ++@MIPS_LINUX_TRUE@src/mips/ffi.lo src/mips/o32.lo
   1.268 + @SPARC_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.269 + @SPARC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.270 + @SPARC_TRUE@src/sparc/ffi.lo src/sparc/v8.lo src/sparc/v9.lo
   1.271 + @POWERPC_AIX_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.272 + @POWERPC_AIX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.273 + @POWERPC_AIX_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/aix.lo \
   1.274 +-@POWERPC_AIX_TRUE@src/powerpc/aix_closures.lo
   1.275 +-@X86_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo src/types.lo \
   1.276 +-@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \
   1.277 +-@X86_TRUE@src/x86/sysv.lo
   1.278 ++@POWERPC_AIX_TRUE@src/powerpc/aix_closure.lo
   1.279 ++@MIPS_SGI_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.280 ++@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.281 ++@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
   1.282 + @ARM_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo src/types.lo \
   1.283 + @ARM_TRUE@src/raw_api.lo src/java_raw_api.lo src/arm/sysv.lo \
   1.284 + @ARM_TRUE@src/arm/ffi.lo
   1.285 ++@ALPHA_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.286 ++@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.287 ++@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo
   1.288 ++@MIPS_GCC_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.289 ++@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.290 ++@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
   1.291 ++@S390_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.292 ++@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.293 ++@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo
   1.294 ++@M68K_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.295 ++@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.296 ++@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo
   1.297 ++@X86_WIN32_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.298 ++@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.299 ++@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo
   1.300 ++@X86_64_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.301 ++@X86_64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.302 ++@X86_64_TRUE@src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffi.lo \
   1.303 ++@X86_64_TRUE@src/x86/sysv.lo
   1.304 + @POWERPC_DARWIN_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.305 + @POWERPC_DARWIN_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.306 + @POWERPC_DARWIN_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/darwin.lo \
   1.307 + @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo
   1.308 +-@MIPS_SGI_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
   1.309 +-@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
   1.310 +-@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
   1.311 + noinst_PROGRAMS =  ffitest$(EXEEXT)
   1.312 + PROGRAMS =  $(noinst_PROGRAMS)
   1.313 + 
   1.314 +@@ -578,8 +616,8 @@
   1.315 + 	-chmod 777 $(distdir)
   1.316 + 	$(mkinstalldirs) $(distdir)/src/alpha $(distdir)/src/arm \
   1.317 + 	   $(distdir)/src/m68k $(distdir)/src/mips \
   1.318 +-	   $(distdir)/src/powerpc $(distdir)/src/sparc \
   1.319 +-	   $(distdir)/src/x86
   1.320 ++	   $(distdir)/src/powerpc $(distdir)/src/s390 $(distdir)/src/sh \
   1.321 ++	   $(distdir)/src/sparc $(distdir)/src/x86
   1.322 + 	@for file in $(DISTFILES); do \
   1.323 + 	  if test -f $$file; then d=.; else d=$(srcdir); fi; \
   1.324 + 	  if test -d $$d/$$file; then \
   1.325 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/acinclude.m4 gcc/libffi/acinclude.m4
   1.326 +--- gcc-3.2.2.orig/libffi/acinclude.m4	Sun Sep 10 16:43:14 2000
   1.327 ++++ gcc/libffi/acinclude.m4	Tue Dec 17 03:22:47 2002
   1.328 +@@ -4,5 +4,8 @@
   1.329 + dnl to add a definition of LIBTOOL to Makefile.in.
   1.330 + ifelse(yes,no,[
   1.331 + AC_DEFUN([AC_PROG_LIBTOOL],)
   1.332 ++AC_DEFUN([AM_PROG_LIBTOOL],)
   1.333 + AC_SUBST(LIBTOOL)
   1.334 + ])
   1.335 ++
   1.336 ++sinclude(../config/accross.m4)
   1.337 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/aclocal.m4 gcc/libffi/aclocal.m4
   1.338 +--- gcc-3.2.2.orig/libffi/aclocal.m4	Fri Feb  1 07:25:31 2002
   1.339 ++++ gcc/libffi/aclocal.m4	Tue Dec 17 03:22:47 2002
   1.340 +@@ -1,6 +1,6 @@
   1.341 +-dnl aclocal.m4 generated automatically by aclocal 1.4
   1.342 ++dnl aclocal.m4 generated automatically by aclocal 1.4-p5
   1.343 + 
   1.344 +-dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
   1.345 ++dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
   1.346 + dnl This file is free software; the Free Software Foundation
   1.347 + dnl gives unlimited permission to copy and/or distribute it,
   1.348 + dnl with or without modifications, as long as this notice is preserved.
   1.349 +@@ -16,108 +16,15 @@
   1.350 + dnl to add a definition of LIBTOOL to Makefile.in.
   1.351 + ifelse(yes,no,[
   1.352 + AC_DEFUN([AC_PROG_LIBTOOL],)
   1.353 ++AC_DEFUN([AM_PROG_LIBTOOL],)
   1.354 + AC_SUBST(LIBTOOL)
   1.355 + ])
   1.356 + 
   1.357 +-AC_DEFUN([AC_COMPILE_CHECK_SIZEOF],
   1.358 +-[changequote(<<, >>)dnl
   1.359 +-dnl The name to #define.
   1.360 +-define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl
   1.361 +-dnl The cache variable name.
   1.362 +-define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
   1.363 +-changequote([, ])dnl
   1.364 +-AC_MSG_CHECKING(size of $1)
   1.365 +-AC_CACHE_VAL(AC_CV_NAME,
   1.366 +-[for ac_size in 4 8 1 2 16 12 $2 ; do # List sizes in rough order of prevalence.
   1.367 +-  AC_TRY_COMPILE([#include "confdefs.h"
   1.368 +-#include <sys/types.h>
   1.369 +-$2
   1.370 +-], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size)
   1.371 +-  if test x$AC_CV_NAME != x ; then break; fi
   1.372 +-done
   1.373 +-])
   1.374 +-if test x$AC_CV_NAME = x ; then
   1.375 +-  AC_MSG_ERROR([cannot determine a size for $1])
   1.376 +-fi
   1.377 +-AC_MSG_RESULT($AC_CV_NAME)
   1.378 +-AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1])
   1.379 +-undefine([AC_TYPE_NAME])dnl
   1.380 +-undefine([AC_CV_NAME])dnl
   1.381 +-])
   1.382 +-
   1.383 +-AC_DEFUN([AC_C_BIGENDIAN_CROSS],
   1.384 +-[AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian,
   1.385 +-[ac_cv_c_bigendian=unknown
   1.386 +-# See if sys/param.h defines the BYTE_ORDER macro.
   1.387 +-AC_TRY_COMPILE([#include <sys/types.h>
   1.388 +-#include <sys/param.h>], [
   1.389 +-#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
   1.390 +- bogus endian macros
   1.391 +-#endif], [# It does; now see whether it defined to BIG_ENDIAN or not.
   1.392 +-AC_TRY_COMPILE([#include <sys/types.h>
   1.393 +-#include <sys/param.h>], [
   1.394 +-#if BYTE_ORDER != BIG_ENDIAN
   1.395 +- not big endian
   1.396 +-#endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)])
   1.397 +-if test $ac_cv_c_bigendian = unknown; then
   1.398 +-AC_TRY_RUN([main () {
   1.399 +-  /* Are we little or big endian?  From Harbison&Steele.  */
   1.400 +-  union
   1.401 +-  {
   1.402 +-    long l;
   1.403 +-    char c[sizeof (long)];
   1.404 +-  } u;
   1.405 +-  u.l = 1;
   1.406 +-  exit (u.c[sizeof (long) - 1] == 1);
   1.407 +-}], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes,
   1.408 +-[ echo $ac_n "cross-compiling... " 2>&AC_FD_MSG ])
   1.409 +-fi])
   1.410 +-if test $ac_cv_c_bigendian = unknown; then
   1.411 +-AC_MSG_CHECKING(to probe for byte ordering)
   1.412 +-[
   1.413 +-cat >conftest.c <<EOF
   1.414 +-short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
   1.415 +-short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
   1.416 +-void _ascii() { char* s = (char*) ascii_mm; s = (char*) ascii_ii; }
   1.417 +-short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
   1.418 +-short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
   1.419 +-void _ebcdic() { char* s = (char*) ebcdic_mm; s = (char*) ebcdic_ii; }
   1.420 +-int main() { _ascii (); _ebcdic (); return 0; }
   1.421 +-EOF
   1.422 +-] if test -f conftest.c ; then
   1.423 +-     if ${CC-cc} ${CFLAGS} conftest.c -o conftest.o && test -f conftest.o ; then
   1.424 +-        if test `grep -l BIGenDianSyS conftest.o` ; then
   1.425 +-           echo $ac_n ' big endian probe OK, ' 1>&AC_FD_MSG
   1.426 +-           ac_cv_c_bigendian=yes
   1.427 +-        fi
   1.428 +-        if test `grep -l LiTTleEnDian conftest.o` ; then
   1.429 +-           echo $ac_n ' little endian probe OK, ' 1>&AC_FD_MSG
   1.430 +-           if test $ac_cv_c_bigendian = yes ; then
   1.431 +-            ac_cv_c_bigendian=unknown;
   1.432 +-           else
   1.433 +-            ac_cv_c_bigendian=no
   1.434 +-           fi
   1.435 +-        fi
   1.436 +-        echo $ac_n 'guessing bigendian ...  ' >&AC_FD_MSG
   1.437 +-     fi
   1.438 +-  fi
   1.439 +-AC_MSG_RESULT($ac_cv_c_bigendian)
   1.440 +-fi
   1.441 +-if test $ac_cv_c_bigendian = yes; then
   1.442 +-  AC_DEFINE(WORDS_BIGENDIAN, 1, [whether byteorder is bigendian])
   1.443 +-  BYTEORDER=4321
   1.444 +-else
   1.445 +-  BYTEORDER=1234
   1.446 +-fi
   1.447 +-AC_DEFINE_UNQUOTED(BYTEORDER, $BYTEORDER, [1234 = LIL_ENDIAN, 4321 = BIGENDIAN])
   1.448 +-if test $ac_cv_c_bigendian = unknown; then
   1.449 +-  AC_MSG_ERROR(unknown endianess - sorry, please pre-set ac_cv_c_bigendian)
   1.450 +-fi
   1.451 +-])
   1.452 ++sinclude(../config/accross.m4)
   1.453 + 
   1.454 + # Like AC_CONFIG_HEADER, but automatically create stamp file.
   1.455 + 
   1.456 +-AC_DEFUN(AM_CONFIG_HEADER,
   1.457 ++AC_DEFUN([AM_CONFIG_HEADER],
   1.458 + [AC_PREREQ([2.12])
   1.459 + AC_CONFIG_HEADER([$1])
   1.460 + dnl When config.status generates a header, we must update the stamp-h file.
   1.461 +@@ -147,7 +54,7 @@
   1.462 + dnl Usage:
   1.463 + dnl AM_INIT_AUTOMAKE(package,version, [no-define])
   1.464 + 
   1.465 +-AC_DEFUN(AM_INIT_AUTOMAKE,
   1.466 ++AC_DEFUN([AM_INIT_AUTOMAKE],
   1.467 + [AC_REQUIRE([AC_PROG_INSTALL])
   1.468 + PACKAGE=[$1]
   1.469 + AC_SUBST(PACKAGE)
   1.470 +@@ -175,7 +82,7 @@
   1.471 + # Check to make sure that the build environment is sane.
   1.472 + #
   1.473 + 
   1.474 +-AC_DEFUN(AM_SANITY_CHECK,
   1.475 ++AC_DEFUN([AM_SANITY_CHECK],
   1.476 + [AC_MSG_CHECKING([whether build environment is sane])
   1.477 + # Just in case
   1.478 + sleep 1
   1.479 +@@ -216,7 +123,7 @@
   1.480 + 
   1.481 + dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
   1.482 + dnl The program must properly implement --version.
   1.483 +-AC_DEFUN(AM_MISSING_PROG,
   1.484 ++AC_DEFUN([AM_MISSING_PROG],
   1.485 + [AC_MSG_CHECKING(for working $2)
   1.486 + # Run test in a subshell; some versions of sh will print an error if
   1.487 + # an executable is not found, even if stderr is redirected.
   1.488 +@@ -235,7 +142,7 @@
   1.489 + 
   1.490 + # serial 1
   1.491 + 
   1.492 +-AC_DEFUN(AM_MAINTAINER_MODE,
   1.493 ++AC_DEFUN([AM_MAINTAINER_MODE],
   1.494 + [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
   1.495 +   dnl maintainer-mode is disabled by default
   1.496 +   AC_ARG_ENABLE(maintainer-mode,
   1.497 +@@ -252,7 +159,7 @@
   1.498 + 
   1.499 + # Define a conditional.
   1.500 + 
   1.501 +-AC_DEFUN(AM_CONDITIONAL,
   1.502 ++AC_DEFUN([AM_CONDITIONAL],
   1.503 + [AC_SUBST($1_TRUE)
   1.504 + AC_SUBST($1_FALSE)
   1.505 + if $2; then
   1.506 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure gcc/libffi/configure
   1.507 +--- gcc-3.2.2.orig/libffi/configure	Wed Jan 29 07:59:05 2003
   1.508 ++++ gcc/libffi/configure	Sat Feb  1 20:16:19 2003
   1.509 +@@ -633,17 +633,16 @@
   1.510 + 
   1.511 + if test "${srcdir}" = "."; then
   1.512 +   if test "${with_target_subdir}" != "."; then
   1.513 +-    libffi_basedir="${srcdir}/${with_multisrctop}.."
   1.514 ++    libffi_basedir="${with_multisrctop}../"
   1.515 +   else
   1.516 +-    libffi_basedir="${srcdir}/${with_multisrctop}"
   1.517 ++    libffi_basedir="${with_multisrctop}"
   1.518 +   fi
   1.519 + else
   1.520 +-  libffi_basedir="${srcdir}"
   1.521 ++  libffi_basedir=
   1.522 + fi
   1.523 + 
   1.524 +-
   1.525 + ac_aux_dir=
   1.526 +-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
   1.527 ++for ac_dir in ${libffi_basedir}.. $srcdir/${libffi_basedir}..; do
   1.528 +   if test -f $ac_dir/install-sh; then
   1.529 +     ac_aux_dir=$ac_dir
   1.530 +     ac_install_sh="$ac_aux_dir/install-sh -c"
   1.531 +@@ -655,13 +654,14 @@
   1.532 +   fi
   1.533 + done
   1.534 + if test -z "$ac_aux_dir"; then
   1.535 +-  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
   1.536 ++  { echo "configure: error: can not find install-sh or install.sh in ${libffi_basedir}.. $srcdir/${libffi_basedir}.." 1>&2; exit 1; }
   1.537 + fi
   1.538 + ac_config_guess=$ac_aux_dir/config.guess
   1.539 + ac_config_sub=$ac_aux_dir/config.sub
   1.540 + ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
   1.541 + 
   1.542 + 
   1.543 ++
   1.544 + # Make sure we can run config.sub.
   1.545 + if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
   1.546 + else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
   1.547 +@@ -1238,9 +1238,18 @@
   1.548 +   ;;
   1.549 + 
   1.550 + hpux10.20*|hpux11*)
   1.551 +-  lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
   1.552 +-  lt_cv_file_magic_cmd=/usr/bin/file
   1.553 +-  lt_cv_file_magic_test_file=/usr/lib/libc.sl
   1.554 ++  case $host_cpu in
   1.555 ++  hppa*)
   1.556 ++    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
   1.557 ++    lt_cv_file_magic_cmd=/usr/bin/file
   1.558 ++    lt_cv_file_magic_test_file=/usr/lib/libc.sl
   1.559 ++    ;;
   1.560 ++  ia64*)
   1.561 ++    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
   1.562 ++    lt_cv_file_magic_cmd=/usr/bin/file
   1.563 ++    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
   1.564 ++    ;;
   1.565 ++  esac
   1.566 +   ;;
   1.567 + 
   1.568 + irix5* | irix6*)
   1.569 +@@ -1267,7 +1276,7 @@
   1.570 + # This must be Linux ELF.
   1.571 + linux-gnu*)
   1.572 +   case $host_cpu in
   1.573 +-  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
   1.574 ++  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* )
   1.575 +     lt_cv_deplibs_check_method=pass_all ;;
   1.576 +   *)
   1.577 +     # glibc up to 2.1.1 does not perform some relocations on ARM
   1.578 +@@ -1330,13 +1339,13 @@
   1.579 + deplibs_check_method=$lt_cv_deplibs_check_method
   1.580 + 
   1.581 + echo $ac_n "checking for object suffix""... $ac_c" 1>&6
   1.582 +-echo "configure:1334: checking for object suffix" >&5
   1.583 ++echo "configure:1343: checking for object suffix" >&5
   1.584 + if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
   1.585 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.586 + else
   1.587 +   rm -f conftest*
   1.588 + echo 'int i = 1;' > conftest.$ac_ext
   1.589 +-if { (eval echo configure:1340: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   1.590 ++if { (eval echo configure:1349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   1.591 +   for ac_file in conftest.*; do
   1.592 +     case $ac_file in
   1.593 +     *.c) ;;
   1.594 +@@ -1356,7 +1365,7 @@
   1.595 + 
   1.596 + 
   1.597 + echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
   1.598 +-echo "configure:1360: checking for executable suffix" >&5
   1.599 ++echo "configure:1369: checking for executable suffix" >&5
   1.600 + if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
   1.601 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.602 + else
   1.603 +@@ -1366,7 +1375,7 @@
   1.604 +   rm -f conftest*
   1.605 +   echo 'int main () { return 0; }' > conftest.$ac_ext
   1.606 +   ac_cv_exeext=
   1.607 +-  if { (eval echo configure:1370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   1.608 ++  if { (eval echo configure:1379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   1.609 +     for file in conftest.*; do
   1.610 +       case $file in
   1.611 +       *.c | *.o | *.obj) ;;
   1.612 +@@ -1399,7 +1408,7 @@
   1.613 + file_magic*)
   1.614 +   if test "$file_magic_cmd" = '$MAGIC_CMD'; then
   1.615 +     echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6
   1.616 +-echo "configure:1403: checking for ${ac_tool_prefix}file" >&5
   1.617 ++echo "configure:1412: checking for ${ac_tool_prefix}file" >&5
   1.618 + if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
   1.619 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.620 + else
   1.621 +@@ -1461,7 +1470,7 @@
   1.622 + if test -z "$lt_cv_path_MAGIC_CMD"; then
   1.623 +   if test -n "$ac_tool_prefix"; then
   1.624 +     echo $ac_n "checking for file""... $ac_c" 1>&6
   1.625 +-echo "configure:1465: checking for file" >&5
   1.626 ++echo "configure:1474: checking for file" >&5
   1.627 + if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
   1.628 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.629 + else
   1.630 +@@ -1532,7 +1541,7 @@
   1.631 + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
   1.632 + set dummy ${ac_tool_prefix}ranlib; ac_word=$2
   1.633 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
   1.634 +-echo "configure:1536: checking for $ac_word" >&5
   1.635 ++echo "configure:1545: checking for $ac_word" >&5
   1.636 + if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   1.637 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.638 + else
   1.639 +@@ -1564,7 +1573,7 @@
   1.640 +   # Extract the first word of "ranlib", so it can be a program name with args.
   1.641 + set dummy ranlib; ac_word=$2
   1.642 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
   1.643 +-echo "configure:1568: checking for $ac_word" >&5
   1.644 ++echo "configure:1577: checking for $ac_word" >&5
   1.645 + if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   1.646 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.647 + else
   1.648 +@@ -1599,7 +1608,7 @@
   1.649 + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
   1.650 + set dummy ${ac_tool_prefix}strip; ac_word=$2
   1.651 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
   1.652 +-echo "configure:1603: checking for $ac_word" >&5
   1.653 ++echo "configure:1612: checking for $ac_word" >&5
   1.654 + if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
   1.655 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.656 + else
   1.657 +@@ -1631,7 +1640,7 @@
   1.658 +   # Extract the first word of "strip", so it can be a program name with args.
   1.659 + set dummy strip; ac_word=$2
   1.660 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
   1.661 +-echo "configure:1635: checking for $ac_word" >&5
   1.662 ++echo "configure:1644: checking for $ac_word" >&5
   1.663 + if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
   1.664 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.665 + else
   1.666 +@@ -1698,8 +1707,8 @@
   1.667 + case $host in
   1.668 + *-*-irix6*)
   1.669 +   # Find out which ABI we are using.
   1.670 +-  echo '#line 1702 "configure"' > conftest.$ac_ext
   1.671 +-  if { (eval echo configure:1703: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   1.672 ++  echo '#line 1711 "configure"' > conftest.$ac_ext
   1.673 ++  if { (eval echo configure:1712: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   1.674 +     case `/usr/bin/file conftest.$ac_objext` in
   1.675 +     *32-bit*)
   1.676 +       LD="${LD-ld} -32"
   1.677 +@@ -1715,12 +1724,70 @@
   1.678 +   rm -rf conftest*
   1.679 +   ;;
   1.680 + 
   1.681 ++ia64-*-hpux*)
   1.682 ++  # Find out which ABI we are using.
   1.683 ++  echo 'int i;' > conftest.$ac_ext
   1.684 ++  if { (eval echo configure:1731: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   1.685 ++    case "`/usr/bin/file conftest.o`" in
   1.686 ++    *ELF-32*)
   1.687 ++      HPUX_IA64_MODE="32"
   1.688 ++      ;;
   1.689 ++    *ELF-64*)
   1.690 ++      HPUX_IA64_MODE="64"
   1.691 ++      ;;
   1.692 ++    esac
   1.693 ++  fi
   1.694 ++  rm -rf conftest*
   1.695 ++  ;;
   1.696 ++
   1.697 ++x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
   1.698 ++  # Find out which ABI we are using.
   1.699 ++  echo 'int i;' > conftest.$ac_ext
   1.700 ++  if { (eval echo configure:1747: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   1.701 ++    case "`/usr/bin/file conftest.o`" in
   1.702 ++    *32-bit*)
   1.703 ++      case $host in
   1.704 ++        x86_64-*linux*)
   1.705 ++          LD="${LD-ld} -m elf_i386"
   1.706 ++          ;;
   1.707 ++        ppc64-*linux*)
   1.708 ++          LD="${LD-ld} -m elf32ppclinux"
   1.709 ++          ;;
   1.710 ++        s390x-*linux*)
   1.711 ++          LD="${LD-ld} -m elf_s390"
   1.712 ++          ;;
   1.713 ++        sparc64-*linux*)
   1.714 ++          LD="${LD-ld} -m elf32_sparc"
   1.715 ++          ;;
   1.716 ++      esac
   1.717 ++      ;;
   1.718 ++    *64-bit*)
   1.719 ++      case $host in
   1.720 ++        x86_64-*linux*)
   1.721 ++          LD="${LD-ld} -m elf_x86_64"
   1.722 ++          ;;
   1.723 ++        ppc*-*linux*|powerpc*-*linux*)
   1.724 ++          LD="${LD-ld} -m elf64ppc"
   1.725 ++          ;;
   1.726 ++        s390*-*linux*)
   1.727 ++          LD="${LD-ld} -m elf64_s390"
   1.728 ++          ;;
   1.729 ++        sparc*-*linux*)
   1.730 ++          LD="${LD-ld} -m elf64_sparc"
   1.731 ++          ;;
   1.732 ++      esac
   1.733 ++      ;;
   1.734 ++    esac
   1.735 ++  fi
   1.736 ++  rm -rf conftest*
   1.737 ++  ;;
   1.738 ++
   1.739 + *-*-sco3.2v5*)
   1.740 +   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
   1.741 +   SAVE_CFLAGS="$CFLAGS"
   1.742 +   CFLAGS="$CFLAGS -belf"
   1.743 +   echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
   1.744 +-echo "configure:1724: checking whether the C compiler needs -belf" >&5
   1.745 ++echo "configure:1791: checking whether the C compiler needs -belf" >&5
   1.746 + if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
   1.747 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.748 + else
   1.749 +@@ -1733,14 +1800,14 @@
   1.750 + cross_compiling=$ac_cv_prog_cc_cross
   1.751 + 
   1.752 +      cat > conftest.$ac_ext <<EOF
   1.753 +-#line 1737 "configure"
   1.754 ++#line 1804 "configure"
   1.755 + #include "confdefs.h"
   1.756 + 
   1.757 + int main() {
   1.758 + 
   1.759 + ; return 0; }
   1.760 + EOF
   1.761 +-if { (eval echo configure:1744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   1.762 ++if { (eval echo configure:1811: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   1.763 +   rm -rf conftest*
   1.764 +   lt_cv_cc_needs_belf=yes
   1.765 + else
   1.766 +@@ -1868,7 +1935,7 @@
   1.767 + # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
   1.768 + # ./install, which can be erroneously created by make from ./install.sh.
   1.769 + echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
   1.770 +-echo "configure:1872: checking for a BSD compatible install" >&5
   1.771 ++echo "configure:1939: checking for a BSD compatible install" >&5
   1.772 + if test -z "$INSTALL"; then
   1.773 + if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
   1.774 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.775 +@@ -1921,7 +1988,7 @@
   1.776 + test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
   1.777 + 
   1.778 + echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
   1.779 +-echo "configure:1925: checking whether build environment is sane" >&5
   1.780 ++echo "configure:1992: checking whether build environment is sane" >&5
   1.781 + # Just in case
   1.782 + sleep 1
   1.783 + echo timestamp > conftestfile
   1.784 +@@ -1978,7 +2045,7 @@
   1.785 + test "$program_transform_name" = "" && program_transform_name="s,x,x,"
   1.786 + 
   1.787 + echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
   1.788 +-echo "configure:1982: checking whether ${MAKE-make} sets \${MAKE}" >&5
   1.789 ++echo "configure:2049: checking whether ${MAKE-make} sets \${MAKE}" >&5
   1.790 + set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
   1.791 + if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
   1.792 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.793 +@@ -2017,7 +2084,7 @@
   1.794 + 
   1.795 + missing_dir=`cd $ac_aux_dir && pwd`
   1.796 + echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
   1.797 +-echo "configure:2021: checking for working aclocal" >&5
   1.798 ++echo "configure:2088: checking for working aclocal" >&5
   1.799 + # Run test in a subshell; some versions of sh will print an error if
   1.800 + # an executable is not found, even if stderr is redirected.
   1.801 + # Redirect stdin to placate older versions of autoconf.  Sigh.
   1.802 +@@ -2030,7 +2097,7 @@
   1.803 + fi
   1.804 + 
   1.805 + echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
   1.806 +-echo "configure:2034: checking for working autoconf" >&5
   1.807 ++echo "configure:2101: checking for working autoconf" >&5
   1.808 + # Run test in a subshell; some versions of sh will print an error if
   1.809 + # an executable is not found, even if stderr is redirected.
   1.810 + # Redirect stdin to placate older versions of autoconf.  Sigh.
   1.811 +@@ -2043,7 +2110,7 @@
   1.812 + fi
   1.813 + 
   1.814 + echo $ac_n "checking for working automake""... $ac_c" 1>&6
   1.815 +-echo "configure:2047: checking for working automake" >&5
   1.816 ++echo "configure:2114: checking for working automake" >&5
   1.817 + # Run test in a subshell; some versions of sh will print an error if
   1.818 + # an executable is not found, even if stderr is redirected.
   1.819 + # Redirect stdin to placate older versions of autoconf.  Sigh.
   1.820 +@@ -2056,7 +2123,7 @@
   1.821 + fi
   1.822 + 
   1.823 + echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
   1.824 +-echo "configure:2060: checking for working autoheader" >&5
   1.825 ++echo "configure:2127: checking for working autoheader" >&5
   1.826 + # Run test in a subshell; some versions of sh will print an error if
   1.827 + # an executable is not found, even if stderr is redirected.
   1.828 + # Redirect stdin to placate older versions of autoconf.  Sigh.
   1.829 +@@ -2069,7 +2136,7 @@
   1.830 + fi
   1.831 + 
   1.832 + echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
   1.833 +-echo "configure:2073: checking for working makeinfo" >&5
   1.834 ++echo "configure:2140: checking for working makeinfo" >&5
   1.835 + # Run test in a subshell; some versions of sh will print an error if
   1.836 + # an executable is not found, even if stderr is redirected.
   1.837 + # Redirect stdin to placate older versions of autoconf.  Sigh.
   1.838 +@@ -2086,7 +2153,7 @@
   1.839 + 
   1.840 + 
   1.841 + echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
   1.842 +-echo "configure:2090: checking for executable suffix" >&5
   1.843 ++echo "configure:2157: checking for executable suffix" >&5
   1.844 + if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
   1.845 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.846 + else
   1.847 +@@ -2096,7 +2163,7 @@
   1.848 +   rm -f conftest*
   1.849 +   echo 'int main () { return 0; }' > conftest.$ac_ext
   1.850 +   ac_cv_exeext=
   1.851 +-  if { (eval echo configure:2100: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   1.852 ++  if { (eval echo configure:2167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   1.853 +     for file in conftest.*; do
   1.854 +       case $file in
   1.855 +       *.c | *.o | *.obj) ;;
   1.856 +@@ -2117,7 +2184,7 @@
   1.857 + ac_exeext=$EXEEXT
   1.858 + 
   1.859 + echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
   1.860 +-echo "configure:2121: checking whether to enable maintainer-specific portions of Makefiles" >&5
   1.861 ++echo "configure:2188: checking whether to enable maintainer-specific portions of Makefiles" >&5
   1.862 +     # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
   1.863 + if test "${enable_maintainer_mode+set}" = set; then
   1.864 +   enableval="$enable_maintainer_mode"
   1.865 +@@ -2143,7 +2210,7 @@
   1.866 + # Extract the first word of "gcc", so it can be a program name with args.
   1.867 + set dummy gcc; ac_word=$2
   1.868 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
   1.869 +-echo "configure:2147: checking for $ac_word" >&5
   1.870 ++echo "configure:2214: checking for $ac_word" >&5
   1.871 + if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   1.872 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.873 + else
   1.874 +@@ -2173,7 +2240,7 @@
   1.875 +   # Extract the first word of "cc", so it can be a program name with args.
   1.876 + set dummy cc; ac_word=$2
   1.877 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
   1.878 +-echo "configure:2177: checking for $ac_word" >&5
   1.879 ++echo "configure:2244: checking for $ac_word" >&5
   1.880 + if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   1.881 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.882 + else
   1.883 +@@ -2224,7 +2291,7 @@
   1.884 +       # Extract the first word of "cl", so it can be a program name with args.
   1.885 + set dummy cl; ac_word=$2
   1.886 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
   1.887 +-echo "configure:2228: checking for $ac_word" >&5
   1.888 ++echo "configure:2295: checking for $ac_word" >&5
   1.889 + if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   1.890 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.891 + else
   1.892 +@@ -2256,7 +2323,7 @@
   1.893 + fi
   1.894 + 
   1.895 + echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
   1.896 +-echo "configure:2260: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
   1.897 ++echo "configure:2327: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
   1.898 + 
   1.899 + ac_ext=c
   1.900 + # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
   1.901 +@@ -2267,12 +2334,12 @@
   1.902 + 
   1.903 + cat > conftest.$ac_ext << EOF
   1.904 + 
   1.905 +-#line 2271 "configure"
   1.906 ++#line 2338 "configure"
   1.907 + #include "confdefs.h"
   1.908 + 
   1.909 + main(){return(0);}
   1.910 + EOF
   1.911 +-if { (eval echo configure:2276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   1.912 ++if { (eval echo configure:2343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   1.913 +   ac_cv_prog_cc_works=yes
   1.914 +   # If we can't run a trivial program, we are probably using a cross compiler.
   1.915 +   if (./conftest; exit) 2>/dev/null; then
   1.916 +@@ -2298,12 +2365,12 @@
   1.917 +   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
   1.918 + fi
   1.919 + echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
   1.920 +-echo "configure:2302: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
   1.921 ++echo "configure:2369: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
   1.922 + echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
   1.923 + cross_compiling=$ac_cv_prog_cc_cross
   1.924 + 
   1.925 + echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
   1.926 +-echo "configure:2307: checking whether we are using GNU C" >&5
   1.927 ++echo "configure:2374: checking whether we are using GNU C" >&5
   1.928 + if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   1.929 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.930 + else
   1.931 +@@ -2312,7 +2379,7 @@
   1.932 +   yes;
   1.933 + #endif
   1.934 + EOF
   1.935 +-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2316: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   1.936 ++if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2383: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   1.937 +   ac_cv_prog_gcc=yes
   1.938 + else
   1.939 +   ac_cv_prog_gcc=no
   1.940 +@@ -2331,7 +2398,7 @@
   1.941 + ac_save_CFLAGS="$CFLAGS"
   1.942 + CFLAGS=
   1.943 + echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
   1.944 +-echo "configure:2335: checking whether ${CC-cc} accepts -g" >&5
   1.945 ++echo "configure:2402: checking whether ${CC-cc} accepts -g" >&5
   1.946 + if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   1.947 +   echo $ac_n "(cached) $ac_c" 1>&6
   1.948 + else
   1.949 +@@ -2381,17 +2448,23 @@
   1.950 + i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;;
   1.951 + sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;;
   1.952 + sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;;
   1.953 +-sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
   1.954 +-sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
   1.955 +-alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;;
   1.956 ++sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;;
   1.957 ++sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;;
   1.958 ++alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;;
   1.959 + ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;;
   1.960 + m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;;
   1.961 ++mips64*-*);;
   1.962 ++mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;;
   1.963 + powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;;
   1.964 + powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;;
   1.965 + powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;;
   1.966 + powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
   1.967 + rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
   1.968 + arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;;
   1.969 ++s390-*-linux-*) TARGET=S390; TARGETDIR=s390;;
   1.970 ++s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;;
   1.971 ++x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;;
   1.972 ++sh-*-linux* | sh[34]*-*-linux*) TARGET=SH; TARGETDIR=sh;;
   1.973 + esac
   1.974 + 
   1.975 + if test $TARGETDIR = unknown; then
   1.976 +@@ -2418,6 +2491,15 @@
   1.977 + fi
   1.978 + 
   1.979 + 
   1.980 ++if test x$TARGET = xMIPS_LINUX; then
   1.981 ++  MIPS_LINUX_TRUE=
   1.982 ++  MIPS_LINUX_FALSE='#'
   1.983 ++else
   1.984 ++  MIPS_LINUX_TRUE='#'
   1.985 ++  MIPS_LINUX_FALSE=
   1.986 ++fi
   1.987 ++
   1.988 ++
   1.989 + if test x$TARGET = xSPARC; then
   1.990 +   SPARC_TRUE=
   1.991 +   SPARC_FALSE='#'
   1.992 +@@ -2507,8 +2589,39 @@
   1.993 +   ARM_FALSE=
   1.994 + fi
   1.995 + 
   1.996 ++
   1.997 ++if test x$TARGET = xS390; then
   1.998 ++  S390_TRUE=
   1.999 ++  S390_FALSE='#'
  1.1000 ++else
  1.1001 ++  S390_TRUE='#'
  1.1002 ++  S390_FALSE=
  1.1003 ++fi
  1.1004 ++
  1.1005 ++
  1.1006 ++if test x$TARGET = xX86_64; then
  1.1007 ++  X86_64_TRUE=
  1.1008 ++  X86_64_FALSE='#'
  1.1009 ++else
  1.1010 ++  X86_64_TRUE='#'
  1.1011 ++  X86_64_FALSE=
  1.1012 ++fi
  1.1013 ++
  1.1014 ++
  1.1015 ++if test x$TARGET = xSH; then
  1.1016 ++  SH_TRUE=
  1.1017 ++  SH_FALSE='#'
  1.1018 ++else
  1.1019 ++  SH_TRUE='#'
  1.1020 ++  SH_FALSE=
  1.1021 ++fi
  1.1022 ++
  1.1023 ++if test x$TARGET = xMIPS_LINUX; then
  1.1024 ++  TARGET=MIPS
  1.1025 ++fi
  1.1026 ++
  1.1027 + echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
  1.1028 +-echo "configure:2512: checking how to run the C preprocessor" >&5
  1.1029 ++echo "configure:2625: checking how to run the C preprocessor" >&5
  1.1030 + # On Suns, sometimes $CPP names a directory.
  1.1031 + if test -n "$CPP" && test -d "$CPP"; then
  1.1032 +   CPP=
  1.1033 +@@ -2523,13 +2636,13 @@
  1.1034 +   # On the NeXT, cc -E runs the code through the compiler's parser,
  1.1035 +   # not just through cpp.
  1.1036 +   cat > conftest.$ac_ext <<EOF
  1.1037 +-#line 2527 "configure"
  1.1038 ++#line 2640 "configure"
  1.1039 + #include "confdefs.h"
  1.1040 + #include <assert.h>
  1.1041 + Syntax Error
  1.1042 + EOF
  1.1043 + ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
  1.1044 +-{ (eval echo configure:2533: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  1.1045 ++{ (eval echo configure:2646: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  1.1046 + ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  1.1047 + if test -z "$ac_err"; then
  1.1048 +   :
  1.1049 +@@ -2540,13 +2653,13 @@
  1.1050 +   rm -rf conftest*
  1.1051 +   CPP="${CC-cc} -E -traditional-cpp"
  1.1052 +   cat > conftest.$ac_ext <<EOF
  1.1053 +-#line 2544 "configure"
  1.1054 ++#line 2657 "configure"
  1.1055 + #include "confdefs.h"
  1.1056 + #include <assert.h>
  1.1057 + Syntax Error
  1.1058 + EOF
  1.1059 + ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
  1.1060 +-{ (eval echo configure:2550: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  1.1061 ++{ (eval echo configure:2663: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  1.1062 + ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  1.1063 + if test -z "$ac_err"; then
  1.1064 +   :
  1.1065 +@@ -2557,13 +2670,13 @@
  1.1066 +   rm -rf conftest*
  1.1067 +   CPP="${CC-cc} -nologo -E"
  1.1068 +   cat > conftest.$ac_ext <<EOF
  1.1069 +-#line 2561 "configure"
  1.1070 ++#line 2674 "configure"
  1.1071 + #include "confdefs.h"
  1.1072 + #include <assert.h>
  1.1073 + Syntax Error
  1.1074 + EOF
  1.1075 + ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
  1.1076 +-{ (eval echo configure:2567: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  1.1077 ++{ (eval echo configure:2680: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  1.1078 + ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  1.1079 + if test -z "$ac_err"; then
  1.1080 +   :
  1.1081 +@@ -2588,12 +2701,12 @@
  1.1082 + echo "$ac_t""$CPP" 1>&6
  1.1083 + 
  1.1084 + echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
  1.1085 +-echo "configure:2592: checking for ANSI C header files" >&5
  1.1086 ++echo "configure:2705: checking for ANSI C header files" >&5
  1.1087 + if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
  1.1088 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1089 + else
  1.1090 +   cat > conftest.$ac_ext <<EOF
  1.1091 +-#line 2597 "configure"
  1.1092 ++#line 2710 "configure"
  1.1093 + #include "confdefs.h"
  1.1094 + #include <stdlib.h>
  1.1095 + #include <stdarg.h>
  1.1096 +@@ -2601,7 +2714,7 @@
  1.1097 + #include <float.h>
  1.1098 + EOF
  1.1099 + ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
  1.1100 +-{ (eval echo configure:2605: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  1.1101 ++{ (eval echo configure:2718: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  1.1102 + ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  1.1103 + if test -z "$ac_err"; then
  1.1104 +   rm -rf conftest*
  1.1105 +@@ -2618,7 +2731,7 @@
  1.1106 + if test $ac_cv_header_stdc = yes; then
  1.1107 +   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
  1.1108 + cat > conftest.$ac_ext <<EOF
  1.1109 +-#line 2622 "configure"
  1.1110 ++#line 2735 "configure"
  1.1111 + #include "confdefs.h"
  1.1112 + #include <string.h>
  1.1113 + EOF
  1.1114 +@@ -2636,7 +2749,7 @@
  1.1115 + if test $ac_cv_header_stdc = yes; then
  1.1116 +   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
  1.1117 + cat > conftest.$ac_ext <<EOF
  1.1118 +-#line 2640 "configure"
  1.1119 ++#line 2753 "configure"
  1.1120 + #include "confdefs.h"
  1.1121 + #include <stdlib.h>
  1.1122 + EOF
  1.1123 +@@ -2657,7 +2770,7 @@
  1.1124 +   :
  1.1125 + else
  1.1126 +   cat > conftest.$ac_ext <<EOF
  1.1127 +-#line 2661 "configure"
  1.1128 ++#line 2774 "configure"
  1.1129 + #include "confdefs.h"
  1.1130 + #include <ctype.h>
  1.1131 + #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
  1.1132 +@@ -2668,7 +2781,7 @@
  1.1133 + exit (0); }
  1.1134 + 
  1.1135 + EOF
  1.1136 +-if { (eval echo configure:2672: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
  1.1137 ++if { (eval echo configure:2785: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
  1.1138 + then
  1.1139 +   :
  1.1140 + else
  1.1141 +@@ -2694,12 +2807,12 @@
  1.1142 + for ac_func in memcpy
  1.1143 + do
  1.1144 + echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
  1.1145 +-echo "configure:2698: checking for $ac_func" >&5
  1.1146 ++echo "configure:2811: checking for $ac_func" >&5
  1.1147 + if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  1.1148 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1149 + else
  1.1150 +   cat > conftest.$ac_ext <<EOF
  1.1151 +-#line 2703 "configure"
  1.1152 ++#line 2816 "configure"
  1.1153 + #include "confdefs.h"
  1.1154 + /* System header to define __stub macros and hopefully few prototypes,
  1.1155 +     which can conflict with char $ac_func(); below.  */
  1.1156 +@@ -2722,7 +2835,7 @@
  1.1157 + 
  1.1158 + ; return 0; }
  1.1159 + EOF
  1.1160 +-if { (eval echo configure:2726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  1.1161 ++if { (eval echo configure:2839: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  1.1162 +   rm -rf conftest*
  1.1163 +   eval "ac_cv_func_$ac_func=yes"
  1.1164 + else
  1.1165 +@@ -2749,19 +2862,19 @@
  1.1166 + # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
  1.1167 + # for constant arguments.  Useless!
  1.1168 + echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
  1.1169 +-echo "configure:2753: checking for working alloca.h" >&5
  1.1170 ++echo "configure:2866: checking for working alloca.h" >&5
  1.1171 + if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
  1.1172 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1173 + else
  1.1174 +   cat > conftest.$ac_ext <<EOF
  1.1175 +-#line 2758 "configure"
  1.1176 ++#line 2871 "configure"
  1.1177 + #include "confdefs.h"
  1.1178 + #include <alloca.h>
  1.1179 + int main() {
  1.1180 + char *p = alloca(2 * sizeof(int));
  1.1181 + ; return 0; }
  1.1182 + EOF
  1.1183 +-if { (eval echo configure:2765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  1.1184 ++if { (eval echo configure:2878: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  1.1185 +   rm -rf conftest*
  1.1186 +   ac_cv_header_alloca_h=yes
  1.1187 + else
  1.1188 +@@ -2782,12 +2895,12 @@
  1.1189 + fi
  1.1190 + 
  1.1191 + echo $ac_n "checking for alloca""... $ac_c" 1>&6
  1.1192 +-echo "configure:2786: checking for alloca" >&5
  1.1193 ++echo "configure:2899: checking for alloca" >&5
  1.1194 + if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
  1.1195 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1196 + else
  1.1197 +   cat > conftest.$ac_ext <<EOF
  1.1198 +-#line 2791 "configure"
  1.1199 ++#line 2904 "configure"
  1.1200 + #include "confdefs.h"
  1.1201 + 
  1.1202 + #ifdef __GNUC__
  1.1203 +@@ -2815,7 +2928,7 @@
  1.1204 + char *p = (char *) alloca(1);
  1.1205 + ; return 0; }
  1.1206 + EOF
  1.1207 +-if { (eval echo configure:2819: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  1.1208 ++if { (eval echo configure:2932: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  1.1209 +   rm -rf conftest*
  1.1210 +   ac_cv_func_alloca_works=yes
  1.1211 + else
  1.1212 +@@ -2847,12 +2960,12 @@
  1.1213 + 
  1.1214 + 
  1.1215 + echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
  1.1216 +-echo "configure:2851: checking whether alloca needs Cray hooks" >&5
  1.1217 ++echo "configure:2964: checking whether alloca needs Cray hooks" >&5
  1.1218 + if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
  1.1219 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1220 + else
  1.1221 +   cat > conftest.$ac_ext <<EOF
  1.1222 +-#line 2856 "configure"
  1.1223 ++#line 2969 "configure"
  1.1224 + #include "confdefs.h"
  1.1225 + #if defined(CRAY) && ! defined(CRAY2)
  1.1226 + webecray
  1.1227 +@@ -2877,12 +2990,12 @@
  1.1228 + if test $ac_cv_os_cray = yes; then
  1.1229 + for ac_func in _getb67 GETB67 getb67; do
  1.1230 +   echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
  1.1231 +-echo "configure:2881: checking for $ac_func" >&5
  1.1232 ++echo "configure:2994: checking for $ac_func" >&5
  1.1233 + if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
  1.1234 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1235 + else
  1.1236 +   cat > conftest.$ac_ext <<EOF
  1.1237 +-#line 2886 "configure"
  1.1238 ++#line 2999 "configure"
  1.1239 + #include "confdefs.h"
  1.1240 + /* System header to define __stub macros and hopefully few prototypes,
  1.1241 +     which can conflict with char $ac_func(); below.  */
  1.1242 +@@ -2905,7 +3018,7 @@
  1.1243 + 
  1.1244 + ; return 0; }
  1.1245 + EOF
  1.1246 +-if { (eval echo configure:2909: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  1.1247 ++if { (eval echo configure:3022: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  1.1248 +   rm -rf conftest*
  1.1249 +   eval "ac_cv_func_$ac_func=yes"
  1.1250 + else
  1.1251 +@@ -2932,7 +3045,7 @@
  1.1252 + fi
  1.1253 + 
  1.1254 + echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
  1.1255 +-echo "configure:2936: checking stack direction for C alloca" >&5
  1.1256 ++echo "configure:3049: checking stack direction for C alloca" >&5
  1.1257 + if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
  1.1258 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1259 + else
  1.1260 +@@ -2940,7 +3053,7 @@
  1.1261 +   ac_cv_c_stack_direction=0
  1.1262 + else
  1.1263 +   cat > conftest.$ac_ext <<EOF
  1.1264 +-#line 2944 "configure"
  1.1265 ++#line 3057 "configure"
  1.1266 + #include "confdefs.h"
  1.1267 + find_stack_direction ()
  1.1268 + {
  1.1269 +@@ -2959,7 +3072,7 @@
  1.1270 +   exit (find_stack_direction() < 0);
  1.1271 + }
  1.1272 + EOF
  1.1273 +-if { (eval echo configure:2963: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
  1.1274 ++if { (eval echo configure:3076: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
  1.1275 + then
  1.1276 +   ac_cv_c_stack_direction=1
  1.1277 + else
  1.1278 +@@ -2982,13 +3095,13 @@
  1.1279 + 
  1.1280 + 
  1.1281 + echo $ac_n "checking size of short""... $ac_c" 1>&6
  1.1282 +-echo "configure:2986: checking size of short" >&5
  1.1283 ++echo "configure:3099: checking size of short" >&5
  1.1284 + if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
  1.1285 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1286 + else
  1.1287 +   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
  1.1288 +   cat > conftest.$ac_ext <<EOF
  1.1289 +-#line 2992 "configure"
  1.1290 ++#line 3105 "configure"
  1.1291 + #include "confdefs.h"
  1.1292 + #include "confdefs.h"
  1.1293 + #include <sys/types.h>
  1.1294 +@@ -2998,7 +3111,7 @@
  1.1295 + switch (0) case 0: case (sizeof (short) == $ac_size):;
  1.1296 + ; return 0; }
  1.1297 + EOF
  1.1298 +-if { (eval echo configure:3002: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1299 ++if { (eval echo configure:3115: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1300 +   rm -rf conftest*
  1.1301 +   ac_cv_sizeof_short=$ac_size
  1.1302 + else
  1.1303 +@@ -3021,13 +3134,13 @@
  1.1304 + 
  1.1305 + 
  1.1306 + echo $ac_n "checking size of int""... $ac_c" 1>&6
  1.1307 +-echo "configure:3025: checking size of int" >&5
  1.1308 ++echo "configure:3138: checking size of int" >&5
  1.1309 + if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
  1.1310 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1311 + else
  1.1312 +   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
  1.1313 +   cat > conftest.$ac_ext <<EOF
  1.1314 +-#line 3031 "configure"
  1.1315 ++#line 3144 "configure"
  1.1316 + #include "confdefs.h"
  1.1317 + #include "confdefs.h"
  1.1318 + #include <sys/types.h>
  1.1319 +@@ -3037,7 +3150,7 @@
  1.1320 + switch (0) case 0: case (sizeof (int) == $ac_size):;
  1.1321 + ; return 0; }
  1.1322 + EOF
  1.1323 +-if { (eval echo configure:3041: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1324 ++if { (eval echo configure:3154: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1325 +   rm -rf conftest*
  1.1326 +   ac_cv_sizeof_int=$ac_size
  1.1327 + else
  1.1328 +@@ -3060,13 +3173,13 @@
  1.1329 + 
  1.1330 + 
  1.1331 + echo $ac_n "checking size of long""... $ac_c" 1>&6
  1.1332 +-echo "configure:3064: checking size of long" >&5
  1.1333 ++echo "configure:3177: checking size of long" >&5
  1.1334 + if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
  1.1335 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1336 + else
  1.1337 +   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
  1.1338 +   cat > conftest.$ac_ext <<EOF
  1.1339 +-#line 3070 "configure"
  1.1340 ++#line 3183 "configure"
  1.1341 + #include "confdefs.h"
  1.1342 + #include "confdefs.h"
  1.1343 + #include <sys/types.h>
  1.1344 +@@ -3076,7 +3189,7 @@
  1.1345 + switch (0) case 0: case (sizeof (long) == $ac_size):;
  1.1346 + ; return 0; }
  1.1347 + EOF
  1.1348 +-if { (eval echo configure:3080: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1349 ++if { (eval echo configure:3193: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1350 +   rm -rf conftest*
  1.1351 +   ac_cv_sizeof_long=$ac_size
  1.1352 + else
  1.1353 +@@ -3099,13 +3212,13 @@
  1.1354 + 
  1.1355 + 
  1.1356 + echo $ac_n "checking size of long long""... $ac_c" 1>&6
  1.1357 +-echo "configure:3103: checking size of long long" >&5
  1.1358 ++echo "configure:3216: checking size of long long" >&5
  1.1359 + if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then
  1.1360 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1361 + else
  1.1362 +   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
  1.1363 +   cat > conftest.$ac_ext <<EOF
  1.1364 +-#line 3109 "configure"
  1.1365 ++#line 3222 "configure"
  1.1366 + #include "confdefs.h"
  1.1367 + #include "confdefs.h"
  1.1368 + #include <sys/types.h>
  1.1369 +@@ -3115,7 +3228,7 @@
  1.1370 + switch (0) case 0: case (sizeof (long long) == $ac_size):;
  1.1371 + ; return 0; }
  1.1372 + EOF
  1.1373 +-if { (eval echo configure:3119: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1374 ++if { (eval echo configure:3232: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1375 +   rm -rf conftest*
  1.1376 +   ac_cv_sizeof_long_long=$ac_size
  1.1377 + else
  1.1378 +@@ -3138,13 +3251,13 @@
  1.1379 + 
  1.1380 + 
  1.1381 + echo $ac_n "checking size of float""... $ac_c" 1>&6
  1.1382 +-echo "configure:3142: checking size of float" >&5
  1.1383 ++echo "configure:3255: checking size of float" >&5
  1.1384 + if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then
  1.1385 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1386 + else
  1.1387 +   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
  1.1388 +   cat > conftest.$ac_ext <<EOF
  1.1389 +-#line 3148 "configure"
  1.1390 ++#line 3261 "configure"
  1.1391 + #include "confdefs.h"
  1.1392 + #include "confdefs.h"
  1.1393 + #include <sys/types.h>
  1.1394 +@@ -3154,7 +3267,7 @@
  1.1395 + switch (0) case 0: case (sizeof (float) == $ac_size):;
  1.1396 + ; return 0; }
  1.1397 + EOF
  1.1398 +-if { (eval echo configure:3158: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1399 ++if { (eval echo configure:3271: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1400 +   rm -rf conftest*
  1.1401 +   ac_cv_sizeof_float=$ac_size
  1.1402 + else
  1.1403 +@@ -3177,13 +3290,13 @@
  1.1404 + 
  1.1405 + 
  1.1406 + echo $ac_n "checking size of double""... $ac_c" 1>&6
  1.1407 +-echo "configure:3181: checking size of double" >&5
  1.1408 ++echo "configure:3294: checking size of double" >&5
  1.1409 + if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then
  1.1410 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1411 + else
  1.1412 +   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
  1.1413 +   cat > conftest.$ac_ext <<EOF
  1.1414 +-#line 3187 "configure"
  1.1415 ++#line 3300 "configure"
  1.1416 + #include "confdefs.h"
  1.1417 + #include "confdefs.h"
  1.1418 + #include <sys/types.h>
  1.1419 +@@ -3193,7 +3306,7 @@
  1.1420 + switch (0) case 0: case (sizeof (double) == $ac_size):;
  1.1421 + ; return 0; }
  1.1422 + EOF
  1.1423 +-if { (eval echo configure:3197: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1424 ++if { (eval echo configure:3310: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1425 +   rm -rf conftest*
  1.1426 +   ac_cv_sizeof_double=$ac_size
  1.1427 + else
  1.1428 +@@ -3216,13 +3329,13 @@
  1.1429 + 
  1.1430 + 
  1.1431 + echo $ac_n "checking size of long double""... $ac_c" 1>&6
  1.1432 +-echo "configure:3220: checking size of long double" >&5
  1.1433 ++echo "configure:3333: checking size of long double" >&5
  1.1434 + if eval "test \"`echo '$''{'ac_cv_sizeof_long_double'+set}'`\" = set"; then
  1.1435 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1436 + else
  1.1437 +   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
  1.1438 +   cat > conftest.$ac_ext <<EOF
  1.1439 +-#line 3226 "configure"
  1.1440 ++#line 3339 "configure"
  1.1441 + #include "confdefs.h"
  1.1442 + #include "confdefs.h"
  1.1443 + #include <sys/types.h>
  1.1444 +@@ -3232,7 +3345,7 @@
  1.1445 + switch (0) case 0: case (sizeof (long double) == $ac_size):;
  1.1446 + ; return 0; }
  1.1447 + EOF
  1.1448 +-if { (eval echo configure:3236: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1449 ++if { (eval echo configure:3349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1450 +   rm -rf conftest*
  1.1451 +   ac_cv_sizeof_long_double=$ac_size
  1.1452 + else
  1.1453 +@@ -3256,13 +3369,13 @@
  1.1454 + 
  1.1455 + 
  1.1456 + echo $ac_n "checking size of void *""... $ac_c" 1>&6
  1.1457 +-echo "configure:3260: checking size of void *" >&5
  1.1458 ++echo "configure:3373: checking size of void *" >&5
  1.1459 + if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set"; then
  1.1460 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1461 + else
  1.1462 +   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
  1.1463 +   cat > conftest.$ac_ext <<EOF
  1.1464 +-#line 3266 "configure"
  1.1465 ++#line 3379 "configure"
  1.1466 + #include "confdefs.h"
  1.1467 + #include "confdefs.h"
  1.1468 + #include <sys/types.h>
  1.1469 +@@ -3272,7 +3385,7 @@
  1.1470 + switch (0) case 0: case (sizeof (void *) == $ac_size):;
  1.1471 + ; return 0; }
  1.1472 + EOF
  1.1473 +-if { (eval echo configure:3276: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1474 ++if { (eval echo configure:3389: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1475 +   rm -rf conftest*
  1.1476 +   ac_cv_sizeof_void_p=$ac_size
  1.1477 + else
  1.1478 +@@ -3295,14 +3408,14 @@
  1.1479 + 
  1.1480 + 
  1.1481 + echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
  1.1482 +-echo "configure:3299: checking whether byte ordering is bigendian" >&5
  1.1483 ++echo "configure:3412: checking whether byte ordering is bigendian" >&5
  1.1484 + if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
  1.1485 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1486 + else
  1.1487 +   ac_cv_c_bigendian=unknown
  1.1488 + # See if sys/param.h defines the BYTE_ORDER macro.
  1.1489 + cat > conftest.$ac_ext <<EOF
  1.1490 +-#line 3306 "configure"
  1.1491 ++#line 3419 "configure"
  1.1492 + #include "confdefs.h"
  1.1493 + #include <sys/types.h>
  1.1494 + #include <sys/param.h>
  1.1495 +@@ -3313,11 +3426,11 @@
  1.1496 + #endif
  1.1497 + ; return 0; }
  1.1498 + EOF
  1.1499 +-if { (eval echo configure:3317: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1500 ++if { (eval echo configure:3430: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1501 +   rm -rf conftest*
  1.1502 +   # It does; now see whether it defined to BIG_ENDIAN or not.
  1.1503 + cat > conftest.$ac_ext <<EOF
  1.1504 +-#line 3321 "configure"
  1.1505 ++#line 3434 "configure"
  1.1506 + #include "confdefs.h"
  1.1507 + #include <sys/types.h>
  1.1508 + #include <sys/param.h>
  1.1509 +@@ -3328,7 +3441,7 @@
  1.1510 + #endif
  1.1511 + ; return 0; }
  1.1512 + EOF
  1.1513 +-if { (eval echo configure:3332: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1514 ++if { (eval echo configure:3445: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  1.1515 +   rm -rf conftest*
  1.1516 +   ac_cv_c_bigendian=yes
  1.1517 + else
  1.1518 +@@ -3348,7 +3461,7 @@
  1.1519 +    echo $ac_n "cross-compiling... " 2>&6 
  1.1520 + else
  1.1521 +   cat > conftest.$ac_ext <<EOF
  1.1522 +-#line 3352 "configure"
  1.1523 ++#line 3465 "configure"
  1.1524 + #include "confdefs.h"
  1.1525 + main () {
  1.1526 +   /* Are we little or big endian?  From Harbison&Steele.  */
  1.1527 +@@ -3361,7 +3474,7 @@
  1.1528 +   exit (u.c[sizeof (long) - 1] == 1);
  1.1529 + }
  1.1530 + EOF
  1.1531 +-if { (eval echo configure:3365: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
  1.1532 ++if { (eval echo configure:3478: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
  1.1533 + then
  1.1534 +   ac_cv_c_bigendian=no
  1.1535 + else
  1.1536 +@@ -3379,7 +3492,7 @@
  1.1537 + echo "$ac_t""$ac_cv_c_bigendian" 1>&6
  1.1538 + if test $ac_cv_c_bigendian = unknown; then
  1.1539 + echo $ac_n "checking to probe for byte ordering""... $ac_c" 1>&6
  1.1540 +-echo "configure:3383: checking to probe for byte ordering" >&5
  1.1541 ++echo "configure:3496: checking to probe for byte ordering" >&5
  1.1542 + 
  1.1543 + cat >conftest.c <<EOF
  1.1544 + short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
  1.1545 +@@ -3414,6 +3527,10 @@
  1.1546 + #define WORDS_BIGENDIAN 1
  1.1547 + EOF
  1.1548 + 
  1.1549 ++  cat >> confdefs.h <<\EOF
  1.1550 ++#define HOST_WORDS_BIG_ENDIAN 1
  1.1551 ++EOF
  1.1552 ++
  1.1553 +   BYTEORDER=4321
  1.1554 + else
  1.1555 +   BYTEORDER=1234
  1.1556 +@@ -3429,7 +3546,7 @@
  1.1557 + 
  1.1558 + if test x$TARGET = xSPARC; then
  1.1559 +     echo $ac_n "checking assembler and linker support unaligned pc related relocs""... $ac_c" 1>&6
  1.1560 +-echo "configure:3433: checking assembler and linker support unaligned pc related relocs" >&5
  1.1561 ++echo "configure:3550: checking assembler and linker support unaligned pc related relocs" >&5
  1.1562 + if eval "test \"`echo '$''{'libffi_cv_as_sparc_ua_pcrel'+set}'`\" = set"; then
  1.1563 +   echo $ac_n "(cached) $ac_c" 1>&6
  1.1564 + else
  1.1565 +@@ -3439,14 +3556,14 @@
  1.1566 + 	CFLAGS="$CFLAGS -fpic"
  1.1567 + 	LDFLAGS="$LDFLAGS -shared"
  1.1568 + 	cat > conftest.$ac_ext <<EOF
  1.1569 +-#line 3443 "configure"
  1.1570 ++#line 3560 "configure"
  1.1571 + #include "confdefs.h"
  1.1572 + asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");
  1.1573 + int main() {
  1.1574 + 
  1.1575 + ; return 0; }
  1.1576 + EOF
  1.1577 +-if { (eval echo configure:3450: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  1.1578 ++if { (eval echo configure:3567: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  1.1579 +   rm -rf conftest*
  1.1580 +   libffi_cv_as_sparc_ua_pcrel=yes
  1.1581 + else
  1.1582 +@@ -3709,6 +3826,8 @@
  1.1583 + s%@MIPS_GCC_FALSE@%$MIPS_GCC_FALSE%g
  1.1584 + s%@MIPS_SGI_TRUE@%$MIPS_SGI_TRUE%g
  1.1585 + s%@MIPS_SGI_FALSE@%$MIPS_SGI_FALSE%g
  1.1586 ++s%@MIPS_LINUX_TRUE@%$MIPS_LINUX_TRUE%g
  1.1587 ++s%@MIPS_LINUX_FALSE@%$MIPS_LINUX_FALSE%g
  1.1588 + s%@SPARC_TRUE@%$SPARC_TRUE%g
  1.1589 + s%@SPARC_FALSE@%$SPARC_FALSE%g
  1.1590 + s%@X86_TRUE@%$X86_TRUE%g
  1.1591 +@@ -3729,6 +3848,12 @@
  1.1592 + s%@POWERPC_DARWIN_FALSE@%$POWERPC_DARWIN_FALSE%g
  1.1593 + s%@ARM_TRUE@%$ARM_TRUE%g
  1.1594 + s%@ARM_FALSE@%$ARM_FALSE%g
  1.1595 ++s%@S390_TRUE@%$S390_TRUE%g
  1.1596 ++s%@S390_FALSE@%$S390_FALSE%g
  1.1597 ++s%@X86_64_TRUE@%$X86_64_TRUE%g
  1.1598 ++s%@X86_64_FALSE@%$X86_64_FALSE%g
  1.1599 ++s%@SH_TRUE@%$SH_TRUE%g
  1.1600 ++s%@SH_FALSE@%$SH_FALSE%g
  1.1601 + s%@CPP@%$CPP%g
  1.1602 + s%@ALLOCA@%$ALLOCA%g
  1.1603 + s%@TARGET@%$TARGET%g
  1.1604 +@@ -3969,7 +4094,7 @@
  1.1605 + 
  1.1606 + if test -n "$CONFIG_FILES"; then
  1.1607 +    LD="${ORIGINAL_LD_FOR_MULTILIBS}"
  1.1608 +-   ac_file=Makefile . ${libffi_basedir}/../config-ml.in
  1.1609 ++   ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in
  1.1610 + fi
  1.1611 + 
  1.1612 + exit 0
  1.1613 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure.in gcc/libffi/configure.in
  1.1614 +--- gcc-3.2.2.orig/libffi/configure.in	Tue Jan 28 10:43:56 2003
  1.1615 ++++ gcc/libffi/configure.in	Sat Feb  1 20:16:19 2003
  1.1616 +@@ -22,14 +22,15 @@
  1.1617 + 
  1.1618 + if test "${srcdir}" = "."; then
  1.1619 +   if test "${with_target_subdir}" != "."; then
  1.1620 +-    libffi_basedir="${srcdir}/${with_multisrctop}.."
  1.1621 ++    libffi_basedir="${with_multisrctop}../"
  1.1622 +   else
  1.1623 +-    libffi_basedir="${srcdir}/${with_multisrctop}"
  1.1624 ++    libffi_basedir="${with_multisrctop}"
  1.1625 +   fi
  1.1626 + else
  1.1627 +-  libffi_basedir="${srcdir}"
  1.1628 ++  libffi_basedir=
  1.1629 + fi
  1.1630 + AC_SUBST(libffi_basedir)
  1.1631 ++AC_CONFIG_AUX_DIR(${libffi_basedir}..)
  1.1632 + 
  1.1633 + AC_CANONICAL_HOST
  1.1634 + 
  1.1635 +@@ -56,17 +57,23 @@
  1.1636 + i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;;
  1.1637 + sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;;
  1.1638 + sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;;
  1.1639 +-sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
  1.1640 +-sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
  1.1641 +-alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;;
  1.1642 ++sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;;
  1.1643 ++sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;;
  1.1644 ++alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;;
  1.1645 + ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;;
  1.1646 + m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;;
  1.1647 ++mips64*-*);;
  1.1648 ++mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;;
  1.1649 + powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;;
  1.1650 + powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;;
  1.1651 + powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;;
  1.1652 + powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
  1.1653 + rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
  1.1654 + arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;;
  1.1655 ++s390-*-linux-*) TARGET=S390; TARGETDIR=s390;;
  1.1656 ++s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;;
  1.1657 ++x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;;
  1.1658 ++sh-*-linux* | sh[[34]]*-*-linux*) TARGET=SH; TARGETDIR=sh;;
  1.1659 + esac
  1.1660 + 
  1.1661 + if test $TARGETDIR = unknown; then
  1.1662 +@@ -75,6 +82,7 @@
  1.1663 + 
  1.1664 + AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
  1.1665 + AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
  1.1666 ++AM_CONDITIONAL(MIPS_LINUX, test x$TARGET = xMIPS_LINUX)
  1.1667 + AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
  1.1668 + AM_CONDITIONAL(X86, test x$TARGET = xX86)
  1.1669 + AM_CONDITIONAL(X86_WIN32, test x$TARGET = xX86_WIN32)
  1.1670 +@@ -85,6 +93,13 @@
  1.1671 + AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX)
  1.1672 + AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN)
  1.1673 + AM_CONDITIONAL(ARM, test x$TARGET = xARM)
  1.1674 ++AM_CONDITIONAL(S390, test x$TARGET = xS390)
  1.1675 ++AM_CONDITIONAL(X86_64, test x$TARGET = xX86_64)
  1.1676 ++AM_CONDITIONAL(SH, test x$TARGET = xSH)
  1.1677 ++
  1.1678 ++if test x$TARGET = xMIPS_LINUX; then
  1.1679 ++  TARGET=MIPS
  1.1680 ++fi
  1.1681 + 
  1.1682 + AC_HEADER_STDC
  1.1683 + AC_CHECK_FUNCS(memcpy)
  1.1684 +@@ -171,7 +186,7 @@
  1.1685 + [
  1.1686 + if test -n "$CONFIG_FILES"; then
  1.1687 +    LD="${ORIGINAL_LD_FOR_MULTILIBS}"
  1.1688 +-   ac_file=Makefile . ${libffi_basedir}/../config-ml.in
  1.1689 ++   ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in
  1.1690 + fi
  1.1691 + ],
  1.1692 + srcdir=${srcdir}
  1.1693 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/Makefile.in gcc/libffi/include/Makefile.in
  1.1694 +--- gcc-3.2.2.orig/libffi/include/Makefile.in	Tue Oct  9 14:32:16 2001
  1.1695 ++++ gcc/libffi/include/Makefile.in	Mon Apr 29 13:14:44 2002
  1.1696 +@@ -99,7 +99,7 @@
  1.1697 + 
  1.1698 + DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
  1.1699 + 
  1.1700 +-TAR = gnutar
  1.1701 ++TAR = gtar
  1.1702 + GZIP_ENV = --best
  1.1703 + all: all-redirect
  1.1704 + .SUFFIXES:
  1.1705 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/ffi.h.in gcc/libffi/include/ffi.h.in
  1.1706 +--- gcc-3.2.2.orig/libffi/include/ffi.h.in	Wed Mar 13 07:35:56 2002
  1.1707 ++++ gcc/libffi/include/ffi.h.in	Wed Jan 29 00:54:28 2003
  1.1708 +@@ -1,5 +1,5 @@
  1.1709 + /* -----------------------------------------------------------------*-C-*-
  1.1710 +-   libffi @VERSION@ - Copyright (c) 1996-2002  Cygnus Solutions
  1.1711 ++   libffi @VERSION@ - Copyright (c) 1996-2003  Cygnus Solutions
  1.1712 + 
  1.1713 +    Permission is hereby granted, free of charge, to any person obtaining
  1.1714 +    a copy of this software and associated documentation files (the
  1.1715 +@@ -164,6 +164,12 @@
  1.1716 + #endif
  1.1717 + #endif
  1.1718 + 
  1.1719 ++#ifdef S390
  1.1720 ++#if defined (__s390x__)
  1.1721 ++#define S390X
  1.1722 ++#endif
  1.1723 ++#endif
  1.1724 ++
  1.1725 + #ifndef LIBFFI_ASM
  1.1726 + 
  1.1727 + /* ---- Generic type definitions ----------------------------------------- */
  1.1728 +@@ -189,16 +195,23 @@
  1.1729 + #endif
  1.1730 + #endif
  1.1731 + 
  1.1732 +-  /* ---- Intel x86 ---------------- */
  1.1733 +-#ifdef X86
  1.1734 ++  /* ---- Intel x86 Win32 ---------- */
  1.1735 ++#ifdef X86_WIN32
  1.1736 +   FFI_SYSV,
  1.1737 ++  FFI_STDCALL,
  1.1738 ++  /* TODO: Add fastcall support for the sake of completeness */
  1.1739 +   FFI_DEFAULT_ABI = FFI_SYSV,
  1.1740 + #endif
  1.1741 + 
  1.1742 +-  /* ---- Intel x86 Win32 ---------- */
  1.1743 +-#ifdef X86_WIN32
  1.1744 ++  /* ---- Intel x86 and AMD x86-64 - */
  1.1745 ++#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__))
  1.1746 +   FFI_SYSV,
  1.1747 ++  FFI_UNIX64,   /* Unix variants all use the same ABI for x86-64  */
  1.1748 ++#ifdef __i386__
  1.1749 +   FFI_DEFAULT_ABI = FFI_SYSV,
  1.1750 ++#else
  1.1751 ++  FFI_DEFAULT_ABI = FFI_UNIX64,
  1.1752 ++#endif
  1.1753 + #endif
  1.1754 + 
  1.1755 +   /* ---- Intel ia64 ---------------- */
  1.1756 +@@ -251,6 +264,18 @@
  1.1757 +   FFI_DEFAULT_ABI = FFI_SYSV,
  1.1758 + #endif
  1.1759 + 
  1.1760 ++  /* ---- S390 --------------------- */
  1.1761 ++#ifdef S390
  1.1762 ++  FFI_SYSV,
  1.1763 ++  FFI_DEFAULT_ABI = FFI_SYSV,
  1.1764 ++#endif
  1.1765 ++
  1.1766 ++  /* ---- SuperH ------------------- */
  1.1767 ++#ifdef SH
  1.1768 ++  FFI_SYSV,
  1.1769 ++  FFI_DEFAULT_ABI = FFI_SYSV,
  1.1770 ++#endif
  1.1771 ++
  1.1772 +   /* Leave this for debugging purposes */
  1.1773 +   FFI_LAST_ABI
  1.1774 + 
  1.1775 +@@ -264,7 +289,7 @@
  1.1776 +   /*@null@*/ struct _ffi_type **elements;
  1.1777 + } ffi_type;
  1.1778 + 
  1.1779 +-/* These are defined in ffi.c */
  1.1780 ++/* These are defined in types.c */
  1.1781 + extern ffi_type ffi_type_void;
  1.1782 + extern ffi_type ffi_type_uint8;
  1.1783 + extern ffi_type ffi_type_sint8;
  1.1784 +@@ -373,13 +398,7 @@
  1.1785 + 
  1.1786 + /* ---- Definitions for closures ----------------------------------------- */
  1.1787 + 
  1.1788 +-#ifdef X86
  1.1789 +-
  1.1790 +-#define FFI_CLOSURES 1		/* x86 supports closures */
  1.1791 +-#define FFI_TRAMPOLINE_SIZE 10
  1.1792 +-#define FFI_NATIVE_RAW_API 1	/* and has native raw api support */
  1.1793 +-
  1.1794 +-#elif defined(X86_WIN32)
  1.1795 ++#ifdef __i386__
  1.1796 + 
  1.1797 + #define FFI_CLOSURES 1		/* x86 supports closures */
  1.1798 + #define FFI_TRAMPOLINE_SIZE 10
  1.1799 +@@ -424,6 +443,40 @@
  1.1800 + #define FFI_TRAMPOLINE_SIZE 24 /* see struct below */ 
  1.1801 + #define FFI_NATIVE_RAW_API 0
  1.1802 + 
  1.1803 ++#elif defined(SPARC64)
  1.1804 ++
  1.1805 ++#define FFI_CLOSURES 1
  1.1806 ++#define FFI_TRAMPOLINE_SIZE 24
  1.1807 ++#define FFI_NATIVE_RAW_API 0
  1.1808 ++
  1.1809 ++#elif defined(SPARC)
  1.1810 ++
  1.1811 ++#define FFI_CLOSURES 1
  1.1812 ++#define FFI_TRAMPOLINE_SIZE 16
  1.1813 ++#define FFI_NATIVE_RAW_API 0
  1.1814 ++
  1.1815 ++#elif defined(S390)
  1.1816 ++
  1.1817 ++#define FFI_CLOSURES 1
  1.1818 ++#ifdef S390X
  1.1819 ++#define FFI_TRAMPOLINE_SIZE 32
  1.1820 ++#else
  1.1821 ++#define FFI_TRAMPOLINE_SIZE 16
  1.1822 ++#endif
  1.1823 ++#define FFI_NATIVE_RAW_API 0
  1.1824 ++
  1.1825 ++#elif defined(SH)
  1.1826 ++
  1.1827 ++#define FFI_CLOSURES 1
  1.1828 ++#define FFI_TRAMPOLINE_SIZE 16
  1.1829 ++#define FFI_NATIVE_RAW_API 0
  1.1830 ++
  1.1831 ++#elif defined(__x86_64__)
  1.1832 ++
  1.1833 ++#define FFI_CLOSURES 1
  1.1834 ++#define FFI_TRAMPOLINE_SIZE 24
  1.1835 ++#define FFI_NATIVE_RAW_API 0
  1.1836 ++
  1.1837 + #else 
  1.1838 + 
  1.1839 + #define FFI_CLOSURES 0
  1.1840 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/ffi.c gcc/libffi/src/arm/ffi.c
  1.1841 +--- gcc-3.2.2.orig/libffi/src/arm/ffi.c	Sat Mar  3 07:21:23 2001
  1.1842 ++++ gcc/libffi/src/arm/ffi.c	Fri Jul 19 08:08:30 2002
  1.1843 +@@ -36,13 +36,10 @@
  1.1844 + /*@=exportheader@*/
  1.1845 + {
  1.1846 +   register unsigned int i;
  1.1847 +-  register int tmp;
  1.1848 +-  register unsigned int avn;
  1.1849 +   register void **p_argv;
  1.1850 +   register char *argp;
  1.1851 +   register ffi_type **p_arg;
  1.1852 + 
  1.1853 +-  tmp = 0;
  1.1854 +   argp = stack;
  1.1855 + 
  1.1856 +   if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) {
  1.1857 +@@ -50,11 +47,10 @@
  1.1858 +     argp += 4;
  1.1859 +   }
  1.1860 + 
  1.1861 +-  avn = ecif->cif->nargs;
  1.1862 +   p_argv = ecif->avalue;
  1.1863 + 
  1.1864 +   for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
  1.1865 +-       (i != 0) && (avn != 0);
  1.1866 ++       (i != 0);
  1.1867 +        i--, p_arg++)
  1.1868 +     {
  1.1869 +       size_t z;
  1.1870 +@@ -64,9 +60,6 @@
  1.1871 + 	argp = (char *) ALIGN(argp, (*p_arg)->alignment);
  1.1872 +       }
  1.1873 + 
  1.1874 +-      if (avn != 0) 
  1.1875 +-	{
  1.1876 +-	  avn--;
  1.1877 + 	  z = (*p_arg)->size;
  1.1878 + 	  if (z < sizeof(int))
  1.1879 + 	    {
  1.1880 +@@ -107,7 +100,6 @@
  1.1881 + 	    }
  1.1882 + 	  p_argv++;
  1.1883 + 	  argp += z;
  1.1884 +-	}
  1.1885 +     }
  1.1886 +   
  1.1887 +   return;
  1.1888 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/sysv.S gcc/libffi/src/arm/sysv.S
  1.1889 +--- gcc-3.2.2.orig/libffi/src/arm/sysv.S	Sat Mar  3 07:21:23 2001
  1.1890 ++++ gcc/libffi/src/arm/sysv.S	Mon Sep 30 03:08:58 2002
  1.1891 +@@ -28,8 +28,15 @@
  1.1892 + #ifdef HAVE_MACHINE_ASM_H
  1.1893 + #include <machine/asm.h>
  1.1894 + #else
  1.1895 +-/* XXX these lose for some platforms, I'm sure. */
  1.1896 ++#ifdef __USER_LABEL_PREFIX__
  1.1897 ++#define CONCAT1(a, b) CONCAT2(a, b)
  1.1898 ++#define CONCAT2(a, b) a ## b
  1.1899 ++
  1.1900 ++/* Use the right prefix for global labels.  */
  1.1901 ++#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
  1.1902 ++#else
  1.1903 + #define CNAME(x) x
  1.1904 ++#endif
  1.1905 + #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
  1.1906 + #endif
  1.1907 + 	
  1.1908 +@@ -96,12 +103,20 @@
  1.1909 + 
  1.1910 + # return FLOAT
  1.1911 + 	cmp     a4, #FFI_TYPE_FLOAT
  1.1912 ++#ifdef __SOFTFP__
  1.1913 ++	streq	a1, [a3]
  1.1914 ++#else
  1.1915 + 	stfeqs  f0, [a3]
  1.1916 ++#endif
  1.1917 + 	beq     epilogue
  1.1918 + 
  1.1919 + # return DOUBLE or LONGDOUBLE
  1.1920 + 	cmp     a4, #FFI_TYPE_DOUBLE
  1.1921 ++#ifdef __SOFTFP__
  1.1922 ++	stmeqia	a3, {a1, a2}
  1.1923 ++#else
  1.1924 + 	stfeqd  f0, [a3]
  1.1925 ++#endif
  1.1926 + 
  1.1927 + epilogue:
  1.1928 +         ldmfd sp!, {a1-a4, fp, pc}
  1.1929 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/java_raw_api.c gcc/libffi/src/java_raw_api.c
  1.1930 +--- gcc-3.2.2.orig/libffi/src/java_raw_api.c	Tue Apr  9 07:31:14 2002
  1.1931 ++++ gcc/libffi/src/java_raw_api.c	Tue Oct  8 23:55:02 2002
  1.1932 +@@ -81,21 +81,14 @@
  1.1933 + 	{
  1.1934 + 	case FFI_TYPE_UINT8:
  1.1935 + 	case FFI_TYPE_SINT8:
  1.1936 +-	  *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 1);
  1.1937 ++	  *args = (void*) ((char*)(raw++) + 3);
  1.1938 + 	  break;
  1.1939 + 	  
  1.1940 + 	case FFI_TYPE_UINT16:
  1.1941 + 	case FFI_TYPE_SINT16:
  1.1942 +-	  *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 2);
  1.1943 ++	  *args = (void*) ((char*)(raw++) + 2);
  1.1944 + 	  break;
  1.1945 + 
  1.1946 +-#if SIZEOF_ARG >= 4	  
  1.1947 +-	case FFI_TYPE_UINT32:
  1.1948 +-	case FFI_TYPE_SINT32:
  1.1949 +-	  *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 4);
  1.1950 +-	  break;
  1.1951 +-#endif
  1.1952 +-	
  1.1953 + #if SIZEOF_ARG == 8	  
  1.1954 + 	case FFI_TYPE_UINT64:
  1.1955 + 	case FFI_TYPE_SINT64:
  1.1956 +@@ -157,31 +150,54 @@
  1.1957 +       switch ((*tp)->type)
  1.1958 + 	{
  1.1959 + 	case FFI_TYPE_UINT8:
  1.1960 ++#if WORDS_BIGENDIAN
  1.1961 ++	  *(UINT32*)(raw++) = *(UINT8*) (*args);
  1.1962 ++#else
  1.1963 + 	  (raw++)->uint = *(UINT8*) (*args);
  1.1964 ++#endif
  1.1965 + 	  break;
  1.1966 + 
  1.1967 + 	case FFI_TYPE_SINT8:
  1.1968 ++#if WORDS_BIGENDIAN
  1.1969 ++	  *(SINT32*)(raw++) = *(SINT8*) (*args);
  1.1970 ++#else
  1.1971 + 	  (raw++)->sint = *(SINT8*) (*args);
  1.1972 ++#endif
  1.1973 + 	  break;
  1.1974 + 
  1.1975 + 	case FFI_TYPE_UINT16:
  1.1976 ++#if WORDS_BIGENDIAN
  1.1977 ++	  *(UINT32*)(raw++) = *(UINT16*) (*args);
  1.1978 ++#else
  1.1979 + 	  (raw++)->uint = *(UINT16*) (*args);
  1.1980 ++#endif
  1.1981 + 	  break;
  1.1982 + 
  1.1983 + 	case FFI_TYPE_SINT16:
  1.1984 ++#if WORDS_BIGENDIAN
  1.1985 ++	  *(SINT32*)(raw++) = *(SINT16*) (*args);
  1.1986 ++#else
  1.1987 + 	  (raw++)->sint = *(SINT16*) (*args);
  1.1988 ++#endif
  1.1989 + 	  break;
  1.1990 + 
  1.1991 +-#if SIZEOF_ARG >= 4
  1.1992 + 	case FFI_TYPE_UINT32:
  1.1993 ++#if WORDS_BIGENDIAN
  1.1994 ++	  *(UINT32*)(raw++) = *(UINT32*) (*args);
  1.1995 ++#else
  1.1996 + 	  (raw++)->uint = *(UINT32*) (*args);
  1.1997 ++#endif
  1.1998 + 	  break;
  1.1999 + 
  1.2000 + 	case FFI_TYPE_SINT32:
  1.2001 ++#if WORDS_BIGENDIAN
  1.2002 ++	  *(SINT32*)(raw++) = *(SINT32*) (*args);
  1.2003 ++#else
  1.2004 + 	  (raw++)->sint = *(SINT32*) (*args);
  1.2005 +-	  break;
  1.2006 + #endif
  1.2007 +-        case FFI_TYPE_FLOAT:
  1.2008 ++	  break;
  1.2009 ++
  1.2010 ++	case FFI_TYPE_FLOAT:
  1.2011 + 	  (raw++)->flt = *(FLOAT32*) (*args);
  1.2012 + 	  break;
  1.2013 + 
  1.2014 +@@ -211,6 +227,55 @@
  1.2015 + 
  1.2016 + #if !FFI_NATIVE_RAW_API
  1.2017 + 
  1.2018 ++static void
  1.2019 ++ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue)
  1.2020 ++{
  1.2021 ++#if WORDS_BIGENDIAN && SIZEOF_ARG == 8
  1.2022 ++  switch (cif->rtype->type)
  1.2023 ++    {
  1.2024 ++    case FFI_TYPE_UINT8:
  1.2025 ++    case FFI_TYPE_UINT16:
  1.2026 ++    case FFI_TYPE_UINT32:
  1.2027 ++      *(UINT64 *)rvalue <<= 32;
  1.2028 ++      break;
  1.2029 ++
  1.2030 ++    case FFI_TYPE_SINT8:
  1.2031 ++    case FFI_TYPE_SINT16:
  1.2032 ++    case FFI_TYPE_SINT32:
  1.2033 ++    case FFI_TYPE_INT:
  1.2034 ++      *(SINT64 *)rvalue <<= 32;
  1.2035 ++      break;
  1.2036 ++
  1.2037 ++    default:
  1.2038 ++      break;
  1.2039 ++    }
  1.2040 ++#endif
  1.2041 ++}
  1.2042 ++
  1.2043 ++static void
  1.2044 ++ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue)
  1.2045 ++{
  1.2046 ++#if WORDS_BIGENDIAN && SIZEOF_ARG == 8
  1.2047 ++  switch (cif->rtype->type)
  1.2048 ++    {
  1.2049 ++    case FFI_TYPE_UINT8:
  1.2050 ++    case FFI_TYPE_UINT16:
  1.2051 ++    case FFI_TYPE_UINT32:
  1.2052 ++      *(UINT64 *)rvalue >>= 32;
  1.2053 ++      break;
  1.2054 ++
  1.2055 ++    case FFI_TYPE_SINT8:
  1.2056 ++    case FFI_TYPE_SINT16:
  1.2057 ++    case FFI_TYPE_SINT32:
  1.2058 ++    case FFI_TYPE_INT:
  1.2059 ++      *(SINT64 *)rvalue >>= 32;
  1.2060 ++      break;
  1.2061 ++
  1.2062 ++    default:
  1.2063 ++      break;
  1.2064 ++    }
  1.2065 ++#endif
  1.2066 ++}
  1.2067 + 
  1.2068 + /* This is a generic definition of ffi_raw_call, to be used if the
  1.2069 +  * native system does not provide a machine-specific implementation.
  1.2070 +@@ -227,6 +292,7 @@
  1.2071 +   void **avalue = (void**) alloca (cif->nargs * sizeof (void*));
  1.2072 +   ffi_java_raw_to_ptrarray (cif, raw, avalue);
  1.2073 +   ffi_call (cif, fn, rvalue, avalue);
  1.2074 ++  ffi_java_rvalue_to_raw (cif, rvalue);
  1.2075 + }
  1.2076 + 
  1.2077 + #if FFI_CLOSURES		/* base system provides closures */
  1.2078 +@@ -240,6 +306,7 @@
  1.2079 + 
  1.2080 +   ffi_java_ptrarray_to_raw (cif, avalue, raw);
  1.2081 +   (*cl->fun) (cif, rvalue, raw, cl->user_data);
  1.2082 ++  ffi_java_raw_to_rvalue (cif, rvalue);
  1.2083 + }
  1.2084 + 
  1.2085 + /* Again, here is the generic version of ffi_prep_raw_closure, which
  1.2086 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/m68k/ffi.c gcc/libffi/src/m68k/ffi.c
  1.2087 +--- gcc-3.2.2.orig/libffi/src/m68k/ffi.c	Sun Aug  8 22:27:19 1999
  1.2088 ++++ gcc/libffi/src/m68k/ffi.c	Fri Jul 19 08:08:30 2002
  1.2089 +@@ -16,14 +16,11 @@
  1.2090 + ffi_prep_args (void *stack, extended_cif *ecif)
  1.2091 + {
  1.2092 +   unsigned int i;
  1.2093 +-  int tmp;
  1.2094 +-  unsigned int avn;
  1.2095 +   void **p_argv;
  1.2096 +   char *argp;
  1.2097 +   ffi_type **p_arg;
  1.2098 +   void *struct_value_ptr;
  1.2099 + 
  1.2100 +-  tmp = 0;
  1.2101 +   argp = stack;
  1.2102 + 
  1.2103 +   if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
  1.2104 +@@ -32,11 +29,10 @@
  1.2105 +   else
  1.2106 +     struct_value_ptr = NULL;
  1.2107 + 
  1.2108 +-  avn = ecif->cif->nargs;
  1.2109 +   p_argv = ecif->avalue;
  1.2110 + 
  1.2111 +   for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
  1.2112 +-       i != 0 && avn != 0;
  1.2113 ++       i != 0;
  1.2114 +        i--, p_arg++)
  1.2115 +     {
  1.2116 +       size_t z;
  1.2117 +@@ -45,9 +41,6 @@
  1.2118 +       if (((*p_arg)->alignment - 1) & (unsigned) argp)
  1.2119 + 	argp = (char *) ALIGN (argp, (*p_arg)->alignment);
  1.2120 + 
  1.2121 +-      if (avn != 0) 
  1.2122 +-	{
  1.2123 +-	  avn--;
  1.2124 + 	  z = (*p_arg)->size;
  1.2125 + 	  if (z < sizeof (int))
  1.2126 + 	    {
  1.2127 +@@ -82,7 +75,6 @@
  1.2128 + 	    memcpy (argp, *p_argv, z);
  1.2129 + 	  p_argv++;
  1.2130 + 	  argp += z;
  1.2131 +-	}
  1.2132 +     }
  1.2133 + 
  1.2134 +   return struct_value_ptr;
  1.2135 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/mips/ffi.c gcc/libffi/src/mips/ffi.c
  1.2136 +--- gcc-3.2.2.orig/libffi/src/mips/ffi.c	Sat Mar  3 07:21:23 2001
  1.2137 ++++ gcc/libffi/src/mips/ffi.c	Fri Jul 19 08:08:31 2002
  1.2138 +@@ -23,6 +23,7 @@
  1.2139 +    OTHER DEALINGS IN THE SOFTWARE.
  1.2140 +    ----------------------------------------------------------------------- */
  1.2141 + 
  1.2142 ++#include <sgidefs.h>
  1.2143 + #include <ffi.h>
  1.2144 + #include <ffi_common.h>
  1.2145 + 
  1.2146 +@@ -50,7 +51,6 @@
  1.2147 + 			  int flags)
  1.2148 + {
  1.2149 +   register int i;
  1.2150 +-  register int avn;
  1.2151 +   register void **p_argv;
  1.2152 +   register char *argp;
  1.2153 +   register ffi_type **p_arg;
  1.2154 +@@ -80,12 +80,9 @@
  1.2155 +       FIX_ARGP;
  1.2156 +     }
  1.2157 + 
  1.2158 +-  avn = ecif->cif->nargs;
  1.2159 +   p_argv = ecif->avalue;
  1.2160 + 
  1.2161 +-  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
  1.2162 +-       i && avn;
  1.2163 +-       i--, p_arg++)
  1.2164 ++  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++)
  1.2165 +     {
  1.2166 +       size_t z;
  1.2167 + 
  1.2168 +@@ -101,9 +98,6 @@
  1.2169 + #define OFFSET sizeof(int)
  1.2170 + #endif      
  1.2171 + 
  1.2172 +-      if (avn) 
  1.2173 +-	{
  1.2174 +-	  avn--;
  1.2175 + 	  z = (*p_arg)->size;
  1.2176 + 	  if (z < sizeof(SLOT_TYPE_UNSIGNED))
  1.2177 + 	    {
  1.2178 +@@ -179,7 +173,6 @@
  1.2179 + 	  p_argv++;
  1.2180 + 	  argp += z;
  1.2181 + 	  FIX_ARGP;
  1.2182 +-	}
  1.2183 +     }
  1.2184 +   
  1.2185 +   return;
  1.2186 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/powerpc/darwin.S gcc/libffi/src/powerpc/darwin.S
  1.2187 +--- gcc-3.2.2.orig/libffi/src/powerpc/darwin.S	Sat Jan 19 01:22:34 2002
  1.2188 ++++ gcc/libffi/src/powerpc/darwin.S	Thu Jan 23 03:21:55 2003
  1.2189 +@@ -3,8 +3,6 @@
  1.2190 +    
  1.2191 +    PowerPC Assembly glue.
  1.2192 + 
  1.2193 +-   $Id: darwin.S,v 1.2 2002/01/18 16:22:34 dje Exp $
  1.2194 +-
  1.2195 +    Permission is hereby granted, free of charge, to any person obtaining
  1.2196 +    a copy of this software and associated documentation files (the
  1.2197 +    ``Software''), to deal in the Software without restriction, including
  1.2198 +@@ -39,30 +37,34 @@
  1.2199 + .text
  1.2200 + 	.align 2
  1.2201 + _ffi_call_DARWIN:
  1.2202 +-	mr      r12,r8 // We only need r12 until the call, so it doesn't have to be saved...
  1.2203 ++LFB0:	
  1.2204 ++	mr      r12,r8		/* We only need r12 until the call,
  1.2205 ++				so it doesn't have to be saved...  */
  1.2206 ++LFB1:	
  1.2207 + 	/* Save the old stack pointer as AP.  */
  1.2208 + 	mr	r8,r1
  1.2209 +-
  1.2210 ++LCFI0:	
  1.2211 + 	/* Allocate the stack space we need.  */
  1.2212 + 	stwux	r1,r1,r4	
  1.2213 + 	
  1.2214 + 	/* Save registers we use.  */
  1.2215 + 	mflr	r9
  1.2216 + 
  1.2217 +-	stw	r28,-16(r8)
  1.2218 ++	stw	r28,-16(r8)	
  1.2219 + 	stw	r29,-12(r8)
  1.2220 + 	stw	r30, -8(r8)
  1.2221 + 	stw	r31, -4(r8)
  1.2222 +-	
  1.2223 +-	stw	r9,  8(r8)
  1.2224 ++
  1.2225 ++	stw	r9,  8(r8)	
  1.2226 + 	stw	r2, 20(r1)
  1.2227 ++LCFI1:	
  1.2228 + 
  1.2229 + 	/* Save arguments over call...  */
  1.2230 +-	mr	r31,r5	/* flags, */
  1.2231 +-	mr	r30,r6	/* rvalue, */
  1.2232 +-	mr	r29,r7	/* function address, */
  1.2233 +-	mr	r28,r8	/* our AP. */
  1.2234 +-		
  1.2235 ++	mr	r31,r5	/* flags,  */
  1.2236 ++	mr	r30,r6	/* rvalue,  */
  1.2237 ++	mr	r29,r7	/* function address,  */
  1.2238 ++	mr	r28,r8	/* our AP.  */
  1.2239 ++LCFI2:		
  1.2240 + 	/* Call ffi_prep_args.  */
  1.2241 + 	mr	r4,r1
  1.2242 + 	li	r9,0
  1.2243 +@@ -145,7 +147,8 @@
  1.2244 + L(float_return_value):
  1.2245 + 	stfs	f1,0(r30)
  1.2246 + 	b	L(done_return_value)
  1.2247 +-//END(_ffi_call_DARWIN)
  1.2248 ++LFE1:	
  1.2249 ++/* END(_ffi_call_DARWIN)  */
  1.2250 + 
  1.2251 + /* Provide a null definition of _ffi_call_AIX.  */
  1.2252 + .text
  1.2253 +@@ -155,5 +158,61 @@
  1.2254 + 	.align 2
  1.2255 + _ffi_call_AIX:
  1.2256 + 	blr
  1.2257 +-//END(_ffi_call_AIX)
  1.2258 ++/* END(_ffi_call_AIX)  */
  1.2259 + 
  1.2260 ++.data
  1.2261 ++.section __TEXT,__eh_frame
  1.2262 ++Lframe1:
  1.2263 ++	.set	L$set$0,LECIE1-LSCIE1
  1.2264 ++	.long	L$set$0	; Length of Common Information Entry
  1.2265 ++LSCIE1:
  1.2266 ++	.long	0x0	; CIE Identifier Tag
  1.2267 ++	.byte	0x1	; CIE Version
  1.2268 ++	.ascii	"zR\0"	; CIE Augmentation
  1.2269 ++	.byte	0x1	; uleb128 0x1; CIE Code Alignment Factor
  1.2270 ++	.byte	0x7c	; sleb128 -4; CIE Data Alignment Factor
  1.2271 ++	.byte	0x41	; CIE RA Column
  1.2272 ++	.byte   0x1     ; uleb128 0x1; Augmentation size
  1.2273 ++	.byte   0x10    ; FDE Encoding (pcrel)
  1.2274 ++	.byte	0xc	; DW_CFA_def_cfa
  1.2275 ++	.byte	0x1	; uleb128 0x1
  1.2276 ++	.byte	0x0	; uleb128 0x0
  1.2277 ++	.align	2
  1.2278 ++LECIE1:
  1.2279 ++LSFDE1:
  1.2280 ++	.set	L$set$1,LEFDE1-LASFDE1
  1.2281 ++	.long	L$set$1	; FDE Length
  1.2282 ++LASFDE1:
  1.2283 ++	.set	L$set$2,LASFDE1-Lframe1
  1.2284 ++	.long	L$set$2	; FDE CIE offset
  1.2285 ++	.long	LFB0-.	; FDE initial location
  1.2286 ++	.set	L$set$3,LFE1-LFB0
  1.2287 ++	.long	L$set$3	; FDE address range
  1.2288 ++	.byte   0x0     ; uleb128 0x0; Augmentation size
  1.2289 ++	.byte	0x4	; DW_CFA_advance_loc4
  1.2290 ++	.set	L$set$4,LCFI0-LFB1
  1.2291 ++	.long	L$set$4
  1.2292 ++	.byte	0xd	; DW_CFA_def_cfa_register
  1.2293 ++	.byte	0x08	; uleb128 0x08 
  1.2294 ++	.byte	0x4	; DW_CFA_advance_loc4
  1.2295 ++	.set	L$set$5,LCFI1-LCFI0
  1.2296 ++	.long	L$set$5
  1.2297 ++	.byte   0x11    ; DW_CFA_offset_extended_sf
  1.2298 ++	.byte	0x41	; uleb128 0x41
  1.2299 ++	.byte   0x7e    ; sleb128 -2
  1.2300 ++	.byte	0x9f	; DW_CFA_offset, column 0x1f 
  1.2301 ++	.byte	0x1	; uleb128 0x1 
  1.2302 ++	.byte	0x9e	; DW_CFA_offset, column 0x1e
  1.2303 ++	.byte	0x2	; uleb128 0x2
  1.2304 ++	.byte	0x9d	; DW_CFA_offset, column 0x1d 
  1.2305 ++	.byte	0x3	; uleb128 0x3 
  1.2306 ++	.byte	0x9c	; DW_CFA_offset, column 0x1c 
  1.2307 ++	.byte	0x4	; uleb128 0x4
  1.2308 ++	.byte	0x4	; DW_CFA_advance_loc4 
  1.2309 ++	.set	L$set$6,LCFI2-LCFI1
  1.2310 ++	.long	L$set$6
  1.2311 ++	.byte	0xd	; DW_CFA_def_cfa_register 
  1.2312 ++	.byte	0x1c	; uleb128 0x1c 
  1.2313 ++	.align 2
  1.2314 ++LEFDE1:
  1.2315 ++	
  1.2316 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/prep_cif.c gcc/libffi/src/prep_cif.c
  1.2317 +--- gcc-3.2.2.orig/libffi/src/prep_cif.c	Sat Mar  3 07:21:22 2001
  1.2318 ++++ gcc/libffi/src/prep_cif.c	Mon Sep 30 20:59:42 2002
  1.2319 +@@ -103,7 +103,8 @@
  1.2320 +   /* Perform a sanity check on the return type */
  1.2321 +   FFI_ASSERT(ffi_type_test(cif->rtype));
  1.2322 + 
  1.2323 +-#ifndef M68K
  1.2324 ++  /* x86-64 and s390 stack space allocation is handled in prep_machdep.  */
  1.2325 ++#if !defined M68K && !defined __x86_64__ && !defined S390
  1.2326 +   /* Make space for the return structure pointer */
  1.2327 +   if (cif->rtype->type == FFI_TYPE_STRUCT
  1.2328 + #ifdef SPARC
  1.2329 +@@ -122,6 +123,7 @@
  1.2330 +       if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK))
  1.2331 + 	return FFI_BAD_TYPEDEF;
  1.2332 + 
  1.2333 ++#if !defined __x86_64__ && !defined S390
  1.2334 + #ifdef SPARC
  1.2335 +       if (((*ptr)->type == FFI_TYPE_STRUCT
  1.2336 + 	   && ((*ptr)->size > 16 || cif->abi != FFI_V9))
  1.2337 +@@ -137,6 +139,7 @@
  1.2338 + 	  
  1.2339 + 	  bytes += STACK_ARG_SIZE((*ptr)->size);
  1.2340 + 	}
  1.2341 ++#endif
  1.2342 +     }
  1.2343 + 
  1.2344 +   cif->bytes = bytes;
  1.2345 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/ffi.c gcc/libffi/src/s390/ffi.c
  1.2346 +--- gcc-3.2.2.orig/libffi/src/s390/ffi.c	Thu Jan  1 09:00:00 1970
  1.2347 ++++ gcc/libffi/src/s390/ffi.c	Thu Feb  6 08:58:57 2003
  1.2348 +@@ -0,0 +1,753 @@
  1.2349 ++/* -----------------------------------------------------------------------
  1.2350 ++   ffi.c - Copyright (c) 2000 Software AG
  1.2351 ++ 
  1.2352 ++   S390 Foreign Function Interface
  1.2353 ++ 
  1.2354 ++   Permission is hereby granted, free of charge, to any person obtaining
  1.2355 ++   a copy of this software and associated documentation files (the
  1.2356 ++   ``Software''), to deal in the Software without restriction, including
  1.2357 ++   without limitation the rights to use, copy, modify, merge, publish,
  1.2358 ++   distribute, sublicense, and/or sell copies of the Software, and to
  1.2359 ++   permit persons to whom the Software is furnished to do so, subject to
  1.2360 ++   the following conditions:
  1.2361 ++ 
  1.2362 ++   The above copyright notice and this permission notice shall be included
  1.2363 ++   in all copies or substantial portions of the Software.
  1.2364 ++ 
  1.2365 ++   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
  1.2366 ++   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  1.2367 ++   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  1.2368 ++   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
  1.2369 ++   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  1.2370 ++   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  1.2371 ++   OTHER DEALINGS IN THE SOFTWARE.
  1.2372 ++   ----------------------------------------------------------------------- */
  1.2373 ++/*====================================================================*/
  1.2374 ++/*                          Includes                                  */
  1.2375 ++/*                          --------                                  */
  1.2376 ++/*====================================================================*/
  1.2377 ++ 
  1.2378 ++#include <ffi.h>
  1.2379 ++#include <ffi_common.h>
  1.2380 ++ 
  1.2381 ++#include <stdlib.h>
  1.2382 ++#include <stdio.h>
  1.2383 ++ 
  1.2384 ++/*====================== End of Includes =============================*/
  1.2385 ++ 
  1.2386 ++/*====================================================================*/
  1.2387 ++/*                           Defines                                  */
  1.2388 ++/*                           -------                                  */
  1.2389 ++/*====================================================================*/
  1.2390 ++
  1.2391 ++/* Maximum number of GPRs available for argument passing.  */ 
  1.2392 ++#define MAX_GPRARGS 5
  1.2393 ++
  1.2394 ++/* Maximum number of FPRs available for argument passing.  */ 
  1.2395 ++#ifdef __s390x__
  1.2396 ++#define MAX_FPRARGS 4
  1.2397 ++#else
  1.2398 ++#define MAX_FPRARGS 2
  1.2399 ++#endif
  1.2400 ++
  1.2401 ++/* Round to multiple of 16.  */
  1.2402 ++#define ROUND_SIZE(size) (((size) + 15) & ~15)
  1.2403 ++
  1.2404 ++/* If these values change, sysv.S must be adapted!  */
  1.2405 ++#define FFI390_RET_VOID		0
  1.2406 ++#define FFI390_RET_STRUCT	1
  1.2407 ++#define FFI390_RET_FLOAT	2
  1.2408 ++#define FFI390_RET_DOUBLE	3
  1.2409 ++#define FFI390_RET_INT32	4
  1.2410 ++#define FFI390_RET_INT64	5
  1.2411 ++
  1.2412 ++/*===================== End of Defines ===============================*/
  1.2413 ++ 
  1.2414 ++/*====================================================================*/
  1.2415 ++/*                          Prototypes                                */
  1.2416 ++/*                          ----------                                */
  1.2417 ++/*====================================================================*/
  1.2418 ++ 
  1.2419 ++static void ffi_prep_args (unsigned char *, extended_cif *);
  1.2420 ++static int ffi_check_float_struct (ffi_type *);
  1.2421 ++void
  1.2422 ++#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
  1.2423 ++__attribute__ ((visibility ("hidden")))
  1.2424 ++#endif
  1.2425 ++ffi_closure_helper_SYSV (ffi_closure *, unsigned long *, 
  1.2426 ++			 unsigned long long *, unsigned long *);
  1.2427 ++
  1.2428 ++/*====================== End of Prototypes ===========================*/
  1.2429 ++ 
  1.2430 ++/*====================================================================*/
  1.2431 ++/*                          Externals                                 */
  1.2432 ++/*                          ---------                                 */
  1.2433 ++/*====================================================================*/
  1.2434 ++ 
  1.2435 ++extern void ffi_call_SYSV(unsigned,
  1.2436 ++			  extended_cif *,
  1.2437 ++			  void (*)(unsigned char *, extended_cif *),
  1.2438 ++			  unsigned,
  1.2439 ++			  void *,
  1.2440 ++			  void (*fn)());
  1.2441 ++
  1.2442 ++extern void ffi_closure_SYSV(void);
  1.2443 ++ 
  1.2444 ++/*====================== End of Externals ============================*/
  1.2445 ++ 
  1.2446 ++/*====================================================================*/
  1.2447 ++/*                                                                    */
  1.2448 ++/* Name     - ffi_check_struct_type.                                  */
  1.2449 ++/*                                                                    */
  1.2450 ++/* Function - Determine if a structure can be passed within a         */
  1.2451 ++/*            general purpose or floating point register.             */
  1.2452 ++/*                                                                    */
  1.2453 ++/*====================================================================*/
  1.2454 ++ 
  1.2455 ++static int
  1.2456 ++ffi_check_struct_type (ffi_type *arg)
  1.2457 ++{
  1.2458 ++  size_t size = arg->size;
  1.2459 ++
  1.2460 ++  /* If the struct has just one element, look at that element
  1.2461 ++     to find out whether to consider the struct as floating point.  */
  1.2462 ++  while (arg->type == FFI_TYPE_STRUCT 
  1.2463 ++         && arg->elements[0] && !arg->elements[1])
  1.2464 ++    arg = arg->elements[0];
  1.2465 ++
  1.2466 ++  /* Structs of size 1, 2, 4, and 8 are passed in registers,
  1.2467 ++     just like the corresponding int/float types.  */
  1.2468 ++  switch (size)
  1.2469 ++    {
  1.2470 ++      case 1:
  1.2471 ++        return FFI_TYPE_UINT8;
  1.2472 ++
  1.2473 ++      case 2:
  1.2474 ++        return FFI_TYPE_UINT16;
  1.2475 ++
  1.2476 ++      case 4:
  1.2477 ++	if (arg->type == FFI_TYPE_FLOAT)
  1.2478 ++          return FFI_TYPE_FLOAT;
  1.2479 ++	else
  1.2480 ++	  return FFI_TYPE_UINT32;
  1.2481 ++
  1.2482 ++      case 8:
  1.2483 ++	if (arg->type == FFI_TYPE_DOUBLE)
  1.2484 ++          return FFI_TYPE_DOUBLE;
  1.2485 ++	else
  1.2486 ++	  return FFI_TYPE_UINT64;
  1.2487 ++
  1.2488 ++      default:
  1.2489 ++	break;
  1.2490 ++    }
  1.2491 ++
  1.2492 ++  /* Other structs are passed via a pointer to the data.  */
  1.2493 ++  return FFI_TYPE_POINTER;
  1.2494 ++}
  1.2495 ++ 
  1.2496 ++/*======================== End of Routine ============================*/
  1.2497 ++ 
  1.2498 ++/*====================================================================*/
  1.2499 ++/*                                                                    */
  1.2500 ++/* Name     - ffi_prep_args.                                          */
  1.2501 ++/*                                                                    */
  1.2502 ++/* Function - Prepare parameters for call to function.                */
  1.2503 ++/*                                                                    */
  1.2504 ++/* ffi_prep_args is called by the assembly routine once stack space   */
  1.2505 ++/* has been allocated for the function's arguments.                   */
  1.2506 ++/*                                                                    */
  1.2507 ++/*====================================================================*/
  1.2508 ++ 
  1.2509 ++static void
  1.2510 ++ffi_prep_args (unsigned char *stack, extended_cif *ecif)
  1.2511 ++{
  1.2512 ++  /* The stack space will be filled with those areas:
  1.2513 ++
  1.2514 ++	FPR argument register save area     (highest addresses)
  1.2515 ++	GPR argument register save area
  1.2516 ++	temporary struct copies
  1.2517 ++	overflow argument area              (lowest addresses)
  1.2518 ++
  1.2519 ++     We set up the following pointers:
  1.2520 ++
  1.2521 ++        p_fpr: bottom of the FPR area (growing upwards)
  1.2522 ++	p_gpr: bottom of the GPR area (growing upwards)
  1.2523 ++	p_ov: bottom of the overflow area (growing upwards)
  1.2524 ++	p_struct: top of the struct copy area (growing downwards)
  1.2525 ++
  1.2526 ++     All areas are kept aligned to twice the word size.  */
  1.2527 ++
  1.2528 ++  int gpr_off = ecif->cif->bytes;
  1.2529 ++  int fpr_off = gpr_off + ROUND_SIZE (MAX_GPRARGS * sizeof (long));
  1.2530 ++
  1.2531 ++  unsigned long long *p_fpr = (unsigned long long *)(stack + fpr_off);
  1.2532 ++  unsigned long *p_gpr = (unsigned long *)(stack + gpr_off);
  1.2533 ++  unsigned char *p_struct = (unsigned char *)p_gpr;
  1.2534 ++  unsigned long *p_ov = (unsigned long *)stack;
  1.2535 ++
  1.2536 ++  int n_fpr = 0;
  1.2537 ++  int n_gpr = 0;
  1.2538 ++  int n_ov = 0;
  1.2539 ++
  1.2540 ++  ffi_type **ptr;
  1.2541 ++  void **p_argv = ecif->avalue;
  1.2542 ++  int i;
  1.2543 ++ 
  1.2544 ++  /* If we returning a structure then we set the first parameter register
  1.2545 ++     to the address of where we are returning this structure.  */
  1.2546 ++
  1.2547 ++  if (ecif->cif->flags == FFI390_RET_STRUCT)
  1.2548 ++    p_gpr[n_gpr++] = (unsigned long) ecif->rvalue;
  1.2549 ++
  1.2550 ++  /* Now for the arguments.  */
  1.2551 ++ 
  1.2552 ++  for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs;
  1.2553 ++       i > 0;
  1.2554 ++       i--, ptr++, p_argv++)
  1.2555 ++    {
  1.2556 ++      void *arg = *p_argv;
  1.2557 ++      int type = (*ptr)->type;
  1.2558 ++
  1.2559 ++      /* Check how a structure type is passed.  */
  1.2560 ++      if (type == FFI_TYPE_STRUCT)
  1.2561 ++	{
  1.2562 ++	  type = ffi_check_struct_type (*ptr);
  1.2563 ++
  1.2564 ++	  /* If we pass the struct via pointer, copy the data.  */
  1.2565 ++	  if (type == FFI_TYPE_POINTER)
  1.2566 ++	    {
  1.2567 ++	      p_struct -= ROUND_SIZE ((*ptr)->size);
  1.2568 ++	      memcpy (p_struct, (char *)arg, (*ptr)->size);
  1.2569 ++	      arg = &p_struct;
  1.2570 ++	    }
  1.2571 ++	}
  1.2572 ++
  1.2573 ++      /* Pointers are passed like UINTs of the same size.  */
  1.2574 ++      if (type == FFI_TYPE_POINTER)
  1.2575 ++#ifdef __s390x__
  1.2576 ++	type = FFI_TYPE_UINT64;
  1.2577 ++#else
  1.2578 ++	type = FFI_TYPE_UINT32;
  1.2579 ++#endif
  1.2580 ++
  1.2581 ++      /* Now handle all primitive int/float data types.  */
  1.2582 ++      switch (type) 
  1.2583 ++	{
  1.2584 ++	  case FFI_TYPE_DOUBLE:
  1.2585 ++	    if (n_fpr < MAX_FPRARGS)
  1.2586 ++	      p_fpr[n_fpr++] = *(unsigned long long *) arg;
  1.2587 ++	    else
  1.2588 ++#ifdef __s390x__
  1.2589 ++	      p_ov[n_ov++] = *(unsigned long *) arg;
  1.2590 ++#else
  1.2591 ++	      p_ov[n_ov++] = ((unsigned long *) arg)[0],
  1.2592 ++	      p_ov[n_ov++] = ((unsigned long *) arg)[1];
  1.2593 ++#endif
  1.2594 ++	    break;
  1.2595 ++	
  1.2596 ++	  case FFI_TYPE_FLOAT:
  1.2597 ++	    if (n_fpr < MAX_FPRARGS)
  1.2598 ++	      p_fpr[n_fpr++] = (long long) *(unsigned int *) arg << 32;
  1.2599 ++	    else
  1.2600 ++	      p_ov[n_ov++] = *(unsigned int *) arg;
  1.2601 ++	    break;
  1.2602 ++ 
  1.2603 ++	  case FFI_TYPE_UINT64:
  1.2604 ++	  case FFI_TYPE_SINT64:
  1.2605 ++#ifdef __s390x__
  1.2606 ++	    if (n_gpr < MAX_GPRARGS)
  1.2607 ++	      p_gpr[n_gpr++] = *(unsigned long *) arg;
  1.2608 ++	    else
  1.2609 ++	      p_ov[n_ov++] = *(unsigned long *) arg;
  1.2610 ++#else
  1.2611 ++	    if (n_gpr == MAX_GPRARGS-1)
  1.2612 ++	      n_gpr = MAX_GPRARGS;
  1.2613 ++	    if (n_gpr < MAX_GPRARGS)
  1.2614 ++	      p_gpr[n_gpr++] = ((unsigned long *) arg)[0],
  1.2615 ++	      p_gpr[n_gpr++] = ((unsigned long *) arg)[1];
  1.2616 ++	    else
  1.2617 ++	      p_ov[n_ov++] = ((unsigned long *) arg)[0],
  1.2618 ++	      p_ov[n_ov++] = ((unsigned long *) arg)[1];
  1.2619 ++#endif
  1.2620 ++	    break;
  1.2621 ++ 
  1.2622 ++	  case FFI_TYPE_UINT32:
  1.2623 ++	    if (n_gpr < MAX_GPRARGS)
  1.2624 ++	      p_gpr[n_gpr++] = *(unsigned int *) arg;
  1.2625 ++	    else
  1.2626 ++	      p_ov[n_ov++] = *(unsigned int *) arg;
  1.2627 ++	    break;
  1.2628 ++ 
  1.2629 ++	  case FFI_TYPE_INT:
  1.2630 ++	  case FFI_TYPE_SINT32:
  1.2631 ++	    if (n_gpr < MAX_GPRARGS)
  1.2632 ++	      p_gpr[n_gpr++] = *(signed int *) arg;
  1.2633 ++	    else
  1.2634 ++	      p_ov[n_ov++] = *(signed int *) arg;
  1.2635 ++	    break;
  1.2636 ++ 
  1.2637 ++	  case FFI_TYPE_UINT16:
  1.2638 ++	    if (n_gpr < MAX_GPRARGS)
  1.2639 ++	      p_gpr[n_gpr++] = *(unsigned short *) arg;
  1.2640 ++	    else
  1.2641 ++	      p_ov[n_ov++] = *(unsigned short *) arg;
  1.2642 ++	    break;
  1.2643 ++ 
  1.2644 ++	  case FFI_TYPE_SINT16:
  1.2645 ++	    if (n_gpr < MAX_GPRARGS)
  1.2646 ++	      p_gpr[n_gpr++] = *(signed short *) arg;
  1.2647 ++	    else
  1.2648 ++	      p_ov[n_ov++] = *(signed short *) arg;
  1.2649 ++	    break;
  1.2650 ++
  1.2651 ++	  case FFI_TYPE_UINT8:
  1.2652 ++	    if (n_gpr < MAX_GPRARGS)
  1.2653 ++	      p_gpr[n_gpr++] = *(unsigned char *) arg;
  1.2654 ++	    else
  1.2655 ++	      p_ov[n_ov++] = *(unsigned char *) arg;
  1.2656 ++	    break;
  1.2657 ++ 
  1.2658 ++	  case FFI_TYPE_SINT8:
  1.2659 ++	    if (n_gpr < MAX_GPRARGS)
  1.2660 ++	      p_gpr[n_gpr++] = *(signed char *) arg;
  1.2661 ++	    else
  1.2662 ++	      p_ov[n_ov++] = *(signed char *) arg;
  1.2663 ++	    break;
  1.2664 ++ 
  1.2665 ++	  default:
  1.2666 ++	    FFI_ASSERT (0);
  1.2667 ++	    break;
  1.2668 ++        }
  1.2669 ++    }
  1.2670 ++}
  1.2671 ++
  1.2672 ++/*======================== End of Routine ============================*/
  1.2673 ++ 
  1.2674 ++/*====================================================================*/
  1.2675 ++/*                                                                    */
  1.2676 ++/* Name     - ffi_prep_cif_machdep.                                   */
  1.2677 ++/*                                                                    */
  1.2678 ++/* Function - Perform machine dependent CIF processing.               */
  1.2679 ++/*                                                                    */
  1.2680 ++/*====================================================================*/
  1.2681 ++ 
  1.2682 ++ffi_status
  1.2683 ++ffi_prep_cif_machdep(ffi_cif *cif)
  1.2684 ++{
  1.2685 ++  size_t struct_size = 0;
  1.2686 ++  int n_gpr = 0;
  1.2687 ++  int n_fpr = 0;
  1.2688 ++  int n_ov = 0;
  1.2689 ++
  1.2690 ++  ffi_type **ptr;
  1.2691 ++  int i;
  1.2692 ++
  1.2693 ++  /* Determine return value handling.  */ 
  1.2694 ++
  1.2695 ++  switch (cif->rtype->type)
  1.2696 ++    {
  1.2697 ++      /* Void is easy.  */
  1.2698 ++      case FFI_TYPE_VOID:
  1.2699 ++	cif->flags = FFI390_RET_VOID;
  1.2700 ++	break;
  1.2701 ++
  1.2702 ++      /* Structures are returned via a hidden pointer.  */
  1.2703 ++      case FFI_TYPE_STRUCT:
  1.2704 ++	cif->flags = FFI390_RET_STRUCT;
  1.2705 ++	n_gpr++;  /* We need one GPR to pass the pointer.  */
  1.2706 ++	break; 
  1.2707 ++
  1.2708 ++      /* Floating point values are returned in fpr 0.  */
  1.2709 ++      case FFI_TYPE_FLOAT:
  1.2710 ++	cif->flags = FFI390_RET_FLOAT;
  1.2711 ++	break;
  1.2712 ++
  1.2713 ++      case FFI_TYPE_DOUBLE:
  1.2714 ++	cif->flags = FFI390_RET_DOUBLE;
  1.2715 ++	break;
  1.2716 ++
  1.2717 ++      /* Integer values are returned in gpr 2 (and gpr 3
  1.2718 ++	 for 64-bit values on 31-bit machines).  */
  1.2719 ++      case FFI_TYPE_UINT64:
  1.2720 ++      case FFI_TYPE_SINT64:
  1.2721 ++	cif->flags = FFI390_RET_INT64;
  1.2722 ++	break;
  1.2723 ++
  1.2724 ++      case FFI_TYPE_POINTER:
  1.2725 ++      case FFI_TYPE_INT:
  1.2726 ++      case FFI_TYPE_UINT32:
  1.2727 ++      case FFI_TYPE_SINT32:
  1.2728 ++      case FFI_TYPE_UINT16:
  1.2729 ++      case FFI_TYPE_SINT16:
  1.2730 ++      case FFI_TYPE_UINT8:
  1.2731 ++      case FFI_TYPE_SINT8:
  1.2732 ++	/* These are to be extended to word size.  */
  1.2733 ++#ifdef __s390x__
  1.2734 ++	cif->flags = FFI390_RET_INT64;
  1.2735 ++#else
  1.2736 ++	cif->flags = FFI390_RET_INT32;
  1.2737 ++#endif
  1.2738 ++	break;
  1.2739 ++ 
  1.2740 ++      default:
  1.2741 ++        FFI_ASSERT (0);
  1.2742 ++        break;
  1.2743 ++    }
  1.2744 ++
  1.2745 ++  /* Now for the arguments.  */
  1.2746 ++ 
  1.2747 ++  for (ptr = cif->arg_types, i = cif->nargs;
  1.2748 ++       i > 0;
  1.2749 ++       i--, ptr++)
  1.2750 ++    {
  1.2751 ++      int type = (*ptr)->type;
  1.2752 ++
  1.2753 ++      /* Check how a structure type is passed.  */
  1.2754 ++      if (type == FFI_TYPE_STRUCT)
  1.2755 ++	{
  1.2756 ++	  type = ffi_check_struct_type (*ptr);
  1.2757 ++
  1.2758 ++	  /* If we pass the struct via pointer, we must reserve space
  1.2759 ++	     to copy its data for proper call-by-value semantics.  */
  1.2760 ++	  if (type == FFI_TYPE_POINTER)
  1.2761 ++	    struct_size += ROUND_SIZE ((*ptr)->size);
  1.2762 ++	}
  1.2763 ++
  1.2764 ++      /* Now handle all primitive int/float data types.  */
  1.2765 ++      switch (type) 
  1.2766 ++	{
  1.2767 ++	  /* The first MAX_FPRARGS floating point arguments
  1.2768 ++	     go in FPRs, the rest overflow to the stack.  */
  1.2769 ++
  1.2770 ++	  case FFI_TYPE_DOUBLE:
  1.2771 ++	    if (n_fpr < MAX_FPRARGS)
  1.2772 ++	      n_fpr++;
  1.2773 ++	    else
  1.2774 ++	      n_ov += sizeof (double) / sizeof (long);
  1.2775 ++	    break;
  1.2776 ++	
  1.2777 ++	  case FFI_TYPE_FLOAT:
  1.2778 ++	    if (n_fpr < MAX_FPRARGS)
  1.2779 ++	      n_fpr++;
  1.2780 ++	    else
  1.2781 ++	      n_ov++;
  1.2782 ++	    break;
  1.2783 ++
  1.2784 ++	  /* On 31-bit machines, 64-bit integers are passed in GPR pairs,
  1.2785 ++	     if one is still available, or else on the stack.  If only one
  1.2786 ++	     register is free, skip the register (it won't be used for any 
  1.2787 ++	     subsequent argument either).  */
  1.2788 ++	      
  1.2789 ++#ifndef __s390x__
  1.2790 ++	  case FFI_TYPE_UINT64:
  1.2791 ++	  case FFI_TYPE_SINT64:
  1.2792 ++	    if (n_gpr == MAX_GPRARGS-1)
  1.2793 ++	      n_gpr = MAX_GPRARGS;
  1.2794 ++	    if (n_gpr < MAX_GPRARGS)
  1.2795 ++	      n_gpr += 2;
  1.2796 ++	    else
  1.2797 ++	      n_ov += 2;
  1.2798 ++	    break;
  1.2799 ++#endif
  1.2800 ++
  1.2801 ++	  /* Everything else is passed in GPRs (until MAX_GPRARGS
  1.2802 ++	     have been used) or overflows to the stack.  */
  1.2803 ++
  1.2804 ++	  default: 
  1.2805 ++	    if (n_gpr < MAX_GPRARGS)
  1.2806 ++	      n_gpr++;
  1.2807 ++	    else
  1.2808 ++	      n_ov++;
  1.2809 ++	    break;
  1.2810 ++        }
  1.2811 ++    }
  1.2812 ++
  1.2813 ++  /* Total stack space as required for overflow arguments
  1.2814 ++     and temporary structure copies.  */
  1.2815 ++
  1.2816 ++  cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size;
  1.2817 ++ 
  1.2818 ++  return FFI_OK;
  1.2819 ++}
  1.2820 ++ 
  1.2821 ++/*======================== End of Routine ============================*/
  1.2822 ++ 
  1.2823 ++/*====================================================================*/
  1.2824 ++/*                                                                    */
  1.2825 ++/* Name     - ffi_call.                                               */
  1.2826 ++/*                                                                    */
  1.2827 ++/* Function - Call the FFI routine.                                   */
  1.2828 ++/*                                                                    */
  1.2829 ++/*====================================================================*/
  1.2830 ++ 
  1.2831 ++void
  1.2832 ++ffi_call(ffi_cif *cif,
  1.2833 ++	 void (*fn)(),
  1.2834 ++	 void *rvalue,
  1.2835 ++	 void **avalue)
  1.2836 ++{
  1.2837 ++  int ret_type = cif->flags;
  1.2838 ++  extended_cif ecif;
  1.2839 ++ 
  1.2840 ++  ecif.cif    = cif;
  1.2841 ++  ecif.avalue = avalue;
  1.2842 ++  ecif.rvalue = rvalue;
  1.2843 ++
  1.2844 ++  /* If we don't have a return value, we need to fake one.  */
  1.2845 ++  if (rvalue == NULL)
  1.2846 ++    {
  1.2847 ++      if (ret_type == FFI390_RET_STRUCT)
  1.2848 ++	ecif.rvalue = alloca (cif->rtype->size);
  1.2849 ++      else
  1.2850 ++	ret_type = FFI390_RET_VOID;
  1.2851 ++    } 
  1.2852 ++
  1.2853 ++  switch (cif->abi)
  1.2854 ++    {
  1.2855 ++      case FFI_SYSV:
  1.2856 ++        ffi_call_SYSV (cif->bytes, &ecif, ffi_prep_args,
  1.2857 ++		       ret_type, ecif.rvalue, fn);
  1.2858 ++        break;
  1.2859 ++ 
  1.2860 ++      default:
  1.2861 ++        FFI_ASSERT (0);
  1.2862 ++        break;
  1.2863 ++    }
  1.2864 ++}
  1.2865 ++ 
  1.2866 ++/*======================== End of Routine ============================*/
  1.2867 ++
  1.2868 ++/*====================================================================*/
  1.2869 ++/*                                                                    */
  1.2870 ++/* Name     - ffi_closure_helper_SYSV.                                */
  1.2871 ++/*                                                                    */
  1.2872 ++/* Function - Call a FFI closure target function.                     */
  1.2873 ++/*                                                                    */
  1.2874 ++/*====================================================================*/
  1.2875 ++ 
  1.2876 ++void
  1.2877 ++ffi_closure_helper_SYSV (ffi_closure *closure,
  1.2878 ++			 unsigned long *p_gpr,
  1.2879 ++			 unsigned long long *p_fpr,
  1.2880 ++			 unsigned long *p_ov)
  1.2881 ++{
  1.2882 ++  unsigned long long ret_buffer;
  1.2883 ++
  1.2884 ++  void *rvalue = &ret_buffer;
  1.2885 ++  void **avalue;
  1.2886 ++  void **p_arg;
  1.2887 ++
  1.2888 ++  int n_gpr = 0;
  1.2889 ++  int n_fpr = 0;
  1.2890 ++  int n_ov = 0;
  1.2891 ++
  1.2892 ++  ffi_type **ptr;
  1.2893 ++  int i;
  1.2894 ++
  1.2895 ++  /* Allocate buffer for argument list pointers.  */
  1.2896 ++
  1.2897 ++  p_arg = avalue = alloca (closure->cif->nargs * sizeof (void *));
  1.2898 ++
  1.2899 ++  /* If we returning a structure, pass the structure address 
  1.2900 ++     directly to the target function.  Otherwise, have the target 
  1.2901 ++     function store the return value to the GPR save area.  */
  1.2902 ++
  1.2903 ++  if (closure->cif->flags == FFI390_RET_STRUCT)
  1.2904 ++    rvalue = (void *) p_gpr[n_gpr++];
  1.2905 ++
  1.2906 ++  /* Now for the arguments.  */
  1.2907 ++
  1.2908 ++  for (ptr = closure->cif->arg_types, i = closure->cif->nargs;
  1.2909 ++       i > 0;
  1.2910 ++       i--, p_arg++, ptr++)
  1.2911 ++    {
  1.2912 ++      int deref_struct_pointer = 0;
  1.2913 ++      int type = (*ptr)->type;
  1.2914 ++
  1.2915 ++      /* Check how a structure type is passed.  */
  1.2916 ++      if (type == FFI_TYPE_STRUCT)
  1.2917 ++	{
  1.2918 ++	  type = ffi_check_struct_type (*ptr);
  1.2919 ++
  1.2920 ++	  /* If we pass the struct via pointer, remember to 
  1.2921 ++	     retrieve the pointer later.  */
  1.2922 ++	  if (type == FFI_TYPE_POINTER)
  1.2923 ++	    deref_struct_pointer = 1;
  1.2924 ++	}
  1.2925 ++
  1.2926 ++      /* Pointers are passed like UINTs of the same size.  */
  1.2927 ++      if (type == FFI_TYPE_POINTER)
  1.2928 ++#ifdef __s390x__
  1.2929 ++	type = FFI_TYPE_UINT64;
  1.2930 ++#else
  1.2931 ++	type = FFI_TYPE_UINT32;
  1.2932 ++#endif
  1.2933 ++
  1.2934 ++      /* Now handle all primitive int/float data types.  */
  1.2935 ++      switch (type) 
  1.2936 ++	{
  1.2937 ++	  case FFI_TYPE_DOUBLE:
  1.2938 ++	    if (n_fpr < MAX_FPRARGS)
  1.2939 ++	      *p_arg = &p_fpr[n_fpr++];
  1.2940 ++	    else
  1.2941 ++	      *p_arg = &p_ov[n_ov], 
  1.2942 ++	      n_ov += sizeof (double) / sizeof (long);
  1.2943 ++	    break;
  1.2944 ++	
  1.2945 ++	  case FFI_TYPE_FLOAT:
  1.2946 ++	    if (n_fpr < MAX_FPRARGS)
  1.2947 ++	      *p_arg = &p_fpr[n_fpr++];
  1.2948 ++	    else
  1.2949 ++	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
  1.2950 ++	    break;
  1.2951 ++ 
  1.2952 ++	  case FFI_TYPE_UINT64:
  1.2953 ++	  case FFI_TYPE_SINT64:
  1.2954 ++#ifdef __s390x__
  1.2955 ++	    if (n_gpr < MAX_GPRARGS)
  1.2956 ++	      *p_arg = &p_gpr[n_gpr++];
  1.2957 ++	    else
  1.2958 ++	      *p_arg = &p_ov[n_ov++];
  1.2959 ++#else
  1.2960 ++	    if (n_gpr == MAX_GPRARGS-1)
  1.2961 ++	      n_gpr = MAX_GPRARGS;
  1.2962 ++	    if (n_gpr < MAX_GPRARGS)
  1.2963 ++	      *p_arg = &p_gpr[n_gpr], n_gpr += 2;
  1.2964 ++	    else
  1.2965 ++	      *p_arg = &p_ov[n_ov], n_ov += 2;
  1.2966 ++#endif
  1.2967 ++	    break;
  1.2968 ++ 
  1.2969 ++	  case FFI_TYPE_INT:
  1.2970 ++	  case FFI_TYPE_UINT32:
  1.2971 ++	  case FFI_TYPE_SINT32:
  1.2972 ++	    if (n_gpr < MAX_GPRARGS)
  1.2973 ++	      *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4;
  1.2974 ++	    else
  1.2975 ++	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
  1.2976 ++	    break;
  1.2977 ++ 
  1.2978 ++	  case FFI_TYPE_UINT16:
  1.2979 ++	  case FFI_TYPE_SINT16:
  1.2980 ++	    if (n_gpr < MAX_GPRARGS)
  1.2981 ++	      *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2;
  1.2982 ++	    else
  1.2983 ++	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2;
  1.2984 ++	    break;
  1.2985 ++
  1.2986 ++	  case FFI_TYPE_UINT8:
  1.2987 ++	  case FFI_TYPE_SINT8:
  1.2988 ++	    if (n_gpr < MAX_GPRARGS)
  1.2989 ++	      *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1;
  1.2990 ++	    else
  1.2991 ++	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1;
  1.2992 ++	    break;
  1.2993 ++ 
  1.2994 ++	  default:
  1.2995 ++	    FFI_ASSERT (0);
  1.2996 ++	    break;
  1.2997 ++        }
  1.2998 ++
  1.2999 ++      /* If this is a struct passed via pointer, we need to
  1.3000 ++	 actually retrieve that pointer.  */
  1.3001 ++      if (deref_struct_pointer)
  1.3002 ++	*p_arg = *(void **)*p_arg;
  1.3003 ++    }
  1.3004 ++
  1.3005 ++
  1.3006 ++  /* Call the target function.  */
  1.3007 ++  (closure->fun) (closure->cif, rvalue, avalue, closure->user_data);
  1.3008 ++
  1.3009 ++  /* Convert the return value.  */
  1.3010 ++  switch (closure->cif->rtype->type)
  1.3011 ++    {
  1.3012 ++      /* Void is easy, and so is struct.  */
  1.3013 ++      case FFI_TYPE_VOID:
  1.3014 ++      case FFI_TYPE_STRUCT:
  1.3015 ++	break;
  1.3016 ++
  1.3017 ++      /* Floating point values are returned in fpr 0.  */
  1.3018 ++      case FFI_TYPE_FLOAT:
  1.3019 ++	p_fpr[0] = (long long) *(unsigned int *) rvalue << 32;
  1.3020 ++	break;
  1.3021 ++
  1.3022 ++      case FFI_TYPE_DOUBLE:
  1.3023 ++	p_fpr[0] = *(unsigned long long *) rvalue;
  1.3024 ++	break;
  1.3025 ++
  1.3026 ++      /* Integer values are returned in gpr 2 (and gpr 3
  1.3027 ++	 for 64-bit values on 31-bit machines).  */
  1.3028 ++      case FFI_TYPE_UINT64:
  1.3029 ++      case FFI_TYPE_SINT64:
  1.3030 ++#ifdef __s390x__
  1.3031 ++	p_gpr[0] = *(unsigned long *) rvalue;
  1.3032 ++#else
  1.3033 ++	p_gpr[0] = ((unsigned long *) rvalue)[0],
  1.3034 ++	p_gpr[1] = ((unsigned long *) rvalue)[1];
  1.3035 ++#endif
  1.3036 ++	break;
  1.3037 ++
  1.3038 ++      case FFI_TYPE_POINTER:
  1.3039 ++      case FFI_TYPE_UINT32:
  1.3040 ++      case FFI_TYPE_UINT16:
  1.3041 ++      case FFI_TYPE_UINT8:
  1.3042 ++	p_gpr[0] = *(unsigned long *) rvalue;
  1.3043 ++	break;
  1.3044 ++
  1.3045 ++      case FFI_TYPE_INT:
  1.3046 ++      case FFI_TYPE_SINT32:
  1.3047 ++      case FFI_TYPE_SINT16:
  1.3048 ++      case FFI_TYPE_SINT8:
  1.3049 ++	p_gpr[0] = *(signed long *) rvalue;
  1.3050 ++	break;
  1.3051 ++
  1.3052 ++      default:
  1.3053 ++        FFI_ASSERT (0);
  1.3054 ++        break;
  1.3055 ++    }
  1.3056 ++}
  1.3057 ++ 
  1.3058 ++/*======================== End of Routine ============================*/
  1.3059 ++
  1.3060 ++/*====================================================================*/
  1.3061 ++/*                                                                    */
  1.3062 ++/* Name     - ffi_prep_closure.                                       */
  1.3063 ++/*                                                                    */
  1.3064 ++/* Function - Prepare a FFI closure.                                  */
  1.3065 ++/*                                                                    */
  1.3066 ++/*====================================================================*/
  1.3067 ++ 
  1.3068 ++ffi_status
  1.3069 ++ffi_prep_closure (ffi_closure *closure,
  1.3070 ++                  ffi_cif *cif,
  1.3071 ++                  void (*fun) (ffi_cif *, void *, void **, void *),
  1.3072 ++                  void *user_data)
  1.3073 ++{
  1.3074 ++  FFI_ASSERT (cif->abi == FFI_SYSV);
  1.3075 ++
  1.3076 ++#ifndef __s390x__
  1.3077 ++  *(short *)&closure->tramp [0] = 0x0d10;   /* basr %r1,0 */
  1.3078 ++  *(short *)&closure->tramp [2] = 0x9801;   /* lm %r0,%r1,6(%r1) */
  1.3079 ++  *(short *)&closure->tramp [4] = 0x1006;
  1.3080 ++  *(short *)&closure->tramp [6] = 0x07f1;   /* br %r1 */
  1.3081 ++  *(long  *)&closure->tramp [8] = (long)closure;
  1.3082 ++  *(long  *)&closure->tramp[12] = (long)&ffi_closure_SYSV;
  1.3083 ++#else
  1.3084 ++  *(short *)&closure->tramp [0] = 0x0d10;   /* basr %r1,0 */
  1.3085 ++  *(short *)&closure->tramp [2] = 0xeb01;   /* lmg %r0,%r1,14(%r1) */
  1.3086 ++  *(short *)&closure->tramp [4] = 0x100e;
  1.3087 ++  *(short *)&closure->tramp [6] = 0x0004;
  1.3088 ++  *(short *)&closure->tramp [8] = 0x07f1;   /* br %r1 */
  1.3089 ++  *(long  *)&closure->tramp[16] = (long)closure;
  1.3090 ++  *(long  *)&closure->tramp[24] = (long)&ffi_closure_SYSV;
  1.3091 ++#endif 
  1.3092 ++ 
  1.3093 ++  closure->cif = cif;
  1.3094 ++  closure->user_data = user_data;
  1.3095 ++  closure->fun = fun;
  1.3096 ++ 
  1.3097 ++  return FFI_OK;
  1.3098 ++}
  1.3099 ++
  1.3100 ++/*======================== End of Routine ============================*/
  1.3101 ++ 
  1.3102 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/sysv.S gcc/libffi/src/s390/sysv.S
  1.3103 +--- gcc-3.2.2.orig/libffi/src/s390/sysv.S	Thu Jan  1 09:00:00 1970
  1.3104 ++++ gcc/libffi/src/s390/sysv.S	Thu Nov 28 01:44:35 2002
  1.3105 +@@ -0,0 +1,425 @@
  1.3106 ++/* -----------------------------------------------------------------------
  1.3107 ++   sysv.S - Copyright (c) 2000 Software AG
  1.3108 ++ 
  1.3109 ++   S390 Foreign Function Interface
  1.3110 ++ 
  1.3111 ++   Permission is hereby granted, free of charge, to any person obtaining
  1.3112 ++   a copy of this software and associated documentation files (the
  1.3113 ++   ``Software''), to deal in the Software without restriction, including
  1.3114 ++   without limitation the rights to use, copy, modify, merge, publish,
  1.3115 ++   distribute, sublicense, and/or sell copies of the Software, and to
  1.3116 ++   permit persons to whom the Software is furnished to do so, subject to
  1.3117 ++   the following conditions:
  1.3118 ++ 
  1.3119 ++   The above copyright notice and this permission notice shall be included
  1.3120 ++   in all copies or substantial portions of the Software.
  1.3121 ++ 
  1.3122 ++   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
  1.3123 ++   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  1.3124 ++   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  1.3125 ++   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  1.3126 ++   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  1.3127 ++   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  1.3128 ++   OTHER DEALINGS IN THE SOFTWARE.
  1.3129 ++   ----------------------------------------------------------------------- */
  1.3130 ++
  1.3131 ++#ifndef __s390x__
  1.3132 ++ 
  1.3133 ++.text
  1.3134 ++
  1.3135 ++	# r2:	cif->bytes
  1.3136 ++	# r3:	&ecif
  1.3137 ++	# r4:	ffi_prep_args
  1.3138 ++	# r5:	ret_type
  1.3139 ++	# r6:	ecif.rvalue
  1.3140 ++	# ov:	fn 
  1.3141 ++ 
  1.3142 ++	# This assumes we are using gas.
  1.3143 ++	.globl	ffi_call_SYSV
  1.3144 ++	.type	ffi_call_SYSV,%function
  1.3145 ++ffi_call_SYSV:
  1.3146 ++.LFB1:
  1.3147 ++	stm	%r6,%r15,24(%r15)		# Save registers
  1.3148 ++.LCFI0:
  1.3149 ++	basr	%r13,0				# Set up base register
  1.3150 ++.Lbase:
  1.3151 ++	lr	%r11,%r15			# Set up frame pointer
  1.3152 ++.LCFI1:
  1.3153 ++	sr	%r15,%r2
  1.3154 ++	ahi	%r15,-96-48			# Allocate stack
  1.3155 ++	lr	%r8,%r6				# Save ecif.rvalue
  1.3156 ++	sr	%r9,%r9
  1.3157 ++	ic	%r9,.Ltable-.Lbase(%r13,%r5)	# Load epilog address
  1.3158 ++	l	%r7,96(%r11)			# Load function address
  1.3159 ++	st	%r11,0(%r15)			# Set up back chain
  1.3160 ++	ahi	%r11,-48			# Register save area
  1.3161 ++.LCFI2:
  1.3162 ++
  1.3163 ++	la	%r2,96(%r15)			# Save area
  1.3164 ++						# r3 already holds &ecif
  1.3165 ++	basr	%r14,%r4			# Call ffi_prep_args
  1.3166 ++
  1.3167 ++	lm	%r2,%r6,0(%r11)			# Load arguments
  1.3168 ++	ld	%f0,32(%r11)
  1.3169 ++	ld	%f2,40(%r11)
  1.3170 ++	la	%r14,0(%r13,%r9)		# Set return address
  1.3171 ++	br	%r7				# ... and call function
  1.3172 ++
  1.3173 ++.LretNone:					# Return void
  1.3174 ++	l	%r4,48+56(%r11)
  1.3175 ++	lm	%r6,%r15,48+24(%r11)
  1.3176 ++	br	%r4
  1.3177 ++
  1.3178 ++.LretFloat:
  1.3179 ++	l	%r4,48+56(%r11)
  1.3180 ++	ste	%f0,0(%r8)			# Return float
  1.3181 ++	lm	%r6,%r15,48+24(%r11)
  1.3182 ++	br	%r4
  1.3183 ++ 
  1.3184 ++.LretDouble:
  1.3185 ++	l	%r4,48+56(%r11)
  1.3186 ++	std	%f0,0(%r8)			# Return double
  1.3187 ++	lm	%r6,%r15,48+24(%r11)
  1.3188 ++	br	%r4
  1.3189 ++
  1.3190 ++.LretInt32:
  1.3191 ++	l	%r4,48+56(%r11)
  1.3192 ++	st	%r2,0(%r8)			# Return int
  1.3193 ++	lm	%r6,%r15,48+24(%r11)
  1.3194 ++	br	%r4
  1.3195 ++ 
  1.3196 ++.LretInt64:
  1.3197 ++	l	%r4,48+56(%r11)
  1.3198 ++	stm	%r2,%r3,0(%r8)			# Return long long
  1.3199 ++	lm	%r6,%r15,48+24(%r11)
  1.3200 ++	br	%r4
  1.3201 ++ 
  1.3202 ++.Ltable:
  1.3203 ++	.byte	.LretNone-.Lbase		# FFI390_RET_VOID
  1.3204 ++	.byte	.LretNone-.Lbase		# FFI390_RET_STRUCT
  1.3205 ++	.byte	.LretFloat-.Lbase		# FFI390_RET_FLOAT
  1.3206 ++	.byte	.LretDouble-.Lbase		# FFI390_RET_DOUBLE
  1.3207 ++	.byte	.LretInt32-.Lbase		# FFI390_RET_INT32
  1.3208 ++	.byte	.LretInt64-.Lbase		# FFI390_RET_INT64
  1.3209 ++
  1.3210 ++.LFE1: 
  1.3211 ++.ffi_call_SYSV_end:
  1.3212 ++	.size	 ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
  1.3213 ++
  1.3214 ++
  1.3215 ++	.globl	ffi_closure_SYSV
  1.3216 ++	.type	ffi_closure_SYSV,%function
  1.3217 ++ffi_closure_SYSV:
  1.3218 ++.LFB2:
  1.3219 ++	stm	%r12,%r15,48(%r15)		# Save registers
  1.3220 ++.LCFI10:
  1.3221 ++	basr	%r13,0				# Set up base register
  1.3222 ++.Lcbase:
  1.3223 ++	stm	%r2,%r6,8(%r15)			# Save arguments
  1.3224 ++	std	%f0,64(%r15)
  1.3225 ++	std	%f2,72(%r15)
  1.3226 ++	lr	%r1,%r15			# Set up stack frame
  1.3227 ++	ahi	%r15,-96
  1.3228 ++.LCFI11:
  1.3229 ++	l	%r12,.Lchelper-.Lcbase(%r13)	# Get helper function
  1.3230 ++	lr	%r2,%r0				# Closure
  1.3231 ++	la	%r3,8(%r1)			# GPRs
  1.3232 ++	la	%r4,64(%r1)			# FPRs
  1.3233 ++	la	%r5,96(%r1)			# Overflow
  1.3234 ++	st	%r1,0(%r15)			# Set up back chain
  1.3235 ++
  1.3236 ++	bas	%r14,0(%r12,%r13)		# Call helper
  1.3237 ++
  1.3238 ++	l	%r4,96+56(%r15)
  1.3239 ++	ld	%f0,96+64(%r15)			# Load return registers
  1.3240 ++	lm	%r2,%r3,96+8(%r15)
  1.3241 ++	lm	%r12,%r15,96+48(%r15)
  1.3242 ++	br	%r4
  1.3243 ++
  1.3244 ++	.align 4
  1.3245 ++.Lchelper:
  1.3246 ++	.long	ffi_closure_helper_SYSV-.Lcbase
  1.3247 ++
  1.3248 ++.LFE2: 
  1.3249 ++
  1.3250 ++.ffi_closure_SYSV_end:
  1.3251 ++	.size	 ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
  1.3252 ++
  1.3253 ++
  1.3254 ++	.section	.eh_frame,"a",@progbits
  1.3255 ++.Lframe1:
  1.3256 ++	.4byte	.LECIE1-.LSCIE1	# Length of Common Information Entry
  1.3257 ++.LSCIE1:
  1.3258 ++	.4byte	0x0	# CIE Identifier Tag
  1.3259 ++	.byte	0x1	# CIE Version
  1.3260 ++	.ascii "zR\0"	# CIE Augmentation
  1.3261 ++	.uleb128 0x1	# CIE Code Alignment Factor
  1.3262 ++	.sleb128 -4	# CIE Data Alignment Factor
  1.3263 ++	.byte	0xe	# CIE RA Column
  1.3264 ++	.uleb128 0x1	# Augmentation size
  1.3265 ++	.byte	0x1b	# FDE Encoding (pcrel sdata4)
  1.3266 ++	.byte	0xc	# DW_CFA_def_cfa
  1.3267 ++	.uleb128 0xf
  1.3268 ++	.uleb128 0x60
  1.3269 ++	.align	4
  1.3270 ++.LECIE1:
  1.3271 ++.LSFDE1:
  1.3272 ++	.4byte	.LEFDE1-.LASFDE1	# FDE Length
  1.3273 ++.LASFDE1:
  1.3274 ++	.4byte	.LASFDE1-.Lframe1	# FDE CIE offset
  1.3275 ++	.4byte	.LFB1-.	# FDE initial location
  1.3276 ++	.4byte	.LFE1-.LFB1	# FDE address range
  1.3277 ++	.uleb128 0x0	# Augmentation size
  1.3278 ++	.byte	0x4	# DW_CFA_advance_loc4
  1.3279 ++	.4byte	.LCFI0-.LFB1
  1.3280 ++	.byte	0x8f	# DW_CFA_offset, column 0xf
  1.3281 ++	.uleb128 0x9
  1.3282 ++	.byte	0x8e	# DW_CFA_offset, column 0xe
  1.3283 ++	.uleb128 0xa
  1.3284 ++	.byte	0x8d	# DW_CFA_offset, column 0xd
  1.3285 ++	.uleb128 0xb
  1.3286 ++	.byte	0x8c	# DW_CFA_offset, column 0xc
  1.3287 ++	.uleb128 0xc
  1.3288 ++	.byte	0x8b	# DW_CFA_offset, column 0xb
  1.3289 ++	.uleb128 0xd
  1.3290 ++	.byte	0x8a	# DW_CFA_offset, column 0xa
  1.3291 ++	.uleb128 0xe
  1.3292 ++	.byte	0x89	# DW_CFA_offset, column 0x9
  1.3293 ++	.uleb128 0xf
  1.3294 ++	.byte	0x88	# DW_CFA_offset, column 0x8
  1.3295 ++	.uleb128 0x10
  1.3296 ++	.byte	0x87	# DW_CFA_offset, column 0x7
  1.3297 ++	.uleb128 0x11
  1.3298 ++	.byte	0x86	# DW_CFA_offset, column 0x6
  1.3299 ++	.uleb128 0x12
  1.3300 ++	.byte	0x4	# DW_CFA_advance_loc4
  1.3301 ++	.4byte	.LCFI1-.LCFI0
  1.3302 ++	.byte	0xd	# DW_CFA_def_cfa_register
  1.3303 ++	.uleb128 0xb
  1.3304 ++	.byte	0x4	# DW_CFA_advance_loc4
  1.3305 ++	.4byte	.LCFI2-.LCFI1
  1.3306 ++	.byte	0xe	# DW_CFA_def_cfa_offset
  1.3307 ++	.uleb128 0x90
  1.3308 ++	.align	4
  1.3309 ++.LEFDE1:
  1.3310 ++.LSFDE2:
  1.3311 ++	.4byte	.LEFDE2-.LASFDE2	# FDE Length
  1.3312 ++.LASFDE2:
  1.3313 ++	.4byte	.LASFDE2-.Lframe1	# FDE CIE offset
  1.3314 ++	.4byte	.LFB2-.	# FDE initial location
  1.3315 ++	.4byte	.LFE2-.LFB2	# FDE address range
  1.3316 ++	.uleb128 0x0	# Augmentation size
  1.3317 ++	.byte	0x4	# DW_CFA_advance_loc4
  1.3318 ++	.4byte	.LCFI10-.LFB2
  1.3319 ++	.byte	0x8f	# DW_CFA_offset, column 0xf
  1.3320 ++	.uleb128 0x9
  1.3321 ++	.byte	0x8e	# DW_CFA_offset, column 0xe
  1.3322 ++	.uleb128 0xa
  1.3323 ++	.byte	0x8d	# DW_CFA_offset, column 0xd
  1.3324 ++	.uleb128 0xb
  1.3325 ++	.byte	0x8c	# DW_CFA_offset, column 0xc
  1.3326 ++	.uleb128 0xc
  1.3327 ++	.byte	0x4	# DW_CFA_advance_loc4
  1.3328 ++	.4byte	.LCFI11-.LCFI10
  1.3329 ++	.byte	0xe	# DW_CFA_def_cfa_offset
  1.3330 ++	.uleb128 0xc0
  1.3331 ++	.align	4
  1.3332 ++.LEFDE2:
  1.3333 ++
  1.3334 ++#else
  1.3335 ++ 
  1.3336 ++.text
  1.3337 ++ 
  1.3338 ++	# r2:	cif->bytes
  1.3339 ++	# r3:	&ecif
  1.3340 ++	# r4:	ffi_prep_args
  1.3341 ++	# r5:	ret_type
  1.3342 ++	# r6:	ecif.rvalue
  1.3343 ++	# ov:	fn 
  1.3344 ++ 
  1.3345 ++	# This assumes we are using gas.
  1.3346 ++	.globl	ffi_call_SYSV
  1.3347 ++	.type	ffi_call_SYSV,%function
  1.3348 ++ffi_call_SYSV:
  1.3349 ++.LFB1:
  1.3350 ++	stmg	%r6,%r15,48(%r15)		# Save registers
  1.3351 ++.LCFI0:
  1.3352 ++	larl	%r13,.Lbase			# Set up base register
  1.3353 ++	lgr	%r11,%r15			# Set up frame pointer
  1.3354 ++.LCFI1:
  1.3355 ++	sgr	%r15,%r2
  1.3356 ++	aghi	%r15,-160-80			# Allocate stack
  1.3357 ++	lgr	%r8,%r6				# Save ecif.rvalue
  1.3358 ++	llgc	%r9,.Ltable-.Lbase(%r13,%r5)	# Load epilog address
  1.3359 ++	lg	%r7,160(%r11)			# Load function address
  1.3360 ++	stg	%r11,0(%r15)			# Set up back chain
  1.3361 ++	aghi	%r11,-80			# Register save area
  1.3362 ++.LCFI2:
  1.3363 ++
  1.3364 ++	la	%r2,160(%r15)			# Save area
  1.3365 ++						# r3 already holds &ecif
  1.3366 ++	basr	%r14,%r4			# Call ffi_prep_args
  1.3367 ++
  1.3368 ++	lmg	%r2,%r6,0(%r11)			# Load arguments
  1.3369 ++	ld	%f0,48(%r11)
  1.3370 ++	ld	%f2,56(%r11)
  1.3371 ++	ld	%f4,64(%r11)
  1.3372 ++	ld	%f6,72(%r11)
  1.3373 ++	la	%r14,0(%r13,%r9)		# Set return address
  1.3374 ++	br	%r7				# ... and call function
  1.3375 ++
  1.3376 ++.Lbase:
  1.3377 ++.LretNone:					# Return void
  1.3378 ++	lg	%r4,80+112(%r11)
  1.3379 ++	lmg	%r6,%r15,80+48(%r11)
  1.3380 ++	br	%r4
  1.3381 ++
  1.3382 ++.LretFloat:
  1.3383 ++	lg	%r4,80+112(%r11)
  1.3384 ++	ste	%f0,0(%r8)			# Return float
  1.3385 ++	lmg	%r6,%r15,80+48(%r11)
  1.3386 ++	br	%r4
  1.3387 ++ 
  1.3388 ++.LretDouble:
  1.3389 ++	lg	%r4,80+112(%r11)
  1.3390 ++	std	%f0,0(%r8)			# Return double
  1.3391 ++	lmg	%r6,%r15,80+48(%r11)
  1.3392 ++	br	%r4
  1.3393 ++
  1.3394 ++.LretInt32:
  1.3395 ++	lg	%r4,80+112(%r11)
  1.3396 ++	st	%r2,0(%r8)			# Return int
  1.3397 ++	lmg	%r6,%r15,80+48(%r11)
  1.3398 ++	br	%r4
  1.3399 ++ 
  1.3400 ++.LretInt64:
  1.3401 ++	lg	%r4,80+112(%r11)
  1.3402 ++	stg	%r2,0(%r8)			# Return long
  1.3403 ++	lmg	%r6,%r15,80+48(%r11)
  1.3404 ++	br	%r4
  1.3405 ++ 
  1.3406 ++.Ltable:
  1.3407 ++	.byte	.LretNone-.Lbase		# FFI390_RET_VOID
  1.3408 ++	.byte	.LretNone-.Lbase		# FFI390_RET_STRUCT
  1.3409 ++	.byte	.LretFloat-.Lbase		# FFI390_RET_FLOAT
  1.3410 ++	.byte	.LretDouble-.Lbase		# FFI390_RET_DOUBLE
  1.3411 ++	.byte	.LretInt32-.Lbase		# FFI390_RET_INT32
  1.3412 ++	.byte	.LretInt64-.Lbase		# FFI390_RET_INT64
  1.3413 ++
  1.3414 ++.LFE1: 
  1.3415 ++.ffi_call_SYSV_end:
  1.3416 ++	.size	 ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
  1.3417 ++
  1.3418 ++
  1.3419 ++	.globl	ffi_closure_SYSV
  1.3420 ++	.type	ffi_closure_SYSV,%function
  1.3421 ++ffi_closure_SYSV:
  1.3422 ++.LFB2:
  1.3423 ++	stmg	%r14,%r15,112(%r15)		# Save registers
  1.3424 ++.LCFI10:
  1.3425 ++	stmg	%r2,%r6,16(%r15)		# Save arguments
  1.3426 ++	std	%f0,128(%r15)
  1.3427 ++	std	%f2,136(%r15)
  1.3428 ++	std	%f4,144(%r15)
  1.3429 ++	std	%f6,152(%r15)
  1.3430 ++	lgr	%r1,%r15			# Set up stack frame
  1.3431 ++	aghi	%r15,-160
  1.3432 ++.LCFI11:
  1.3433 ++	lgr	%r2,%r0				# Closure
  1.3434 ++	la	%r3,16(%r1)			# GPRs
  1.3435 ++	la	%r4,128(%r1)			# FPRs
  1.3436 ++	la	%r5,160(%r1)			# Overflow
  1.3437 ++	stg	%r1,0(%r15)			# Set up back chain
  1.3438 ++
  1.3439 ++	brasl	%r14,ffi_closure_helper_SYSV	# Call helper
  1.3440 ++
  1.3441 ++	lg	%r14,160+112(%r15)
  1.3442 ++	ld	%f0,160+128(%r15)		# Load return registers
  1.3443 ++	lg	%r2,160+16(%r15)
  1.3444 ++	la	%r15,160(%r15)
  1.3445 ++	br	%r14
  1.3446 ++.LFE2: 
  1.3447 ++
  1.3448 ++.ffi_closure_SYSV_end:
  1.3449 ++	.size	 ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
  1.3450 ++
  1.3451 ++
  1.3452 ++
  1.3453 ++	.section	.eh_frame,"a",@progbits
  1.3454 ++.Lframe1:
  1.3455 ++	.4byte	.LECIE1-.LSCIE1	# Length of Common Information Entry
  1.3456 ++.LSCIE1:
  1.3457 ++	.4byte	0x0	# CIE Identifier Tag
  1.3458 ++	.byte	0x1	# CIE Version
  1.3459 ++	.ascii "zR\0"	# CIE Augmentation
  1.3460 ++	.uleb128 0x1	# CIE Code Alignment Factor
  1.3461 ++	.sleb128 -8	# CIE Data Alignment Factor
  1.3462 ++	.byte	0xe	# CIE RA Column
  1.3463 ++	.uleb128 0x1	# Augmentation size
  1.3464 ++	.byte	0x1b	# FDE Encoding (pcrel sdata4)
  1.3465 ++	.byte	0xc	# DW_CFA_def_cfa
  1.3466 ++	.uleb128 0xf
  1.3467 ++	.uleb128 0xa0
  1.3468 ++	.align	8
  1.3469 ++.LECIE1:
  1.3470 ++.LSFDE1:
  1.3471 ++	.4byte	.LEFDE1-.LASFDE1	# FDE Length
  1.3472 ++.LASFDE1:
  1.3473 ++	.4byte	.LASFDE1-.Lframe1	# FDE CIE offset
  1.3474 ++	.4byte	.LFB1-.	# FDE initial location
  1.3475 ++	.4byte	.LFE1-.LFB1	# FDE address range
  1.3476 ++	.uleb128 0x0	# Augmentation size
  1.3477 ++	.byte	0x4	# DW_CFA_advance_loc4
  1.3478 ++	.4byte	.LCFI0-.LFB1
  1.3479 ++	.byte	0x8f	# DW_CFA_offset, column 0xf
  1.3480 ++	.uleb128 0x5
  1.3481 ++	.byte	0x8e	# DW_CFA_offset, column 0xe
  1.3482 ++	.uleb128 0x6
  1.3483 ++	.byte	0x8d	# DW_CFA_offset, column 0xd
  1.3484 ++	.uleb128 0x7
  1.3485 ++	.byte	0x8c	# DW_CFA_offset, column 0xc
  1.3486 ++	.uleb128 0x8
  1.3487 ++	.byte	0x8b	# DW_CFA_offset, column 0xb
  1.3488 ++	.uleb128 0x9
  1.3489 ++	.byte	0x8a	# DW_CFA_offset, column 0xa
  1.3490 ++	.uleb128 0xa
  1.3491 ++	.byte	0x89	# DW_CFA_offset, column 0x9
  1.3492 ++	.uleb128 0xb
  1.3493 ++	.byte	0x88	# DW_CFA_offset, column 0x8
  1.3494 ++	.uleb128 0xc
  1.3495 ++	.byte	0x87	# DW_CFA_offset, column 0x7
  1.3496 ++	.uleb128 0xd
  1.3497 ++	.byte	0x86	# DW_CFA_offset, column 0x6
  1.3498 ++	.uleb128 0xe
  1.3499 ++	.byte	0x4	# DW_CFA_advance_loc4
  1.3500 ++	.4byte	.LCFI1-.LCFI0
  1.3501 ++	.byte	0xd	# DW_CFA_def_cfa_register
  1.3502 ++	.uleb128 0xb
  1.3503 ++	.byte	0x4	# DW_CFA_advance_loc4
  1.3504 ++	.4byte	.LCFI2-.LCFI1
  1.3505 ++	.byte	0xe	# DW_CFA_def_cfa_offset
  1.3506 ++	.uleb128 0xf0
  1.3507 ++	.align	8
  1.3508 ++.LEFDE1:
  1.3509 ++.LSFDE2:
  1.3510 ++	.4byte	.LEFDE2-.LASFDE2	# FDE Length
  1.3511 ++.LASFDE2:
  1.3512 ++	.4byte	.LASFDE2-.Lframe1	# FDE CIE offset
  1.3513 ++	.4byte	.LFB2-.	# FDE initial location
  1.3514 ++	.4byte	.LFE2-.LFB2	# FDE address range
  1.3515 ++	.uleb128 0x0	# Augmentation size
  1.3516 ++	.byte	0x4	# DW_CFA_advance_loc4
  1.3517 ++	.4byte	.LCFI10-.LFB2
  1.3518 ++	.byte	0x8f	# DW_CFA_offset, column 0xf
  1.3519 ++	.uleb128 0x5
  1.3520 ++	.byte	0x8e	# DW_CFA_offset, column 0xe
  1.3521 ++	.uleb128 0x6
  1.3522 ++	.byte	0x4	# DW_CFA_advance_loc4
  1.3523 ++	.4byte	.LCFI11-.LCFI10
  1.3524 ++	.byte	0xe	# DW_CFA_def_cfa_offset
  1.3525 ++	.uleb128 0x140
  1.3526 ++	.align	8
  1.3527 ++.LEFDE2:
  1.3528 ++
  1.3529 ++#endif
  1.3530 ++
  1.3531 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/ffi.c gcc/libffi/src/sh/ffi.c
  1.3532 +--- gcc-3.2.2.orig/libffi/src/sh/ffi.c	Thu Jan  1 09:00:00 1970
  1.3533 ++++ gcc/libffi/src/sh/ffi.c	Fri Jul 19 10:08:43 2002
  1.3534 +@@ -0,0 +1,722 @@
  1.3535 ++/* -----------------------------------------------------------------------
  1.3536 ++   ffi.c - Copyright (c) 2002 Kaz Kojima
  1.3537 ++   
  1.3538 ++   SuperH Foreign Function Interface 
  1.3539 ++
  1.3540 ++   Permission is hereby granted, free of charge, to any person obtaining
  1.3541 ++   a copy of this software and associated documentation files (the
  1.3542 ++   ``Software''), to deal in the Software without restriction, including
  1.3543 ++   without limitation the rights to use, copy, modify, merge, publish,
  1.3544 ++   distribute, sublicense, and/or sell copies of the Software, and to
  1.3545 ++   permit persons to whom the Software is furnished to do so, subject to
  1.3546 ++   the following conditions:
  1.3547 ++
  1.3548 ++   The above copyright notice and this permission notice shall be included
  1.3549 ++   in all copies or substantial portions of the Software.
  1.3550 ++
  1.3551 ++   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
  1.3552 ++   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  1.3553 ++   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  1.3554 ++   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  1.3555 ++   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  1.3556 ++   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  1.3557 ++   OTHER DEALINGS IN THE SOFTWARE.
  1.3558 ++   ----------------------------------------------------------------------- */
  1.3559 ++
  1.3560 ++#include <ffi.h>
  1.3561 ++#include <ffi_common.h>
  1.3562 ++
  1.3563 ++#include <stdlib.h>
  1.3564 ++
  1.3565 ++#define NGREGARG 4
  1.3566 ++#if defined(__SH4__)
  1.3567 ++#define NFREGARG 8
  1.3568 ++#endif
  1.3569 ++
  1.3570 ++#if defined(__HITACHI__)
  1.3571 ++#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
  1.3572 ++#else
  1.3573 ++#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
  1.3574 ++#endif
  1.3575 ++
  1.3576 ++/* If the structure has essentialy an unique element, return its type.  */
  1.3577 ++static int
  1.3578 ++simple_type (ffi_type *arg)
  1.3579 ++{
  1.3580 ++  if (arg->type != FFI_TYPE_STRUCT)
  1.3581 ++    return arg->type;
  1.3582 ++  else if (arg->elements[1])
  1.3583 ++    return FFI_TYPE_STRUCT;
  1.3584 ++
  1.3585 ++  return simple_type (arg->elements[0]);
  1.3586 ++}
  1.3587 ++
  1.3588 ++static int
  1.3589 ++return_type (ffi_type *arg)
  1.3590 ++{
  1.3591 ++  unsigned short type;
  1.3592 ++
  1.3593 ++  if (arg->type != FFI_TYPE_STRUCT)
  1.3594 ++    return arg->type;
  1.3595 ++
  1.3596 ++  type = simple_type (arg->elements[0]);
  1.3597 ++  if (! arg->elements[1])
  1.3598 ++    {
  1.3599 ++      switch (type)
  1.3600 ++	{
  1.3601 ++	case FFI_TYPE_SINT8:
  1.3602 ++	case FFI_TYPE_UINT8:
  1.3603 ++	case FFI_TYPE_SINT16:
  1.3604 ++	case FFI_TYPE_UINT16:
  1.3605 ++	case FFI_TYPE_SINT32:
  1.3606 ++	case FFI_TYPE_UINT32:
  1.3607 ++	  return FFI_TYPE_INT;
  1.3608 ++
  1.3609 ++	default:
  1.3610 ++	  return type;
  1.3611 ++	}
  1.3612 ++    }
  1.3613 ++
  1.3614 ++  /* gcc uses r0/r1 pair for some kind of structures.  */
  1.3615 ++  if (arg->size <= 2 * sizeof (int))
  1.3616 ++    {
  1.3617 ++      int i = 0;
  1.3618 ++      ffi_type *e;
  1.3619 ++
  1.3620 ++      while ((e = arg->elements[i++]))
  1.3621 ++	{
  1.3622 ++	  type = simple_type (e);
  1.3623 ++	  switch (type)
  1.3624 ++	    {
  1.3625 ++	    case FFI_TYPE_SINT32:
  1.3626 ++	    case FFI_TYPE_UINT32:
  1.3627 ++	    case FFI_TYPE_INT:
  1.3628 ++	    case FFI_TYPE_FLOAT:
  1.3629 ++	      return FFI_TYPE_UINT64;
  1.3630 ++
  1.3631 ++	    default:
  1.3632 ++	      break;
  1.3633 ++	    }
  1.3634 ++	}
  1.3635 ++    }
  1.3636 ++
  1.3637 ++  return FFI_TYPE_STRUCT;
  1.3638 ++}
  1.3639 ++
  1.3640 ++/* ffi_prep_args is called by the assembly routine once stack space
  1.3641 ++   has been allocated for the function's arguments */
  1.3642 ++
  1.3643 ++/*@-exportheader@*/
  1.3644 ++void ffi_prep_args(char *stack, extended_cif *ecif)
  1.3645 ++/*@=exportheader@*/
  1.3646 ++{
  1.3647 ++  register unsigned int i;
  1.3648 ++  register int tmp;
  1.3649 ++  register unsigned int avn;
  1.3650 ++  register void **p_argv;
  1.3651 ++  register char *argp;
  1.3652 ++  register ffi_type **p_arg;
  1.3653 ++  int greg, ireg;
  1.3654 ++#if defined(__SH4__)
  1.3655 ++  int freg = 0;
  1.3656 ++#endif
  1.3657 ++
  1.3658 ++  tmp = 0;
  1.3659 ++  argp = stack;
  1.3660 ++
  1.3661 ++  if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT)
  1.3662 ++    {
  1.3663 ++      *(void **) argp = ecif->rvalue;
  1.3664 ++      argp += 4;
  1.3665 ++      ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0;
  1.3666 ++    }
  1.3667 ++  else
  1.3668 ++    ireg = 0;
  1.3669 ++
  1.3670 ++  /* Set arguments for registers.  */
  1.3671 ++  greg = ireg;
  1.3672 ++  avn = ecif->cif->nargs;
  1.3673 ++  p_argv = ecif->avalue;
  1.3674 ++
  1.3675 ++  for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
  1.3676 ++    {
  1.3677 ++      size_t z;
  1.3678 ++
  1.3679 ++      z = (*p_arg)->size;
  1.3680 ++      if (z < sizeof(int))
  1.3681 ++	{
  1.3682 ++	  if (greg++ >= NGREGARG)
  1.3683 ++	    continue;
  1.3684 ++
  1.3685 ++	  z = sizeof(int);
  1.3686 ++	  switch ((*p_arg)->type)
  1.3687 ++	    {
  1.3688 ++	    case FFI_TYPE_SINT8:
  1.3689 ++	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
  1.3690 ++	      break;
  1.3691 ++  
  1.3692 ++	    case FFI_TYPE_UINT8:
  1.3693 ++	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
  1.3694 ++	      break;
  1.3695 ++  
  1.3696 ++	    case FFI_TYPE_SINT16:
  1.3697 ++	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
  1.3698 ++	      break;
  1.3699 ++  
  1.3700 ++	    case FFI_TYPE_UINT16:
  1.3701 ++	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
  1.3702 ++	      break;
  1.3703 ++  
  1.3704 ++	    case FFI_TYPE_STRUCT:
  1.3705 ++	      *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
  1.3706 ++	      break;
  1.3707 ++
  1.3708 ++	    default:
  1.3709 ++	      FFI_ASSERT(0);
  1.3710 ++	    }
  1.3711 ++	  argp += z;
  1.3712 ++	}
  1.3713 ++      else if (z == sizeof(int))
  1.3714 ++	{
  1.3715 ++#if defined(__SH4__)
  1.3716 ++	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
  1.3717 ++	    {
  1.3718 ++	      if (freg++ >= NFREGARG)
  1.3719 ++		continue;
  1.3720 ++	    }
  1.3721 ++	  else
  1.3722 ++#endif
  1.3723 ++	    {
  1.3724 ++	      if (greg++ >= NGREGARG)
  1.3725 ++		continue;
  1.3726 ++	    }
  1.3727 ++	  *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
  1.3728 ++	  argp += z;
  1.3729 ++	}
  1.3730 ++#if defined(__SH4__)
  1.3731 ++      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
  1.3732 ++	{
  1.3733 ++	  if (freg + 1 >= NFREGARG)
  1.3734 ++	    continue;
  1.3735 ++	  freg = (freg + 1) & ~1;
  1.3736 ++	  freg += 2;
  1.3737 ++	  memcpy (argp, *p_argv, z);
  1.3738 ++	  argp += z;
  1.3739 ++	}
  1.3740 ++#endif
  1.3741 ++      else
  1.3742 ++	{
  1.3743 ++	  int n = (z + sizeof (int) - 1) / sizeof (int);
  1.3744 ++#if defined(__SH4__)
  1.3745 ++	  if (greg + n - 1 >= NGREGARG)
  1.3746 ++	    continue;
  1.3747 ++	  greg += n;
  1.3748 ++#else
  1.3749 ++	  if (greg >= NGREGARG)
  1.3750 ++	    continue;
  1.3751 ++	  else if (greg + n - 1 >= NGREGARG)
  1.3752 ++	    greg = NGREGARG;
  1.3753 ++	  else
  1.3754 ++	    greg += n;
  1.3755 ++#endif
  1.3756 ++	  memcpy (argp, *p_argv, z);
  1.3757 ++	  argp += z;
  1.3758 ++	}
  1.3759 ++    }
  1.3760 ++
  1.3761 ++  /* Set arguments on stack.  */
  1.3762 ++  greg = ireg;
  1.3763 ++#if defined(__SH4__)
  1.3764 ++  freg = 0;
  1.3765 ++#endif
  1.3766 ++  p_argv = ecif->avalue;
  1.3767 ++
  1.3768 ++  for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
  1.3769 ++    {
  1.3770 ++      size_t z;
  1.3771 ++
  1.3772 ++      z = (*p_arg)->size;
  1.3773 ++      if (z < sizeof(int))
  1.3774 ++	{
  1.3775 ++	  if (greg++ < NGREGARG)
  1.3776 ++	    continue;
  1.3777 ++
  1.3778 ++	  z = sizeof(int);
  1.3779 ++	  switch ((*p_arg)->type)
  1.3780 ++	    {
  1.3781 ++	    case FFI_TYPE_SINT8:
  1.3782 ++	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
  1.3783 ++	      break;
  1.3784 ++  
  1.3785 ++	    case FFI_TYPE_UINT8:
  1.3786 ++	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
  1.3787 ++	      break;
  1.3788 ++  
  1.3789 ++	    case FFI_TYPE_SINT16:
  1.3790 ++	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
  1.3791 ++	      break;
  1.3792 ++  
  1.3793 ++	    case FFI_TYPE_UINT16:
  1.3794 ++	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
  1.3795 ++	      break;
  1.3796 ++  
  1.3797 ++	    case FFI_TYPE_STRUCT:
  1.3798 ++	      *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
  1.3799 ++	      break;
  1.3800 ++
  1.3801 ++	    default:
  1.3802 ++	      FFI_ASSERT(0);
  1.3803 ++	    }
  1.3804 ++	  argp += z;
  1.3805 ++	}
  1.3806 ++      else if (z == sizeof(int))
  1.3807 ++	{
  1.3808 ++#if defined(__SH4__)
  1.3809 ++	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
  1.3810 ++	    {
  1.3811 ++	      if (freg++ < NFREGARG)
  1.3812 ++		continue;
  1.3813 ++	    }
  1.3814 ++	  else
  1.3815 ++#endif
  1.3816 ++	    {
  1.3817 ++	      if (greg++ < NGREGARG)
  1.3818 ++		continue;
  1.3819 ++	    }
  1.3820 ++	  *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
  1.3821 ++	  argp += z;
  1.3822 ++	}
  1.3823 ++#if defined(__SH4__)
  1.3824 ++      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
  1.3825 ++	{
  1.3826 ++	  if (freg + 1 < NFREGARG)
  1.3827 ++	    {
  1.3828 ++	      freg = (freg + 1) & ~1;
  1.3829 ++	      freg += 2;
  1.3830 ++	      continue;
  1.3831 ++	    }
  1.3832 ++	  memcpy (argp, *p_argv, z);
  1.3833 ++	  argp += z;
  1.3834 ++	}
  1.3835 ++#endif
  1.3836 ++      else
  1.3837 ++	{
  1.3838 ++	  int n = (z + sizeof (int) - 1) / sizeof (int);
  1.3839 ++	  if (greg + n - 1 < NGREGARG)
  1.3840 ++	    {
  1.3841 ++	      greg += n;
  1.3842 ++	      continue;
  1.3843 ++	    }
  1.3844 ++#if (! defined(__SH4__))
  1.3845 ++	  else if (greg < NGREGARG)
  1.3846 ++	    {
  1.3847 ++	      greg = NGREGARG;
  1.3848 ++	      continue;
  1.3849 ++	    }
  1.3850 ++#endif
  1.3851 ++	  memcpy (argp, *p_argv, z);
  1.3852 ++	  argp += z;
  1.3853 ++	}
  1.3854 ++    }
  1.3855 ++
  1.3856 ++  return;
  1.3857 ++}
  1.3858 ++
  1.3859 ++/* Perform machine dependent cif processing */
  1.3860 ++ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
  1.3861 ++{
  1.3862 ++  int i, j;
  1.3863 ++  int size, type;
  1.3864 ++  int n, m;
  1.3865 ++  int greg;
  1.3866 ++#if defined(__SH4__)
  1.3867 ++  int freg = 0;
  1.3868 ++#endif
  1.3869 ++
  1.3870 ++  cif->flags = 0;
  1.3871 ++
  1.3872 ++  greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) &&
  1.3873 ++	  STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0;
  1.3874 ++
  1.3875 ++#if defined(__SH4__)
  1.3876 ++  for (i = j = 0; i < cif->nargs && j < 12; i++)
  1.3877 ++    {
  1.3878 ++      type = (cif->arg_types)[i]->type;
  1.3879 ++      switch (type)
  1.3880 ++	{
  1.3881 ++	case FFI_TYPE_FLOAT:
  1.3882 ++	  if (freg >= NFREGARG)
  1.3883 ++	    continue;
  1.3884 ++	  freg++;
  1.3885 ++	  cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
  1.3886 ++	  j++;
  1.3887 ++	  break;
  1.3888 ++
  1.3889 ++	case FFI_TYPE_DOUBLE:
  1.3890 ++	  if ((freg + 1) >= NFREGARG)
  1.3891 ++	    continue;
  1.3892 ++	  freg = (freg + 1) & ~1;
  1.3893 ++	  freg += 2;
  1.3894 ++	  cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
  1.3895 ++	  j++;
  1.3896 ++	  break;
  1.3897 ++	      
  1.3898 ++	default:
  1.3899 ++	  size = (cif->arg_types)[i]->size;
  1.3900 ++	  n = (size + sizeof (int) - 1) / sizeof (int);
  1.3901 ++	  if (greg + n - 1 >= NGREGARG)
  1.3902 ++		continue;
  1.3903 ++	  greg += n;
  1.3904 ++	  for (m = 0; m < n; m++)
  1.3905 ++	    cif->flags += FFI_TYPE_INT << (2 * j++);
  1.3906 ++	  break;
  1.3907 ++	}
  1.3908 ++    }
  1.3909 ++#else
  1.3910 ++  for (i = j = 0; i < cif->nargs && j < 4; i++)
  1.3911 ++    {
  1.3912 ++      size = (cif->arg_types)[i]->size;
  1.3913 ++      n = (size + sizeof (int) - 1) / sizeof (int);
  1.3914 ++      if (greg >= NGREGARG)
  1.3915 ++	continue;
  1.3916 ++      else if (greg + n - 1 >= NGREGARG)
  1.3917 ++	greg = NGREGARG;
  1.3918 ++      else
  1.3919 ++	greg += n;
  1.3920 ++      for (m = 0; m < n; m++)
  1.3921 ++        cif->flags += FFI_TYPE_INT << (2 * j++);
  1.3922 ++    }
  1.3923 ++#endif
  1.3924 ++
  1.3925 ++  /* Set the return type flag */
  1.3926 ++  switch (cif->rtype->type)
  1.3927 ++    {
  1.3928 ++    case FFI_TYPE_STRUCT:
  1.3929 ++      cif->flags += (unsigned) (return_type (cif->rtype)) << 24;
  1.3930 ++      break;
  1.3931 ++
  1.3932 ++    case FFI_TYPE_VOID:
  1.3933 ++    case FFI_TYPE_FLOAT:
  1.3934 ++    case FFI_TYPE_DOUBLE:
  1.3935 ++    case FFI_TYPE_SINT64:
  1.3936 ++    case FFI_TYPE_UINT64:
  1.3937 ++      cif->flags += (unsigned) cif->rtype->type << 24;
  1.3938 ++      break;
  1.3939 ++
  1.3940 ++    default:
  1.3941 ++      cif->flags += FFI_TYPE_INT << 24;
  1.3942 ++      break;
  1.3943 ++    }
  1.3944 ++
  1.3945 ++  return FFI_OK;
  1.3946 ++}
  1.3947 ++
  1.3948 ++/*@-declundef@*/
  1.3949 ++/*@-exportheader@*/
  1.3950 ++extern void ffi_call_SYSV(void (*)(char *, extended_cif *), 
  1.3951 ++			  /*@out@*/ extended_cif *, 
  1.3952 ++			  unsigned, unsigned, 
  1.3953 ++			  /*@out@*/ unsigned *, 
  1.3954 ++			  void (*fn)());
  1.3955 ++/*@=declundef@*/
  1.3956 ++/*@=exportheader@*/
  1.3957 ++
  1.3958 ++void ffi_call(/*@dependent@*/ ffi_cif *cif, 
  1.3959 ++	      void (*fn)(), 
  1.3960 ++	      /*@out@*/ void *rvalue, 
  1.3961 ++	      /*@dependent@*/ void **avalue)
  1.3962 ++{
  1.3963 ++  extended_cif ecif;
  1.3964 ++
  1.3965 ++  ecif.cif = cif;
  1.3966 ++  ecif.avalue = avalue;
  1.3967 ++  
  1.3968 ++  /* If the return value is a struct and we don't have a return	*/
  1.3969 ++  /* value address then we need to make one		        */
  1.3970 ++
  1.3971 ++  if ((rvalue == NULL) && 
  1.3972 ++      (cif->rtype->type == FFI_TYPE_STRUCT))
  1.3973 ++    {
  1.3974 ++      /*@-sysunrecog@*/
  1.3975 ++      ecif.rvalue = alloca(cif->rtype->size);
  1.3976 ++      /*@=sysunrecog@*/
  1.3977 ++    }
  1.3978 ++  else
  1.3979 ++    ecif.rvalue = rvalue;
  1.3980 ++    
  1.3981 ++
  1.3982 ++  switch (cif->abi) 
  1.3983 ++    {
  1.3984 ++    case FFI_SYSV:
  1.3985 ++      /*@-usedef@*/
  1.3986 ++      ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, 
  1.3987 ++		    cif->flags, ecif.rvalue, fn);
  1.3988 ++      /*@=usedef@*/
  1.3989 ++      break;
  1.3990 ++    default:
  1.3991 ++      FFI_ASSERT(0);
  1.3992 ++      break;
  1.3993 ++    }
  1.3994 ++}
  1.3995 ++
  1.3996 ++extern void ffi_closure_SYSV (void);
  1.3997 ++#if defined(__SH4__)
  1.3998 ++extern void __ic_invalidate (void *line);
  1.3999 ++#endif
  1.4000 ++
  1.4001 ++ffi_status
  1.4002 ++ffi_prep_closure (ffi_closure* closure,
  1.4003 ++		  ffi_cif* cif,
  1.4004 ++		  void (*fun)(ffi_cif*, void*, void**, void*),
  1.4005 ++		  void *user_data)
  1.4006 ++{
  1.4007 ++  unsigned int *tramp;
  1.4008 ++
  1.4009 ++  FFI_ASSERT (cif->abi == FFI_GCC_SYSV);
  1.4010 ++
  1.4011 ++  tramp = (unsigned int *) &closure->tramp[0];
  1.4012 ++#ifdef __LITTLE_ENDIAN__
  1.4013 ++  tramp[0] = 0xd301d202;
  1.4014 ++  tramp[1] = 0x0009422b;
  1.4015 ++#else
  1.4016 ++  tramp[0] = 0xd202d301;
  1.4017 ++  tramp[1] = 0x422b0009;
  1.4018 ++#endif
  1.4019 ++  *(void **) &tramp[2] = (void *)closure;          /* ctx */
  1.4020 ++  *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */
  1.4021 ++
  1.4022 ++  closure->cif = cif;
  1.4023 ++  closure->fun = fun;
  1.4024 ++  closure->user_data = user_data;
  1.4025 ++
  1.4026 ++#if defined(__SH4__)
  1.4027 ++  /* Flush the icache.  */
  1.4028 ++  __ic_invalidate(&closure->tramp[0]);
  1.4029 ++#endif
  1.4030 ++
  1.4031 ++  return FFI_OK;
  1.4032 ++}
  1.4033 ++
  1.4034 ++/* Basically the trampoline invokes ffi_closure_SYSV, and on 
  1.4035 ++ * entry, r3 holds the address of the closure.
  1.4036 ++ * After storing the registers that could possibly contain
  1.4037 ++ * parameters to be passed into the stack frame and setting
  1.4038 ++ * up space for a return value, ffi_closure_SYSV invokes the 
  1.4039 ++ * following helper function to do most of the work.
  1.4040 ++ */
  1.4041 ++
  1.4042 ++#ifdef __LITTLE_ENDIAN__
  1.4043 ++#define OFS_INT8	0
  1.4044 ++#define OFS_INT16	2
  1.4045 ++#else
  1.4046 ++#define OFS_INT8	3
  1.4047 ++#define OFS_INT16	2
  1.4048 ++#endif
  1.4049 ++
  1.4050 ++int
  1.4051 ++ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, 
  1.4052 ++			 unsigned long *pgr, unsigned long *pfr, 
  1.4053 ++			 unsigned long *pst)
  1.4054 ++{
  1.4055 ++  void **avalue;
  1.4056 ++  ffi_type **p_arg;
  1.4057 ++  int i, avn;
  1.4058 ++  int ireg, greg = 0;
  1.4059 ++#if defined(__SH4__)
  1.4060 ++  int freg = 0;
  1.4061 ++#endif
  1.4062 ++  ffi_cif *cif; 
  1.4063 ++  double temp; 
  1.4064 ++
  1.4065 ++  cif = closure->cif;
  1.4066 ++  avalue = alloca(cif->nargs * sizeof(void *));
  1.4067 ++
  1.4068 ++  /* Copy the caller's structure return value address so that the closure
  1.4069 ++     returns the data directly to the caller.  */
  1.4070 ++  if (cif->rtype->type == FFI_TYPE_STRUCT)
  1.4071 ++    {
  1.4072 ++      rvalue = *pgr++;
  1.4073 ++      ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0;
  1.4074 ++    }
  1.4075 ++  else
  1.4076 ++    ireg = 0;
  1.4077 ++
  1.4078 ++  cif = closure->cif;
  1.4079 ++  greg = ireg;
  1.4080 ++  avn = cif->nargs;
  1.4081 ++
  1.4082 ++  /* Grab the addresses of the arguments from the stack frame.  */
  1.4083 ++  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
  1.4084 ++    {
  1.4085 ++      size_t z;
  1.4086 ++
  1.4087 ++      z = (*p_arg)->size;
  1.4088 ++      if (z < sizeof(int))
  1.4089 ++	{
  1.4090 ++	  if (greg++ >= NGREGARG)
  1.4091 ++	    continue;
  1.4092 ++
  1.4093 ++	  z = sizeof(int);
  1.4094 ++	  switch ((*p_arg)->type)
  1.4095 ++	    {
  1.4096 ++	    case FFI_TYPE_SINT8:
  1.4097 ++	    case FFI_TYPE_UINT8:
  1.4098 ++	      avalue[i] = (((char *)pgr) + OFS_INT8);
  1.4099 ++	      break;
  1.4100 ++  
  1.4101 ++	    case FFI_TYPE_SINT16:
  1.4102 ++	    case FFI_TYPE_UINT16:
  1.4103 ++	      avalue[i] = (((char *)pgr) + OFS_INT16);
  1.4104 ++	      break;
  1.4105 ++  
  1.4106 ++	    case FFI_TYPE_STRUCT:
  1.4107 ++	      avalue[i] = pgr;
  1.4108 ++	      break;
  1.4109 ++
  1.4110 ++	    default:
  1.4111 ++	      FFI_ASSERT(0);
  1.4112 ++	    }
  1.4113 ++	  pgr++;
  1.4114 ++	}
  1.4115 ++      else if (z == sizeof(int))
  1.4116 ++	{
  1.4117 ++#if defined(__SH4__)
  1.4118 ++	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
  1.4119 ++	    {
  1.4120 ++	      if (freg++ >= NFREGARG)
  1.4121 ++		continue;
  1.4122 ++	      avalue[i] = pfr;
  1.4123 ++	      pfr++;
  1.4124 ++	    }
  1.4125 ++	  else
  1.4126 ++#endif
  1.4127 ++	    {
  1.4128 ++	      if (greg++ >= NGREGARG)
  1.4129 ++		continue;
  1.4130 ++	      avalue[i] = pgr;
  1.4131 ++	      pgr++;
  1.4132 ++	    }
  1.4133 ++	}
  1.4134 ++#if defined(__SH4__)
  1.4135 ++      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
  1.4136 ++	{
  1.4137 ++	  if (freg + 1 >= NFREGARG)
  1.4138 ++	    continue;
  1.4139 ++	  freg = (freg + 1) & ~1;
  1.4140 ++	  freg += 2;
  1.4141 ++	  avalue[i] = pfr;
  1.4142 ++	  pfr += 2;
  1.4143 ++	}
  1.4144 ++#endif
  1.4145 ++      else
  1.4146 ++	{
  1.4147 ++	  int n = (z + sizeof (int) - 1) / sizeof (int);
  1.4148 ++#if defined(__SH4__)
  1.4149 ++	  if (greg + n - 1 >= NGREGARG)
  1.4150 ++	    continue;
  1.4151 ++	  greg += n;
  1.4152 ++#else
  1.4153 ++	  if (greg >= NGREGARG)
  1.4154 ++	    continue;
  1.4155 ++	  else if (greg + n - 1 >= NGREGARG)
  1.4156 ++	    greg = NGREGARG;
  1.4157 ++	  else
  1.4158 ++	    greg += n;
  1.4159 ++#endif
  1.4160 ++	  avalue[i] = pgr;
  1.4161 ++	  pgr += n;
  1.4162 ++	}
  1.4163 ++    }
  1.4164 ++
  1.4165 ++  greg = ireg;
  1.4166 ++#if defined(__SH4__)
  1.4167 ++  freg = 0;
  1.4168 ++#endif
  1.4169 ++
  1.4170 ++  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
  1.4171 ++    {
  1.4172 ++      size_t z;
  1.4173 ++
  1.4174 ++      z = (*p_arg)->size;
  1.4175 ++      if (z < sizeof(int))
  1.4176 ++	{
  1.4177 ++	  if (greg++ < NGREGARG)
  1.4178 ++	    continue;
  1.4179 ++
  1.4180 ++	  z = sizeof(int);
  1.4181 ++	  switch ((*p_arg)->type)
  1.4182 ++	    {
  1.4183 ++	    case FFI_TYPE_SINT8:
  1.4184 ++	    case FFI_TYPE_UINT8:
  1.4185 ++	      avalue[i] = (((char *)pst) + OFS_INT8);
  1.4186 ++	      break;
  1.4187 ++  
  1.4188 ++	    case FFI_TYPE_SINT16:
  1.4189 ++	    case FFI_TYPE_UINT16:
  1.4190 ++	      avalue[i] = (((char *)pst) + OFS_INT16);
  1.4191 ++	      break;
  1.4192 ++  
  1.4193 ++	    case FFI_TYPE_STRUCT:
  1.4194 ++	      avalue[i] = pst;
  1.4195 ++	      break;
  1.4196 ++
  1.4197 ++	    default:
  1.4198 ++	      FFI_ASSERT(0);
  1.4199 ++	    }
  1.4200 ++	  pst++;
  1.4201 ++	}
  1.4202 ++      else if (z == sizeof(int))
  1.4203 ++	{
  1.4204 ++#if defined(__SH4__)
  1.4205 ++	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
  1.4206 ++	    {
  1.4207 ++	      if (freg++ < NFREGARG)
  1.4208 ++		continue;
  1.4209 ++	    }
  1.4210 ++	  else
  1.4211 ++#endif
  1.4212 ++	    {
  1.4213 ++	      if (greg++ < NGREGARG)
  1.4214 ++		continue;
  1.4215 ++	    }
  1.4216 ++	  avalue[i] = pst;
  1.4217 ++	  pst++;
  1.4218 ++	}
  1.4219 ++#if defined(__SH4__)
  1.4220 ++      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
  1.4221 ++	{
  1.4222 ++	  if (freg + 1 < NFREGARG)
  1.4223 ++	    {
  1.4224 ++	      freg = (freg + 1) & ~1;
  1.4225 ++	      freg += 2;
  1.4226 ++	      continue;
  1.4227 ++	    }
  1.4228 ++	  avalue[i] = pst;
  1.4229 ++	  pst += 2;
  1.4230 ++	}
  1.4231 ++#endif
  1.4232 ++      else
  1.4233 ++	{
  1.4234 ++	  int n = (z + sizeof (int) - 1) / sizeof (int);
  1.4235 ++	  if (greg + n - 1 < NGREGARG)
  1.4236 ++	    {
  1.4237 ++	      greg += n;
  1.4238 ++	      continue;
  1.4239 ++	    }
  1.4240 ++#if (! defined(__SH4__))
  1.4241 ++	  else if (greg < NGREGARG)
  1.4242 ++	    {
  1.4243 ++	      greg = NGREGARG;
  1.4244 ++	      continue;
  1.4245 ++	    }
  1.4246 ++#endif
  1.4247 ++	  avalue[i] = pst;
  1.4248 ++	  pst += n;
  1.4249 ++	}
  1.4250 ++    }
  1.4251 ++
  1.4252 ++  (closure->fun) (cif, rvalue, avalue, closure->user_data);
  1.4253 ++
  1.4254 ++  /* Tell ffi_closure_osf how to perform return type promotions.  */
  1.4255 ++  return cif->rtype->type;
  1.4256 ++}
  1.4257 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/sysv.S gcc/libffi/src/sh/sysv.S
  1.4258 +--- gcc-3.2.2.orig/libffi/src/sh/sysv.S	Thu Jan  1 09:00:00 1970
  1.4259 ++++ gcc/libffi/src/sh/sysv.S	Tue Dec 17 03:22:48 2002
  1.4260 +@@ -0,0 +1,773 @@
  1.4261 ++/* -----------------------------------------------------------------------
  1.4262 ++   sysv.S - Copyright (c) 2002 Kaz Kojima
  1.4263 ++   
  1.4264 ++   SuperH Foreign Function Interface 
  1.4265 ++
  1.4266 ++   Permission is hereby granted, free of charge, to any person obtaining
  1.4267 ++   a copy of this software and associated documentation files (the
  1.4268 ++   ``Software''), to deal in the Software without restriction, including
  1.4269 ++   without limitation the rights to use, copy, modify, merge, publish,
  1.4270 ++   distribute, sublicense, and/or sell copies of the Software, and to
  1.4271 ++   permit persons to whom the Software is furnished to do so, subject to
  1.4272 ++   the following conditions:
  1.4273 ++
  1.4274 ++   The above copyright notice and this permission notice shall be included
  1.4275 ++   in all copies or substantial portions of the Software.
  1.4276 ++
  1.4277 ++   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
  1.4278 ++   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  1.4279 ++   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  1.4280 ++   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  1.4281 ++   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  1.4282 ++   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  1.4283 ++   OTHER DEALINGS IN THE SOFTWARE.
  1.4284 ++   ----------------------------------------------------------------------- */
  1.4285 ++
  1.4286 ++#define LIBFFI_ASM	
  1.4287 ++#include <ffi.h>
  1.4288 ++#ifdef HAVE_MACHINE_ASM_H
  1.4289 ++#include <machine/asm.h>
  1.4290 ++#else
  1.4291 ++/* XXX these lose for some platforms, I'm sure. */
  1.4292 ++#define CNAME(x) x
  1.4293 ++#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
  1.4294 ++#endif
  1.4295 ++
  1.4296 ++#if defined(__HITACHI__)
  1.4297 ++#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
  1.4298 ++#else
  1.4299 ++#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
  1.4300 ++#endif
  1.4301 ++
  1.4302 ++.text
  1.4303 ++
  1.4304 ++	# r4:	ffi_prep_args
  1.4305 ++	# r5:	&ecif
  1.4306 ++	# r6:	bytes
  1.4307 ++	# r7:	flags
  1.4308 ++	# sp+0: rvalue
  1.4309 ++	# sp+4: fn
  1.4310 ++
  1.4311 ++	# This assumes we are using gas.
  1.4312 ++ENTRY(ffi_call_SYSV)
  1.4313 ++	# Save registers
  1.4314 ++.LFB1:
  1.4315 ++	mov.l	r8,@-r15
  1.4316 ++.LCFI0:
  1.4317 ++	mov.l	r9,@-r15
  1.4318 ++.LCFI1:
  1.4319 ++	mov.l	r10,@-r15
  1.4320 ++.LCFI2:
  1.4321 ++	mov.l	r12,@-r15
  1.4322 ++.LCFI3:
  1.4323 ++	mov.l	r14,@-r15
  1.4324 ++.LCFI4:
  1.4325 ++	sts.l	pr,@-r15
  1.4326 ++.LCFI5:
  1.4327 ++	mov	r15,r14
  1.4328 ++.LCFI6:
  1.4329 ++#if defined(__SH4__)
  1.4330 ++	mov	r6,r8
  1.4331 ++	mov	r7,r9
  1.4332 ++
  1.4333 ++	sub	r6,r15
  1.4334 ++	add	#-16,r15
  1.4335 ++	mov	#~7,r0
  1.4336 ++	and	r0,r15
  1.4337 ++
  1.4338 ++	mov	r4,r0
  1.4339 ++	jsr	@r0
  1.4340 ++	 mov	r15,r4
  1.4341 ++
  1.4342 ++	mov	r9,r1
  1.4343 ++	shlr8	r9
  1.4344 ++	shlr8	r9
  1.4345 ++	shlr8	r9
  1.4346 ++
  1.4347 ++	mov	#FFI_TYPE_STRUCT,r2
  1.4348 ++	cmp/eq	r2,r9
  1.4349 ++	bf	1f
  1.4350 ++#if STRUCT_VALUE_ADDRESS_WITH_ARG
  1.4351 ++ 	mov.l	@r15+,r4
  1.4352 ++	bra	2f
  1.4353 ++	 mov	#5,r2
  1.4354 ++#else
  1.4355 ++ 	mov.l	@r15+,r10
  1.4356 ++#endif
  1.4357 ++1:
  1.4358 ++	mov	#4,r2
  1.4359 ++2:
  1.4360 ++	mov	#4,r3
  1.4361 ++
  1.4362 ++L_pass:
  1.4363 ++	cmp/pl	r8
  1.4364 ++	bf	L_call_it
  1.4365 ++
  1.4366 ++	mov	r1,r0
  1.4367 ++	and	#3,r0
  1.4368 ++
  1.4369 ++L_pass_d:
  1.4370 ++	cmp/eq	#FFI_TYPE_DOUBLE,r0
  1.4371 ++	bf	L_pass_f
  1.4372 ++
  1.4373 ++	mov	r3,r0
  1.4374 ++	and	#1,r0
  1.4375 ++	tst	r0,r0
  1.4376 ++	bt	1f
  1.4377 ++	add	#1,r3
  1.4378 ++1:
  1.4379 ++	mov	r15,r0
  1.4380 ++	and	#7,r0
  1.4381 ++	tst	r0,r0
  1.4382 ++	bt	2f
  1.4383 ++	add	#4,r15
  1.4384 ++2:
  1.4385 ++	mov	#12,r0
  1.4386 ++	cmp/hs	r0,r3
  1.4387 ++	bt/s	3f
  1.4388 ++	 shlr2	r1
  1.4389 ++	bsr	L_pop_d
  1.4390 ++	 nop
  1.4391 ++3:
  1.4392 ++	add	#2,r3
  1.4393 ++	bra	L_pass
  1.4394 ++	 add	#-8,r8
  1.4395 ++
  1.4396 ++L_pop_d:
  1.4397 ++	mov	r3,r0
  1.4398 ++	add	r0,r0
  1.4399 ++	add	r3,r0
  1.4400 ++	add	#-12,r0
  1.4401 ++	braf	r0
  1.4402 ++	 nop
  1.4403 ++#ifdef __LITTLE_ENDIAN__
  1.4404 ++	fmov.s	@r15+,fr5
  1.4405 ++	rts
  1.4406 ++	 fmov.s	@r15+,fr4
  1.4407 ++	fmov.s	@r15+,fr7
  1.4408 ++	rts
  1.4409 ++	 fmov.s	@r15+,fr6
  1.4410 ++	fmov.s	@r15+,fr9
  1.4411 ++	rts
  1.4412 ++	 fmov.s	@r15+,fr8
  1.4413 ++	fmov.s	@r15+,fr11
  1.4414 ++	rts
  1.4415 ++	 fmov.s	@r15+,fr10
  1.4416 ++#else
  1.4417 ++	fmov.s	@r15+,fr4
  1.4418 ++	rts
  1.4419 ++	 fmov.s	@r15+,fr5
  1.4420 ++	fmov.s	@r15+,fr6
  1.4421 ++	rts
  1.4422 ++	 fmov.s	@r15+,fr7
  1.4423 ++	fmov.s	@r15+,fr8
  1.4424 ++	rts
  1.4425 ++	 fmov.s	@r15+,fr9
  1.4426 ++	fmov.s	@r15+,fr10
  1.4427 ++	rts
  1.4428 ++	 fmov.s	@r15+,fr11
  1.4429 ++#endif
  1.4430 ++
  1.4431 ++L_pass_f:
  1.4432 ++	cmp/eq	#FFI_TYPE_FLOAT,r0
  1.4433 ++	bf	L_pass_i
  1.4434 ++
  1.4435 ++	mov	#12,r0
  1.4436 ++	cmp/hs	r0,r3
  1.4437 ++	bt/s	2f
  1.4438 ++	 shlr2	r1
  1.4439 ++	bsr	L_pop_f
  1.4440 ++	 nop
  1.4441 ++2:
  1.4442 ++	add	#1,r3
  1.4443 ++	bra	L_pass
  1.4444 ++	 add	#-4,r8
  1.4445 ++
  1.4446 ++L_pop_f:
  1.4447 ++	mov	r3,r0
  1.4448 ++	shll2	r0
  1.4449 ++	add	#-16,r0
  1.4450 ++	braf	r0
  1.4451 ++	 nop
  1.4452 ++#ifdef __LITTLE_ENDIAN__
  1.4453 ++	rts
  1.4454 ++	 fmov.s	@r15+,fr5
  1.4455 ++	rts
  1.4456 ++	 fmov.s	@r15+,fr4
  1.4457 ++	rts
  1.4458 ++	 fmov.s	@r15+,fr7
  1.4459 ++	rts
  1.4460 ++	 fmov.s	@r15+,fr6
  1.4461 ++	rts
  1.4462 ++	 fmov.s	@r15+,fr9
  1.4463 ++	rts
  1.4464 ++	 fmov.s	@r15+,fr8
  1.4465 ++	rts
  1.4466 ++	 fmov.s	@r15+,fr11
  1.4467 ++	rts
  1.4468 ++	 fmov.s	@r15+,fr10
  1.4469 ++#else
  1.4470 ++	rts
  1.4471 ++	 fmov.s	@r15+,fr4
  1.4472 ++	rts
  1.4473 ++	 fmov.s	@r15+,fr5
  1.4474 ++	rts
  1.4475 ++	 fmov.s	@r15+,fr6
  1.4476 ++	rts
  1.4477 ++	 fmov.s	@r15+,fr7
  1.4478 ++	rts
  1.4479 ++	 fmov.s	@r15+,fr8
  1.4480 ++	rts
  1.4481 ++	 fmov.s	@r15+,fr9
  1.4482 ++	rts
  1.4483 ++	 fmov.s	@r15+,fr10
  1.4484 ++	rts
  1.4485 ++	 fmov.s	@r15+,fr11
  1.4486 ++#endif
  1.4487 ++
  1.4488 ++L_pass_i:
  1.4489 ++	cmp/eq	#FFI_TYPE_INT,r0
  1.4490 ++	bf	L_call_it
  1.4491 ++
  1.4492 ++	mov	#8,r0
  1.4493 ++	cmp/hs	r0,r2
  1.4494 ++	bt/s	2f
  1.4495 ++	 shlr2	r1
  1.4496 ++	bsr	L_pop_i
  1.4497 ++	 nop
  1.4498 ++2:
  1.4499 ++	add	#1,r2
  1.4500 ++	bra	L_pass
  1.4501 ++	 add	#-4,r8
  1.4502 ++
  1.4503 ++L_pop_i:
  1.4504 ++	mov	r2,r0
  1.4505 ++	shll2	r0
  1.4506 ++	add	#-16,r0
  1.4507 ++	braf	r0
  1.4508 ++	 nop
  1.4509 ++	rts
  1.4510 ++	 mov.l	@r15+,r4
  1.4511 ++	rts
  1.4512 ++	 mov.l	@r15+,r5
  1.4513 ++	rts
  1.4514 ++	 mov.l	@r15+,r6
  1.4515 ++	rts
  1.4516 ++	 mov.l	@r15+,r7
  1.4517 ++
  1.4518 ++L_call_it:
  1.4519 ++	# call function
  1.4520 ++#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
  1.4521 ++	mov	r10, r2
  1.4522 ++#endif
  1.4523 ++	mov.l  @(28,r14),r1
  1.4524 ++	jsr    @r1
  1.4525 ++	 nop
  1.4526 ++
  1.4527 ++L_ret_d:
  1.4528 ++	mov	#FFI_TYPE_DOUBLE,r2
  1.4529 ++	cmp/eq	r2,r9
  1.4530 ++	bf	L_ret_ll
  1.4531 ++
  1.4532 ++	mov.l	@(24,r14),r1
  1.4533 ++#ifdef __LITTLE_ENDIAN__
  1.4534 ++	fmov.s	fr1,@r1
  1.4535 ++	add	#4,r1
  1.4536 ++	bra	L_epilogue
  1.4537 ++	 fmov.s	fr0,@r1
  1.4538 ++#else
  1.4539 ++	fmov.s	fr0,@r1
  1.4540 ++	add	#4,r1
  1.4541 ++	bra	L_epilogue
  1.4542 ++	 fmov.s	fr1,@r1
  1.4543 ++#endif
  1.4544 ++
  1.4545 ++L_ret_ll:
  1.4546 ++	mov	#FFI_TYPE_SINT64,r2
  1.4547 ++	cmp/eq	r2,r9
  1.4548 ++	bt/s	1f
  1.4549 ++	 mov	#FFI_TYPE_UINT64,r2
  1.4550 ++	cmp/eq	r2,r9
  1.4551 ++	bf	L_ret_f
  1.4552 ++
  1.4553 ++1:
  1.4554 ++	mov.l	@(24,r14),r2
  1.4555 ++	mov.l	r0,@r2
  1.4556 ++	bra	L_epilogue
  1.4557 ++	 mov.l	r1,@(4,r2)
  1.4558 ++
  1.4559 ++L_ret_f:
  1.4560 ++	mov	#FFI_TYPE_FLOAT,r2
  1.4561 ++	cmp/eq	r2,r9
  1.4562 ++	bf	L_ret_i
  1.4563 ++
  1.4564 ++	mov.l	@(24,r14),r1
  1.4565 ++	bra	L_epilogue
  1.4566 ++	 fmov.s	fr0,@r1
  1.4567 ++
  1.4568 ++L_ret_i:
  1.4569 ++	mov	#FFI_TYPE_INT,r2
  1.4570 ++	cmp/eq	r2,r9
  1.4571 ++	bf	L_epilogue
  1.4572 ++
  1.4573 ++	mov.l	@(24,r14),r1
  1.4574 ++	bra	L_epilogue
  1.4575 ++	 mov.l	r0,@r1
  1.4576 ++
  1.4577 ++L_epilogue:
  1.4578 ++	# Remove the space we pushed for the args
  1.4579 ++	mov   r14,r15
  1.4580 ++
  1.4581 ++	lds.l  @r15+,pr
  1.4582 ++	mov.l  @r15+,r14
  1.4583 ++	mov.l  @r15+,r12
  1.4584 ++	mov.l  @r15+,r10
  1.4585 ++	mov.l  @r15+,r9
  1.4586 ++	rts
  1.4587 ++	 mov.l  @r15+,r8
  1.4588 ++#else
  1.4589 ++	mov	r6,r8
  1.4590 ++	mov	r7,r9
  1.4591 ++
  1.4592 ++	sub	r6,r15
  1.4593 ++	add	#-16,r15
  1.4594 ++	mov	#~7,r0
  1.4595 ++	and	r0,r15
  1.4596 ++
  1.4597 ++	mov	r4,r0
  1.4598 ++	jsr	@r0
  1.4599 ++	 mov	r15,r4
  1.4600 ++
  1.4601 ++	mov	r9,r3
  1.4602 ++	shlr8	r9
  1.4603 ++	shlr8	r9
  1.4604 ++	shlr8	r9
  1.4605 ++
  1.4606 ++	mov	#FFI_TYPE_STRUCT,r2
  1.4607 ++	cmp/eq	r2,r9
  1.4608 ++	bf	1f
  1.4609 ++#if STRUCT_VALUE_ADDRESS_WITH_ARG
  1.4610 ++	mov.l	@r15+,r4
  1.4611 ++	bra	2f
  1.4612 ++	 mov	#5,r2
  1.4613 ++#else
  1.4614 ++	mov.l	@r15+,r10
  1.4615 ++#endif
  1.4616 ++1:
  1.4617 ++	mov	#4,r2
  1.4618 ++2:
  1.4619 ++
  1.4620 ++L_pass:
  1.4621 ++	cmp/pl	r8
  1.4622 ++	bf	L_call_it
  1.4623 ++
  1.4624 ++	mov	r3,r0
  1.4625 ++	and	#3,r0
  1.4626 ++
  1.4627 ++L_pass_d:
  1.4628 ++	cmp/eq	#FFI_TYPE_DOUBLE,r0
  1.4629 ++	bf	L_pass_i
  1.4630 ++
  1.4631 ++	mov	r15,r0
  1.4632 ++	and	#7,r0
  1.4633 ++	tst	r0,r0
  1.4634 ++	bt	1f
  1.4635 ++	add	#4,r15
  1.4636 ++1:
  1.4637 ++	mov	#8,r0
  1.4638 ++	cmp/hs	r0,r2
  1.4639 ++	bt/s	2f
  1.4640 ++	 shlr2	r3
  1.4641 ++	bsr	L_pop_d
  1.4642 ++	 nop
  1.4643 ++2:
  1.4644 ++	add	#2,r2
  1.4645 ++	bra	L_pass
  1.4646 ++	 add	#-8,r8
  1.4647 ++
  1.4648 ++L_pop_d:
  1.4649 ++	mov	r2,r0
  1.4650 ++	add	r0,r0
  1.4651 ++	add	r2,r0
  1.4652 ++	add	#-12,r0
  1.4653 ++	add	r0,r0
  1.4654 ++	braf	r0
  1.4655 ++	 nop
  1.4656 ++	mov.l	@r15+,r4
  1.4657 ++	rts
  1.4658 ++	 mov.l	@r15+,r5
  1.4659 ++	mov.l	@r15+,r5
  1.4660 ++	rts
  1.4661 ++	 mov.l	@r15+,r6
  1.4662 ++	mov.l	@r15+,r6
  1.4663 ++	rts
  1.4664 ++	 mov.l	@r15+,r7
  1.4665 ++	rts
  1.4666 ++	 mov.l	@r15+,r7
  1.4667 ++
  1.4668 ++L_pass_i:
  1.4669 ++	mov	#8,r0
  1.4670 ++	cmp/hs	r0,r2
  1.4671 ++	bt/s	2f
  1.4672 ++	 shlr2	r3
  1.4673 ++	bsr	L_pop_i
  1.4674 ++	 nop
  1.4675 ++2:
  1.4676 ++	add	#1,r2
  1.4677 ++	bra	L_pass
  1.4678 ++	 add	#-4,r8
  1.4679 ++
  1.4680 ++L_pop_i:
  1.4681 ++	mov	r2,r0
  1.4682 ++	shll2	r0
  1.4683 ++	add	#-16,r0
  1.4684 ++	braf	r0
  1.4685 ++	 nop
  1.4686 ++	rts
  1.4687 ++	 mov.l	@r15+,r4
  1.4688 ++	rts
  1.4689 ++	 mov.l	@r15+,r5
  1.4690 ++	rts
  1.4691 ++	 mov.l	@r15+,r6
  1.4692 ++	rts
  1.4693 ++	 mov.l	@r15+,r7
  1.4694 ++
  1.4695 ++L_call_it:
  1.4696 ++	# call function
  1.4697 ++#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
  1.4698 ++	mov	r10, r2
  1.4699 ++#endif
  1.4700 ++	mov.l  @(28,r14),r1
  1.4701 ++	jsr    @r1
  1.4702 ++	 nop
  1.4703 ++
  1.4704 ++L_ret_d:
  1.4705 ++	mov	#FFI_TYPE_DOUBLE,r2
  1.4706 ++	cmp/eq	r2,r9
  1.4707 ++	bf	L_ret_ll
  1.4708 ++
  1.4709 ++	mov.l	@(24,r14),r2
  1.4710 ++	mov.l	r0,@r2
  1.4711 ++	bra	L_epilogue
  1.4712 ++	 mov.l	r1,@(4,r2)
  1.4713 ++
  1.4714 ++L_ret_ll:
  1.4715 ++	mov	#FFI_TYPE_SINT64,r2
  1.4716 ++	cmp/eq	r2,r9
  1.4717 ++	bt/s	1f
  1.4718 ++	 mov	#FFI_TYPE_UINT64,r2
  1.4719 ++	cmp/eq	r2,r9
  1.4720 ++	bf	L_ret_i
  1.4721 ++
  1.4722 ++1:
  1.4723 ++	mov.l	@(24,r14),r2
  1.4724 ++	mov.l	r0,@r2
  1.4725 ++	bra	L_epilogue
  1.4726 ++	 mov.l	r1,@(4,r2)
  1.4727 ++
  1.4728 ++L_ret_i:
  1.4729 ++	mov	#FFI_TYPE_FLOAT,r2
  1.4730 ++	cmp/eq	r2,r9
  1.4731 ++	bt	1f
  1.4732 ++	mov	#FFI_TYPE_INT,r2
  1.4733 ++	cmp/eq	r2,r9
  1.4734 ++	bf	L_epilogue
  1.4735 ++1:
  1.4736 ++	mov.l	@(24,r14),r1
  1.4737 ++	bra	L_epilogue
  1.4738 ++	 mov.l	r0,@r1
  1.4739 ++
  1.4740 ++L_epilogue:
  1.4741 ++	# Remove the space we pushed for the args
  1.4742 ++	mov   r14,r15
  1.4743 ++
  1.4744 ++	lds.l  @r15+,pr
  1.4745 ++	mov.l  @r15+,r14
  1.4746 ++	mov.l  @r15+,r12
  1.4747 ++	mov.l  @r15+,r10
  1.4748 ++	mov.l  @r15+,r9
  1.4749 ++	rts
  1.4750 ++	 mov.l  @r15+,r8
  1.4751 ++#endif
  1.4752 ++.LFE1:
  1.4753 ++.ffi_call_SYSV_end:
  1.4754 ++        .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
  1.4755 ++
  1.4756 ++.globl	ffi_closure_helper_SYSV
  1.4757 ++
  1.4758 ++ENTRY(ffi_closure_SYSV)
  1.4759 ++.LFB2:
  1.4760 ++	mov.l	r14,@-r15
  1.4761 ++.LCFI7:
  1.4762 ++	sts.l	pr,@-r15
  1.4763 ++
  1.4764 ++	/* Stack layout:	
  1.4765 ++	   ...
  1.4766 ++	   32 bytes (floating register parameters, SH-4 only)
  1.4767 ++	   16 bytes (register parameters)
  1.4768 ++	    4 bytes (result)
  1.4769 ++	    4 bytes (5th arg)
  1.4770 ++	   <- new stack pointer
  1.4771 ++	*/
  1.4772 ++.LCFI8:
  1.4773 ++#if defined(__SH4__)
  1.4774 ++	add	#-56,r15
  1.4775 ++#else
  1.4776 ++	add	#-24,r15
  1.4777 ++#endif
  1.4778 ++.LCFI9:
  1.4779 ++	mov	r15,r14
  1.4780 ++.LCFIA:
  1.4781 ++	mov	r14,r1
  1.4782 ++	add	#24,r1
  1.4783 ++	mov.l	r7,@-r1
  1.4784 ++	mov.l	r6,@-r1
  1.4785 ++	mov.l	r5,@-r1
  1.4786 ++	mov.l	r4,@-r1
  1.4787 ++	mov	r1,r6
  1.4788 ++
  1.4789 ++#if defined(__SH4__)
  1.4790 ++	mov	r14,r1
  1.4791 ++	add	#56,r1
  1.4792 ++#ifdef __LITTLE_ENDIAN__
  1.4793 ++	fmov.s	fr10,@-r1
  1.4794 ++	fmov.s	fr11,@-r1
  1.4795 ++	fmov.s	fr8,@-r1
  1.4796 ++	fmov.s	fr9,@-r1
  1.4797 ++	fmov.s	fr6,@-r1
  1.4798 ++	fmov.s	fr7,@-r1
  1.4799 ++	fmov.s	fr4,@-r1
  1.4800 ++	fmov.s	fr5,@-r1
  1.4801 ++#else
  1.4802 ++	fmov.s	fr11,@-r1
  1.4803 ++	fmov.s	fr10,@-r1
  1.4804 ++	fmov.s	fr9,@-r1
  1.4805 ++	fmov.s	fr8,@-r1
  1.4806 ++	fmov.s	fr7,@-r1
  1.4807 ++	fmov.s	fr6,@-r1
  1.4808 ++	fmov.s	fr5,@-r1
  1.4809 ++	fmov.s	fr4,@-r1
  1.4810 ++#endif
  1.4811 ++	mov	r1,r7
  1.4812 ++#endif
  1.4813 ++
  1.4814 ++	mov	r14,r1
  1.4815 ++	add	#4,r1
  1.4816 ++	mov	r1,r5
  1.4817 ++
  1.4818 ++	mov	r14,r1
  1.4819 ++#if defined(__SH4__)
  1.4820 ++	add	#64,r1
  1.4821 ++#else
  1.4822 ++	add	#32,r1
  1.4823 ++#endif
  1.4824 ++	mov.l	r1,@r14
  1.4825 ++
  1.4826 ++	mov.l	L_helper,r0
  1.4827 ++	jsr	@r0
  1.4828 ++	 mov	r3,r4
  1.4829 ++
  1.4830 ++	shll	r0
  1.4831 ++	mov	r0,r1
  1.4832 ++	mova	L_table,r0
  1.4833 ++	add	r1,r0
  1.4834 ++	mov.w	@r0,r0
  1.4835 ++	mov	r14,r2
  1.4836 ++	braf	r0
  1.4837 ++	 add	#4,r2
  1.4838 ++0:
  1.4839 ++	.align 2
  1.4840 ++L_helper:
  1.4841 ++	.long	ffi_closure_helper_SYSV
  1.4842 ++L_table:
  1.4843 ++	.short L_case_v - 0b	/* FFI_TYPE_VOID */
  1.4844 ++	.short L_case_i - 0b	/* FFI_TYPE_INT */
  1.4845 ++#if defined(__SH4__)
  1.4846 ++	.short L_case_f - 0b	/* FFI_TYPE_FLOAT */
  1.4847 ++	.short L_case_d - 0b	/* FFI_TYPE_DOUBLE */
  1.4848 ++	.short L_case_d - 0b	/* FFI_TYPE_LONGDOUBLE */
  1.4849 ++#else
  1.4850 ++	.short L_case_i - 0b	/* FFI_TYPE_FLOAT */
  1.4851 ++	.short L_case_ll - 0b	/* FFI_TYPE_DOUBLE */
  1.4852 ++	.short L_case_ll - 0b	/* FFI_TYPE_LONGDOUBLE */
  1.4853 ++#endif
  1.4854 ++	.short L_case_uq - 0b	/* FFI_TYPE_UINT8 */
  1.4855 ++	.short L_case_q - 0b	/* FFI_TYPE_SINT8 */
  1.4856 ++	.short L_case_uh - 0b	/* FFI_TYPE_UINT16 */
  1.4857 ++	.short L_case_h - 0b	/* FFI_TYPE_SINT16 */
  1.4858 ++	.short L_case_i - 0b	/* FFI_TYPE_UINT32 */
  1.4859 ++	.short L_case_i - 0b	/* FFI_TYPE_SINT32 */
  1.4860 ++	.short L_case_ll - 0b	/* FFI_TYPE_UINT64 */
  1.4861 ++	.short L_case_ll - 0b	/* FFI_TYPE_SINT64 */
  1.4862 ++	.short L_case_v - 0b	/* FFI_TYPE_STRUCT */
  1.4863 ++	.short L_case_i - 0b	/* FFI_TYPE_POINTER */
  1.4864 ++
  1.4865 ++#if defined(__SH4__)
  1.4866 ++L_case_d:
  1.4867 ++#ifdef __LITTLE_ENDIAN__
  1.4868 ++	fmov.s	@r2+,fr1
  1.4869 ++	bra	L_case_v
  1.4870 ++	 fmov.s	@r2,fr0
  1.4871 ++#else
  1.4872 ++	fmov.s	@r2+,fr0
  1.4873 ++	bra	L_case_v
  1.4874 ++	 fmov.s	@r2,fr1
  1.4875 ++#endif
  1.4876 ++
  1.4877 ++L_case_f:
  1.4878 ++	bra	L_case_v
  1.4879 ++	 fmov.s	@r2,fr0
  1.4880 ++#endif
  1.4881 ++	
  1.4882 ++L_case_ll:
  1.4883 ++	mov.l	@r2+,r0
  1.4884 ++	bra	L_case_v
  1.4885 ++	 mov.l	@r2,r1
  1.4886 ++	
  1.4887 ++L_case_i:
  1.4888 ++	bra	L_case_v
  1.4889 ++	 mov.l	@r2,r0
  1.4890 ++	
  1.4891 ++L_case_q:
  1.4892 ++#ifdef __LITTLE_ENDIAN__
  1.4893 ++#else
  1.4894 ++	add	#3,r2
  1.4895 ++#endif
  1.4896 ++	bra	L_case_v
  1.4897 ++	 mov.b	@r2,r0
  1.4898 ++
  1.4899 ++L_case_uq:
  1.4900 ++#ifdef __LITTLE_ENDIAN__
  1.4901 ++#else
  1.4902 ++	add	#3,r2
  1.4903 ++#endif
  1.4904 ++	mov.b	@r2,r0
  1.4905 ++	bra	L_case_v
  1.4906 ++	 extu.b r0,r0
  1.4907 ++
  1.4908 ++L_case_h:
  1.4909 ++#ifdef __LITTLE_ENDIAN__
  1.4910 ++#else
  1.4911 ++	add	#2,r2
  1.4912 ++#endif
  1.4913 ++	bra	L_case_v
  1.4914 ++	 mov.w	@r2,r0
  1.4915 ++
  1.4916 ++L_case_uh:
  1.4917 ++#ifdef __LITTLE_ENDIAN__
  1.4918 ++#else
  1.4919 ++	add	#2,r2
  1.4920 ++#endif
  1.4921 ++	mov.w	@r2,r0
  1.4922 ++	extu.w	r0,r0
  1.4923 ++	/* fall through */
  1.4924 ++
  1.4925 ++L_case_v:
  1.4926 ++#if defined(__SH4__)
  1.4927 ++	add	#56,r15
  1.4928 ++#else
  1.4929 ++	add	#24,r15
  1.4930 ++#endif
  1.4931 ++	lds.l	@r15+,pr
  1.4932 ++	rts
  1.4933 ++	 mov.l	@r15+,r14
  1.4934 ++.LFE2:
  1.4935 ++.ffi_closure_SYSV_end:
  1.4936 ++        .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
  1.4937 ++
  1.4938 ++	.section	".eh_frame","aw",@progbits
  1.4939 ++__FRAME_BEGIN__:
  1.4940 ++	.4byte	.LECIE1-.LSCIE1	/* Length of Common Information Entry */
  1.4941 ++.LSCIE1:
  1.4942 ++	.4byte	0x0	/* CIE Identifier Tag */
  1.4943 ++	.byte	0x1	/* CIE Version */
  1.4944 ++	.byte	0x0	/* CIE Augmentation */
  1.4945 ++	.byte	0x1	/* uleb128 0x1; CIE Code Alignment Factor */
  1.4946 ++	.byte	0x7c	/* sleb128 -4; CIE Data Alignment Factor */
  1.4947 ++	.byte	0x11	/* CIE RA Column */
  1.4948 ++	.byte	0xc	/* DW_CFA_def_cfa */
  1.4949 ++	.byte	0xf	/* uleb128 0xf */
  1.4950 ++	.byte	0x0	/* uleb128 0x0 */
  1.4951 ++	.align	2
  1.4952 ++.LECIE1:
  1.4953 ++.LSFDE1:
  1.4954 ++	.4byte	.LEFDE1-.LASFDE1	/* FDE Length */
  1.4955 ++.LASFDE1:
  1.4956 ++	.4byte	.LASFDE1-__FRAME_BEGIN__	/* FDE CIE offset */
  1.4957 ++	.4byte	.LFB1	/* FDE initial location */
  1.4958 ++	.4byte	.LFE1-.LFB1	 /* FDE address range */
  1.4959 ++	.byte	0x4	/* DW_CFA_advance_loc4 */
  1.4960 ++	.4byte	.LCFI0-.LFB1
  1.4961 ++	.byte	0xe	/* DW_CFA_def_cfa_offset */
  1.4962 ++	.byte	0x4	/* uleb128 0x4 */
  1.4963 ++	.byte	0x4	/* DW_CFA_advance_loc4 */
  1.4964 ++	.4byte	.LCFI1-.LCFI0
  1.4965 ++	.byte	0xe	/* DW_CFA_def_cfa_offset */
  1.4966 ++	.byte	0x8	/* uleb128 0x4 */
  1.4967 ++	.byte	0x4	/* DW_CFA_advance_loc4 */
  1.4968 ++	.4byte	.LCFI2-.LCFI1
  1.4969 ++	.byte	0xe	/* DW_CFA_def_cfa_offset */
  1.4970 ++	.byte	0xc	/* uleb128 0x4 */
  1.4971 ++	.byte	0x4	/* DW_CFA_advance_loc4 */
  1.4972 ++	.4byte	.LCFI3-.LCFI2
  1.4973 ++	.byte	0xe	/* DW_CFA_def_cfa_offset */
  1.4974 ++	.byte	0x10	/* uleb128 0x4 */
  1.4975 ++	.byte	0x4	/* DW_CFA_advance_loc4 */
  1.4976 ++	.4byte	.LCFI4-.LCFI3
  1.4977 ++	.byte	0xe	/* DW_CFA_def_cfa_offset */
  1.4978 ++	.byte	0x14	/* uleb128 0x4 */
  1.4979 ++	.byte	0x4	/* DW_CFA_advance_loc4 */
  1.4980 ++	.4byte	.LCFI5-.LCFI4
  1.4981 ++	.byte	0xe	/* DW_CFA_def_cfa_offset */
  1.4982 ++	.byte	0x18	/* uleb128 0x4 */
  1.4983 ++	.byte	0x91	/* DW_CFA_offset, column 0x11 */
  1.4984 ++	.byte	0x6	/* uleb128 0x6 */
  1.4985 ++	.byte	0x8e	/* DW_CFA_offset, column 0xe */
  1.4986 ++	.byte	0x5	/* uleb128 0x5 */
  1.4987 ++	.byte	0x8c	/* DW_CFA_offset, column 0xc */
  1.4988 ++	.byte	0x4	/* uleb128 0x4 */
  1.4989 ++	.byte	0x8a	/* DW_CFA_offset, column 0xa */
  1.4990 ++	.byte	0x3	/* uleb128 0x3 */
  1.4991 ++	.byte	0x89	/* DW_CFA_offset, column 0x9 */
  1.4992 ++	.byte	0x2	/* uleb128 0x2 */
  1.4993 ++	.byte	0x88	/* DW_CFA_offset, column 0x8 */
  1.4994 ++	.byte	0x1	/* uleb128 0x1 */
  1.4995 ++	.byte	0x4	/* DW_CFA_advance_loc4 */
  1.4996 ++	.4byte	.LCFI6-.LCFI5
  1.4997 ++	.byte	0xd	/* DW_CFA_def_cfa_register */
  1.4998 ++	.byte	0xe	/* uleb128 0xe */
  1.4999 ++	.align	2
  1.5000 ++.LEFDE1:
  1.5001 ++
  1.5002 ++.LSFDE3:
  1.5003 ++	.4byte	.LEFDE3-.LASFDE3	/* FDE Length */
  1.5004 ++.LASFDE3:
  1.5005 ++	.4byte	.LASFDE3-__FRAME_BEGIN__	/* FDE CIE offset */
  1.5006 ++	.4byte	.LFB2	/* FDE initial location */
  1.5007 ++	.4byte	.LFE2-.LFB2	 /* FDE address range */
  1.5008 ++	.byte	0x4	/* DW_CFA_advance_loc4 */
  1.5009 ++	.4byte	.LCFI7-.LFB2
  1.5010 ++	.byte	0xe	/* DW_CFA_def_cfa_offset */
  1.5011 ++	.byte	0x4	/* uleb128 0x4 */
  1.5012 ++	.byte	0x4	/* DW_CFA_advance_loc4 */
  1.5013 ++	.4byte	.LCFI8-.LCFI7
  1.5014 ++	.byte	0xe	/* DW_CFA_def_cfa_offset */
  1.5015 ++	.byte	0x8	/* uleb128 0x8 */
  1.5016 ++	.byte	0x4	/* DW_CFA_advance_loc4 */
  1.5017 ++	.4byte	.LCFI9-.LCFI8
  1.5018 ++	.byte	0xe	/* DW_CFA_def_cfa_offset */
  1.5019 ++#if defined(__SH4__)
  1.5020 ++	.byte	8+56	/* uleb128 8+56 */
  1.5021 ++#else
  1.5022 ++	.byte	8+24	/* uleb128 8+24 */
  1.5023 ++#endif
  1.5024 ++	.byte	0x91	/* DW_CFA_offset, column 0x11 */
  1.5025 ++        .byte	0x2
  1.5026 ++        .byte	0x8e	/* DW_CFA_offset, column 0xe */
  1.5027 ++        .byte	0x1
  1.5028 ++	.byte	0x4	/* DW_CFA_advance_loc4 */
  1.5029 ++	.4byte	.LCFIA-.LCFI9
  1.5030 ++	.byte	0xd	/* DW_CFA_def_cfa_register */
  1.5031 ++	.byte	0xe	/* uleb128 0xe */
  1.5032 ++	.align	2
  1.5033 ++.LEFDE3:
  1.5034 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/ffi.c gcc/libffi/src/sparc/ffi.c
  1.5035 +--- gcc-3.2.2.orig/libffi/src/sparc/ffi.c	Sat Mar  3 07:21:23 2001
  1.5036 ++++ gcc/libffi/src/sparc/ffi.c	Sat Jan  4 08:08:56 2003
  1.5037 +@@ -1,5 +1,5 @@
  1.5038 + /* -----------------------------------------------------------------------
  1.5039 +-   ffi.c - Copyright (c) 1996 Cygnus Solutions
  1.5040 ++   ffi.c - Copyright (c) 1996, 2003 Cygnus Solutions
  1.5041 +    
  1.5042 +    Sparc Foreign Function Interface 
  1.5043 + 
  1.5044 +@@ -28,20 +28,22 @@
  1.5045 + 
  1.5046 + #include <stdlib.h>
  1.5047 + 
  1.5048 ++#ifdef SPARC64
  1.5049 ++extern void ffi_closure_v9(void);
  1.5050 ++#else
  1.5051 ++extern void ffi_closure_v8(void);
  1.5052 ++#endif
  1.5053 ++
  1.5054 + /* ffi_prep_args is called by the assembly routine once stack space
  1.5055 +    has been allocated for the function's arguments */
  1.5056 + 
  1.5057 + void ffi_prep_args_v8(char *stack, extended_cif *ecif)
  1.5058 + {
  1.5059 +   int i;
  1.5060 +-  int tmp;
  1.5061 +-  int avn;
  1.5062 +   void **p_argv;
  1.5063 +   char *argp;
  1.5064 +   ffi_type **p_arg;
  1.5065 + 
  1.5066 +-  tmp = 0;
  1.5067 +-
  1.5068 +   /* Skip 16 words for the window save area */
  1.5069 +   argp = stack + 16*sizeof(int);
  1.5070 + 
  1.5071 +@@ -66,18 +68,12 @@
  1.5072 +   ((int*)argp)[5] = 0;
  1.5073 + #endif
  1.5074 + 
  1.5075 +-  avn = ecif->cif->nargs;
  1.5076 +   p_argv = ecif->avalue;
  1.5077 + 
  1.5078 +-  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
  1.5079 +-       i && avn;
  1.5080 +-       i--, p_arg++)
  1.5081 ++  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++)
  1.5082 +     {
  1.5083 +       size_t z;
  1.5084 + 
  1.5085 +-      if (avn) 
  1.5086 +-	{
  1.5087 +-	  avn--;
  1.5088 + 	  if ((*p_arg)->type == FFI_TYPE_STRUCT
  1.5089 + #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
  1.5090 + 	      || (*p_arg)->type == FFI_TYPE_LONGDOUBLE
  1.5091 +@@ -122,7 +118,6 @@
  1.5092 + 	    }
  1.5093 + 	  p_argv++;
  1.5094 + 	  argp += z;
  1.5095 +-	}
  1.5096 +     }
  1.5097 +   
  1.5098 +   return;
  1.5099 +@@ -420,3 +415,101 @@
  1.5100 +     }
  1.5101 + 
  1.5102 + }
  1.5103 ++
  1.5104 ++ffi_status
  1.5105 ++ffi_prep_closure (ffi_closure* closure,
  1.5106 ++		  ffi_cif* cif,
  1.5107 ++		  void (*fun)(ffi_cif*, void*, void**, void*),
  1.5108 ++		  void *user_data)
  1.5109 ++{
  1.5110 ++  unsigned int *tramp = (unsigned int *) &closure->tramp[0];
  1.5111 ++  unsigned long fn;
  1.5112 ++  unsigned long ctx = (unsigned long) closure;
  1.5113 ++
  1.5114 ++#ifdef SPARC64
  1.5115 ++  /* Trampoline address is equal to the closure address.  We take advantage
  1.5116 ++     of that to reduce the trampoline size by 8 bytes. */
  1.5117 ++  FFI_ASSERT (cif->abi == FFI_V9);
  1.5118 ++  fn = (unsigned long) ffi_closure_v9;
  1.5119 ++  tramp[0] = 0x83414000;	/* rd	%pc, %g1	*/
  1.5120 ++  tramp[1] = 0xca586010;	/* ldx	[%g1+16], %g5	*/
  1.5121 ++  tramp[2] = 0x81c14000;	/* jmp	%g5		*/
  1.5122 ++  tramp[3] = 0x01000000;	/* nop			*/
  1.5123 ++  *((unsigned long *) &tramp[4]) = fn;
  1.5124 ++#else
  1.5125 ++  FFI_ASSERT (cif->abi == FFI_V8);
  1.5126 ++  fn = (unsigned long) ffi_closure_v8;
  1.5127 ++  tramp[0] = 0x03000000 | fn >> 10;	/* sethi %hi(fn), %g1	*/
  1.5128 ++  tramp[1] = 0x05000000 | ctx >> 10;	/* sethi %hi(ctx), %g2	*/
  1.5129 ++  tramp[2] = 0x81c06000 | (fn & 0x3ff);	/* jmp   %g1+%lo(fn)	*/
  1.5130 ++  tramp[3] = 0x8410a000 | (ctx & 0x3ff);/* or    %g2, %lo(ctx)	*/
  1.5131 ++#endif
  1.5132 ++
  1.5133 ++  closure->cif = cif;
  1.5134 ++  closure->fun = fun;
  1.5135 ++  closure->user_data = user_data;
  1.5136 ++
  1.5137 ++  /* Flush the Icache.  FIXME: alignment isn't certain, assume 8 bytes */
  1.5138 ++#ifdef SPARC64
  1.5139 ++  asm volatile ("flush	%0" : : "r" (closure) : "memory");
  1.5140 ++  asm volatile ("flush	%0" : : "r" (((char *) closure) + 8) : "memory");
  1.5141 ++#else
  1.5142 ++  asm volatile ("iflush	%0" : : "r" (closure) : "memory");
  1.5143 ++  asm volatile ("iflush	%0" : : "r" (((char *) closure) + 8) : "memory");
  1.5144 ++#endif
  1.5145 ++
  1.5146 ++  return FFI_OK;
  1.5147 ++}
  1.5148 ++
  1.5149 ++int
  1.5150 ++ffi_closure_sparc_inner(ffi_closure *closure,
  1.5151 ++  void *rvalue, unsigned long *gpr, double *fpr)
  1.5152 ++{
  1.5153 ++  ffi_cif *cif;
  1.5154 ++  void **avalue;
  1.5155 ++  ffi_type **arg_types;
  1.5156 ++  int i, avn, argn;
  1.5157 ++
  1.5158 ++  cif = closure->cif;
  1.5159 ++  avalue = alloca(cif->nargs * sizeof(void *));
  1.5160 ++
  1.5161 ++  argn = 0;
  1.5162 ++
  1.5163 ++  /* Copy the caller's structure return address to that the closure
  1.5164 ++     returns the data directly to the caller.  */
  1.5165 ++  if (cif->flags == FFI_TYPE_STRUCT)
  1.5166 ++    {
  1.5167 ++      rvalue = (void *) gpr[0];
  1.5168 ++      argn = 1;
  1.5169 ++    }
  1.5170 ++
  1.5171 ++  i = 0;
  1.5172 ++  avn = cif->nargs;
  1.5173 ++  arg_types = cif->arg_types;
  1.5174 ++  
  1.5175 ++  /* Grab the addresses of the arguments from the stack frame.  */
  1.5176 ++  while (i < avn)
  1.5177 ++    {
  1.5178 ++      /* Assume big-endian.  FIXME */
  1.5179 ++      argn += ALIGN(arg_types[i]->size, SIZEOF_ARG) / SIZEOF_ARG;
  1.5180 ++
  1.5181 ++#ifdef SPARC64
  1.5182 ++      if (i < 6 && (arg_types[i]->type == FFI_TYPE_FLOAT
  1.5183 ++		 || arg_types[i]->type == FFI_TYPE_DOUBLE
  1.5184 ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
  1.5185 ++		 || arg_types[i]->type == FFI_TYPE_LONGDOUBLE
  1.5186 ++#endif
  1.5187 ++		))
  1.5188 ++        avalue[i] = ((char *) &fpr[argn]) - arg_types[i]->size;
  1.5189 ++      else
  1.5190 ++#endif
  1.5191 ++        avalue[i] = ((char *) &gpr[argn]) - arg_types[i]->size;
  1.5192 ++      i++;
  1.5193 ++    }
  1.5194 ++
  1.5195 ++  /* Invoke the closure.  */
  1.5196 ++  (closure->fun) (cif, rvalue, avalue, closure->user_data);
  1.5197 ++
  1.5198 ++  /* Tell ffi_closure_sparc how to perform return type promotions.  */
  1.5199 ++  return cif->rtype->type;
  1.5200 ++}
  1.5201 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/v8.S gcc/libffi/src/sparc/v8.S
  1.5202 +--- gcc-3.2.2.orig/libffi/src/sparc/v8.S	Mon Apr 29 05:12:04 2002
  1.5203 ++++ gcc/libffi/src/sparc/v8.S	Sat Jan  4 08:08:56 2003
  1.5204 +@@ -1,5 +1,5 @@
  1.5205 + /* -----------------------------------------------------------------------
  1.5206 +-   v8.S - Copyright (c) 1996, 1997 Cygnus Solutions
  1.5207 ++   v8.S - Copyright (c) 1996, 1997, 2003 Cygnus Solutions
  1.5208 +    
  1.5209 +    Sparc Foreign Function Interface 
  1.5210 + 
  1.5211 +@@ -94,6 +94,72 @@
  1.5212 + .ffi_call_V8_end:
  1.5213 + 	.size	ffi_call_V8,.ffi_call_V8_end-ffi_call_V8
  1.5214 + 
  1.5215 ++
  1.5216 ++#define	STACKFRAME	104	/* 16*4 register window +
  1.5217 ++				   1*4 struct return +	
  1.5218 ++				   6*4 args backing store +
  1.5219 ++				   3*4 locals */
  1.5220 ++
  1.5221 ++/* ffi_closure_v8(...)
  1.5222 ++
  1.5223 ++   Receives the closure argument in %g2.   */
  1.5224 ++
  1.5225 ++	.text
  1.5226 ++	.align 8
  1.5227 ++	.globl ffi_closure_v8
  1.5228 ++
  1.5229 ++ffi_closure_v8:
  1.5230 ++	.register	%g2, #scratch
  1.5231 ++.LLFB2:
  1.5232 ++	save	%sp, -STACKFRAME, %sp
  1.5233 ++.LLCFI1:
  1.5234 ++
  1.5235 ++	! Store all of the potential argument registers in va_list format.
  1.5236 ++	st	%i0, [%fp+68+0]
  1.5237 ++	st	%i1, [%fp+68+4]
  1.5238 ++	st	%i2, [%fp+68+8]
  1.5239 ++	st	%i3, [%fp+68+12]
  1.5240 ++	st	%i4, [%fp+68+16]
  1.5241 ++	st	%i5, [%fp+68+20]
  1.5242 ++
  1.5243 ++	! Call ffi_closure_sparc_inner to do the bulk of the work.
  1.5244 ++	mov	%g2, %o0
  1.5245 ++	add	%fp, -8, %o1
  1.5246 ++	add	%fp,  68, %o2
  1.5247 ++	call	ffi_closure_sparc_inner
  1.5248 ++	 mov	0, %o3
  1.5249 ++
  1.5250 ++	! Load up the return value in the proper type.
  1.5251 ++	cmp	%o0, FFI_TYPE_VOID
  1.5252 ++	be	done1
  1.5253 ++
  1.5254 ++	cmp	%o0, FFI_TYPE_FLOAT
  1.5255 ++	be,a	done1
  1.5256 ++	 ld	[%fp-8], %f0
  1.5257 ++
  1.5258 ++	cmp	%o0, FFI_TYPE_DOUBLE
  1.5259 ++	be,a	done1
  1.5260 ++	 ldd	[%fp-8], %f0
  1.5261 ++
  1.5262 ++	cmp	%o0, FFI_TYPE_SINT64
  1.5263 ++	be,a	integer
  1.5264 ++	 ld	[%fp-4], %i1
  1.5265 ++
  1.5266 ++	cmp	%o0, FFI_TYPE_UINT64
  1.5267 ++	be,a	integer
  1.5268 ++	 ld	[%fp-4], %i1
  1.5269 ++
  1.5270 ++integer:
  1.5271 ++	ld	[%fp-8], %i0
  1.5272 ++
  1.5273 ++done1:
  1.5274 ++	ret
  1.5275 ++	 restore
  1.5276 ++.LLFE2:
  1.5277 ++
  1.5278 ++.ffi_closure_v8_end:
  1.5279 ++	.size	ffi_closure_v8,.ffi_closure_v8_end-ffi_closure_v8
  1.5280 ++
  1.5281 + #ifdef SPARC64
  1.5282 + #define WS 8
  1.5283 + #define nword	xword
  1.5284 +@@ -148,3 +214,26 @@
  1.5285 + 	.byte	0x1f	! uleb128 0x1f
  1.5286 + 	.align	WS
  1.5287 + .LLEFDE1:
  1.5288 ++.LLSFDE2:
  1.5289 ++	.uaword	.LLEFDE2-.LLASFDE2	! FDE Length
  1.5290 ++.LLASFDE2:
  1.5291 ++	.uaword	.LLASFDE2-.LLframe1	! FDE CIE offset
  1.5292 ++#ifdef HAVE_AS_SPARC_UA_PCREL
  1.5293 ++	.uaword	%r_disp32(.LLFB2)
  1.5294 ++	.uaword	.LLFE2-.LLFB2	! FDE address range
  1.5295 ++#else
  1.5296 ++	.align	WS
  1.5297 ++	.nword	.LLFB2
  1.5298 ++	.uanword .LLFE2-.LLFB2	! FDE address range
  1.5299 ++#endif
  1.5300 ++	.byte	0x0	! uleb128 0x0; Augmentation size
  1.5301 ++	.byte	0x4	! DW_CFA_advance_loc4
  1.5302 ++	.uaword	.LLCFI1-.LLFB2
  1.5303 ++	.byte	0xd	! DW_CFA_def_cfa_register
  1.5304 ++	.byte	0x1e	! uleb128 0x1e
  1.5305 ++	.byte	0x2d	! DW_CFA_GNU_window_save
  1.5306 ++	.byte	0x9	! DW_CFA_register
  1.5307 ++	.byte	0xf	! uleb128 0xf
  1.5308 ++	.byte	0x1f	! uleb128 0x1f
  1.5309 ++	.align	WS
  1.5310 ++.LLEFDE2:
  1.5311 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/v9.S gcc/libffi/src/sparc/v9.S
  1.5312 +--- gcc-3.2.2.orig/libffi/src/sparc/v9.S	Mon Apr 29 05:12:04 2002
  1.5313 ++++ gcc/libffi/src/sparc/v9.S	Sat Jan  4 08:08:56 2003
  1.5314 +@@ -1,5 +1,5 @@
  1.5315 + /* -----------------------------------------------------------------------
  1.5316 +-   v9.S - Copyright (c) 2000 Cygnus Solutions
  1.5317 ++   v9.S - Copyright (c) 2000, 2003 Cygnus Solutions
  1.5318 +    
  1.5319 +    Sparc 64bit Foreign Function Interface 
  1.5320 + 
  1.5321 +@@ -99,7 +99,7 @@
  1.5322 + 	cmp	%i3, FFI_TYPE_STRUCT
  1.5323 + 	be,pn	%icc, dostruct
  1.5324 + 
  1.5325 +-	 cmp	%i3, FFI_TYPE_LONGDOUBLE
  1.5326 ++	cmp	%i3, FFI_TYPE_LONGDOUBLE
  1.5327 + 	bne,pt	%icc, done
  1.5328 + 	 nop
  1.5329 + 	std	%f0, [%i4+0]
  1.5330 +@@ -125,6 +125,88 @@
  1.5331 + .ffi_call_V9_end:
  1.5332 + 	.size	ffi_call_V9,.ffi_call_V9_end-ffi_call_V9
  1.5333 + 
  1.5334 ++
  1.5335 ++#define	STACKFRAME	 240	/* 16*8 register window +
  1.5336 ++				   6*8 args backing store +
  1.5337 ++				   8*8 locals */
  1.5338 ++#define	FP		%fp+STACK_BIAS
  1.5339 ++
  1.5340 ++/* ffi_closure_v9(...)
  1.5341 ++
  1.5342 ++   Receives the closure argument in %g1.   */
  1.5343 ++
  1.5344 ++	.text
  1.5345 ++	.align 8
  1.5346 ++	.globl ffi_closure_v9
  1.5347 ++
  1.5348 ++ffi_closure_v9:
  1.5349 ++.LLFB2:
  1.5350 ++	save	%sp, -STACKFRAME, %sp
  1.5351 ++.LLCFI1:
  1.5352 ++
  1.5353 ++	! Store all of the potential argument registers in va_list format.
  1.5354 ++	stx	%i0, [FP+128+0]
  1.5355 ++	stx	%i1, [FP+128+8]
  1.5356 ++	stx	%i2, [FP+128+16]
  1.5357 ++	stx	%i3, [FP+128+24]
  1.5358 ++	stx	%i4, [FP+128+32]
  1.5359 ++	stx	%i5, [FP+128+40]
  1.5360 ++
  1.5361 ++	! Store possible floating point argument registers too.
  1.5362 ++	std	%f0, [FP-48]
  1.5363 ++	std	%f2, [FP-40]
  1.5364 ++	std	%f4, [FP-32]
  1.5365 ++	std	%f6, [FP-24]
  1.5366 ++	std	%f8, [FP-16]
  1.5367 ++	std	%f10, [FP-8]
  1.5368 ++
  1.5369 ++	! Call ffi_closure_sparc_inner to do the bulk of the work.
  1.5370 ++	mov	%g1, %o0
  1.5371 ++	add	%fp, STACK_BIAS-64, %o1
  1.5372 ++	add	%fp, STACK_BIAS+128, %o2
  1.5373 ++	call	ffi_closure_sparc_inner
  1.5374 ++	 add	%fp, STACK_BIAS-48, %o3
  1.5375 ++
  1.5376 ++	! Load up the return value in the proper type.
  1.5377 ++	cmp	%o0, FFI_TYPE_VOID
  1.5378 ++	be,pn	%icc, done1
  1.5379 ++
  1.5380 ++	cmp	%o0, FFI_TYPE_FLOAT
  1.5381 ++	be,a,pn	%icc, done1
  1.5382 ++	 ld	[FP-64], %f0
  1.5383 ++
  1.5384 ++	cmp	%o0, FFI_TYPE_DOUBLE
  1.5385 ++	be,a,pn	%icc, done1
  1.5386 ++	 ldd	[FP-64], %f0
  1.5387 ++
  1.5388 ++	cmp	%o0, FFI_TYPE_LONGDOUBLE
  1.5389 ++	be,a,pn	%icc, longdouble1
  1.5390 ++	 ldd	[FP-64], %f0
  1.5391 ++
  1.5392 ++	cmp	%o0, FFI_TYPE_STRUCT
  1.5393 ++	be,pn	%icc, struct1
  1.5394 ++
  1.5395 ++	! FFI_TYPE_UINT64 | FFI_TYPE_SINT64 | FFI_TYPE_POINTER
  1.5396 ++	ldx	[FP-64], %i0
  1.5397 ++
  1.5398 ++done1:
  1.5399 ++	ret
  1.5400 ++	 restore
  1.5401 ++
  1.5402 ++struct1:
  1.5403 ++	ldx [FP-56], %i2
  1.5404 ++	ret
  1.5405 ++	 restore
  1.5406 ++
  1.5407 ++longdouble1:
  1.5408 ++	ldd	[FP-56], %f2
  1.5409 ++	ret
  1.5410 ++	 restore
  1.5411 ++.LLFE2:
  1.5412 ++
  1.5413 ++.ffi_closure_v9_end:
  1.5414 ++	.size	ffi_closure_v9,.ffi_closure_v9_end-ffi_closure_v9
  1.5415 ++
  1.5416 + 	.section	".eh_frame",#alloc,#write
  1.5417 + .LLframe1:
  1.5418 + 	.uaword	.LLECIE1-.LLSCIE1	! Length of Common Information Entry
  1.5419 +@@ -169,5 +251,27 @@
  1.5420 + 	.byte	0x1f	! uleb128 0x1f
  1.5421 + 	.align 8
  1.5422 + .LLEFDE1:
  1.5423 +-
  1.5424 ++.LLSFDE2:
  1.5425 ++	.uaword	.LLEFDE2-.LLASFDE2	! FDE Length
  1.5426 ++.LLASFDE2:
  1.5427 ++	.uaword	.LLASFDE2-.LLframe1	! FDE CIE offset
  1.5428 ++#ifdef HAVE_AS_SPARC_UA_PCREL
  1.5429 ++	.uaword	%r_disp32(.LLFB2)
  1.5430 ++	.uaword	.LLFE2-.LLFB2		! FDE address range
  1.5431 ++#else
  1.5432 ++	.align 8
  1.5433 ++	.xword	.LLFB2
  1.5434 ++	.uaxword	.LLFE2-.LLFB2	! FDE address range
  1.5435 ++#endif
  1.5436 ++	.byte	0x0	! uleb128 0x0; Augmentation size
  1.5437 ++	.byte	0x4	! DW_CFA_advance_loc4
  1.5438 ++	.uaword	.LLCFI1-.LLFB2
  1.5439 ++	.byte	0xd	! DW_CFA_def_cfa_register
  1.5440 ++	.byte	0x1e	! uleb128 0x1e
  1.5441 ++	.byte	0x2d	! DW_CFA_GNU_window_save
  1.5442 ++	.byte	0x9	! DW_CFA_register
  1.5443 ++	.byte	0xf	! uleb128 0xf
  1.5444 ++	.byte	0x1f	! uleb128 0x1f
  1.5445 ++	.align 8
  1.5446 ++.LLEFDE2:
  1.5447 + #endif
  1.5448 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/types.c gcc/libffi/src/types.c
  1.5449 +--- gcc-3.2.2.orig/libffi/src/types.c	Tue Mar 27 11:39:16 2001
  1.5450 ++++ gcc/libffi/src/types.c	Wed Nov 27 07:24:05 2002
  1.5451 +@@ -42,7 +42,8 @@
  1.5452 + FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32);
  1.5453 + FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT);
  1.5454 + 
  1.5455 +-#if defined ALPHA || defined SPARC64
  1.5456 ++#if defined ALPHA || defined SPARC64 || defined X86_64 || defined S390X \
  1.5457 ++    || defined IA64
  1.5458 + 
  1.5459 + FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER);
  1.5460 + 
  1.5461 +@@ -52,22 +53,12 @@
  1.5462 + 
  1.5463 + #endif
  1.5464 + 
  1.5465 +-#ifdef X86
  1.5466 ++#if defined X86 || defined X86_WIN32 || defined ARM || defined M68K
  1.5467 + 
  1.5468 + FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
  1.5469 + FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
  1.5470 + 
  1.5471 +-#elif defined X86_WIN32
  1.5472 +-
  1.5473 +-FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
  1.5474 +-FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
  1.5475 +-
  1.5476 +-#elif defined ARM
  1.5477 +-
  1.5478 +-FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
  1.5479 +-FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
  1.5480 +-
  1.5481 +-#elif defined M68K
  1.5482 ++#elif defined SH
  1.5483 + 
  1.5484 + FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
  1.5485 + FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
  1.5486 +@@ -80,12 +71,7 @@
  1.5487 + #endif
  1.5488 + 
  1.5489 + 
  1.5490 +-#ifdef X86
  1.5491 +-
  1.5492 +-FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
  1.5493 +-FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
  1.5494 +-
  1.5495 +-#elif defined X86_WIN32
  1.5496 ++#if defined X86 || defined X86_WIN32 || defined M68K
  1.5497 + 
  1.5498 + FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
  1.5499 + FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
  1.5500 +@@ -95,25 +81,25 @@
  1.5501 + FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
  1.5502 + FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE);
  1.5503 + 
  1.5504 +-#elif defined M68K
  1.5505 ++#elif defined SH
  1.5506 + 
  1.5507 + FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
  1.5508 +-FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
  1.5509 ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE);
  1.5510 + 
  1.5511 + #elif defined SPARC
  1.5512 + 
  1.5513 + FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
  1.5514 +-
  1.5515 + #ifdef SPARC64
  1.5516 +-
  1.5517 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE);
  1.5518 +-
  1.5519 + #else
  1.5520 +-
  1.5521 + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE);
  1.5522 +-
  1.5523 + #endif
  1.5524 + 
  1.5525 ++#elif defined X86_64
  1.5526 ++
  1.5527 ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
  1.5528 ++FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE);
  1.5529 ++
  1.5530 + #else
  1.5531 + 
  1.5532 + FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
  1.5533 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/ffi.c gcc/libffi/src/x86/ffi.c
  1.5534 +--- gcc-3.2.2.orig/libffi/src/x86/ffi.c	Tue May 28 18:22:08 2002
  1.5535 ++++ gcc/libffi/src/x86/ffi.c	Fri Dec  6 10:16:45 2002
  1.5536 +@@ -1,5 +1,8 @@
  1.5537 + /* -----------------------------------------------------------------------
  1.5538 +-   ffi.c - Copyright (c) 1996, 1998, 1999  Cygnus Solutions
  1.5539 ++   ffi.c - Copyright (c) 1996, 1998, 1999, 2001  Red Hat, Inc.
  1.5540 ++           Copyright (c) 2002  Ranjit Mathew
  1.5541 ++           Copyright (c) 2002  Bo Thorsen
  1.5542 ++           Copyright (c) 2002  Roger Sayle
  1.5543 +    
  1.5544 +    x86 Foreign Function Interface 
  1.5545 + 
  1.5546 +@@ -23,6 +26,8 @@
  1.5547 +    OTHER DEALINGS IN THE SOFTWARE.
  1.5548 +    ----------------------------------------------------------------------- */
  1.5549 + 
  1.5550 ++#ifndef __x86_64__
  1.5551 ++
  1.5552 + #include <ffi.h>
  1.5553 + #include <ffi_common.h>
  1.5554 + 
  1.5555 +@@ -36,12 +41,10 @@
  1.5556 + /*@=exportheader@*/
  1.5557 + {
  1.5558 +   register unsigned int i;
  1.5559 +-  register int tmp;
  1.5560 +   register void **p_argv;
  1.5561 +   register char *argp;
  1.5562 +   register ffi_type **p_arg;
  1.5563 + 
  1.5564 +-  tmp = 0;
  1.5565 +   argp = stack;
  1.5566 + 
  1.5567 +   if (ecif->cif->rtype->type == FFI_TYPE_STRUCT)
  1.5568 +@@ -148,6 +151,18 @@
  1.5569 + /*@=declundef@*/
  1.5570 + /*@=exportheader@*/
  1.5571 + 
  1.5572 ++#ifdef X86_WIN32
  1.5573 ++/*@-declundef@*/
  1.5574 ++/*@-exportheader@*/
  1.5575 ++extern void ffi_call_STDCALL(void (*)(char *, extended_cif *),
  1.5576 ++			  /*@out@*/ extended_cif *,
  1.5577 ++			  unsigned, unsigned,
  1.5578 ++			  /*@out@*/ unsigned *,
  1.5579 ++			  void (*fn)());
  1.5580 ++/*@=declundef@*/
  1.5581 ++/*@=exportheader@*/
  1.5582 ++#endif /* X86_WIN32 */
  1.5583 ++
  1.5584 + void ffi_call(/*@dependent@*/ ffi_cif *cif, 
  1.5585 + 	      void (*fn)(), 
  1.5586 + 	      /*@out@*/ void *rvalue, 
  1.5587 +@@ -180,6 +195,14 @@
  1.5588 + 		    cif->flags, ecif.rvalue, fn);
  1.5589 +       /*@=usedef@*/
  1.5590 +       break;
  1.5591 ++#ifdef X86_WIN32
  1.5592 ++    case FFI_STDCALL:
  1.5593 ++      /*@-usedef@*/
  1.5594 ++      ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes,
  1.5595 ++		    cif->flags, ecif.rvalue, fn);
  1.5596 ++      /*@=usedef@*/
  1.5597 ++      break;
  1.5598 ++#endif /* X86_WIN32 */
  1.5599 +     default:
  1.5600 +       FFI_ASSERT(0);
  1.5601 +       break;
  1.5602 +@@ -266,12 +289,10 @@
  1.5603 + /*@=exportheader@*/
  1.5604 + {
  1.5605 +   register unsigned int i;
  1.5606 +-  register int tmp;
  1.5607 +   register void **p_argv;
  1.5608 +   register char *argp;
  1.5609 +   register ffi_type **p_arg;
  1.5610 + 
  1.5611 +-  tmp = 0;
  1.5612 +   argp = stack;
  1.5613 + 
  1.5614 +   if ( cif->rtype->type == FFI_TYPE_STRUCT ) {
  1.5615 +@@ -281,13 +302,14 @@
  1.5616 + 
  1.5617 +   p_argv = avalue;
  1.5618 + 
  1.5619 +-  for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++)
  1.5620 ++  for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++)
  1.5621 +     {
  1.5622 +       size_t z;
  1.5623 + 
  1.5624 +       /* Align if necessary */
  1.5625 +-      if (((*p_arg)->alignment - 1) & (unsigned) argp)
  1.5626 ++      if (((*p_arg)->alignment - 1) & (unsigned) argp) {
  1.5627 + 	argp = (char *) ALIGN(argp, (*p_arg)->alignment);
  1.5628 ++      }
  1.5629 + 
  1.5630 +       z = (*p_arg)->size;
  1.5631 + 
  1.5632 +@@ -298,7 +320,7 @@
  1.5633 +       p_argv++;
  1.5634 +       argp += z;
  1.5635 +     }
  1.5636 +-
  1.5637 ++  
  1.5638 +   return;
  1.5639 + }
  1.5640 + 
  1.5641 +@@ -449,6 +471,15 @@
  1.5642 + 	      /*@out@*/ unsigned *, 
  1.5643 + 	      void (*fn)());
  1.5644 + 
  1.5645 ++#ifdef X86_WIN32
  1.5646 ++extern void
  1.5647 ++ffi_call_STDCALL(void (*)(char *, extended_cif *),
  1.5648 ++	      /*@out@*/ extended_cif *,
  1.5649 ++	      unsigned, unsigned,
  1.5650 ++	      /*@out@*/ unsigned *,
  1.5651 ++	      void (*fn)());
  1.5652 ++#endif /* X86_WIN32 */
  1.5653 ++
  1.5654 + void
  1.5655 + ffi_raw_call(/*@dependent@*/ ffi_cif *cif, 
  1.5656 + 	     void (*fn)(), 
  1.5657 +@@ -483,6 +514,14 @@
  1.5658 + 		    cif->flags, ecif.rvalue, fn);
  1.5659 +       /*@=usedef@*/
  1.5660 +       break;
  1.5661 ++#ifdef X86_WIN32
  1.5662 ++    case FFI_STDCALL:
  1.5663 ++      /*@-usedef@*/
  1.5664 ++      ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes,
  1.5665 ++		    cif->flags, ecif.rvalue, fn);
  1.5666 ++      /*@=usedef@*/
  1.5667 ++      break;
  1.5668 ++#endif /* X86_WIN32 */
  1.5669 +     default:
  1.5670 +       FFI_ASSERT(0);
  1.5671 +       break;
  1.5672 +@@ -490,3 +529,5 @@
  1.5673 + }
  1.5674 + 
  1.5675 + #endif
  1.5676 ++
  1.5677 ++#endif /* __x86_64__  */
  1.5678 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/ffi64.c gcc/libffi/src/x86/ffi64.c
  1.5679 +--- gcc-3.2.2.orig/libffi/src/x86/ffi64.c	Thu Jan  1 09:00:00 1970
  1.5680 ++++ gcc/libffi/src/x86/ffi64.c	Wed Jan 29 00:54:28 2003
  1.5681 +@@ -0,0 +1,706 @@
  1.5682 ++/* -----------------------------------------------------------------------
  1.5683 ++   ffi.c - Copyright (c) 2002  Bo Thorsen <bo@suse.de>
  1.5684 ++   
  1.5685 ++   x86-64 Foreign Function Interface 
  1.5686 ++
  1.5687 ++   Permission is hereby granted, free of charge, to any person obtaining
  1.5688 ++   a copy of this software and associated documentation files (the
  1.5689 ++   ``Software''), to deal in the Software without restriction, including
  1.5690 ++   without limitation the rights to use, copy, modify, merge, publish,
  1.5691 ++   distribute, sublicense, and/or sell copies of the Software, and to
  1.5692 ++   permit persons to whom the Software is furnished to do so, subject to
  1.5693 ++   the following conditions:
  1.5694 ++
  1.5695 ++   The above copyright notice and this permission notice shall be included
  1.5696 ++   in all copies or substantial portions of the Software.
  1.5697 ++
  1.5698 ++   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
  1.5699 ++   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  1.5700 ++   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  1.5701 ++   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  1.5702 ++   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  1.5703 ++   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  1.5704 ++   OTHER DEALINGS IN THE SOFTWARE.
  1.5705 ++   ----------------------------------------------------------------------- */
  1.5706 ++
  1.5707 ++#include <ffi.h>
  1.5708 ++#include <ffi_common.h>
  1.5709 ++
  1.5710 ++#include <stdlib.h>
  1.5711 ++#include <stdarg.h>
  1.5712 ++
  1.5713 ++/* ffi_prep_args is called by the assembly routine once stack space
  1.5714 ++   has been allocated for the function's arguments */
  1.5715 ++
  1.5716 ++#ifdef __x86_64__
  1.5717 ++
  1.5718 ++#define MAX_GPR_REGS 6
  1.5719 ++#define MAX_SSE_REGS 8
  1.5720 ++typedef struct
  1.5721 ++{
  1.5722 ++  /* Registers for argument passing.  */
  1.5723 ++  long gpr[MAX_GPR_REGS];
  1.5724 ++  __int128_t sse[MAX_SSE_REGS];
  1.5725 ++
  1.5726 ++  /* Stack space for arguments.  */
  1.5727 ++  char argspace[0];
  1.5728 ++} stackLayout;
  1.5729 ++
  1.5730 ++/* All reference to register classes here is identical to the code in
  1.5731 ++   gcc/config/i386/i386.c. Do *not* change one without the other.  */
  1.5732 ++
  1.5733 ++/* Register class used for passing given 64bit part of the argument.
  1.5734 ++   These represent classes as documented by the PS ABI, with the exception
  1.5735 ++   of SSESF, SSEDF classes, that are basically SSE class, just gcc will
  1.5736 ++   use SF or DFmode move instead of DImode to avoid reformating penalties.
  1.5737 ++
  1.5738 ++   Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves
  1.5739 ++   whenever possible (upper half does contain padding).
  1.5740 ++ */
  1.5741 ++enum x86_64_reg_class
  1.5742 ++  {
  1.5743 ++    X86_64_NO_CLASS,
  1.5744 ++    X86_64_INTEGER_CLASS,
  1.5745 ++    X86_64_INTEGERSI_CLASS,
  1.5746 ++    X86_64_SSE_CLASS,
  1.5747 ++    X86_64_SSESF_CLASS,
  1.5748 ++    X86_64_SSEDF_CLASS,
  1.5749 ++    X86_64_SSEUP_CLASS,
  1.5750 ++    X86_64_X87_CLASS,
  1.5751 ++    X86_64_X87UP_CLASS,
  1.5752 ++    X86_64_MEMORY_CLASS
  1.5753 ++  };
  1.5754 ++
  1.5755 ++#define MAX_CLASSES 4
  1.5756 ++
  1.5757 ++/* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
  1.5758 ++   of this code is to classify each 8bytes of incoming argument by the register
  1.5759 ++   class and assign registers accordingly.  */
  1.5760 ++
  1.5761 ++/* Return the union class of CLASS1 and CLASS2.
  1.5762 ++   See the x86-64 PS ABI for details.  */
  1.5763 ++
  1.5764 ++static enum x86_64_reg_class
  1.5765 ++merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
  1.5766 ++{
  1.5767 ++  /* Rule #1: If both classes are equal, this is the resulting class.  */
  1.5768 ++  if (class1 == class2)
  1.5769 ++    return class1;
  1.5770 ++
  1.5771 ++  /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
  1.5772 ++     the other class.  */
  1.5773 ++  if (class1 == X86_64_NO_CLASS)
  1.5774 ++    return class2;
  1.5775 ++  if (class2 == X86_64_NO_CLASS)
  1.5776 ++    return class1;
  1.5777 ++
  1.5778 ++  /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
  1.5779 ++  if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
  1.5780 ++    return X86_64_MEMORY_CLASS;
  1.5781 ++
  1.5782 ++  /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
  1.5783 ++  if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
  1.5784 ++      || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
  1.5785 ++    return X86_64_INTEGERSI_CLASS;
  1.5786 ++  if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
  1.5787 ++      || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
  1.5788 ++    return X86_64_INTEGER_CLASS;
  1.5789 ++
  1.5790 ++  /* Rule #5: If one of the classes is X87 or X87UP class, MEMORY is used.  */
  1.5791 ++  if (class1 == X86_64_X87_CLASS || class1 == X86_64_X87UP_CLASS
  1.5792 ++      || class2 == X86_64_X87_CLASS || class2 == X86_64_X87UP_CLASS)
  1.5793 ++    return X86_64_MEMORY_CLASS;
  1.5794 ++
  1.5795 ++  /* Rule #6: Otherwise class SSE is used.  */
  1.5796 ++  return X86_64_SSE_CLASS;
  1.5797 ++}
  1.5798 ++
  1.5799 ++/* Classify the argument of type TYPE and mode MODE.
  1.5800 ++   CLASSES will be filled by the register class used to pass each word
  1.5801 ++   of the operand.  The number of words is returned.  In case the parameter
  1.5802 ++   should be passed in memory, 0 is returned. As a special case for zero
  1.5803 ++   sized containers, classes[0] will be NO_CLASS and 1 is returned.
  1.5804 ++
  1.5805 ++   See the x86-64 PS ABI for details.
  1.5806 ++*/
  1.5807 ++static int
  1.5808 ++classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
  1.5809 ++		   int *byte_offset)
  1.5810 ++{
  1.5811 ++  /* First, align to the right place.  */
  1.5812 ++  *byte_offset = ALIGN(*byte_offset, type->alignment);
  1.5813 ++
  1.5814 ++  switch (type->type)
  1.5815 ++    {
  1.5816 ++    case FFI_TYPE_UINT8:
  1.5817 ++    case FFI_TYPE_SINT8:
  1.5818 ++    case FFI_TYPE_UINT16:
  1.5819 ++    case FFI_TYPE_SINT16:
  1.5820 ++    case FFI_TYPE_UINT32:
  1.5821 ++    case FFI_TYPE_SINT32:
  1.5822 ++    case FFI_TYPE_UINT64:
  1.5823 ++    case FFI_TYPE_SINT64:
  1.5824 ++    case FFI_TYPE_POINTER:
  1.5825 ++      if (((*byte_offset) % 8 + type->size) <= 4)
  1.5826 ++	classes[0] = X86_64_INTEGERSI_CLASS;
  1.5827 ++      else
  1.5828 ++	classes[0] = X86_64_INTEGER_CLASS;
  1.5829 ++      return 1;
  1.5830 ++    case FFI_TYPE_FLOAT:
  1.5831 ++      if (((*byte_offset) % 8) == 0)
  1.5832 ++	classes[0] = X86_64_SSESF_CLASS;
  1.5833 ++      else
  1.5834 ++	classes[0] = X86_64_SSE_CLASS;
  1.5835 ++      return 1;
  1.5836 ++    case FFI_TYPE_DOUBLE:
  1.5837 ++      classes[0] = X86_64_SSEDF_CLASS;
  1.5838 ++      return 1;
  1.5839 ++    case FFI_TYPE_LONGDOUBLE:
  1.5840 ++      classes[0] = X86_64_X87_CLASS;
  1.5841 ++      classes[1] = X86_64_X87UP_CLASS;
  1.5842 ++      return 2;
  1.5843 ++    case FFI_TYPE_STRUCT:
  1.5844 ++      {
  1.5845 ++	const int UNITS_PER_WORD = 8;
  1.5846 ++	int words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
  1.5847 ++	ffi_type **ptr; 
  1.5848 ++	int i;
  1.5849 ++	enum x86_64_reg_class subclasses[MAX_CLASSES];
  1.5850 ++
  1.5851 ++	/* If the struct is larger than 16 bytes, pass it on the stack.  */
  1.5852 ++	if (type->size > 16)
  1.5853 ++	  return 0;
  1.5854 ++
  1.5855 ++	for (i = 0; i < words; i++)
  1.5856 ++	  classes[i] = X86_64_NO_CLASS;
  1.5857 ++
  1.5858 ++	/* Merge the fields of structure.  */
  1.5859 ++	for (ptr=type->elements; (*ptr)!=NULL; ptr++)
  1.5860 ++	  {
  1.5861 ++	    int num;
  1.5862 ++
  1.5863 ++	    num = classify_argument (*ptr, subclasses, byte_offset);
  1.5864 ++	    if (num == 0)
  1.5865 ++	      return 0;
  1.5866 ++	    for (i = 0; i < num; i++)
  1.5867 ++	      {
  1.5868 ++		int pos = *byte_offset / 8;
  1.5869 ++		classes[i + pos] =
  1.5870 ++		  merge_classes (subclasses[i], classes[i + pos]);
  1.5871 ++	      }
  1.5872 ++
  1.5873 ++	    if ((*ptr)->type != FFI_TYPE_STRUCT)
  1.5874 ++	      *byte_offset += (*ptr)->size;
  1.5875 ++	  }
  1.5876 ++
  1.5877 ++	/* Final merger cleanup.  */
  1.5878 ++	for (i = 0; i < words; i++)
  1.5879 ++	  {
  1.5880 ++	    /* If one class is MEMORY, everything should be passed in
  1.5881 ++	       memory.  */
  1.5882 ++	    if (classes[i] == X86_64_MEMORY_CLASS)
  1.5883 ++	      return 0;
  1.5884 ++
  1.5885 ++	    /* The X86_64_SSEUP_CLASS should be always preceded by
  1.5886 ++	       X86_64_SSE_CLASS.  */
  1.5887 ++	    if (classes[i] == X86_64_SSEUP_CLASS
  1.5888 ++		&& (i == 0 || classes[i - 1] != X86_64_SSE_CLASS))
  1.5889 ++	      classes[i] = X86_64_SSE_CLASS;
  1.5890 ++
  1.5891 ++	    /*  X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS.  */
  1.5892 ++	    if (classes[i] == X86_64_X87UP_CLASS
  1.5893 ++		&& (i == 0 || classes[i - 1] != X86_64_X87_CLASS))
  1.5894 ++	      classes[i] = X86_64_SSE_CLASS;
  1.5895 ++	  }
  1.5896 ++	return words;
  1.5897 ++      }
  1.5898 ++
  1.5899 ++    default:
  1.5900 ++      FFI_ASSERT(0);
  1.5901 ++    }
  1.5902 ++  return 0; /* Never reached.  */
  1.5903 ++}
  1.5904 ++
  1.5905 ++/* Examine the argument and return set number of register required in each
  1.5906 ++   class.  Return 0 iff parameter should be passed in memory.  */
  1.5907 ++static int
  1.5908 ++examine_argument (ffi_type *type, int in_return, int *int_nregs,int *sse_nregs)
  1.5909 ++{
  1.5910 ++  enum x86_64_reg_class class[MAX_CLASSES];
  1.5911 ++  int offset = 0;
  1.5912 ++  int n;
  1.5913 ++
  1.5914 ++  n = classify_argument (type, class, &offset);
  1.5915 ++
  1.5916 ++  if (n == 0)
  1.5917 ++    return 0;
  1.5918 ++
  1.5919 ++  *int_nregs = 0;
  1.5920 ++  *sse_nregs = 0;
  1.5921 ++  for (n--; n>=0; n--)
  1.5922 ++    switch (class[n])
  1.5923 ++      {
  1.5924 ++      case X86_64_INTEGER_CLASS:
  1.5925 ++      case X86_64_INTEGERSI_CLASS:
  1.5926 ++	(*int_nregs)++;
  1.5927 ++	break;
  1.5928 ++      case X86_64_SSE_CLASS:
  1.5929 ++      case X86_64_SSESF_CLASS:
  1.5930 ++      case X86_64_SSEDF_CLASS:
  1.5931 ++	(*sse_nregs)++;
  1.5932 ++	break;
  1.5933 ++      case X86_64_NO_CLASS:
  1.5934 ++      case X86_64_SSEUP_CLASS:
  1.5935 ++	break;
  1.5936 ++      case X86_64_X87_CLASS:
  1.5937 ++      case X86_64_X87UP_CLASS:
  1.5938 ++	if (!in_return)
  1.5939 ++	  return 0;
  1.5940 ++	break;
  1.5941 ++      default:
  1.5942 ++	abort ();
  1.5943 ++      }
  1.5944 ++  return 1;
  1.5945 ++}
  1.5946 ++
  1.5947 ++/* Functions to load floats and double to an SSE register placeholder.  */
  1.5948 ++extern void float2sse (float, __int128_t *);
  1.5949 ++extern void double2sse (double, __int128_t *);
  1.5950 ++extern void floatfloat2sse (void *, __int128_t *);
  1.5951 ++
  1.5952 ++/* Functions to put the floats and doubles back.  */
  1.5953 ++extern float sse2float (__int128_t *);
  1.5954 ++extern double sse2double (__int128_t *);
  1.5955 ++extern void sse2floatfloat(__int128_t *, void *);
  1.5956 ++
  1.5957 ++/*@-exportheader@*/
  1.5958 ++void
  1.5959 ++ffi_prep_args (stackLayout *stack, extended_cif *ecif)
  1.5960 ++/*@=exportheader@*/
  1.5961 ++{
  1.5962 ++  int gprcount, ssecount, i, g, s;
  1.5963 ++  void **p_argv;
  1.5964 ++  void *argp = &stack->argspace;
  1.5965 ++  ffi_type **p_arg;
  1.5966 ++
  1.5967 ++  /* First check if the return value should be passed in memory. If so,
  1.5968 ++     pass the pointer as the first argument.  */
  1.5969 ++  gprcount = ssecount = 0;
  1.5970 ++  if (ecif->cif->rtype->type != FFI_TYPE_VOID 
  1.5971 ++      && examine_argument (ecif->cif->rtype, 1, &g, &s) == 0)
  1.5972 ++    (void *)stack->gpr[gprcount++] = ecif->rvalue;
  1.5973 ++
  1.5974 ++  for (i=ecif->cif->nargs, p_arg=ecif->cif->arg_types, p_argv = ecif->avalue;
  1.5975 ++       i!=0; i--, p_arg++, p_argv++)
  1.5976 ++    {
  1.5977 ++      int in_register = 0;
  1.5978 ++
  1.5979 ++      switch ((*p_arg)->type)
  1.5980 ++	{
  1.5981 ++	case FFI_TYPE_SINT8:
  1.5982 ++	case FFI_TYPE_SINT16:
  1.5983 ++	case FFI_TYPE_SINT32:
  1.5984 ++	case FFI_TYPE_SINT64:
  1.5985 ++	case FFI_TYPE_UINT8:
  1.5986 ++	case FFI_TYPE_UINT16:
  1.5987 ++	case FFI_TYPE_UINT32:
  1.5988 ++	case FFI_TYPE_UINT64:
  1.5989 ++	case FFI_TYPE_POINTER:
  1.5990 ++	  if (gprcount < MAX_GPR_REGS)
  1.5991 ++	    {
  1.5992 ++	      stack->gpr[gprcount] = 0;
  1.5993 ++	      stack->gpr[gprcount++] = *(long long *)(*p_argv);
  1.5994 ++	      in_register = 1;
  1.5995 ++	    }
  1.5996 ++	  break;
  1.5997 ++
  1.5998 ++	case FFI_TYPE_FLOAT:
  1.5999 ++	  if (ssecount < MAX_SSE_REGS)
  1.6000 ++	    {
  1.6001 ++	      float2sse (*(float *)(*p_argv), &stack->sse[ssecount++]);
  1.6002 ++	      in_register = 1;
  1.6003 ++	    }
  1.6004 ++	  break;
  1.6005 ++
  1.6006 ++	case FFI_TYPE_DOUBLE:
  1.6007 ++	  if (ssecount < MAX_SSE_REGS)
  1.6008 ++	    {
  1.6009 ++	      double2sse (*(double *)(*p_argv), &stack->sse[ssecount++]);
  1.6010 ++	      in_register = 1;
  1.6011 ++	    }
  1.6012 ++	  break;
  1.6013 ++	}
  1.6014 ++
  1.6015 ++      if (in_register)
  1.6016 ++	continue;
  1.6017 ++
  1.6018 ++      /* Either all places in registers where filled, or this is a
  1.6019 ++	 type that potentially goes into a memory slot.  */
  1.6020 ++      if (examine_argument (*p_arg, 0, &g, &s) == 0
  1.6021 ++	  || gprcount + g > MAX_GPR_REGS || ssecount + s > MAX_SSE_REGS)
  1.6022 ++	{
  1.6023 ++	  /* Pass this argument in memory.  */
  1.6024 ++	  argp = (void *)ALIGN(argp, (*p_arg)->alignment);
  1.6025 ++	  memcpy (argp, *p_argv, (*p_arg)->size);
  1.6026 ++	  argp += (*p_arg)->size;
  1.6027 ++	}
  1.6028 ++      else
  1.6029 ++	{
  1.6030 ++	  /* All easy cases are eliminated. Now fire the big guns.  */
  1.6031 ++
  1.6032 ++	  enum x86_64_reg_class classes[MAX_CLASSES];
  1.6033 ++	  int offset = 0, j, num;
  1.6034 ++	  void *a;
  1.6035 ++
  1.6036 ++	  num = classify_argument (*p_arg, classes, &offset);
  1.6037 ++	  for (j=0, a=*p_argv; j<num; j++, a+=8)
  1.6038 ++	    {
  1.6039 ++	      switch (classes[j])
  1.6040 ++		{
  1.6041 ++		case X86_64_INTEGER_CLASS:
  1.6042 ++		case X86_64_INTEGERSI_CLASS:
  1.6043 ++		  stack->gpr[gprcount++] = *(long long *)a;
  1.6044 ++		  break;
  1.6045 ++		case X86_64_SSE_CLASS:
  1.6046 ++		  floatfloat2sse (a, &stack->sse[ssecount++]);
  1.6047 ++		  break;
  1.6048 ++		case X86_64_SSESF_CLASS:
  1.6049 ++		  float2sse (*(float *)a, &stack->sse[ssecount++]);
  1.6050 ++		  break;
  1.6051 ++		case X86_64_SSEDF_CLASS:
  1.6052 ++		  double2sse (*(double *)a, &stack->sse[ssecount++]);
  1.6053 ++		  break;
  1.6054 ++		default:
  1.6055 ++		  abort();
  1.6056 ++		}
  1.6057 ++	    }
  1.6058 ++	}
  1.6059 ++    }
  1.6060 ++}
  1.6061 ++
  1.6062 ++/* Perform machine dependent cif processing.  */
  1.6063 ++ffi_status
  1.6064 ++ffi_prep_cif_machdep (ffi_cif *cif)
  1.6065 ++{
  1.6066 ++  int gprcount, ssecount, i, g, s;
  1.6067 ++
  1.6068 ++  gprcount = ssecount = 0;
  1.6069 ++
  1.6070 ++  /* Reset the byte count. We handle this size estimation here.  */
  1.6071 ++  cif->bytes = 0;
  1.6072 ++
  1.6073 ++  /* If the return value should be passed in memory, pass the pointer
  1.6074 ++     as the first argument. The actual memory isn't allocated here.  */
  1.6075 ++  if (cif->rtype->type != FFI_TYPE_VOID 
  1.6076 ++      && examine_argument (cif->rtype, 1, &g, &s) == 0)
  1.6077 ++    gprcount = 1;
  1.6078 ++
  1.6079 ++  /* Go over all arguments and determine the way they should be passed.
  1.6080 ++     If it's in a register and there is space for it, let that be so. If
  1.6081 ++     not, add it's size to the stack byte count.  */
  1.6082 ++  for (i=0; i<cif->nargs; i++)
  1.6083 ++    {
  1.6084 ++      if (examine_argument (cif->arg_types[i], 0, &g, &s) == 0
  1.6085 ++	  || gprcount + g > MAX_GPR_REGS || ssecount + s > MAX_SSE_REGS)
  1.6086 ++	{
  1.6087 ++	  /* This is passed in memory. First align to the basic type.  */
  1.6088 ++	  cif->bytes = ALIGN(cif->bytes, cif->arg_types[i]->alignment);
  1.6089 ++
  1.6090 ++	  /* Stack arguments are *always* at least 8 byte aligned.  */
  1.6091 ++	  cif->bytes = ALIGN(cif->bytes, 8);
  1.6092 ++
  1.6093 ++	  /* Now add the size of this argument.  */
  1.6094 ++	  cif->bytes += cif->arg_types[i]->size;
  1.6095 ++	}
  1.6096 ++      else
  1.6097 ++	{
  1.6098 ++	  gprcount += g;
  1.6099 ++	  ssecount += s;
  1.6100 ++	}
  1.6101 ++    }
  1.6102 ++
  1.6103 ++  /* Set the flag for the closures return.  */
  1.6104 ++    switch (cif->rtype->type)
  1.6105 ++    {
  1.6106 ++    case FFI_TYPE_VOID:
  1.6107 ++    case FFI_TYPE_STRUCT:
  1.6108 ++    case FFI_TYPE_SINT64:
  1.6109 ++    case FFI_TYPE_FLOAT:
  1.6110 ++    case FFI_TYPE_DOUBLE:
  1.6111 ++    case FFI_TYPE_LONGDOUBLE:
  1.6112 ++      cif->flags = (unsigned) cif->rtype->type;
  1.6113 ++      break;
  1.6114 ++
  1.6115 ++    case FFI_TYPE_UINT64:
  1.6116 ++      cif->flags = FFI_TYPE_SINT64;
  1.6117 ++      break;
  1.6118 ++
  1.6119 ++    default:
  1.6120 ++      cif->flags = FFI_TYPE_INT;
  1.6121 ++      break;
  1.6122 ++    }
  1.6123 ++
  1.6124 ++  return FFI_OK;
  1.6125 ++}
  1.6126 ++
  1.6127 ++typedef struct
  1.6128 ++{
  1.6129 ++  long gpr[2];
  1.6130 ++  __int128_t sse[2];
  1.6131 ++  long double st0;
  1.6132 ++} return_value;
  1.6133 ++
  1.6134 ++void
  1.6135 ++ffi_fill_return_value (return_value *rv, extended_cif *ecif)
  1.6136 ++{
  1.6137 ++  enum x86_64_reg_class classes[MAX_CLASSES];
  1.6138 ++  int i = 0, num;
  1.6139 ++  long *gpr = rv->gpr;
  1.6140 ++  __int128_t *sse = rv->sse;
  1.6141 ++  signed char sc;
  1.6142 ++  signed short ss;
  1.6143 ++
  1.6144 ++  /* This is needed because of the way x86-64 handles signed short
  1.6145 ++     integers.  */
  1.6146 ++  switch (ecif->cif->rtype->type)
  1.6147 ++    {
  1.6148 ++    case FFI_TYPE_SINT8:
  1.6149 ++      sc = *(signed char *)gpr;
  1.6150 ++      *(long long *)ecif->rvalue = (long long)sc;
  1.6151 ++      return;
  1.6152 ++    case FFI_TYPE_SINT16:
  1.6153 ++      ss = *(signed short *)gpr;
  1.6154 ++      *(long long *)ecif->rvalue = (long long)ss;
  1.6155 ++      return;
  1.6156 ++    default:
  1.6157 ++      /* Just continue.  */
  1.6158 ++      ;
  1.6159 ++    }
  1.6160 ++
  1.6161 ++  num = classify_argument (ecif->cif->rtype, classes, &i);
  1.6162 ++
  1.6163 ++  if (num == 0)
  1.6164 ++    /* Return in memory.  */
  1.6165 ++    ecif->rvalue = (void *) rv->gpr[0];
  1.6166 ++  else if (num == 2 && classes[0] == X86_64_X87_CLASS &&
  1.6167 ++	classes[1] == X86_64_X87UP_CLASS)
  1.6168 ++    /* This is a long double (this is easiest to handle this way instead
  1.6169 ++       of an eightbyte at a time as in the loop below.  */
  1.6170 ++    *((long double *)ecif->rvalue) = rv->st0;
  1.6171 ++  else
  1.6172 ++    {
  1.6173 ++      void *a;
  1.6174 ++
  1.6175 ++      for (i=0, a=ecif->rvalue; i<num; i++, a+=8)
  1.6176 ++	{
  1.6177 ++	  switch (classes[i])
  1.6178 ++	    {
  1.6179 ++	    case X86_64_INTEGER_CLASS:
  1.6180 ++	    case X86_64_INTEGERSI_CLASS:
  1.6181 ++	      *(long long *)a = *gpr;
  1.6182 ++	      gpr++;
  1.6183 ++	      break;
  1.6184 ++	    case X86_64_SSE_CLASS:
  1.6185 ++	      sse2floatfloat (sse++, a);
  1.6186 ++	      break;
  1.6187 ++	    case X86_64_SSESF_CLASS:
  1.6188 ++	      *(float *)a = sse2float (sse++);
  1.6189 ++	      break;
  1.6190 ++	    case X86_64_SSEDF_CLASS:
  1.6191 ++	      *(double *)a = sse2double (sse++);
  1.6192 ++	      break;
  1.6193 ++	    default:
  1.6194 ++	      abort();
  1.6195 ++	    }
  1.6196 ++	}
  1.6197 ++    }
  1.6198 ++}
  1.6199 ++
  1.6200 ++/*@-declundef@*/
  1.6201 ++/*@-exportheader@*/
  1.6202 ++extern void ffi_call_UNIX64(void (*)(stackLayout *, extended_cif *),
  1.6203 ++			    void (*) (return_value *, extended_cif *),
  1.6204 ++			    /*@out@*/ extended_cif *, 
  1.6205 ++			    unsigned, /*@out@*/ unsigned *, void (*fn)());
  1.6206 ++/*@=declundef@*/
  1.6207 ++/*@=exportheader@*/
  1.6208 ++
  1.6209 ++void ffi_call(/*@dependent@*/ ffi_cif *cif, 
  1.6210 ++	      void (*fn)(), 
  1.6211 ++	      /*@out@*/ void *rvalue, 
  1.6212 ++	      /*@dependent@*/ void **avalue)
  1.6213 ++{
  1.6214 ++  extended_cif ecif;
  1.6215 ++  int dummy;
  1.6216 ++
  1.6217 ++  ecif.cif = cif;
  1.6218 ++  ecif.avalue = avalue;
  1.6219 ++  
  1.6220 ++  /* If the return value is a struct and we don't have a return	*/
  1.6221 ++  /* value address then we need to make one		        */
  1.6222 ++
  1.6223 ++  if ((rvalue == NULL) && 
  1.6224 ++      (examine_argument (cif->rtype, 1, &dummy, &dummy) == 0))
  1.6225 ++    {
  1.6226 ++      /*@-sysunrecog@*/
  1.6227 ++      ecif.rvalue = alloca(cif->rtype->size);
  1.6228 ++      /*@=sysunrecog@*/
  1.6229 ++    }
  1.6230 ++  else
  1.6231 ++    ecif.rvalue = rvalue;
  1.6232 ++    
  1.6233 ++  /* Stack must always be 16byte aligned. Make it so.  */
  1.6234 ++  cif->bytes = ALIGN(cif->bytes, 16);
  1.6235 ++  
  1.6236 ++  switch (cif->abi) 
  1.6237 ++    {
  1.6238 ++    case FFI_SYSV:
  1.6239 ++      /* Calling 32bit code from 64bit is not possible  */
  1.6240 ++      FFI_ASSERT(0);
  1.6241 ++      break;
  1.6242 ++
  1.6243 ++    case FFI_UNIX64:
  1.6244 ++      /*@-usedef@*/
  1.6245 ++      ffi_call_UNIX64 (ffi_prep_args, ffi_fill_return_value, &ecif,
  1.6246 ++		       cif->bytes, ecif.rvalue, fn);
  1.6247 ++      /*@=usedef@*/
  1.6248 ++      break;
  1.6249 ++
  1.6250 ++    default:
  1.6251 ++      FFI_ASSERT(0);
  1.6252 ++      break;
  1.6253 ++    }
  1.6254 ++}
  1.6255 ++
  1.6256 ++extern void ffi_closure_UNIX64(void);
  1.6257 ++
  1.6258 ++ffi_status
  1.6259 ++ffi_prep_closure (ffi_closure* closure,
  1.6260 ++		  ffi_cif* cif,
  1.6261 ++		  void (*fun)(ffi_cif*, void*, void**, void*),
  1.6262 ++		  void *user_data)
  1.6263 ++{
  1.6264 ++  volatile unsigned short *tramp;
  1.6265 ++
  1.6266 ++  /* FFI_ASSERT (cif->abi == FFI_OSF);  */
  1.6267 ++
  1.6268 ++  tramp = (volatile unsigned short *) &closure->tramp[0];
  1.6269 ++  tramp[0] = 0xbb49;		/* mov <code>, %r11	*/
  1.6270 ++  tramp[5] = 0xba49;		/* mov <data>, %r10	*/
  1.6271 ++  tramp[10] = 0xff49;		/* jmp *%r11	*/
  1.6272 ++  tramp[11] = 0x00e3;
  1.6273 ++  *(void * volatile *) &tramp[1] = ffi_closure_UNIX64;
  1.6274 ++  *(void * volatile *) &tramp[6] = closure;
  1.6275 ++
  1.6276 ++  closure->cif = cif;
  1.6277 ++  closure->fun = fun;
  1.6278 ++  closure->user_data = user_data;
  1.6279 ++
  1.6280 ++  return FFI_OK;
  1.6281 ++}
  1.6282 ++
  1.6283 ++int
  1.6284 ++ffi_closure_UNIX64_inner(ffi_closure *closure, va_list l, void *rp)
  1.6285 ++{
  1.6286 ++  ffi_cif *cif;
  1.6287 ++  void **avalue;
  1.6288 ++  ffi_type **arg_types;
  1.6289 ++  long i, avn, argn;
  1.6290 ++
  1.6291 ++  cif = closure->cif;
  1.6292 ++  avalue = alloca(cif->nargs * sizeof(void *));
  1.6293 ++
  1.6294 ++  argn = 0;
  1.6295 ++
  1.6296 ++  i = 0;
  1.6297 ++  avn = cif->nargs;
  1.6298 ++  arg_types = cif->arg_types;
  1.6299 ++  
  1.6300 ++  /* Grab the addresses of the arguments from the stack frame.  */
  1.6301 ++  while (i < avn)
  1.6302 ++    {
  1.6303 ++      switch (arg_types[i]->type)
  1.6304 ++	{
  1.6305 ++	case FFI_TYPE_SINT8:
  1.6306 ++	case FFI_TYPE_UINT8:
  1.6307 ++	case FFI_TYPE_SINT16:
  1.6308 ++	case FFI_TYPE_UINT16:
  1.6309 ++	case FFI_TYPE_SINT32:
  1.6310 ++	case FFI_TYPE_UINT32:
  1.6311 ++	case FFI_TYPE_SINT64:
  1.6312 ++	case FFI_TYPE_UINT64:
  1.6313 ++	case FFI_TYPE_POINTER:
  1.6314 ++	  {
  1.6315 ++	    if (l->gp_offset > 48-8)
  1.6316 ++	      {
  1.6317 ++		avalue[i] = l->overflow_arg_area;
  1.6318 ++		l->overflow_arg_area = (char *)l->overflow_arg_area + 8;
  1.6319 ++	      }
  1.6320 ++	    else
  1.6321 ++	      {
  1.6322 ++		avalue[i] = (char *)l->reg_save_area + l->gp_offset;
  1.6323 ++		l->gp_offset += 8;
  1.6324 ++	      }
  1.6325 ++	  }
  1.6326 ++	  break;
  1.6327 ++
  1.6328 ++	case FFI_TYPE_STRUCT:
  1.6329 ++	  /* FIXME  */
  1.6330 ++	  FFI_ASSERT(0);
  1.6331 ++	  break;
  1.6332 ++
  1.6333 ++	case FFI_TYPE_DOUBLE:
  1.6334 ++	  {
  1.6335 ++	    if (l->fp_offset > 176-16)
  1.6336 ++	      {
  1.6337 ++		avalue[i] = l->overflow_arg_area;
  1.6338 ++		l->overflow_arg_area = (char *)l->overflow_arg_area + 8;
  1.6339 ++	      }
  1.6340 ++	    else
  1.6341 ++	      {
  1.6342 ++		avalue[i] = (char *)l->reg_save_area + l->fp_offset;
  1.6343 ++		l->fp_offset += 16;
  1.6344 ++	      }
  1.6345 ++	  }
  1.6346 ++#if DEBUG_FFI
  1.6347 ++	  fprintf (stderr, "double arg %d = %g\n", i, *(double *)avalue[i]);
  1.6348 ++#endif
  1.6349 ++	  break;
  1.6350 ++	  
  1.6351 ++	case FFI_TYPE_FLOAT:
  1.6352 ++	  {
  1.6353 ++	    if (l->fp_offset > 176-16)
  1.6354 ++	      {
  1.6355 ++		avalue[i] = l->overflow_arg_area;
  1.6356 ++		l->overflow_arg_area = (char *)l->overflow_arg_area + 8;
  1.6357 ++	      }
  1.6358 ++	    else
  1.6359 ++	      {
  1.6360 ++		avalue[i] = (char *)l->reg_save_area + l->fp_offset;
  1.6361 ++		l->fp_offset += 16;
  1.6362 ++	      }
  1.6363 ++	  }
  1.6364 ++#if DEBUG_FFI
  1.6365 ++	  fprintf (stderr, "float arg %d = %g\n", i, *(float *)avalue[i]);
  1.6366 ++#endif
  1.6367 ++	  break;
  1.6368 ++	  
  1.6369 ++	default:
  1.6370 ++	  FFI_ASSERT(0);
  1.6371 ++	}
  1.6372 ++
  1.6373 ++      argn += ALIGN(arg_types[i]->size, SIZEOF_ARG) / SIZEOF_ARG;
  1.6374 ++      i++;
  1.6375 ++    }
  1.6376 ++
  1.6377 ++  /* Invoke the closure.  */
  1.6378 ++  (closure->fun) (cif, rp, avalue, closure->user_data);
  1.6379 ++
  1.6380 ++  /* FIXME: Structs not supported.  */
  1.6381 ++  FFI_ASSERT(cif->rtype->type != FFI_TYPE_STRUCT);
  1.6382 ++
  1.6383 ++  /* Tell ffi_closure_UNIX64 how to perform return type promotions.  */
  1.6384 ++
  1.6385 ++  return cif->rtype->type;
  1.6386 ++}
  1.6387 ++#endif /* ifndef __x86_64__ */
  1.6388 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/sysv.S gcc/libffi/src/x86/sysv.S
  1.6389 +--- gcc-3.2.2.orig/libffi/src/x86/sysv.S	Tue Jul 17 02:10:53 2001
  1.6390 ++++ gcc/libffi/src/x86/sysv.S	Fri Jul 19 08:08:31 2002
  1.6391 +@@ -1,5 +1,5 @@
  1.6392 + /* -----------------------------------------------------------------------
  1.6393 +-   sysv.S - Copyright (c) 1996, 1998, 2001  Cygnus Solutions
  1.6394 ++   sysv.S - Copyright (c) 1996, 1998, 2001, 2002  Cygnus Solutions
  1.6395 +    
  1.6396 +    X86 Foreign Function Interface 
  1.6397 + 
  1.6398 +@@ -23,6 +23,8 @@
  1.6399 +    OTHER DEALINGS IN THE SOFTWARE.
  1.6400 +    ----------------------------------------------------------------------- */
  1.6401 + 
  1.6402 ++#ifndef __x86_64__
  1.6403 ++
  1.6404 + #define LIBFFI_ASM	
  1.6405 + #include <ffi.h>
  1.6406 + 
  1.6407 +@@ -163,3 +165,5 @@
  1.6408 + 	.align 4
  1.6409 + .LEFDE1:
  1.6410 + 	.set	.LLFDE1,.LEFDE1-.LSFDE1
  1.6411 ++
  1.6412 ++#endif /* ifndef __x86_64__ */
  1.6413 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/unix64.S gcc/libffi/src/x86/unix64.S
  1.6414 +--- gcc-3.2.2.orig/libffi/src/x86/unix64.S	Thu Jan  1 09:00:00 1970
  1.6415 ++++ gcc/libffi/src/x86/unix64.S	Wed Jan 29 00:54:28 2003
  1.6416 +@@ -0,0 +1,302 @@
  1.6417 ++/* -----------------------------------------------------------------------
  1.6418 ++   unix64.S - Copyright (c) 2002  Bo Thorsen <bo@suse.de>
  1.6419 ++
  1.6420 ++   x86-64 Foreign Function Interface 
  1.6421 ++
  1.6422 ++   Permission is hereby granted, free of charge, to any person obtaining
  1.6423 ++   a copy of this software and associated documentation files (the
  1.6424 ++   ``Software''), to deal in the Software without restriction, including
  1.6425 ++   without limitation the rights to use, copy, modify, merge, publish,
  1.6426 ++   distribute, sublicense, and/or sell copies of the Software, and to
  1.6427 ++   permit persons to whom the Software is furnished to do so, subject to
  1.6428 ++   the following conditions:
  1.6429 ++
  1.6430 ++   The above copyright notice and this permission notice shall be included
  1.6431 ++   in all copies or substantial portions of the Software.
  1.6432 ++
  1.6433 ++   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
  1.6434 ++   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  1.6435 ++   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  1.6436 ++   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  1.6437 ++   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  1.6438 ++   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  1.6439 ++   OTHER DEALINGS IN THE SOFTWARE.
  1.6440 ++   ----------------------------------------------------------------------- */
  1.6441 ++
  1.6442 ++#ifdef __x86_64__
  1.6443 ++#define LIBFFI_ASM	
  1.6444 ++#include <ffi.h>
  1.6445 ++
  1.6446 ++	.section	.rodata
  1.6447 ++.LC0:
  1.6448 ++	.string	"asm in progress %lld\n"
  1.6449 ++.LC1:
  1.6450 ++	.string	"asm in progress\n"
  1.6451 ++.text
  1.6452 ++	.align	2
  1.6453 ++.globl ffi_call_UNIX64
  1.6454 ++        .type	ffi_call_UNIX64,@function
  1.6455 ++
  1.6456 ++ffi_call_UNIX64:
  1.6457 ++.LFB1:
  1.6458 ++        pushq	%rbp
  1.6459 ++.LCFI0:
  1.6460 ++        movq	%rsp, %rbp
  1.6461 ++.LCFI1:
  1.6462 ++	/* Save all arguments */
  1.6463 ++	subq	$48, %rsp
  1.6464 ++.LCFI2:
  1.6465 ++	movq	%rdi, -8(%rbp)		/* ffi_prep_args	 */
  1.6466 ++	movq	%rsi, -16(%rbp)		/* ffi_fill_return_value */
  1.6467 ++	movq	%rdx, -24(%rbp)		/* ecif			 */
  1.6468 ++	movq	%rcx, -32(%rbp)		/* cif->bytes		 */
  1.6469 ++	movq	%r8, -40(%rbp)		/* ecif.rvalue		 */
  1.6470 ++	movq	%r9, -48(%rbp)		/* fn			 */
  1.6471 ++
  1.6472 ++	/* Make room for all of the new args and the register args */
  1.6473 ++	addl	$176, %ecx
  1.6474 ++.LCFI3:
  1.6475 ++	subq	%rcx, %rsp
  1.6476 ++.LCFI4:
  1.6477 ++	/* Setup the call to ffi_prep_args.  */
  1.6478 ++	movq	%rdi, %rax		/* &ffi_prep_args	*/
  1.6479 ++	movq	%rsp, %rdi		/* stackLayout		*/
  1.6480 ++	movq	%rdx, %rsi		/* ecif			*/
  1.6481 ++	call	*%rax			/* ffi_prep_args(stackLayout, ecif);*/ 
  1.6482 ++
  1.6483 ++	/* ffi_prep_args have put all the register contents into the  */
  1.6484 ++	/* stackLayout struct. Now put the register values in place.  */
  1.6485 ++	movq	(%rsp), %rdi
  1.6486 ++	movq	8(%rsp), %rsi
  1.6487 ++	movq	16(%rsp), %rdx
  1.6488 ++	movq	24(%rsp), %rcx
  1.6489 ++	movq	32(%rsp), %r8
  1.6490 ++	movq	40(%rsp), %r9
  1.6491 ++	movaps	48(%rsp), %xmm0
  1.6492 ++	movaps	64(%rsp), %xmm1
  1.6493 ++	movaps	80(%rsp), %xmm2
  1.6494 ++	movaps	96(%rsp), %xmm3
  1.6495 ++	movaps	112(%rsp), %xmm4
  1.6496 ++	movaps	128(%rsp), %xmm5
  1.6497 ++	movaps	144(%rsp), %xmm6
  1.6498 ++	movaps	160(%rsp), %xmm7
  1.6499 ++
  1.6500 ++	/* Remove space for stackLayout so stack arguments are placed
  1.6501 ++	   correctly for the call.  */
  1.6502 ++.LCFI5:
  1.6503 ++	addq	$176, %rsp
  1.6504 ++.LCFI6:
  1.6505 ++	/* Call the user function.  */
  1.6506 ++	call	*-48(%rbp)
  1.6507 ++
  1.6508 ++	/* Make stack space for the return_value struct.  */
  1.6509 ++	subq	$64, %rsp
  1.6510 ++
  1.6511 ++	/* Fill in all potential return values to this struct.  */
  1.6512 ++	movq	%rax, (%rsp)
  1.6513 ++	movq	%rdx, 8(%rsp)
  1.6514 ++	movaps	%xmm0, 16(%rsp)
  1.6515 ++	movaps	%xmm1, 32(%rsp)
  1.6516 ++	fstpt	48(%rsp)
  1.6517 ++
  1.6518 ++	/* Now call ffi_fill_return_value.  */
  1.6519 ++	movq	%rsp, %rdi		/* struct return_value	  */
  1.6520 ++	movq	-24(%rbp), %rsi		/* ecif			  */
  1.6521 ++	movq	-16(%rbp), %rax		/* &ffi_fill_return_value */
  1.6522 ++	call	*%rax			/* call it		  */
  1.6523 ++
  1.6524 ++	/* And the work is done.  */
  1.6525 ++        leave
  1.6526 ++        ret
  1.6527 ++.LFE1:
  1.6528 ++.ffi_call_UNIX64_end:
  1.6529 ++        .size    ffi_call_UNIX64,.ffi_call_UNIX64_end-ffi_call_UNIX64
  1.6530 ++
  1.6531 ++.text
  1.6532 ++	.align	2
  1.6533 ++.globl float2sse
  1.6534 ++        .type	float2sse,@function
  1.6535 ++float2sse:
  1.6536 ++	/* Save the contents of this sse-float in a pointer.  */
  1.6537 ++	movaps	%xmm0, (%rdi)
  1.6538 ++	ret
  1.6539 ++
  1.6540 ++	.align	2
  1.6541 ++.globl floatfloat2sse
  1.6542 ++        .type	floatfloat2sse,@function
  1.6543 ++floatfloat2sse:
  1.6544 ++	/* Save the contents of these two sse-floats in a pointer.  */
  1.6545 ++	movq	(%rdi), %xmm0
  1.6546 ++	movaps	%xmm0, (%rsi)
  1.6547 ++	ret
  1.6548 ++
  1.6549 ++	.align	2
  1.6550 ++.globl double2sse
  1.6551 ++        .type	double2sse,@function
  1.6552 ++double2sse:
  1.6553 ++	/* Save the contents of this sse-double in a pointer.  */
  1.6554 ++	movaps	%xmm0, (%rdi)
  1.6555 ++	ret
  1.6556 ++
  1.6557 ++	.align	2
  1.6558 ++.globl sse2float
  1.6559 ++        .type	sse2float,@function
  1.6560 ++sse2float:
  1.6561 ++	/* Save the contents of this sse-float in a pointer.  */
  1.6562 ++	movaps	(%rdi), %xmm0
  1.6563 ++	ret
  1.6564 ++
  1.6565 ++	.align	2
  1.6566 ++.globl sse2double
  1.6567 ++        .type	sse2double,@function
  1.6568 ++sse2double:
  1.6569 ++	/* Save the contents of this pointer in a sse-double.  */
  1.6570 ++	movaps	(%rdi), %xmm0
  1.6571 ++	ret
  1.6572 ++
  1.6573 ++	.align	2
  1.6574 ++.globl sse2floatfloat
  1.6575 ++        .type	sse2floatfloat,@function
  1.6576 ++sse2floatfloat:
  1.6577 ++	/* Save the contents of this pointer in two sse-floats.  */
  1.6578 ++	movaps	(%rdi), %xmm0
  1.6579 ++	movq	%xmm0, (%rsi)
  1.6580 ++	ret
  1.6581 ++
  1.6582 ++	.align	2
  1.6583 ++.globl ffi_closure_UNIX64
  1.6584 ++        .type	ffi_closure_UNIX64,@function
  1.6585 ++
  1.6586 ++ffi_closure_UNIX64:
  1.6587 ++.LFB2:
  1.6588 ++        pushq   %rbp
  1.6589 ++.LCFI10:
  1.6590 ++        movq    %rsp, %rbp
  1.6591 ++.LCFI11:
  1.6592 ++        subq    $240, %rsp
  1.6593 ++.LCFI12:
  1.6594 ++	movq	%rdi, -176(%rbp)
  1.6595 ++        movq    %rsi, -168(%rbp)
  1.6596 ++        movq    %rdx, -160(%rbp)
  1.6597 ++        movq    %rcx, -152(%rbp)
  1.6598 ++        movq    %r8, -144(%rbp)
  1.6599 ++        movq    %r9, -136(%rbp)
  1.6600 ++        /* FIXME: We can avoid all this stashing of XMM registers by
  1.6601 ++	   (in ffi_prep_closure) computing the number of
  1.6602 ++	   floating-point args and moving it into %rax before calling
  1.6603 ++	   this function.  Once this is done, uncomment the next few
  1.6604 ++	   lines and only the essential XMM registers will be written
  1.6605 ++	   to memory.  This is a significant saving.  */
  1.6606 ++/*         movzbl  %al, %eax  */
  1.6607 ++/*         movq    %rax, %rdx */
  1.6608 ++/*         leaq    0(,%rdx,4), %rax */
  1.6609 ++/*         leaq    2f(%rip), %rdx */
  1.6610 ++/*         subq    %rax, %rdx */
  1.6611 ++        leaq    -1(%rbp), %rax
  1.6612 ++/*         jmp     *%rdx */
  1.6613 ++        movaps  %xmm7, -15(%rax)
  1.6614 ++        movaps  %xmm6, -31(%rax)
  1.6615 ++        movaps  %xmm5, -47(%rax)
  1.6616 ++        movaps  %xmm4, -63(%rax)
  1.6617 ++        movaps  %xmm3, -79(%rax)
  1.6618 ++        movaps  %xmm2, -95(%rax)
  1.6619 ++        movaps  %xmm1, -111(%rax)
  1.6620 ++        movaps  %xmm0, -127(%rax)
  1.6621 ++2:
  1.6622 ++        movl    %edi, -180(%rbp)
  1.6623 ++        movl    $0, -224(%rbp)
  1.6624 ++        movl    $48, -220(%rbp)
  1.6625 ++        leaq    16(%rbp), %rax
  1.6626 ++        movq    %rax, -216(%rbp)
  1.6627 ++        leaq    -176(%rbp), %rdx
  1.6628 ++        movq    %rdx, -208(%rbp)
  1.6629 ++        leaq    -224(%rbp), %rsi
  1.6630 ++	movq	%r10, %rdi
  1.6631 ++	movq	%rsp, %rdx
  1.6632 ++        call    ffi_closure_UNIX64_inner@PLT
  1.6633 ++
  1.6634 ++	cmpl	$FFI_TYPE_FLOAT, %eax
  1.6635 ++	je	1f
  1.6636 ++	cmpl	$FFI_TYPE_DOUBLE, %eax
  1.6637 ++	je	2f
  1.6638 ++	cmpl	$FFI_TYPE_LONGDOUBLE, %eax
  1.6639 ++	je	3f
  1.6640 ++	cmpl	$FFI_TYPE_STRUCT, %eax
  1.6641 ++	je	4f
  1.6642 ++	popq	%rax
  1.6643 ++        leave
  1.6644 ++        ret
  1.6645 ++1:
  1.6646 ++2:
  1.6647 ++3:	
  1.6648 ++	movaps	-240(%rbp), %xmm0
  1.6649 ++        leave
  1.6650 ++        ret
  1.6651 ++4:
  1.6652 ++	leave
  1.6653 ++	ret
  1.6654 ++.LFE2:	
  1.6655 ++		
  1.6656 ++        .section        .eh_frame,"a",@progbits
  1.6657 ++.Lframe0:
  1.6658 ++        .long   .LECIE1-.LSCIE1
  1.6659 ++.LSCIE1:
  1.6660 ++        .long   0x0
  1.6661 ++        .byte   0x1
  1.6662 ++        .string "zR"
  1.6663 ++        .uleb128 0x1
  1.6664 ++        .sleb128 -8
  1.6665 ++        .byte   0x10
  1.6666 ++        .uleb128 0x1
  1.6667 ++        .byte   0x1b
  1.6668 ++        .byte   0xc
  1.6669 ++        .uleb128 0x7
  1.6670 ++        .uleb128 0x8
  1.6671 ++        .byte   0x90
  1.6672 ++        .uleb128 0x1
  1.6673 ++        .align 8
  1.6674 ++.LECIE1:
  1.6675 ++.LSFDE1:
  1.6676 ++	.long	.LEFDE1-.LASFDE1
  1.6677 ++.LASFDE1:
  1.6678 ++        .long   .LASFDE1-.Lframe0
  1.6679 ++
  1.6680 ++        .long   .LFB1-.
  1.6681 ++        .long   .LFE1-.LFB1
  1.6682 ++        .uleb128 0x0
  1.6683 ++        .byte   0x4		# DW_CFA_advance_loc4
  1.6684 ++        .long   .LCFI0-.LFB1
  1.6685 ++        .byte   0xe		# DW_CFA_def_cfa_offset
  1.6686 ++        .uleb128 0x10
  1.6687 ++        .byte   0x86		# DW_CFA_offset: r6 at cfa-16
  1.6688 ++        .uleb128 0x2
  1.6689 ++        .byte   0x4		# DW_CFA_advance_loc4
  1.6690 ++        .long   .LCFI1-.LCFI0
  1.6691 ++        .byte   0x86		# DW_CFA_offset: r6 at cfa-16
  1.6692 ++        .uleb128 0x2
  1.6693 ++        .byte   0xd		# DW_CFA_def_cfa_reg: r6
  1.6694 ++        .uleb128 0x6
  1.6695 ++	.align 8
  1.6696 ++.LEFDE1:
  1.6697 ++.LSFDE3:
  1.6698 ++        .long   .LEFDE3-.LASFDE3        # FDE Length
  1.6699 ++.LASFDE3:
  1.6700 ++        .long   .LASFDE3-.Lframe0       # FDE CIE offset
  1.6701 ++
  1.6702 ++        .long   .LFB2-. # FDE initial location
  1.6703 ++        .long   .LFE2-.LFB2     # FDE address range
  1.6704 ++        .uleb128 0x0    # Augmentation size
  1.6705 ++        .byte   0x4     # DW_CFA_advance_loc4
  1.6706 ++        .long   .LCFI10-.LFB2
  1.6707 ++        .byte   0xe     # DW_CFA_def_cfa_offset
  1.6708 ++        .uleb128 0x10
  1.6709 ++        .byte   0x86    # DW_CFA_offset, column 0x6
  1.6710 ++        .uleb128 0x2
  1.6711 ++        .byte   0x4     # DW_CFA_advance_loc4
  1.6712 ++        .long   .LCFI11-.LCFI10
  1.6713 ++        .byte   0xd     # DW_CFA_def_cfa_register
  1.6714 ++        .uleb128 0x6
  1.6715 ++        .align 8
  1.6716 ++.LEFDE3:
  1.6717 ++
  1.6718 ++#endif /* __x86_64__  */
  1.6719 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/win32.S gcc/libffi/src/x86/win32.S
  1.6720 +--- gcc-3.2.2.orig/libffi/src/x86/win32.S	Tue Mar 27 11:39:16 2001
  1.6721 ++++ gcc/libffi/src/x86/win32.S	Fri Dec  6 10:16:45 2002
  1.6722 +@@ -1,5 +1,8 @@
  1.6723 + /* -----------------------------------------------------------------------
  1.6724 +-   win32.S - Copyright (c) 1996, 1998, 2001  Cygnus Solutions
  1.6725 ++   win32.S - Copyright (c) 1996, 1998, 2001, 2002  Red Hat, Inc.
  1.6726 ++	     Copyright (c) 2001  John Beniton
  1.6727 ++	     Copyright (c) 2002  Ranjit Mathew
  1.6728 ++			
  1.6729 +  
  1.6730 +    X86 Foreign Function Interface
  1.6731 +  
  1.6732 +@@ -52,7 +55,10 @@
  1.6733 +         # Return stack to previous state and call the function
  1.6734 +         addl  $8,%esp
  1.6735 +  
  1.6736 +-        call  *28(%ebp)
  1.6737 ++        # FIXME: Align the stack to a 128-bit boundary to avoid
  1.6738 ++        # potential performance hits.
  1.6739 ++
  1.6740 ++	call  *28(%ebp)
  1.6741 +  
  1.6742 +         # Remove the space we pushed for the args
  1.6743 +         movl  16(%ebp),%ecx
  1.6744 +@@ -123,3 +129,98 @@
  1.6745 +         ret
  1.6746 +  
  1.6747 + .ffi_call_SYSV_end:
  1.6748 ++
  1.6749 ++        # This assumes we are using gas.
  1.6750 ++        .balign 16
  1.6751 ++.globl _ffi_call_STDCALL
  1.6752 ++
  1.6753 ++_ffi_call_STDCALL:
  1.6754 ++        pushl %ebp
  1.6755 ++        movl  %esp,%ebp
  1.6756 ++
  1.6757 ++        # Make room for all of the new args.
  1.6758 ++        movl  16(%ebp),%ecx 
  1.6759 ++        subl  %ecx,%esp
  1.6760 ++
  1.6761 ++        movl  %esp,%eax
  1.6762 ++
  1.6763 ++        # Place all of the ffi_prep_args in position
  1.6764 ++        pushl 12(%ebp)
  1.6765 ++        pushl %eax
  1.6766 ++        call  *8(%ebp)
  1.6767 ++
  1.6768 ++        # Return stack to previous state and call the function
  1.6769 ++        addl  $8,%esp
  1.6770 ++
  1.6771 ++        # FIXME: Align the stack to a 128-bit boundary to avoid
  1.6772 ++        # potential performance hits.
  1.6773 ++
  1.6774 ++        call  *28(%ebp)
  1.6775 ++
  1.6776 ++        # stdcall functions pop arguments off the stack themselves
  1.6777 ++
  1.6778 ++        # Load %ecx with the return type code
  1.6779 ++        movl  20(%ebp),%ecx
  1.6780 ++
  1.6781 ++        # If the return value pointer is NULL, assume no return value.
  1.6782 ++        cmpl  $0,24(%ebp)
  1.6783 ++        jne   sc_retint
  1.6784 ++
  1.6785 ++        # Even if there is no space for the return value, we are
  1.6786 ++        # obliged to handle floating-point values.
  1.6787 ++        cmpl  $FFI_TYPE_FLOAT,%ecx
  1.6788 ++        jne   sc_noretval
  1.6789 ++        fstp  %st(0)
  1.6790 ++
  1.6791 ++        jmp   sc_epilogue
  1.6792 ++
  1.6793 ++sc_retint:
  1.6794 ++        cmpl  $FFI_TYPE_INT,%ecx
  1.6795 ++        jne   sc_retfloat
  1.6796 ++        # Load %ecx with the pointer to storage for the return value
  1.6797 ++        movl  24(%ebp),%ecx
  1.6798 ++        movl  %eax,0(%ecx)
  1.6799 ++        jmp   sc_epilogue
  1.6800 ++
  1.6801 ++sc_retfloat:
  1.6802 ++        cmpl  $FFI_TYPE_FLOAT,%ecx
  1.6803 ++        jne   sc_retdouble
  1.6804 ++         # Load %ecx with the pointer to storage for the return value
  1.6805 ++        movl  24(%ebp),%ecx
  1.6806 ++        fstps (%ecx)
  1.6807 ++        jmp   sc_epilogue
  1.6808 ++
  1.6809 ++sc_retdouble:
  1.6810 ++        cmpl  $FFI_TYPE_DOUBLE,%ecx
  1.6811 ++        jne   sc_retlongdouble
  1.6812 ++        # Load %ecx with the pointer to storage for the return value
  1.6813 ++        movl  24(%ebp),%ecx
  1.6814 ++        fstpl (%ecx)
  1.6815 ++        jmp   sc_epilogue
  1.6816 ++
  1.6817 ++sc_retlongdouble:
  1.6818 ++        cmpl  $FFI_TYPE_LONGDOUBLE,%ecx
  1.6819 ++        jne   sc_retint64
  1.6820 ++        # Load %ecx with the pointer to storage for the return value
  1.6821 ++        movl  24(%ebp),%ecx
  1.6822 ++        fstpt (%ecx)
  1.6823 ++        jmp   sc_epilogue
  1.6824 ++
  1.6825 ++sc_retint64:
  1.6826 ++        cmpl  $FFI_TYPE_SINT64,%ecx
  1.6827 ++        jne   sc_retstruct
  1.6828 ++        # Load %ecx with the pointer to storage for the return value
  1.6829 ++        movl  24(%ebp),%ecx
  1.6830 ++        movl  %eax,0(%ecx)
  1.6831 ++        movl  %edx,4(%ecx)
  1.6832 ++
  1.6833 ++sc_retstruct:
  1.6834 ++        # Nothing to do!
  1.6835 ++
  1.6836 ++sc_noretval:
  1.6837 ++sc_epilogue:
  1.6838 ++        movl %ebp,%esp
  1.6839 ++        popl %ebp
  1.6840 ++        ret
  1.6841 ++
  1.6842 ++.ffi_call_STDCALL_end:
  1.6843 +--- gcc-3.2.2.orig/libjava/configure.host	Mon Jun 10 13:15:26 2002
  1.6844 ++++ gcc-3.2.2/libjava/configure.host	Sat Feb 15 19:57:25 2003
  1.6845 +@@ -115,6 +115,12 @@
  1.6846 + 	enable_getenv_properties_default=no
  1.6847 + 	enable_main_args_default=no
  1.6848 + 	;;
  1.6849 ++  sh-* | sh[34]*-*)
  1.6850 ++	sysdeps_dir=sh
  1.6851 ++	libgcj_flags="${libgcj_flags} -mieee"
  1.6852 ++	libgcj_interpreter=yes
  1.6853 ++	enable_hash_synchronization_default=yes
  1.6854 ++	;;
  1.6855 + esac
  1.6856 + 
  1.6857 + # This case statement supports generic port properties and may refine
  1.6858 +@@ -126,7 +132,8 @@
  1.6859 +   powerpc*-linux* | \
  1.6860 +   alpha*-linux* | \
  1.6861 +   sparc*-linux* | \
  1.6862 +-  ia64-*)
  1.6863 ++  ia64-* | \
  1.6864 ++  sh-linux* | sh[34]*-linux*)
  1.6865 +   	can_unwind_signal=yes
  1.6866 + 	;;
  1.6867 +   *-*-darwin*)