patches/gcc/3.2.3/140-gcc-3.2.3-libffi-1.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Feb 17 22:08:06 2008 +0000 (2008-02-17)
changeset 431 8bde4c6ea47a
permissions -rw-r--r--
Robert P. J. DAY says:

apparently, the patchset for gcc 4.2.1 applies properly to the
source for gcc 4.2.2 and gcc 4.2.3. so, if you want, you can simply
add support for those last two just by augmenting menuconfig and
adding a couple symlinks for those two directories. seems like a
cheap way to add a couple new versions.
yann@402
     1
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.am gcc/libffi/Makefile.am
yann@402
     2
--- gcc-3.2.2.orig/libffi/Makefile.am	Tue Jan 28 10:43:56 2003
yann@402
     3
+++ gcc/libffi/Makefile.am	Tue Jan 28 10:48:33 2003
yann@402
     4
@@ -8,14 +8,17 @@
yann@402
     5
 		src/mips/n32.s src/mips/o32.S src/mips/o32.s \
yann@402
     6
 		src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \
yann@402
     7
 		src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \
yann@402
     8
+		src/x86/ffi64.c src/x86/unix64.S \
yann@402
     9
 		src/alpha/ffi.c src/alpha/osf.S \
yann@402
    10
 		src/m68k/ffi.c src/m68k/sysv.S \
yann@402
    11
 		src/powerpc/ffi.c src/powerpc/sysv.S \
yann@402
    12
 		src/powerpc/ppc_closure.S src/powerpc/asm.h \
yann@402
    13
 		src/powerpc/ffi_darwin.c \
yann@402
    14
 		src/powerpc/darwin.S src/powerpc/aix.S \
yann@402
    15
-		src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \
yann@402
    16
-		src/arm/ffi.c src/arm/sysv.S
yann@402
    17
+		src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \
yann@402
    18
+		src/arm/ffi.c src/arm/sysv.S \
yann@402
    19
+		src/s390/ffi.c src/s390/sysv.S \
yann@402
    20
+		src/sh/ffi.c src/sh/sysv.S
yann@402
    21
 
yann@402
    22
 VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@
yann@402
    23
 
yann@402
    24
@@ -83,6 +86,7 @@
yann@402
    25
 ffitest_LDFLAGS = -shared-libgcc
yann@402
    26
 
yann@402
    27
 TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S
yann@402
    28
+TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S
yann@402
    29
 TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s
yann@402
    30
 TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S
yann@402
    31
 TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S
yann@402
    32
@@ -91,9 +95,12 @@
yann@402
    33
 TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S
yann@402
    34
 TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S
yann@402
    35
 TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
yann@402
    36
-TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S
yann@402
    37
+TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
yann@402
    38
 TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
yann@402
    39
 TARGET_SRC_ARM =  src/arm/sysv.S src/arm/ffi.c
yann@402
    40
+TARGET_SRC_S390 =  src/s390/sysv.S src/s390/ffi.c
yann@402
    41
+TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
yann@402
    42
+TARGET_SRC_SH =  src/sh/sysv.S src/sh/ffi.c
yann@402
    43
 
yann@402
    44
 ##libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c $(TARGET_SRC_@TARGET@)
yann@402
    45
 ## Work around automake deficiency
yann@402
    46
@@ -103,6 +110,10 @@
yann@402
    47
 libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
yann@402
    48
 libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
yann@402
    49
 endif
yann@402
    50
+if MIPS_LINUX
yann@402
    51
+libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
yann@402
    52
+libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
yann@402
    53
+endif
yann@402
    54
 if MIPS_SGI
yann@402
    55
 libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
yann@402
    56
 libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
yann@402
    57
@@ -147,6 +158,18 @@
yann@402
    58
 libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
yann@402
    59
 libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
yann@402
    60
 endif
yann@402
    61
+if S390
yann@402
    62
+libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
yann@402
    63
+libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
yann@402
    64
+endif
yann@402
    65
+if X86_64
yann@402
    66
+libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
yann@402
    67
+libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
yann@402
    68
+endif
yann@402
    69
+if SH
yann@402
    70
+libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
yann@402
    71
+libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
yann@402
    72
+endif
yann@402
    73
 
yann@402
    74
 AM_CFLAGS = -fexceptions
yann@402
    75
 
yann@402
    76
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.in gcc/libffi/Makefile.in
yann@402
    77
--- gcc-3.2.2.orig/libffi/Makefile.in	Wed Jan 29 07:59:05 2003
yann@402
    78
+++ gcc/libffi/Makefile.in	Wed Jan 29 07:58:58 2003
yann@402
    79
@@ -91,14 +91,17 @@
yann@402
    80
 		src/mips/n32.s src/mips/o32.S src/mips/o32.s \
yann@402
    81
 		src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \
yann@402
    82
 		src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \
yann@402
    83
+		src/x86/ffi64.c src/x86/unix64.S \
yann@402
    84
 		src/alpha/ffi.c src/alpha/osf.S \
yann@402
    85
 		src/m68k/ffi.c src/m68k/sysv.S \
yann@402
    86
 		src/powerpc/ffi.c src/powerpc/sysv.S \
yann@402
    87
 		src/powerpc/ppc_closure.S src/powerpc/asm.h \
yann@402
    88
 		src/powerpc/ffi_darwin.c \
yann@402
    89
 		src/powerpc/darwin.S src/powerpc/aix.S \
yann@402
    90
-		src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \
yann@402
    91
-		src/arm/ffi.c src/arm/sysv.S
yann@402
    92
+		src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \
yann@402
    93
+		src/arm/ffi.c src/arm/sysv.S \
yann@402
    94
+		src/s390/ffi.c src/s390/sysv.S \
yann@402
    95
+		src/sh/ffi.c src/sh/sysv.S
yann@402
    96
 
yann@402
    97
 
yann@402
    98
 VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@
yann@402
    99
@@ -162,6 +165,7 @@
yann@402
   100
 ffitest_LDFLAGS = -shared-libgcc
yann@402
   101
 
yann@402
   102
 TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S
yann@402
   103
+TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S
yann@402
   104
 TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s
yann@402
   105
 TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S
yann@402
   106
 TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S
yann@402
   107
@@ -170,14 +174,18 @@
yann@402
   108
 TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S
yann@402
   109
 TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S
yann@402
   110
 TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
yann@402
   111
-TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S
yann@402
   112
+TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
yann@402
   113
 TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
yann@402
   114
 TARGET_SRC_ARM = src/arm/sysv.S src/arm/ffi.c
yann@402
   115
+TARGET_SRC_S390 = src/s390/sysv.S src/s390/ffi.c
yann@402
   116
+TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
yann@402
   117
+TARGET_SRC_SH = src/sh/sysv.S src/sh/ffi.c
yann@402
   118
 
yann@402
   119
 libffi_la_common_SOURCES = src/debug.c src/prep_cif.c src/types.c \
yann@402
   120
 		src/raw_api.c src/java_raw_api.c
yann@402
   121
 
yann@402
   122
 @MIPS_GCC_TRUE@libffi_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
yann@402
   123
+@MIPS_LINUX_TRUE@libffi_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
yann@402
   124
 @MIPS_SGI_TRUE@libffi_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
yann@402
   125
 @X86_TRUE@libffi_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86)
yann@402
   126
 @X86_WIN32_TRUE@libffi_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32)
yann@402
   127
@@ -189,7 +197,11 @@
yann@402
   128
 @POWERPC_AIX_TRUE@libffi_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX)
yann@402
   129
 @POWERPC_DARWIN_TRUE@libffi_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN)
yann@402
   130
 @ARM_TRUE@libffi_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
yann@402
   131
+@S390_TRUE@libffi_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
yann@402
   132
+@X86_64_TRUE@libffi_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
yann@402
   133
+@SH_TRUE@libffi_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
yann@402
   134
 @MIPS_GCC_TRUE@libffi_convenience_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
yann@402
   135
+@MIPS_LINUX_TRUE@libffi_convenience_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
yann@402
   136
 @MIPS_SGI_TRUE@libffi_convenience_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
yann@402
   137
 @X86_TRUE@libffi_convenience_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86)
yann@402
   138
 @X86_WIN32_TRUE@libffi_convenience_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32)
yann@402
   139
@@ -201,6 +213,9 @@
yann@402
   140
 @POWERPC_AIX_TRUE@libffi_convenience_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX)
yann@402
   141
 @POWERPC_DARWIN_TRUE@libffi_convenience_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN)
yann@402
   142
 @ARM_TRUE@libffi_convenience_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
yann@402
   143
+@S390_TRUE@libffi_convenience_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
yann@402
   144
+@X86_64_TRUE@libffi_convenience_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
yann@402
   145
+@SH_TRUE@libfficonvenience_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
yann@402
   146
 
yann@402
   147
 AM_CFLAGS = -fexceptions
yann@402
   148
 
yann@402
   149
@@ -208,7 +223,7 @@
yann@402
   150
 
yann@402
   151
 INCLUDES = -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
yann@402
   152
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
yann@402
   153
-mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
yann@402
   154
+mkinstalldirs = $(SHELL) $(top_srcdir)/${libffi_basedir}/../mkinstalldirs
yann@402
   155
 CONFIG_HEADER = fficonfig.h
yann@402
   156
 CONFIG_CLEAN_FILES = 
yann@402
   157
 LTLIBRARIES =  $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES)
yann@402
   158
@@ -220,10 +235,6 @@
yann@402
   159
 LIBS = @LIBS@
yann@402
   160
 libffi_convenience_la_LDFLAGS = 
yann@402
   161
 libffi_convenience_la_LIBADD = 
yann@402
   162
-@POWERPC_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
yann@402
   163
-@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
yann@402
   164
-@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \
yann@402
   165
-@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo
yann@402
   166
 @ALPHA_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
yann@402
   167
 @ALPHA_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
yann@402
   168
 @ALPHA_TRUE@src/java_raw_api.lo src/alpha/ffi.lo src/alpha/osf.lo
yann@402
   169
@@ -234,12 +245,29 @@
yann@402
   170
 @MIPS_GCC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
yann@402
   171
 @MIPS_GCC_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \
yann@402
   172
 @MIPS_GCC_TRUE@src/mips/n32.lo
yann@402
   173
-@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
yann@402
   174
-@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
yann@402
   175
-@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo
yann@402
   176
+@S390_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   177
+@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   178
+@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo
yann@402
   179
 @M68K_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   180
 @M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   181
 @M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo
yann@402
   182
+@X86_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   183
+@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   184
+@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo
yann@402
   185
+@POWERPC_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
yann@402
   186
+@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
yann@402
   187
+@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \
yann@402
   188
+@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo
yann@402
   189
+@MIPS_LINUX_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
yann@402
   190
+@MIPS_LINUX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
yann@402
   191
+@MIPS_LINUX_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo
yann@402
   192
+@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
yann@402
   193
+@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
yann@402
   194
+@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo
yann@402
   195
+@X86_64_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
yann@402
   196
+@X86_64_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
yann@402
   197
+@X86_64_TRUE@src/java_raw_api.lo src/x86/ffi64.lo src/x86/unix64.lo \
yann@402
   198
+@X86_64_TRUE@src/x86/ffi.lo src/x86/sysv.lo
yann@402
   199
 @SPARC_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
yann@402
   200
 @SPARC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
yann@402
   201
 @SPARC_TRUE@src/java_raw_api.lo src/sparc/ffi.lo src/sparc/v8.lo \
yann@402
   202
@@ -247,62 +275,75 @@
yann@402
   203
 @POWERPC_AIX_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
yann@402
   204
 @POWERPC_AIX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
yann@402
   205
 @POWERPC_AIX_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \
yann@402
   206
-@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closures.lo
yann@402
   207
-@X86_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   208
-@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   209
-@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo
yann@402
   210
-@ARM_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   211
-@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   212
-@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo
yann@402
   213
+@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closure.lo
yann@402
   214
+@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
yann@402
   215
+@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
yann@402
   216
+@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \
yann@402
   217
+@MIPS_SGI_TRUE@src/mips/n32.lo
yann@402
   218
 @POWERPC_DARWIN_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
yann@402
   219
 @POWERPC_DARWIN_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
yann@402
   220
 @POWERPC_DARWIN_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \
yann@402
   221
 @POWERPC_DARWIN_TRUE@src/powerpc/darwin.lo \
yann@402
   222
 @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo
yann@402
   223
-@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo \
yann@402
   224
-@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
yann@402
   225
-@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \
yann@402
   226
-@MIPS_SGI_TRUE@src/mips/n32.lo
yann@402
   227
+@ARM_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   228
+@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   229
+@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo
yann@402
   230
+@SH_TRUE@libffi_convenience_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   231
+@SH_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   232
+@SH_TRUE@src/sh/sysv.lo src/sh/ffi.lo
yann@402
   233
 libffi_la_LIBADD = 
yann@402
   234
+@SH_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo src/types.lo \
yann@402
   235
+@SH_TRUE@src/raw_api.lo src/java_raw_api.lo src/sh/sysv.lo \
yann@402
   236
+@SH_TRUE@src/sh/ffi.lo
yann@402
   237
+@IA64_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   238
+@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   239
+@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo
yann@402
   240
+@X86_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo src/types.lo \
yann@402
   241
+@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \
yann@402
   242
+@X86_TRUE@src/x86/sysv.lo
yann@402
   243
 @POWERPC_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   244
 @POWERPC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   245
 @POWERPC_TRUE@src/powerpc/ffi.lo src/powerpc/sysv.lo \
yann@402
   246
 @POWERPC_TRUE@src/powerpc/ppc_closure.lo
yann@402
   247
-@ALPHA_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   248
-@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   249
-@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo
yann@402
   250
-@IA64_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   251
-@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   252
-@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo
yann@402
   253
-@MIPS_GCC_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   254
-@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   255
-@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
yann@402
   256
-@X86_WIN32_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   257
-@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   258
-@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo
yann@402
   259
-@M68K_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   260
-@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   261
-@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo
yann@402
   262
+@MIPS_LINUX_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   263
+@MIPS_LINUX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   264
+@MIPS_LINUX_TRUE@src/mips/ffi.lo src/mips/o32.lo
yann@402
   265
 @SPARC_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   266
 @SPARC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   267
 @SPARC_TRUE@src/sparc/ffi.lo src/sparc/v8.lo src/sparc/v9.lo
yann@402
   268
 @POWERPC_AIX_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   269
 @POWERPC_AIX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   270
 @POWERPC_AIX_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/aix.lo \
yann@402
   271
-@POWERPC_AIX_TRUE@src/powerpc/aix_closures.lo
yann@402
   272
-@X86_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo src/types.lo \
yann@402
   273
-@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \
yann@402
   274
-@X86_TRUE@src/x86/sysv.lo
yann@402
   275
+@POWERPC_AIX_TRUE@src/powerpc/aix_closure.lo
yann@402
   276
+@MIPS_SGI_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   277
+@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   278
+@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
yann@402
   279
 @ARM_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo src/types.lo \
yann@402
   280
 @ARM_TRUE@src/raw_api.lo src/java_raw_api.lo src/arm/sysv.lo \
yann@402
   281
 @ARM_TRUE@src/arm/ffi.lo
yann@402
   282
+@ALPHA_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   283
+@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   284
+@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo
yann@402
   285
+@MIPS_GCC_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   286
+@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   287
+@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
yann@402
   288
+@S390_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   289
+@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   290
+@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo
yann@402
   291
+@M68K_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   292
+@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   293
+@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo
yann@402
   294
+@X86_WIN32_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   295
+@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   296
+@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo
yann@402
   297
+@X86_64_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   298
+@X86_64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   299
+@X86_64_TRUE@src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffi.lo \
yann@402
   300
+@X86_64_TRUE@src/x86/sysv.lo
yann@402
   301
 @POWERPC_DARWIN_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   302
 @POWERPC_DARWIN_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   303
 @POWERPC_DARWIN_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/darwin.lo \
yann@402
   304
 @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo
yann@402
   305
-@MIPS_SGI_TRUE@libffi_la_OBJECTS =  src/debug.lo src/prep_cif.lo \
yann@402
   306
-@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
yann@402
   307
-@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
yann@402
   308
 noinst_PROGRAMS =  ffitest$(EXEEXT)
yann@402
   309
 PROGRAMS =  $(noinst_PROGRAMS)
yann@402
   310
 
yann@402
   311
@@ -578,8 +616,8 @@
yann@402
   312
 	-chmod 777 $(distdir)
yann@402
   313
 	$(mkinstalldirs) $(distdir)/src/alpha $(distdir)/src/arm \
yann@402
   314
 	   $(distdir)/src/m68k $(distdir)/src/mips \
yann@402
   315
-	   $(distdir)/src/powerpc $(distdir)/src/sparc \
yann@402
   316
-	   $(distdir)/src/x86
yann@402
   317
+	   $(distdir)/src/powerpc $(distdir)/src/s390 $(distdir)/src/sh \
yann@402
   318
+	   $(distdir)/src/sparc $(distdir)/src/x86
yann@402
   319
 	@for file in $(DISTFILES); do \
yann@402
   320
 	  if test -f $$file; then d=.; else d=$(srcdir); fi; \
yann@402
   321
 	  if test -d $$d/$$file; then \
yann@402
   322
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/acinclude.m4 gcc/libffi/acinclude.m4
yann@402
   323
--- gcc-3.2.2.orig/libffi/acinclude.m4	Sun Sep 10 16:43:14 2000
yann@402
   324
+++ gcc/libffi/acinclude.m4	Tue Dec 17 03:22:47 2002
yann@402
   325
@@ -4,5 +4,8 @@
yann@402
   326
 dnl to add a definition of LIBTOOL to Makefile.in.
yann@402
   327
 ifelse(yes,no,[
yann@402
   328
 AC_DEFUN([AC_PROG_LIBTOOL],)
yann@402
   329
+AC_DEFUN([AM_PROG_LIBTOOL],)
yann@402
   330
 AC_SUBST(LIBTOOL)
yann@402
   331
 ])
yann@402
   332
+
yann@402
   333
+sinclude(../config/accross.m4)
yann@402
   334
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/aclocal.m4 gcc/libffi/aclocal.m4
yann@402
   335
--- gcc-3.2.2.orig/libffi/aclocal.m4	Fri Feb  1 07:25:31 2002
yann@402
   336
+++ gcc/libffi/aclocal.m4	Tue Dec 17 03:22:47 2002
yann@402
   337
@@ -1,6 +1,6 @@
yann@402
   338
-dnl aclocal.m4 generated automatically by aclocal 1.4
yann@402
   339
+dnl aclocal.m4 generated automatically by aclocal 1.4-p5
yann@402
   340
 
yann@402
   341
-dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
yann@402
   342
+dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
yann@402
   343
 dnl This file is free software; the Free Software Foundation
yann@402
   344
 dnl gives unlimited permission to copy and/or distribute it,
yann@402
   345
 dnl with or without modifications, as long as this notice is preserved.
yann@402
   346
@@ -16,108 +16,15 @@
yann@402
   347
 dnl to add a definition of LIBTOOL to Makefile.in.
yann@402
   348
 ifelse(yes,no,[
yann@402
   349
 AC_DEFUN([AC_PROG_LIBTOOL],)
yann@402
   350
+AC_DEFUN([AM_PROG_LIBTOOL],)
yann@402
   351
 AC_SUBST(LIBTOOL)
yann@402
   352
 ])
yann@402
   353
 
yann@402
   354
-AC_DEFUN([AC_COMPILE_CHECK_SIZEOF],
yann@402
   355
-[changequote(<<, >>)dnl
yann@402
   356
-dnl The name to #define.
yann@402
   357
-define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl
yann@402
   358
-dnl The cache variable name.
yann@402
   359
-define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
yann@402
   360
-changequote([, ])dnl
yann@402
   361
-AC_MSG_CHECKING(size of $1)
yann@402
   362
-AC_CACHE_VAL(AC_CV_NAME,
yann@402
   363
-[for ac_size in 4 8 1 2 16 12 $2 ; do # List sizes in rough order of prevalence.
yann@402
   364
-  AC_TRY_COMPILE([#include "confdefs.h"
yann@402
   365
-#include <sys/types.h>
yann@402
   366
-$2
yann@402
   367
-], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size)
yann@402
   368
-  if test x$AC_CV_NAME != x ; then break; fi
yann@402
   369
-done
yann@402
   370
-])
yann@402
   371
-if test x$AC_CV_NAME = x ; then
yann@402
   372
-  AC_MSG_ERROR([cannot determine a size for $1])
yann@402
   373
-fi
yann@402
   374
-AC_MSG_RESULT($AC_CV_NAME)
yann@402
   375
-AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1])
yann@402
   376
-undefine([AC_TYPE_NAME])dnl
yann@402
   377
-undefine([AC_CV_NAME])dnl
yann@402
   378
-])
yann@402
   379
-
yann@402
   380
-AC_DEFUN([AC_C_BIGENDIAN_CROSS],
yann@402
   381
-[AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian,
yann@402
   382
-[ac_cv_c_bigendian=unknown
yann@402
   383
-# See if sys/param.h defines the BYTE_ORDER macro.
yann@402
   384
-AC_TRY_COMPILE([#include <sys/types.h>
yann@402
   385
-#include <sys/param.h>], [
yann@402
   386
-#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
yann@402
   387
- bogus endian macros
yann@402
   388
-#endif], [# It does; now see whether it defined to BIG_ENDIAN or not.
yann@402
   389
-AC_TRY_COMPILE([#include <sys/types.h>
yann@402
   390
-#include <sys/param.h>], [
yann@402
   391
-#if BYTE_ORDER != BIG_ENDIAN
yann@402
   392
- not big endian
yann@402
   393
-#endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)])
yann@402
   394
-if test $ac_cv_c_bigendian = unknown; then
yann@402
   395
-AC_TRY_RUN([main () {
yann@402
   396
-  /* Are we little or big endian?  From Harbison&Steele.  */
yann@402
   397
-  union
yann@402
   398
-  {
yann@402
   399
-    long l;
yann@402
   400
-    char c[sizeof (long)];
yann@402
   401
-  } u;
yann@402
   402
-  u.l = 1;
yann@402
   403
-  exit (u.c[sizeof (long) - 1] == 1);
yann@402
   404
-}], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes,
yann@402
   405
-[ echo $ac_n "cross-compiling... " 2>&AC_FD_MSG ])
yann@402
   406
-fi])
yann@402
   407
-if test $ac_cv_c_bigendian = unknown; then
yann@402
   408
-AC_MSG_CHECKING(to probe for byte ordering)
yann@402
   409
-[
yann@402
   410
-cat >conftest.c <<EOF
yann@402
   411
-short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
yann@402
   412
-short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
yann@402
   413
-void _ascii() { char* s = (char*) ascii_mm; s = (char*) ascii_ii; }
yann@402
   414
-short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
yann@402
   415
-short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
yann@402
   416
-void _ebcdic() { char* s = (char*) ebcdic_mm; s = (char*) ebcdic_ii; }
yann@402
   417
-int main() { _ascii (); _ebcdic (); return 0; }
yann@402
   418
-EOF
yann@402
   419
-] if test -f conftest.c ; then
yann@402
   420
-     if ${CC-cc} ${CFLAGS} conftest.c -o conftest.o && test -f conftest.o ; then
yann@402
   421
-        if test `grep -l BIGenDianSyS conftest.o` ; then
yann@402
   422
-           echo $ac_n ' big endian probe OK, ' 1>&AC_FD_MSG
yann@402
   423
-           ac_cv_c_bigendian=yes
yann@402
   424
-        fi
yann@402
   425
-        if test `grep -l LiTTleEnDian conftest.o` ; then
yann@402
   426
-           echo $ac_n ' little endian probe OK, ' 1>&AC_FD_MSG
yann@402
   427
-           if test $ac_cv_c_bigendian = yes ; then
yann@402
   428
-            ac_cv_c_bigendian=unknown;
yann@402
   429
-           else
yann@402
   430
-            ac_cv_c_bigendian=no
yann@402
   431
-           fi
yann@402
   432
-        fi
yann@402
   433
-        echo $ac_n 'guessing bigendian ...  ' >&AC_FD_MSG
yann@402
   434
-     fi
yann@402
   435
-  fi
yann@402
   436
-AC_MSG_RESULT($ac_cv_c_bigendian)
yann@402
   437
-fi
yann@402
   438
-if test $ac_cv_c_bigendian = yes; then
yann@402
   439
-  AC_DEFINE(WORDS_BIGENDIAN, 1, [whether byteorder is bigendian])
yann@402
   440
-  BYTEORDER=4321
yann@402
   441
-else
yann@402
   442
-  BYTEORDER=1234
yann@402
   443
-fi
yann@402
   444
-AC_DEFINE_UNQUOTED(BYTEORDER, $BYTEORDER, [1234 = LIL_ENDIAN, 4321 = BIGENDIAN])
yann@402
   445
-if test $ac_cv_c_bigendian = unknown; then
yann@402
   446
-  AC_MSG_ERROR(unknown endianess - sorry, please pre-set ac_cv_c_bigendian)
yann@402
   447
-fi
yann@402
   448
-])
yann@402
   449
+sinclude(../config/accross.m4)
yann@402
   450
 
yann@402
   451
 # Like AC_CONFIG_HEADER, but automatically create stamp file.
yann@402
   452
 
yann@402
   453
-AC_DEFUN(AM_CONFIG_HEADER,
yann@402
   454
+AC_DEFUN([AM_CONFIG_HEADER],
yann@402
   455
 [AC_PREREQ([2.12])
yann@402
   456
 AC_CONFIG_HEADER([$1])
yann@402
   457
 dnl When config.status generates a header, we must update the stamp-h file.
yann@402
   458
@@ -147,7 +54,7 @@
yann@402
   459
 dnl Usage:
yann@402
   460
 dnl AM_INIT_AUTOMAKE(package,version, [no-define])
yann@402
   461
 
yann@402
   462
-AC_DEFUN(AM_INIT_AUTOMAKE,
yann@402
   463
+AC_DEFUN([AM_INIT_AUTOMAKE],
yann@402
   464
 [AC_REQUIRE([AC_PROG_INSTALL])
yann@402
   465
 PACKAGE=[$1]
yann@402
   466
 AC_SUBST(PACKAGE)
yann@402
   467
@@ -175,7 +82,7 @@
yann@402
   468
 # Check to make sure that the build environment is sane.
yann@402
   469
 #
yann@402
   470
 
yann@402
   471
-AC_DEFUN(AM_SANITY_CHECK,
yann@402
   472
+AC_DEFUN([AM_SANITY_CHECK],
yann@402
   473
 [AC_MSG_CHECKING([whether build environment is sane])
yann@402
   474
 # Just in case
yann@402
   475
 sleep 1
yann@402
   476
@@ -216,7 +123,7 @@
yann@402
   477
 
yann@402
   478
 dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
yann@402
   479
 dnl The program must properly implement --version.
yann@402
   480
-AC_DEFUN(AM_MISSING_PROG,
yann@402
   481
+AC_DEFUN([AM_MISSING_PROG],
yann@402
   482
 [AC_MSG_CHECKING(for working $2)
yann@402
   483
 # Run test in a subshell; some versions of sh will print an error if
yann@402
   484
 # an executable is not found, even if stderr is redirected.
yann@402
   485
@@ -235,7 +142,7 @@
yann@402
   486
 
yann@402
   487
 # serial 1
yann@402
   488
 
yann@402
   489
-AC_DEFUN(AM_MAINTAINER_MODE,
yann@402
   490
+AC_DEFUN([AM_MAINTAINER_MODE],
yann@402
   491
 [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
yann@402
   492
   dnl maintainer-mode is disabled by default
yann@402
   493
   AC_ARG_ENABLE(maintainer-mode,
yann@402
   494
@@ -252,7 +159,7 @@
yann@402
   495
 
yann@402
   496
 # Define a conditional.
yann@402
   497
 
yann@402
   498
-AC_DEFUN(AM_CONDITIONAL,
yann@402
   499
+AC_DEFUN([AM_CONDITIONAL],
yann@402
   500
 [AC_SUBST($1_TRUE)
yann@402
   501
 AC_SUBST($1_FALSE)
yann@402
   502
 if $2; then
yann@402
   503
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure gcc/libffi/configure
yann@402
   504
--- gcc-3.2.2.orig/libffi/configure	Wed Jan 29 07:59:05 2003
yann@402
   505
+++ gcc/libffi/configure	Sat Feb  1 20:16:19 2003
yann@402
   506
@@ -633,17 +633,16 @@
yann@402
   507
 
yann@402
   508
 if test "${srcdir}" = "."; then
yann@402
   509
   if test "${with_target_subdir}" != "."; then
yann@402
   510
-    libffi_basedir="${srcdir}/${with_multisrctop}.."
yann@402
   511
+    libffi_basedir="${with_multisrctop}../"
yann@402
   512
   else
yann@402
   513
-    libffi_basedir="${srcdir}/${with_multisrctop}"
yann@402
   514
+    libffi_basedir="${with_multisrctop}"
yann@402
   515
   fi
yann@402
   516
 else
yann@402
   517
-  libffi_basedir="${srcdir}"
yann@402
   518
+  libffi_basedir=
yann@402
   519
 fi
yann@402
   520
 
yann@402
   521
-
yann@402
   522
 ac_aux_dir=
yann@402
   523
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
yann@402
   524
+for ac_dir in ${libffi_basedir}.. $srcdir/${libffi_basedir}..; do
yann@402
   525
   if test -f $ac_dir/install-sh; then
yann@402
   526
     ac_aux_dir=$ac_dir
yann@402
   527
     ac_install_sh="$ac_aux_dir/install-sh -c"
yann@402
   528
@@ -655,13 +654,14 @@
yann@402
   529
   fi
yann@402
   530
 done
yann@402
   531
 if test -z "$ac_aux_dir"; then
yann@402
   532
-  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
yann@402
   533
+  { echo "configure: error: can not find install-sh or install.sh in ${libffi_basedir}.. $srcdir/${libffi_basedir}.." 1>&2; exit 1; }
yann@402
   534
 fi
yann@402
   535
 ac_config_guess=$ac_aux_dir/config.guess
yann@402
   536
 ac_config_sub=$ac_aux_dir/config.sub
yann@402
   537
 ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
yann@402
   538
 
yann@402
   539
 
yann@402
   540
+
yann@402
   541
 # Make sure we can run config.sub.
yann@402
   542
 if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
yann@402
   543
 else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
yann@402
   544
@@ -1238,9 +1238,18 @@
yann@402
   545
   ;;
yann@402
   546
 
yann@402
   547
 hpux10.20*|hpux11*)
yann@402
   548
-  lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
yann@402
   549
-  lt_cv_file_magic_cmd=/usr/bin/file
yann@402
   550
-  lt_cv_file_magic_test_file=/usr/lib/libc.sl
yann@402
   551
+  case $host_cpu in
yann@402
   552
+  hppa*)
yann@402
   553
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
yann@402
   554
+    lt_cv_file_magic_cmd=/usr/bin/file
yann@402
   555
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
yann@402
   556
+    ;;
yann@402
   557
+  ia64*)
yann@402
   558
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
yann@402
   559
+    lt_cv_file_magic_cmd=/usr/bin/file
yann@402
   560
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
yann@402
   561
+    ;;
yann@402
   562
+  esac
yann@402
   563
   ;;
yann@402
   564
 
yann@402
   565
 irix5* | irix6*)
yann@402
   566
@@ -1267,7 +1276,7 @@
yann@402
   567
 # This must be Linux ELF.
yann@402
   568
 linux-gnu*)
yann@402
   569
   case $host_cpu in
yann@402
   570
-  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
yann@402
   571
+  alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* )
yann@402
   572
     lt_cv_deplibs_check_method=pass_all ;;
yann@402
   573
   *)
yann@402
   574
     # glibc up to 2.1.1 does not perform some relocations on ARM
yann@402
   575
@@ -1330,13 +1339,13 @@
yann@402
   576
 deplibs_check_method=$lt_cv_deplibs_check_method
yann@402
   577
 
yann@402
   578
 echo $ac_n "checking for object suffix""... $ac_c" 1>&6
yann@402
   579
-echo "configure:1334: checking for object suffix" >&5
yann@402
   580
+echo "configure:1343: checking for object suffix" >&5
yann@402
   581
 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
yann@402
   582
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   583
 else
yann@402
   584
   rm -f conftest*
yann@402
   585
 echo 'int i = 1;' > conftest.$ac_ext
yann@402
   586
-if { (eval echo configure:1340: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
   587
+if { (eval echo configure:1349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
   588
   for ac_file in conftest.*; do
yann@402
   589
     case $ac_file in
yann@402
   590
     *.c) ;;
yann@402
   591
@@ -1356,7 +1365,7 @@
yann@402
   592
 
yann@402
   593
 
yann@402
   594
 echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
yann@402
   595
-echo "configure:1360: checking for executable suffix" >&5
yann@402
   596
+echo "configure:1369: checking for executable suffix" >&5
yann@402
   597
 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
yann@402
   598
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   599
 else
yann@402
   600
@@ -1366,7 +1375,7 @@
yann@402
   601
   rm -f conftest*
yann@402
   602
   echo 'int main () { return 0; }' > conftest.$ac_ext
yann@402
   603
   ac_cv_exeext=
yann@402
   604
-  if { (eval echo configure:1370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
yann@402
   605
+  if { (eval echo configure:1379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
yann@402
   606
     for file in conftest.*; do
yann@402
   607
       case $file in
yann@402
   608
       *.c | *.o | *.obj) ;;
yann@402
   609
@@ -1399,7 +1408,7 @@
yann@402
   610
 file_magic*)
yann@402
   611
   if test "$file_magic_cmd" = '$MAGIC_CMD'; then
yann@402
   612
     echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6
yann@402
   613
-echo "configure:1403: checking for ${ac_tool_prefix}file" >&5
yann@402
   614
+echo "configure:1412: checking for ${ac_tool_prefix}file" >&5
yann@402
   615
 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
yann@402
   616
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   617
 else
yann@402
   618
@@ -1461,7 +1470,7 @@
yann@402
   619
 if test -z "$lt_cv_path_MAGIC_CMD"; then
yann@402
   620
   if test -n "$ac_tool_prefix"; then
yann@402
   621
     echo $ac_n "checking for file""... $ac_c" 1>&6
yann@402
   622
-echo "configure:1465: checking for file" >&5
yann@402
   623
+echo "configure:1474: checking for file" >&5
yann@402
   624
 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
yann@402
   625
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   626
 else
yann@402
   627
@@ -1532,7 +1541,7 @@
yann@402
   628
 # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
yann@402
   629
 set dummy ${ac_tool_prefix}ranlib; ac_word=$2
yann@402
   630
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
yann@402
   631
-echo "configure:1536: checking for $ac_word" >&5
yann@402
   632
+echo "configure:1545: checking for $ac_word" >&5
yann@402
   633
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
yann@402
   634
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   635
 else
yann@402
   636
@@ -1564,7 +1573,7 @@
yann@402
   637
   # Extract the first word of "ranlib", so it can be a program name with args.
yann@402
   638
 set dummy ranlib; ac_word=$2
yann@402
   639
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
yann@402
   640
-echo "configure:1568: checking for $ac_word" >&5
yann@402
   641
+echo "configure:1577: checking for $ac_word" >&5
yann@402
   642
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
yann@402
   643
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   644
 else
yann@402
   645
@@ -1599,7 +1608,7 @@
yann@402
   646
 # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
yann@402
   647
 set dummy ${ac_tool_prefix}strip; ac_word=$2
yann@402
   648
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
yann@402
   649
-echo "configure:1603: checking for $ac_word" >&5
yann@402
   650
+echo "configure:1612: checking for $ac_word" >&5
yann@402
   651
 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
yann@402
   652
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   653
 else
yann@402
   654
@@ -1631,7 +1640,7 @@
yann@402
   655
   # Extract the first word of "strip", so it can be a program name with args.
yann@402
   656
 set dummy strip; ac_word=$2
yann@402
   657
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
yann@402
   658
-echo "configure:1635: checking for $ac_word" >&5
yann@402
   659
+echo "configure:1644: checking for $ac_word" >&5
yann@402
   660
 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
yann@402
   661
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   662
 else
yann@402
   663
@@ -1698,8 +1707,8 @@
yann@402
   664
 case $host in
yann@402
   665
 *-*-irix6*)
yann@402
   666
   # Find out which ABI we are using.
yann@402
   667
-  echo '#line 1702 "configure"' > conftest.$ac_ext
yann@402
   668
-  if { (eval echo configure:1703: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
   669
+  echo '#line 1711 "configure"' > conftest.$ac_ext
yann@402
   670
+  if { (eval echo configure:1712: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
   671
     case `/usr/bin/file conftest.$ac_objext` in
yann@402
   672
     *32-bit*)
yann@402
   673
       LD="${LD-ld} -32"
yann@402
   674
@@ -1715,12 +1724,70 @@
yann@402
   675
   rm -rf conftest*
yann@402
   676
   ;;
yann@402
   677
 
yann@402
   678
+ia64-*-hpux*)
yann@402
   679
+  # Find out which ABI we are using.
yann@402
   680
+  echo 'int i;' > conftest.$ac_ext
yann@402
   681
+  if { (eval echo configure:1731: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
   682
+    case "`/usr/bin/file conftest.o`" in
yann@402
   683
+    *ELF-32*)
yann@402
   684
+      HPUX_IA64_MODE="32"
yann@402
   685
+      ;;
yann@402
   686
+    *ELF-64*)
yann@402
   687
+      HPUX_IA64_MODE="64"
yann@402
   688
+      ;;
yann@402
   689
+    esac
yann@402
   690
+  fi
yann@402
   691
+  rm -rf conftest*
yann@402
   692
+  ;;
yann@402
   693
+
yann@402
   694
+x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
yann@402
   695
+  # Find out which ABI we are using.
yann@402
   696
+  echo 'int i;' > conftest.$ac_ext
yann@402
   697
+  if { (eval echo configure:1747: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
   698
+    case "`/usr/bin/file conftest.o`" in
yann@402
   699
+    *32-bit*)
yann@402
   700
+      case $host in
yann@402
   701
+        x86_64-*linux*)
yann@402
   702
+          LD="${LD-ld} -m elf_i386"
yann@402
   703
+          ;;
yann@402
   704
+        ppc64-*linux*)
yann@402
   705
+          LD="${LD-ld} -m elf32ppclinux"
yann@402
   706
+          ;;
yann@402
   707
+        s390x-*linux*)
yann@402
   708
+          LD="${LD-ld} -m elf_s390"
yann@402
   709
+          ;;
yann@402
   710
+        sparc64-*linux*)
yann@402
   711
+          LD="${LD-ld} -m elf32_sparc"
yann@402
   712
+          ;;
yann@402
   713
+      esac
yann@402
   714
+      ;;
yann@402
   715
+    *64-bit*)
yann@402
   716
+      case $host in
yann@402
   717
+        x86_64-*linux*)
yann@402
   718
+          LD="${LD-ld} -m elf_x86_64"
yann@402
   719
+          ;;
yann@402
   720
+        ppc*-*linux*|powerpc*-*linux*)
yann@402
   721
+          LD="${LD-ld} -m elf64ppc"
yann@402
   722
+          ;;
yann@402
   723
+        s390*-*linux*)
yann@402
   724
+          LD="${LD-ld} -m elf64_s390"
yann@402
   725
+          ;;
yann@402
   726
+        sparc*-*linux*)
yann@402
   727
+          LD="${LD-ld} -m elf64_sparc"
yann@402
   728
+          ;;
yann@402
   729
+      esac
yann@402
   730
+      ;;
yann@402
   731
+    esac
yann@402
   732
+  fi
yann@402
   733
+  rm -rf conftest*
yann@402
   734
+  ;;
yann@402
   735
+
yann@402
   736
 *-*-sco3.2v5*)
yann@402
   737
   # On SCO OpenServer 5, we need -belf to get full-featured binaries.
yann@402
   738
   SAVE_CFLAGS="$CFLAGS"
yann@402
   739
   CFLAGS="$CFLAGS -belf"
yann@402
   740
   echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
yann@402
   741
-echo "configure:1724: checking whether the C compiler needs -belf" >&5
yann@402
   742
+echo "configure:1791: checking whether the C compiler needs -belf" >&5
yann@402
   743
 if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
yann@402
   744
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   745
 else
yann@402
   746
@@ -1733,14 +1800,14 @@
yann@402
   747
 cross_compiling=$ac_cv_prog_cc_cross
yann@402
   748
 
yann@402
   749
      cat > conftest.$ac_ext <<EOF
yann@402
   750
-#line 1737 "configure"
yann@402
   751
+#line 1804 "configure"
yann@402
   752
 #include "confdefs.h"
yann@402
   753
 
yann@402
   754
 int main() {
yann@402
   755
 
yann@402
   756
 ; return 0; }
yann@402
   757
 EOF
yann@402
   758
-if { (eval echo configure:1744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
yann@402
   759
+if { (eval echo configure:1811: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
yann@402
   760
   rm -rf conftest*
yann@402
   761
   lt_cv_cc_needs_belf=yes
yann@402
   762
 else
yann@402
   763
@@ -1868,7 +1935,7 @@
yann@402
   764
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
yann@402
   765
 # ./install, which can be erroneously created by make from ./install.sh.
yann@402
   766
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
yann@402
   767
-echo "configure:1872: checking for a BSD compatible install" >&5
yann@402
   768
+echo "configure:1939: checking for a BSD compatible install" >&5
yann@402
   769
 if test -z "$INSTALL"; then
yann@402
   770
 if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
yann@402
   771
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   772
@@ -1921,7 +1988,7 @@
yann@402
   773
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
yann@402
   774
 
yann@402
   775
 echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
yann@402
   776
-echo "configure:1925: checking whether build environment is sane" >&5
yann@402
   777
+echo "configure:1992: checking whether build environment is sane" >&5
yann@402
   778
 # Just in case
yann@402
   779
 sleep 1
yann@402
   780
 echo timestamp > conftestfile
yann@402
   781
@@ -1978,7 +2045,7 @@
yann@402
   782
 test "$program_transform_name" = "" && program_transform_name="s,x,x,"
yann@402
   783
 
yann@402
   784
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
yann@402
   785
-echo "configure:1982: checking whether ${MAKE-make} sets \${MAKE}" >&5
yann@402
   786
+echo "configure:2049: checking whether ${MAKE-make} sets \${MAKE}" >&5
yann@402
   787
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
yann@402
   788
 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
yann@402
   789
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   790
@@ -2017,7 +2084,7 @@
yann@402
   791
 
yann@402
   792
 missing_dir=`cd $ac_aux_dir && pwd`
yann@402
   793
 echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
yann@402
   794
-echo "configure:2021: checking for working aclocal" >&5
yann@402
   795
+echo "configure:2088: checking for working aclocal" >&5
yann@402
   796
 # Run test in a subshell; some versions of sh will print an error if
yann@402
   797
 # an executable is not found, even if stderr is redirected.
yann@402
   798
 # Redirect stdin to placate older versions of autoconf.  Sigh.
yann@402
   799
@@ -2030,7 +2097,7 @@
yann@402
   800
 fi
yann@402
   801
 
yann@402
   802
 echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
yann@402
   803
-echo "configure:2034: checking for working autoconf" >&5
yann@402
   804
+echo "configure:2101: checking for working autoconf" >&5
yann@402
   805
 # Run test in a subshell; some versions of sh will print an error if
yann@402
   806
 # an executable is not found, even if stderr is redirected.
yann@402
   807
 # Redirect stdin to placate older versions of autoconf.  Sigh.
yann@402
   808
@@ -2043,7 +2110,7 @@
yann@402
   809
 fi
yann@402
   810
 
yann@402
   811
 echo $ac_n "checking for working automake""... $ac_c" 1>&6
yann@402
   812
-echo "configure:2047: checking for working automake" >&5
yann@402
   813
+echo "configure:2114: checking for working automake" >&5
yann@402
   814
 # Run test in a subshell; some versions of sh will print an error if
yann@402
   815
 # an executable is not found, even if stderr is redirected.
yann@402
   816
 # Redirect stdin to placate older versions of autoconf.  Sigh.
yann@402
   817
@@ -2056,7 +2123,7 @@
yann@402
   818
 fi
yann@402
   819
 
yann@402
   820
 echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
yann@402
   821
-echo "configure:2060: checking for working autoheader" >&5
yann@402
   822
+echo "configure:2127: checking for working autoheader" >&5
yann@402
   823
 # Run test in a subshell; some versions of sh will print an error if
yann@402
   824
 # an executable is not found, even if stderr is redirected.
yann@402
   825
 # Redirect stdin to placate older versions of autoconf.  Sigh.
yann@402
   826
@@ -2069,7 +2136,7 @@
yann@402
   827
 fi
yann@402
   828
 
yann@402
   829
 echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
yann@402
   830
-echo "configure:2073: checking for working makeinfo" >&5
yann@402
   831
+echo "configure:2140: checking for working makeinfo" >&5
yann@402
   832
 # Run test in a subshell; some versions of sh will print an error if
yann@402
   833
 # an executable is not found, even if stderr is redirected.
yann@402
   834
 # Redirect stdin to placate older versions of autoconf.  Sigh.
yann@402
   835
@@ -2086,7 +2153,7 @@
yann@402
   836
 
yann@402
   837
 
yann@402
   838
 echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
yann@402
   839
-echo "configure:2090: checking for executable suffix" >&5
yann@402
   840
+echo "configure:2157: checking for executable suffix" >&5
yann@402
   841
 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
yann@402
   842
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   843
 else
yann@402
   844
@@ -2096,7 +2163,7 @@
yann@402
   845
   rm -f conftest*
yann@402
   846
   echo 'int main () { return 0; }' > conftest.$ac_ext
yann@402
   847
   ac_cv_exeext=
yann@402
   848
-  if { (eval echo configure:2100: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
yann@402
   849
+  if { (eval echo configure:2167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
yann@402
   850
     for file in conftest.*; do
yann@402
   851
       case $file in
yann@402
   852
       *.c | *.o | *.obj) ;;
yann@402
   853
@@ -2117,7 +2184,7 @@
yann@402
   854
 ac_exeext=$EXEEXT
yann@402
   855
 
yann@402
   856
 echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
yann@402
   857
-echo "configure:2121: checking whether to enable maintainer-specific portions of Makefiles" >&5
yann@402
   858
+echo "configure:2188: checking whether to enable maintainer-specific portions of Makefiles" >&5
yann@402
   859
     # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
yann@402
   860
 if test "${enable_maintainer_mode+set}" = set; then
yann@402
   861
   enableval="$enable_maintainer_mode"
yann@402
   862
@@ -2143,7 +2210,7 @@
yann@402
   863
 # Extract the first word of "gcc", so it can be a program name with args.
yann@402
   864
 set dummy gcc; ac_word=$2
yann@402
   865
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
yann@402
   866
-echo "configure:2147: checking for $ac_word" >&5
yann@402
   867
+echo "configure:2214: checking for $ac_word" >&5
yann@402
   868
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
yann@402
   869
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   870
 else
yann@402
   871
@@ -2173,7 +2240,7 @@
yann@402
   872
   # Extract the first word of "cc", so it can be a program name with args.
yann@402
   873
 set dummy cc; ac_word=$2
yann@402
   874
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
yann@402
   875
-echo "configure:2177: checking for $ac_word" >&5
yann@402
   876
+echo "configure:2244: checking for $ac_word" >&5
yann@402
   877
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
yann@402
   878
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   879
 else
yann@402
   880
@@ -2224,7 +2291,7 @@
yann@402
   881
       # Extract the first word of "cl", so it can be a program name with args.
yann@402
   882
 set dummy cl; ac_word=$2
yann@402
   883
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
yann@402
   884
-echo "configure:2228: checking for $ac_word" >&5
yann@402
   885
+echo "configure:2295: checking for $ac_word" >&5
yann@402
   886
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
yann@402
   887
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   888
 else
yann@402
   889
@@ -2256,7 +2323,7 @@
yann@402
   890
 fi
yann@402
   891
 
yann@402
   892
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
yann@402
   893
-echo "configure:2260: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
yann@402
   894
+echo "configure:2327: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
yann@402
   895
 
yann@402
   896
 ac_ext=c
yann@402
   897
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
yann@402
   898
@@ -2267,12 +2334,12 @@
yann@402
   899
 
yann@402
   900
 cat > conftest.$ac_ext << EOF
yann@402
   901
 
yann@402
   902
-#line 2271 "configure"
yann@402
   903
+#line 2338 "configure"
yann@402
   904
 #include "confdefs.h"
yann@402
   905
 
yann@402
   906
 main(){return(0);}
yann@402
   907
 EOF
yann@402
   908
-if { (eval echo configure:2276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
yann@402
   909
+if { (eval echo configure:2343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
yann@402
   910
   ac_cv_prog_cc_works=yes
yann@402
   911
   # If we can't run a trivial program, we are probably using a cross compiler.
yann@402
   912
   if (./conftest; exit) 2>/dev/null; then
yann@402
   913
@@ -2298,12 +2365,12 @@
yann@402
   914
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
yann@402
   915
 fi
yann@402
   916
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
yann@402
   917
-echo "configure:2302: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
yann@402
   918
+echo "configure:2369: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
yann@402
   919
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
yann@402
   920
 cross_compiling=$ac_cv_prog_cc_cross
yann@402
   921
 
yann@402
   922
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
yann@402
   923
-echo "configure:2307: checking whether we are using GNU C" >&5
yann@402
   924
+echo "configure:2374: checking whether we are using GNU C" >&5
yann@402
   925
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
yann@402
   926
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   927
 else
yann@402
   928
@@ -2312,7 +2379,7 @@
yann@402
   929
   yes;
yann@402
   930
 #endif
yann@402
   931
 EOF
yann@402
   932
-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
yann@402
   933
+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
yann@402
   934
   ac_cv_prog_gcc=yes
yann@402
   935
 else
yann@402
   936
   ac_cv_prog_gcc=no
yann@402
   937
@@ -2331,7 +2398,7 @@
yann@402
   938
 ac_save_CFLAGS="$CFLAGS"
yann@402
   939
 CFLAGS=
yann@402
   940
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
yann@402
   941
-echo "configure:2335: checking whether ${CC-cc} accepts -g" >&5
yann@402
   942
+echo "configure:2402: checking whether ${CC-cc} accepts -g" >&5
yann@402
   943
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
yann@402
   944
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
   945
 else
yann@402
   946
@@ -2381,17 +2448,23 @@
yann@402
   947
 i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;;
yann@402
   948
 sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;;
yann@402
   949
 sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;;
yann@402
   950
-sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
yann@402
   951
-sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
yann@402
   952
-alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;;
yann@402
   953
+sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;;
yann@402
   954
+sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;;
yann@402
   955
+alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;;
yann@402
   956
 ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;;
yann@402
   957
 m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;;
yann@402
   958
+mips64*-*);;
yann@402
   959
+mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;;
yann@402
   960
 powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;;
yann@402
   961
 powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;;
yann@402
   962
 powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;;
yann@402
   963
 powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
yann@402
   964
 rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
yann@402
   965
 arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;;
yann@402
   966
+s390-*-linux-*) TARGET=S390; TARGETDIR=s390;;
yann@402
   967
+s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;;
yann@402
   968
+x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;;
yann@402
   969
+sh-*-linux* | sh[34]*-*-linux*) TARGET=SH; TARGETDIR=sh;;
yann@402
   970
 esac
yann@402
   971
 
yann@402
   972
 if test $TARGETDIR = unknown; then
yann@402
   973
@@ -2418,6 +2491,15 @@
yann@402
   974
 fi
yann@402
   975
 
yann@402
   976
 
yann@402
   977
+if test x$TARGET = xMIPS_LINUX; then
yann@402
   978
+  MIPS_LINUX_TRUE=
yann@402
   979
+  MIPS_LINUX_FALSE='#'
yann@402
   980
+else
yann@402
   981
+  MIPS_LINUX_TRUE='#'
yann@402
   982
+  MIPS_LINUX_FALSE=
yann@402
   983
+fi
yann@402
   984
+
yann@402
   985
+
yann@402
   986
 if test x$TARGET = xSPARC; then
yann@402
   987
   SPARC_TRUE=
yann@402
   988
   SPARC_FALSE='#'
yann@402
   989
@@ -2507,8 +2589,39 @@
yann@402
   990
   ARM_FALSE=
yann@402
   991
 fi
yann@402
   992
 
yann@402
   993
+
yann@402
   994
+if test x$TARGET = xS390; then
yann@402
   995
+  S390_TRUE=
yann@402
   996
+  S390_FALSE='#'
yann@402
   997
+else
yann@402
   998
+  S390_TRUE='#'
yann@402
   999
+  S390_FALSE=
yann@402
  1000
+fi
yann@402
  1001
+
yann@402
  1002
+
yann@402
  1003
+if test x$TARGET = xX86_64; then
yann@402
  1004
+  X86_64_TRUE=
yann@402
  1005
+  X86_64_FALSE='#'
yann@402
  1006
+else
yann@402
  1007
+  X86_64_TRUE='#'
yann@402
  1008
+  X86_64_FALSE=
yann@402
  1009
+fi
yann@402
  1010
+
yann@402
  1011
+
yann@402
  1012
+if test x$TARGET = xSH; then
yann@402
  1013
+  SH_TRUE=
yann@402
  1014
+  SH_FALSE='#'
yann@402
  1015
+else
yann@402
  1016
+  SH_TRUE='#'
yann@402
  1017
+  SH_FALSE=
yann@402
  1018
+fi
yann@402
  1019
+
yann@402
  1020
+if test x$TARGET = xMIPS_LINUX; then
yann@402
  1021
+  TARGET=MIPS
yann@402
  1022
+fi
yann@402
  1023
+
yann@402
  1024
 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
yann@402
  1025
-echo "configure:2512: checking how to run the C preprocessor" >&5
yann@402
  1026
+echo "configure:2625: checking how to run the C preprocessor" >&5
yann@402
  1027
 # On Suns, sometimes $CPP names a directory.
yann@402
  1028
 if test -n "$CPP" && test -d "$CPP"; then
yann@402
  1029
   CPP=
yann@402
  1030
@@ -2523,13 +2636,13 @@
yann@402
  1031
   # On the NeXT, cc -E runs the code through the compiler's parser,
yann@402
  1032
   # not just through cpp.
yann@402
  1033
   cat > conftest.$ac_ext <<EOF
yann@402
  1034
-#line 2527 "configure"
yann@402
  1035
+#line 2640 "configure"
yann@402
  1036
 #include "confdefs.h"
yann@402
  1037
 #include <assert.h>
yann@402
  1038
 Syntax Error
yann@402
  1039
 EOF
yann@402
  1040
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
yann@402
  1041
-{ (eval echo configure:2533: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
yann@402
  1042
+{ (eval echo configure:2646: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
yann@402
  1043
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
yann@402
  1044
 if test -z "$ac_err"; then
yann@402
  1045
   :
yann@402
  1046
@@ -2540,13 +2653,13 @@
yann@402
  1047
   rm -rf conftest*
yann@402
  1048
   CPP="${CC-cc} -E -traditional-cpp"
yann@402
  1049
   cat > conftest.$ac_ext <<EOF
yann@402
  1050
-#line 2544 "configure"
yann@402
  1051
+#line 2657 "configure"
yann@402
  1052
 #include "confdefs.h"
yann@402
  1053
 #include <assert.h>
yann@402
  1054
 Syntax Error
yann@402
  1055
 EOF
yann@402
  1056
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
yann@402
  1057
-{ (eval echo configure:2550: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
yann@402
  1058
+{ (eval echo configure:2663: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
yann@402
  1059
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
yann@402
  1060
 if test -z "$ac_err"; then
yann@402
  1061
   :
yann@402
  1062
@@ -2557,13 +2670,13 @@
yann@402
  1063
   rm -rf conftest*
yann@402
  1064
   CPP="${CC-cc} -nologo -E"
yann@402
  1065
   cat > conftest.$ac_ext <<EOF
yann@402
  1066
-#line 2561 "configure"
yann@402
  1067
+#line 2674 "configure"
yann@402
  1068
 #include "confdefs.h"
yann@402
  1069
 #include <assert.h>
yann@402
  1070
 Syntax Error
yann@402
  1071
 EOF
yann@402
  1072
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
yann@402
  1073
-{ (eval echo configure:2567: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
yann@402
  1074
+{ (eval echo configure:2680: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
yann@402
  1075
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
yann@402
  1076
 if test -z "$ac_err"; then
yann@402
  1077
   :
yann@402
  1078
@@ -2588,12 +2701,12 @@
yann@402
  1079
 echo "$ac_t""$CPP" 1>&6
yann@402
  1080
 
yann@402
  1081
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
yann@402
  1082
-echo "configure:2592: checking for ANSI C header files" >&5
yann@402
  1083
+echo "configure:2705: checking for ANSI C header files" >&5
yann@402
  1084
 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
yann@402
  1085
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1086
 else
yann@402
  1087
   cat > conftest.$ac_ext <<EOF
yann@402
  1088
-#line 2597 "configure"
yann@402
  1089
+#line 2710 "configure"
yann@402
  1090
 #include "confdefs.h"
yann@402
  1091
 #include <stdlib.h>
yann@402
  1092
 #include <stdarg.h>
yann@402
  1093
@@ -2601,7 +2714,7 @@
yann@402
  1094
 #include <float.h>
yann@402
  1095
 EOF
yann@402
  1096
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
yann@402
  1097
-{ (eval echo configure:2605: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
yann@402
  1098
+{ (eval echo configure:2718: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
yann@402
  1099
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
yann@402
  1100
 if test -z "$ac_err"; then
yann@402
  1101
   rm -rf conftest*
yann@402
  1102
@@ -2618,7 +2731,7 @@
yann@402
  1103
 if test $ac_cv_header_stdc = yes; then
yann@402
  1104
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
yann@402
  1105
 cat > conftest.$ac_ext <<EOF
yann@402
  1106
-#line 2622 "configure"
yann@402
  1107
+#line 2735 "configure"
yann@402
  1108
 #include "confdefs.h"
yann@402
  1109
 #include <string.h>
yann@402
  1110
 EOF
yann@402
  1111
@@ -2636,7 +2749,7 @@
yann@402
  1112
 if test $ac_cv_header_stdc = yes; then
yann@402
  1113
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
yann@402
  1114
 cat > conftest.$ac_ext <<EOF
yann@402
  1115
-#line 2640 "configure"
yann@402
  1116
+#line 2753 "configure"
yann@402
  1117
 #include "confdefs.h"
yann@402
  1118
 #include <stdlib.h>
yann@402
  1119
 EOF
yann@402
  1120
@@ -2657,7 +2770,7 @@
yann@402
  1121
   :
yann@402
  1122
 else
yann@402
  1123
   cat > conftest.$ac_ext <<EOF
yann@402
  1124
-#line 2661 "configure"
yann@402
  1125
+#line 2774 "configure"
yann@402
  1126
 #include "confdefs.h"
yann@402
  1127
 #include <ctype.h>
yann@402
  1128
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
yann@402
  1129
@@ -2668,7 +2781,7 @@
yann@402
  1130
 exit (0); }
yann@402
  1131
 
yann@402
  1132
 EOF
yann@402
  1133
-if { (eval echo configure:2672: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
yann@402
  1134
+if { (eval echo configure:2785: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
yann@402
  1135
 then
yann@402
  1136
   :
yann@402
  1137
 else
yann@402
  1138
@@ -2694,12 +2807,12 @@
yann@402
  1139
 for ac_func in memcpy
yann@402
  1140
 do
yann@402
  1141
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
yann@402
  1142
-echo "configure:2698: checking for $ac_func" >&5
yann@402
  1143
+echo "configure:2811: checking for $ac_func" >&5
yann@402
  1144
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
yann@402
  1145
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1146
 else
yann@402
  1147
   cat > conftest.$ac_ext <<EOF
yann@402
  1148
-#line 2703 "configure"
yann@402
  1149
+#line 2816 "configure"
yann@402
  1150
 #include "confdefs.h"
yann@402
  1151
 /* System header to define __stub macros and hopefully few prototypes,
yann@402
  1152
     which can conflict with char $ac_func(); below.  */
yann@402
  1153
@@ -2722,7 +2835,7 @@
yann@402
  1154
 
yann@402
  1155
 ; return 0; }
yann@402
  1156
 EOF
yann@402
  1157
-if { (eval echo configure:2726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
yann@402
  1158
+if { (eval echo configure:2839: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
yann@402
  1159
   rm -rf conftest*
yann@402
  1160
   eval "ac_cv_func_$ac_func=yes"
yann@402
  1161
 else
yann@402
  1162
@@ -2749,19 +2862,19 @@
yann@402
  1163
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
yann@402
  1164
 # for constant arguments.  Useless!
yann@402
  1165
 echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
yann@402
  1166
-echo "configure:2753: checking for working alloca.h" >&5
yann@402
  1167
+echo "configure:2866: checking for working alloca.h" >&5
yann@402
  1168
 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
yann@402
  1169
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1170
 else
yann@402
  1171
   cat > conftest.$ac_ext <<EOF
yann@402
  1172
-#line 2758 "configure"
yann@402
  1173
+#line 2871 "configure"
yann@402
  1174
 #include "confdefs.h"
yann@402
  1175
 #include <alloca.h>
yann@402
  1176
 int main() {
yann@402
  1177
 char *p = alloca(2 * sizeof(int));
yann@402
  1178
 ; return 0; }
yann@402
  1179
 EOF
yann@402
  1180
-if { (eval echo configure:2765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
yann@402
  1181
+if { (eval echo configure:2878: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
yann@402
  1182
   rm -rf conftest*
yann@402
  1183
   ac_cv_header_alloca_h=yes
yann@402
  1184
 else
yann@402
  1185
@@ -2782,12 +2895,12 @@
yann@402
  1186
 fi
yann@402
  1187
 
yann@402
  1188
 echo $ac_n "checking for alloca""... $ac_c" 1>&6
yann@402
  1189
-echo "configure:2786: checking for alloca" >&5
yann@402
  1190
+echo "configure:2899: checking for alloca" >&5
yann@402
  1191
 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
yann@402
  1192
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1193
 else
yann@402
  1194
   cat > conftest.$ac_ext <<EOF
yann@402
  1195
-#line 2791 "configure"
yann@402
  1196
+#line 2904 "configure"
yann@402
  1197
 #include "confdefs.h"
yann@402
  1198
 
yann@402
  1199
 #ifdef __GNUC__
yann@402
  1200
@@ -2815,7 +2928,7 @@
yann@402
  1201
 char *p = (char *) alloca(1);
yann@402
  1202
 ; return 0; }
yann@402
  1203
 EOF
yann@402
  1204
-if { (eval echo configure:2819: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
yann@402
  1205
+if { (eval echo configure:2932: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
yann@402
  1206
   rm -rf conftest*
yann@402
  1207
   ac_cv_func_alloca_works=yes
yann@402
  1208
 else
yann@402
  1209
@@ -2847,12 +2960,12 @@
yann@402
  1210
 
yann@402
  1211
 
yann@402
  1212
 echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
yann@402
  1213
-echo "configure:2851: checking whether alloca needs Cray hooks" >&5
yann@402
  1214
+echo "configure:2964: checking whether alloca needs Cray hooks" >&5
yann@402
  1215
 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
yann@402
  1216
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1217
 else
yann@402
  1218
   cat > conftest.$ac_ext <<EOF
yann@402
  1219
-#line 2856 "configure"
yann@402
  1220
+#line 2969 "configure"
yann@402
  1221
 #include "confdefs.h"
yann@402
  1222
 #if defined(CRAY) && ! defined(CRAY2)
yann@402
  1223
 webecray
yann@402
  1224
@@ -2877,12 +2990,12 @@
yann@402
  1225
 if test $ac_cv_os_cray = yes; then
yann@402
  1226
 for ac_func in _getb67 GETB67 getb67; do
yann@402
  1227
   echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
yann@402
  1228
-echo "configure:2881: checking for $ac_func" >&5
yann@402
  1229
+echo "configure:2994: checking for $ac_func" >&5
yann@402
  1230
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
yann@402
  1231
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1232
 else
yann@402
  1233
   cat > conftest.$ac_ext <<EOF
yann@402
  1234
-#line 2886 "configure"
yann@402
  1235
+#line 2999 "configure"
yann@402
  1236
 #include "confdefs.h"
yann@402
  1237
 /* System header to define __stub macros and hopefully few prototypes,
yann@402
  1238
     which can conflict with char $ac_func(); below.  */
yann@402
  1239
@@ -2905,7 +3018,7 @@
yann@402
  1240
 
yann@402
  1241
 ; return 0; }
yann@402
  1242
 EOF
yann@402
  1243
-if { (eval echo configure:2909: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
yann@402
  1244
+if { (eval echo configure:3022: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
yann@402
  1245
   rm -rf conftest*
yann@402
  1246
   eval "ac_cv_func_$ac_func=yes"
yann@402
  1247
 else
yann@402
  1248
@@ -2932,7 +3045,7 @@
yann@402
  1249
 fi
yann@402
  1250
 
yann@402
  1251
 echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
yann@402
  1252
-echo "configure:2936: checking stack direction for C alloca" >&5
yann@402
  1253
+echo "configure:3049: checking stack direction for C alloca" >&5
yann@402
  1254
 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
yann@402
  1255
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1256
 else
yann@402
  1257
@@ -2940,7 +3053,7 @@
yann@402
  1258
   ac_cv_c_stack_direction=0
yann@402
  1259
 else
yann@402
  1260
   cat > conftest.$ac_ext <<EOF
yann@402
  1261
-#line 2944 "configure"
yann@402
  1262
+#line 3057 "configure"
yann@402
  1263
 #include "confdefs.h"
yann@402
  1264
 find_stack_direction ()
yann@402
  1265
 {
yann@402
  1266
@@ -2959,7 +3072,7 @@
yann@402
  1267
   exit (find_stack_direction() < 0);
yann@402
  1268
 }
yann@402
  1269
 EOF
yann@402
  1270
-if { (eval echo configure:2963: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
yann@402
  1271
+if { (eval echo configure:3076: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
yann@402
  1272
 then
yann@402
  1273
   ac_cv_c_stack_direction=1
yann@402
  1274
 else
yann@402
  1275
@@ -2982,13 +3095,13 @@
yann@402
  1276
 
yann@402
  1277
 
yann@402
  1278
 echo $ac_n "checking size of short""... $ac_c" 1>&6
yann@402
  1279
-echo "configure:2986: checking size of short" >&5
yann@402
  1280
+echo "configure:3099: checking size of short" >&5
yann@402
  1281
 if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
yann@402
  1282
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1283
 else
yann@402
  1284
   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
yann@402
  1285
   cat > conftest.$ac_ext <<EOF
yann@402
  1286
-#line 2992 "configure"
yann@402
  1287
+#line 3105 "configure"
yann@402
  1288
 #include "confdefs.h"
yann@402
  1289
 #include "confdefs.h"
yann@402
  1290
 #include <sys/types.h>
yann@402
  1291
@@ -2998,7 +3111,7 @@
yann@402
  1292
 switch (0) case 0: case (sizeof (short) == $ac_size):;
yann@402
  1293
 ; return 0; }
yann@402
  1294
 EOF
yann@402
  1295
-if { (eval echo configure:3002: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1296
+if { (eval echo configure:3115: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1297
   rm -rf conftest*
yann@402
  1298
   ac_cv_sizeof_short=$ac_size
yann@402
  1299
 else
yann@402
  1300
@@ -3021,13 +3134,13 @@
yann@402
  1301
 
yann@402
  1302
 
yann@402
  1303
 echo $ac_n "checking size of int""... $ac_c" 1>&6
yann@402
  1304
-echo "configure:3025: checking size of int" >&5
yann@402
  1305
+echo "configure:3138: checking size of int" >&5
yann@402
  1306
 if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
yann@402
  1307
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1308
 else
yann@402
  1309
   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
yann@402
  1310
   cat > conftest.$ac_ext <<EOF
yann@402
  1311
-#line 3031 "configure"
yann@402
  1312
+#line 3144 "configure"
yann@402
  1313
 #include "confdefs.h"
yann@402
  1314
 #include "confdefs.h"
yann@402
  1315
 #include <sys/types.h>
yann@402
  1316
@@ -3037,7 +3150,7 @@
yann@402
  1317
 switch (0) case 0: case (sizeof (int) == $ac_size):;
yann@402
  1318
 ; return 0; }
yann@402
  1319
 EOF
yann@402
  1320
-if { (eval echo configure:3041: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1321
+if { (eval echo configure:3154: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1322
   rm -rf conftest*
yann@402
  1323
   ac_cv_sizeof_int=$ac_size
yann@402
  1324
 else
yann@402
  1325
@@ -3060,13 +3173,13 @@
yann@402
  1326
 
yann@402
  1327
 
yann@402
  1328
 echo $ac_n "checking size of long""... $ac_c" 1>&6
yann@402
  1329
-echo "configure:3064: checking size of long" >&5
yann@402
  1330
+echo "configure:3177: checking size of long" >&5
yann@402
  1331
 if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
yann@402
  1332
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1333
 else
yann@402
  1334
   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
yann@402
  1335
   cat > conftest.$ac_ext <<EOF
yann@402
  1336
-#line 3070 "configure"
yann@402
  1337
+#line 3183 "configure"
yann@402
  1338
 #include "confdefs.h"
yann@402
  1339
 #include "confdefs.h"
yann@402
  1340
 #include <sys/types.h>
yann@402
  1341
@@ -3076,7 +3189,7 @@
yann@402
  1342
 switch (0) case 0: case (sizeof (long) == $ac_size):;
yann@402
  1343
 ; return 0; }
yann@402
  1344
 EOF
yann@402
  1345
-if { (eval echo configure:3080: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1346
+if { (eval echo configure:3193: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1347
   rm -rf conftest*
yann@402
  1348
   ac_cv_sizeof_long=$ac_size
yann@402
  1349
 else
yann@402
  1350
@@ -3099,13 +3212,13 @@
yann@402
  1351
 
yann@402
  1352
 
yann@402
  1353
 echo $ac_n "checking size of long long""... $ac_c" 1>&6
yann@402
  1354
-echo "configure:3103: checking size of long long" >&5
yann@402
  1355
+echo "configure:3216: checking size of long long" >&5
yann@402
  1356
 if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then
yann@402
  1357
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1358
 else
yann@402
  1359
   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
yann@402
  1360
   cat > conftest.$ac_ext <<EOF
yann@402
  1361
-#line 3109 "configure"
yann@402
  1362
+#line 3222 "configure"
yann@402
  1363
 #include "confdefs.h"
yann@402
  1364
 #include "confdefs.h"
yann@402
  1365
 #include <sys/types.h>
yann@402
  1366
@@ -3115,7 +3228,7 @@
yann@402
  1367
 switch (0) case 0: case (sizeof (long long) == $ac_size):;
yann@402
  1368
 ; return 0; }
yann@402
  1369
 EOF
yann@402
  1370
-if { (eval echo configure:3119: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1371
+if { (eval echo configure:3232: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1372
   rm -rf conftest*
yann@402
  1373
   ac_cv_sizeof_long_long=$ac_size
yann@402
  1374
 else
yann@402
  1375
@@ -3138,13 +3251,13 @@
yann@402
  1376
 
yann@402
  1377
 
yann@402
  1378
 echo $ac_n "checking size of float""... $ac_c" 1>&6
yann@402
  1379
-echo "configure:3142: checking size of float" >&5
yann@402
  1380
+echo "configure:3255: checking size of float" >&5
yann@402
  1381
 if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then
yann@402
  1382
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1383
 else
yann@402
  1384
   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
yann@402
  1385
   cat > conftest.$ac_ext <<EOF
yann@402
  1386
-#line 3148 "configure"
yann@402
  1387
+#line 3261 "configure"
yann@402
  1388
 #include "confdefs.h"
yann@402
  1389
 #include "confdefs.h"
yann@402
  1390
 #include <sys/types.h>
yann@402
  1391
@@ -3154,7 +3267,7 @@
yann@402
  1392
 switch (0) case 0: case (sizeof (float) == $ac_size):;
yann@402
  1393
 ; return 0; }
yann@402
  1394
 EOF
yann@402
  1395
-if { (eval echo configure:3158: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1396
+if { (eval echo configure:3271: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1397
   rm -rf conftest*
yann@402
  1398
   ac_cv_sizeof_float=$ac_size
yann@402
  1399
 else
yann@402
  1400
@@ -3177,13 +3290,13 @@
yann@402
  1401
 
yann@402
  1402
 
yann@402
  1403
 echo $ac_n "checking size of double""... $ac_c" 1>&6
yann@402
  1404
-echo "configure:3181: checking size of double" >&5
yann@402
  1405
+echo "configure:3294: checking size of double" >&5
yann@402
  1406
 if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then
yann@402
  1407
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1408
 else
yann@402
  1409
   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
yann@402
  1410
   cat > conftest.$ac_ext <<EOF
yann@402
  1411
-#line 3187 "configure"
yann@402
  1412
+#line 3300 "configure"
yann@402
  1413
 #include "confdefs.h"
yann@402
  1414
 #include "confdefs.h"
yann@402
  1415
 #include <sys/types.h>
yann@402
  1416
@@ -3193,7 +3306,7 @@
yann@402
  1417
 switch (0) case 0: case (sizeof (double) == $ac_size):;
yann@402
  1418
 ; return 0; }
yann@402
  1419
 EOF
yann@402
  1420
-if { (eval echo configure:3197: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1421
+if { (eval echo configure:3310: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1422
   rm -rf conftest*
yann@402
  1423
   ac_cv_sizeof_double=$ac_size
yann@402
  1424
 else
yann@402
  1425
@@ -3216,13 +3329,13 @@
yann@402
  1426
 
yann@402
  1427
 
yann@402
  1428
 echo $ac_n "checking size of long double""... $ac_c" 1>&6
yann@402
  1429
-echo "configure:3220: checking size of long double" >&5
yann@402
  1430
+echo "configure:3333: checking size of long double" >&5
yann@402
  1431
 if eval "test \"`echo '$''{'ac_cv_sizeof_long_double'+set}'`\" = set"; then
yann@402
  1432
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1433
 else
yann@402
  1434
   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
yann@402
  1435
   cat > conftest.$ac_ext <<EOF
yann@402
  1436
-#line 3226 "configure"
yann@402
  1437
+#line 3339 "configure"
yann@402
  1438
 #include "confdefs.h"
yann@402
  1439
 #include "confdefs.h"
yann@402
  1440
 #include <sys/types.h>
yann@402
  1441
@@ -3232,7 +3345,7 @@
yann@402
  1442
 switch (0) case 0: case (sizeof (long double) == $ac_size):;
yann@402
  1443
 ; return 0; }
yann@402
  1444
 EOF
yann@402
  1445
-if { (eval echo configure:3236: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1446
+if { (eval echo configure:3349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1447
   rm -rf conftest*
yann@402
  1448
   ac_cv_sizeof_long_double=$ac_size
yann@402
  1449
 else
yann@402
  1450
@@ -3256,13 +3369,13 @@
yann@402
  1451
 
yann@402
  1452
 
yann@402
  1453
 echo $ac_n "checking size of void *""... $ac_c" 1>&6
yann@402
  1454
-echo "configure:3260: checking size of void *" >&5
yann@402
  1455
+echo "configure:3373: checking size of void *" >&5
yann@402
  1456
 if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set"; then
yann@402
  1457
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1458
 else
yann@402
  1459
   for ac_size in 4 8 1 2 16 12  ; do # List sizes in rough order of prevalence.
yann@402
  1460
   cat > conftest.$ac_ext <<EOF
yann@402
  1461
-#line 3266 "configure"
yann@402
  1462
+#line 3379 "configure"
yann@402
  1463
 #include "confdefs.h"
yann@402
  1464
 #include "confdefs.h"
yann@402
  1465
 #include <sys/types.h>
yann@402
  1466
@@ -3272,7 +3385,7 @@
yann@402
  1467
 switch (0) case 0: case (sizeof (void *) == $ac_size):;
yann@402
  1468
 ; return 0; }
yann@402
  1469
 EOF
yann@402
  1470
-if { (eval echo configure:3276: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1471
+if { (eval echo configure:3389: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1472
   rm -rf conftest*
yann@402
  1473
   ac_cv_sizeof_void_p=$ac_size
yann@402
  1474
 else
yann@402
  1475
@@ -3295,14 +3408,14 @@
yann@402
  1476
 
yann@402
  1477
 
yann@402
  1478
 echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
yann@402
  1479
-echo "configure:3299: checking whether byte ordering is bigendian" >&5
yann@402
  1480
+echo "configure:3412: checking whether byte ordering is bigendian" >&5
yann@402
  1481
 if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
yann@402
  1482
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1483
 else
yann@402
  1484
   ac_cv_c_bigendian=unknown
yann@402
  1485
 # See if sys/param.h defines the BYTE_ORDER macro.
yann@402
  1486
 cat > conftest.$ac_ext <<EOF
yann@402
  1487
-#line 3306 "configure"
yann@402
  1488
+#line 3419 "configure"
yann@402
  1489
 #include "confdefs.h"
yann@402
  1490
 #include <sys/types.h>
yann@402
  1491
 #include <sys/param.h>
yann@402
  1492
@@ -3313,11 +3426,11 @@
yann@402
  1493
 #endif
yann@402
  1494
 ; return 0; }
yann@402
  1495
 EOF
yann@402
  1496
-if { (eval echo configure:3317: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1497
+if { (eval echo configure:3430: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1498
   rm -rf conftest*
yann@402
  1499
   # It does; now see whether it defined to BIG_ENDIAN or not.
yann@402
  1500
 cat > conftest.$ac_ext <<EOF
yann@402
  1501
-#line 3321 "configure"
yann@402
  1502
+#line 3434 "configure"
yann@402
  1503
 #include "confdefs.h"
yann@402
  1504
 #include <sys/types.h>
yann@402
  1505
 #include <sys/param.h>
yann@402
  1506
@@ -3328,7 +3441,7 @@
yann@402
  1507
 #endif
yann@402
  1508
 ; return 0; }
yann@402
  1509
 EOF
yann@402
  1510
-if { (eval echo configure:3332: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1511
+if { (eval echo configure:3445: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
yann@402
  1512
   rm -rf conftest*
yann@402
  1513
   ac_cv_c_bigendian=yes
yann@402
  1514
 else
yann@402
  1515
@@ -3348,7 +3461,7 @@
yann@402
  1516
    echo $ac_n "cross-compiling... " 2>&6 
yann@402
  1517
 else
yann@402
  1518
   cat > conftest.$ac_ext <<EOF
yann@402
  1519
-#line 3352 "configure"
yann@402
  1520
+#line 3465 "configure"
yann@402
  1521
 #include "confdefs.h"
yann@402
  1522
 main () {
yann@402
  1523
   /* Are we little or big endian?  From Harbison&Steele.  */
yann@402
  1524
@@ -3361,7 +3474,7 @@
yann@402
  1525
   exit (u.c[sizeof (long) - 1] == 1);
yann@402
  1526
 }
yann@402
  1527
 EOF
yann@402
  1528
-if { (eval echo configure:3365: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
yann@402
  1529
+if { (eval echo configure:3478: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
yann@402
  1530
 then
yann@402
  1531
   ac_cv_c_bigendian=no
yann@402
  1532
 else
yann@402
  1533
@@ -3379,7 +3492,7 @@
yann@402
  1534
 echo "$ac_t""$ac_cv_c_bigendian" 1>&6
yann@402
  1535
 if test $ac_cv_c_bigendian = unknown; then
yann@402
  1536
 echo $ac_n "checking to probe for byte ordering""... $ac_c" 1>&6
yann@402
  1537
-echo "configure:3383: checking to probe for byte ordering" >&5
yann@402
  1538
+echo "configure:3496: checking to probe for byte ordering" >&5
yann@402
  1539
 
yann@402
  1540
 cat >conftest.c <<EOF
yann@402
  1541
 short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
yann@402
  1542
@@ -3414,6 +3527,10 @@
yann@402
  1543
 #define WORDS_BIGENDIAN 1
yann@402
  1544
 EOF
yann@402
  1545
 
yann@402
  1546
+  cat >> confdefs.h <<\EOF
yann@402
  1547
+#define HOST_WORDS_BIG_ENDIAN 1
yann@402
  1548
+EOF
yann@402
  1549
+
yann@402
  1550
   BYTEORDER=4321
yann@402
  1551
 else
yann@402
  1552
   BYTEORDER=1234
yann@402
  1553
@@ -3429,7 +3546,7 @@
yann@402
  1554
 
yann@402
  1555
 if test x$TARGET = xSPARC; then
yann@402
  1556
     echo $ac_n "checking assembler and linker support unaligned pc related relocs""... $ac_c" 1>&6
yann@402
  1557
-echo "configure:3433: checking assembler and linker support unaligned pc related relocs" >&5
yann@402
  1558
+echo "configure:3550: checking assembler and linker support unaligned pc related relocs" >&5
yann@402
  1559
 if eval "test \"`echo '$''{'libffi_cv_as_sparc_ua_pcrel'+set}'`\" = set"; then
yann@402
  1560
   echo $ac_n "(cached) $ac_c" 1>&6
yann@402
  1561
 else
yann@402
  1562
@@ -3439,14 +3556,14 @@
yann@402
  1563
 	CFLAGS="$CFLAGS -fpic"
yann@402
  1564
 	LDFLAGS="$LDFLAGS -shared"
yann@402
  1565
 	cat > conftest.$ac_ext <<EOF
yann@402
  1566
-#line 3443 "configure"
yann@402
  1567
+#line 3560 "configure"
yann@402
  1568
 #include "confdefs.h"
yann@402
  1569
 asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");
yann@402
  1570
 int main() {
yann@402
  1571
 
yann@402
  1572
 ; return 0; }
yann@402
  1573
 EOF
yann@402
  1574
-if { (eval echo configure:3450: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
yann@402
  1575
+if { (eval echo configure:3567: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
yann@402
  1576
   rm -rf conftest*
yann@402
  1577
   libffi_cv_as_sparc_ua_pcrel=yes
yann@402
  1578
 else
yann@402
  1579
@@ -3709,6 +3826,8 @@
yann@402
  1580
 s%@MIPS_GCC_FALSE@%$MIPS_GCC_FALSE%g
yann@402
  1581
 s%@MIPS_SGI_TRUE@%$MIPS_SGI_TRUE%g
yann@402
  1582
 s%@MIPS_SGI_FALSE@%$MIPS_SGI_FALSE%g
yann@402
  1583
+s%@MIPS_LINUX_TRUE@%$MIPS_LINUX_TRUE%g
yann@402
  1584
+s%@MIPS_LINUX_FALSE@%$MIPS_LINUX_FALSE%g
yann@402
  1585
 s%@SPARC_TRUE@%$SPARC_TRUE%g
yann@402
  1586
 s%@SPARC_FALSE@%$SPARC_FALSE%g
yann@402
  1587
 s%@X86_TRUE@%$X86_TRUE%g
yann@402
  1588
@@ -3729,6 +3848,12 @@
yann@402
  1589
 s%@POWERPC_DARWIN_FALSE@%$POWERPC_DARWIN_FALSE%g
yann@402
  1590
 s%@ARM_TRUE@%$ARM_TRUE%g
yann@402
  1591
 s%@ARM_FALSE@%$ARM_FALSE%g
yann@402
  1592
+s%@S390_TRUE@%$S390_TRUE%g
yann@402
  1593
+s%@S390_FALSE@%$S390_FALSE%g
yann@402
  1594
+s%@X86_64_TRUE@%$X86_64_TRUE%g
yann@402
  1595
+s%@X86_64_FALSE@%$X86_64_FALSE%g
yann@402
  1596
+s%@SH_TRUE@%$SH_TRUE%g
yann@402
  1597
+s%@SH_FALSE@%$SH_FALSE%g
yann@402
  1598
 s%@CPP@%$CPP%g
yann@402
  1599
 s%@ALLOCA@%$ALLOCA%g
yann@402
  1600
 s%@TARGET@%$TARGET%g
yann@402
  1601
@@ -3969,7 +4094,7 @@
yann@402
  1602
 
yann@402
  1603
 if test -n "$CONFIG_FILES"; then
yann@402
  1604
    LD="${ORIGINAL_LD_FOR_MULTILIBS}"
yann@402
  1605
-   ac_file=Makefile . ${libffi_basedir}/../config-ml.in
yann@402
  1606
+   ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in
yann@402
  1607
 fi
yann@402
  1608
 
yann@402
  1609
 exit 0
yann@402
  1610
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure.in gcc/libffi/configure.in
yann@402
  1611
--- gcc-3.2.2.orig/libffi/configure.in	Tue Jan 28 10:43:56 2003
yann@402
  1612
+++ gcc/libffi/configure.in	Sat Feb  1 20:16:19 2003
yann@402
  1613
@@ -22,14 +22,15 @@
yann@402
  1614
 
yann@402
  1615
 if test "${srcdir}" = "."; then
yann@402
  1616
   if test "${with_target_subdir}" != "."; then
yann@402
  1617
-    libffi_basedir="${srcdir}/${with_multisrctop}.."
yann@402
  1618
+    libffi_basedir="${with_multisrctop}../"
yann@402
  1619
   else
yann@402
  1620
-    libffi_basedir="${srcdir}/${with_multisrctop}"
yann@402
  1621
+    libffi_basedir="${with_multisrctop}"
yann@402
  1622
   fi
yann@402
  1623
 else
yann@402
  1624
-  libffi_basedir="${srcdir}"
yann@402
  1625
+  libffi_basedir=
yann@402
  1626
 fi
yann@402
  1627
 AC_SUBST(libffi_basedir)
yann@402
  1628
+AC_CONFIG_AUX_DIR(${libffi_basedir}..)
yann@402
  1629
 
yann@402
  1630
 AC_CANONICAL_HOST
yann@402
  1631
 
yann@402
  1632
@@ -56,17 +57,23 @@
yann@402
  1633
 i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;;
yann@402
  1634
 sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;;
yann@402
  1635
 sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;;
yann@402
  1636
-sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
yann@402
  1637
-sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
yann@402
  1638
-alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;;
yann@402
  1639
+sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;;
yann@402
  1640
+sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;;
yann@402
  1641
+alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;;
yann@402
  1642
 ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;;
yann@402
  1643
 m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;;
yann@402
  1644
+mips64*-*);;
yann@402
  1645
+mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;;
yann@402
  1646
 powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;;
yann@402
  1647
 powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;;
yann@402
  1648
 powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;;
yann@402
  1649
 powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
yann@402
  1650
 rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
yann@402
  1651
 arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;;
yann@402
  1652
+s390-*-linux-*) TARGET=S390; TARGETDIR=s390;;
yann@402
  1653
+s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;;
yann@402
  1654
+x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;;
yann@402
  1655
+sh-*-linux* | sh[[34]]*-*-linux*) TARGET=SH; TARGETDIR=sh;;
yann@402
  1656
 esac
yann@402
  1657
 
yann@402
  1658
 if test $TARGETDIR = unknown; then
yann@402
  1659
@@ -75,6 +82,7 @@
yann@402
  1660
 
yann@402
  1661
 AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
yann@402
  1662
 AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
yann@402
  1663
+AM_CONDITIONAL(MIPS_LINUX, test x$TARGET = xMIPS_LINUX)
yann@402
  1664
 AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
yann@402
  1665
 AM_CONDITIONAL(X86, test x$TARGET = xX86)
yann@402
  1666
 AM_CONDITIONAL(X86_WIN32, test x$TARGET = xX86_WIN32)
yann@402
  1667
@@ -85,6 +93,13 @@
yann@402
  1668
 AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX)
yann@402
  1669
 AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN)
yann@402
  1670
 AM_CONDITIONAL(ARM, test x$TARGET = xARM)
yann@402
  1671
+AM_CONDITIONAL(S390, test x$TARGET = xS390)
yann@402
  1672
+AM_CONDITIONAL(X86_64, test x$TARGET = xX86_64)
yann@402
  1673
+AM_CONDITIONAL(SH, test x$TARGET = xSH)
yann@402
  1674
+
yann@402
  1675
+if test x$TARGET = xMIPS_LINUX; then
yann@402
  1676
+  TARGET=MIPS
yann@402
  1677
+fi
yann@402
  1678
 
yann@402
  1679
 AC_HEADER_STDC
yann@402
  1680
 AC_CHECK_FUNCS(memcpy)
yann@402
  1681
@@ -171,7 +186,7 @@
yann@402
  1682
 [
yann@402
  1683
 if test -n "$CONFIG_FILES"; then
yann@402
  1684
    LD="${ORIGINAL_LD_FOR_MULTILIBS}"
yann@402
  1685
-   ac_file=Makefile . ${libffi_basedir}/../config-ml.in
yann@402
  1686
+   ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in
yann@402
  1687
 fi
yann@402
  1688
 ],
yann@402
  1689
 srcdir=${srcdir}
yann@402
  1690
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/Makefile.in gcc/libffi/include/Makefile.in
yann@402
  1691
--- gcc-3.2.2.orig/libffi/include/Makefile.in	Tue Oct  9 14:32:16 2001
yann@402
  1692
+++ gcc/libffi/include/Makefile.in	Mon Apr 29 13:14:44 2002
yann@402
  1693
@@ -99,7 +99,7 @@
yann@402
  1694
 
yann@402
  1695
 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
yann@402
  1696
 
yann@402
  1697
-TAR = gnutar
yann@402
  1698
+TAR = gtar
yann@402
  1699
 GZIP_ENV = --best
yann@402
  1700
 all: all-redirect
yann@402
  1701
 .SUFFIXES:
yann@402
  1702
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/ffi.h.in gcc/libffi/include/ffi.h.in
yann@402
  1703
--- gcc-3.2.2.orig/libffi/include/ffi.h.in	Wed Mar 13 07:35:56 2002
yann@402
  1704
+++ gcc/libffi/include/ffi.h.in	Wed Jan 29 00:54:28 2003
yann@402
  1705
@@ -1,5 +1,5 @@
yann@402
  1706
 /* -----------------------------------------------------------------*-C-*-
yann@402
  1707
-   libffi @VERSION@ - Copyright (c) 1996-2002  Cygnus Solutions
yann@402
  1708
+   libffi @VERSION@ - Copyright (c) 1996-2003  Cygnus Solutions
yann@402
  1709
 
yann@402
  1710
    Permission is hereby granted, free of charge, to any person obtaining
yann@402
  1711
    a copy of this software and associated documentation files (the
yann@402
  1712
@@ -164,6 +164,12 @@
yann@402
  1713
 #endif
yann@402
  1714
 #endif
yann@402
  1715
 
yann@402
  1716
+#ifdef S390
yann@402
  1717
+#if defined (__s390x__)
yann@402
  1718
+#define S390X
yann@402
  1719
+#endif
yann@402
  1720
+#endif
yann@402
  1721
+
yann@402
  1722
 #ifndef LIBFFI_ASM
yann@402
  1723
 
yann@402
  1724
 /* ---- Generic type definitions ----------------------------------------- */
yann@402
  1725
@@ -189,16 +195,23 @@
yann@402
  1726
 #endif
yann@402
  1727
 #endif
yann@402
  1728
 
yann@402
  1729
-  /* ---- Intel x86 ---------------- */
yann@402
  1730
-#ifdef X86
yann@402
  1731
+  /* ---- Intel x86 Win32 ---------- */
yann@402
  1732
+#ifdef X86_WIN32
yann@402
  1733
   FFI_SYSV,
yann@402
  1734
+  FFI_STDCALL,
yann@402
  1735
+  /* TODO: Add fastcall support for the sake of completeness */
yann@402
  1736
   FFI_DEFAULT_ABI = FFI_SYSV,
yann@402
  1737
 #endif
yann@402
  1738
 
yann@402
  1739
-  /* ---- Intel x86 Win32 ---------- */
yann@402
  1740
-#ifdef X86_WIN32
yann@402
  1741
+  /* ---- Intel x86 and AMD x86-64 - */
yann@402
  1742
+#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__))
yann@402
  1743
   FFI_SYSV,
yann@402
  1744
+  FFI_UNIX64,   /* Unix variants all use the same ABI for x86-64  */
yann@402
  1745
+#ifdef __i386__
yann@402
  1746
   FFI_DEFAULT_ABI = FFI_SYSV,
yann@402
  1747
+#else
yann@402
  1748
+  FFI_DEFAULT_ABI = FFI_UNIX64,
yann@402
  1749
+#endif
yann@402
  1750
 #endif
yann@402
  1751
 
yann@402
  1752
   /* ---- Intel ia64 ---------------- */
yann@402
  1753
@@ -251,6 +264,18 @@
yann@402
  1754
   FFI_DEFAULT_ABI = FFI_SYSV,
yann@402
  1755
 #endif
yann@402
  1756
 
yann@402
  1757
+  /* ---- S390 --------------------- */
yann@402
  1758
+#ifdef S390
yann@402
  1759
+  FFI_SYSV,
yann@402
  1760
+  FFI_DEFAULT_ABI = FFI_SYSV,
yann@402
  1761
+#endif
yann@402
  1762
+
yann@402
  1763
+  /* ---- SuperH ------------------- */
yann@402
  1764
+#ifdef SH
yann@402
  1765
+  FFI_SYSV,
yann@402
  1766
+  FFI_DEFAULT_ABI = FFI_SYSV,
yann@402
  1767
+#endif
yann@402
  1768
+
yann@402
  1769
   /* Leave this for debugging purposes */
yann@402
  1770
   FFI_LAST_ABI
yann@402
  1771
 
yann@402
  1772
@@ -264,7 +289,7 @@
yann@402
  1773
   /*@null@*/ struct _ffi_type **elements;
yann@402
  1774
 } ffi_type;
yann@402
  1775
 
yann@402
  1776
-/* These are defined in ffi.c */
yann@402
  1777
+/* These are defined in types.c */
yann@402
  1778
 extern ffi_type ffi_type_void;
yann@402
  1779
 extern ffi_type ffi_type_uint8;
yann@402
  1780
 extern ffi_type ffi_type_sint8;
yann@402
  1781
@@ -373,13 +398,7 @@
yann@402
  1782
 
yann@402
  1783
 /* ---- Definitions for closures ----------------------------------------- */
yann@402
  1784
 
yann@402
  1785
-#ifdef X86
yann@402
  1786
-
yann@402
  1787
-#define FFI_CLOSURES 1		/* x86 supports closures */
yann@402
  1788
-#define FFI_TRAMPOLINE_SIZE 10
yann@402
  1789
-#define FFI_NATIVE_RAW_API 1	/* and has native raw api support */
yann@402
  1790
-
yann@402
  1791
-#elif defined(X86_WIN32)
yann@402
  1792
+#ifdef __i386__
yann@402
  1793
 
yann@402
  1794
 #define FFI_CLOSURES 1		/* x86 supports closures */
yann@402
  1795
 #define FFI_TRAMPOLINE_SIZE 10
yann@402
  1796
@@ -424,6 +443,40 @@
yann@402
  1797
 #define FFI_TRAMPOLINE_SIZE 24 /* see struct below */ 
yann@402
  1798
 #define FFI_NATIVE_RAW_API 0
yann@402
  1799
 
yann@402
  1800
+#elif defined(SPARC64)
yann@402
  1801
+
yann@402
  1802
+#define FFI_CLOSURES 1
yann@402
  1803
+#define FFI_TRAMPOLINE_SIZE 24
yann@402
  1804
+#define FFI_NATIVE_RAW_API 0
yann@402
  1805
+
yann@402
  1806
+#elif defined(SPARC)
yann@402
  1807
+
yann@402
  1808
+#define FFI_CLOSURES 1
yann@402
  1809
+#define FFI_TRAMPOLINE_SIZE 16
yann@402
  1810
+#define FFI_NATIVE_RAW_API 0
yann@402
  1811
+
yann@402
  1812
+#elif defined(S390)
yann@402
  1813
+
yann@402
  1814
+#define FFI_CLOSURES 1
yann@402
  1815
+#ifdef S390X
yann@402
  1816
+#define FFI_TRAMPOLINE_SIZE 32
yann@402
  1817
+#else
yann@402
  1818
+#define FFI_TRAMPOLINE_SIZE 16
yann@402
  1819
+#endif
yann@402
  1820
+#define FFI_NATIVE_RAW_API 0
yann@402
  1821
+
yann@402
  1822
+#elif defined(SH)
yann@402
  1823
+
yann@402
  1824
+#define FFI_CLOSURES 1
yann@402
  1825
+#define FFI_TRAMPOLINE_SIZE 16
yann@402
  1826
+#define FFI_NATIVE_RAW_API 0
yann@402
  1827
+
yann@402
  1828
+#elif defined(__x86_64__)
yann@402
  1829
+
yann@402
  1830
+#define FFI_CLOSURES 1
yann@402
  1831
+#define FFI_TRAMPOLINE_SIZE 24
yann@402
  1832
+#define FFI_NATIVE_RAW_API 0
yann@402
  1833
+
yann@402
  1834
 #else 
yann@402
  1835
 
yann@402
  1836
 #define FFI_CLOSURES 0
yann@402
  1837
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/ffi.c gcc/libffi/src/arm/ffi.c
yann@402
  1838
--- gcc-3.2.2.orig/libffi/src/arm/ffi.c	Sat Mar  3 07:21:23 2001
yann@402
  1839
+++ gcc/libffi/src/arm/ffi.c	Fri Jul 19 08:08:30 2002
yann@402
  1840
@@ -36,13 +36,10 @@
yann@402
  1841
 /*@=exportheader@*/
yann@402
  1842
 {
yann@402
  1843
   register unsigned int i;
yann@402
  1844
-  register int tmp;
yann@402
  1845
-  register unsigned int avn;
yann@402
  1846
   register void **p_argv;
yann@402
  1847
   register char *argp;
yann@402
  1848
   register ffi_type **p_arg;
yann@402
  1849
 
yann@402
  1850
-  tmp = 0;
yann@402
  1851
   argp = stack;
yann@402
  1852
 
yann@402
  1853
   if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) {
yann@402
  1854
@@ -50,11 +47,10 @@
yann@402
  1855
     argp += 4;
yann@402
  1856
   }
yann@402
  1857
 
yann@402
  1858
-  avn = ecif->cif->nargs;
yann@402
  1859
   p_argv = ecif->avalue;
yann@402
  1860
 
yann@402
  1861
   for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
yann@402
  1862
-       (i != 0) && (avn != 0);
yann@402
  1863
+       (i != 0);
yann@402
  1864
        i--, p_arg++)
yann@402
  1865
     {
yann@402
  1866
       size_t z;
yann@402
  1867
@@ -64,9 +60,6 @@
yann@402
  1868
 	argp = (char *) ALIGN(argp, (*p_arg)->alignment);
yann@402
  1869
       }
yann@402
  1870
 
yann@402
  1871
-      if (avn != 0) 
yann@402
  1872
-	{
yann@402
  1873
-	  avn--;
yann@402
  1874
 	  z = (*p_arg)->size;
yann@402
  1875
 	  if (z < sizeof(int))
yann@402
  1876
 	    {
yann@402
  1877
@@ -107,7 +100,6 @@
yann@402
  1878
 	    }
yann@402
  1879
 	  p_argv++;
yann@402
  1880
 	  argp += z;
yann@402
  1881
-	}
yann@402
  1882
     }
yann@402
  1883
   
yann@402
  1884
   return;
yann@402
  1885
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/sysv.S gcc/libffi/src/arm/sysv.S
yann@402
  1886
--- gcc-3.2.2.orig/libffi/src/arm/sysv.S	Sat Mar  3 07:21:23 2001
yann@402
  1887
+++ gcc/libffi/src/arm/sysv.S	Mon Sep 30 03:08:58 2002
yann@402
  1888
@@ -28,8 +28,15 @@
yann@402
  1889
 #ifdef HAVE_MACHINE_ASM_H
yann@402
  1890
 #include <machine/asm.h>
yann@402
  1891
 #else
yann@402
  1892
-/* XXX these lose for some platforms, I'm sure. */
yann@402
  1893
+#ifdef __USER_LABEL_PREFIX__
yann@402
  1894
+#define CONCAT1(a, b) CONCAT2(a, b)
yann@402
  1895
+#define CONCAT2(a, b) a ## b
yann@402
  1896
+
yann@402
  1897
+/* Use the right prefix for global labels.  */
yann@402
  1898
+#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
yann@402
  1899
+#else
yann@402
  1900
 #define CNAME(x) x
yann@402
  1901
+#endif
yann@402
  1902
 #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
yann@402
  1903
 #endif
yann@402
  1904
 	
yann@402
  1905
@@ -96,12 +103,20 @@
yann@402
  1906
 
yann@402
  1907
 # return FLOAT
yann@402
  1908
 	cmp     a4, #FFI_TYPE_FLOAT
yann@402
  1909
+#ifdef __SOFTFP__
yann@402
  1910
+	streq	a1, [a3]
yann@402
  1911
+#else
yann@402
  1912
 	stfeqs  f0, [a3]
yann@402
  1913
+#endif
yann@402
  1914
 	beq     epilogue
yann@402
  1915
 
yann@402
  1916
 # return DOUBLE or LONGDOUBLE
yann@402
  1917
 	cmp     a4, #FFI_TYPE_DOUBLE
yann@402
  1918
+#ifdef __SOFTFP__
yann@402
  1919
+	stmeqia	a3, {a1, a2}
yann@402
  1920
+#else
yann@402
  1921
 	stfeqd  f0, [a3]
yann@402
  1922
+#endif
yann@402
  1923
 
yann@402
  1924
 epilogue:
yann@402
  1925
         ldmfd sp!, {a1-a4, fp, pc}
yann@402
  1926
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/java_raw_api.c gcc/libffi/src/java_raw_api.c
yann@402
  1927
--- gcc-3.2.2.orig/libffi/src/java_raw_api.c	Tue Apr  9 07:31:14 2002
yann@402
  1928
+++ gcc/libffi/src/java_raw_api.c	Tue Oct  8 23:55:02 2002
yann@402
  1929
@@ -81,21 +81,14 @@
yann@402
  1930
 	{
yann@402
  1931
 	case FFI_TYPE_UINT8:
yann@402
  1932
 	case FFI_TYPE_SINT8:
yann@402
  1933
-	  *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 1);
yann@402
  1934
+	  *args = (void*) ((char*)(raw++) + 3);
yann@402
  1935
 	  break;
yann@402
  1936
 	  
yann@402
  1937
 	case FFI_TYPE_UINT16:
yann@402
  1938
 	case FFI_TYPE_SINT16:
yann@402
  1939
-	  *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 2);
yann@402
  1940
+	  *args = (void*) ((char*)(raw++) + 2);
yann@402
  1941
 	  break;
yann@402
  1942
 
yann@402
  1943
-#if SIZEOF_ARG >= 4	  
yann@402
  1944
-	case FFI_TYPE_UINT32:
yann@402
  1945
-	case FFI_TYPE_SINT32:
yann@402
  1946
-	  *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 4);
yann@402
  1947
-	  break;
yann@402
  1948
-#endif
yann@402
  1949
-	
yann@402
  1950
 #if SIZEOF_ARG == 8	  
yann@402
  1951
 	case FFI_TYPE_UINT64:
yann@402
  1952
 	case FFI_TYPE_SINT64:
yann@402
  1953
@@ -157,31 +150,54 @@
yann@402
  1954
       switch ((*tp)->type)
yann@402
  1955
 	{
yann@402
  1956
 	case FFI_TYPE_UINT8:
yann@402
  1957
+#if WORDS_BIGENDIAN
yann@402
  1958
+	  *(UINT32*)(raw++) = *(UINT8*) (*args);
yann@402
  1959
+#else
yann@402
  1960
 	  (raw++)->uint = *(UINT8*) (*args);
yann@402
  1961
+#endif
yann@402
  1962
 	  break;
yann@402
  1963
 
yann@402
  1964
 	case FFI_TYPE_SINT8:
yann@402
  1965
+#if WORDS_BIGENDIAN
yann@402
  1966
+	  *(SINT32*)(raw++) = *(SINT8*) (*args);
yann@402
  1967
+#else
yann@402
  1968
 	  (raw++)->sint = *(SINT8*) (*args);
yann@402
  1969
+#endif
yann@402
  1970
 	  break;
yann@402
  1971
 
yann@402
  1972
 	case FFI_TYPE_UINT16:
yann@402
  1973
+#if WORDS_BIGENDIAN
yann@402
  1974
+	  *(UINT32*)(raw++) = *(UINT16*) (*args);
yann@402
  1975
+#else
yann@402
  1976
 	  (raw++)->uint = *(UINT16*) (*args);
yann@402
  1977
+#endif
yann@402
  1978
 	  break;
yann@402
  1979
 
yann@402
  1980
 	case FFI_TYPE_SINT16:
yann@402
  1981
+#if WORDS_BIGENDIAN
yann@402
  1982
+	  *(SINT32*)(raw++) = *(SINT16*) (*args);
yann@402
  1983
+#else
yann@402
  1984
 	  (raw++)->sint = *(SINT16*) (*args);
yann@402
  1985
+#endif
yann@402
  1986
 	  break;
yann@402
  1987
 
yann@402
  1988
-#if SIZEOF_ARG >= 4
yann@402
  1989
 	case FFI_TYPE_UINT32:
yann@402
  1990
+#if WORDS_BIGENDIAN
yann@402
  1991
+	  *(UINT32*)(raw++) = *(UINT32*) (*args);
yann@402
  1992
+#else
yann@402
  1993
 	  (raw++)->uint = *(UINT32*) (*args);
yann@402
  1994
+#endif
yann@402
  1995
 	  break;
yann@402
  1996
 
yann@402
  1997
 	case FFI_TYPE_SINT32:
yann@402
  1998
+#if WORDS_BIGENDIAN
yann@402
  1999
+	  *(SINT32*)(raw++) = *(SINT32*) (*args);
yann@402
  2000
+#else
yann@402
  2001
 	  (raw++)->sint = *(SINT32*) (*args);
yann@402
  2002
-	  break;
yann@402
  2003
 #endif
yann@402
  2004
-        case FFI_TYPE_FLOAT:
yann@402
  2005
+	  break;
yann@402
  2006
+
yann@402
  2007
+	case FFI_TYPE_FLOAT:
yann@402
  2008
 	  (raw++)->flt = *(FLOAT32*) (*args);
yann@402
  2009
 	  break;
yann@402
  2010
 
yann@402
  2011
@@ -211,6 +227,55 @@
yann@402
  2012
 
yann@402
  2013
 #if !FFI_NATIVE_RAW_API
yann@402
  2014
 
yann@402
  2015
+static void
yann@402
  2016
+ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue)
yann@402
  2017
+{
yann@402
  2018
+#if WORDS_BIGENDIAN && SIZEOF_ARG == 8
yann@402
  2019
+  switch (cif->rtype->type)
yann@402
  2020
+    {
yann@402
  2021
+    case FFI_TYPE_UINT8:
yann@402
  2022
+    case FFI_TYPE_UINT16:
yann@402
  2023
+    case FFI_TYPE_UINT32:
yann@402
  2024
+      *(UINT64 *)rvalue <<= 32;
yann@402
  2025
+      break;
yann@402
  2026
+
yann@402
  2027
+    case FFI_TYPE_SINT8:
yann@402
  2028
+    case FFI_TYPE_SINT16:
yann@402
  2029
+    case FFI_TYPE_SINT32:
yann@402
  2030
+    case FFI_TYPE_INT:
yann@402
  2031
+      *(SINT64 *)rvalue <<= 32;
yann@402
  2032
+      break;
yann@402
  2033
+
yann@402
  2034
+    default:
yann@402
  2035
+      break;
yann@402
  2036
+    }
yann@402
  2037
+#endif
yann@402
  2038
+}
yann@402
  2039
+
yann@402
  2040
+static void
yann@402
  2041
+ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue)
yann@402
  2042
+{
yann@402
  2043
+#if WORDS_BIGENDIAN && SIZEOF_ARG == 8
yann@402
  2044
+  switch (cif->rtype->type)
yann@402
  2045
+    {
yann@402
  2046
+    case FFI_TYPE_UINT8:
yann@402
  2047
+    case FFI_TYPE_UINT16:
yann@402
  2048
+    case FFI_TYPE_UINT32:
yann@402
  2049
+      *(UINT64 *)rvalue >>= 32;
yann@402
  2050
+      break;
yann@402
  2051
+
yann@402
  2052
+    case FFI_TYPE_SINT8:
yann@402
  2053
+    case FFI_TYPE_SINT16:
yann@402
  2054
+    case FFI_TYPE_SINT32:
yann@402
  2055
+    case FFI_TYPE_INT:
yann@402
  2056
+      *(SINT64 *)rvalue >>= 32;
yann@402
  2057
+      break;
yann@402
  2058
+
yann@402
  2059
+    default:
yann@402
  2060
+      break;
yann@402
  2061
+    }
yann@402
  2062
+#endif
yann@402
  2063
+}
yann@402
  2064
 
yann@402
  2065
 /* This is a generic definition of ffi_raw_call, to be used if the
yann@402
  2066
  * native system does not provide a machine-specific implementation.
yann@402
  2067
@@ -227,6 +292,7 @@
yann@402
  2068
   void **avalue = (void**) alloca (cif->nargs * sizeof (void*));
yann@402
  2069
   ffi_java_raw_to_ptrarray (cif, raw, avalue);
yann@402
  2070
   ffi_call (cif, fn, rvalue, avalue);
yann@402
  2071
+  ffi_java_rvalue_to_raw (cif, rvalue);
yann@402
  2072
 }
yann@402
  2073
 
yann@402
  2074
 #if FFI_CLOSURES		/* base system provides closures */
yann@402
  2075
@@ -240,6 +306,7 @@
yann@402
  2076
 
yann@402
  2077
   ffi_java_ptrarray_to_raw (cif, avalue, raw);
yann@402
  2078
   (*cl->fun) (cif, rvalue, raw, cl->user_data);
yann@402
  2079
+  ffi_java_raw_to_rvalue (cif, rvalue);
yann@402
  2080
 }
yann@402
  2081
 
yann@402
  2082
 /* Again, here is the generic version of ffi_prep_raw_closure, which
yann@402
  2083
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/m68k/ffi.c gcc/libffi/src/m68k/ffi.c
yann@402
  2084
--- gcc-3.2.2.orig/libffi/src/m68k/ffi.c	Sun Aug  8 22:27:19 1999
yann@402
  2085
+++ gcc/libffi/src/m68k/ffi.c	Fri Jul 19 08:08:30 2002
yann@402
  2086
@@ -16,14 +16,11 @@
yann@402
  2087
 ffi_prep_args (void *stack, extended_cif *ecif)
yann@402
  2088
 {
yann@402
  2089
   unsigned int i;
yann@402
  2090
-  int tmp;
yann@402
  2091
-  unsigned int avn;
yann@402
  2092
   void **p_argv;
yann@402
  2093
   char *argp;
yann@402
  2094
   ffi_type **p_arg;
yann@402
  2095
   void *struct_value_ptr;
yann@402
  2096
 
yann@402
  2097
-  tmp = 0;
yann@402
  2098
   argp = stack;
yann@402
  2099
 
yann@402
  2100
   if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
yann@402
  2101
@@ -32,11 +29,10 @@
yann@402
  2102
   else
yann@402
  2103
     struct_value_ptr = NULL;
yann@402
  2104
 
yann@402
  2105
-  avn = ecif->cif->nargs;
yann@402
  2106
   p_argv = ecif->avalue;
yann@402
  2107
 
yann@402
  2108
   for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
yann@402
  2109
-       i != 0 && avn != 0;
yann@402
  2110
+       i != 0;
yann@402
  2111
        i--, p_arg++)
yann@402
  2112
     {
yann@402
  2113
       size_t z;
yann@402
  2114
@@ -45,9 +41,6 @@
yann@402
  2115
       if (((*p_arg)->alignment - 1) & (unsigned) argp)
yann@402
  2116
 	argp = (char *) ALIGN (argp, (*p_arg)->alignment);
yann@402
  2117
 
yann@402
  2118
-      if (avn != 0) 
yann@402
  2119
-	{
yann@402
  2120
-	  avn--;
yann@402
  2121
 	  z = (*p_arg)->size;
yann@402
  2122
 	  if (z < sizeof (int))
yann@402
  2123
 	    {
yann@402
  2124
@@ -82,7 +75,6 @@
yann@402
  2125
 	    memcpy (argp, *p_argv, z);
yann@402
  2126
 	  p_argv++;
yann@402
  2127
 	  argp += z;
yann@402
  2128
-	}
yann@402
  2129
     }
yann@402
  2130
 
yann@402
  2131
   return struct_value_ptr;
yann@402
  2132
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/mips/ffi.c gcc/libffi/src/mips/ffi.c
yann@402
  2133
--- gcc-3.2.2.orig/libffi/src/mips/ffi.c	Sat Mar  3 07:21:23 2001
yann@402
  2134
+++ gcc/libffi/src/mips/ffi.c	Fri Jul 19 08:08:31 2002
yann@402
  2135
@@ -23,6 +23,7 @@
yann@402
  2136
    OTHER DEALINGS IN THE SOFTWARE.
yann@402
  2137
    ----------------------------------------------------------------------- */
yann@402
  2138
 
yann@402
  2139
+#include <sgidefs.h>
yann@402
  2140
 #include <ffi.h>
yann@402
  2141
 #include <ffi_common.h>
yann@402
  2142
 
yann@402
  2143
@@ -50,7 +51,6 @@
yann@402
  2144
 			  int flags)
yann@402
  2145
 {
yann@402
  2146
   register int i;
yann@402
  2147
-  register int avn;
yann@402
  2148
   register void **p_argv;
yann@402
  2149
   register char *argp;
yann@402
  2150
   register ffi_type **p_arg;
yann@402
  2151
@@ -80,12 +80,9 @@
yann@402
  2152
       FIX_ARGP;
yann@402
  2153
     }
yann@402
  2154
 
yann@402
  2155
-  avn = ecif->cif->nargs;
yann@402
  2156
   p_argv = ecif->avalue;
yann@402
  2157
 
yann@402
  2158
-  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
yann@402
  2159
-       i && avn;
yann@402
  2160
-       i--, p_arg++)
yann@402
  2161
+  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++)
yann@402
  2162
     {
yann@402
  2163
       size_t z;
yann@402
  2164
 
yann@402
  2165
@@ -101,9 +98,6 @@
yann@402
  2166
 #define OFFSET sizeof(int)
yann@402
  2167
 #endif      
yann@402
  2168
 
yann@402
  2169
-      if (avn) 
yann@402
  2170
-	{
yann@402
  2171
-	  avn--;
yann@402
  2172
 	  z = (*p_arg)->size;
yann@402
  2173
 	  if (z < sizeof(SLOT_TYPE_UNSIGNED))
yann@402
  2174
 	    {
yann@402
  2175
@@ -179,7 +173,6 @@
yann@402
  2176
 	  p_argv++;
yann@402
  2177
 	  argp += z;
yann@402
  2178
 	  FIX_ARGP;
yann@402
  2179
-	}
yann@402
  2180
     }
yann@402
  2181
   
yann@402
  2182
   return;
yann@402
  2183
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/powerpc/darwin.S gcc/libffi/src/powerpc/darwin.S
yann@402
  2184
--- gcc-3.2.2.orig/libffi/src/powerpc/darwin.S	Sat Jan 19 01:22:34 2002
yann@402
  2185
+++ gcc/libffi/src/powerpc/darwin.S	Thu Jan 23 03:21:55 2003
yann@402
  2186
@@ -3,8 +3,6 @@
yann@402
  2187
    
yann@402
  2188
    PowerPC Assembly glue.
yann@402
  2189
 
yann@402
  2190
-   $Id: darwin.S,v 1.2 2002/01/18 16:22:34 dje Exp $
yann@402
  2191
-
yann@402
  2192
    Permission is hereby granted, free of charge, to any person obtaining
yann@402
  2193
    a copy of this software and associated documentation files (the
yann@402
  2194
    ``Software''), to deal in the Software without restriction, including
yann@402
  2195
@@ -39,30 +37,34 @@
yann@402
  2196
 .text
yann@402
  2197
 	.align 2
yann@402
  2198
 _ffi_call_DARWIN:
yann@402
  2199
-	mr      r12,r8 // We only need r12 until the call, so it doesn't have to be saved...
yann@402
  2200
+LFB0:	
yann@402
  2201
+	mr      r12,r8		/* We only need r12 until the call,
yann@402
  2202
+				so it doesn't have to be saved...  */
yann@402
  2203
+LFB1:	
yann@402
  2204
 	/* Save the old stack pointer as AP.  */
yann@402
  2205
 	mr	r8,r1
yann@402
  2206
-
yann@402
  2207
+LCFI0:	
yann@402
  2208
 	/* Allocate the stack space we need.  */
yann@402
  2209
 	stwux	r1,r1,r4	
yann@402
  2210
 	
yann@402
  2211
 	/* Save registers we use.  */
yann@402
  2212
 	mflr	r9
yann@402
  2213
 
yann@402
  2214
-	stw	r28,-16(r8)
yann@402
  2215
+	stw	r28,-16(r8)	
yann@402
  2216
 	stw	r29,-12(r8)
yann@402
  2217
 	stw	r30, -8(r8)
yann@402
  2218
 	stw	r31, -4(r8)
yann@402
  2219
-	
yann@402
  2220
-	stw	r9,  8(r8)
yann@402
  2221
+
yann@402
  2222
+	stw	r9,  8(r8)	
yann@402
  2223
 	stw	r2, 20(r1)
yann@402
  2224
+LCFI1:	
yann@402
  2225
 
yann@402
  2226
 	/* Save arguments over call...  */
yann@402
  2227
-	mr	r31,r5	/* flags, */
yann@402
  2228
-	mr	r30,r6	/* rvalue, */
yann@402
  2229
-	mr	r29,r7	/* function address, */
yann@402
  2230
-	mr	r28,r8	/* our AP. */
yann@402
  2231
-		
yann@402
  2232
+	mr	r31,r5	/* flags,  */
yann@402
  2233
+	mr	r30,r6	/* rvalue,  */
yann@402
  2234
+	mr	r29,r7	/* function address,  */
yann@402
  2235
+	mr	r28,r8	/* our AP.  */
yann@402
  2236
+LCFI2:		
yann@402
  2237
 	/* Call ffi_prep_args.  */
yann@402
  2238
 	mr	r4,r1
yann@402
  2239
 	li	r9,0
yann@402
  2240
@@ -145,7 +147,8 @@
yann@402
  2241
 L(float_return_value):
yann@402
  2242
 	stfs	f1,0(r30)
yann@402
  2243
 	b	L(done_return_value)
yann@402
  2244
-//END(_ffi_call_DARWIN)
yann@402
  2245
+LFE1:	
yann@402
  2246
+/* END(_ffi_call_DARWIN)  */
yann@402
  2247
 
yann@402
  2248
 /* Provide a null definition of _ffi_call_AIX.  */
yann@402
  2249
 .text
yann@402
  2250
@@ -155,5 +158,61 @@
yann@402
  2251
 	.align 2
yann@402
  2252
 _ffi_call_AIX:
yann@402
  2253
 	blr
yann@402
  2254
-//END(_ffi_call_AIX)
yann@402
  2255
+/* END(_ffi_call_AIX)  */
yann@402
  2256
 
yann@402
  2257
+.data
yann@402
  2258
+.section __TEXT,__eh_frame
yann@402
  2259
+Lframe1:
yann@402
  2260
+	.set	L$set$0,LECIE1-LSCIE1
yann@402
  2261
+	.long	L$set$0	; Length of Common Information Entry
yann@402
  2262
+LSCIE1:
yann@402
  2263
+	.long	0x0	; CIE Identifier Tag
yann@402
  2264
+	.byte	0x1	; CIE Version
yann@402
  2265
+	.ascii	"zR\0"	; CIE Augmentation
yann@402
  2266
+	.byte	0x1	; uleb128 0x1; CIE Code Alignment Factor
yann@402
  2267
+	.byte	0x7c	; sleb128 -4; CIE Data Alignment Factor
yann@402
  2268
+	.byte	0x41	; CIE RA Column
yann@402
  2269
+	.byte   0x1     ; uleb128 0x1; Augmentation size
yann@402
  2270
+	.byte   0x10    ; FDE Encoding (pcrel)
yann@402
  2271
+	.byte	0xc	; DW_CFA_def_cfa
yann@402
  2272
+	.byte	0x1	; uleb128 0x1
yann@402
  2273
+	.byte	0x0	; uleb128 0x0
yann@402
  2274
+	.align	2
yann@402
  2275
+LECIE1:
yann@402
  2276
+LSFDE1:
yann@402
  2277
+	.set	L$set$1,LEFDE1-LASFDE1
yann@402
  2278
+	.long	L$set$1	; FDE Length
yann@402
  2279
+LASFDE1:
yann@402
  2280
+	.set	L$set$2,LASFDE1-Lframe1
yann@402
  2281
+	.long	L$set$2	; FDE CIE offset
yann@402
  2282
+	.long	LFB0-.	; FDE initial location
yann@402
  2283
+	.set	L$set$3,LFE1-LFB0
yann@402
  2284
+	.long	L$set$3	; FDE address range
yann@402
  2285
+	.byte   0x0     ; uleb128 0x0; Augmentation size
yann@402
  2286
+	.byte	0x4	; DW_CFA_advance_loc4
yann@402
  2287
+	.set	L$set$4,LCFI0-LFB1
yann@402
  2288
+	.long	L$set$4
yann@402
  2289
+	.byte	0xd	; DW_CFA_def_cfa_register
yann@402
  2290
+	.byte	0x08	; uleb128 0x08 
yann@402
  2291
+	.byte	0x4	; DW_CFA_advance_loc4
yann@402
  2292
+	.set	L$set$5,LCFI1-LCFI0
yann@402
  2293
+	.long	L$set$5
yann@402
  2294
+	.byte   0x11    ; DW_CFA_offset_extended_sf
yann@402
  2295
+	.byte	0x41	; uleb128 0x41
yann@402
  2296
+	.byte   0x7e    ; sleb128 -2
yann@402
  2297
+	.byte	0x9f	; DW_CFA_offset, column 0x1f 
yann@402
  2298
+	.byte	0x1	; uleb128 0x1 
yann@402
  2299
+	.byte	0x9e	; DW_CFA_offset, column 0x1e
yann@402
  2300
+	.byte	0x2	; uleb128 0x2
yann@402
  2301
+	.byte	0x9d	; DW_CFA_offset, column 0x1d 
yann@402
  2302
+	.byte	0x3	; uleb128 0x3 
yann@402
  2303
+	.byte	0x9c	; DW_CFA_offset, column 0x1c 
yann@402
  2304
+	.byte	0x4	; uleb128 0x4
yann@402
  2305
+	.byte	0x4	; DW_CFA_advance_loc4 
yann@402
  2306
+	.set	L$set$6,LCFI2-LCFI1
yann@402
  2307
+	.long	L$set$6
yann@402
  2308
+	.byte	0xd	; DW_CFA_def_cfa_register 
yann@402
  2309
+	.byte	0x1c	; uleb128 0x1c 
yann@402
  2310
+	.align 2
yann@402
  2311
+LEFDE1:
yann@402
  2312
+	
yann@402
  2313
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/prep_cif.c gcc/libffi/src/prep_cif.c
yann@402
  2314
--- gcc-3.2.2.orig/libffi/src/prep_cif.c	Sat Mar  3 07:21:22 2001
yann@402
  2315
+++ gcc/libffi/src/prep_cif.c	Mon Sep 30 20:59:42 2002
yann@402
  2316
@@ -103,7 +103,8 @@
yann@402
  2317
   /* Perform a sanity check on the return type */
yann@402
  2318
   FFI_ASSERT(ffi_type_test(cif->rtype));
yann@402
  2319
 
yann@402
  2320
-#ifndef M68K
yann@402
  2321
+  /* x86-64 and s390 stack space allocation is handled in prep_machdep.  */
yann@402
  2322
+#if !defined M68K && !defined __x86_64__ && !defined S390
yann@402
  2323
   /* Make space for the return structure pointer */
yann@402
  2324
   if (cif->rtype->type == FFI_TYPE_STRUCT
yann@402
  2325
 #ifdef SPARC
yann@402
  2326
@@ -122,6 +123,7 @@
yann@402
  2327
       if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK))
yann@402
  2328
 	return FFI_BAD_TYPEDEF;
yann@402
  2329
 
yann@402
  2330
+#if !defined __x86_64__ && !defined S390
yann@402
  2331
 #ifdef SPARC
yann@402
  2332
       if (((*ptr)->type == FFI_TYPE_STRUCT
yann@402
  2333
 	   && ((*ptr)->size > 16 || cif->abi != FFI_V9))
yann@402
  2334
@@ -137,6 +139,7 @@
yann@402
  2335
 	  
yann@402
  2336
 	  bytes += STACK_ARG_SIZE((*ptr)->size);
yann@402
  2337
 	}
yann@402
  2338
+#endif
yann@402
  2339
     }
yann@402
  2340
 
yann@402
  2341
   cif->bytes = bytes;
yann@402
  2342
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/ffi.c gcc/libffi/src/s390/ffi.c
yann@402
  2343
--- gcc-3.2.2.orig/libffi/src/s390/ffi.c	Thu Jan  1 09:00:00 1970
yann@402
  2344
+++ gcc/libffi/src/s390/ffi.c	Thu Feb  6 08:58:57 2003
yann@402
  2345
@@ -0,0 +1,753 @@
yann@402
  2346
+/* -----------------------------------------------------------------------
yann@402
  2347
+   ffi.c - Copyright (c) 2000 Software AG
yann@402
  2348
+ 
yann@402
  2349
+   S390 Foreign Function Interface
yann@402
  2350
+ 
yann@402
  2351
+   Permission is hereby granted, free of charge, to any person obtaining
yann@402
  2352
+   a copy of this software and associated documentation files (the
yann@402
  2353
+   ``Software''), to deal in the Software without restriction, including
yann@402
  2354
+   without limitation the rights to use, copy, modify, merge, publish,
yann@402
  2355
+   distribute, sublicense, and/or sell copies of the Software, and to
yann@402
  2356
+   permit persons to whom the Software is furnished to do so, subject to
yann@402
  2357
+   the following conditions:
yann@402
  2358
+ 
yann@402
  2359
+   The above copyright notice and this permission notice shall be included
yann@402
  2360
+   in all copies or substantial portions of the Software.
yann@402
  2361
+ 
yann@402
  2362
+   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
yann@402
  2363
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
yann@402
  2364
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
yann@402
  2365
+   IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
yann@402
  2366
+   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
yann@402
  2367
+   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
yann@402
  2368
+   OTHER DEALINGS IN THE SOFTWARE.
yann@402
  2369
+   ----------------------------------------------------------------------- */
yann@402
  2370
+/*====================================================================*/
yann@402
  2371
+/*                          Includes                                  */
yann@402
  2372
+/*                          --------                                  */
yann@402
  2373
+/*====================================================================*/
yann@402
  2374
+ 
yann@402
  2375
+#include <ffi.h>
yann@402
  2376
+#include <ffi_common.h>
yann@402
  2377
+ 
yann@402
  2378
+#include <stdlib.h>
yann@402
  2379
+#include <stdio.h>
yann@402
  2380
+ 
yann@402
  2381
+/*====================== End of Includes =============================*/
yann@402
  2382
+ 
yann@402
  2383
+/*====================================================================*/
yann@402
  2384
+/*                           Defines                                  */
yann@402
  2385
+/*                           -------                                  */
yann@402
  2386
+/*====================================================================*/
yann@402
  2387
+
yann@402
  2388
+/* Maximum number of GPRs available for argument passing.  */ 
yann@402
  2389
+#define MAX_GPRARGS 5
yann@402
  2390
+
yann@402
  2391
+/* Maximum number of FPRs available for argument passing.  */ 
yann@402
  2392
+#ifdef __s390x__
yann@402
  2393
+#define MAX_FPRARGS 4
yann@402
  2394
+#else
yann@402
  2395
+#define MAX_FPRARGS 2
yann@402
  2396
+#endif
yann@402
  2397
+
yann@402
  2398
+/* Round to multiple of 16.  */
yann@402
  2399
+#define ROUND_SIZE(size) (((size) + 15) & ~15)
yann@402
  2400
+
yann@402
  2401
+/* If these values change, sysv.S must be adapted!  */
yann@402
  2402
+#define FFI390_RET_VOID		0
yann@402
  2403
+#define FFI390_RET_STRUCT	1
yann@402
  2404
+#define FFI390_RET_FLOAT	2
yann@402
  2405
+#define FFI390_RET_DOUBLE	3
yann@402
  2406
+#define FFI390_RET_INT32	4
yann@402
  2407
+#define FFI390_RET_INT64	5
yann@402
  2408
+
yann@402
  2409
+/*===================== End of Defines ===============================*/
yann@402
  2410
+ 
yann@402
  2411
+/*====================================================================*/
yann@402
  2412
+/*                          Prototypes                                */
yann@402
  2413
+/*                          ----------                                */
yann@402
  2414
+/*====================================================================*/
yann@402
  2415
+ 
yann@402
  2416
+static void ffi_prep_args (unsigned char *, extended_cif *);
yann@402
  2417
+static int ffi_check_float_struct (ffi_type *);
yann@402
  2418
+void
yann@402
  2419
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
yann@402
  2420
+__attribute__ ((visibility ("hidden")))
yann@402
  2421
+#endif
yann@402
  2422
+ffi_closure_helper_SYSV (ffi_closure *, unsigned long *, 
yann@402
  2423
+			 unsigned long long *, unsigned long *);
yann@402
  2424
+
yann@402
  2425
+/*====================== End of Prototypes ===========================*/
yann@402
  2426
+ 
yann@402
  2427
+/*====================================================================*/
yann@402
  2428
+/*                          Externals                                 */
yann@402
  2429
+/*                          ---------                                 */
yann@402
  2430
+/*====================================================================*/
yann@402
  2431
+ 
yann@402
  2432
+extern void ffi_call_SYSV(unsigned,
yann@402
  2433
+			  extended_cif *,
yann@402
  2434
+			  void (*)(unsigned char *, extended_cif *),
yann@402
  2435
+			  unsigned,
yann@402
  2436
+			  void *,
yann@402
  2437
+			  void (*fn)());
yann@402
  2438
+
yann@402
  2439
+extern void ffi_closure_SYSV(void);
yann@402
  2440
+ 
yann@402
  2441
+/*====================== End of Externals ============================*/
yann@402
  2442
+ 
yann@402
  2443
+/*====================================================================*/
yann@402
  2444
+/*                                                                    */
yann@402
  2445
+/* Name     - ffi_check_struct_type.                                  */
yann@402
  2446
+/*                                                                    */
yann@402
  2447
+/* Function - Determine if a structure can be passed within a         */
yann@402
  2448
+/*            general purpose or floating point register.             */
yann@402
  2449
+/*                                                                    */
yann@402
  2450
+/*====================================================================*/
yann@402
  2451
+ 
yann@402
  2452
+static int
yann@402
  2453
+ffi_check_struct_type (ffi_type *arg)
yann@402
  2454
+{
yann@402
  2455
+  size_t size = arg->size;
yann@402
  2456
+
yann@402
  2457
+  /* If the struct has just one element, look at that element
yann@402
  2458
+     to find out whether to consider the struct as floating point.  */
yann@402
  2459
+  while (arg->type == FFI_TYPE_STRUCT 
yann@402
  2460
+         && arg->elements[0] && !arg->elements[1])
yann@402
  2461
+    arg = arg->elements[0];
yann@402
  2462
+
yann@402
  2463
+  /* Structs of size 1, 2, 4, and 8 are passed in registers,
yann@402
  2464
+     just like the corresponding int/float types.  */
yann@402
  2465
+  switch (size)
yann@402
  2466
+    {
yann@402
  2467
+      case 1:
yann@402
  2468
+        return FFI_TYPE_UINT8;
yann@402
  2469
+
yann@402
  2470
+      case 2:
yann@402
  2471
+        return FFI_TYPE_UINT16;
yann@402
  2472
+
yann@402
  2473
+      case 4:
yann@402
  2474
+	if (arg->type == FFI_TYPE_FLOAT)
yann@402
  2475
+          return FFI_TYPE_FLOAT;
yann@402
  2476
+	else
yann@402
  2477
+	  return FFI_TYPE_UINT32;
yann@402
  2478
+
yann@402
  2479
+      case 8:
yann@402
  2480
+	if (arg->type == FFI_TYPE_DOUBLE)
yann@402
  2481
+          return FFI_TYPE_DOUBLE;
yann@402
  2482
+	else
yann@402
  2483
+	  return FFI_TYPE_UINT64;
yann@402
  2484
+
yann@402
  2485
+      default:
yann@402
  2486
+	break;
yann@402
  2487
+    }
yann@402
  2488
+
yann@402
  2489
+  /* Other structs are passed via a pointer to the data.  */
yann@402
  2490
+  return FFI_TYPE_POINTER;
yann@402
  2491
+}
yann@402
  2492
+ 
yann@402
  2493
+/*======================== End of Routine ============================*/
yann@402
  2494
+ 
yann@402
  2495
+/*====================================================================*/
yann@402
  2496
+/*                                                                    */
yann@402
  2497
+/* Name     - ffi_prep_args.                                          */
yann@402
  2498
+/*                                                                    */
yann@402
  2499
+/* Function - Prepare parameters for call to function.                */
yann@402
  2500
+/*                                                                    */
yann@402
  2501
+/* ffi_prep_args is called by the assembly routine once stack space   */
yann@402
  2502
+/* has been allocated for the function's arguments.                   */
yann@402
  2503
+/*                                                                    */
yann@402
  2504
+/*====================================================================*/
yann@402
  2505
+ 
yann@402
  2506
+static void
yann@402
  2507
+ffi_prep_args (unsigned char *stack, extended_cif *ecif)
yann@402
  2508
+{
yann@402
  2509
+  /* The stack space will be filled with those areas:
yann@402
  2510
+
yann@402
  2511
+	FPR argument register save area     (highest addresses)
yann@402
  2512
+	GPR argument register save area
yann@402
  2513
+	temporary struct copies
yann@402
  2514
+	overflow argument area              (lowest addresses)
yann@402
  2515
+
yann@402
  2516
+     We set up the following pointers:
yann@402
  2517
+
yann@402
  2518
+        p_fpr: bottom of the FPR area (growing upwards)
yann@402
  2519
+	p_gpr: bottom of the GPR area (growing upwards)
yann@402
  2520
+	p_ov: bottom of the overflow area (growing upwards)
yann@402
  2521
+	p_struct: top of the struct copy area (growing downwards)
yann@402
  2522
+
yann@402
  2523
+     All areas are kept aligned to twice the word size.  */
yann@402
  2524
+
yann@402
  2525
+  int gpr_off = ecif->cif->bytes;
yann@402
  2526
+  int fpr_off = gpr_off + ROUND_SIZE (MAX_GPRARGS * sizeof (long));
yann@402
  2527
+
yann@402
  2528
+  unsigned long long *p_fpr = (unsigned long long *)(stack + fpr_off);
yann@402
  2529
+  unsigned long *p_gpr = (unsigned long *)(stack + gpr_off);
yann@402
  2530
+  unsigned char *p_struct = (unsigned char *)p_gpr;
yann@402
  2531
+  unsigned long *p_ov = (unsigned long *)stack;
yann@402
  2532
+
yann@402
  2533
+  int n_fpr = 0;
yann@402
  2534
+  int n_gpr = 0;
yann@402
  2535
+  int n_ov = 0;
yann@402
  2536
+
yann@402
  2537
+  ffi_type **ptr;
yann@402
  2538
+  void **p_argv = ecif->avalue;
yann@402
  2539
+  int i;
yann@402
  2540
+ 
yann@402
  2541
+  /* If we returning a structure then we set the first parameter register
yann@402
  2542
+     to the address of where we are returning this structure.  */
yann@402
  2543
+
yann@402
  2544
+  if (ecif->cif->flags == FFI390_RET_STRUCT)
yann@402
  2545
+    p_gpr[n_gpr++] = (unsigned long) ecif->rvalue;
yann@402
  2546
+
yann@402
  2547
+  /* Now for the arguments.  */
yann@402
  2548
+ 
yann@402
  2549
+  for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs;
yann@402
  2550
+       i > 0;
yann@402
  2551
+       i--, ptr++, p_argv++)
yann@402
  2552
+    {
yann@402
  2553
+      void *arg = *p_argv;
yann@402
  2554
+      int type = (*ptr)->type;
yann@402
  2555
+
yann@402
  2556
+      /* Check how a structure type is passed.  */
yann@402
  2557
+      if (type == FFI_TYPE_STRUCT)
yann@402
  2558
+	{
yann@402
  2559
+	  type = ffi_check_struct_type (*ptr);
yann@402
  2560
+
yann@402
  2561
+	  /* If we pass the struct via pointer, copy the data.  */
yann@402
  2562
+	  if (type == FFI_TYPE_POINTER)
yann@402
  2563
+	    {
yann@402
  2564
+	      p_struct -= ROUND_SIZE ((*ptr)->size);
yann@402
  2565
+	      memcpy (p_struct, (char *)arg, (*ptr)->size);
yann@402
  2566
+	      arg = &p_struct;
yann@402
  2567
+	    }
yann@402
  2568
+	}
yann@402
  2569
+
yann@402
  2570
+      /* Pointers are passed like UINTs of the same size.  */
yann@402
  2571
+      if (type == FFI_TYPE_POINTER)
yann@402
  2572
+#ifdef __s390x__
yann@402
  2573
+	type = FFI_TYPE_UINT64;
yann@402
  2574
+#else
yann@402
  2575
+	type = FFI_TYPE_UINT32;
yann@402
  2576
+#endif
yann@402
  2577
+
yann@402
  2578
+      /* Now handle all primitive int/float data types.  */
yann@402
  2579
+      switch (type) 
yann@402
  2580
+	{
yann@402
  2581
+	  case FFI_TYPE_DOUBLE:
yann@402
  2582
+	    if (n_fpr < MAX_FPRARGS)
yann@402
  2583
+	      p_fpr[n_fpr++] = *(unsigned long long *) arg;
yann@402
  2584
+	    else
yann@402
  2585
+#ifdef __s390x__
yann@402
  2586
+	      p_ov[n_ov++] = *(unsigned long *) arg;
yann@402
  2587
+#else
yann@402
  2588
+	      p_ov[n_ov++] = ((unsigned long *) arg)[0],
yann@402
  2589
+	      p_ov[n_ov++] = ((unsigned long *) arg)[1];
yann@402
  2590
+#endif
yann@402
  2591
+	    break;
yann@402
  2592
+	
yann@402
  2593
+	  case FFI_TYPE_FLOAT:
yann@402
  2594
+	    if (n_fpr < MAX_FPRARGS)
yann@402
  2595
+	      p_fpr[n_fpr++] = (long long) *(unsigned int *) arg << 32;
yann@402
  2596
+	    else
yann@402
  2597
+	      p_ov[n_ov++] = *(unsigned int *) arg;
yann@402
  2598
+	    break;
yann@402
  2599
+ 
yann@402
  2600
+	  case FFI_TYPE_UINT64:
yann@402
  2601
+	  case FFI_TYPE_SINT64:
yann@402
  2602
+#ifdef __s390x__
yann@402
  2603
+	    if (n_gpr < MAX_GPRARGS)
yann@402
  2604
+	      p_gpr[n_gpr++] = *(unsigned long *) arg;
yann@402
  2605
+	    else
yann@402
  2606
+	      p_ov[n_ov++] = *(unsigned long *) arg;
yann@402
  2607
+#else
yann@402
  2608
+	    if (n_gpr == MAX_GPRARGS-1)
yann@402
  2609
+	      n_gpr = MAX_GPRARGS;
yann@402
  2610
+	    if (n_gpr < MAX_GPRARGS)
yann@402
  2611
+	      p_gpr[n_gpr++] = ((unsigned long *) arg)[0],
yann@402
  2612
+	      p_gpr[n_gpr++] = ((unsigned long *) arg)[1];
yann@402
  2613
+	    else
yann@402
  2614
+	      p_ov[n_ov++] = ((unsigned long *) arg)[0],
yann@402
  2615
+	      p_ov[n_ov++] = ((unsigned long *) arg)[1];
yann@402
  2616
+#endif
yann@402
  2617
+	    break;
yann@402
  2618
+ 
yann@402
  2619
+	  case FFI_TYPE_UINT32:
yann@402
  2620
+	    if (n_gpr < MAX_GPRARGS)
yann@402
  2621
+	      p_gpr[n_gpr++] = *(unsigned int *) arg;
yann@402
  2622
+	    else
yann@402
  2623
+	      p_ov[n_ov++] = *(unsigned int *) arg;
yann@402
  2624
+	    break;
yann@402
  2625
+ 
yann@402
  2626
+	  case FFI_TYPE_INT:
yann@402
  2627
+	  case FFI_TYPE_SINT32:
yann@402
  2628
+	    if (n_gpr < MAX_GPRARGS)
yann@402
  2629
+	      p_gpr[n_gpr++] = *(signed int *) arg;
yann@402
  2630
+	    else
yann@402
  2631
+	      p_ov[n_ov++] = *(signed int *) arg;
yann@402
  2632
+	    break;
yann@402
  2633
+ 
yann@402
  2634
+	  case FFI_TYPE_UINT16:
yann@402
  2635
+	    if (n_gpr < MAX_GPRARGS)
yann@402
  2636
+	      p_gpr[n_gpr++] = *(unsigned short *) arg;
yann@402
  2637
+	    else
yann@402
  2638
+	      p_ov[n_ov++] = *(unsigned short *) arg;
yann@402
  2639
+	    break;
yann@402
  2640
+ 
yann@402
  2641
+	  case FFI_TYPE_SINT16:
yann@402
  2642
+	    if (n_gpr < MAX_GPRARGS)
yann@402
  2643
+	      p_gpr[n_gpr++] = *(signed short *) arg;
yann@402
  2644
+	    else
yann@402
  2645
+	      p_ov[n_ov++] = *(signed short *) arg;
yann@402
  2646
+	    break;
yann@402
  2647
+
yann@402
  2648
+	  case FFI_TYPE_UINT8:
yann@402
  2649
+	    if (n_gpr < MAX_GPRARGS)
yann@402
  2650
+	      p_gpr[n_gpr++] = *(unsigned char *) arg;
yann@402
  2651
+	    else
yann@402
  2652
+	      p_ov[n_ov++] = *(unsigned char *) arg;
yann@402
  2653
+	    break;
yann@402
  2654
+ 
yann@402
  2655
+	  case FFI_TYPE_SINT8:
yann@402
  2656
+	    if (n_gpr < MAX_GPRARGS)
yann@402
  2657
+	      p_gpr[n_gpr++] = *(signed char *) arg;
yann@402
  2658
+	    else
yann@402
  2659
+	      p_ov[n_ov++] = *(signed char *) arg;
yann@402
  2660
+	    break;
yann@402
  2661
+ 
yann@402
  2662
+	  default:
yann@402
  2663
+	    FFI_ASSERT (0);
yann@402
  2664
+	    break;
yann@402
  2665
+        }
yann@402
  2666
+    }
yann@402
  2667
+}
yann@402
  2668
+
yann@402
  2669
+/*======================== End of Routine ============================*/
yann@402
  2670
+ 
yann@402
  2671
+/*====================================================================*/
yann@402
  2672
+/*                                                                    */
yann@402
  2673
+/* Name     - ffi_prep_cif_machdep.                                   */
yann@402
  2674
+/*                                                                    */
yann@402
  2675
+/* Function - Perform machine dependent CIF processing.               */
yann@402
  2676
+/*                                                                    */
yann@402
  2677
+/*====================================================================*/
yann@402
  2678
+ 
yann@402
  2679
+ffi_status
yann@402
  2680
+ffi_prep_cif_machdep(ffi_cif *cif)
yann@402
  2681
+{
yann@402
  2682
+  size_t struct_size = 0;
yann@402
  2683
+  int n_gpr = 0;
yann@402
  2684
+  int n_fpr = 0;
yann@402
  2685
+  int n_ov = 0;
yann@402
  2686
+
yann@402
  2687
+  ffi_type **ptr;
yann@402
  2688
+  int i;
yann@402
  2689
+
yann@402
  2690
+  /* Determine return value handling.  */ 
yann@402
  2691
+
yann@402
  2692
+  switch (cif->rtype->type)
yann@402
  2693
+    {
yann@402
  2694
+      /* Void is easy.  */
yann@402
  2695
+      case FFI_TYPE_VOID:
yann@402
  2696
+	cif->flags = FFI390_RET_VOID;
yann@402
  2697
+	break;
yann@402
  2698
+
yann@402
  2699
+      /* Structures are returned via a hidden pointer.  */
yann@402
  2700
+      case FFI_TYPE_STRUCT:
yann@402
  2701
+	cif->flags = FFI390_RET_STRUCT;
yann@402
  2702
+	n_gpr++;  /* We need one GPR to pass the pointer.  */
yann@402
  2703
+	break; 
yann@402
  2704
+
yann@402
  2705
+      /* Floating point values are returned in fpr 0.  */
yann@402
  2706
+      case FFI_TYPE_FLOAT:
yann@402
  2707
+	cif->flags = FFI390_RET_FLOAT;
yann@402
  2708
+	break;
yann@402
  2709
+
yann@402
  2710
+      case FFI_TYPE_DOUBLE:
yann@402
  2711
+	cif->flags = FFI390_RET_DOUBLE;
yann@402
  2712
+	break;
yann@402
  2713
+
yann@402
  2714
+      /* Integer values are returned in gpr 2 (and gpr 3
yann@402
  2715
+	 for 64-bit values on 31-bit machines).  */
yann@402
  2716
+      case FFI_TYPE_UINT64:
yann@402
  2717
+      case FFI_TYPE_SINT64:
yann@402
  2718
+	cif->flags = FFI390_RET_INT64;
yann@402
  2719
+	break;
yann@402
  2720
+
yann@402
  2721
+      case FFI_TYPE_POINTER:
yann@402
  2722
+      case FFI_TYPE_INT:
yann@402
  2723
+      case FFI_TYPE_UINT32:
yann@402
  2724
+      case FFI_TYPE_SINT32:
yann@402
  2725
+      case FFI_TYPE_UINT16:
yann@402
  2726
+      case FFI_TYPE_SINT16:
yann@402
  2727
+      case FFI_TYPE_UINT8:
yann@402
  2728
+      case FFI_TYPE_SINT8:
yann@402
  2729
+	/* These are to be extended to word size.  */
yann@402
  2730
+#ifdef __s390x__
yann@402
  2731
+	cif->flags = FFI390_RET_INT64;
yann@402
  2732
+#else
yann@402
  2733
+	cif->flags = FFI390_RET_INT32;
yann@402
  2734
+#endif
yann@402
  2735
+	break;
yann@402
  2736
+ 
yann@402
  2737
+      default:
yann@402
  2738
+        FFI_ASSERT (0);
yann@402
  2739
+        break;
yann@402
  2740
+    }
yann@402
  2741
+
yann@402
  2742
+  /* Now for the arguments.  */
yann@402
  2743
+ 
yann@402
  2744
+  for (ptr = cif->arg_types, i = cif->nargs;
yann@402
  2745
+       i > 0;
yann@402
  2746
+       i--, ptr++)
yann@402
  2747
+    {
yann@402
  2748
+      int type = (*ptr)->type;
yann@402
  2749
+
yann@402
  2750
+      /* Check how a structure type is passed.  */
yann@402
  2751
+      if (type == FFI_TYPE_STRUCT)
yann@402
  2752
+	{
yann@402
  2753
+	  type = ffi_check_struct_type (*ptr);
yann@402
  2754
+
yann@402
  2755
+	  /* If we pass the struct via pointer, we must reserve space
yann@402
  2756
+	     to copy its data for proper call-by-value semantics.  */
yann@402
  2757
+	  if (type == FFI_TYPE_POINTER)
yann@402
  2758
+	    struct_size += ROUND_SIZE ((*ptr)->size);
yann@402
  2759
+	}
yann@402
  2760
+
yann@402
  2761
+      /* Now handle all primitive int/float data types.  */
yann@402
  2762
+      switch (type) 
yann@402
  2763
+	{
yann@402
  2764
+	  /* The first MAX_FPRARGS floating point arguments
yann@402
  2765
+	     go in FPRs, the rest overflow to the stack.  */
yann@402
  2766
+
yann@402
  2767
+	  case FFI_TYPE_DOUBLE:
yann@402
  2768
+	    if (n_fpr < MAX_FPRARGS)
yann@402
  2769
+	      n_fpr++;
yann@402
  2770
+	    else
yann@402
  2771
+	      n_ov += sizeof (double) / sizeof (long);
yann@402
  2772
+	    break;
yann@402
  2773
+	
yann@402
  2774
+	  case FFI_TYPE_FLOAT:
yann@402
  2775
+	    if (n_fpr < MAX_FPRARGS)
yann@402
  2776
+	      n_fpr++;
yann@402
  2777
+	    else
yann@402
  2778
+	      n_ov++;
yann@402
  2779
+	    break;
yann@402
  2780
+
yann@402
  2781
+	  /* On 31-bit machines, 64-bit integers are passed in GPR pairs,
yann@402
  2782
+	     if one is still available, or else on the stack.  If only one
yann@402
  2783
+	     register is free, skip the register (it won't be used for any 
yann@402
  2784
+	     subsequent argument either).  */
yann@402
  2785
+	      
yann@402
  2786
+#ifndef __s390x__
yann@402
  2787
+	  case FFI_TYPE_UINT64:
yann@402
  2788
+	  case FFI_TYPE_SINT64:
yann@402
  2789
+	    if (n_gpr == MAX_GPRARGS-1)
yann@402
  2790
+	      n_gpr = MAX_GPRARGS;
yann@402
  2791
+	    if (n_gpr < MAX_GPRARGS)
yann@402
  2792
+	      n_gpr += 2;
yann@402
  2793
+	    else
yann@402
  2794
+	      n_ov += 2;
yann@402
  2795
+	    break;
yann@402
  2796
+#endif
yann@402
  2797
+
yann@402
  2798
+	  /* Everything else is passed in GPRs (until MAX_GPRARGS
yann@402
  2799
+	     have been used) or overflows to the stack.  */
yann@402
  2800
+
yann@402
  2801
+	  default: 
yann@402
  2802
+	    if (n_gpr < MAX_GPRARGS)
yann@402
  2803
+	      n_gpr++;
yann@402
  2804
+	    else
yann@402
  2805
+	      n_ov++;
yann@402
  2806
+	    break;
yann@402
  2807
+        }
yann@402
  2808
+    }
yann@402
  2809
+
yann@402
  2810
+  /* Total stack space as required for overflow arguments
yann@402
  2811
+     and temporary structure copies.  */
yann@402
  2812
+
yann@402
  2813
+  cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size;
yann@402
  2814
+ 
yann@402
  2815
+  return FFI_OK;
yann@402
  2816
+}
yann@402
  2817
+ 
yann@402
  2818
+/*======================== End of Routine ============================*/
yann@402
  2819
+ 
yann@402
  2820
+/*====================================================================*/
yann@402
  2821
+/*                                                                    */
yann@402
  2822
+/* Name     - ffi_call.                                               */
yann@402
  2823
+/*                                                                    */
yann@402
  2824
+/* Function - Call the FFI routine.                                   */
yann@402
  2825
+/*                                                                    */
yann@402
  2826
+/*====================================================================*/
yann@402
  2827
+ 
yann@402
  2828
+void
yann@402
  2829
+ffi_call(ffi_cif *cif,
yann@402
  2830
+	 void (*fn)(),
yann@402
  2831
+	 void *rvalue,
yann@402
  2832
+	 void **avalue)
yann@402
  2833
+{
yann@402
  2834
+  int ret_type = cif->flags;
yann@402
  2835
+  extended_cif ecif;
yann@402
  2836
+ 
yann@402
  2837
+  ecif.cif    = cif;
yann@402
  2838
+  ecif.avalue = avalue;
yann@402
  2839
+  ecif.rvalue = rvalue;
yann@402
  2840
+
yann@402
  2841
+  /* If we don't have a return value, we need to fake one.  */
yann@402
  2842
+  if (rvalue == NULL)
yann@402
  2843
+    {
yann@402
  2844
+      if (ret_type == FFI390_RET_STRUCT)
yann@402
  2845
+	ecif.rvalue = alloca (cif->rtype->size);
yann@402
  2846
+      else
yann@402
  2847
+	ret_type = FFI390_RET_VOID;
yann@402
  2848
+    } 
yann@402
  2849
+
yann@402
  2850
+  switch (cif->abi)
yann@402
  2851
+    {
yann@402
  2852
+      case FFI_SYSV:
yann@402
  2853
+        ffi_call_SYSV (cif->bytes, &ecif, ffi_prep_args,
yann@402
  2854
+		       ret_type, ecif.rvalue, fn);
yann@402
  2855
+        break;
yann@402
  2856
+ 
yann@402
  2857
+      default:
yann@402
  2858
+        FFI_ASSERT (0);
yann@402
  2859
+        break;
yann@402
  2860
+    }
yann@402
  2861
+}
yann@402
  2862
+ 
yann@402
  2863
+/*======================== End of Routine ============================*/
yann@402
  2864
+
yann@402
  2865
+/*====================================================================*/
yann@402
  2866
+/*                                                                    */
yann@402
  2867
+/* Name     - ffi_closure_helper_SYSV.                                */
yann@402
  2868
+/*                                                                    */
yann@402
  2869
+/* Function - Call a FFI closure target function.                     */
yann@402
  2870
+/*                                                                    */
yann@402
  2871
+/*====================================================================*/
yann@402
  2872
+ 
yann@402
  2873
+void
yann@402
  2874
+ffi_closure_helper_SYSV (ffi_closure *closure,
yann@402
  2875
+			 unsigned long *p_gpr,
yann@402
  2876
+			 unsigned long long *p_fpr,
yann@402
  2877
+			 unsigned long *p_ov)
yann@402
  2878
+{
yann@402
  2879
+  unsigned long long ret_buffer;
yann@402
  2880
+
yann@402
  2881
+  void *rvalue = &ret_buffer;
yann@402
  2882
+  void **avalue;
yann@402
  2883
+  void **p_arg;
yann@402
  2884
+
yann@402
  2885
+  int n_gpr = 0;
yann@402
  2886
+  int n_fpr = 0;
yann@402
  2887
+  int n_ov = 0;
yann@402
  2888
+
yann@402
  2889
+  ffi_type **ptr;
yann@402
  2890
+  int i;
yann@402
  2891
+
yann@402
  2892
+  /* Allocate buffer for argument list pointers.  */
yann@402
  2893
+
yann@402
  2894
+  p_arg = avalue = alloca (closure->cif->nargs * sizeof (void *));
yann@402
  2895
+
yann@402
  2896
+  /* If we returning a structure, pass the structure address 
yann@402
  2897
+     directly to the target function.  Otherwise, have the target 
yann@402
  2898
+     function store the return value to the GPR save area.  */
yann@402
  2899
+
yann@402
  2900
+  if (closure->cif->flags == FFI390_RET_STRUCT)
yann@402
  2901
+    rvalue = (void *) p_gpr[n_gpr++];
yann@402
  2902
+
yann@402
  2903
+  /* Now for the arguments.  */
yann@402
  2904
+
yann@402
  2905
+  for (ptr = closure->cif->arg_types, i = closure->cif->nargs;
yann@402
  2906
+       i > 0;
yann@402
  2907
+       i--, p_arg++, ptr++)
yann@402
  2908
+    {
yann@402
  2909
+      int deref_struct_pointer = 0;
yann@402
  2910
+      int type = (*ptr)->type;
yann@402
  2911
+
yann@402
  2912
+      /* Check how a structure type is passed.  */
yann@402
  2913
+      if (type == FFI_TYPE_STRUCT)
yann@402
  2914
+	{
yann@402
  2915
+	  type = ffi_check_struct_type (*ptr);
yann@402
  2916
+
yann@402
  2917
+	  /* If we pass the struct via pointer, remember to 
yann@402
  2918
+	     retrieve the pointer later.  */
yann@402
  2919
+	  if (type == FFI_TYPE_POINTER)
yann@402
  2920
+	    deref_struct_pointer = 1;
yann@402
  2921
+	}
yann@402
  2922
+
yann@402
  2923
+      /* Pointers are passed like UINTs of the same size.  */
yann@402
  2924
+      if (type == FFI_TYPE_POINTER)
yann@402
  2925
+#ifdef __s390x__
yann@402
  2926
+	type = FFI_TYPE_UINT64;
yann@402
  2927
+#else
yann@402
  2928
+	type = FFI_TYPE_UINT32;
yann@402
  2929
+#endif
yann@402
  2930
+
yann@402
  2931
+      /* Now handle all primitive int/float data types.  */
yann@402
  2932
+      switch (type) 
yann@402
  2933
+	{
yann@402
  2934
+	  case FFI_TYPE_DOUBLE:
yann@402
  2935
+	    if (n_fpr < MAX_FPRARGS)
yann@402
  2936
+	      *p_arg = &p_fpr[n_fpr++];
yann@402
  2937
+	    else
yann@402
  2938
+	      *p_arg = &p_ov[n_ov], 
yann@402
  2939
+	      n_ov += sizeof (double) / sizeof (long);
yann@402
  2940
+	    break;
yann@402
  2941
+	
yann@402
  2942
+	  case FFI_TYPE_FLOAT:
yann@402
  2943
+	    if (n_fpr < MAX_FPRARGS)
yann@402
  2944
+	      *p_arg = &p_fpr[n_fpr++];
yann@402
  2945
+	    else
yann@402
  2946
+	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
yann@402
  2947
+	    break;
yann@402
  2948
+ 
yann@402
  2949
+	  case FFI_TYPE_UINT64:
yann@402
  2950
+	  case FFI_TYPE_SINT64:
yann@402
  2951
+#ifdef __s390x__
yann@402
  2952
+	    if (n_gpr < MAX_GPRARGS)
yann@402
  2953
+	      *p_arg = &p_gpr[n_gpr++];
yann@402
  2954
+	    else
yann@402
  2955
+	      *p_arg = &p_ov[n_ov++];
yann@402
  2956
+#else
yann@402
  2957
+	    if (n_gpr == MAX_GPRARGS-1)
yann@402
  2958
+	      n_gpr = MAX_GPRARGS;
yann@402
  2959
+	    if (n_gpr < MAX_GPRARGS)
yann@402
  2960
+	      *p_arg = &p_gpr[n_gpr], n_gpr += 2;
yann@402
  2961
+	    else
yann@402
  2962
+	      *p_arg = &p_ov[n_ov], n_ov += 2;
yann@402
  2963
+#endif
yann@402
  2964
+	    break;
yann@402
  2965
+ 
yann@402
  2966
+	  case FFI_TYPE_INT:
yann@402
  2967
+	  case FFI_TYPE_UINT32:
yann@402
  2968
+	  case FFI_TYPE_SINT32:
yann@402
  2969
+	    if (n_gpr < MAX_GPRARGS)
yann@402
  2970
+	      *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4;
yann@402
  2971
+	    else
yann@402
  2972
+	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
yann@402
  2973
+	    break;
yann@402
  2974
+ 
yann@402
  2975
+	  case FFI_TYPE_UINT16:
yann@402
  2976
+	  case FFI_TYPE_SINT16:
yann@402
  2977
+	    if (n_gpr < MAX_GPRARGS)
yann@402
  2978
+	      *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2;
yann@402
  2979
+	    else
yann@402
  2980
+	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2;
yann@402
  2981
+	    break;
yann@402
  2982
+
yann@402
  2983
+	  case FFI_TYPE_UINT8:
yann@402
  2984
+	  case FFI_TYPE_SINT8:
yann@402
  2985
+	    if (n_gpr < MAX_GPRARGS)
yann@402
  2986
+	      *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1;
yann@402
  2987
+	    else
yann@402
  2988
+	      *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1;
yann@402
  2989
+	    break;
yann@402
  2990
+ 
yann@402
  2991
+	  default:
yann@402
  2992
+	    FFI_ASSERT (0);
yann@402
  2993
+	    break;
yann@402
  2994
+        }
yann@402
  2995
+
yann@402
  2996
+      /* If this is a struct passed via pointer, we need to
yann@402
  2997
+	 actually retrieve that pointer.  */
yann@402
  2998
+      if (deref_struct_pointer)
yann@402
  2999
+	*p_arg = *(void **)*p_arg;
yann@402
  3000
+    }
yann@402
  3001
+
yann@402
  3002
+
yann@402
  3003
+  /* Call the target function.  */
yann@402
  3004
+  (closure->fun) (closure->cif, rvalue, avalue, closure->user_data);
yann@402
  3005
+
yann@402
  3006
+  /* Convert the return value.  */
yann@402
  3007
+  switch (closure->cif->rtype->type)
yann@402
  3008
+    {
yann@402
  3009
+      /* Void is easy, and so is struct.  */
yann@402
  3010
+      case FFI_TYPE_VOID:
yann@402
  3011
+      case FFI_TYPE_STRUCT:
yann@402
  3012
+	break;
yann@402
  3013
+
yann@402
  3014
+      /* Floating point values are returned in fpr 0.  */
yann@402
  3015
+      case FFI_TYPE_FLOAT:
yann@402
  3016
+	p_fpr[0] = (long long) *(unsigned int *) rvalue << 32;
yann@402
  3017
+	break;
yann@402
  3018
+
yann@402
  3019
+      case FFI_TYPE_DOUBLE:
yann@402
  3020
+	p_fpr[0] = *(unsigned long long *) rvalue;
yann@402
  3021
+	break;
yann@402
  3022
+
yann@402
  3023
+      /* Integer values are returned in gpr 2 (and gpr 3
yann@402
  3024
+	 for 64-bit values on 31-bit machines).  */
yann@402
  3025
+      case FFI_TYPE_UINT64:
yann@402
  3026
+      case FFI_TYPE_SINT64:
yann@402
  3027
+#ifdef __s390x__
yann@402
  3028
+	p_gpr[0] = *(unsigned long *) rvalue;
yann@402
  3029
+#else
yann@402
  3030
+	p_gpr[0] = ((unsigned long *) rvalue)[0],
yann@402
  3031
+	p_gpr[1] = ((unsigned long *) rvalue)[1];
yann@402
  3032
+#endif
yann@402
  3033
+	break;
yann@402
  3034
+
yann@402
  3035
+      case FFI_TYPE_POINTER:
yann@402
  3036
+      case FFI_TYPE_UINT32:
yann@402
  3037
+      case FFI_TYPE_UINT16:
yann@402
  3038
+      case FFI_TYPE_UINT8:
yann@402
  3039
+	p_gpr[0] = *(unsigned long *) rvalue;
yann@402
  3040
+	break;
yann@402
  3041
+
yann@402
  3042
+      case FFI_TYPE_INT:
yann@402
  3043
+      case FFI_TYPE_SINT32:
yann@402
  3044
+      case FFI_TYPE_SINT16:
yann@402
  3045
+      case FFI_TYPE_SINT8:
yann@402
  3046
+	p_gpr[0] = *(signed long *) rvalue;
yann@402
  3047
+	break;
yann@402
  3048
+
yann@402
  3049
+      default:
yann@402
  3050
+        FFI_ASSERT (0);
yann@402
  3051
+        break;
yann@402
  3052
+    }
yann@402
  3053
+}
yann@402
  3054
+ 
yann@402
  3055
+/*======================== End of Routine ============================*/
yann@402
  3056
+
yann@402
  3057
+/*====================================================================*/
yann@402
  3058
+/*                                                                    */
yann@402
  3059
+/* Name     - ffi_prep_closure.                                       */
yann@402
  3060
+/*                                                                    */
yann@402
  3061
+/* Function - Prepare a FFI closure.                                  */
yann@402
  3062
+/*                                                                    */
yann@402
  3063
+/*====================================================================*/
yann@402
  3064
+ 
yann@402
  3065
+ffi_status
yann@402
  3066
+ffi_prep_closure (ffi_closure *closure,
yann@402
  3067
+                  ffi_cif *cif,
yann@402
  3068
+                  void (*fun) (ffi_cif *, void *, void **, void *),
yann@402
  3069
+                  void *user_data)
yann@402
  3070
+{
yann@402
  3071
+  FFI_ASSERT (cif->abi == FFI_SYSV);
yann@402
  3072
+
yann@402
  3073
+#ifndef __s390x__
yann@402
  3074
+  *(short *)&closure->tramp [0] = 0x0d10;   /* basr %r1,0 */
yann@402
  3075
+  *(short *)&closure->tramp [2] = 0x9801;   /* lm %r0,%r1,6(%r1) */
yann@402
  3076
+  *(short *)&closure->tramp [4] = 0x1006;
yann@402
  3077
+  *(short *)&closure->tramp [6] = 0x07f1;   /* br %r1 */
yann@402
  3078
+  *(long  *)&closure->tramp [8] = (long)closure;
yann@402
  3079
+  *(long  *)&closure->tramp[12] = (long)&ffi_closure_SYSV;
yann@402
  3080
+#else
yann@402
  3081
+  *(short *)&closure->tramp [0] = 0x0d10;   /* basr %r1,0 */
yann@402
  3082
+  *(short *)&closure->tramp [2] = 0xeb01;   /* lmg %r0,%r1,14(%r1) */
yann@402
  3083
+  *(short *)&closure->tramp [4] = 0x100e;
yann@402
  3084
+  *(short *)&closure->tramp [6] = 0x0004;
yann@402
  3085
+  *(short *)&closure->tramp [8] = 0x07f1;   /* br %r1 */
yann@402
  3086
+  *(long  *)&closure->tramp[16] = (long)closure;
yann@402
  3087
+  *(long  *)&closure->tramp[24] = (long)&ffi_closure_SYSV;
yann@402
  3088
+#endif 
yann@402
  3089
+ 
yann@402
  3090
+  closure->cif = cif;
yann@402
  3091
+  closure->user_data = user_data;
yann@402
  3092
+  closure->fun = fun;
yann@402
  3093
+ 
yann@402
  3094
+  return FFI_OK;
yann@402
  3095
+}
yann@402
  3096
+
yann@402
  3097
+/*======================== End of Routine ============================*/
yann@402
  3098
+ 
yann@402
  3099
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/sysv.S gcc/libffi/src/s390/sysv.S
yann@402
  3100
--- gcc-3.2.2.orig/libffi/src/s390/sysv.S	Thu Jan  1 09:00:00 1970
yann@402
  3101
+++ gcc/libffi/src/s390/sysv.S	Thu Nov 28 01:44:35 2002
yann@402
  3102
@@ -0,0 +1,425 @@
yann@402
  3103
+/* -----------------------------------------------------------------------
yann@402
  3104
+   sysv.S - Copyright (c) 2000 Software AG
yann@402
  3105
+ 
yann@402
  3106
+   S390 Foreign Function Interface
yann@402
  3107
+ 
yann@402
  3108
+   Permission is hereby granted, free of charge, to any person obtaining
yann@402
  3109
+   a copy of this software and associated documentation files (the
yann@402
  3110
+   ``Software''), to deal in the Software without restriction, including
yann@402
  3111
+   without limitation the rights to use, copy, modify, merge, publish,
yann@402
  3112
+   distribute, sublicense, and/or sell copies of the Software, and to
yann@402
  3113
+   permit persons to whom the Software is furnished to do so, subject to
yann@402
  3114
+   the following conditions:
yann@402
  3115
+ 
yann@402
  3116
+   The above copyright notice and this permission notice shall be included
yann@402
  3117
+   in all copies or substantial portions of the Software.
yann@402
  3118
+ 
yann@402
  3119
+   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
yann@402
  3120
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
yann@402
  3121
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
yann@402
  3122
+   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
yann@402
  3123
+   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
yann@402
  3124
+   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
yann@402
  3125
+   OTHER DEALINGS IN THE SOFTWARE.
yann@402
  3126
+   ----------------------------------------------------------------------- */
yann@402
  3127
+
yann@402
  3128
+#ifndef __s390x__
yann@402
  3129
+ 
yann@402
  3130
+.text
yann@402
  3131
+
yann@402
  3132
+	# r2:	cif->bytes
yann@402
  3133
+	# r3:	&ecif
yann@402
  3134
+	# r4:	ffi_prep_args
yann@402
  3135
+	# r5:	ret_type
yann@402
  3136
+	# r6:	ecif.rvalue
yann@402
  3137
+	# ov:	fn 
yann@402
  3138
+ 
yann@402
  3139
+	# This assumes we are using gas.
yann@402
  3140
+	.globl	ffi_call_SYSV
yann@402
  3141
+	.type	ffi_call_SYSV,%function
yann@402
  3142
+ffi_call_SYSV:
yann@402
  3143
+.LFB1:
yann@402
  3144
+	stm	%r6,%r15,24(%r15)		# Save registers
yann@402
  3145
+.LCFI0:
yann@402
  3146
+	basr	%r13,0				# Set up base register
yann@402
  3147
+.Lbase:
yann@402
  3148
+	lr	%r11,%r15			# Set up frame pointer
yann@402
  3149
+.LCFI1:
yann@402
  3150
+	sr	%r15,%r2
yann@402
  3151
+	ahi	%r15,-96-48			# Allocate stack
yann@402
  3152
+	lr	%r8,%r6				# Save ecif.rvalue
yann@402
  3153
+	sr	%r9,%r9
yann@402
  3154
+	ic	%r9,.Ltable-.Lbase(%r13,%r5)	# Load epilog address
yann@402
  3155
+	l	%r7,96(%r11)			# Load function address
yann@402
  3156
+	st	%r11,0(%r15)			# Set up back chain
yann@402
  3157
+	ahi	%r11,-48			# Register save area
yann@402
  3158
+.LCFI2:
yann@402
  3159
+
yann@402
  3160
+	la	%r2,96(%r15)			# Save area
yann@402
  3161
+						# r3 already holds &ecif
yann@402
  3162
+	basr	%r14,%r4			# Call ffi_prep_args
yann@402
  3163
+
yann@402
  3164
+	lm	%r2,%r6,0(%r11)			# Load arguments
yann@402
  3165
+	ld	%f0,32(%r11)
yann@402
  3166
+	ld	%f2,40(%r11)
yann@402
  3167
+	la	%r14,0(%r13,%r9)		# Set return address
yann@402
  3168
+	br	%r7				# ... and call function
yann@402
  3169
+
yann@402
  3170
+.LretNone:					# Return void
yann@402
  3171
+	l	%r4,48+56(%r11)
yann@402
  3172
+	lm	%r6,%r15,48+24(%r11)
yann@402
  3173
+	br	%r4
yann@402
  3174
+
yann@402
  3175
+.LretFloat:
yann@402
  3176
+	l	%r4,48+56(%r11)
yann@402
  3177
+	ste	%f0,0(%r8)			# Return float
yann@402
  3178
+	lm	%r6,%r15,48+24(%r11)
yann@402
  3179
+	br	%r4
yann@402
  3180
+ 
yann@402
  3181
+.LretDouble:
yann@402
  3182
+	l	%r4,48+56(%r11)
yann@402
  3183
+	std	%f0,0(%r8)			# Return double
yann@402
  3184
+	lm	%r6,%r15,48+24(%r11)
yann@402
  3185
+	br	%r4
yann@402
  3186
+
yann@402
  3187
+.LretInt32:
yann@402
  3188
+	l	%r4,48+56(%r11)
yann@402
  3189
+	st	%r2,0(%r8)			# Return int
yann@402
  3190
+	lm	%r6,%r15,48+24(%r11)
yann@402
  3191
+	br	%r4
yann@402
  3192
+ 
yann@402
  3193
+.LretInt64:
yann@402
  3194
+	l	%r4,48+56(%r11)
yann@402
  3195
+	stm	%r2,%r3,0(%r8)			# Return long long
yann@402
  3196
+	lm	%r6,%r15,48+24(%r11)
yann@402
  3197
+	br	%r4
yann@402
  3198
+ 
yann@402
  3199
+.Ltable:
yann@402
  3200
+	.byte	.LretNone-.Lbase		# FFI390_RET_VOID
yann@402
  3201
+	.byte	.LretNone-.Lbase		# FFI390_RET_STRUCT
yann@402
  3202
+	.byte	.LretFloat-.Lbase		# FFI390_RET_FLOAT
yann@402
  3203
+	.byte	.LretDouble-.Lbase		# FFI390_RET_DOUBLE
yann@402
  3204
+	.byte	.LretInt32-.Lbase		# FFI390_RET_INT32
yann@402
  3205
+	.byte	.LretInt64-.Lbase		# FFI390_RET_INT64
yann@402
  3206
+
yann@402
  3207
+.LFE1: 
yann@402
  3208
+.ffi_call_SYSV_end:
yann@402
  3209
+	.size	 ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
yann@402
  3210
+
yann@402
  3211
+
yann@402
  3212
+	.globl	ffi_closure_SYSV
yann@402
  3213
+	.type	ffi_closure_SYSV,%function
yann@402
  3214
+ffi_closure_SYSV:
yann@402
  3215
+.LFB2:
yann@402
  3216
+	stm	%r12,%r15,48(%r15)		# Save registers
yann@402
  3217
+.LCFI10:
yann@402
  3218
+	basr	%r13,0				# Set up base register
yann@402
  3219
+.Lcbase:
yann@402
  3220
+	stm	%r2,%r6,8(%r15)			# Save arguments
yann@402
  3221
+	std	%f0,64(%r15)
yann@402
  3222
+	std	%f2,72(%r15)
yann@402
  3223
+	lr	%r1,%r15			# Set up stack frame
yann@402
  3224
+	ahi	%r15,-96
yann@402
  3225
+.LCFI11:
yann@402
  3226
+	l	%r12,.Lchelper-.Lcbase(%r13)	# Get helper function
yann@402
  3227
+	lr	%r2,%r0				# Closure
yann@402
  3228
+	la	%r3,8(%r1)			# GPRs
yann@402
  3229
+	la	%r4,64(%r1)			# FPRs
yann@402
  3230
+	la	%r5,96(%r1)			# Overflow
yann@402
  3231
+	st	%r1,0(%r15)			# Set up back chain
yann@402
  3232
+
yann@402
  3233
+	bas	%r14,0(%r12,%r13)		# Call helper
yann@402
  3234
+
yann@402
  3235
+	l	%r4,96+56(%r15)
yann@402
  3236
+	ld	%f0,96+64(%r15)			# Load return registers
yann@402
  3237
+	lm	%r2,%r3,96+8(%r15)
yann@402
  3238
+	lm	%r12,%r15,96+48(%r15)
yann@402
  3239
+	br	%r4
yann@402
  3240
+
yann@402
  3241
+	.align 4
yann@402
  3242
+.Lchelper:
yann@402
  3243
+	.long	ffi_closure_helper_SYSV-.Lcbase
yann@402
  3244
+
yann@402
  3245
+.LFE2: 
yann@402
  3246
+
yann@402
  3247
+.ffi_closure_SYSV_end:
yann@402
  3248
+	.size	 ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
yann@402
  3249
+
yann@402
  3250
+
yann@402
  3251
+	.section	.eh_frame,"a",@progbits
yann@402
  3252
+.Lframe1:
yann@402
  3253
+	.4byte	.LECIE1-.LSCIE1	# Length of Common Information Entry
yann@402
  3254
+.LSCIE1:
yann@402
  3255
+	.4byte	0x0	# CIE Identifier Tag
yann@402
  3256
+	.byte	0x1	# CIE Version
yann@402
  3257
+	.ascii "zR\0"	# CIE Augmentation
yann@402
  3258
+	.uleb128 0x1	# CIE Code Alignment Factor
yann@402
  3259
+	.sleb128 -4	# CIE Data Alignment Factor
yann@402
  3260
+	.byte	0xe	# CIE RA Column
yann@402
  3261
+	.uleb128 0x1	# Augmentation size
yann@402
  3262
+	.byte	0x1b	# FDE Encoding (pcrel sdata4)
yann@402
  3263
+	.byte	0xc	# DW_CFA_def_cfa
yann@402
  3264
+	.uleb128 0xf
yann@402
  3265
+	.uleb128 0x60
yann@402
  3266
+	.align	4
yann@402
  3267
+.LECIE1:
yann@402
  3268
+.LSFDE1:
yann@402
  3269
+	.4byte	.LEFDE1-.LASFDE1	# FDE Length
yann@402
  3270
+.LASFDE1:
yann@402
  3271
+	.4byte	.LASFDE1-.Lframe1	# FDE CIE offset
yann@402
  3272
+	.4byte	.LFB1-.	# FDE initial location
yann@402
  3273
+	.4byte	.LFE1-.LFB1	# FDE address range
yann@402
  3274
+	.uleb128 0x0	# Augmentation size
yann@402
  3275
+	.byte	0x4	# DW_CFA_advance_loc4
yann@402
  3276
+	.4byte	.LCFI0-.LFB1
yann@402
  3277
+	.byte	0x8f	# DW_CFA_offset, column 0xf
yann@402
  3278
+	.uleb128 0x9
yann@402
  3279
+	.byte	0x8e	# DW_CFA_offset, column 0xe
yann@402
  3280
+	.uleb128 0xa
yann@402
  3281
+	.byte	0x8d	# DW_CFA_offset, column 0xd
yann@402
  3282
+	.uleb128 0xb
yann@402
  3283
+	.byte	0x8c	# DW_CFA_offset, column 0xc
yann@402
  3284
+	.uleb128 0xc
yann@402
  3285
+	.byte	0x8b	# DW_CFA_offset, column 0xb
yann@402
  3286
+	.uleb128 0xd
yann@402
  3287
+	.byte	0x8a	# DW_CFA_offset, column 0xa
yann@402
  3288
+	.uleb128 0xe
yann@402
  3289
+	.byte	0x89	# DW_CFA_offset, column 0x9
yann@402
  3290
+	.uleb128 0xf
yann@402
  3291
+	.byte	0x88	# DW_CFA_offset, column 0x8
yann@402
  3292
+	.uleb128 0x10
yann@402
  3293
+	.byte	0x87	# DW_CFA_offset, column 0x7
yann@402
  3294
+	.uleb128 0x11
yann@402
  3295
+	.byte	0x86	# DW_CFA_offset, column 0x6
yann@402
  3296
+	.uleb128 0x12
yann@402
  3297
+	.byte	0x4	# DW_CFA_advance_loc4
yann@402
  3298
+	.4byte	.LCFI1-.LCFI0
yann@402
  3299
+	.byte	0xd	# DW_CFA_def_cfa_register
yann@402
  3300
+	.uleb128 0xb
yann@402
  3301
+	.byte	0x4	# DW_CFA_advance_loc4
yann@402
  3302
+	.4byte	.LCFI2-.LCFI1
yann@402
  3303
+	.byte	0xe	# DW_CFA_def_cfa_offset
yann@402
  3304
+	.uleb128 0x90
yann@402
  3305
+	.align	4
yann@402
  3306
+.LEFDE1:
yann@402
  3307
+.LSFDE2:
yann@402
  3308
+	.4byte	.LEFDE2-.LASFDE2	# FDE Length
yann@402
  3309
+.LASFDE2:
yann@402
  3310
+	.4byte	.LASFDE2-.Lframe1	# FDE CIE offset
yann@402
  3311
+	.4byte	.LFB2-.	# FDE initial location
yann@402
  3312
+	.4byte	.LFE2-.LFB2	# FDE address range
yann@402
  3313
+	.uleb128 0x0	# Augmentation size
yann@402
  3314
+	.byte	0x4	# DW_CFA_advance_loc4
yann@402
  3315
+	.4byte	.LCFI10-.LFB2
yann@402
  3316
+	.byte	0x8f	# DW_CFA_offset, column 0xf
yann@402
  3317
+	.uleb128 0x9
yann@402
  3318
+	.byte	0x8e	# DW_CFA_offset, column 0xe
yann@402
  3319
+	.uleb128 0xa
yann@402
  3320
+	.byte	0x8d	# DW_CFA_offset, column 0xd
yann@402
  3321
+	.uleb128 0xb
yann@402
  3322
+	.byte	0x8c	# DW_CFA_offset, column 0xc
yann@402
  3323
+	.uleb128 0xc
yann@402
  3324
+	.byte	0x4	# DW_CFA_advance_loc4
yann@402
  3325
+	.4byte	.LCFI11-.LCFI10
yann@402
  3326
+	.byte	0xe	# DW_CFA_def_cfa_offset
yann@402
  3327
+	.uleb128 0xc0
yann@402
  3328
+	.align	4
yann@402
  3329
+.LEFDE2:
yann@402
  3330
+
yann@402
  3331
+#else
yann@402
  3332
+ 
yann@402
  3333
+.text
yann@402
  3334
+ 
yann@402
  3335
+	# r2:	cif->bytes
yann@402
  3336
+	# r3:	&ecif
yann@402
  3337
+	# r4:	ffi_prep_args
yann@402
  3338
+	# r5:	ret_type
yann@402
  3339
+	# r6:	ecif.rvalue
yann@402
  3340
+	# ov:	fn 
yann@402
  3341
+ 
yann@402
  3342
+	# This assumes we are using gas.
yann@402
  3343
+	.globl	ffi_call_SYSV
yann@402
  3344
+	.type	ffi_call_SYSV,%function
yann@402
  3345
+ffi_call_SYSV:
yann@402
  3346
+.LFB1:
yann@402
  3347
+	stmg	%r6,%r15,48(%r15)		# Save registers
yann@402
  3348
+.LCFI0:
yann@402
  3349
+	larl	%r13,.Lbase			# Set up base register
yann@402
  3350
+	lgr	%r11,%r15			# Set up frame pointer
yann@402
  3351
+.LCFI1:
yann@402
  3352
+	sgr	%r15,%r2
yann@402
  3353
+	aghi	%r15,-160-80			# Allocate stack
yann@402
  3354
+	lgr	%r8,%r6				# Save ecif.rvalue
yann@402
  3355
+	llgc	%r9,.Ltable-.Lbase(%r13,%r5)	# Load epilog address
yann@402
  3356
+	lg	%r7,160(%r11)			# Load function address
yann@402
  3357
+	stg	%r11,0(%r15)			# Set up back chain
yann@402
  3358
+	aghi	%r11,-80			# Register save area
yann@402
  3359
+.LCFI2:
yann@402
  3360
+
yann@402
  3361
+	la	%r2,160(%r15)			# Save area
yann@402
  3362
+						# r3 already holds &ecif
yann@402
  3363
+	basr	%r14,%r4			# Call ffi_prep_args
yann@402
  3364
+
yann@402
  3365
+	lmg	%r2,%r6,0(%r11)			# Load arguments
yann@402
  3366
+	ld	%f0,48(%r11)
yann@402
  3367
+	ld	%f2,56(%r11)
yann@402
  3368
+	ld	%f4,64(%r11)
yann@402
  3369
+	ld	%f6,72(%r11)
yann@402
  3370
+	la	%r14,0(%r13,%r9)		# Set return address
yann@402
  3371
+	br	%r7				# ... and call function
yann@402
  3372
+
yann@402
  3373
+.Lbase:
yann@402
  3374
+.LretNone:					# Return void
yann@402
  3375
+	lg	%r4,80+112(%r11)
yann@402
  3376
+	lmg	%r6,%r15,80+48(%r11)
yann@402
  3377
+	br	%r4
yann@402
  3378
+
yann@402
  3379
+.LretFloat:
yann@402
  3380
+	lg	%r4,80+112(%r11)
yann@402
  3381
+	ste	%f0,0(%r8)			# Return float
yann@402
  3382
+	lmg	%r6,%r15,80+48(%r11)
yann@402
  3383
+	br	%r4
yann@402
  3384
+ 
yann@402
  3385
+.LretDouble:
yann@402
  3386
+	lg	%r4,80+112(%r11)
yann@402
  3387
+	std	%f0,0(%r8)			# Return double
yann@402
  3388
+	lmg	%r6,%r15,80+48(%r11)
yann@402
  3389
+	br	%r4
yann@402
  3390
+
yann@402
  3391
+.LretInt32:
yann@402
  3392
+	lg	%r4,80+112(%r11)
yann@402
  3393
+	st	%r2,0(%r8)			# Return int
yann@402
  3394
+	lmg	%r6,%r15,80+48(%r11)
yann@402
  3395
+	br	%r4
yann@402
  3396
+ 
yann@402
  3397
+.LretInt64:
yann@402
  3398
+	lg	%r4,80+112(%r11)
yann@402
  3399
+	stg	%r2,0(%r8)			# Return long
yann@402
  3400
+	lmg	%r6,%r15,80+48(%r11)
yann@402
  3401
+	br	%r4
yann@402
  3402
+ 
yann@402
  3403
+.Ltable:
yann@402
  3404
+	.byte	.LretNone-.Lbase		# FFI390_RET_VOID
yann@402
  3405
+	.byte	.LretNone-.Lbase		# FFI390_RET_STRUCT
yann@402
  3406
+	.byte	.LretFloat-.Lbase		# FFI390_RET_FLOAT
yann@402
  3407
+	.byte	.LretDouble-.Lbase		# FFI390_RET_DOUBLE
yann@402
  3408
+	.byte	.LretInt32-.Lbase		# FFI390_RET_INT32
yann@402
  3409
+	.byte	.LretInt64-.Lbase		# FFI390_RET_INT64
yann@402
  3410
+
yann@402
  3411
+.LFE1: 
yann@402
  3412
+.ffi_call_SYSV_end:
yann@402
  3413
+	.size	 ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
yann@402
  3414
+
yann@402
  3415
+
yann@402
  3416
+	.globl	ffi_closure_SYSV
yann@402
  3417
+	.type	ffi_closure_SYSV,%function
yann@402
  3418
+ffi_closure_SYSV:
yann@402
  3419
+.LFB2:
yann@402
  3420
+	stmg	%r14,%r15,112(%r15)		# Save registers
yann@402
  3421
+.LCFI10:
yann@402
  3422
+	stmg	%r2,%r6,16(%r15)		# Save arguments
yann@402
  3423
+	std	%f0,128(%r15)
yann@402
  3424
+	std	%f2,136(%r15)
yann@402
  3425
+	std	%f4,144(%r15)
yann@402
  3426
+	std	%f6,152(%r15)
yann@402
  3427
+	lgr	%r1,%r15			# Set up stack frame
yann@402
  3428
+	aghi	%r15,-160
yann@402
  3429
+.LCFI11:
yann@402
  3430
+	lgr	%r2,%r0				# Closure
yann@402
  3431
+	la	%r3,16(%r1)			# GPRs
yann@402
  3432
+	la	%r4,128(%r1)			# FPRs
yann@402
  3433
+	la	%r5,160(%r1)			# Overflow
yann@402
  3434
+	stg	%r1,0(%r15)			# Set up back chain
yann@402
  3435
+
yann@402
  3436
+	brasl	%r14,ffi_closure_helper_SYSV	# Call helper
yann@402
  3437
+
yann@402
  3438
+	lg	%r14,160+112(%r15)
yann@402
  3439
+	ld	%f0,160+128(%r15)		# Load return registers
yann@402
  3440
+	lg	%r2,160+16(%r15)
yann@402
  3441
+	la	%r15,160(%r15)
yann@402
  3442
+	br	%r14
yann@402
  3443
+.LFE2: 
yann@402
  3444
+
yann@402
  3445
+.ffi_closure_SYSV_end:
yann@402
  3446
+	.size	 ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
yann@402
  3447
+
yann@402
  3448
+
yann@402
  3449
+
yann@402
  3450
+	.section	.eh_frame,"a",@progbits
yann@402
  3451
+.Lframe1:
yann@402
  3452
+	.4byte	.LECIE1-.LSCIE1	# Length of Common Information Entry
yann@402
  3453
+.LSCIE1:
yann@402
  3454
+	.4byte	0x0	# CIE Identifier Tag
yann@402
  3455
+	.byte	0x1	# CIE Version
yann@402
  3456
+	.ascii "zR\0"	# CIE Augmentation
yann@402
  3457
+	.uleb128 0x1	# CIE Code Alignment Factor
yann@402
  3458
+	.sleb128 -8	# CIE Data Alignment Factor
yann@402
  3459
+	.byte	0xe	# CIE RA Column
yann@402
  3460
+	.uleb128 0x1	# Augmentation size
yann@402
  3461
+	.byte	0x1b	# FDE Encoding (pcrel sdata4)
yann@402
  3462
+	.byte	0xc	# DW_CFA_def_cfa
yann@402
  3463
+	.uleb128 0xf
yann@402
  3464
+	.uleb128 0xa0
yann@402
  3465
+	.align	8
yann@402
  3466
+.LECIE1:
yann@402
  3467
+.LSFDE1:
yann@402
  3468
+	.4byte	.LEFDE1-.LASFDE1	# FDE Length
yann@402
  3469
+.LASFDE1:
yann@402
  3470
+	.4byte	.LASFDE1-.Lframe1	# FDE CIE offset
yann@402
  3471
+	.4byte	.LFB1-.	# FDE initial location
yann@402
  3472
+	.4byte	.LFE1-.LFB1	# FDE address range
yann@402
  3473
+	.uleb128 0x0	# Augmentation size
yann@402
  3474
+	.byte	0x4	# DW_CFA_advance_loc4
yann@402
  3475
+	.4byte	.LCFI0-.LFB1
yann@402
  3476
+	.byte	0x8f	# DW_CFA_offset, column 0xf
yann@402
  3477
+	.uleb128 0x5
yann@402
  3478
+	.byte	0x8e	# DW_CFA_offset, column 0xe
yann@402
  3479
+	.uleb128 0x6
yann@402
  3480
+	.byte	0x8d	# DW_CFA_offset, column 0xd
yann@402
  3481
+	.uleb128 0x7
yann@402
  3482
+	.byte	0x8c	# DW_CFA_offset, column 0xc
yann@402
  3483
+	.uleb128 0x8
yann@402
  3484
+	.byte	0x8b	# DW_CFA_offset, column 0xb
yann@402
  3485
+	.uleb128 0x9
yann@402
  3486
+	.byte	0x8a	# DW_CFA_offset, column 0xa
yann@402
  3487
+	.uleb128 0xa
yann@402
  3488
+	.byte	0x89	# DW_CFA_offset, column 0x9
yann@402
  3489
+	.uleb128 0xb
yann@402
  3490
+	.byte	0x88	# DW_CFA_offset, column 0x8
yann@402
  3491
+	.uleb128 0xc
yann@402
  3492
+	.byte	0x87	# DW_CFA_offset, column 0x7
yann@402
  3493
+	.uleb128 0xd
yann@402
  3494
+	.byte	0x86	# DW_CFA_offset, column 0x6
yann@402
  3495
+	.uleb128 0xe
yann@402
  3496
+	.byte	0x4	# DW_CFA_advance_loc4
yann@402
  3497
+	.4byte	.LCFI1-.LCFI0
yann@402
  3498
+	.byte	0xd	# DW_CFA_def_cfa_register
yann@402
  3499
+	.uleb128 0xb
yann@402
  3500
+	.byte	0x4	# DW_CFA_advance_loc4
yann@402
  3501
+	.4byte	.LCFI2-.LCFI1
yann@402
  3502
+	.byte	0xe	# DW_CFA_def_cfa_offset
yann@402
  3503
+	.uleb128 0xf0
yann@402
  3504
+	.align	8
yann@402
  3505
+.LEFDE1:
yann@402
  3506
+.LSFDE2:
yann@402
  3507
+	.4byte	.LEFDE2-.LASFDE2	# FDE Length
yann@402
  3508
+.LASFDE2:
yann@402
  3509
+	.4byte	.LASFDE2-.Lframe1	# FDE CIE offset
yann@402
  3510
+	.4byte	.LFB2-.	# FDE initial location
yann@402
  3511
+	.4byte	.LFE2-.LFB2	# FDE address range
yann@402
  3512
+	.uleb128 0x0	# Augmentation size
yann@402
  3513
+	.byte	0x4	# DW_CFA_advance_loc4
yann@402
  3514
+	.4byte	.LCFI10-.LFB2
yann@402
  3515
+	.byte	0x8f	# DW_CFA_offset, column 0xf
yann@402
  3516
+	.uleb128 0x5
yann@402
  3517
+	.byte	0x8e	# DW_CFA_offset, column 0xe
yann@402
  3518
+	.uleb128 0x6
yann@402
  3519
+	.byte	0x4	# DW_CFA_advance_loc4
yann@402
  3520
+	.4byte	.LCFI11-.LCFI10
yann@402
  3521
+	.byte	0xe	# DW_CFA_def_cfa_offset
yann@402
  3522
+	.uleb128 0x140
yann@402
  3523
+	.align	8
yann@402
  3524
+.LEFDE2:
yann@402
  3525
+
yann@402
  3526
+#endif
yann@402
  3527
+
yann@402
  3528
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/ffi.c gcc/libffi/src/sh/ffi.c
yann@402
  3529
--- gcc-3.2.2.orig/libffi/src/sh/ffi.c	Thu Jan  1 09:00:00 1970
yann@402
  3530
+++ gcc/libffi/src/sh/ffi.c	Fri Jul 19 10:08:43 2002
yann@402
  3531
@@ -0,0 +1,722 @@
yann@402
  3532
+/* -----------------------------------------------------------------------
yann@402
  3533
+   ffi.c - Copyright (c) 2002 Kaz Kojima
yann@402
  3534
+   
yann@402
  3535
+   SuperH Foreign Function Interface 
yann@402
  3536
+
yann@402
  3537
+   Permission is hereby granted, free of charge, to any person obtaining
yann@402
  3538
+   a copy of this software and associated documentation files (the
yann@402
  3539
+   ``Software''), to deal in the Software without restriction, including
yann@402
  3540
+   without limitation the rights to use, copy, modify, merge, publish,
yann@402
  3541
+   distribute, sublicense, and/or sell copies of the Software, and to
yann@402
  3542
+   permit persons to whom the Software is furnished to do so, subject to
yann@402
  3543
+   the following conditions:
yann@402
  3544
+
yann@402
  3545
+   The above copyright notice and this permission notice shall be included
yann@402
  3546
+   in all copies or substantial portions of the Software.
yann@402
  3547
+
yann@402
  3548
+   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
yann@402
  3549
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
yann@402
  3550
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
yann@402
  3551
+   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
yann@402
  3552
+   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
yann@402
  3553
+   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
yann@402
  3554
+   OTHER DEALINGS IN THE SOFTWARE.
yann@402
  3555
+   ----------------------------------------------------------------------- */
yann@402
  3556
+
yann@402
  3557
+#include <ffi.h>
yann@402
  3558
+#include <ffi_common.h>
yann@402
  3559
+
yann@402
  3560
+#include <stdlib.h>
yann@402
  3561
+
yann@402
  3562
+#define NGREGARG 4
yann@402
  3563
+#if defined(__SH4__)
yann@402
  3564
+#define NFREGARG 8
yann@402
  3565
+#endif
yann@402
  3566
+
yann@402
  3567
+#if defined(__HITACHI__)
yann@402
  3568
+#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
yann@402
  3569
+#else
yann@402
  3570
+#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
yann@402
  3571
+#endif
yann@402
  3572
+
yann@402
  3573
+/* If the structure has essentialy an unique element, return its type.  */
yann@402
  3574
+static int
yann@402
  3575
+simple_type (ffi_type *arg)
yann@402
  3576
+{
yann@402
  3577
+  if (arg->type != FFI_TYPE_STRUCT)
yann@402
  3578
+    return arg->type;
yann@402
  3579
+  else if (arg->elements[1])
yann@402
  3580
+    return FFI_TYPE_STRUCT;
yann@402
  3581
+
yann@402
  3582
+  return simple_type (arg->elements[0]);
yann@402
  3583
+}
yann@402
  3584
+
yann@402
  3585
+static int
yann@402
  3586
+return_type (ffi_type *arg)
yann@402
  3587
+{
yann@402
  3588
+  unsigned short type;
yann@402
  3589
+
yann@402
  3590
+  if (arg->type != FFI_TYPE_STRUCT)
yann@402
  3591
+    return arg->type;
yann@402
  3592
+
yann@402
  3593
+  type = simple_type (arg->elements[0]);
yann@402
  3594
+  if (! arg->elements[1])
yann@402
  3595
+    {
yann@402
  3596
+      switch (type)
yann@402
  3597
+	{
yann@402
  3598
+	case FFI_TYPE_SINT8:
yann@402
  3599
+	case FFI_TYPE_UINT8:
yann@402
  3600
+	case FFI_TYPE_SINT16:
yann@402
  3601
+	case FFI_TYPE_UINT16:
yann@402
  3602
+	case FFI_TYPE_SINT32:
yann@402
  3603
+	case FFI_TYPE_UINT32:
yann@402
  3604
+	  return FFI_TYPE_INT;
yann@402
  3605
+
yann@402
  3606
+	default:
yann@402
  3607
+	  return type;
yann@402
  3608
+	}
yann@402
  3609
+    }
yann@402
  3610
+
yann@402
  3611
+  /* gcc uses r0/r1 pair for some kind of structures.  */
yann@402
  3612
+  if (arg->size <= 2 * sizeof (int))
yann@402
  3613
+    {
yann@402
  3614
+      int i = 0;
yann@402
  3615
+      ffi_type *e;
yann@402
  3616
+
yann@402
  3617
+      while ((e = arg->elements[i++]))
yann@402
  3618
+	{
yann@402
  3619
+	  type = simple_type (e);
yann@402
  3620
+	  switch (type)
yann@402
  3621
+	    {
yann@402
  3622
+	    case FFI_TYPE_SINT32:
yann@402
  3623
+	    case FFI_TYPE_UINT32:
yann@402
  3624
+	    case FFI_TYPE_INT:
yann@402
  3625
+	    case FFI_TYPE_FLOAT:
yann@402
  3626
+	      return FFI_TYPE_UINT64;
yann@402
  3627
+
yann@402
  3628
+	    default:
yann@402
  3629
+	      break;
yann@402
  3630
+	    }
yann@402
  3631
+	}
yann@402
  3632
+    }
yann@402
  3633
+
yann@402
  3634
+  return FFI_TYPE_STRUCT;
yann@402
  3635
+}
yann@402
  3636
+
yann@402
  3637
+/* ffi_prep_args is called by the assembly routine once stack space
yann@402
  3638
+   has been allocated for the function's arguments */
yann@402
  3639
+
yann@402
  3640
+/*@-exportheader@*/
yann@402
  3641
+void ffi_prep_args(char *stack, extended_cif *ecif)
yann@402
  3642
+/*@=exportheader@*/
yann@402
  3643
+{
yann@402
  3644
+  register unsigned int i;
yann@402
  3645
+  register int tmp;
yann@402
  3646
+  register unsigned int avn;
yann@402
  3647
+  register void **p_argv;
yann@402
  3648
+  register char *argp;
yann@402
  3649
+  register ffi_type **p_arg;
yann@402
  3650
+  int greg, ireg;
yann@402
  3651
+#if defined(__SH4__)
yann@402
  3652
+  int freg = 0;
yann@402
  3653
+#endif
yann@402
  3654
+
yann@402
  3655
+  tmp = 0;
yann@402
  3656
+  argp = stack;
yann@402
  3657
+
yann@402
  3658
+  if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT)
yann@402
  3659
+    {
yann@402
  3660
+      *(void **) argp = ecif->rvalue;
yann@402
  3661
+      argp += 4;
yann@402
  3662
+      ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0;
yann@402
  3663
+    }
yann@402
  3664
+  else
yann@402
  3665
+    ireg = 0;
yann@402
  3666
+
yann@402
  3667
+  /* Set arguments for registers.  */
yann@402
  3668
+  greg = ireg;
yann@402
  3669
+  avn = ecif->cif->nargs;
yann@402
  3670
+  p_argv = ecif->avalue;
yann@402
  3671
+
yann@402
  3672
+  for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
yann@402
  3673
+    {
yann@402
  3674
+      size_t z;
yann@402
  3675
+
yann@402
  3676
+      z = (*p_arg)->size;
yann@402
  3677
+      if (z < sizeof(int))
yann@402
  3678
+	{
yann@402
  3679
+	  if (greg++ >= NGREGARG)
yann@402
  3680
+	    continue;
yann@402
  3681
+
yann@402
  3682
+	  z = sizeof(int);
yann@402
  3683
+	  switch ((*p_arg)->type)
yann@402
  3684
+	    {
yann@402
  3685
+	    case FFI_TYPE_SINT8:
yann@402
  3686
+	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
yann@402
  3687
+	      break;
yann@402
  3688
+  
yann@402
  3689
+	    case FFI_TYPE_UINT8:
yann@402
  3690
+	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
yann@402
  3691
+	      break;
yann@402
  3692
+  
yann@402
  3693
+	    case FFI_TYPE_SINT16:
yann@402
  3694
+	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
yann@402
  3695
+	      break;
yann@402
  3696
+  
yann@402
  3697
+	    case FFI_TYPE_UINT16:
yann@402
  3698
+	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
yann@402
  3699
+	      break;
yann@402
  3700
+  
yann@402
  3701
+	    case FFI_TYPE_STRUCT:
yann@402
  3702
+	      *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
yann@402
  3703
+	      break;
yann@402
  3704
+
yann@402
  3705
+	    default:
yann@402
  3706
+	      FFI_ASSERT(0);
yann@402
  3707
+	    }
yann@402
  3708
+	  argp += z;
yann@402
  3709
+	}
yann@402
  3710
+      else if (z == sizeof(int))
yann@402
  3711
+	{
yann@402
  3712
+#if defined(__SH4__)
yann@402
  3713
+	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
yann@402
  3714
+	    {
yann@402
  3715
+	      if (freg++ >= NFREGARG)
yann@402
  3716
+		continue;
yann@402
  3717
+	    }
yann@402
  3718
+	  else
yann@402
  3719
+#endif
yann@402
  3720
+	    {
yann@402
  3721
+	      if (greg++ >= NGREGARG)
yann@402
  3722
+		continue;
yann@402
  3723
+	    }
yann@402
  3724
+	  *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
yann@402
  3725
+	  argp += z;
yann@402
  3726
+	}
yann@402
  3727
+#if defined(__SH4__)
yann@402
  3728
+      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
yann@402
  3729
+	{
yann@402
  3730
+	  if (freg + 1 >= NFREGARG)
yann@402
  3731
+	    continue;
yann@402
  3732
+	  freg = (freg + 1) & ~1;
yann@402
  3733
+	  freg += 2;
yann@402
  3734
+	  memcpy (argp, *p_argv, z);
yann@402
  3735
+	  argp += z;
yann@402
  3736
+	}
yann@402
  3737
+#endif
yann@402
  3738
+      else
yann@402
  3739
+	{
yann@402
  3740
+	  int n = (z + sizeof (int) - 1) / sizeof (int);
yann@402
  3741
+#if defined(__SH4__)
yann@402
  3742
+	  if (greg + n - 1 >= NGREGARG)
yann@402
  3743
+	    continue;
yann@402
  3744
+	  greg += n;
yann@402
  3745
+#else
yann@402
  3746
+	  if (greg >= NGREGARG)
yann@402
  3747
+	    continue;
yann@402
  3748
+	  else if (greg + n - 1 >= NGREGARG)
yann@402
  3749
+	    greg = NGREGARG;
yann@402
  3750
+	  else
yann@402
  3751
+	    greg += n;
yann@402
  3752
+#endif
yann@402
  3753
+	  memcpy (argp, *p_argv, z);
yann@402
  3754
+	  argp += z;
yann@402
  3755
+	}
yann@402
  3756
+    }
yann@402
  3757
+
yann@402
  3758
+  /* Set arguments on stack.  */
yann@402
  3759
+  greg = ireg;
yann@402
  3760
+#if defined(__SH4__)
yann@402
  3761
+  freg = 0;
yann@402
  3762
+#endif
yann@402
  3763
+  p_argv = ecif->avalue;
yann@402
  3764
+
yann@402
  3765
+  for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
yann@402
  3766
+    {
yann@402
  3767
+      size_t z;
yann@402
  3768
+
yann@402
  3769
+      z = (*p_arg)->size;
yann@402
  3770
+      if (z < sizeof(int))
yann@402
  3771
+	{
yann@402
  3772
+	  if (greg++ < NGREGARG)
yann@402
  3773
+	    continue;
yann@402
  3774
+
yann@402
  3775
+	  z = sizeof(int);
yann@402
  3776
+	  switch ((*p_arg)->type)
yann@402
  3777
+	    {
yann@402
  3778
+	    case FFI_TYPE_SINT8:
yann@402
  3779
+	      *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
yann@402
  3780
+	      break;
yann@402
  3781
+  
yann@402
  3782
+	    case FFI_TYPE_UINT8:
yann@402
  3783
+	      *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
yann@402
  3784
+	      break;
yann@402
  3785
+  
yann@402
  3786
+	    case FFI_TYPE_SINT16:
yann@402
  3787
+	      *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
yann@402
  3788
+	      break;
yann@402
  3789
+  
yann@402
  3790
+	    case FFI_TYPE_UINT16:
yann@402
  3791
+	      *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
yann@402
  3792
+	      break;
yann@402
  3793
+  
yann@402
  3794
+	    case FFI_TYPE_STRUCT:
yann@402
  3795
+	      *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
yann@402
  3796
+	      break;
yann@402
  3797
+
yann@402
  3798
+	    default:
yann@402
  3799
+	      FFI_ASSERT(0);
yann@402
  3800
+	    }
yann@402
  3801
+	  argp += z;
yann@402
  3802
+	}
yann@402
  3803
+      else if (z == sizeof(int))
yann@402
  3804
+	{
yann@402
  3805
+#if defined(__SH4__)
yann@402
  3806
+	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
yann@402
  3807
+	    {
yann@402
  3808
+	      if (freg++ < NFREGARG)
yann@402
  3809
+		continue;
yann@402
  3810
+	    }
yann@402
  3811
+	  else
yann@402
  3812
+#endif
yann@402
  3813
+	    {
yann@402
  3814
+	      if (greg++ < NGREGARG)
yann@402
  3815
+		continue;
yann@402
  3816
+	    }
yann@402
  3817
+	  *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
yann@402
  3818
+	  argp += z;
yann@402
  3819
+	}
yann@402
  3820
+#if defined(__SH4__)
yann@402
  3821
+      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
yann@402
  3822
+	{
yann@402
  3823
+	  if (freg + 1 < NFREGARG)
yann@402
  3824
+	    {
yann@402
  3825
+	      freg = (freg + 1) & ~1;
yann@402
  3826
+	      freg += 2;
yann@402
  3827
+	      continue;
yann@402
  3828
+	    }
yann@402
  3829
+	  memcpy (argp, *p_argv, z);
yann@402
  3830
+	  argp += z;
yann@402
  3831
+	}
yann@402
  3832
+#endif
yann@402
  3833
+      else
yann@402
  3834
+	{
yann@402
  3835
+	  int n = (z + sizeof (int) - 1) / sizeof (int);
yann@402
  3836
+	  if (greg + n - 1 < NGREGARG)
yann@402
  3837
+	    {
yann@402
  3838
+	      greg += n;
yann@402
  3839
+	      continue;
yann@402
  3840
+	    }
yann@402
  3841
+#if (! defined(__SH4__))
yann@402
  3842
+	  else if (greg < NGREGARG)
yann@402
  3843
+	    {
yann@402
  3844
+	      greg = NGREGARG;
yann@402
  3845
+	      continue;
yann@402
  3846
+	    }
yann@402
  3847
+#endif
yann@402
  3848
+	  memcpy (argp, *p_argv, z);
yann@402
  3849
+	  argp += z;
yann@402
  3850
+	}
yann@402
  3851
+    }
yann@402
  3852
+
yann@402
  3853
+  return;
yann@402
  3854
+}
yann@402
  3855
+
yann@402
  3856
+/* Perform machine dependent cif processing */
yann@402
  3857
+ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
yann@402
  3858
+{
yann@402
  3859
+  int i, j;
yann@402
  3860
+  int size, type;
yann@402
  3861
+  int n, m;
yann@402
  3862
+  int greg;
yann@402
  3863
+#if defined(__SH4__)
yann@402
  3864
+  int freg = 0;
yann@402
  3865
+#endif
yann@402
  3866
+
yann@402
  3867
+  cif->flags = 0;
yann@402
  3868
+
yann@402
  3869
+  greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) &&
yann@402
  3870
+	  STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0;
yann@402
  3871
+
yann@402
  3872
+#if defined(__SH4__)
yann@402
  3873
+  for (i = j = 0; i < cif->nargs && j < 12; i++)
yann@402
  3874
+    {
yann@402
  3875
+      type = (cif->arg_types)[i]->type;
yann@402
  3876
+      switch (type)
yann@402
  3877
+	{
yann@402
  3878
+	case FFI_TYPE_FLOAT:
yann@402
  3879
+	  if (freg >= NFREGARG)
yann@402
  3880
+	    continue;
yann@402
  3881
+	  freg++;
yann@402
  3882
+	  cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
yann@402
  3883
+	  j++;
yann@402
  3884
+	  break;
yann@402
  3885
+
yann@402
  3886
+	case FFI_TYPE_DOUBLE:
yann@402
  3887
+	  if ((freg + 1) >= NFREGARG)
yann@402
  3888
+	    continue;
yann@402
  3889
+	  freg = (freg + 1) & ~1;
yann@402
  3890
+	  freg += 2;
yann@402
  3891
+	  cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
yann@402
  3892
+	  j++;
yann@402
  3893
+	  break;
yann@402
  3894
+	      
yann@402
  3895
+	default:
yann@402
  3896
+	  size = (cif->arg_types)[i]->size;
yann@402
  3897
+	  n = (size + sizeof (int) - 1) / sizeof (int);
yann@402
  3898
+	  if (greg + n - 1 >= NGREGARG)
yann@402
  3899
+		continue;
yann@402
  3900
+	  greg += n;
yann@402
  3901
+	  for (m = 0; m < n; m++)
yann@402
  3902
+	    cif->flags += FFI_TYPE_INT << (2 * j++);
yann@402
  3903
+	  break;
yann@402
  3904
+	}
yann@402
  3905
+    }
yann@402
  3906
+#else
yann@402
  3907
+  for (i = j = 0; i < cif->nargs && j < 4; i++)
yann@402
  3908
+    {
yann@402
  3909
+      size = (cif->arg_types)[i]->size;
yann@402
  3910
+      n = (size + sizeof (int) - 1) / sizeof (int);
yann@402
  3911
+      if (greg >= NGREGARG)
yann@402
  3912
+	continue;
yann@402
  3913
+      else if (greg + n - 1 >= NGREGARG)
yann@402
  3914
+	greg = NGREGARG;
yann@402
  3915
+      else
yann@402
  3916
+	greg += n;
yann@402
  3917
+      for (m = 0; m < n; m++)
yann@402
  3918
+        cif->flags += FFI_TYPE_INT << (2 * j++);
yann@402
  3919
+    }
yann@402
  3920
+#endif
yann@402
  3921
+
yann@402
  3922
+  /* Set the return type flag */
yann@402
  3923
+  switch (cif->rtype->type)
yann@402
  3924
+    {
yann@402
  3925
+    case FFI_TYPE_STRUCT:
yann@402
  3926
+      cif->flags += (unsigned) (return_type (cif->rtype)) << 24;
yann@402
  3927
+      break;
yann@402
  3928
+
yann@402
  3929
+    case FFI_TYPE_VOID:
yann@402
  3930
+    case FFI_TYPE_FLOAT:
yann@402
  3931
+    case FFI_TYPE_DOUBLE:
yann@402
  3932
+    case FFI_TYPE_SINT64:
yann@402
  3933
+    case FFI_TYPE_UINT64:
yann@402
  3934
+      cif->flags += (unsigned) cif->rtype->type << 24;
yann@402
  3935
+      break;
yann@402
  3936
+
yann@402
  3937
+    default:
yann@402
  3938
+      cif->flags += FFI_TYPE_INT << 24;
yann@402
  3939
+      break;
yann@402
  3940
+    }
yann@402
  3941
+
yann@402
  3942
+  return FFI_OK;
yann@402
  3943
+}
yann@402
  3944
+
yann@402
  3945
+/*@-declundef@*/
yann@402
  3946
+/*@-exportheader@*/
yann@402
  3947
+extern void ffi_call_SYSV(void (*)(char *, extended_cif *), 
yann@402
  3948
+			  /*@out@*/ extended_cif *, 
yann@402
  3949
+			  unsigned, unsigned, 
yann@402
  3950
+			  /*@out@*/ unsigned *, 
yann@402
  3951
+			  void (*fn)());
yann@402
  3952
+/*@=declundef@*/
yann@402
  3953
+/*@=exportheader@*/
yann@402
  3954
+
yann@402
  3955
+void ffi_call(/*@dependent@*/ ffi_cif *cif, 
yann@402
  3956
+	      void (*fn)(), 
yann@402
  3957
+	      /*@out@*/ void *rvalue, 
yann@402
  3958
+	      /*@dependent@*/ void **avalue)
yann@402
  3959
+{
yann@402
  3960
+  extended_cif ecif;
yann@402
  3961
+
yann@402
  3962
+  ecif.cif = cif;
yann@402
  3963
+  ecif.avalue = avalue;
yann@402
  3964
+  
yann@402
  3965
+  /* If the return value is a struct and we don't have a return	*/
yann@402
  3966
+  /* value address then we need to make one		        */
yann@402
  3967
+
yann@402
  3968
+  if ((rvalue == NULL) && 
yann@402
  3969
+      (cif->rtype->type == FFI_TYPE_STRUCT))
yann@402
  3970
+    {
yann@402
  3971
+      /*@-sysunrecog@*/
yann@402
  3972
+      ecif.rvalue = alloca(cif->rtype->size);
yann@402
  3973
+      /*@=sysunrecog@*/
yann@402
  3974
+    }
yann@402
  3975
+  else
yann@402
  3976
+    ecif.rvalue = rvalue;
yann@402
  3977
+    
yann@402
  3978
+
yann@402
  3979
+  switch (cif->abi) 
yann@402
  3980
+    {
yann@402
  3981
+    case FFI_SYSV:
yann@402
  3982
+      /*@-usedef@*/
yann@402
  3983
+      ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, 
yann@402
  3984
+		    cif->flags, ecif.rvalue, fn);
yann@402
  3985
+      /*@=usedef@*/
yann@402
  3986
+      break;
yann@402
  3987
+    default:
yann@402
  3988
+      FFI_ASSERT(0);
yann@402
  3989
+      break;
yann@402
  3990
+    }
yann@402
  3991
+}
yann@402
  3992
+
yann@402
  3993
+extern void ffi_closure_SYSV (void);
yann@402
  3994
+#if defined(__SH4__)
yann@402
  3995
+extern void __ic_invalidate (void *line);
yann@402
  3996
+#endif
yann@402
  3997
+
yann@402
  3998
+ffi_status
yann@402
  3999
+ffi_prep_closure (ffi_closure* closure,
yann@402
  4000
+		  ffi_cif* cif,
yann@402
  4001
+		  void (*fun)(ffi_cif*, void*, void**, void*),
yann@402
  4002
+		  void *user_data)
yann@402
  4003
+{
yann@402
  4004
+  unsigned int *tramp;
yann@402
  4005
+
yann@402
  4006
+  FFI_ASSERT (cif->abi == FFI_GCC_SYSV);
yann@402
  4007
+
yann@402
  4008
+  tramp = (unsigned int *) &closure->tramp[0];
yann@402
  4009
+#ifdef __LITTLE_ENDIAN__
yann@402
  4010
+  tramp[0] = 0xd301d202;
yann@402
  4011
+  tramp[1] = 0x0009422b;
yann@402
  4012
+#else
yann@402
  4013
+  tramp[0] = 0xd202d301;
yann@402
  4014
+  tramp[1] = 0x422b0009;
yann@402
  4015
+#endif
yann@402
  4016
+  *(void **) &tramp[2] = (void *)closure;          /* ctx */
yann@402
  4017
+  *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */
yann@402
  4018
+
yann@402
  4019
+  closure->cif = cif;
yann@402
  4020
+  closure->fun = fun;
yann@402
  4021
+  closure->user_data = user_data;
yann@402
  4022
+
yann@402
  4023
+#if defined(__SH4__)
yann@402
  4024
+  /* Flush the icache.  */
yann@402
  4025
+  __ic_invalidate(&closure->tramp[0]);
yann@402
  4026
+#endif
yann@402
  4027
+
yann@402
  4028
+  return FFI_OK;
yann@402
  4029
+}
yann@402
  4030
+
yann@402
  4031
+/* Basically the trampoline invokes ffi_closure_SYSV, and on 
yann@402
  4032
+ * entry, r3 holds the address of the closure.
yann@402
  4033
+ * After storing the registers that could possibly contain
yann@402
  4034
+ * parameters to be passed into the stack frame and setting
yann@402
  4035
+ * up space for a return value, ffi_closure_SYSV invokes the 
yann@402
  4036
+ * following helper function to do most of the work.
yann@402
  4037
+ */
yann@402
  4038
+
yann@402
  4039
+#ifdef __LITTLE_ENDIAN__
yann@402
  4040
+#define OFS_INT8	0
yann@402
  4041
+#define OFS_INT16	2
yann@402
  4042
+#else
yann@402
  4043
+#define OFS_INT8	3
yann@402
  4044
+#define OFS_INT16	2
yann@402
  4045
+#endif
yann@402
  4046
+
yann@402
  4047
+int
yann@402
  4048
+ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, 
yann@402
  4049
+			 unsigned long *pgr, unsigned long *pfr, 
yann@402
  4050
+			 unsigned long *pst)
yann@402
  4051
+{
yann@402
  4052
+  void **avalue;
yann@402
  4053
+  ffi_type **p_arg;
yann@402
  4054
+  int i, avn;
yann@402
  4055
+  int ireg, greg = 0;
yann@402
  4056
+#if defined(__SH4__)
yann@402
  4057
+  int freg = 0;
yann@402
  4058
+#endif
yann@402
  4059
+  ffi_cif *cif; 
yann@402
  4060
+  double temp; 
yann@402
  4061
+
yann@402
  4062
+  cif = closure->cif;
yann@402
  4063
+  avalue = alloca(cif->nargs * sizeof(void *));
yann@402
  4064
+
yann@402
  4065
+  /* Copy the caller's structure return value address so that the closure
yann@402
  4066
+     returns the data directly to the caller.  */
yann@402
  4067
+  if (cif->rtype->type == FFI_TYPE_STRUCT)
yann@402
  4068
+    {
yann@402
  4069
+      rvalue = *pgr++;
yann@402
  4070
+      ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0;
yann@402
  4071
+    }
yann@402
  4072
+  else
yann@402
  4073
+    ireg = 0;
yann@402
  4074
+
yann@402
  4075
+  cif = closure->cif;
yann@402
  4076
+  greg = ireg;
yann@402
  4077
+  avn = cif->nargs;
yann@402
  4078
+
yann@402
  4079
+  /* Grab the addresses of the arguments from the stack frame.  */
yann@402
  4080
+  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
yann@402
  4081
+    {
yann@402
  4082
+      size_t z;
yann@402
  4083
+
yann@402
  4084
+      z = (*p_arg)->size;
yann@402
  4085
+      if (z < sizeof(int))
yann@402
  4086
+	{
yann@402
  4087
+	  if (greg++ >= NGREGARG)
yann@402
  4088
+	    continue;
yann@402
  4089
+
yann@402
  4090
+	  z = sizeof(int);
yann@402
  4091
+	  switch ((*p_arg)->type)
yann@402
  4092
+	    {
yann@402
  4093
+	    case FFI_TYPE_SINT8:
yann@402
  4094
+	    case FFI_TYPE_UINT8:
yann@402
  4095
+	      avalue[i] = (((char *)pgr) + OFS_INT8);
yann@402
  4096
+	      break;
yann@402
  4097
+  
yann@402
  4098
+	    case FFI_TYPE_SINT16:
yann@402
  4099
+	    case FFI_TYPE_UINT16:
yann@402
  4100
+	      avalue[i] = (((char *)pgr) + OFS_INT16);
yann@402
  4101
+	      break;
yann@402
  4102
+  
yann@402
  4103
+	    case FFI_TYPE_STRUCT:
yann@402
  4104
+	      avalue[i] = pgr;
yann@402
  4105
+	      break;
yann@402
  4106
+
yann@402
  4107
+	    default:
yann@402
  4108
+	      FFI_ASSERT(0);
yann@402
  4109
+	    }
yann@402
  4110
+	  pgr++;
yann@402
  4111
+	}
yann@402
  4112
+      else if (z == sizeof(int))
yann@402
  4113
+	{
yann@402
  4114
+#if defined(__SH4__)
yann@402
  4115
+	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
yann@402
  4116
+	    {
yann@402
  4117
+	      if (freg++ >= NFREGARG)
yann@402
  4118
+		continue;
yann@402
  4119
+	      avalue[i] = pfr;
yann@402
  4120
+	      pfr++;
yann@402
  4121
+	    }
yann@402
  4122
+	  else
yann@402
  4123
+#endif
yann@402
  4124
+	    {
yann@402
  4125
+	      if (greg++ >= NGREGARG)
yann@402
  4126
+		continue;
yann@402
  4127
+	      avalue[i] = pgr;
yann@402
  4128
+	      pgr++;
yann@402
  4129
+	    }
yann@402
  4130
+	}
yann@402
  4131
+#if defined(__SH4__)
yann@402
  4132
+      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
yann@402
  4133
+	{
yann@402
  4134
+	  if (freg + 1 >= NFREGARG)
yann@402
  4135
+	    continue;
yann@402
  4136
+	  freg = (freg + 1) & ~1;
yann@402
  4137
+	  freg += 2;
yann@402
  4138
+	  avalue[i] = pfr;
yann@402
  4139
+	  pfr += 2;
yann@402
  4140
+	}
yann@402
  4141
+#endif
yann@402
  4142
+      else
yann@402
  4143
+	{
yann@402
  4144
+	  int n = (z + sizeof (int) - 1) / sizeof (int);
yann@402
  4145
+#if defined(__SH4__)
yann@402
  4146
+	  if (greg + n - 1 >= NGREGARG)
yann@402
  4147
+	    continue;
yann@402
  4148
+	  greg += n;
yann@402
  4149
+#else
yann@402
  4150
+	  if (greg >= NGREGARG)
yann@402
  4151
+	    continue;
yann@402
  4152
+	  else if (greg + n - 1 >= NGREGARG)
yann@402
  4153
+	    greg = NGREGARG;
yann@402
  4154
+	  else
yann@402
  4155
+	    greg += n;
yann@402
  4156
+#endif
yann@402
  4157
+	  avalue[i] = pgr;
yann@402
  4158
+	  pgr += n;
yann@402
  4159
+	}
yann@402
  4160
+    }
yann@402
  4161
+
yann@402
  4162
+  greg = ireg;
yann@402
  4163
+#if defined(__SH4__)
yann@402
  4164
+  freg = 0;
yann@402
  4165
+#endif
yann@402
  4166
+
yann@402
  4167
+  for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
yann@402
  4168
+    {
yann@402
  4169
+      size_t z;
yann@402
  4170
+
yann@402
  4171
+      z = (*p_arg)->size;
yann@402
  4172
+      if (z < sizeof(int))
yann@402
  4173
+	{
yann@402
  4174
+	  if (greg++ < NGREGARG)
yann@402
  4175
+	    continue;
yann@402
  4176
+
yann@402
  4177
+	  z = sizeof(int);
yann@402
  4178
+	  switch ((*p_arg)->type)
yann@402
  4179
+	    {
yann@402
  4180
+	    case FFI_TYPE_SINT8:
yann@402
  4181
+	    case FFI_TYPE_UINT8:
yann@402
  4182
+	      avalue[i] = (((char *)pst) + OFS_INT8);
yann@402
  4183
+	      break;
yann@402
  4184
+  
yann@402
  4185
+	    case FFI_TYPE_SINT16:
yann@402
  4186
+	    case FFI_TYPE_UINT16:
yann@402
  4187
+	      avalue[i] = (((char *)pst) + OFS_INT16);
yann@402
  4188
+	      break;
yann@402
  4189
+  
yann@402
  4190
+	    case FFI_TYPE_STRUCT:
yann@402
  4191
+	      avalue[i] = pst;
yann@402
  4192
+	      break;
yann@402
  4193
+
yann@402
  4194
+	    default:
yann@402
  4195
+	      FFI_ASSERT(0);
yann@402
  4196
+	    }
yann@402
  4197
+	  pst++;
yann@402
  4198
+	}
yann@402
  4199
+      else if (z == sizeof(int))
yann@402
  4200
+	{
yann@402
  4201
+#if defined(__SH4__)
yann@402
  4202
+	  if ((*p_arg)->type == FFI_TYPE_FLOAT)
yann@402
  4203
+	    {
yann@402
  4204
+	      if (freg++ < NFREGARG)
yann@402
  4205
+		continue;
yann@402
  4206
+	    }
yann@402
  4207
+	  else
yann@402
  4208
+#endif
yann@402
  4209
+	    {
yann@402
  4210
+	      if (greg++ < NGREGARG)
yann@402
  4211
+		continue;
yann@402
  4212
+	    }
yann@402
  4213
+	  avalue[i] = pst;
yann@402
  4214
+	  pst++;
yann@402
  4215
+	}
yann@402
  4216
+#if defined(__SH4__)
yann@402
  4217
+      else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
yann@402
  4218
+	{
yann@402
  4219
+	  if (freg + 1 < NFREGARG)
yann@402
  4220
+	    {
yann@402
  4221
+	      freg = (freg + 1) & ~1;
yann@402
  4222
+	      freg += 2;
yann@402
  4223
+	      continue;
yann@402
  4224
+	    }
yann@402
  4225
+	  avalue[i] = pst;
yann@402
  4226
+	  pst += 2;
yann@402
  4227
+	}
yann@402
  4228
+#endif
yann@402
  4229
+      else
yann@402
  4230
+	{
yann@402
  4231
+	  int n = (z + sizeof (int) - 1) / sizeof (int);
yann@402
  4232
+	  if (greg + n - 1 < NGREGARG)
yann@402
  4233
+	    {
yann@402
  4234
+	      greg += n;
yann@402
  4235
+	      continue;
yann@402
  4236
+	    }
yann@402
  4237
+#if (! defined(__SH4__))
yann@402
  4238
+	  else if (greg < NGREGARG)
yann@402
  4239
+	    {
yann@402
  4240
+	      greg = NGREGARG;
yann@402
  4241
+	      continue;
yann@402
  4242
+	    }
yann@402
  4243
+#endif
yann@402
  4244
+	  avalue[i] = pst;
yann@402
  4245
+	  pst += n;
yann@402
  4246
+	}
yann@402
  4247
+    }
yann@402
  4248
+
yann@402
  4249
+  (closure->fun) (cif, rvalue, avalue, closure->user_data);
yann@402
  4250
+
yann@402
  4251
+  /* Tell ffi_closure_osf how to perform return type promotions.  */
yann@402
  4252
+  return cif->rtype->type;
yann@402
  4253
+}
yann@402
  4254
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/sysv.S gcc/libffi/src/sh/sysv.S
yann@402
  4255
--- gcc-3.2.2.orig/libffi/src/sh/sysv.S	Thu Jan  1 09:00:00 1970
yann@402
  4256
+++ gcc/libffi/src/sh/sysv.S	Tue Dec 17 03:22:48 2002
yann@402
  4257
@@ -0,0 +1,773 @@
yann@402
  4258
+/* -----------------------------------------------------------------------
yann@402
  4259
+   sysv.S - Copyright (c) 2002 Kaz Kojima
yann@402
  4260
+   
yann@402
  4261
+   SuperH Foreign Function Interface 
yann@402
  4262
+
yann@402
  4263
+   Permission is hereby granted, free of charge, to any person obtaining
yann@402
  4264
+   a copy of this software and associated documentation files (the
yann@402
  4265
+   ``Software''), to deal in the Software without restriction, including
yann@402
  4266
+   without limitation the rights to use, copy, modify, merge, publish,
yann@402
  4267
+   distribute, sublicense, and/or sell copies of the Software, and to
yann@402
  4268
+   permit persons to whom the Software is furnished to do so, subject to
yann@402
  4269
+   the following conditions:
yann@402
  4270
+
yann@402
  4271
+   The above copyright notice and this permission notice shall be included
yann@402
  4272
+   in all copies or substantial portions of the Software.
yann@402
  4273
+
yann@402
  4274
+   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
yann@402
  4275
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
yann@402
  4276
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
yann@402
  4277
+   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
yann@402
  4278
+   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
yann@402
  4279
+   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
yann@402
  4280
+   OTHER DEALINGS IN THE SOFTWARE.
yann@402
  4281
+   ----------------------------------------------------------------------- */
yann@402
  4282
+
yann@402
  4283
+#define LIBFFI_ASM	
yann@402
  4284
+#include <ffi.h>
yann@402
  4285
+#ifdef HAVE_MACHINE_ASM_H
yann@402
  4286
+#include <machine/asm.h>
yann@402
  4287
+#else
yann@402
  4288
+/* XXX these lose for some platforms, I'm sure. */
yann@402
  4289
+#define CNAME(x) x
yann@402
  4290
+#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
yann@402
  4291
+#endif
yann@402
  4292
+
yann@402
  4293
+#if defined(__HITACHI__)
yann@402
  4294
+#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
yann@402
  4295
+#else
yann@402
  4296
+#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
yann@402
  4297
+#endif
yann@402
  4298
+
yann@402
  4299
+.text
yann@402
  4300
+
yann@402
  4301
+	# r4:	ffi_prep_args
yann@402
  4302
+	# r5:	&ecif
yann@402
  4303
+	# r6:	bytes
yann@402
  4304
+	# r7:	flags
yann@402
  4305
+	# sp+0: rvalue
yann@402
  4306
+	# sp+4: fn
yann@402
  4307
+
yann@402
  4308
+	# This assumes we are using gas.
yann@402
  4309
+ENTRY(ffi_call_SYSV)
yann@402
  4310
+	# Save registers
yann@402
  4311
+.LFB1:
yann@402
  4312
+	mov.l	r8,@-r15
yann@402
  4313
+.LCFI0:
yann@402
  4314
+	mov.l	r9,@-r15
yann@402
  4315
+.LCFI1:
yann@402
  4316
+	mov.l	r10,@-r15
yann@402
  4317
+.LCFI2:
yann@402
  4318
+	mov.l	r12,@-r15
yann@402
  4319
+.LCFI3:
yann@402
  4320
+	mov.l	r14,@-r15
yann@402
  4321
+.LCFI4:
yann@402
  4322
+	sts.l	pr,@-r15
yann@402
  4323
+.LCFI5:
yann@402
  4324
+	mov	r15,r14
yann@402
  4325
+.LCFI6:
yann@402
  4326
+#if defined(__SH4__)
yann@402
  4327
+	mov	r6,r8
yann@402
  4328
+	mov	r7,r9
yann@402
  4329
+
yann@402
  4330
+	sub	r6,r15
yann@402
  4331
+	add	#-16,r15
yann@402
  4332
+	mov	#~7,r0
yann@402
  4333
+	and	r0,r15
yann@402
  4334
+
yann@402
  4335
+	mov	r4,r0
yann@402
  4336
+	jsr	@r0
yann@402
  4337
+	 mov	r15,r4
yann@402
  4338
+
yann@402
  4339
+	mov	r9,r1
yann@402
  4340
+	shlr8	r9
yann@402
  4341
+	shlr8	r9
yann@402
  4342
+	shlr8	r9
yann@402
  4343
+
yann@402
  4344
+	mov	#FFI_TYPE_STRUCT,r2
yann@402
  4345
+	cmp/eq	r2,r9
yann@402
  4346
+	bf	1f
yann@402
  4347
+#if STRUCT_VALUE_ADDRESS_WITH_ARG
yann@402
  4348
+ 	mov.l	@r15+,r4
yann@402
  4349
+	bra	2f
yann@402
  4350
+	 mov	#5,r2
yann@402
  4351
+#else
yann@402
  4352
+ 	mov.l	@r15+,r10
yann@402
  4353
+#endif
yann@402
  4354
+1:
yann@402
  4355
+	mov	#4,r2
yann@402
  4356
+2:
yann@402
  4357
+	mov	#4,r3
yann@402
  4358
+
yann@402
  4359
+L_pass:
yann@402
  4360
+	cmp/pl	r8
yann@402
  4361
+	bf	L_call_it
yann@402
  4362
+
yann@402
  4363
+	mov	r1,r0
yann@402
  4364
+	and	#3,r0
yann@402
  4365
+
yann@402
  4366
+L_pass_d:
yann@402
  4367
+	cmp/eq	#FFI_TYPE_DOUBLE,r0
yann@402
  4368
+	bf	L_pass_f
yann@402
  4369
+
yann@402
  4370
+	mov	r3,r0
yann@402
  4371
+	and	#1,r0
yann@402
  4372
+	tst	r0,r0
yann@402
  4373
+	bt	1f
yann@402
  4374
+	add	#1,r3
yann@402
  4375
+1:
yann@402
  4376
+	mov	r15,r0
yann@402
  4377
+	and	#7,r0
yann@402
  4378
+	tst	r0,r0
yann@402
  4379
+	bt	2f
yann@402
  4380
+	add	#4,r15
yann@402
  4381
+2:
yann@402
  4382
+	mov	#12,r0
yann@402
  4383
+	cmp/hs	r0,r3
yann@402
  4384
+	bt/s	3f
yann@402
  4385
+	 shlr2	r1
yann@402
  4386
+	bsr	L_pop_d
yann@402
  4387
+	 nop
yann@402
  4388
+3:
yann@402
  4389
+	add	#2,r3
yann@402
  4390
+	bra	L_pass
yann@402
  4391
+	 add	#-8,r8
yann@402
  4392
+
yann@402
  4393
+L_pop_d:
yann@402
  4394
+	mov	r3,r0
yann@402
  4395
+	add	r0,r0
yann@402
  4396
+	add	r3,r0
yann@402
  4397
+	add	#-12,r0
yann@402
  4398
+	braf	r0
yann@402
  4399
+	 nop
yann@402
  4400
+#ifdef __LITTLE_ENDIAN__
yann@402
  4401
+	fmov.s	@r15+,fr5
yann@402
  4402
+	rts
yann@402
  4403
+	 fmov.s	@r15+,fr4
yann@402
  4404
+	fmov.s	@r15+,fr7
yann@402
  4405
+	rts
yann@402
  4406
+	 fmov.s	@r15+,fr6
yann@402
  4407
+	fmov.s	@r15+,fr9
yann@402
  4408
+	rts
yann@402
  4409
+	 fmov.s	@r15+,fr8
yann@402
  4410
+	fmov.s	@r15+,fr11
yann@402
  4411
+	rts
yann@402
  4412
+	 fmov.s	@r15+,fr10
yann@402
  4413
+#else
yann@402
  4414
+	fmov.s	@r15+,fr4
yann@402
  4415
+	rts
yann@402
  4416
+	 fmov.s	@r15+,fr5
yann@402
  4417
+	fmov.s	@r15+,fr6
yann@402
  4418
+	rts
yann@402
  4419
+	 fmov.s	@r15+,fr7
yann@402
  4420
+	fmov.s	@r15+,fr8
yann@402
  4421
+	rts
yann@402
  4422
+	 fmov.s	@r15+,fr9
yann@402
  4423
+	fmov.s	@r15+,fr10
yann@402
  4424
+	rts
yann@402
  4425
+	 fmov.s	@r15+,fr11
yann@402
  4426
+#endif
yann@402
  4427
+
yann@402
  4428
+L_pass_f:
yann@402
  4429
+	cmp/eq	#FFI_TYPE_FLOAT,r0
yann@402
  4430
+	bf	L_pass_i
yann@402
  4431
+
yann@402
  4432
+	mov	#12,r0
yann@402
  4433
+	cmp/hs	r0,r3
yann@402
  4434
+	bt/s	2f
yann@402
  4435
+	 shlr2	r1
yann@402
  4436
+	bsr	L_pop_f
yann@402
  4437
+	 nop
yann@402
  4438
+2:
yann@402
  4439
+	add	#1,r3
yann@402
  4440
+	bra	L_pass
yann@402
  4441
+	 add	#-4,r8
yann@402
  4442
+
yann@402
  4443
+L_pop_f:
yann@402
  4444
+	mov	r3,r0
yann@402
  4445
+	shll2	r0
yann@402
  4446
+	add	#-16,r0
yann@402
  4447
+	braf	r0
yann@402
  4448
+	 nop
yann@402
  4449
+#ifdef __LITTLE_ENDIAN__
yann@402
  4450
+	rts
yann@402
  4451
+	 fmov.s	@r15+,fr5
yann@402
  4452
+	rts
yann@402
  4453
+	 fmov.s	@r15+,fr4
yann@402
  4454
+	rts
yann@402
  4455
+	 fmov.s	@r15+,fr7
yann@402
  4456
+	rts
yann@402
  4457
+	 fmov.s	@r15+,fr6
yann@402
  4458
+	rts
yann@402
  4459
+	 fmov.s	@r15+,fr9
yann@402
  4460
+	rts
yann@402
  4461
+	 fmov.s	@r15+,fr8
yann@402
  4462
+	rts
yann@402
  4463
+	 fmov.s	@r15+,fr11
yann@402
  4464
+	rts
yann@402
  4465
+	 fmov.s	@r15+,fr10
yann@402
  4466
+#else
yann@402
  4467
+	rts
yann@402
  4468
+	 fmov.s	@r15+,fr4
yann@402
  4469
+	rts
yann@402
  4470
+	 fmov.s	@r15+,fr5
yann@402
  4471
+	rts
yann@402
  4472
+	 fmov.s	@r15+,fr6
yann@402
  4473
+	rts
yann@402
  4474
+	 fmov.s	@r15+,fr7
yann@402
  4475
+	rts
yann@402
  4476
+	 fmov.s	@r15+,fr8
yann@402
  4477
+	rts
yann@402
  4478
+	 fmov.s	@r15+,fr9
yann@402
  4479
+	rts
yann@402
  4480
+	 fmov.s	@r15+,fr10
yann@402
  4481
+	rts
yann@402
  4482
+	 fmov.s	@r15+,fr11
yann@402
  4483
+#endif
yann@402
  4484
+
yann@402
  4485
+L_pass_i:
yann@402
  4486
+	cmp/eq	#FFI_TYPE_INT,r0
yann@402
  4487
+	bf	L_call_it
yann@402
  4488
+
yann@402
  4489
+	mov	#8,r0
yann@402
  4490
+	cmp/hs	r0,r2
yann@402
  4491
+	bt/s	2f
yann@402
  4492
+	 shlr2	r1
yann@402
  4493
+	bsr	L_pop_i
yann@402
  4494
+	 nop
yann@402
  4495
+2:
yann@402
  4496
+	add	#1,r2
yann@402
  4497
+	bra	L_pass
yann@402
  4498
+	 add	#-4,r8
yann@402
  4499
+
yann@402
  4500
+L_pop_i:
yann@402
  4501
+	mov	r2,r0
yann@402
  4502
+	shll2	r0
yann@402
  4503
+	add	#-16,r0
yann@402
  4504
+	braf	r0
yann@402
  4505
+	 nop
yann@402
  4506
+	rts
yann@402
  4507
+	 mov.l	@r15+,r4
yann@402
  4508
+	rts
yann@402
  4509
+	 mov.l	@r15+,r5
yann@402
  4510
+	rts
yann@402
  4511
+	 mov.l	@r15+,r6
yann@402
  4512
+	rts
yann@402
  4513
+	 mov.l	@r15+,r7
yann@402
  4514
+
yann@402
  4515
+L_call_it:
yann@402
  4516
+	# call function
yann@402
  4517
+#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
yann@402
  4518
+	mov	r10, r2
yann@402
  4519
+#endif
yann@402
  4520
+	mov.l  @(28,r14),r1
yann@402
  4521
+	jsr    @r1
yann@402
  4522
+	 nop
yann@402
  4523
+
yann@402
  4524
+L_ret_d:
yann@402
  4525
+	mov	#FFI_TYPE_DOUBLE,r2
yann@402
  4526
+	cmp/eq	r2,r9
yann@402
  4527
+	bf	L_ret_ll
yann@402
  4528
+
yann@402
  4529
+	mov.l	@(24,r14),r1
yann@402
  4530
+#ifdef __LITTLE_ENDIAN__
yann@402
  4531
+	fmov.s	fr1,@r1
yann@402
  4532
+	add	#4,r1
yann@402
  4533
+	bra	L_epilogue
yann@402
  4534
+	 fmov.s	fr0,@r1
yann@402
  4535
+#else
yann@402
  4536
+	fmov.s	fr0,@r1
yann@402
  4537
+	add	#4,r1
yann@402
  4538
+	bra	L_epilogue
yann@402
  4539
+	 fmov.s	fr1,@r1
yann@402
  4540
+#endif
yann@402
  4541
+
yann@402
  4542
+L_ret_ll:
yann@402
  4543
+	mov	#FFI_TYPE_SINT64,r2
yann@402
  4544
+	cmp/eq	r2,r9
yann@402
  4545
+	bt/s	1f
yann@402
  4546
+	 mov	#FFI_TYPE_UINT64,r2
yann@402
  4547
+	cmp/eq	r2,r9
yann@402
  4548
+	bf	L_ret_f
yann@402
  4549
+
yann@402
  4550
+1:
yann@402
  4551
+	mov.l	@(24,r14),r2
yann@402
  4552
+	mov.l	r0,@r2
yann@402
  4553
+	bra	L_epilogue
yann@402
  4554
+	 mov.l	r1,@(4,r2)
yann@402
  4555
+
yann@402
  4556
+L_ret_f:
yann@402
  4557
+	mov	#FFI_TYPE_FLOAT,r2
yann@402
  4558
+	cmp/eq	r2,r9
yann@402
  4559
+	bf	L_ret_i
yann@402
  4560
+
yann@402
  4561
+	mov.l	@(24,r14),r1
yann@402
  4562
+	bra	L_epilogue
yann@402
  4563
+	 fmov.s	fr0,@r1
yann@402
  4564
+
yann@402
  4565
+L_ret_i:
yann@402
  4566
+	mov	#FFI_TYPE_INT,r2
yann@402
  4567
+	cmp/eq	r2,r9
yann@402
  4568
+	bf	L_epilogue
yann@402
  4569
+
yann@402
  4570
+	mov.l	@(24,r14),r1
yann@402
  4571
+	bra	L_epilogue
yann@402
  4572
+	 mov.l	r0,@r1
yann@402
  4573
+
yann@402
  4574
+L_epilogue:
yann@402
  4575
+	# Remove the space we pushed for the args
yann@402
  4576
+	mov   r14,r15
yann@402
  4577
+
yann@402
  4578
+	lds.l  @r15+,pr
yann@402
  4579
+	mov.l  @r15+,r14
yann@402
  4580
+	mov.l  @r15+,r12
yann@402
  4581
+	mov.l  @r15+,r10
yann@402
  4582
+	mov.l  @r15+,r9
yann@402
  4583
+	rts
yann@402
  4584
+	 mov.l  @r15+,r8
yann@402
  4585
+#else
yann@402
  4586
+	mov	r6,r8
yann@402
  4587
+	mov	r7,r9
yann@402
  4588
+
yann@402
  4589
+	sub	r6,r15
yann@402
  4590
+	add	#-16,r15
yann@402
  4591
+	mov	#~7,r0
yann@402
  4592
+	and	r0,r15
yann@402
  4593
+
yann@402
  4594
+	mov	r4,r0
yann@402
  4595
+	jsr	@r0
yann@402
  4596
+	 mov	r15,r4
yann@402
  4597
+
yann@402
  4598
+	mov	r9,r3
yann@402
  4599
+	shlr8	r9
yann@402
  4600
+	shlr8	r9
yann@402
  4601
+	shlr8	r9
yann@402
  4602
+
yann@402
  4603
+	mov	#FFI_TYPE_STRUCT,r2
yann@402
  4604
+	cmp/eq	r2,r9
yann@402
  4605
+	bf	1f
yann@402
  4606
+#if STRUCT_VALUE_ADDRESS_WITH_ARG
yann@402
  4607
+	mov.l	@r15+,r4
yann@402
  4608
+	bra	2f
yann@402
  4609
+	 mov	#5,r2
yann@402
  4610
+#else
yann@402
  4611
+	mov.l	@r15+,r10
yann@402
  4612
+#endif
yann@402
  4613
+1:
yann@402
  4614
+	mov	#4,r2
yann@402
  4615
+2:
yann@402
  4616
+
yann@402
  4617
+L_pass:
yann@402
  4618
+	cmp/pl	r8
yann@402
  4619
+	bf	L_call_it
yann@402
  4620
+
yann@402
  4621
+	mov	r3,r0
yann@402
  4622
+	and	#3,r0
yann@402
  4623
+
yann@402
  4624
+L_pass_d:
yann@402
  4625
+	cmp/eq	#FFI_TYPE_DOUBLE,r0
yann@402
  4626
+	bf	L_pass_i
yann@402
  4627
+
yann@402
  4628
+	mov	r15,r0
yann@402
  4629
+	and	#7,r0
yann@402
  4630
+	tst	r0,r0
yann@402
  4631
+	bt	1f
yann@402
  4632
+	add	#4,r15
yann@402
  4633
+1:
yann@402
  4634
+	mov	#8,r0
yann@402
  4635
+	cmp/hs	r0,r2
yann@402
  4636
+	bt/s	2f
yann@402
  4637
+	 shlr2	r3
yann@402
  4638
+	bsr	L_pop_d
yann@402
  4639
+	 nop
yann@402
  4640
+2:
yann@402
  4641
+	add	#2,r2
yann@402
  4642
+	bra	L_pass
yann@402
  4643
+	 add	#-8,r8
yann@402
  4644
+
yann@402
  4645
+L_pop_d:
yann@402
  4646
+	mov	r2,r0
yann@402
  4647
+	add	r0,r0
yann@402
  4648
+	add	r2,r0
yann@402
  4649
+	add	#-12,r0
yann@402
  4650
+	add	r0,r0
yann@402
  4651
+	braf	r0
yann@402
  4652
+	 nop
yann@402
  4653
+	mov.l	@r15+,r4
yann@402
  4654
+	rts
yann@402
  4655
+	 mov.l	@r15+,r5
yann@402
  4656
+	mov.l	@r15+,r5
yann@402
  4657
+	rts
yann@402
  4658
+	 mov.l	@r15+,r6
yann@402
  4659
+	mov.l	@r15+,r6
yann@402
  4660
+	rts
yann@402
  4661
+	 mov.l	@r15+,r7
yann@402
  4662
+	rts
yann@402
  4663
+	 mov.l	@r15+,r7
yann@402
  4664
+
yann@402
  4665
+L_pass_i:
yann@402
  4666
+	mov	#8,r0
yann@402
  4667
+	cmp/hs	r0,r2
yann@402
  4668
+	bt/s	2f
yann@402
  4669
+	 shlr2	r3
yann@402
  4670
+	bsr	L_pop_i
yann@402
  4671
+	 nop
yann@402
  4672
+2:
yann@402
  4673
+	add	#1,r2
yann@402
  4674
+	bra	L_pass
yann@402
  4675
+	 add	#-4,r8
yann@402
  4676
+
yann@402
  4677
+L_pop_i:
yann@402
  4678
+	mov	r2,r0
yann@402
  4679
+	shll2	r0
yann@402
  4680
+	add	#-16,r0
yann@402
  4681
+	braf	r0
yann@402
  4682
+	 nop
yann@402
  4683
+	rts
yann@402
  4684
+	 mov.l	@r15+,r4
yann@402
  4685
+	rts
yann@402
  4686
+	 mov.l	@r15+,r5
yann@402
  4687
+	rts
yann@402
  4688
+	 mov.l	@r15+,r6
yann@402
  4689
+	rts
yann@402
  4690
+	 mov.l	@r15+,r7
yann@402
  4691
+
yann@402
  4692
+L_call_it:
yann@402
  4693
+	# call function
yann@402
  4694
+#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
yann@402
  4695
+	mov	r10, r2
yann@402
  4696
+#endif
yann@402
  4697
+	mov.l  @(28,r14),r1
yann@402
  4698
+	jsr    @r1
yann@402
  4699
+	 nop
yann@402
  4700
+
yann@402
  4701
+L_ret_d:
yann@402
  4702
+	mov	#FFI_TYPE_DOUBLE,r2
yann@402
  4703
+	cmp/eq	r2,r9
yann@402
  4704
+	bf	L_ret_ll
yann@402
  4705
+
yann@402
  4706
+	mov.l	@(24,r14),r2
yann@402
  4707
+	mov.l	r0,@r2
yann@402
  4708
+	bra	L_epilogue
yann@402
  4709
+	 mov.l	r1,@(4,r2)
yann@402
  4710
+
yann@402
  4711
+L_ret_ll:
yann@402
  4712
+	mov	#FFI_TYPE_SINT64,r2
yann@402
  4713
+	cmp/eq	r2,r9
yann@402
  4714
+	bt/s	1f
yann@402
  4715
+	 mov	#FFI_TYPE_UINT64,r2
yann@402
  4716
+	cmp/eq	r2,r9
yann@402
  4717
+	bf	L_ret_i
yann@402
  4718
+
yann@402
  4719
+1:
yann@402
  4720
+	mov.l	@(24,r14),r2
yann@402
  4721
+	mov.l	r0,@r2
yann@402
  4722
+	bra	L_epilogue
yann@402
  4723
+	 mov.l	r1,@(4,r2)
yann@402
  4724
+
yann@402
  4725
+L_ret_i:
yann@402
  4726
+	mov	#FFI_TYPE_FLOAT,r2
yann@402
  4727
+	cmp/eq	r2,r9
yann@402
  4728
+	bt	1f
yann@402
  4729
+	mov	#FFI_TYPE_INT,r2
yann@402
  4730
+	cmp/eq	r2,r9
yann@402
  4731
+	bf	L_epilogue
yann@402
  4732
+1:
yann@402
  4733
+	mov.l	@(24,r14),r1
yann@402
  4734
+	bra	L_epilogue
yann@402
  4735
+	 mov.l	r0,@r1
yann@402
  4736
+
yann@402
  4737
+L_epilogue:
yann@402
  4738
+	# Remove the space we pushed for the args
yann@402
  4739
+	mov   r14,r15
yann@402
  4740
+
yann@402
  4741
+	lds.l  @r15+,pr
yann@402
  4742
+	mov.l  @r15+,r14
yann@402
  4743
+	mov.l  @r15+,r12
yann@402
  4744
+	mov.l  @r15+,r10
yann@402
  4745
+	mov.l  @r15+,r9
yann@402
  4746
+	rts
yann@402
  4747
+	 mov.l  @r15+,r8
yann@402
  4748
+#endif
yann@402
  4749
+.LFE1:
yann@402
  4750
+.ffi_call_SYSV_end:
yann@402
  4751
+        .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
yann@402
  4752
+
yann@402
  4753
+.globl	ffi_closure_helper_SYSV
yann@402
  4754
+
yann@402
  4755
+ENTRY(ffi_closure_SYSV)
yann@402
  4756
+.LFB2:
yann@402
  4757
+	mov.l	r14,@-r15
yann@402
  4758
+.LCFI7:
yann@402
  4759
+	sts.l	pr,@-r15
yann@402
  4760
+
yann@402
  4761
+	/* Stack layout:	
yann@402
  4762
+	   ...
yann@402
  4763
+	   32 bytes (floating register parameters, SH-4 only)
yann@402
  4764
+	   16 bytes (register parameters)
yann@402
  4765
+	    4 bytes (result)
yann@402
  4766
+	    4 bytes (5th arg)
yann@402
  4767
+	   <- new stack pointer
yann@402
  4768
+	*/
yann@402
  4769
+.LCFI8:
yann@402
  4770
+#if defined(__SH4__)
yann@402
  4771
+	add	#-56,r15
yann@402
  4772
+#else
yann@402
  4773
+	add	#-24,r15
yann@402
  4774
+#endif
yann@402
  4775
+.LCFI9:
yann@402
  4776
+	mov	r15,r14
yann@402
  4777
+.LCFIA:
yann@402
  4778
+	mov	r14,r1
yann@402
  4779
+	add	#24,r1
yann@402
  4780
+	mov.l	r7,@-r1
yann@402
  4781
+	mov.l	r6,@-r1
yann@402
  4782
+	mov.l	r5,@-r1
yann@402
  4783
+	mov.l	r4,@-r1
yann@402
  4784
+	mov	r1,r6
yann@402
  4785
+
yann@402
  4786
+#if defined(__SH4__)
yann@402
  4787
+	mov	r14,r1
yann@402
  4788
+	add	#56,r1
yann@402
  4789
+#ifdef __LITTLE_ENDIAN__
yann@402
  4790
+	fmov.s	fr10,@-r1
yann@402
  4791
+	fmov.s	fr11,@-r1
yann@402
  4792
+	fmov.s	fr8,@-r1
yann@402
  4793
+	fmov.s	fr9,@-r1
yann@402
  4794
+	fmov.s	fr6,@-r1
yann@402
  4795
+	fmov.s	fr7,@-r1
yann@402
  4796
+	fmov.s	fr4,@-r1
yann@402
  4797
+	fmov.s	fr5,@-r1
yann@402
  4798
+#else
yann@402
  4799
+	fmov.s	fr11,@-r1
yann@402
  4800
+	fmov.s	fr10,@-r1
yann@402
  4801
+	fmov.s	fr9,@-r1
yann@402
  4802
+	fmov.s	fr8,@-r1
yann@402
  4803
+	fmov.s	fr7,@-r1
yann@402
  4804
+	fmov.s	fr6,@-r1
yann@402
  4805
+	fmov.s	fr5,@-r1
yann@402
  4806
+	fmov.s	fr4,@-r1
yann@402
  4807
+#endif
yann@402
  4808
+	mov	r1,r7
yann@402
  4809
+#endif
yann@402
  4810
+
yann@402
  4811
+	mov	r14,r1
yann@402
  4812
+	add	#4,r1
yann@402
  4813
+	mov	r1,r5
yann@402
  4814
+
yann@402
  4815
+	mov	r14,r1
yann@402
  4816
+#if defined(__SH4__)
yann@402
  4817
+	add	#64,r1
yann@402
  4818
+#else
yann@402
  4819
+	add	#32,r1
yann@402
  4820
+#endif
yann@402
  4821
+	mov.l	r1,@r14
yann@402
  4822
+
yann@402
  4823
+	mov.l	L_helper,r0
yann@402
  4824
+	jsr	@r0
yann@402
  4825
+	 mov	r3,r4
yann@402
  4826
+
yann@402
  4827
+	shll	r0
yann@402
  4828
+	mov	r0,r1
yann@402
  4829
+	mova	L_table,r0
yann@402
  4830
+	add	r1,r0
yann@402
  4831
+	mov.w	@r0,r0
yann@402
  4832
+	mov	r14,r2
yann@402
  4833
+	braf	r0
yann@402
  4834
+	 add	#4,r2
yann@402
  4835
+0:
yann@402
  4836
+	.align 2
yann@402
  4837
+L_helper:
yann@402
  4838
+	.long	ffi_closure_helper_SYSV
yann@402
  4839
+L_table:
yann@402
  4840
+	.short L_case_v - 0b	/* FFI_TYPE_VOID */
yann@402
  4841
+	.short L_case_i - 0b	/* FFI_TYPE_INT */
yann@402
  4842
+#if defined(__SH4__)
yann@402
  4843
+	.short L_case_f - 0b	/* FFI_TYPE_FLOAT */
yann@402
  4844
+	.short L_case_d - 0b	/* FFI_TYPE_DOUBLE */
yann@402
  4845
+	.short L_case_d - 0b	/* FFI_TYPE_LONGDOUBLE */
yann@402
  4846
+#else
yann@402
  4847
+	.short L_case_i - 0b	/* FFI_TYPE_FLOAT */
yann@402
  4848
+	.short L_case_ll - 0b	/* FFI_TYPE_DOUBLE */
yann@402
  4849
+	.short L_case_ll - 0b	/* FFI_TYPE_LONGDOUBLE */
yann@402
  4850
+#endif
yann@402
  4851
+	.short L_case_uq - 0b	/* FFI_TYPE_UINT8 */
yann@402
  4852
+	.short L_case_q - 0b	/* FFI_TYPE_SINT8 */
yann@402
  4853
+	.short L_case_uh - 0b	/* FFI_TYPE_UINT16 */
yann@402
  4854
+	.short L_case_h - 0b	/* FFI_TYPE_SINT16 */
yann@402
  4855
+	.short L_case_i - 0b	/* FFI_TYPE_UINT32 */
yann@402
  4856
+	.short L_case_i - 0b	/* FFI_TYPE_SINT32 */
yann@402
  4857
+	.short L_case_ll - 0b	/* FFI_TYPE_UINT64 */
yann@402
  4858
+	.short L_case_ll - 0b	/* FFI_TYPE_SINT64 */
yann@402
  4859
+	.short L_case_v - 0b	/* FFI_TYPE_STRUCT */
yann@402
  4860
+	.short L_case_i - 0b	/* FFI_TYPE_POINTER */
yann@402
  4861
+
yann@402
  4862
+#if defined(__SH4__)
yann@402
  4863
+L_case_d:
yann@402
  4864
+#ifdef __LITTLE_ENDIAN__
yann@402
  4865
+	fmov.s	@r2+,fr1
yann@402
  4866
+	bra	L_case_v
yann@402
  4867
+	 fmov.s	@r2,fr0
yann@402
  4868
+#else
yann@402
  4869
+	fmov.s	@r2+,fr0
yann@402
  4870
+	bra	L_case_v
yann@402
  4871
+	 fmov.s	@r2,fr1
yann@402
  4872
+#endif
yann@402
  4873
+
yann@402
  4874
+L_case_f:
yann@402
  4875
+	bra	L_case_v
yann@402
  4876
+	 fmov.s	@r2,fr0
yann@402
  4877
+#endif
yann@402
  4878
+	
yann@402
  4879
+L_case_ll:
yann@402
  4880
+	mov.l	@r2+,r0
yann@402
  4881
+	bra	L_case_v
yann@402
  4882
+	 mov.l	@r2,r1
yann@402
  4883
+	
yann@402
  4884
+L_case_i:
yann@402
  4885
+	bra	L_case_v
yann@402
  4886
+	 mov.l	@r2,r0
yann@402
  4887
+	
yann@402
  4888
+L_case_q:
yann@402
  4889
+#ifdef __LITTLE_ENDIAN__
yann@402
  4890
+#else
yann@402
  4891
+	add	#3,r2
yann@402
  4892
+#endif
yann@402
  4893
+	bra	L_case_v
yann@402
  4894
+	 mov.b	@r2,r0
yann@402
  4895
+
yann@402
  4896
+L_case_uq:
yann@402
  4897
+#ifdef __LITTLE_ENDIAN__
yann@402
  4898
+#else
yann@402
  4899
+	add	#3,r2
yann@402
  4900
+#endif
yann@402
  4901
+	mov.b	@r2,r0
yann@402
  4902
+	bra	L_case_v
yann@402
  4903
+	 extu.b r0,r0
yann@402
  4904
+
yann@402
  4905
+L_case_h:
yann@402
  4906
+#ifdef __LITTLE_ENDIAN__
yann@402
  4907
+#else
yann@402
  4908
+	add	#2,r2
yann@402
  4909
+#endif
yann@402
  4910
+	bra	L_case_v
yann@402
  4911
+	 mov.w	@r2,r0
yann@402
  4912
+
yann@402
  4913
+L_case_uh:
yann@402
  4914
+#ifdef __LITTLE_ENDIAN__
yann@402
  4915
+#else
yann@402
  4916
+	add	#2,r2
yann@402
  4917
+#endif
yann@402
  4918
+	mov.w	@r2,r0
yann@402
  4919
+	extu.w	r0,r0
yann@402
  4920
+	/* fall through */
yann@402
  4921
+
yann@402
  4922
+L_case_v:
yann@402
  4923
+#if defined(__SH4__)
yann@402
  4924
+	add	#56,r15
yann@402
  4925
+#else
yann@402
  4926
+	add	#24,r15
yann@402
  4927
+#endif
yann@402
  4928
+	lds.l	@r15+,pr
yann@402
  4929
+	rts
yann@402
  4930
+	 mov.l	@r15+,r14
yann@402
  4931
+.LFE2:
yann@402
  4932
+.ffi_closure_SYSV_end:
yann@402
  4933
+        .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
yann@402
  4934
+
yann@402
  4935
+	.section	".eh_frame","aw",@progbits
yann@402
  4936
+__FRAME_BEGIN__:
yann@402
  4937
+	.4byte	.LECIE1-.LSCIE1	/* Length of Common Information Entry */
yann@402
  4938
+.LSCIE1:
yann@402
  4939
+	.4byte	0x0	/* CIE Identifier Tag */
yann@402
  4940
+	.byte	0x1	/* CIE Version */
yann@402
  4941
+	.byte	0x0	/* CIE Augmentation */
yann@402
  4942
+	.byte	0x1	/* uleb128 0x1; CIE Code Alignment Factor */
yann@402
  4943
+	.byte	0x7c	/* sleb128 -4; CIE Data Alignment Factor */
yann@402
  4944
+	.byte	0x11	/* CIE RA Column */
yann@402
  4945
+	.byte	0xc	/* DW_CFA_def_cfa */
yann@402
  4946
+	.byte	0xf	/* uleb128 0xf */
yann@402
  4947
+	.byte	0x0	/* uleb128 0x0 */
yann@402
  4948
+	.align	2
yann@402
  4949
+.LECIE1:
yann@402
  4950
+.LSFDE1:
yann@402
  4951
+	.4byte	.LEFDE1-.LASFDE1	/* FDE Length */
yann@402
  4952
+.LASFDE1:
yann@402
  4953
+	.4byte	.LASFDE1-__FRAME_BEGIN__	/* FDE CIE offset */
yann@402
  4954
+	.4byte	.LFB1	/* FDE initial location */
yann@402
  4955
+	.4byte	.LFE1-.LFB1	 /* FDE address range */
yann@402
  4956
+	.byte	0x4	/* DW_CFA_advance_loc4 */
yann@402
  4957
+	.4byte	.LCFI0-.LFB1
yann@402
  4958
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
yann@402
  4959
+	.byte	0x4	/* uleb128 0x4 */
yann@402
  4960
+	.byte	0x4	/* DW_CFA_advance_loc4 */
yann@402
  4961
+	.4byte	.LCFI1-.LCFI0
yann@402
  4962
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
yann@402
  4963
+	.byte	0x8	/* uleb128 0x4 */
yann@402
  4964
+	.byte	0x4	/* DW_CFA_advance_loc4 */
yann@402
  4965
+	.4byte	.LCFI2-.LCFI1
yann@402
  4966
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
yann@402
  4967
+	.byte	0xc	/* uleb128 0x4 */
yann@402
  4968
+	.byte	0x4	/* DW_CFA_advance_loc4 */
yann@402
  4969
+	.4byte	.LCFI3-.LCFI2
yann@402
  4970
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
yann@402
  4971
+	.byte	0x10	/* uleb128 0x4 */
yann@402
  4972
+	.byte	0x4	/* DW_CFA_advance_loc4 */
yann@402
  4973
+	.4byte	.LCFI4-.LCFI3
yann@402
  4974
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
yann@402
  4975
+	.byte	0x14	/* uleb128 0x4 */
yann@402
  4976
+	.byte	0x4	/* DW_CFA_advance_loc4 */
yann@402
  4977
+	.4byte	.LCFI5-.LCFI4
yann@402
  4978
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
yann@402
  4979
+	.byte	0x18	/* uleb128 0x4 */
yann@402
  4980
+	.byte	0x91	/* DW_CFA_offset, column 0x11 */
yann@402
  4981
+	.byte	0x6	/* uleb128 0x6 */
yann@402
  4982
+	.byte	0x8e	/* DW_CFA_offset, column 0xe */
yann@402
  4983
+	.byte	0x5	/* uleb128 0x5 */
yann@402
  4984
+	.byte	0x8c	/* DW_CFA_offset, column 0xc */
yann@402
  4985
+	.byte	0x4	/* uleb128 0x4 */
yann@402
  4986
+	.byte	0x8a	/* DW_CFA_offset, column 0xa */
yann@402
  4987
+	.byte	0x3	/* uleb128 0x3 */
yann@402
  4988
+	.byte	0x89	/* DW_CFA_offset, column 0x9 */
yann@402
  4989
+	.byte	0x2	/* uleb128 0x2 */
yann@402
  4990
+	.byte	0x88	/* DW_CFA_offset, column 0x8 */
yann@402
  4991
+	.byte	0x1	/* uleb128 0x1 */
yann@402
  4992
+	.byte	0x4	/* DW_CFA_advance_loc4 */
yann@402
  4993
+	.4byte	.LCFI6-.LCFI5
yann@402
  4994
+	.byte	0xd	/* DW_CFA_def_cfa_register */
yann@402
  4995
+	.byte	0xe	/* uleb128 0xe */
yann@402
  4996
+	.align	2
yann@402
  4997
+.LEFDE1:
yann@402
  4998
+
yann@402
  4999
+.LSFDE3:
yann@402
  5000
+	.4byte	.LEFDE3-.LASFDE3	/* FDE Length */
yann@402
  5001
+.LASFDE3:
yann@402
  5002
+	.4byte	.LASFDE3-__FRAME_BEGIN__	/* FDE CIE offset */
yann@402
  5003
+	.4byte	.LFB2	/* FDE initial location */
yann@402
  5004
+	.4byte	.LFE2-.LFB2	 /* FDE address range */
yann@402
  5005
+	.byte	0x4	/* DW_CFA_advance_loc4 */
yann@402
  5006
+	.4byte	.LCFI7-.LFB2
yann@402
  5007
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
yann@402
  5008
+	.byte	0x4	/* uleb128 0x4 */
yann@402
  5009
+	.byte	0x4	/* DW_CFA_advance_loc4 */
yann@402
  5010
+	.4byte	.LCFI8-.LCFI7
yann@402
  5011
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
yann@402
  5012
+	.byte	0x8	/* uleb128 0x8 */
yann@402
  5013
+	.byte	0x4	/* DW_CFA_advance_loc4 */
yann@402
  5014
+	.4byte	.LCFI9-.LCFI8
yann@402
  5015
+	.byte	0xe	/* DW_CFA_def_cfa_offset */
yann@402
  5016
+#if defined(__SH4__)
yann@402
  5017
+	.byte	8+56	/* uleb128 8+56 */
yann@402
  5018
+#else
yann@402
  5019
+	.byte	8+24	/* uleb128 8+24 */
yann@402
  5020
+#endif
yann@402
  5021
+	.byte	0x91	/* DW_CFA_offset, column 0x11 */
yann@402
  5022
+        .byte	0x2
yann@402
  5023
+        .byte	0x8e	/* DW_CFA_offset, column 0xe */
yann@402
  5024
+        .byte	0x1
yann@402
  5025
+	.byte	0x4	/* DW_CFA_advance_loc4 */
yann@402
  5026
+	.4byte	.LCFIA-.LCFI9
yann@402
  5027
+	.byte	0xd	/* DW_CFA_def_cfa_register */
yann@402
  5028
+	.byte	0xe	/* uleb128 0xe */
yann@402
  5029
+	.align	2
yann@402
  5030
+.LEFDE3:
yann@402
  5031
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/ffi.c gcc/libffi/src/sparc/ffi.c
yann@402
  5032
--- gcc-3.2.2.orig/libffi/src/sparc/ffi.c	Sat Mar  3 07:21:23 2001
yann@402
  5033
+++ gcc/libffi/src/sparc/ffi.c	Sat Jan  4 08:08:56 2003
yann@402
  5034
@@ -1,5 +1,5 @@
yann@402
  5035
 /* -----------------------------------------------------------------------
yann@402
  5036
-   ffi.c - Copyright (c) 1996 Cygnus Solutions
yann@402
  5037
+   ffi.c - Copyright (c) 1996, 2003 Cygnus Solutions
yann@402
  5038
    
yann@402
  5039
    Sparc Foreign Function Interface 
yann@402
  5040
 
yann@402
  5041
@@ -28,20 +28,22 @@
yann@402
  5042
 
yann@402
  5043
 #include <stdlib.h>
yann@402
  5044
 
yann@402
  5045
+#ifdef SPARC64
yann@402
  5046
+extern void ffi_closure_v9(void);
yann@402
  5047
+#else
yann@402
  5048
+extern void ffi_closure_v8(void);
yann@402
  5049
+#endif
yann@402
  5050
+
yann@402
  5051
 /* ffi_prep_args is called by the assembly routine once stack space
yann@402
  5052
    has been allocated for the function's arguments */
yann@402
  5053
 
yann@402
  5054
 void ffi_prep_args_v8(char *stack, extended_cif *ecif)
yann@402
  5055
 {
yann@402
  5056
   int i;
yann@402
  5057
-  int tmp;
yann@402
  5058
-  int avn;
yann@402
  5059
   void **p_argv;
yann@402
  5060
   char *argp;
yann@402
  5061
   ffi_type **p_arg;
yann@402
  5062
 
yann@402
  5063
-  tmp = 0;
yann@402
  5064
-
yann@402
  5065
   /* Skip 16 words for the window save area */
yann@402
  5066
   argp = stack + 16*sizeof(int);
yann@402
  5067
 
yann@402
  5068
@@ -66,18 +68,12 @@
yann@402
  5069
   ((int*)argp)[5] = 0;
yann@402
  5070
 #endif
yann@402
  5071
 
yann@402
  5072
-  avn = ecif->cif->nargs;
yann@402
  5073
   p_argv = ecif->avalue;
yann@402
  5074
 
yann@402
  5075
-  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
yann@402
  5076
-       i && avn;
yann@402
  5077
-       i--, p_arg++)
yann@402
  5078
+  for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++)
yann@402
  5079
     {
yann@402
  5080
       size_t z;
yann@402
  5081
 
yann@402
  5082
-      if (avn) 
yann@402
  5083
-	{
yann@402
  5084
-	  avn--;
yann@402
  5085
 	  if ((*p_arg)->type == FFI_TYPE_STRUCT
yann@402
  5086
 #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
yann@402
  5087
 	      || (*p_arg)->type == FFI_TYPE_LONGDOUBLE
yann@402
  5088
@@ -122,7 +118,6 @@
yann@402
  5089
 	    }
yann@402
  5090
 	  p_argv++;
yann@402
  5091
 	  argp += z;
yann@402
  5092
-	}
yann@402
  5093
     }
yann@402
  5094
   
yann@402
  5095
   return;
yann@402
  5096
@@ -420,3 +415,101 @@
yann@402
  5097
     }
yann@402
  5098
 
yann@402
  5099
 }
yann@402
  5100
+
yann@402
  5101
+ffi_status
yann@402
  5102
+ffi_prep_closure (ffi_closure* closure,
yann@402
  5103
+		  ffi_cif* cif,
yann@402
  5104
+		  void (*fun)(ffi_cif*, void*, void**, void*),
yann@402
  5105
+		  void *user_data)
yann@402
  5106
+{
yann@402
  5107
+  unsigned int *tramp = (unsigned int *) &closure->tramp[0];
yann@402
  5108
+  unsigned long fn;
yann@402
  5109
+  unsigned long ctx = (unsigned long) closure;
yann@402
  5110
+
yann@402
  5111
+#ifdef SPARC64
yann@402
  5112
+  /* Trampoline address is equal to the closure address.  We take advantage
yann@402
  5113
+     of that to reduce the trampoline size by 8 bytes. */
yann@402
  5114
+  FFI_ASSERT (cif->abi == FFI_V9);
yann@402
  5115
+  fn = (unsigned long) ffi_closure_v9;
yann@402
  5116
+  tramp[0] = 0x83414000;	/* rd	%pc, %g1	*/
yann@402
  5117
+  tramp[1] = 0xca586010;	/* ldx	[%g1+16], %g5	*/
yann@402
  5118
+  tramp[2] = 0x81c14000;	/* jmp	%g5		*/
yann@402
  5119
+  tramp[3] = 0x01000000;	/* nop			*/
yann@402
  5120
+  *((unsigned long *) &tramp[4]) = fn;
yann@402
  5121
+#else
yann@402
  5122
+  FFI_ASSERT (cif->abi == FFI_V8);
yann@402
  5123
+  fn = (unsigned long) ffi_closure_v8;
yann@402
  5124
+  tramp[0] = 0x03000000 | fn >> 10;	/* sethi %hi(fn), %g1	*/
yann@402
  5125
+  tramp[1] = 0x05000000 | ctx >> 10;	/* sethi %hi(ctx), %g2	*/
yann@402
  5126
+  tramp[2] = 0x81c06000 | (fn & 0x3ff);	/* jmp   %g1+%lo(fn)	*/
yann@402
  5127
+  tramp[3] = 0x8410a000 | (ctx & 0x3ff);/* or    %g2, %lo(ctx)	*/
yann@402
  5128
+#endif
yann@402
  5129
+
yann@402
  5130
+  closure->cif = cif;
yann@402
  5131
+  closure->fun = fun;
yann@402
  5132
+  closure->user_data = user_data;
yann@402
  5133
+
yann@402
  5134
+  /* Flush the Icache.  FIXME: alignment isn't certain, assume 8 bytes */
yann@402
  5135
+#ifdef SPARC64
yann@402
  5136
+  asm volatile ("flush	%0" : : "r" (closure) : "memory");
yann@402
  5137
+  asm volatile ("flush	%0" : : "r" (((char *) closure) + 8) : "memory");
yann@402
  5138
+#else
yann@402
  5139
+  asm volatile ("iflush	%0" : : "r" (closure) : "memory");
yann@402
  5140
+  asm volatile ("iflush	%0" : : "r" (((char *) closure) + 8) : "memory");
yann@402
  5141
+#endif
yann@402
  5142
+
yann@402
  5143
+  return FFI_OK;
yann@402
  5144
+}
yann@402
  5145
+
yann@402
  5146
+int
yann@402
  5147
+ffi_closure_sparc_inner(ffi_closure *closure,
yann@402
  5148
+  void *rvalue, unsigned long *gpr, double *fpr)
yann@402
  5149
+{
yann@402
  5150
+  ffi_cif *cif;
yann@402
  5151
+  void **avalue;
yann@402
  5152
+  ffi_type **arg_types;
yann@402
  5153
+  int i, avn, argn;
yann@402
  5154
+
yann@402
  5155
+  cif = closure->cif;
yann@402
  5156
+  avalue = alloca(cif->nargs * sizeof(void *));
yann@402
  5157
+
yann@402
  5158
+  argn = 0;
yann@402
  5159
+
yann@402
  5160
+  /* Copy the caller's structure return address to that the closure
yann@402
  5161
+     returns the data directly to the caller.  */
yann@402
  5162
+  if (cif->flags == FFI_TYPE_STRUCT)
yann@402
  5163
+    {
yann@402
  5164
+      rvalue = (void *) gpr[0];
yann@402
  5165
+      argn = 1;
yann@402
  5166
+    }
yann@402
  5167
+
yann@402
  5168
+  i = 0;
yann@402
  5169
+  avn = cif->nargs;
yann@402
  5170
+  arg_types = cif->arg_types;
yann@402
  5171
+  
yann@402
  5172
+  /* Grab the addresses of the arguments from the stack frame.  */
yann@402
  5173
+  while (i < avn)
yann@402
  5174
+    {
yann@402
  5175
+      /* Assume big-endian.  FIXME */
yann@402
  5176
+      argn += ALIGN(arg_types[i]->size, SIZEOF_ARG) / SIZEOF_ARG;
yann@402
  5177
+
yann@402
  5178
+#ifdef SPARC64
yann@402
  5179
+      if (i < 6 && (arg_types[i]->type == FFI_TYPE_FLOAT
yann@402
  5180
+		 || arg_types[i]->type == FFI_TYPE_DOUBLE
yann@402
  5181
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
yann@402
  5182
+		 || arg_types[i]->type == FFI_TYPE_LONGDOUBLE
yann@402
  5183
+#endif
yann@402
  5184
+		))
yann@402
  5185
+        avalue[i] = ((char *) &fpr[argn]) - arg_types[i]->size;
yann@402
  5186
+      else
yann@402
  5187
+#endif
yann@402
  5188
+        avalue[i] = ((char *) &gpr[argn]) - arg_types[i]->size;
yann@402
  5189
+      i++;
yann@402
  5190
+    }
yann@402
  5191
+
yann@402
  5192
+  /* Invoke the closure.  */
yann@402
  5193
+  (closure->fun) (cif, rvalue, avalue, closure->user_data);
yann@402
  5194
+
yann@402
  5195
+  /* Tell ffi_closure_sparc how to perform return type promotions.  */
yann@402
  5196
+  return cif->rtype->type;
yann@402
  5197
+}
yann@402
  5198
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/v8.S gcc/libffi/src/sparc/v8.S
yann@402
  5199
--- gcc-3.2.2.orig/libffi/src/sparc/v8.S	Mon Apr 29 05:12:04 2002
yann@402
  5200
+++ gcc/libffi/src/sparc/v8.S	Sat Jan  4 08:08:56 2003
yann@402
  5201
@@ -1,5 +1,5 @@
yann@402
  5202
 /* -----------------------------------------------------------------------
yann@402
  5203
-   v8.S - Copyright (c) 1996, 1997 Cygnus Solutions
yann@402
  5204
+   v8.S - Copyright (c) 1996, 1997, 2003 Cygnus Solutions
yann@402
  5205
    
yann@402
  5206
    Sparc Foreign Function Interface 
yann@402
  5207
 
yann@402
  5208
@@ -94,6 +94,72 @@
yann@402
  5209
 .ffi_call_V8_end:
yann@402
  5210
 	.size	ffi_call_V8,.ffi_call_V8_end-ffi_call_V8
yann@402
  5211
 
yann@402
  5212
+
yann@402
  5213
+#define	STACKFRAME	104	/* 16*4 register window +
yann@402
  5214
+				   1*4 struct return +	
yann@402
  5215
+				   6*4 args backing store +
yann@402
  5216
+				   3*4 locals */
yann@402
  5217
+
yann@402
  5218
+/* ffi_closure_v8(...)
yann@402
  5219
+
yann@402
  5220
+   Receives the closure argument in %g2.   */
yann@402
  5221
+
yann@402
  5222
+	.text
yann@402
  5223
+	.align 8
yann@402
  5224
+	.globl ffi_closure_v8
yann@402
  5225
+
yann@402
  5226
+ffi_closure_v8:
yann@402
  5227
+	.register	%g2, #scratch
yann@402
  5228
+.LLFB2:
yann@402
  5229
+	save	%sp, -STACKFRAME, %sp
yann@402
  5230
+.LLCFI1:
yann@402
  5231
+
yann@402
  5232
+	! Store all of the potential argument registers in va_list format.
yann@402
  5233
+	st	%i0, [%fp+68+0]
yann@402
  5234
+	st	%i1, [%fp+68+4]
yann@402
  5235
+	st	%i2, [%fp+68+8]
yann@402
  5236
+	st	%i3, [%fp+68+12]
yann@402
  5237
+	st	%i4, [%fp+68+16]
yann@402
  5238
+	st	%i5, [%fp+68+20]
yann@402
  5239
+
yann@402
  5240
+	! Call ffi_closure_sparc_inner to do the bulk of the work.
yann@402
  5241
+	mov	%g2, %o0
yann@402
  5242
+	add	%fp, -8, %o1
yann@402
  5243
+	add	%fp,  68, %o2
yann@402
  5244
+	call	ffi_closure_sparc_inner
yann@402
  5245
+	 mov	0, %o3
yann@402
  5246
+
yann@402
  5247
+	! Load up the return value in the proper type.
yann@402
  5248
+	cmp	%o0, FFI_TYPE_VOID
yann@402
  5249
+	be	done1
yann@402
  5250
+
yann@402
  5251
+	cmp	%o0, FFI_TYPE_FLOAT
yann@402
  5252
+	be,a	done1
yann@402
  5253
+	 ld	[%fp-8], %f0
yann@402
  5254
+
yann@402
  5255
+	cmp	%o0, FFI_TYPE_DOUBLE
yann@402
  5256
+	be,a	done1
yann@402
  5257
+	 ldd	[%fp-8], %f0
yann@402
  5258
+
yann@402
  5259
+	cmp	%o0, FFI_TYPE_SINT64
yann@402
  5260
+	be,a	integer
yann@402
  5261
+	 ld	[%fp-4], %i1
yann@402
  5262
+
yann@402
  5263
+	cmp	%o0, FFI_TYPE_UINT64
yann@402
  5264
+	be,a	integer
yann@402
  5265
+	 ld	[%fp-4], %i1
yann@402
  5266
+
yann@402
  5267
+integer:
yann@402
  5268
+	ld	[%fp-8], %i0
yann@402
  5269
+
yann@402
  5270
+done1:
yann@402
  5271
+	ret
yann@402
  5272
+	 restore
yann@402
  5273
+.LLFE2:
yann@402
  5274
+
yann@402
  5275
+.ffi_closure_v8_end:
yann@402
  5276
+	.size	ffi_closure_v8,.ffi_closure_v8_end-ffi_closure_v8
yann@402
  5277
+
yann@402
  5278
 #ifdef SPARC64
yann@402
  5279
 #define WS 8
yann@402
  5280
 #define nword	xword
yann@402
  5281
@@ -148,3 +214,26 @@
yann@402
  5282
 	.byte	0x1f	! uleb128 0x1f
yann@402
  5283
 	.align	WS
yann@402
  5284
 .LLEFDE1:
yann@402
  5285
+.LLSFDE2:
yann@402
  5286
+	.uaword	.LLEFDE2-.LLASFDE2	! FDE Length
yann@402
  5287
+.LLASFDE2:
yann@402
  5288
+	.uaword	.LLASFDE2-.LLframe1	! FDE CIE offset
yann@402
  5289
+#ifdef HAVE_AS_SPARC_UA_PCREL
yann@402
  5290
+	.uaword	%r_disp32(.LLFB2)
yann@402
  5291
+	.uaword	.LLFE2-.LLFB2	! FDE address range
yann@402
  5292
+#else
yann@402
  5293
+	.align	WS
yann@402
  5294
+	.nword	.LLFB2
yann@402
  5295
+	.uanword .LLFE2-.LLFB2	! FDE address range
yann@402
  5296
+#endif
yann@402
  5297
+	.byte	0x0	! uleb128 0x0; Augmentation size
yann@402
  5298
+	.byte	0x4	! DW_CFA_advance_loc4
yann@402
  5299
+	.uaword	.LLCFI1-.LLFB2
yann@402
  5300
+	.byte	0xd	! DW_CFA_def_cfa_register
yann@402
  5301
+	.byte	0x1e	! uleb128 0x1e
yann@402
  5302
+	.byte	0x2d	! DW_CFA_GNU_window_save
yann@402
  5303
+	.byte	0x9	! DW_CFA_register
yann@402
  5304
+	.byte	0xf	! uleb128 0xf
yann@402
  5305
+	.byte	0x1f	! uleb128 0x1f
yann@402
  5306
+	.align	WS
yann@402
  5307
+.LLEFDE2:
yann@402
  5308
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/v9.S gcc/libffi/src/sparc/v9.S
yann@402
  5309
--- gcc-3.2.2.orig/libffi/src/sparc/v9.S	Mon Apr 29 05:12:04 2002
yann@402
  5310
+++ gcc/libffi/src/sparc/v9.S	Sat Jan  4 08:08:56 2003
yann@402
  5311
@@ -1,5 +1,5 @@
yann@402
  5312
 /* -----------------------------------------------------------------------
yann@402
  5313
-   v9.S - Copyright (c) 2000 Cygnus Solutions
yann@402
  5314
+   v9.S - Copyright (c) 2000, 2003 Cygnus Solutions
yann@402
  5315
    
yann@402
  5316
    Sparc 64bit Foreign Function Interface 
yann@402
  5317
 
yann@402
  5318
@@ -99,7 +99,7 @@
yann@402
  5319
 	cmp	%i3, FFI_TYPE_STRUCT
yann@402
  5320
 	be,pn	%icc, dostruct
yann@402
  5321
 
yann@402
  5322
-	 cmp	%i3, FFI_TYPE_LONGDOUBLE
yann@402
  5323
+	cmp	%i3, FFI_TYPE_LONGDOUBLE
yann@402
  5324
 	bne,pt	%icc, done
yann@402
  5325
 	 nop
yann@402
  5326
 	std	%f0, [%i4+0]
yann@402
  5327
@@ -125,6 +125,88 @@
yann@402
  5328
 .ffi_call_V9_end:
yann@402
  5329
 	.size	ffi_call_V9,.ffi_call_V9_end-ffi_call_V9
yann@402
  5330
 
yann@402
  5331
+
yann@402
  5332
+#define	STACKFRAME	 240	/* 16*8 register window +
yann@402
  5333
+				   6*8 args backing store +
yann@402
  5334
+				   8*8 locals */
yann@402
  5335
+#define	FP		%fp+STACK_BIAS
yann@402
  5336
+
yann@402
  5337
+/* ffi_closure_v9(...)
yann@402
  5338
+
yann@402
  5339
+   Receives the closure argument in %g1.   */
yann@402
  5340
+
yann@402
  5341
+	.text
yann@402
  5342
+	.align 8
yann@402
  5343
+	.globl ffi_closure_v9
yann@402
  5344
+
yann@402
  5345
+ffi_closure_v9:
yann@402
  5346
+.LLFB2:
yann@402
  5347
+	save	%sp, -STACKFRAME, %sp
yann@402
  5348
+.LLCFI1:
yann@402
  5349
+
yann@402
  5350
+	! Store all of the potential argument registers in va_list format.
yann@402
  5351
+	stx	%i0, [FP+128+0]
yann@402
  5352
+	stx	%i1, [FP+128+8]
yann@402
  5353
+	stx	%i2, [FP+128+16]
yann@402
  5354
+	stx	%i3, [FP+128+24]
yann@402
  5355
+	stx	%i4, [FP+128+32]
yann@402
  5356
+	stx	%i5, [FP+128+40]
yann@402
  5357
+
yann@402
  5358
+	! Store possible floating point argument registers too.
yann@402
  5359
+	std	%f0, [FP-48]
yann@402
  5360
+	std	%f2, [FP-40]
yann@402
  5361
+	std	%f4, [FP-32]
yann@402
  5362
+	std	%f6, [FP-24]
yann@402
  5363
+	std	%f8, [FP-16]
yann@402
  5364
+	std	%f10, [FP-8]
yann@402
  5365
+
yann@402
  5366
+	! Call ffi_closure_sparc_inner to do the bulk of the work.
yann@402
  5367
+	mov	%g1, %o0
yann@402
  5368
+	add	%fp, STACK_BIAS-64, %o1
yann@402
  5369
+	add	%fp, STACK_BIAS+128, %o2
yann@402
  5370
+	call	ffi_closure_sparc_inner
yann@402
  5371
+	 add	%fp, STACK_BIAS-48, %o3
yann@402
  5372
+
yann@402
  5373
+	! Load up the return value in the proper type.
yann@402
  5374
+	cmp	%o0, FFI_TYPE_VOID
yann@402
  5375
+	be,pn	%icc, done1
yann@402
  5376
+
yann@402
  5377
+	cmp	%o0, FFI_TYPE_FLOAT
yann@402
  5378
+	be,a,pn	%icc, done1
yann@402
  5379
+	 ld	[FP-64], %f0
yann@402
  5380
+
yann@402
  5381
+	cmp	%o0, FFI_TYPE_DOUBLE
yann@402
  5382
+	be,a,pn	%icc, done1
yann@402
  5383
+	 ldd	[FP-64], %f0
yann@402
  5384
+
yann@402
  5385
+	cmp	%o0, FFI_TYPE_LONGDOUBLE
yann@402
  5386
+	be,a,pn	%icc, longdouble1
yann@402
  5387
+	 ldd	[FP-64], %f0
yann@402
  5388
+
yann@402
  5389
+	cmp	%o0, FFI_TYPE_STRUCT
yann@402
  5390
+	be,pn	%icc, struct1
yann@402
  5391
+
yann@402
  5392
+	! FFI_TYPE_UINT64 | FFI_TYPE_SINT64 | FFI_TYPE_POINTER
yann@402
  5393
+	ldx	[FP-64], %i0
yann@402
  5394
+
yann@402
  5395
+done1:
yann@402
  5396
+	ret
yann@402
  5397
+	 restore
yann@402
  5398
+
yann@402
  5399
+struct1:
yann@402
  5400
+	ldx [FP-56], %i2
yann@402
  5401
+	ret
yann@402
  5402
+	 restore
yann@402
  5403
+
yann@402
  5404
+longdouble1:
yann@402
  5405
+	ldd	[FP-56], %f2
yann@402
  5406
+	ret
yann@402
  5407
+	 restore
yann@402
  5408
+.LLFE2:
yann@402
  5409
+
yann@402
  5410
+.ffi_closure_v9_end:
yann@402
  5411
+	.size	ffi_closure_v9,.ffi_closure_v9_end-ffi_closure_v9
yann@402
  5412
+
yann@402
  5413
 	.section	".eh_frame",#alloc,#write
yann@402
  5414
 .LLframe1:
yann@402
  5415
 	.uaword	.LLECIE1-.LLSCIE1	! Length of Common Information Entry
yann@402
  5416
@@ -169,5 +251,27 @@
yann@402
  5417
 	.byte	0x1f	! uleb128 0x1f
yann@402
  5418
 	.align 8
yann@402
  5419
 .LLEFDE1:
yann@402
  5420
-
yann@402
  5421
+.LLSFDE2:
yann@402
  5422
+	.uaword	.LLEFDE2-.LLASFDE2	! FDE Length
yann@402
  5423
+.LLASFDE2:
yann@402
  5424
+	.uaword	.LLASFDE2-.LLframe1	! FDE CIE offset
yann@402
  5425
+#ifdef HAVE_AS_SPARC_UA_PCREL
yann@402
  5426
+	.uaword	%r_disp32(.LLFB2)
yann@402
  5427
+	.uaword	.LLFE2-.LLFB2		! FDE address range
yann@402
  5428
+#else
yann@402
  5429
+	.align 8
yann@402
  5430
+	.xword	.LLFB2
yann@402
  5431
+	.uaxword	.LLFE2-.LLFB2	! FDE address range
yann@402
  5432
+#endif
yann@402
  5433
+	.byte	0x0	! uleb128 0x0; Augmentation size
yann@402
  5434
+	.byte	0x4	! DW_CFA_advance_loc4
yann@402
  5435
+	.uaword	.LLCFI1-.LLFB2
yann@402
  5436
+	.byte	0xd	! DW_CFA_def_cfa_register
yann@402
  5437
+	.byte	0x1e	! uleb128 0x1e
yann@402
  5438
+	.byte	0x2d	! DW_CFA_GNU_window_save
yann@402
  5439
+	.byte	0x9	! DW_CFA_register
yann@402
  5440
+	.byte	0xf	! uleb128 0xf
yann@402
  5441
+	.byte	0x1f	! uleb128 0x1f
yann@402
  5442
+	.align 8
yann@402
  5443
+.LLEFDE2:
yann@402
  5444
 #endif
yann@402
  5445
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/types.c gcc/libffi/src/types.c
yann@402
  5446
--- gcc-3.2.2.orig/libffi/src/types.c	Tue Mar 27 11:39:16 2001
yann@402
  5447
+++ gcc/libffi/src/types.c	Wed Nov 27 07:24:05 2002
yann@402
  5448
@@ -42,7 +42,8 @@
yann@402
  5449
 FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32);
yann@402
  5450
 FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT);
yann@402
  5451
 
yann@402
  5452
-#if defined ALPHA || defined SPARC64
yann@402
  5453
+#if defined ALPHA || defined SPARC64 || defined X86_64 || defined S390X \
yann@402
  5454
+    || defined IA64
yann@402
  5455
 
yann@402
  5456
 FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER);
yann@402
  5457
 
yann@402
  5458
@@ -52,22 +53,12 @@
yann@402
  5459
 
yann@402
  5460
 #endif
yann@402
  5461
 
yann@402
  5462
-#ifdef X86
yann@402
  5463
+#if defined X86 || defined X86_WIN32 || defined ARM || defined M68K
yann@402
  5464
 
yann@402
  5465
 FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
yann@402
  5466
 FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
yann@402
  5467
 
yann@402
  5468
-#elif defined X86_WIN32
yann@402
  5469
-
yann@402
  5470
-FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
yann@402
  5471
-FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
yann@402
  5472
-
yann@402
  5473
-#elif defined ARM
yann@402
  5474
-
yann@402
  5475
-FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
yann@402
  5476
-FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
yann@402
  5477
-
yann@402
  5478
-#elif defined M68K
yann@402
  5479
+#elif defined SH
yann@402
  5480
 
yann@402
  5481
 FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
yann@402
  5482
 FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
yann@402
  5483
@@ -80,12 +71,7 @@
yann@402
  5484
 #endif
yann@402
  5485
 
yann@402
  5486
 
yann@402
  5487
-#ifdef X86
yann@402
  5488
-
yann@402
  5489
-FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
yann@402
  5490
-FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
yann@402
  5491
-
yann@402
  5492
-#elif defined X86_WIN32
yann@402
  5493
+#if defined X86 || defined X86_WIN32 || defined M68K
yann@402
  5494
 
yann@402
  5495
 FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
yann@402
  5496
 FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
yann@402
  5497
@@ -95,25 +81,25 @@
yann@402
  5498
 FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
yann@402
  5499
 FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE);
yann@402
  5500
 
yann@402
  5501
-#elif defined M68K
yann@402
  5502
+#elif defined SH
yann@402
  5503
 
yann@402
  5504
 FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
yann@402
  5505
-FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
yann@402
  5506
+FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE);
yann@402
  5507
 
yann@402
  5508
 #elif defined SPARC
yann@402
  5509
 
yann@402
  5510
 FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
yann@402
  5511
-
yann@402
  5512
 #ifdef SPARC64
yann@402
  5513
-
yann@402
  5514
 FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE);
yann@402
  5515
-
yann@402
  5516
 #else
yann@402
  5517
-
yann@402
  5518
 FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE);
yann@402
  5519
-
yann@402
  5520
 #endif
yann@402
  5521
 
yann@402
  5522
+#elif defined X86_64
yann@402
  5523
+
yann@402
  5524
+FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
yann@402
  5525
+FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE);
yann@402
  5526
+
yann@402
  5527
 #else
yann@402
  5528
 
yann@402
  5529
 FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
yann@402
  5530
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/ffi.c gcc/libffi/src/x86/ffi.c
yann@402
  5531
--- gcc-3.2.2.orig/libffi/src/x86/ffi.c	Tue May 28 18:22:08 2002
yann@402
  5532
+++ gcc/libffi/src/x86/ffi.c	Fri Dec  6 10:16:45 2002
yann@402
  5533
@@ -1,5 +1,8 @@
yann@402
  5534
 /* -----------------------------------------------------------------------
yann@402
  5535
-   ffi.c - Copyright (c) 1996, 1998, 1999  Cygnus Solutions
yann@402
  5536
+   ffi.c - Copyright (c) 1996, 1998, 1999, 2001  Red Hat, Inc.
yann@402
  5537
+           Copyright (c) 2002  Ranjit Mathew
yann@402
  5538
+           Copyright (c) 2002  Bo Thorsen
yann@402
  5539
+           Copyright (c) 2002  Roger Sayle
yann@402
  5540
    
yann@402
  5541
    x86 Foreign Function Interface 
yann@402
  5542
 
yann@402
  5543
@@ -23,6 +26,8 @@
yann@402
  5544
    OTHER DEALINGS IN THE SOFTWARE.
yann@402
  5545
    ----------------------------------------------------------------------- */
yann@402
  5546
 
yann@402
  5547
+#ifndef __x86_64__
yann@402
  5548
+
yann@402
  5549
 #include <ffi.h>
yann@402
  5550
 #include <ffi_common.h>
yann@402
  5551
 
yann@402
  5552
@@ -36,12 +41,10 @@
yann@402
  5553
 /*@=exportheader@*/
yann@402
  5554
 {
yann@402
  5555
   register unsigned int i;
yann@402
  5556
-  register int tmp;
yann@402
  5557
   register void **p_argv;
yann@402
  5558
   register char *argp;
yann@402
  5559
   register ffi_type **p_arg;
yann@402
  5560
 
yann@402
  5561
-  tmp = 0;
yann@402
  5562
   argp = stack;
yann@402
  5563
 
yann@402
  5564
   if (ecif->cif->rtype->type == FFI_TYPE_STRUCT)
yann@402
  5565
@@ -148,6 +151,18 @@
yann@402
  5566
 /*@=declundef@*/
yann@402
  5567
 /*@=exportheader@*/
yann@402
  5568
 
yann@402
  5569
+#ifdef X86_WIN32
yann@402
  5570
+/*@-declundef@*/
yann@402
  5571
+/*@-exportheader@*/
yann@402
  5572
+extern void ffi_call_STDCALL(void (*)(char *, extended_cif *),
yann@402
  5573
+			  /*@out@*/ extended_cif *,
yann@402
  5574
+			  unsigned, unsigned,
yann@402
  5575
+			  /*@out@*/ unsigned *,
yann@402
  5576
+			  void (*fn)());
yann@402
  5577
+/*@=declundef@*/
yann@402
  5578
+/*@=exportheader@*/
yann@402
  5579
+#endif /* X86_WIN32 */
yann@402
  5580
+
yann@402
  5581
 void ffi_call(/*@dependent@*/ ffi_cif *cif, 
yann@402
  5582
 	      void (*fn)(), 
yann@402
  5583
 	      /*@out@*/ void *rvalue, 
yann@402
  5584
@@ -180,6 +195,14 @@
yann@402
  5585
 		    cif->flags, ecif.rvalue, fn);
yann@402
  5586
       /*@=usedef@*/
yann@402
  5587
       break;
yann@402
  5588
+#ifdef X86_WIN32
yann@402
  5589
+    case FFI_STDCALL:
yann@402
  5590
+      /*@-usedef@*/
yann@402
  5591
+      ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes,
yann@402
  5592
+		    cif->flags, ecif.rvalue, fn);
yann@402
  5593
+      /*@=usedef@*/
yann@402
  5594
+      break;
yann@402
  5595
+#endif /* X86_WIN32 */
yann@402
  5596
     default:
yann@402
  5597
       FFI_ASSERT(0);
yann@402
  5598
       break;
yann@402
  5599
@@ -266,12 +289,10 @@
yann@402
  5600
 /*@=exportheader@*/
yann@402
  5601
 {
yann@402
  5602
   register unsigned int i;
yann@402
  5603
-  register int tmp;
yann@402
  5604
   register void **p_argv;
yann@402
  5605
   register char *argp;
yann@402
  5606
   register ffi_type **p_arg;
yann@402
  5607
 
yann@402
  5608
-  tmp = 0;
yann@402
  5609
   argp = stack;
yann@402
  5610
 
yann@402
  5611
   if ( cif->rtype->type == FFI_TYPE_STRUCT ) {
yann@402
  5612
@@ -281,13 +302,14 @@
yann@402
  5613
 
yann@402
  5614
   p_argv = avalue;
yann@402
  5615
 
yann@402
  5616
-  for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++)
yann@402
  5617
+  for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++)
yann@402
  5618
     {
yann@402
  5619
       size_t z;
yann@402
  5620
 
yann@402
  5621
       /* Align if necessary */
yann@402
  5622
-      if (((*p_arg)->alignment - 1) & (unsigned) argp)
yann@402
  5623
+      if (((*p_arg)->alignment - 1) & (unsigned) argp) {
yann@402
  5624
 	argp = (char *) ALIGN(argp, (*p_arg)->alignment);
yann@402
  5625
+      }
yann@402
  5626
 
yann@402
  5627
       z = (*p_arg)->size;
yann@402
  5628
 
yann@402
  5629
@@ -298,7 +320,7 @@
yann@402
  5630
       p_argv++;
yann@402
  5631
       argp += z;
yann@402
  5632
     }
yann@402
  5633
-
yann@402
  5634
+  
yann@402
  5635
   return;
yann@402
  5636
 }
yann@402
  5637
 
yann@402
  5638
@@ -449,6 +471,15 @@
yann@402
  5639
 	      /*@out@*/ unsigned *, 
yann@402
  5640
 	      void (*fn)());
yann@402
  5641
 
yann@402
  5642
+#ifdef X86_WIN32
yann@402
  5643
+extern void
yann@402
  5644
+ffi_call_STDCALL(void (*)(char *, extended_cif *),
yann@402
  5645
+	      /*@out@*/ extended_cif *,
yann@402
  5646
+	      unsigned, unsigned,
yann@402
  5647
+	      /*@out@*/ unsigned *,
yann@402
  5648
+	      void (*fn)());
yann@402
  5649
+#endif /* X86_WIN32 */
yann@402
  5650
+
yann@402
  5651
 void
yann@402
  5652
 ffi_raw_call(/*@dependent@*/ ffi_cif *cif, 
yann@402
  5653
 	     void (*fn)(), 
yann@402
  5654
@@ -483,6 +514,14 @@
yann@402
  5655
 		    cif->flags, ecif.rvalue, fn);
yann@402
  5656
       /*@=usedef@*/
yann@402
  5657
       break;
yann@402
  5658
+#ifdef X86_WIN32
yann@402
  5659
+    case FFI_STDCALL:
yann@402
  5660
+      /*@-usedef@*/
yann@402
  5661
+      ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes,
yann@402
  5662
+		    cif->flags, ecif.rvalue, fn);
yann@402
  5663
+      /*@=usedef@*/
yann@402
  5664
+      break;
yann@402
  5665
+#endif /* X86_WIN32 */
yann@402
  5666
     default:
yann@402
  5667
       FFI_ASSERT(0);
yann@402
  5668
       break;
yann@402
  5669
@@ -490,3 +529,5 @@
yann@402
  5670
 }
yann@402
  5671
 
yann@402
  5672
 #endif
yann@402
  5673
+
yann@402
  5674
+#endif /* __x86_64__  */
yann@402
  5675
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/ffi64.c gcc/libffi/src/x86/ffi64.c
yann@402
  5676
--- gcc-3.2.2.orig/libffi/src/x86/ffi64.c	Thu Jan  1 09:00:00 1970
yann@402
  5677
+++ gcc/libffi/src/x86/ffi64.c	Wed Jan 29 00:54:28 2003
yann@402
  5678
@@ -0,0 +1,706 @@
yann@402
  5679
+/* -----------------------------------------------------------------------
yann@402
  5680
+   ffi.c - Copyright (c) 2002  Bo Thorsen <bo@suse.de>
yann@402
  5681
+   
yann@402
  5682
+   x86-64 Foreign Function Interface 
yann@402
  5683
+
yann@402
  5684
+   Permission is hereby granted, free of charge, to any person obtaining
yann@402
  5685
+   a copy of this software and associated documentation files (the
yann@402
  5686
+   ``Software''), to deal in the Software without restriction, including
yann@402
  5687
+   without limitation the rights to use, copy, modify, merge, publish,
yann@402
  5688
+   distribute, sublicense, and/or sell copies of the Software, and to
yann@402
  5689
+   permit persons to whom the Software is furnished to do so, subject to
yann@402
  5690
+   the following conditions:
yann@402
  5691
+
yann@402
  5692
+   The above copyright notice and this permission notice shall be included
yann@402
  5693
+   in all copies or substantial portions of the Software.
yann@402
  5694
+
yann@402
  5695
+   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
yann@402
  5696
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
yann@402
  5697
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
yann@402
  5698
+   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
yann@402
  5699
+   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
yann@402
  5700
+   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
yann@402
  5701
+   OTHER DEALINGS IN THE SOFTWARE.
yann@402
  5702
+   ----------------------------------------------------------------------- */
yann@402
  5703
+
yann@402
  5704
+#include <ffi.h>
yann@402
  5705
+#include <ffi_common.h>
yann@402
  5706
+
yann@402
  5707
+#include <stdlib.h>
yann@402
  5708
+#include <stdarg.h>
yann@402
  5709
+
yann@402
  5710
+/* ffi_prep_args is called by the assembly routine once stack space
yann@402
  5711
+   has been allocated for the function's arguments */
yann@402
  5712
+
yann@402
  5713
+#ifdef __x86_64__
yann@402
  5714
+
yann@402
  5715
+#define MAX_GPR_REGS 6
yann@402
  5716
+#define MAX_SSE_REGS 8
yann@402
  5717
+typedef struct
yann@402
  5718
+{
yann@402
  5719
+  /* Registers for argument passing.  */
yann@402
  5720
+  long gpr[MAX_GPR_REGS];
yann@402
  5721
+  __int128_t sse[MAX_SSE_REGS];
yann@402
  5722
+
yann@402
  5723
+  /* Stack space for arguments.  */
yann@402
  5724
+  char argspace[0];
yann@402
  5725
+} stackLayout;
yann@402
  5726
+
yann@402
  5727
+/* All reference to register classes here is identical to the code in
yann@402
  5728
+   gcc/config/i386/i386.c. Do *not* change one without the other.  */
yann@402
  5729
+
yann@402
  5730
+/* Register class used for passing given 64bit part of the argument.
yann@402
  5731
+   These represent classes as documented by the PS ABI, with the exception
yann@402
  5732
+   of SSESF, SSEDF classes, that are basically SSE class, just gcc will
yann@402
  5733
+   use SF or DFmode move instead of DImode to avoid reformating penalties.
yann@402
  5734
+
yann@402
  5735
+   Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves
yann@402
  5736
+   whenever possible (upper half does contain padding).
yann@402
  5737
+ */
yann@402
  5738
+enum x86_64_reg_class
yann@402
  5739
+  {
yann@402
  5740
+    X86_64_NO_CLASS,
yann@402
  5741
+    X86_64_INTEGER_CLASS,
yann@402
  5742
+    X86_64_INTEGERSI_CLASS,
yann@402
  5743
+    X86_64_SSE_CLASS,
yann@402
  5744
+    X86_64_SSESF_CLASS,
yann@402
  5745
+    X86_64_SSEDF_CLASS,
yann@402
  5746
+    X86_64_SSEUP_CLASS,
yann@402
  5747
+    X86_64_X87_CLASS,
yann@402
  5748
+    X86_64_X87UP_CLASS,
yann@402
  5749
+    X86_64_MEMORY_CLASS
yann@402
  5750
+  };
yann@402
  5751
+
yann@402
  5752
+#define MAX_CLASSES 4
yann@402
  5753
+
yann@402
  5754
+/* x86-64 register passing implementation.  See x86-64 ABI for details.  Goal
yann@402
  5755
+   of this code is to classify each 8bytes of incoming argument by the register
yann@402
  5756
+   class and assign registers accordingly.  */
yann@402
  5757
+
yann@402
  5758
+/* Return the union class of CLASS1 and CLASS2.
yann@402
  5759
+   See the x86-64 PS ABI for details.  */
yann@402
  5760
+
yann@402
  5761
+static enum x86_64_reg_class
yann@402
  5762
+merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
yann@402
  5763
+{
yann@402
  5764
+  /* Rule #1: If both classes are equal, this is the resulting class.  */
yann@402
  5765
+  if (class1 == class2)
yann@402
  5766
+    return class1;
yann@402
  5767
+
yann@402
  5768
+  /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
yann@402
  5769
+     the other class.  */
yann@402
  5770
+  if (class1 == X86_64_NO_CLASS)
yann@402
  5771
+    return class2;
yann@402
  5772
+  if (class2 == X86_64_NO_CLASS)
yann@402
  5773
+    return class1;
yann@402
  5774
+
yann@402
  5775
+  /* Rule #3: If one of the classes is MEMORY, the result is MEMORY.  */
yann@402
  5776
+  if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
yann@402
  5777
+    return X86_64_MEMORY_CLASS;
yann@402
  5778
+
yann@402
  5779
+  /* Rule #4: If one of the classes is INTEGER, the result is INTEGER.  */
yann@402
  5780
+  if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
yann@402
  5781
+      || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
yann@402
  5782
+    return X86_64_INTEGERSI_CLASS;
yann@402
  5783
+  if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
yann@402
  5784
+      || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
yann@402
  5785
+    return X86_64_INTEGER_CLASS;
yann@402
  5786
+
yann@402
  5787
+  /* Rule #5: If one of the classes is X87 or X87UP class, MEMORY is used.  */
yann@402
  5788
+  if (class1 == X86_64_X87_CLASS || class1 == X86_64_X87UP_CLASS
yann@402
  5789
+      || class2 == X86_64_X87_CLASS || class2 == X86_64_X87UP_CLASS)
yann@402
  5790
+    return X86_64_MEMORY_CLASS;
yann@402
  5791
+
yann@402
  5792
+  /* Rule #6: Otherwise class SSE is used.  */
yann@402
  5793
+  return X86_64_SSE_CLASS;
yann@402
  5794
+}
yann@402
  5795
+
yann@402
  5796
+/* Classify the argument of type TYPE and mode MODE.
yann@402
  5797
+   CLASSES will be filled by the register class used to pass each word
yann@402
  5798
+   of the operand.  The number of words is returned.  In case the parameter
yann@402
  5799
+   should be passed in memory, 0 is returned. As a special case for zero
yann@402
  5800
+   sized containers, classes[0] will be NO_CLASS and 1 is returned.
yann@402
  5801
+
yann@402
  5802
+   See the x86-64 PS ABI for details.
yann@402
  5803
+*/
yann@402
  5804
+static int
yann@402
  5805
+classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
yann@402
  5806
+		   int *byte_offset)
yann@402
  5807
+{
yann@402
  5808
+  /* First, align to the right place.  */
yann@402
  5809
+  *byte_offset = ALIGN(*byte_offset, type->alignment);
yann@402
  5810
+
yann@402
  5811
+  switch (type->type)
yann@402
  5812
+    {
yann@402
  5813
+    case FFI_TYPE_UINT8:
yann@402
  5814
+    case FFI_TYPE_SINT8:
yann@402
  5815
+    case FFI_TYPE_UINT16:
yann@402
  5816
+    case FFI_TYPE_SINT16:
yann@402
  5817
+    case FFI_TYPE_UINT32:
yann@402
  5818
+    case FFI_TYPE_SINT32:
yann@402
  5819
+    case FFI_TYPE_UINT64:
yann@402
  5820
+    case FFI_TYPE_SINT64:
yann@402
  5821
+    case FFI_TYPE_POINTER:
yann@402
  5822
+      if (((*byte_offset) % 8 + type->size) <= 4)
yann@402
  5823
+	classes[0] = X86_64_INTEGERSI_CLASS;
yann@402
  5824
+      else
yann@402
  5825
+	classes[0] = X86_64_INTEGER_CLASS;
yann@402
  5826
+      return 1;
yann@402
  5827
+    case FFI_TYPE_FLOAT:
yann@402
  5828
+      if (((*byte_offset) % 8) == 0)
yann@402
  5829
+	classes[0] = X86_64_SSESF_CLASS;
yann@402
  5830
+      else
yann@402
  5831
+	classes[0] = X86_64_SSE_CLASS;
yann@402
  5832
+      return 1;
yann@402
  5833
+    case FFI_TYPE_DOUBLE:
yann@402
  5834
+      classes[0] = X86_64_SSEDF_CLASS;
yann@402
  5835
+      return 1;
yann@402
  5836
+    case FFI_TYPE_LONGDOUBLE:
yann@402
  5837
+      classes[0] = X86_64_X87_CLASS;
yann@402
  5838
+      classes[1] = X86_64_X87UP_CLASS;
yann@402
  5839
+      return 2;
yann@402
  5840
+    case FFI_TYPE_STRUCT:
yann@402
  5841
+      {
yann@402
  5842
+	const int UNITS_PER_WORD = 8;
yann@402
  5843
+	int words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
yann@402
  5844
+	ffi_type **ptr; 
yann@402
  5845
+	int i;
yann@402
  5846
+	enum x86_64_reg_class subclasses[MAX_CLASSES];
yann@402
  5847
+
yann@402
  5848
+	/* If the struct is larger than 16 bytes, pass it on the stack.  */
yann@402
  5849
+	if (type->size > 16)
yann@402
  5850
+	  return 0;
yann@402
  5851
+
yann@402
  5852
+	for (i = 0; i < words; i++)
yann@402
  5853
+	  classes[i] = X86_64_NO_CLASS;
yann@402
  5854
+
yann@402
  5855
+	/* Merge the fields of structure.  */
yann@402
  5856
+	for (ptr=type->elements; (*ptr)!=NULL; ptr++)
yann@402
  5857
+	  {
yann@402
  5858
+	    int num;
yann@402
  5859
+
yann@402
  5860
+	    num = classify_argument (*ptr, subclasses, byte_offset);
yann@402
  5861
+	    if (num == 0)
yann@402
  5862
+	      return 0;
yann@402
  5863
+	    for (i = 0; i < num; i++)
yann@402
  5864
+	      {
yann@402
  5865
+		int pos = *byte_offset / 8;
yann@402
  5866
+		classes[i + pos] =
yann@402
  5867
+		  merge_classes (subclasses[i], classes[i + pos]);
yann@402
  5868
+	      }
yann@402
  5869
+
yann@402
  5870
+	    if ((*ptr)->type != FFI_TYPE_STRUCT)
yann@402
  5871
+	      *byte_offset += (*ptr)->size;
yann@402
  5872
+	  }
yann@402
  5873
+
yann@402
  5874
+	/* Final merger cleanup.  */
yann@402
  5875
+	for (i = 0; i < words; i++)
yann@402
  5876
+	  {
yann@402
  5877
+	    /* If one class is MEMORY, everything should be passed in
yann@402
  5878
+	       memory.  */
yann@402
  5879
+	    if (classes[i] == X86_64_MEMORY_CLASS)
yann@402
  5880
+	      return 0;
yann@402
  5881
+
yann@402
  5882
+	    /* The X86_64_SSEUP_CLASS should be always preceded by
yann@402
  5883
+	       X86_64_SSE_CLASS.  */
yann@402
  5884
+	    if (classes[i] == X86_64_SSEUP_CLASS
yann@402
  5885
+		&& (i == 0 || classes[i - 1] != X86_64_SSE_CLASS))
yann@402
  5886
+	      classes[i] = X86_64_SSE_CLASS;
yann@402
  5887
+
yann@402
  5888
+	    /*  X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS.  */
yann@402
  5889
+	    if (classes[i] == X86_64_X87UP_CLASS
yann@402
  5890
+		&& (i == 0 || classes[i - 1] != X86_64_X87_CLASS))
yann@402
  5891
+	      classes[i] = X86_64_SSE_CLASS;
yann@402
  5892
+	  }
yann@402
  5893
+	return words;
yann@402
  5894
+      }
yann@402
  5895
+
yann@402
  5896
+    default:
yann@402
  5897
+      FFI_ASSERT(0);
yann@402
  5898
+    }
yann@402
  5899
+  return 0; /* Never reached.  */
yann@402
  5900
+}
yann@402
  5901
+
yann@402
  5902
+/* Examine the argument and return set number of register required in each
yann@402
  5903
+   class.  Return 0 iff parameter should be passed in memory.  */
yann@402
  5904
+static int
yann@402
  5905
+examine_argument (ffi_type *type, int in_return, int *int_nregs,int *sse_nregs)
yann@402
  5906
+{
yann@402
  5907
+  enum x86_64_reg_class class[MAX_CLASSES];
yann@402
  5908
+  int offset = 0;
yann@402
  5909
+  int n;
yann@402
  5910
+
yann@402
  5911
+  n = classify_argument (type, class, &offset);
yann@402
  5912
+
yann@402
  5913
+  if (n == 0)
yann@402
  5914
+    return 0;
yann@402
  5915
+
yann@402
  5916
+  *int_nregs = 0;
yann@402
  5917
+  *sse_nregs = 0;
yann@402
  5918
+  for (n--; n>=0; n--)
yann@402
  5919
+    switch (class[n])
yann@402
  5920
+      {
yann@402
  5921
+      case X86_64_INTEGER_CLASS:
yann@402
  5922
+      case X86_64_INTEGERSI_CLASS:
yann@402
  5923
+	(*int_nregs)++;
yann@402
  5924
+	break;
yann@402
  5925
+      case X86_64_SSE_CLASS:
yann@402
  5926
+      case X86_64_SSESF_CLASS:
yann@402
  5927
+      case X86_64_SSEDF_CLASS:
yann@402
  5928
+	(*sse_nregs)++;
yann@402
  5929
+	break;
yann@402
  5930
+      case X86_64_NO_CLASS:
yann@402
  5931
+      case X86_64_SSEUP_CLASS:
yann@402
  5932
+	break;
yann@402
  5933
+      case X86_64_X87_CLASS:
yann@402
  5934
+      case X86_64_X87UP_CLASS:
yann@402
  5935
+	if (!in_return)
yann@402
  5936
+	  return 0;
yann@402
  5937
+	break;
yann@402
  5938
+      default:
yann@402
  5939
+	abort ();
yann@402
  5940
+      }
yann@402
  5941
+  return 1;
yann@402
  5942
+}
yann@402
  5943
+
yann@402
  5944
+/* Functions to load floats and double to an SSE register placeholder.  */
yann@402
  5945
+extern void float2sse (float, __int128_t *);
yann@402
  5946
+extern void double2sse (double, __int128_t *);
yann@402
  5947
+extern void floatfloat2sse (void *, __int128_t *);
yann@402
  5948
+
yann@402
  5949
+/* Functions to put the floats and doubles back.  */
yann@402
  5950
+extern float sse2float (__int128_t *);
yann@402
  5951
+extern double sse2double (__int128_t *);
yann@402
  5952
+extern void sse2floatfloat(__int128_t *, void *);
yann@402
  5953
+
yann@402
  5954
+/*@-exportheader@*/
yann@402
  5955
+void
yann@402
  5956
+ffi_prep_args (stackLayout *stack, extended_cif *ecif)
yann@402
  5957
+/*@=exportheader@*/
yann@402
  5958
+{
yann@402
  5959
+  int gprcount, ssecount, i, g, s;
yann@402
  5960
+  void **p_argv;
yann@402
  5961
+  void *argp = &stack->argspace;
yann@402
  5962
+  ffi_type **p_arg;
yann@402
  5963
+
yann@402
  5964
+  /* First check if the return value should be passed in memory. If so,
yann@402
  5965
+     pass the pointer as the first argument.  */
yann@402
  5966
+  gprcount = ssecount = 0;
yann@402
  5967
+  if (ecif->cif->rtype->type != FFI_TYPE_VOID 
yann@402
  5968
+      && examine_argument (ecif->cif->rtype, 1, &g, &s) == 0)
yann@402
  5969
+    (void *)stack->gpr[gprcount++] = ecif->rvalue;
yann@402
  5970
+
yann@402
  5971
+  for (i=ecif->cif->nargs, p_arg=ecif->cif->arg_types, p_argv = ecif->avalue;
yann@402
  5972
+       i!=0; i--, p_arg++, p_argv++)
yann@402
  5973
+    {
yann@402
  5974
+      int in_register = 0;
yann@402
  5975
+
yann@402
  5976
+      switch ((*p_arg)->type)
yann@402
  5977
+	{
yann@402
  5978
+	case FFI_TYPE_SINT8:
yann@402
  5979
+	case FFI_TYPE_SINT16:
yann@402
  5980
+	case FFI_TYPE_SINT32:
yann@402
  5981
+	case FFI_TYPE_SINT64:
yann@402
  5982
+	case FFI_TYPE_UINT8:
yann@402
  5983
+	case FFI_TYPE_UINT16:
yann@402
  5984
+	case FFI_TYPE_UINT32:
yann@402
  5985
+	case FFI_TYPE_UINT64:
yann@402
  5986
+	case FFI_TYPE_POINTER:
yann@402
  5987
+	  if (gprcount < MAX_GPR_REGS)
yann@402
  5988
+	    {
yann@402
  5989
+	      stack->gpr[gprcount] = 0;
yann@402
  5990
+	      stack->gpr[gprcount++] = *(long long *)(*p_argv);
yann@402
  5991
+	      in_register = 1;
yann@402
  5992
+	    }
yann@402
  5993
+	  break;
yann@402
  5994
+
yann@402
  5995
+	case FFI_TYPE_FLOAT:
yann@402
  5996
+	  if (ssecount < MAX_SSE_REGS)
yann@402
  5997
+	    {
yann@402
  5998
+	      float2sse (*(float *)(*p_argv), &stack->sse[ssecount++]);
yann@402
  5999
+	      in_register = 1;
yann@402
  6000
+	    }
yann@402
  6001
+	  break;
yann@402
  6002
+
yann@402
  6003
+	case FFI_TYPE_DOUBLE:
yann@402
  6004
+	  if (ssecount < MAX_SSE_REGS)
yann@402
  6005
+	    {
yann@402
  6006
+	      double2sse (*(double *)(*p_argv), &stack->sse[ssecount++]);
yann@402
  6007
+	      in_register = 1;
yann@402
  6008
+	    }
yann@402
  6009
+	  break;
yann@402
  6010
+	}
yann@402
  6011
+
yann@402
  6012
+      if (in_register)
yann@402
  6013
+	continue;
yann@402
  6014
+
yann@402
  6015
+      /* Either all places in registers where filled, or this is a
yann@402
  6016
+	 type that potentially goes into a memory slot.  */
yann@402
  6017
+      if (examine_argument (*p_arg, 0, &g, &s) == 0
yann@402
  6018
+	  || gprcount + g > MAX_GPR_REGS || ssecount + s > MAX_SSE_REGS)
yann@402
  6019
+	{
yann@402
  6020
+	  /* Pass this argument in memory.  */
yann@402
  6021
+	  argp = (void *)ALIGN(argp, (*p_arg)->alignment);
yann@402
  6022
+	  memcpy (argp, *p_argv, (*p_arg)->size);
yann@402
  6023
+	  argp += (*p_arg)->size;
yann@402
  6024
+	}
yann@402
  6025
+      else
yann@402
  6026
+	{
yann@402
  6027
+	  /* All easy cases are eliminated. Now fire the big guns.  */
yann@402
  6028
+
yann@402
  6029
+	  enum x86_64_reg_class classes[MAX_CLASSES];
yann@402
  6030
+	  int offset = 0, j, num;
yann@402
  6031
+	  void *a;
yann@402
  6032
+
yann@402
  6033
+	  num = classify_argument (*p_arg, classes, &offset);
yann@402
  6034
+	  for (j=0, a=*p_argv; j<num; j++, a+=8)
yann@402
  6035
+	    {
yann@402
  6036
+	      switch (classes[j])
yann@402
  6037
+		{
yann@402
  6038
+		case X86_64_INTEGER_CLASS:
yann@402
  6039
+		case X86_64_INTEGERSI_CLASS:
yann@402
  6040
+		  stack->gpr[gprcount++] = *(long long *)a;
yann@402
  6041
+		  break;
yann@402
  6042
+		case X86_64_SSE_CLASS:
yann@402
  6043
+		  floatfloat2sse (a, &stack->sse[ssecount++]);
yann@402
  6044
+		  break;
yann@402
  6045
+		case X86_64_SSESF_CLASS:
yann@402
  6046
+		  float2sse (*(float *)a, &stack->sse[ssecount++]);
yann@402
  6047
+		  break;
yann@402
  6048
+		case X86_64_SSEDF_CLASS:
yann@402
  6049
+		  double2sse (*(double *)a, &stack->sse[ssecount++]);
yann@402
  6050
+		  break;
yann@402
  6051
+		default:
yann@402
  6052
+		  abort();
yann@402
  6053
+		}
yann@402
  6054
+	    }
yann@402
  6055
+	}
yann@402
  6056
+    }
yann@402
  6057
+}
yann@402
  6058
+
yann@402
  6059
+/* Perform machine dependent cif processing.  */
yann@402
  6060
+ffi_status
yann@402
  6061
+ffi_prep_cif_machdep (ffi_cif *cif)
yann@402
  6062
+{
yann@402
  6063
+  int gprcount, ssecount, i, g, s;
yann@402
  6064
+
yann@402
  6065
+  gprcount = ssecount = 0;
yann@402
  6066
+
yann@402
  6067
+  /* Reset the byte count. We handle this size estimation here.  */
yann@402
  6068
+  cif->bytes = 0;
yann@402
  6069
+
yann@402
  6070
+  /* If the return value should be passed in memory, pass the pointer
yann@402
  6071
+     as the first argument. The actual memory isn't allocated here.  */
yann@402
  6072
+  if (cif->rtype->type != FFI_TYPE_VOID 
yann@402
  6073
+      && examine_argument (cif->rtype, 1, &g, &s) == 0)
yann@402
  6074
+    gprcount = 1;
yann@402
  6075
+
yann@402
  6076
+  /* Go over all arguments and determine the way they should be passed.
yann@402
  6077
+     If it's in a register and there is space for it, let that be so. If
yann@402
  6078
+     not, add it's size to the stack byte count.  */
yann@402
  6079
+  for (i=0; i<cif->nargs; i++)
yann@402
  6080
+    {
yann@402
  6081
+      if (examine_argument (cif->arg_types[i], 0, &g, &s) == 0
yann@402
  6082
+	  || gprcount + g > MAX_GPR_REGS || ssecount + s > MAX_SSE_REGS)
yann@402
  6083
+	{
yann@402
  6084
+	  /* This is passed in memory. First align to the basic type.  */
yann@402
  6085
+	  cif->bytes = ALIGN(cif->bytes, cif->arg_types[i]->alignment);
yann@402
  6086
+
yann@402
  6087
+	  /* Stack arguments are *always* at least 8 byte aligned.  */
yann@402
  6088
+	  cif->bytes = ALIGN(cif->bytes, 8);
yann@402
  6089
+
yann@402
  6090
+	  /* Now add the size of this argument.  */
yann@402
  6091
+	  cif->bytes += cif->arg_types[i]->size;
yann@402
  6092
+	}
yann@402
  6093
+      else
yann@402
  6094
+	{
yann@402
  6095
+	  gprcount += g;
yann@402
  6096
+	  ssecount += s;
yann@402
  6097
+	}
yann@402
  6098
+    }
yann@402
  6099
+
yann@402
  6100
+  /* Set the flag for the closures return.  */
yann@402
  6101
+    switch (cif->rtype->type)
yann@402
  6102
+    {
yann@402
  6103
+    case FFI_TYPE_VOID:
yann@402
  6104
+    case FFI_TYPE_STRUCT:
yann@402
  6105
+    case FFI_TYPE_SINT64:
yann@402
  6106
+    case FFI_TYPE_FLOAT:
yann@402
  6107
+    case FFI_TYPE_DOUBLE:
yann@402
  6108
+    case FFI_TYPE_LONGDOUBLE:
yann@402
  6109
+      cif->flags = (unsigned) cif->rtype->type;
yann@402
  6110
+      break;
yann@402
  6111
+
yann@402
  6112
+    case FFI_TYPE_UINT64:
yann@402
  6113
+      cif->flags = FFI_TYPE_SINT64;
yann@402
  6114
+      break;
yann@402
  6115
+
yann@402
  6116
+    default:
yann@402
  6117
+      cif->flags = FFI_TYPE_INT;
yann@402
  6118
+      break;
yann@402
  6119
+    }
yann@402
  6120
+
yann@402
  6121
+  return FFI_OK;
yann@402
  6122
+}
yann@402
  6123
+
yann@402
  6124
+typedef struct
yann@402
  6125
+{
yann@402
  6126
+  long gpr[2];
yann@402
  6127
+  __int128_t sse[2];
yann@402
  6128
+  long double st0;
yann@402
  6129
+} return_value;
yann@402
  6130
+
yann@402
  6131
+void
yann@402
  6132
+ffi_fill_return_value (return_value *rv, extended_cif *ecif)
yann@402
  6133
+{
yann@402
  6134
+  enum x86_64_reg_class classes[MAX_CLASSES];
yann@402
  6135
+  int i = 0, num;
yann@402
  6136
+  long *gpr = rv->gpr;
yann@402
  6137
+  __int128_t *sse = rv->sse;
yann@402
  6138
+  signed char sc;
yann@402
  6139
+  signed short ss;
yann@402
  6140
+
yann@402
  6141
+  /* This is needed because of the way x86-64 handles signed short
yann@402
  6142
+     integers.  */
yann@402
  6143
+  switch (ecif->cif->rtype->type)
yann@402
  6144
+    {
yann@402
  6145
+    case FFI_TYPE_SINT8:
yann@402
  6146
+      sc = *(signed char *)gpr;
yann@402
  6147
+      *(long long *)ecif->rvalue = (long long)sc;
yann@402
  6148
+      return;
yann@402
  6149
+    case FFI_TYPE_SINT16:
yann@402
  6150
+      ss = *(signed short *)gpr;
yann@402
  6151
+      *(long long *)ecif->rvalue = (long long)ss;
yann@402
  6152
+      return;
yann@402
  6153
+    default:
yann@402
  6154
+      /* Just continue.  */
yann@402
  6155
+      ;
yann@402
  6156
+    }
yann@402
  6157
+
yann@402
  6158
+  num = classify_argument (ecif->cif->rtype, classes, &i);
yann@402
  6159
+
yann@402
  6160
+  if (num == 0)
yann@402
  6161
+    /* Return in memory.  */
yann@402
  6162
+    ecif->rvalue = (void *) rv->gpr[0];
yann@402
  6163
+  else if (num == 2 && classes[0] == X86_64_X87_CLASS &&
yann@402
  6164
+	classes[1] == X86_64_X87UP_CLASS)
yann@402
  6165
+    /* This is a long double (this is easiest to handle this way instead
yann@402
  6166
+       of an eightbyte at a time as in the loop below.  */
yann@402
  6167
+    *((long double *)ecif->rvalue) = rv->st0;
yann@402
  6168
+  else
yann@402
  6169
+    {
yann@402
  6170
+      void *a;
yann@402
  6171
+
yann@402
  6172
+      for (i=0, a=ecif->rvalue; i<num; i++, a+=8)
yann@402
  6173
+	{
yann@402
  6174
+	  switch (classes[i])
yann@402
  6175
+	    {
yann@402
  6176
+	    case X86_64_INTEGER_CLASS:
yann@402
  6177
+	    case X86_64_INTEGERSI_CLASS:
yann@402
  6178
+	      *(long long *)a = *gpr;
yann@402
  6179
+	      gpr++;
yann@402
  6180
+	      break;
yann@402
  6181
+	    case X86_64_SSE_CLASS:
yann@402
  6182
+	      sse2floatfloat (sse++, a);
yann@402
  6183
+	      break;
yann@402
  6184
+	    case X86_64_SSESF_CLASS:
yann@402
  6185
+	      *(float *)a = sse2float (sse++);
yann@402
  6186
+	      break;
yann@402
  6187
+	    case X86_64_SSEDF_CLASS:
yann@402
  6188
+	      *(double *)a = sse2double (sse++);
yann@402
  6189
+	      break;
yann@402
  6190
+	    default:
yann@402
  6191
+	      abort();
yann@402
  6192
+	    }
yann@402
  6193
+	}
yann@402
  6194
+    }
yann@402
  6195
+}
yann@402
  6196
+
yann@402
  6197
+/*@-declundef@*/
yann@402
  6198
+/*@-exportheader@*/
yann@402
  6199
+extern void ffi_call_UNIX64(void (*)(stackLayout *, extended_cif *),
yann@402
  6200
+			    void (*) (return_value *, extended_cif *),
yann@402
  6201
+			    /*@out@*/ extended_cif *, 
yann@402
  6202
+			    unsigned, /*@out@*/ unsigned *, void (*fn)());
yann@402
  6203
+/*@=declundef@*/
yann@402
  6204
+/*@=exportheader@*/
yann@402
  6205
+
yann@402
  6206
+void ffi_call(/*@dependent@*/ ffi_cif *cif, 
yann@402
  6207
+	      void (*fn)(), 
yann@402
  6208
+	      /*@out@*/ void *rvalue, 
yann@402
  6209
+	      /*@dependent@*/ void **avalue)
yann@402
  6210
+{
yann@402
  6211
+  extended_cif ecif;
yann@402
  6212
+  int dummy;
yann@402
  6213
+
yann@402
  6214
+  ecif.cif = cif;
yann@402
  6215
+  ecif.avalue = avalue;
yann@402
  6216
+  
yann@402
  6217
+  /* If the return value is a struct and we don't have a return	*/
yann@402
  6218
+  /* value address then we need to make one		        */
yann@402
  6219
+
yann@402
  6220
+  if ((rvalue == NULL) && 
yann@402
  6221
+      (examine_argument (cif->rtype, 1, &dummy, &dummy) == 0))
yann@402
  6222
+    {
yann@402
  6223
+      /*@-sysunrecog@*/
yann@402
  6224
+      ecif.rvalue = alloca(cif->rtype->size);
yann@402
  6225
+      /*@=sysunrecog@*/
yann@402
  6226
+    }
yann@402
  6227
+  else
yann@402
  6228
+    ecif.rvalue = rvalue;
yann@402
  6229
+    
yann@402
  6230
+  /* Stack must always be 16byte aligned. Make it so.  */
yann@402
  6231
+  cif->bytes = ALIGN(cif->bytes, 16);
yann@402
  6232
+  
yann@402
  6233
+  switch (cif->abi) 
yann@402
  6234
+    {
yann@402
  6235
+    case FFI_SYSV:
yann@402
  6236
+      /* Calling 32bit code from 64bit is not possible  */
yann@402
  6237
+      FFI_ASSERT(0);
yann@402
  6238
+      break;
yann@402
  6239
+
yann@402
  6240
+    case FFI_UNIX64:
yann@402
  6241
+      /*@-usedef@*/
yann@402
  6242
+      ffi_call_UNIX64 (ffi_prep_args, ffi_fill_return_value, &ecif,
yann@402
  6243
+		       cif->bytes, ecif.rvalue, fn);
yann@402
  6244
+      /*@=usedef@*/
yann@402
  6245
+      break;
yann@402
  6246
+
yann@402
  6247
+    default:
yann@402
  6248
+      FFI_ASSERT(0);
yann@402
  6249
+      break;
yann@402
  6250
+    }
yann@402
  6251
+}
yann@402
  6252
+
yann@402
  6253
+extern void ffi_closure_UNIX64(void);
yann@402
  6254
+
yann@402
  6255
+ffi_status
yann@402
  6256
+ffi_prep_closure (ffi_closure* closure,
yann@402
  6257
+		  ffi_cif* cif,
yann@402
  6258
+		  void (*fun)(ffi_cif*, void*, void**, void*),
yann@402
  6259
+		  void *user_data)
yann@402
  6260
+{
yann@402
  6261
+  volatile unsigned short *tramp;
yann@402
  6262
+
yann@402
  6263
+  /* FFI_ASSERT (cif->abi == FFI_OSF);  */
yann@402
  6264
+
yann@402
  6265
+  tramp = (volatile unsigned short *) &closure->tramp[0];
yann@402
  6266
+  tramp[0] = 0xbb49;		/* mov <code>, %r11	*/
yann@402
  6267
+  tramp[5] = 0xba49;		/* mov <data>, %r10	*/
yann@402
  6268
+  tramp[10] = 0xff49;		/* jmp *%r11	*/
yann@402
  6269
+  tramp[11] = 0x00e3;
yann@402
  6270
+  *(void * volatile *) &tramp[1] = ffi_closure_UNIX64;
yann@402
  6271
+  *(void * volatile *) &tramp[6] = closure;
yann@402
  6272
+
yann@402
  6273
+  closure->cif = cif;
yann@402
  6274
+  closure->fun = fun;
yann@402
  6275
+  closure->user_data = user_data;
yann@402
  6276
+
yann@402
  6277
+  return FFI_OK;
yann@402
  6278
+}
yann@402
  6279
+
yann@402
  6280
+int
yann@402
  6281
+ffi_closure_UNIX64_inner(ffi_closure *closure, va_list l, void *rp)
yann@402
  6282
+{
yann@402
  6283
+  ffi_cif *cif;
yann@402
  6284
+  void **avalue;
yann@402
  6285
+  ffi_type **arg_types;
yann@402
  6286
+  long i, avn, argn;
yann@402
  6287
+
yann@402
  6288
+  cif = closure->cif;
yann@402
  6289
+  avalue = alloca(cif->nargs * sizeof(void *));
yann@402
  6290
+
yann@402
  6291
+  argn = 0;
yann@402
  6292
+
yann@402
  6293
+  i = 0;
yann@402
  6294
+  avn = cif->nargs;
yann@402
  6295
+  arg_types = cif->arg_types;
yann@402
  6296
+  
yann@402
  6297
+  /* Grab the addresses of the arguments from the stack frame.  */
yann@402
  6298
+  while (i < avn)
yann@402
  6299
+    {
yann@402
  6300
+      switch (arg_types[i]->type)
yann@402
  6301
+	{
yann@402
  6302
+	case FFI_TYPE_SINT8:
yann@402
  6303
+	case FFI_TYPE_UINT8:
yann@402
  6304
+	case FFI_TYPE_SINT16:
yann@402
  6305
+	case FFI_TYPE_UINT16:
yann@402
  6306
+	case FFI_TYPE_SINT32:
yann@402
  6307
+	case FFI_TYPE_UINT32:
yann@402
  6308
+	case FFI_TYPE_SINT64:
yann@402
  6309
+	case FFI_TYPE_UINT64:
yann@402
  6310
+	case FFI_TYPE_POINTER:
yann@402
  6311
+	  {
yann@402
  6312
+	    if (l->gp_offset > 48-8)
yann@402
  6313
+	      {
yann@402
  6314
+		avalue[i] = l->overflow_arg_area;
yann@402
  6315
+		l->overflow_arg_area = (char *)l->overflow_arg_area + 8;
yann@402
  6316
+	      }
yann@402
  6317
+	    else
yann@402
  6318
+	      {
yann@402
  6319
+		avalue[i] = (char *)l->reg_save_area + l->gp_offset;
yann@402
  6320
+		l->gp_offset += 8;
yann@402
  6321
+	      }
yann@402
  6322
+	  }
yann@402
  6323
+	  break;
yann@402
  6324
+
yann@402
  6325
+	case FFI_TYPE_STRUCT:
yann@402
  6326
+	  /* FIXME  */
yann@402
  6327
+	  FFI_ASSERT(0);
yann@402
  6328
+	  break;
yann@402
  6329
+
yann@402
  6330
+	case FFI_TYPE_DOUBLE:
yann@402
  6331
+	  {
yann@402
  6332
+	    if (l->fp_offset > 176-16)
yann@402
  6333
+	      {
yann@402
  6334
+		avalue[i] = l->overflow_arg_area;
yann@402
  6335
+		l->overflow_arg_area = (char *)l->overflow_arg_area + 8;
yann@402
  6336
+	      }
yann@402
  6337
+	    else
yann@402
  6338
+	      {
yann@402
  6339
+		avalue[i] = (char *)l->reg_save_area + l->fp_offset;
yann@402
  6340
+		l->fp_offset += 16;
yann@402
  6341
+	      }
yann@402
  6342
+	  }
yann@402
  6343
+#if DEBUG_FFI
yann@402
  6344
+	  fprintf (stderr, "double arg %d = %g\n", i, *(double *)avalue[i]);
yann@402
  6345
+#endif
yann@402
  6346
+	  break;
yann@402
  6347
+	  
yann@402
  6348
+	case FFI_TYPE_FLOAT:
yann@402
  6349
+	  {
yann@402
  6350
+	    if (l->fp_offset > 176-16)
yann@402
  6351
+	      {
yann@402
  6352
+		avalue[i] = l->overflow_arg_area;
yann@402
  6353
+		l->overflow_arg_area = (char *)l->overflow_arg_area + 8;
yann@402
  6354
+	      }
yann@402
  6355
+	    else
yann@402
  6356
+	      {
yann@402
  6357
+		avalue[i] = (char *)l->reg_save_area + l->fp_offset;
yann@402
  6358
+		l->fp_offset += 16;
yann@402
  6359
+	      }
yann@402
  6360
+	  }
yann@402
  6361
+#if DEBUG_FFI
yann@402
  6362
+	  fprintf (stderr, "float arg %d = %g\n", i, *(float *)avalue[i]);
yann@402
  6363
+#endif
yann@402
  6364
+	  break;
yann@402
  6365
+	  
yann@402
  6366
+	default:
yann@402
  6367
+	  FFI_ASSERT(0);
yann@402
  6368
+	}
yann@402
  6369
+
yann@402
  6370
+      argn += ALIGN(arg_types[i]->size, SIZEOF_ARG) / SIZEOF_ARG;
yann@402
  6371
+      i++;
yann@402
  6372
+    }
yann@402
  6373
+
yann@402
  6374
+  /* Invoke the closure.  */
yann@402
  6375
+  (closure->fun) (cif, rp, avalue, closure->user_data);
yann@402
  6376
+
yann@402
  6377
+  /* FIXME: Structs not supported.  */
yann@402
  6378
+  FFI_ASSERT(cif->rtype->type != FFI_TYPE_STRUCT);
yann@402
  6379
+
yann@402
  6380
+  /* Tell ffi_closure_UNIX64 how to perform return type promotions.  */
yann@402
  6381
+
yann@402
  6382
+  return cif->rtype->type;
yann@402
  6383
+}
yann@402
  6384
+#endif /* ifndef __x86_64__ */
yann@402
  6385
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/sysv.S gcc/libffi/src/x86/sysv.S
yann@402
  6386
--- gcc-3.2.2.orig/libffi/src/x86/sysv.S	Tue Jul 17 02:10:53 2001
yann@402
  6387
+++ gcc/libffi/src/x86/sysv.S	Fri Jul 19 08:08:31 2002
yann@402
  6388
@@ -1,5 +1,5 @@
yann@402
  6389
 /* -----------------------------------------------------------------------
yann@402
  6390
-   sysv.S - Copyright (c) 1996, 1998, 2001  Cygnus Solutions
yann@402
  6391
+   sysv.S - Copyright (c) 1996, 1998, 2001, 2002  Cygnus Solutions
yann@402
  6392
    
yann@402
  6393
    X86 Foreign Function Interface 
yann@402
  6394
 
yann@402
  6395
@@ -23,6 +23,8 @@
yann@402
  6396
    OTHER DEALINGS IN THE SOFTWARE.
yann@402
  6397
    ----------------------------------------------------------------------- */
yann@402
  6398
 
yann@402
  6399
+#ifndef __x86_64__
yann@402
  6400
+
yann@402
  6401
 #define LIBFFI_ASM	
yann@402
  6402
 #include <ffi.h>
yann@402
  6403
 
yann@402
  6404
@@ -163,3 +165,5 @@
yann@402
  6405
 	.align 4
yann@402
  6406
 .LEFDE1:
yann@402
  6407
 	.set	.LLFDE1,.LEFDE1-.LSFDE1
yann@402
  6408
+
yann@402
  6409
+#endif /* ifndef __x86_64__ */
yann@402
  6410
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/unix64.S gcc/libffi/src/x86/unix64.S
yann@402
  6411
--- gcc-3.2.2.orig/libffi/src/x86/unix64.S	Thu Jan  1 09:00:00 1970
yann@402
  6412
+++ gcc/libffi/src/x86/unix64.S	Wed Jan 29 00:54:28 2003
yann@402
  6413
@@ -0,0 +1,302 @@
yann@402
  6414
+/* -----------------------------------------------------------------------
yann@402
  6415
+   unix64.S - Copyright (c) 2002  Bo Thorsen <bo@suse.de>
yann@402
  6416
+
yann@402
  6417
+   x86-64 Foreign Function Interface 
yann@402
  6418
+
yann@402
  6419
+   Permission is hereby granted, free of charge, to any person obtaining
yann@402
  6420
+   a copy of this software and associated documentation files (the
yann@402
  6421
+   ``Software''), to deal in the Software without restriction, including
yann@402
  6422
+   without limitation the rights to use, copy, modify, merge, publish,
yann@402
  6423
+   distribute, sublicense, and/or sell copies of the Software, and to
yann@402
  6424
+   permit persons to whom the Software is furnished to do so, subject to
yann@402
  6425
+   the following conditions:
yann@402
  6426
+
yann@402
  6427
+   The above copyright notice and this permission notice shall be included
yann@402
  6428
+   in all copies or substantial portions of the Software.
yann@402
  6429
+
yann@402
  6430
+   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
yann@402
  6431
+   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
yann@402
  6432
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
yann@402
  6433
+   IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
yann@402
  6434
+   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
yann@402
  6435
+   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
yann@402
  6436
+   OTHER DEALINGS IN THE SOFTWARE.
yann@402
  6437
+   ----------------------------------------------------------------------- */
yann@402
  6438
+
yann@402
  6439
+#ifdef __x86_64__
yann@402
  6440
+#define LIBFFI_ASM	
yann@402
  6441
+#include <ffi.h>
yann@402
  6442
+
yann@402
  6443
+	.section	.rodata
yann@402
  6444
+.LC0:
yann@402
  6445
+	.string	"asm in progress %lld\n"
yann@402
  6446
+.LC1:
yann@402
  6447
+	.string	"asm in progress\n"
yann@402
  6448
+.text
yann@402
  6449
+	.align	2
yann@402
  6450
+.globl ffi_call_UNIX64
yann@402
  6451
+        .type	ffi_call_UNIX64,@function
yann@402
  6452
+
yann@402
  6453
+ffi_call_UNIX64:
yann@402
  6454
+.LFB1:
yann@402
  6455
+        pushq	%rbp
yann@402
  6456
+.LCFI0:
yann@402
  6457
+        movq	%rsp, %rbp
yann@402
  6458
+.LCFI1:
yann@402
  6459
+	/* Save all arguments */
yann@402
  6460
+	subq	$48, %rsp
yann@402
  6461
+.LCFI2:
yann@402
  6462
+	movq	%rdi, -8(%rbp)		/* ffi_prep_args	 */
yann@402
  6463
+	movq	%rsi, -16(%rbp)		/* ffi_fill_return_value */
yann@402
  6464
+	movq	%rdx, -24(%rbp)		/* ecif			 */
yann@402
  6465
+	movq	%rcx, -32(%rbp)		/* cif->bytes		 */
yann@402
  6466
+	movq	%r8, -40(%rbp)		/* ecif.rvalue		 */
yann@402
  6467
+	movq	%r9, -48(%rbp)		/* fn			 */
yann@402
  6468
+
yann@402
  6469
+	/* Make room for all of the new args and the register args */
yann@402
  6470
+	addl	$176, %ecx
yann@402
  6471
+.LCFI3:
yann@402
  6472
+	subq	%rcx, %rsp
yann@402
  6473
+.LCFI4:
yann@402
  6474
+	/* Setup the call to ffi_prep_args.  */
yann@402
  6475
+	movq	%rdi, %rax		/* &ffi_prep_args	*/
yann@402
  6476
+	movq	%rsp, %rdi		/* stackLayout		*/
yann@402
  6477
+	movq	%rdx, %rsi		/* ecif			*/
yann@402
  6478
+	call	*%rax			/* ffi_prep_args(stackLayout, ecif);*/ 
yann@402
  6479
+
yann@402
  6480
+	/* ffi_prep_args have put all the register contents into the  */
yann@402
  6481
+	/* stackLayout struct. Now put the register values in place.  */
yann@402
  6482
+	movq	(%rsp), %rdi
yann@402
  6483
+	movq	8(%rsp), %rsi
yann@402
  6484
+	movq	16(%rsp), %rdx
yann@402
  6485
+	movq	24(%rsp), %rcx
yann@402
  6486
+	movq	32(%rsp), %r8
yann@402
  6487
+	movq	40(%rsp), %r9
yann@402
  6488
+	movaps	48(%rsp), %xmm0
yann@402
  6489
+	movaps	64(%rsp), %xmm1
yann@402
  6490
+	movaps	80(%rsp), %xmm2
yann@402
  6491
+	movaps	96(%rsp), %xmm3
yann@402
  6492
+	movaps	112(%rsp), %xmm4
yann@402
  6493
+	movaps	128(%rsp), %xmm5
yann@402
  6494
+	movaps	144(%rsp), %xmm6
yann@402
  6495
+	movaps	160(%rsp), %xmm7
yann@402
  6496
+
yann@402
  6497
+	/* Remove space for stackLayout so stack arguments are placed
yann@402
  6498
+	   correctly for the call.  */
yann@402
  6499
+.LCFI5:
yann@402
  6500
+	addq	$176, %rsp
yann@402
  6501
+.LCFI6:
yann@402
  6502
+	/* Call the user function.  */
yann@402
  6503
+	call	*-48(%rbp)
yann@402
  6504
+
yann@402
  6505
+	/* Make stack space for the return_value struct.  */
yann@402
  6506
+	subq	$64, %rsp
yann@402
  6507
+
yann@402
  6508
+	/* Fill in all potential return values to this struct.  */
yann@402
  6509
+	movq	%rax, (%rsp)
yann@402
  6510
+	movq	%rdx, 8(%rsp)
yann@402
  6511
+	movaps	%xmm0, 16(%rsp)
yann@402
  6512
+	movaps	%xmm1, 32(%rsp)
yann@402
  6513
+	fstpt	48(%rsp)
yann@402
  6514
+
yann@402
  6515
+	/* Now call ffi_fill_return_value.  */
yann@402
  6516
+	movq	%rsp, %rdi		/* struct return_value	  */
yann@402
  6517
+	movq	-24(%rbp), %rsi		/* ecif			  */
yann@402
  6518
+	movq	-16(%rbp), %rax		/* &ffi_fill_return_value */
yann@402
  6519
+	call	*%rax			/* call it		  */
yann@402
  6520
+
yann@402
  6521
+	/* And the work is done.  */
yann@402
  6522
+        leave
yann@402
  6523
+        ret
yann@402
  6524
+.LFE1:
yann@402
  6525
+.ffi_call_UNIX64_end:
yann@402
  6526
+        .size    ffi_call_UNIX64,.ffi_call_UNIX64_end-ffi_call_UNIX64
yann@402
  6527
+
yann@402
  6528
+.text
yann@402
  6529
+	.align	2
yann@402
  6530
+.globl float2sse
yann@402
  6531
+        .type	float2sse,@function
yann@402
  6532
+float2sse:
yann@402
  6533
+	/* Save the contents of this sse-float in a pointer.  */
yann@402
  6534
+	movaps	%xmm0, (%rdi)
yann@402
  6535
+	ret
yann@402
  6536
+
yann@402
  6537
+	.align	2
yann@402
  6538
+.globl floatfloat2sse
yann@402
  6539
+        .type	floatfloat2sse,@function
yann@402
  6540
+floatfloat2sse:
yann@402
  6541
+	/* Save the contents of these two sse-floats in a pointer.  */
yann@402
  6542
+	movq	(%rdi), %xmm0
yann@402
  6543
+	movaps	%xmm0, (%rsi)
yann@402
  6544
+	ret
yann@402
  6545
+
yann@402
  6546
+	.align	2
yann@402
  6547
+.globl double2sse
yann@402
  6548
+        .type	double2sse,@function
yann@402
  6549
+double2sse:
yann@402
  6550
+	/* Save the contents of this sse-double in a pointer.  */
yann@402
  6551
+	movaps	%xmm0, (%rdi)
yann@402
  6552
+	ret
yann@402
  6553
+
yann@402
  6554
+	.align	2
yann@402
  6555
+.globl sse2float
yann@402
  6556
+        .type	sse2float,@function
yann@402
  6557
+sse2float:
yann@402
  6558
+	/* Save the contents of this sse-float in a pointer.  */
yann@402
  6559
+	movaps	(%rdi), %xmm0
yann@402
  6560
+	ret
yann@402
  6561
+
yann@402
  6562
+	.align	2
yann@402
  6563
+.globl sse2double
yann@402
  6564
+        .type	sse2double,@function
yann@402
  6565
+sse2double:
yann@402
  6566
+	/* Save the contents of this pointer in a sse-double.  */
yann@402
  6567
+	movaps	(%rdi), %xmm0
yann@402
  6568
+	ret
yann@402
  6569
+
yann@402
  6570
+	.align	2
yann@402
  6571
+.globl sse2floatfloat
yann@402
  6572
+        .type	sse2floatfloat,@function
yann@402
  6573
+sse2floatfloat:
yann@402
  6574
+	/* Save the contents of this pointer in two sse-floats.  */
yann@402
  6575
+	movaps	(%rdi), %xmm0
yann@402
  6576
+	movq	%xmm0, (%rsi)
yann@402
  6577
+	ret
yann@402
  6578
+
yann@402
  6579
+	.align	2
yann@402
  6580
+.globl ffi_closure_UNIX64
yann@402
  6581
+        .type	ffi_closure_UNIX64,@function
yann@402
  6582
+
yann@402
  6583
+ffi_closure_UNIX64:
yann@402
  6584
+.LFB2:
yann@402
  6585
+        pushq   %rbp
yann@402
  6586
+.LCFI10:
yann@402
  6587
+        movq    %rsp, %rbp
yann@402
  6588
+.LCFI11:
yann@402
  6589
+        subq    $240, %rsp
yann@402
  6590
+.LCFI12:
yann@402
  6591
+	movq	%rdi, -176(%rbp)
yann@402
  6592
+        movq    %rsi, -168(%rbp)
yann@402
  6593
+        movq    %rdx, -160(%rbp)
yann@402
  6594
+        movq    %rcx, -152(%rbp)
yann@402
  6595
+        movq    %r8, -144(%rbp)
yann@402
  6596
+        movq    %r9, -136(%rbp)
yann@402
  6597
+        /* FIXME: We can avoid all this stashing of XMM registers by
yann@402
  6598
+	   (in ffi_prep_closure) computing the number of
yann@402
  6599
+	   floating-point args and moving it into %rax before calling
yann@402
  6600
+	   this function.  Once this is done, uncomment the next few
yann@402
  6601
+	   lines and only the essential XMM registers will be written
yann@402
  6602
+	   to memory.  This is a significant saving.  */
yann@402
  6603
+/*         movzbl  %al, %eax  */
yann@402
  6604
+/*         movq    %rax, %rdx */
yann@402
  6605
+/*         leaq    0(,%rdx,4), %rax */
yann@402
  6606
+/*         leaq    2f(%rip), %rdx */
yann@402
  6607
+/*         subq    %rax, %rdx */
yann@402
  6608
+        leaq    -1(%rbp), %rax
yann@402
  6609
+/*         jmp     *%rdx */
yann@402
  6610
+        movaps  %xmm7, -15(%rax)
yann@402
  6611
+        movaps  %xmm6, -31(%rax)
yann@402
  6612
+        movaps  %xmm5, -47(%rax)
yann@402
  6613
+        movaps  %xmm4, -63(%rax)
yann@402
  6614
+        movaps  %xmm3, -79(%rax)
yann@402
  6615
+        movaps  %xmm2, -95(%rax)
yann@402
  6616
+        movaps  %xmm1, -111(%rax)
yann@402
  6617
+        movaps  %xmm0, -127(%rax)
yann@402
  6618
+2:
yann@402
  6619
+        movl    %edi, -180(%rbp)
yann@402
  6620
+        movl    $0, -224(%rbp)
yann@402
  6621
+        movl    $48, -220(%rbp)
yann@402
  6622
+        leaq    16(%rbp), %rax
yann@402
  6623
+        movq    %rax, -216(%rbp)
yann@402
  6624
+        leaq    -176(%rbp), %rdx
yann@402
  6625
+        movq    %rdx, -208(%rbp)
yann@402
  6626
+        leaq    -224(%rbp), %rsi
yann@402
  6627
+	movq	%r10, %rdi
yann@402
  6628
+	movq	%rsp, %rdx
yann@402
  6629
+        call    ffi_closure_UNIX64_inner@PLT
yann@402
  6630
+
yann@402
  6631
+	cmpl	$FFI_TYPE_FLOAT, %eax
yann@402
  6632
+	je	1f
yann@402
  6633
+	cmpl	$FFI_TYPE_DOUBLE, %eax
yann@402
  6634
+	je	2f
yann@402
  6635
+	cmpl	$FFI_TYPE_LONGDOUBLE, %eax
yann@402
  6636
+	je	3f
yann@402
  6637
+	cmpl	$FFI_TYPE_STRUCT, %eax
yann@402
  6638
+	je	4f
yann@402
  6639
+	popq	%rax
yann@402
  6640
+        leave
yann@402
  6641
+        ret
yann@402
  6642
+1:
yann@402
  6643
+2:
yann@402
  6644
+3:	
yann@402
  6645
+	movaps	-240(%rbp), %xmm0
yann@402
  6646
+        leave
yann@402
  6647
+        ret
yann@402
  6648
+4:
yann@402
  6649
+	leave
yann@402
  6650
+	ret
yann@402
  6651
+.LFE2:	
yann@402
  6652
+		
yann@402
  6653
+        .section        .eh_frame,"a",@progbits
yann@402
  6654
+.Lframe0:
yann@402
  6655
+        .long   .LECIE1-.LSCIE1
yann@402
  6656
+.LSCIE1:
yann@402
  6657
+        .long   0x0
yann@402
  6658
+        .byte   0x1
yann@402
  6659
+        .string "zR"
yann@402
  6660
+        .uleb128 0x1
yann@402
  6661
+        .sleb128 -8
yann@402
  6662
+        .byte   0x10
yann@402
  6663
+        .uleb128 0x1
yann@402
  6664
+        .byte   0x1b
yann@402
  6665
+        .byte   0xc
yann@402
  6666
+        .uleb128 0x7
yann@402
  6667
+        .uleb128 0x8
yann@402
  6668
+        .byte   0x90
yann@402
  6669
+        .uleb128 0x1
yann@402
  6670
+        .align 8
yann@402
  6671
+.LECIE1:
yann@402
  6672
+.LSFDE1:
yann@402
  6673
+	.long	.LEFDE1-.LASFDE1
yann@402
  6674
+.LASFDE1:
yann@402
  6675
+        .long   .LASFDE1-.Lframe0
yann@402
  6676
+
yann@402
  6677
+        .long   .LFB1-.
yann@402
  6678
+        .long   .LFE1-.LFB1
yann@402
  6679
+        .uleb128 0x0
yann@402
  6680
+        .byte   0x4		# DW_CFA_advance_loc4
yann@402
  6681
+        .long   .LCFI0-.LFB1
yann@402
  6682
+        .byte   0xe		# DW_CFA_def_cfa_offset
yann@402
  6683
+        .uleb128 0x10
yann@402
  6684
+        .byte   0x86		# DW_CFA_offset: r6 at cfa-16
yann@402
  6685
+        .uleb128 0x2
yann@402
  6686
+        .byte   0x4		# DW_CFA_advance_loc4
yann@402
  6687
+        .long   .LCFI1-.LCFI0
yann@402
  6688
+        .byte   0x86		# DW_CFA_offset: r6 at cfa-16
yann@402
  6689
+        .uleb128 0x2
yann@402
  6690
+        .byte   0xd		# DW_CFA_def_cfa_reg: r6
yann@402
  6691
+        .uleb128 0x6
yann@402
  6692
+	.align 8
yann@402
  6693
+.LEFDE1:
yann@402
  6694
+.LSFDE3:
yann@402
  6695
+        .long   .LEFDE3-.LASFDE3        # FDE Length
yann@402
  6696
+.LASFDE3:
yann@402
  6697
+        .long   .LASFDE3-.Lframe0       # FDE CIE offset
yann@402
  6698
+
yann@402
  6699
+        .long   .LFB2-. # FDE initial location
yann@402
  6700
+        .long   .LFE2-.LFB2     # FDE address range
yann@402
  6701
+        .uleb128 0x0    # Augmentation size
yann@402
  6702
+        .byte   0x4     # DW_CFA_advance_loc4
yann@402
  6703
+        .long   .LCFI10-.LFB2
yann@402
  6704
+        .byte   0xe     # DW_CFA_def_cfa_offset
yann@402
  6705
+        .uleb128 0x10
yann@402
  6706
+        .byte   0x86    # DW_CFA_offset, column 0x6
yann@402
  6707
+        .uleb128 0x2
yann@402
  6708
+        .byte   0x4     # DW_CFA_advance_loc4
yann@402
  6709
+        .long   .LCFI11-.LCFI10
yann@402
  6710
+        .byte   0xd     # DW_CFA_def_cfa_register
yann@402
  6711
+        .uleb128 0x6
yann@402
  6712
+        .align 8
yann@402
  6713
+.LEFDE3:
yann@402
  6714
+
yann@402
  6715
+#endif /* __x86_64__  */
yann@402
  6716
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/win32.S gcc/libffi/src/x86/win32.S
yann@402
  6717
--- gcc-3.2.2.orig/libffi/src/x86/win32.S	Tue Mar 27 11:39:16 2001
yann@402
  6718
+++ gcc/libffi/src/x86/win32.S	Fri Dec  6 10:16:45 2002
yann@402
  6719
@@ -1,5 +1,8 @@
yann@402
  6720
 /* -----------------------------------------------------------------------
yann@402
  6721
-   win32.S - Copyright (c) 1996, 1998, 2001  Cygnus Solutions
yann@402
  6722
+   win32.S - Copyright (c) 1996, 1998, 2001, 2002  Red Hat, Inc.
yann@402
  6723
+	     Copyright (c) 2001  John Beniton
yann@402
  6724
+	     Copyright (c) 2002  Ranjit Mathew
yann@402
  6725
+			
yann@402
  6726
  
yann@402
  6727
    X86 Foreign Function Interface
yann@402
  6728
  
yann@402
  6729
@@ -52,7 +55,10 @@
yann@402
  6730
         # Return stack to previous state and call the function
yann@402
  6731
         addl  $8,%esp
yann@402
  6732
  
yann@402
  6733
-        call  *28(%ebp)
yann@402
  6734
+        # FIXME: Align the stack to a 128-bit boundary to avoid
yann@402
  6735
+        # potential performance hits.
yann@402
  6736
+
yann@402
  6737
+	call  *28(%ebp)
yann@402
  6738
  
yann@402
  6739
         # Remove the space we pushed for the args
yann@402
  6740
         movl  16(%ebp),%ecx
yann@402
  6741
@@ -123,3 +129,98 @@
yann@402
  6742
         ret
yann@402
  6743
  
yann@402
  6744
 .ffi_call_SYSV_end:
yann@402
  6745
+
yann@402
  6746
+        # This assumes we are using gas.
yann@402
  6747
+        .balign 16
yann@402
  6748
+.globl _ffi_call_STDCALL
yann@402
  6749
+
yann@402
  6750
+_ffi_call_STDCALL:
yann@402
  6751
+        pushl %ebp
yann@402
  6752
+        movl  %esp,%ebp
yann@402
  6753
+
yann@402
  6754
+        # Make room for all of the new args.
yann@402
  6755
+        movl  16(%ebp),%ecx 
yann@402
  6756
+        subl  %ecx,%esp
yann@402
  6757
+
yann@402
  6758
+        movl  %esp,%eax
yann@402
  6759
+
yann@402
  6760
+        # Place all of the ffi_prep_args in position
yann@402
  6761
+        pushl 12(%ebp)
yann@402
  6762
+        pushl %eax
yann@402
  6763
+        call  *8(%ebp)
yann@402
  6764
+
yann@402
  6765
+        # Return stack to previous state and call the function
yann@402
  6766
+        addl  $8,%esp
yann@402
  6767
+
yann@402
  6768
+        # FIXME: Align the stack to a 128-bit boundary to avoid
yann@402
  6769
+        # potential performance hits.
yann@402
  6770
+
yann@402
  6771
+        call  *28(%ebp)
yann@402
  6772
+
yann@402
  6773
+        # stdcall functions pop arguments off the stack themselves
yann@402
  6774
+
yann@402
  6775
+        # Load %ecx with the return type code
yann@402
  6776
+        movl  20(%ebp),%ecx
yann@402
  6777
+
yann@402
  6778
+        # If the return value pointer is NULL, assume no return value.
yann@402
  6779
+        cmpl  $0,24(%ebp)
yann@402
  6780
+        jne   sc_retint
yann@402
  6781
+
yann@402
  6782
+        # Even if there is no space for the return value, we are
yann@402
  6783
+        # obliged to handle floating-point values.
yann@402
  6784
+        cmpl  $FFI_TYPE_FLOAT,%ecx
yann@402
  6785
+        jne   sc_noretval
yann@402
  6786
+        fstp  %st(0)
yann@402
  6787
+
yann@402
  6788
+        jmp   sc_epilogue
yann@402
  6789
+
yann@402
  6790
+sc_retint:
yann@402
  6791
+        cmpl  $FFI_TYPE_INT,%ecx
yann@402
  6792
+        jne   sc_retfloat
yann@402
  6793
+        # Load %ecx with the pointer to storage for the return value
yann@402
  6794
+        movl  24(%ebp),%ecx
yann@402
  6795
+        movl  %eax,0(%ecx)
yann@402
  6796
+        jmp   sc_epilogue
yann@402
  6797
+
yann@402
  6798
+sc_retfloat:
yann@402
  6799
+        cmpl  $FFI_TYPE_FLOAT,%ecx
yann@402
  6800
+        jne   sc_retdouble
yann@402
  6801
+         # Load %ecx with the pointer to storage for the return value
yann@402
  6802
+        movl  24(%ebp),%ecx
yann@402
  6803
+        fstps (%ecx)
yann@402
  6804
+        jmp   sc_epilogue
yann@402
  6805
+
yann@402
  6806
+sc_retdouble:
yann@402
  6807
+        cmpl  $FFI_TYPE_DOUBLE,%ecx
yann@402
  6808
+        jne   sc_retlongdouble
yann@402
  6809
+        # Load %ecx with the pointer to storage for the return value
yann@402
  6810
+        movl  24(%ebp),%ecx
yann@402
  6811
+        fstpl (%ecx)
yann@402
  6812
+        jmp   sc_epilogue
yann@402
  6813
+
yann@402
  6814
+sc_retlongdouble:
yann@402
  6815
+        cmpl  $FFI_TYPE_LONGDOUBLE,%ecx
yann@402
  6816
+        jne   sc_retint64
yann@402
  6817
+        # Load %ecx with the pointer to storage for the return value
yann@402
  6818
+        movl  24(%ebp),%ecx
yann@402
  6819
+        fstpt (%ecx)
yann@402
  6820
+        jmp   sc_epilogue
yann@402
  6821
+
yann@402
  6822
+sc_retint64:
yann@402
  6823
+        cmpl  $FFI_TYPE_SINT64,%ecx
yann@402
  6824
+        jne   sc_retstruct
yann@402
  6825
+        # Load %ecx with the pointer to storage for the return value
yann@402
  6826
+        movl  24(%ebp),%ecx
yann@402
  6827
+        movl  %eax,0(%ecx)
yann@402
  6828
+        movl  %edx,4(%ecx)
yann@402
  6829
+
yann@402
  6830
+sc_retstruct:
yann@402
  6831
+        # Nothing to do!
yann@402
  6832
+
yann@402
  6833
+sc_noretval:
yann@402
  6834
+sc_epilogue:
yann@402
  6835
+        movl %ebp,%esp
yann@402
  6836
+        popl %ebp
yann@402
  6837
+        ret
yann@402
  6838
+
yann@402
  6839
+.ffi_call_STDCALL_end:
yann@402
  6840
--- gcc-3.2.2.orig/libjava/configure.host	Mon Jun 10 13:15:26 2002
yann@402
  6841
+++ gcc-3.2.2/libjava/configure.host	Sat Feb 15 19:57:25 2003
yann@402
  6842
@@ -115,6 +115,12 @@
yann@402
  6843
 	enable_getenv_properties_default=no
yann@402
  6844
 	enable_main_args_default=no
yann@402
  6845
 	;;
yann@402
  6846
+  sh-* | sh[34]*-*)
yann@402
  6847
+	sysdeps_dir=sh
yann@402
  6848
+	libgcj_flags="${libgcj_flags} -mieee"
yann@402
  6849
+	libgcj_interpreter=yes
yann@402
  6850
+	enable_hash_synchronization_default=yes
yann@402
  6851
+	;;
yann@402
  6852
 esac
yann@402
  6853
 
yann@402
  6854
 # This case statement supports generic port properties and may refine
yann@402
  6855
@@ -126,7 +132,8 @@
yann@402
  6856
   powerpc*-linux* | \
yann@402
  6857
   alpha*-linux* | \
yann@402
  6858
   sparc*-linux* | \
yann@402
  6859
-  ia64-*)
yann@402
  6860
+  ia64-* | \
yann@402
  6861
+  sh-linux* | sh[34]*-linux*)
yann@402
  6862
   	can_unwind_signal=yes
yann@402
  6863
 	;;
yann@402
  6864
   *-*-darwin*)