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 Tue May 29 19:56:21 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*)