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