yann@402
|
1 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.am gcc/libffi/Makefile.am
|
yann@402
|
2 |
--- gcc-3.2.2.orig/libffi/Makefile.am Tue Jan 28 10:43:56 2003
|
yann@402
|
3 |
+++ gcc/libffi/Makefile.am Tue Jan 28 10:48:33 2003
|
yann@402
|
4 |
@@ -8,14 +8,17 @@
|
yann@402
|
5 |
src/mips/n32.s src/mips/o32.S src/mips/o32.s \
|
yann@402
|
6 |
src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \
|
yann@402
|
7 |
src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \
|
yann@402
|
8 |
+ src/x86/ffi64.c src/x86/unix64.S \
|
yann@402
|
9 |
src/alpha/ffi.c src/alpha/osf.S \
|
yann@402
|
10 |
src/m68k/ffi.c src/m68k/sysv.S \
|
yann@402
|
11 |
src/powerpc/ffi.c src/powerpc/sysv.S \
|
yann@402
|
12 |
src/powerpc/ppc_closure.S src/powerpc/asm.h \
|
yann@402
|
13 |
src/powerpc/ffi_darwin.c \
|
yann@402
|
14 |
src/powerpc/darwin.S src/powerpc/aix.S \
|
yann@402
|
15 |
- src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \
|
yann@402
|
16 |
- src/arm/ffi.c src/arm/sysv.S
|
yann@402
|
17 |
+ src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \
|
yann@402
|
18 |
+ src/arm/ffi.c src/arm/sysv.S \
|
yann@402
|
19 |
+ src/s390/ffi.c src/s390/sysv.S \
|
yann@402
|
20 |
+ src/sh/ffi.c src/sh/sysv.S
|
yann@402
|
21 |
|
yann@402
|
22 |
VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@
|
yann@402
|
23 |
|
yann@402
|
24 |
@@ -83,6 +86,7 @@
|
yann@402
|
25 |
ffitest_LDFLAGS = -shared-libgcc
|
yann@402
|
26 |
|
yann@402
|
27 |
TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S
|
yann@402
|
28 |
+TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S
|
yann@402
|
29 |
TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s
|
yann@402
|
30 |
TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S
|
yann@402
|
31 |
TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S
|
yann@402
|
32 |
@@ -91,9 +95,12 @@
|
yann@402
|
33 |
TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S
|
yann@402
|
34 |
TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S
|
yann@402
|
35 |
TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
|
yann@402
|
36 |
-TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S
|
yann@402
|
37 |
+TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
|
yann@402
|
38 |
TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
|
yann@402
|
39 |
TARGET_SRC_ARM = src/arm/sysv.S src/arm/ffi.c
|
yann@402
|
40 |
+TARGET_SRC_S390 = src/s390/sysv.S src/s390/ffi.c
|
yann@402
|
41 |
+TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
|
yann@402
|
42 |
+TARGET_SRC_SH = src/sh/sysv.S src/sh/ffi.c
|
yann@402
|
43 |
|
yann@402
|
44 |
##libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c $(TARGET_SRC_@TARGET@)
|
yann@402
|
45 |
## Work around automake deficiency
|
yann@402
|
46 |
@@ -103,6 +110,10 @@
|
yann@402
|
47 |
libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
|
yann@402
|
48 |
libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
|
yann@402
|
49 |
endif
|
yann@402
|
50 |
+if MIPS_LINUX
|
yann@402
|
51 |
+libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
|
yann@402
|
52 |
+libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
|
yann@402
|
53 |
+endif
|
yann@402
|
54 |
if MIPS_SGI
|
yann@402
|
55 |
libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
|
yann@402
|
56 |
libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
|
yann@402
|
57 |
@@ -147,6 +158,18 @@
|
yann@402
|
58 |
libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
|
yann@402
|
59 |
libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
|
yann@402
|
60 |
endif
|
yann@402
|
61 |
+if S390
|
yann@402
|
62 |
+libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
|
yann@402
|
63 |
+libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
|
yann@402
|
64 |
+endif
|
yann@402
|
65 |
+if X86_64
|
yann@402
|
66 |
+libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
|
yann@402
|
67 |
+libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
|
yann@402
|
68 |
+endif
|
yann@402
|
69 |
+if SH
|
yann@402
|
70 |
+libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
|
yann@402
|
71 |
+libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
|
yann@402
|
72 |
+endif
|
yann@402
|
73 |
|
yann@402
|
74 |
AM_CFLAGS = -fexceptions
|
yann@402
|
75 |
|
yann@402
|
76 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.in gcc/libffi/Makefile.in
|
yann@402
|
77 |
--- gcc-3.2.2.orig/libffi/Makefile.in Wed Jan 29 07:59:05 2003
|
yann@402
|
78 |
+++ gcc/libffi/Makefile.in Wed Jan 29 07:58:58 2003
|
yann@402
|
79 |
@@ -91,14 +91,17 @@
|
yann@402
|
80 |
src/mips/n32.s src/mips/o32.S src/mips/o32.s \
|
yann@402
|
81 |
src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \
|
yann@402
|
82 |
src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \
|
yann@402
|
83 |
+ src/x86/ffi64.c src/x86/unix64.S \
|
yann@402
|
84 |
src/alpha/ffi.c src/alpha/osf.S \
|
yann@402
|
85 |
src/m68k/ffi.c src/m68k/sysv.S \
|
yann@402
|
86 |
src/powerpc/ffi.c src/powerpc/sysv.S \
|
yann@402
|
87 |
src/powerpc/ppc_closure.S src/powerpc/asm.h \
|
yann@402
|
88 |
src/powerpc/ffi_darwin.c \
|
yann@402
|
89 |
src/powerpc/darwin.S src/powerpc/aix.S \
|
yann@402
|
90 |
- src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \
|
yann@402
|
91 |
- src/arm/ffi.c src/arm/sysv.S
|
yann@402
|
92 |
+ src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \
|
yann@402
|
93 |
+ src/arm/ffi.c src/arm/sysv.S \
|
yann@402
|
94 |
+ src/s390/ffi.c src/s390/sysv.S \
|
yann@402
|
95 |
+ src/sh/ffi.c src/sh/sysv.S
|
yann@402
|
96 |
|
yann@402
|
97 |
|
yann@402
|
98 |
VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@
|
yann@402
|
99 |
@@ -162,6 +165,7 @@
|
yann@402
|
100 |
ffitest_LDFLAGS = -shared-libgcc
|
yann@402
|
101 |
|
yann@402
|
102 |
TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S
|
yann@402
|
103 |
+TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S
|
yann@402
|
104 |
TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s
|
yann@402
|
105 |
TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S
|
yann@402
|
106 |
TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S
|
yann@402
|
107 |
@@ -170,14 +174,18 @@
|
yann@402
|
108 |
TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S
|
yann@402
|
109 |
TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S
|
yann@402
|
110 |
TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
|
yann@402
|
111 |
-TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S
|
yann@402
|
112 |
+TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
|
yann@402
|
113 |
TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
|
yann@402
|
114 |
TARGET_SRC_ARM = src/arm/sysv.S src/arm/ffi.c
|
yann@402
|
115 |
+TARGET_SRC_S390 = src/s390/sysv.S src/s390/ffi.c
|
yann@402
|
116 |
+TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
|
yann@402
|
117 |
+TARGET_SRC_SH = src/sh/sysv.S src/sh/ffi.c
|
yann@402
|
118 |
|
yann@402
|
119 |
libffi_la_common_SOURCES = src/debug.c src/prep_cif.c src/types.c \
|
yann@402
|
120 |
src/raw_api.c src/java_raw_api.c
|
yann@402
|
121 |
|
yann@402
|
122 |
@MIPS_GCC_TRUE@libffi_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
|
yann@402
|
123 |
+@MIPS_LINUX_TRUE@libffi_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
|
yann@402
|
124 |
@MIPS_SGI_TRUE@libffi_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
|
yann@402
|
125 |
@X86_TRUE@libffi_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86)
|
yann@402
|
126 |
@X86_WIN32_TRUE@libffi_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32)
|
yann@402
|
127 |
@@ -189,7 +197,11 @@
|
yann@402
|
128 |
@POWERPC_AIX_TRUE@libffi_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX)
|
yann@402
|
129 |
@POWERPC_DARWIN_TRUE@libffi_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN)
|
yann@402
|
130 |
@ARM_TRUE@libffi_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
|
yann@402
|
131 |
+@S390_TRUE@libffi_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
|
yann@402
|
132 |
+@X86_64_TRUE@libffi_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
|
yann@402
|
133 |
+@SH_TRUE@libffi_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
|
yann@402
|
134 |
@MIPS_GCC_TRUE@libffi_convenience_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC)
|
yann@402
|
135 |
+@MIPS_LINUX_TRUE@libffi_convenience_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX)
|
yann@402
|
136 |
@MIPS_SGI_TRUE@libffi_convenience_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI)
|
yann@402
|
137 |
@X86_TRUE@libffi_convenience_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86)
|
yann@402
|
138 |
@X86_WIN32_TRUE@libffi_convenience_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32)
|
yann@402
|
139 |
@@ -201,6 +213,9 @@
|
yann@402
|
140 |
@POWERPC_AIX_TRUE@libffi_convenience_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX)
|
yann@402
|
141 |
@POWERPC_DARWIN_TRUE@libffi_convenience_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN)
|
yann@402
|
142 |
@ARM_TRUE@libffi_convenience_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM)
|
yann@402
|
143 |
+@S390_TRUE@libffi_convenience_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390)
|
yann@402
|
144 |
+@X86_64_TRUE@libffi_convenience_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64)
|
yann@402
|
145 |
+@SH_TRUE@libfficonvenience_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH)
|
yann@402
|
146 |
|
yann@402
|
147 |
AM_CFLAGS = -fexceptions
|
yann@402
|
148 |
|
yann@402
|
149 |
@@ -208,7 +223,7 @@
|
yann@402
|
150 |
|
yann@402
|
151 |
INCLUDES = -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
|
yann@402
|
152 |
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
yann@402
|
153 |
-mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs
|
yann@402
|
154 |
+mkinstalldirs = $(SHELL) $(top_srcdir)/${libffi_basedir}/../mkinstalldirs
|
yann@402
|
155 |
CONFIG_HEADER = fficonfig.h
|
yann@402
|
156 |
CONFIG_CLEAN_FILES =
|
yann@402
|
157 |
LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES)
|
yann@402
|
158 |
@@ -220,10 +235,6 @@
|
yann@402
|
159 |
LIBS = @LIBS@
|
yann@402
|
160 |
libffi_convenience_la_LDFLAGS =
|
yann@402
|
161 |
libffi_convenience_la_LIBADD =
|
yann@402
|
162 |
-@POWERPC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
|
yann@402
|
163 |
-@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
|
yann@402
|
164 |
-@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \
|
yann@402
|
165 |
-@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo
|
yann@402
|
166 |
@ALPHA_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
|
yann@402
|
167 |
@ALPHA_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
|
yann@402
|
168 |
@ALPHA_TRUE@src/java_raw_api.lo src/alpha/ffi.lo src/alpha/osf.lo
|
yann@402
|
169 |
@@ -234,12 +245,29 @@
|
yann@402
|
170 |
@MIPS_GCC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
|
yann@402
|
171 |
@MIPS_GCC_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \
|
yann@402
|
172 |
@MIPS_GCC_TRUE@src/mips/n32.lo
|
yann@402
|
173 |
-@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
|
yann@402
|
174 |
-@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
|
yann@402
|
175 |
-@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo
|
yann@402
|
176 |
+@S390_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
177 |
+@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
178 |
+@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo
|
yann@402
|
179 |
@M68K_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
180 |
@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
181 |
@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo
|
yann@402
|
182 |
+@X86_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
183 |
+@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
184 |
+@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo
|
yann@402
|
185 |
+@POWERPC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
|
yann@402
|
186 |
+@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
|
yann@402
|
187 |
+@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \
|
yann@402
|
188 |
+@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo
|
yann@402
|
189 |
+@MIPS_LINUX_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
|
yann@402
|
190 |
+@MIPS_LINUX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
|
yann@402
|
191 |
+@MIPS_LINUX_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo
|
yann@402
|
192 |
+@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
|
yann@402
|
193 |
+@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
|
yann@402
|
194 |
+@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo
|
yann@402
|
195 |
+@X86_64_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
|
yann@402
|
196 |
+@X86_64_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
|
yann@402
|
197 |
+@X86_64_TRUE@src/java_raw_api.lo src/x86/ffi64.lo src/x86/unix64.lo \
|
yann@402
|
198 |
+@X86_64_TRUE@src/x86/ffi.lo src/x86/sysv.lo
|
yann@402
|
199 |
@SPARC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
|
yann@402
|
200 |
@SPARC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
|
yann@402
|
201 |
@SPARC_TRUE@src/java_raw_api.lo src/sparc/ffi.lo src/sparc/v8.lo \
|
yann@402
|
202 |
@@ -247,62 +275,75 @@
|
yann@402
|
203 |
@POWERPC_AIX_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
|
yann@402
|
204 |
@POWERPC_AIX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
|
yann@402
|
205 |
@POWERPC_AIX_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \
|
yann@402
|
206 |
-@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closures.lo
|
yann@402
|
207 |
-@X86_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
208 |
-@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
209 |
-@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo
|
yann@402
|
210 |
-@ARM_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
211 |
-@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
212 |
-@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo
|
yann@402
|
213 |
+@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closure.lo
|
yann@402
|
214 |
+@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
|
yann@402
|
215 |
+@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
|
yann@402
|
216 |
+@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \
|
yann@402
|
217 |
+@MIPS_SGI_TRUE@src/mips/n32.lo
|
yann@402
|
218 |
@POWERPC_DARWIN_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
|
yann@402
|
219 |
@POWERPC_DARWIN_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
|
yann@402
|
220 |
@POWERPC_DARWIN_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \
|
yann@402
|
221 |
@POWERPC_DARWIN_TRUE@src/powerpc/darwin.lo \
|
yann@402
|
222 |
@POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo
|
yann@402
|
223 |
-@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \
|
yann@402
|
224 |
-@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \
|
yann@402
|
225 |
-@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \
|
yann@402
|
226 |
-@MIPS_SGI_TRUE@src/mips/n32.lo
|
yann@402
|
227 |
+@ARM_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
228 |
+@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
229 |
+@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo
|
yann@402
|
230 |
+@SH_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
231 |
+@SH_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
232 |
+@SH_TRUE@src/sh/sysv.lo src/sh/ffi.lo
|
yann@402
|
233 |
libffi_la_LIBADD =
|
yann@402
|
234 |
+@SH_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \
|
yann@402
|
235 |
+@SH_TRUE@src/raw_api.lo src/java_raw_api.lo src/sh/sysv.lo \
|
yann@402
|
236 |
+@SH_TRUE@src/sh/ffi.lo
|
yann@402
|
237 |
+@IA64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
238 |
+@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
239 |
+@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo
|
yann@402
|
240 |
+@X86_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \
|
yann@402
|
241 |
+@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \
|
yann@402
|
242 |
+@X86_TRUE@src/x86/sysv.lo
|
yann@402
|
243 |
@POWERPC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
244 |
@POWERPC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
245 |
@POWERPC_TRUE@src/powerpc/ffi.lo src/powerpc/sysv.lo \
|
yann@402
|
246 |
@POWERPC_TRUE@src/powerpc/ppc_closure.lo
|
yann@402
|
247 |
-@ALPHA_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
248 |
-@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
249 |
-@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo
|
yann@402
|
250 |
-@IA64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
251 |
-@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
252 |
-@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo
|
yann@402
|
253 |
-@MIPS_GCC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
254 |
-@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
255 |
-@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
|
yann@402
|
256 |
-@X86_WIN32_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
257 |
-@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
258 |
-@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo
|
yann@402
|
259 |
-@M68K_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
260 |
-@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
261 |
-@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo
|
yann@402
|
262 |
+@MIPS_LINUX_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
263 |
+@MIPS_LINUX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
264 |
+@MIPS_LINUX_TRUE@src/mips/ffi.lo src/mips/o32.lo
|
yann@402
|
265 |
@SPARC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
266 |
@SPARC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
267 |
@SPARC_TRUE@src/sparc/ffi.lo src/sparc/v8.lo src/sparc/v9.lo
|
yann@402
|
268 |
@POWERPC_AIX_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
269 |
@POWERPC_AIX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
270 |
@POWERPC_AIX_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/aix.lo \
|
yann@402
|
271 |
-@POWERPC_AIX_TRUE@src/powerpc/aix_closures.lo
|
yann@402
|
272 |
-@X86_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \
|
yann@402
|
273 |
-@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \
|
yann@402
|
274 |
-@X86_TRUE@src/x86/sysv.lo
|
yann@402
|
275 |
+@POWERPC_AIX_TRUE@src/powerpc/aix_closure.lo
|
yann@402
|
276 |
+@MIPS_SGI_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
277 |
+@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
278 |
+@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
|
yann@402
|
279 |
@ARM_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \
|
yann@402
|
280 |
@ARM_TRUE@src/raw_api.lo src/java_raw_api.lo src/arm/sysv.lo \
|
yann@402
|
281 |
@ARM_TRUE@src/arm/ffi.lo
|
yann@402
|
282 |
+@ALPHA_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
283 |
+@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
284 |
+@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo
|
yann@402
|
285 |
+@MIPS_GCC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
286 |
+@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
287 |
+@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
|
yann@402
|
288 |
+@S390_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
289 |
+@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
290 |
+@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo
|
yann@402
|
291 |
+@M68K_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
292 |
+@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
293 |
+@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo
|
yann@402
|
294 |
+@X86_WIN32_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
295 |
+@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
296 |
+@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo
|
yann@402
|
297 |
+@X86_64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
298 |
+@X86_64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
299 |
+@X86_64_TRUE@src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffi.lo \
|
yann@402
|
300 |
+@X86_64_TRUE@src/x86/sysv.lo
|
yann@402
|
301 |
@POWERPC_DARWIN_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
302 |
@POWERPC_DARWIN_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
303 |
@POWERPC_DARWIN_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/darwin.lo \
|
yann@402
|
304 |
@POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo
|
yann@402
|
305 |
-@MIPS_SGI_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \
|
yann@402
|
306 |
-@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \
|
yann@402
|
307 |
-@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo
|
yann@402
|
308 |
noinst_PROGRAMS = ffitest$(EXEEXT)
|
yann@402
|
309 |
PROGRAMS = $(noinst_PROGRAMS)
|
yann@402
|
310 |
|
yann@402
|
311 |
@@ -578,8 +616,8 @@
|
yann@402
|
312 |
-chmod 777 $(distdir)
|
yann@402
|
313 |
$(mkinstalldirs) $(distdir)/src/alpha $(distdir)/src/arm \
|
yann@402
|
314 |
$(distdir)/src/m68k $(distdir)/src/mips \
|
yann@402
|
315 |
- $(distdir)/src/powerpc $(distdir)/src/sparc \
|
yann@402
|
316 |
- $(distdir)/src/x86
|
yann@402
|
317 |
+ $(distdir)/src/powerpc $(distdir)/src/s390 $(distdir)/src/sh \
|
yann@402
|
318 |
+ $(distdir)/src/sparc $(distdir)/src/x86
|
yann@402
|
319 |
@for file in $(DISTFILES); do \
|
yann@402
|
320 |
if test -f $$file; then d=.; else d=$(srcdir); fi; \
|
yann@402
|
321 |
if test -d $$d/$$file; then \
|
yann@402
|
322 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/acinclude.m4 gcc/libffi/acinclude.m4
|
yann@402
|
323 |
--- gcc-3.2.2.orig/libffi/acinclude.m4 Sun Sep 10 16:43:14 2000
|
yann@402
|
324 |
+++ gcc/libffi/acinclude.m4 Tue Dec 17 03:22:47 2002
|
yann@402
|
325 |
@@ -4,5 +4,8 @@
|
yann@402
|
326 |
dnl to add a definition of LIBTOOL to Makefile.in.
|
yann@402
|
327 |
ifelse(yes,no,[
|
yann@402
|
328 |
AC_DEFUN([AC_PROG_LIBTOOL],)
|
yann@402
|
329 |
+AC_DEFUN([AM_PROG_LIBTOOL],)
|
yann@402
|
330 |
AC_SUBST(LIBTOOL)
|
yann@402
|
331 |
])
|
yann@402
|
332 |
+
|
yann@402
|
333 |
+sinclude(../config/accross.m4)
|
yann@402
|
334 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/aclocal.m4 gcc/libffi/aclocal.m4
|
yann@402
|
335 |
--- gcc-3.2.2.orig/libffi/aclocal.m4 Fri Feb 1 07:25:31 2002
|
yann@402
|
336 |
+++ gcc/libffi/aclocal.m4 Tue Dec 17 03:22:47 2002
|
yann@402
|
337 |
@@ -1,6 +1,6 @@
|
yann@402
|
338 |
-dnl aclocal.m4 generated automatically by aclocal 1.4
|
yann@402
|
339 |
+dnl aclocal.m4 generated automatically by aclocal 1.4-p5
|
yann@402
|
340 |
|
yann@402
|
341 |
-dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
|
yann@402
|
342 |
+dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
|
yann@402
|
343 |
dnl This file is free software; the Free Software Foundation
|
yann@402
|
344 |
dnl gives unlimited permission to copy and/or distribute it,
|
yann@402
|
345 |
dnl with or without modifications, as long as this notice is preserved.
|
yann@402
|
346 |
@@ -16,108 +16,15 @@
|
yann@402
|
347 |
dnl to add a definition of LIBTOOL to Makefile.in.
|
yann@402
|
348 |
ifelse(yes,no,[
|
yann@402
|
349 |
AC_DEFUN([AC_PROG_LIBTOOL],)
|
yann@402
|
350 |
+AC_DEFUN([AM_PROG_LIBTOOL],)
|
yann@402
|
351 |
AC_SUBST(LIBTOOL)
|
yann@402
|
352 |
])
|
yann@402
|
353 |
|
yann@402
|
354 |
-AC_DEFUN([AC_COMPILE_CHECK_SIZEOF],
|
yann@402
|
355 |
-[changequote(<<, >>)dnl
|
yann@402
|
356 |
-dnl The name to #define.
|
yann@402
|
357 |
-define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl
|
yann@402
|
358 |
-dnl The cache variable name.
|
yann@402
|
359 |
-define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl
|
yann@402
|
360 |
-changequote([, ])dnl
|
yann@402
|
361 |
-AC_MSG_CHECKING(size of $1)
|
yann@402
|
362 |
-AC_CACHE_VAL(AC_CV_NAME,
|
yann@402
|
363 |
-[for ac_size in 4 8 1 2 16 12 $2 ; do # List sizes in rough order of prevalence.
|
yann@402
|
364 |
- AC_TRY_COMPILE([#include "confdefs.h"
|
yann@402
|
365 |
-#include <sys/types.h>
|
yann@402
|
366 |
-$2
|
yann@402
|
367 |
-], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size)
|
yann@402
|
368 |
- if test x$AC_CV_NAME != x ; then break; fi
|
yann@402
|
369 |
-done
|
yann@402
|
370 |
-])
|
yann@402
|
371 |
-if test x$AC_CV_NAME = x ; then
|
yann@402
|
372 |
- AC_MSG_ERROR([cannot determine a size for $1])
|
yann@402
|
373 |
-fi
|
yann@402
|
374 |
-AC_MSG_RESULT($AC_CV_NAME)
|
yann@402
|
375 |
-AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1])
|
yann@402
|
376 |
-undefine([AC_TYPE_NAME])dnl
|
yann@402
|
377 |
-undefine([AC_CV_NAME])dnl
|
yann@402
|
378 |
-])
|
yann@402
|
379 |
-
|
yann@402
|
380 |
-AC_DEFUN([AC_C_BIGENDIAN_CROSS],
|
yann@402
|
381 |
-[AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian,
|
yann@402
|
382 |
-[ac_cv_c_bigendian=unknown
|
yann@402
|
383 |
-# See if sys/param.h defines the BYTE_ORDER macro.
|
yann@402
|
384 |
-AC_TRY_COMPILE([#include <sys/types.h>
|
yann@402
|
385 |
-#include <sys/param.h>], [
|
yann@402
|
386 |
-#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
|
yann@402
|
387 |
- bogus endian macros
|
yann@402
|
388 |
-#endif], [# It does; now see whether it defined to BIG_ENDIAN or not.
|
yann@402
|
389 |
-AC_TRY_COMPILE([#include <sys/types.h>
|
yann@402
|
390 |
-#include <sys/param.h>], [
|
yann@402
|
391 |
-#if BYTE_ORDER != BIG_ENDIAN
|
yann@402
|
392 |
- not big endian
|
yann@402
|
393 |
-#endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)])
|
yann@402
|
394 |
-if test $ac_cv_c_bigendian = unknown; then
|
yann@402
|
395 |
-AC_TRY_RUN([main () {
|
yann@402
|
396 |
- /* Are we little or big endian? From Harbison&Steele. */
|
yann@402
|
397 |
- union
|
yann@402
|
398 |
- {
|
yann@402
|
399 |
- long l;
|
yann@402
|
400 |
- char c[sizeof (long)];
|
yann@402
|
401 |
- } u;
|
yann@402
|
402 |
- u.l = 1;
|
yann@402
|
403 |
- exit (u.c[sizeof (long) - 1] == 1);
|
yann@402
|
404 |
-}], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes,
|
yann@402
|
405 |
-[ echo $ac_n "cross-compiling... " 2>&AC_FD_MSG ])
|
yann@402
|
406 |
-fi])
|
yann@402
|
407 |
-if test $ac_cv_c_bigendian = unknown; then
|
yann@402
|
408 |
-AC_MSG_CHECKING(to probe for byte ordering)
|
yann@402
|
409 |
-[
|
yann@402
|
410 |
-cat >conftest.c <<EOF
|
yann@402
|
411 |
-short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
|
yann@402
|
412 |
-short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
|
yann@402
|
413 |
-void _ascii() { char* s = (char*) ascii_mm; s = (char*) ascii_ii; }
|
yann@402
|
414 |
-short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
|
yann@402
|
415 |
-short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
|
yann@402
|
416 |
-void _ebcdic() { char* s = (char*) ebcdic_mm; s = (char*) ebcdic_ii; }
|
yann@402
|
417 |
-int main() { _ascii (); _ebcdic (); return 0; }
|
yann@402
|
418 |
-EOF
|
yann@402
|
419 |
-] if test -f conftest.c ; then
|
yann@402
|
420 |
- if ${CC-cc} ${CFLAGS} conftest.c -o conftest.o && test -f conftest.o ; then
|
yann@402
|
421 |
- if test `grep -l BIGenDianSyS conftest.o` ; then
|
yann@402
|
422 |
- echo $ac_n ' big endian probe OK, ' 1>&AC_FD_MSG
|
yann@402
|
423 |
- ac_cv_c_bigendian=yes
|
yann@402
|
424 |
- fi
|
yann@402
|
425 |
- if test `grep -l LiTTleEnDian conftest.o` ; then
|
yann@402
|
426 |
- echo $ac_n ' little endian probe OK, ' 1>&AC_FD_MSG
|
yann@402
|
427 |
- if test $ac_cv_c_bigendian = yes ; then
|
yann@402
|
428 |
- ac_cv_c_bigendian=unknown;
|
yann@402
|
429 |
- else
|
yann@402
|
430 |
- ac_cv_c_bigendian=no
|
yann@402
|
431 |
- fi
|
yann@402
|
432 |
- fi
|
yann@402
|
433 |
- echo $ac_n 'guessing bigendian ... ' >&AC_FD_MSG
|
yann@402
|
434 |
- fi
|
yann@402
|
435 |
- fi
|
yann@402
|
436 |
-AC_MSG_RESULT($ac_cv_c_bigendian)
|
yann@402
|
437 |
-fi
|
yann@402
|
438 |
-if test $ac_cv_c_bigendian = yes; then
|
yann@402
|
439 |
- AC_DEFINE(WORDS_BIGENDIAN, 1, [whether byteorder is bigendian])
|
yann@402
|
440 |
- BYTEORDER=4321
|
yann@402
|
441 |
-else
|
yann@402
|
442 |
- BYTEORDER=1234
|
yann@402
|
443 |
-fi
|
yann@402
|
444 |
-AC_DEFINE_UNQUOTED(BYTEORDER, $BYTEORDER, [1234 = LIL_ENDIAN, 4321 = BIGENDIAN])
|
yann@402
|
445 |
-if test $ac_cv_c_bigendian = unknown; then
|
yann@402
|
446 |
- AC_MSG_ERROR(unknown endianess - sorry, please pre-set ac_cv_c_bigendian)
|
yann@402
|
447 |
-fi
|
yann@402
|
448 |
-])
|
yann@402
|
449 |
+sinclude(../config/accross.m4)
|
yann@402
|
450 |
|
yann@402
|
451 |
# Like AC_CONFIG_HEADER, but automatically create stamp file.
|
yann@402
|
452 |
|
yann@402
|
453 |
-AC_DEFUN(AM_CONFIG_HEADER,
|
yann@402
|
454 |
+AC_DEFUN([AM_CONFIG_HEADER],
|
yann@402
|
455 |
[AC_PREREQ([2.12])
|
yann@402
|
456 |
AC_CONFIG_HEADER([$1])
|
yann@402
|
457 |
dnl When config.status generates a header, we must update the stamp-h file.
|
yann@402
|
458 |
@@ -147,7 +54,7 @@
|
yann@402
|
459 |
dnl Usage:
|
yann@402
|
460 |
dnl AM_INIT_AUTOMAKE(package,version, [no-define])
|
yann@402
|
461 |
|
yann@402
|
462 |
-AC_DEFUN(AM_INIT_AUTOMAKE,
|
yann@402
|
463 |
+AC_DEFUN([AM_INIT_AUTOMAKE],
|
yann@402
|
464 |
[AC_REQUIRE([AC_PROG_INSTALL])
|
yann@402
|
465 |
PACKAGE=[$1]
|
yann@402
|
466 |
AC_SUBST(PACKAGE)
|
yann@402
|
467 |
@@ -175,7 +82,7 @@
|
yann@402
|
468 |
# Check to make sure that the build environment is sane.
|
yann@402
|
469 |
#
|
yann@402
|
470 |
|
yann@402
|
471 |
-AC_DEFUN(AM_SANITY_CHECK,
|
yann@402
|
472 |
+AC_DEFUN([AM_SANITY_CHECK],
|
yann@402
|
473 |
[AC_MSG_CHECKING([whether build environment is sane])
|
yann@402
|
474 |
# Just in case
|
yann@402
|
475 |
sleep 1
|
yann@402
|
476 |
@@ -216,7 +123,7 @@
|
yann@402
|
477 |
|
yann@402
|
478 |
dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY)
|
yann@402
|
479 |
dnl The program must properly implement --version.
|
yann@402
|
480 |
-AC_DEFUN(AM_MISSING_PROG,
|
yann@402
|
481 |
+AC_DEFUN([AM_MISSING_PROG],
|
yann@402
|
482 |
[AC_MSG_CHECKING(for working $2)
|
yann@402
|
483 |
# Run test in a subshell; some versions of sh will print an error if
|
yann@402
|
484 |
# an executable is not found, even if stderr is redirected.
|
yann@402
|
485 |
@@ -235,7 +142,7 @@
|
yann@402
|
486 |
|
yann@402
|
487 |
# serial 1
|
yann@402
|
488 |
|
yann@402
|
489 |
-AC_DEFUN(AM_MAINTAINER_MODE,
|
yann@402
|
490 |
+AC_DEFUN([AM_MAINTAINER_MODE],
|
yann@402
|
491 |
[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
|
yann@402
|
492 |
dnl maintainer-mode is disabled by default
|
yann@402
|
493 |
AC_ARG_ENABLE(maintainer-mode,
|
yann@402
|
494 |
@@ -252,7 +159,7 @@
|
yann@402
|
495 |
|
yann@402
|
496 |
# Define a conditional.
|
yann@402
|
497 |
|
yann@402
|
498 |
-AC_DEFUN(AM_CONDITIONAL,
|
yann@402
|
499 |
+AC_DEFUN([AM_CONDITIONAL],
|
yann@402
|
500 |
[AC_SUBST($1_TRUE)
|
yann@402
|
501 |
AC_SUBST($1_FALSE)
|
yann@402
|
502 |
if $2; then
|
yann@402
|
503 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure gcc/libffi/configure
|
yann@402
|
504 |
--- gcc-3.2.2.orig/libffi/configure Wed Jan 29 07:59:05 2003
|
yann@402
|
505 |
+++ gcc/libffi/configure Sat Feb 1 20:16:19 2003
|
yann@402
|
506 |
@@ -633,17 +633,16 @@
|
yann@402
|
507 |
|
yann@402
|
508 |
if test "${srcdir}" = "."; then
|
yann@402
|
509 |
if test "${with_target_subdir}" != "."; then
|
yann@402
|
510 |
- libffi_basedir="${srcdir}/${with_multisrctop}.."
|
yann@402
|
511 |
+ libffi_basedir="${with_multisrctop}../"
|
yann@402
|
512 |
else
|
yann@402
|
513 |
- libffi_basedir="${srcdir}/${with_multisrctop}"
|
yann@402
|
514 |
+ libffi_basedir="${with_multisrctop}"
|
yann@402
|
515 |
fi
|
yann@402
|
516 |
else
|
yann@402
|
517 |
- libffi_basedir="${srcdir}"
|
yann@402
|
518 |
+ libffi_basedir=
|
yann@402
|
519 |
fi
|
yann@402
|
520 |
|
yann@402
|
521 |
-
|
yann@402
|
522 |
ac_aux_dir=
|
yann@402
|
523 |
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
|
yann@402
|
524 |
+for ac_dir in ${libffi_basedir}.. $srcdir/${libffi_basedir}..; do
|
yann@402
|
525 |
if test -f $ac_dir/install-sh; then
|
yann@402
|
526 |
ac_aux_dir=$ac_dir
|
yann@402
|
527 |
ac_install_sh="$ac_aux_dir/install-sh -c"
|
yann@402
|
528 |
@@ -655,13 +654,14 @@
|
yann@402
|
529 |
fi
|
yann@402
|
530 |
done
|
yann@402
|
531 |
if test -z "$ac_aux_dir"; then
|
yann@402
|
532 |
- { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
|
yann@402
|
533 |
+ { echo "configure: error: can not find install-sh or install.sh in ${libffi_basedir}.. $srcdir/${libffi_basedir}.." 1>&2; exit 1; }
|
yann@402
|
534 |
fi
|
yann@402
|
535 |
ac_config_guess=$ac_aux_dir/config.guess
|
yann@402
|
536 |
ac_config_sub=$ac_aux_dir/config.sub
|
yann@402
|
537 |
ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
|
yann@402
|
538 |
|
yann@402
|
539 |
|
yann@402
|
540 |
+
|
yann@402
|
541 |
# Make sure we can run config.sub.
|
yann@402
|
542 |
if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
|
yann@402
|
543 |
else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
|
yann@402
|
544 |
@@ -1238,9 +1238,18 @@
|
yann@402
|
545 |
;;
|
yann@402
|
546 |
|
yann@402
|
547 |
hpux10.20*|hpux11*)
|
yann@402
|
548 |
- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
|
yann@402
|
549 |
- lt_cv_file_magic_cmd=/usr/bin/file
|
yann@402
|
550 |
- lt_cv_file_magic_test_file=/usr/lib/libc.sl
|
yann@402
|
551 |
+ case $host_cpu in
|
yann@402
|
552 |
+ hppa*)
|
yann@402
|
553 |
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
|
yann@402
|
554 |
+ lt_cv_file_magic_cmd=/usr/bin/file
|
yann@402
|
555 |
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
|
yann@402
|
556 |
+ ;;
|
yann@402
|
557 |
+ ia64*)
|
yann@402
|
558 |
+ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
|
yann@402
|
559 |
+ lt_cv_file_magic_cmd=/usr/bin/file
|
yann@402
|
560 |
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
|
yann@402
|
561 |
+ ;;
|
yann@402
|
562 |
+ esac
|
yann@402
|
563 |
;;
|
yann@402
|
564 |
|
yann@402
|
565 |
irix5* | irix6*)
|
yann@402
|
566 |
@@ -1267,7 +1276,7 @@
|
yann@402
|
567 |
# This must be Linux ELF.
|
yann@402
|
568 |
linux-gnu*)
|
yann@402
|
569 |
case $host_cpu in
|
yann@402
|
570 |
- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* )
|
yann@402
|
571 |
+ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* )
|
yann@402
|
572 |
lt_cv_deplibs_check_method=pass_all ;;
|
yann@402
|
573 |
*)
|
yann@402
|
574 |
# glibc up to 2.1.1 does not perform some relocations on ARM
|
yann@402
|
575 |
@@ -1330,13 +1339,13 @@
|
yann@402
|
576 |
deplibs_check_method=$lt_cv_deplibs_check_method
|
yann@402
|
577 |
|
yann@402
|
578 |
echo $ac_n "checking for object suffix""... $ac_c" 1>&6
|
yann@402
|
579 |
-echo "configure:1334: checking for object suffix" >&5
|
yann@402
|
580 |
+echo "configure:1343: checking for object suffix" >&5
|
yann@402
|
581 |
if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
|
yann@402
|
582 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
583 |
else
|
yann@402
|
584 |
rm -f conftest*
|
yann@402
|
585 |
echo 'int i = 1;' > conftest.$ac_ext
|
yann@402
|
586 |
-if { (eval echo configure:1340: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
587 |
+if { (eval echo configure:1349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
588 |
for ac_file in conftest.*; do
|
yann@402
|
589 |
case $ac_file in
|
yann@402
|
590 |
*.c) ;;
|
yann@402
|
591 |
@@ -1356,7 +1365,7 @@
|
yann@402
|
592 |
|
yann@402
|
593 |
|
yann@402
|
594 |
echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
|
yann@402
|
595 |
-echo "configure:1360: checking for executable suffix" >&5
|
yann@402
|
596 |
+echo "configure:1369: checking for executable suffix" >&5
|
yann@402
|
597 |
if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
|
yann@402
|
598 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
599 |
else
|
yann@402
|
600 |
@@ -1366,7 +1375,7 @@
|
yann@402
|
601 |
rm -f conftest*
|
yann@402
|
602 |
echo 'int main () { return 0; }' > conftest.$ac_ext
|
yann@402
|
603 |
ac_cv_exeext=
|
yann@402
|
604 |
- if { (eval echo configure:1370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
|
yann@402
|
605 |
+ if { (eval echo configure:1379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
|
yann@402
|
606 |
for file in conftest.*; do
|
yann@402
|
607 |
case $file in
|
yann@402
|
608 |
*.c | *.o | *.obj) ;;
|
yann@402
|
609 |
@@ -1399,7 +1408,7 @@
|
yann@402
|
610 |
file_magic*)
|
yann@402
|
611 |
if test "$file_magic_cmd" = '$MAGIC_CMD'; then
|
yann@402
|
612 |
echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6
|
yann@402
|
613 |
-echo "configure:1403: checking for ${ac_tool_prefix}file" >&5
|
yann@402
|
614 |
+echo "configure:1412: checking for ${ac_tool_prefix}file" >&5
|
yann@402
|
615 |
if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
|
yann@402
|
616 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
617 |
else
|
yann@402
|
618 |
@@ -1461,7 +1470,7 @@
|
yann@402
|
619 |
if test -z "$lt_cv_path_MAGIC_CMD"; then
|
yann@402
|
620 |
if test -n "$ac_tool_prefix"; then
|
yann@402
|
621 |
echo $ac_n "checking for file""... $ac_c" 1>&6
|
yann@402
|
622 |
-echo "configure:1465: checking for file" >&5
|
yann@402
|
623 |
+echo "configure:1474: checking for file" >&5
|
yann@402
|
624 |
if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
|
yann@402
|
625 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
626 |
else
|
yann@402
|
627 |
@@ -1532,7 +1541,7 @@
|
yann@402
|
628 |
# Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
|
yann@402
|
629 |
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
|
yann@402
|
630 |
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
yann@402
|
631 |
-echo "configure:1536: checking for $ac_word" >&5
|
yann@402
|
632 |
+echo "configure:1545: checking for $ac_word" >&5
|
yann@402
|
633 |
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
|
yann@402
|
634 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
635 |
else
|
yann@402
|
636 |
@@ -1564,7 +1573,7 @@
|
yann@402
|
637 |
# Extract the first word of "ranlib", so it can be a program name with args.
|
yann@402
|
638 |
set dummy ranlib; ac_word=$2
|
yann@402
|
639 |
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
yann@402
|
640 |
-echo "configure:1568: checking for $ac_word" >&5
|
yann@402
|
641 |
+echo "configure:1577: checking for $ac_word" >&5
|
yann@402
|
642 |
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
|
yann@402
|
643 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
644 |
else
|
yann@402
|
645 |
@@ -1599,7 +1608,7 @@
|
yann@402
|
646 |
# Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
|
yann@402
|
647 |
set dummy ${ac_tool_prefix}strip; ac_word=$2
|
yann@402
|
648 |
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
yann@402
|
649 |
-echo "configure:1603: checking for $ac_word" >&5
|
yann@402
|
650 |
+echo "configure:1612: checking for $ac_word" >&5
|
yann@402
|
651 |
if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
|
yann@402
|
652 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
653 |
else
|
yann@402
|
654 |
@@ -1631,7 +1640,7 @@
|
yann@402
|
655 |
# Extract the first word of "strip", so it can be a program name with args.
|
yann@402
|
656 |
set dummy strip; ac_word=$2
|
yann@402
|
657 |
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
yann@402
|
658 |
-echo "configure:1635: checking for $ac_word" >&5
|
yann@402
|
659 |
+echo "configure:1644: checking for $ac_word" >&5
|
yann@402
|
660 |
if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
|
yann@402
|
661 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
662 |
else
|
yann@402
|
663 |
@@ -1698,8 +1707,8 @@
|
yann@402
|
664 |
case $host in
|
yann@402
|
665 |
*-*-irix6*)
|
yann@402
|
666 |
# Find out which ABI we are using.
|
yann@402
|
667 |
- echo '#line 1702 "configure"' > conftest.$ac_ext
|
yann@402
|
668 |
- if { (eval echo configure:1703: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
669 |
+ echo '#line 1711 "configure"' > conftest.$ac_ext
|
yann@402
|
670 |
+ if { (eval echo configure:1712: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
671 |
case `/usr/bin/file conftest.$ac_objext` in
|
yann@402
|
672 |
*32-bit*)
|
yann@402
|
673 |
LD="${LD-ld} -32"
|
yann@402
|
674 |
@@ -1715,12 +1724,70 @@
|
yann@402
|
675 |
rm -rf conftest*
|
yann@402
|
676 |
;;
|
yann@402
|
677 |
|
yann@402
|
678 |
+ia64-*-hpux*)
|
yann@402
|
679 |
+ # Find out which ABI we are using.
|
yann@402
|
680 |
+ echo 'int i;' > conftest.$ac_ext
|
yann@402
|
681 |
+ if { (eval echo configure:1731: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
682 |
+ case "`/usr/bin/file conftest.o`" in
|
yann@402
|
683 |
+ *ELF-32*)
|
yann@402
|
684 |
+ HPUX_IA64_MODE="32"
|
yann@402
|
685 |
+ ;;
|
yann@402
|
686 |
+ *ELF-64*)
|
yann@402
|
687 |
+ HPUX_IA64_MODE="64"
|
yann@402
|
688 |
+ ;;
|
yann@402
|
689 |
+ esac
|
yann@402
|
690 |
+ fi
|
yann@402
|
691 |
+ rm -rf conftest*
|
yann@402
|
692 |
+ ;;
|
yann@402
|
693 |
+
|
yann@402
|
694 |
+x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
|
yann@402
|
695 |
+ # Find out which ABI we are using.
|
yann@402
|
696 |
+ echo 'int i;' > conftest.$ac_ext
|
yann@402
|
697 |
+ if { (eval echo configure:1747: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
698 |
+ case "`/usr/bin/file conftest.o`" in
|
yann@402
|
699 |
+ *32-bit*)
|
yann@402
|
700 |
+ case $host in
|
yann@402
|
701 |
+ x86_64-*linux*)
|
yann@402
|
702 |
+ LD="${LD-ld} -m elf_i386"
|
yann@402
|
703 |
+ ;;
|
yann@402
|
704 |
+ ppc64-*linux*)
|
yann@402
|
705 |
+ LD="${LD-ld} -m elf32ppclinux"
|
yann@402
|
706 |
+ ;;
|
yann@402
|
707 |
+ s390x-*linux*)
|
yann@402
|
708 |
+ LD="${LD-ld} -m elf_s390"
|
yann@402
|
709 |
+ ;;
|
yann@402
|
710 |
+ sparc64-*linux*)
|
yann@402
|
711 |
+ LD="${LD-ld} -m elf32_sparc"
|
yann@402
|
712 |
+ ;;
|
yann@402
|
713 |
+ esac
|
yann@402
|
714 |
+ ;;
|
yann@402
|
715 |
+ *64-bit*)
|
yann@402
|
716 |
+ case $host in
|
yann@402
|
717 |
+ x86_64-*linux*)
|
yann@402
|
718 |
+ LD="${LD-ld} -m elf_x86_64"
|
yann@402
|
719 |
+ ;;
|
yann@402
|
720 |
+ ppc*-*linux*|powerpc*-*linux*)
|
yann@402
|
721 |
+ LD="${LD-ld} -m elf64ppc"
|
yann@402
|
722 |
+ ;;
|
yann@402
|
723 |
+ s390*-*linux*)
|
yann@402
|
724 |
+ LD="${LD-ld} -m elf64_s390"
|
yann@402
|
725 |
+ ;;
|
yann@402
|
726 |
+ sparc*-*linux*)
|
yann@402
|
727 |
+ LD="${LD-ld} -m elf64_sparc"
|
yann@402
|
728 |
+ ;;
|
yann@402
|
729 |
+ esac
|
yann@402
|
730 |
+ ;;
|
yann@402
|
731 |
+ esac
|
yann@402
|
732 |
+ fi
|
yann@402
|
733 |
+ rm -rf conftest*
|
yann@402
|
734 |
+ ;;
|
yann@402
|
735 |
+
|
yann@402
|
736 |
*-*-sco3.2v5*)
|
yann@402
|
737 |
# On SCO OpenServer 5, we need -belf to get full-featured binaries.
|
yann@402
|
738 |
SAVE_CFLAGS="$CFLAGS"
|
yann@402
|
739 |
CFLAGS="$CFLAGS -belf"
|
yann@402
|
740 |
echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
|
yann@402
|
741 |
-echo "configure:1724: checking whether the C compiler needs -belf" >&5
|
yann@402
|
742 |
+echo "configure:1791: checking whether the C compiler needs -belf" >&5
|
yann@402
|
743 |
if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
|
yann@402
|
744 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
745 |
else
|
yann@402
|
746 |
@@ -1733,14 +1800,14 @@
|
yann@402
|
747 |
cross_compiling=$ac_cv_prog_cc_cross
|
yann@402
|
748 |
|
yann@402
|
749 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
750 |
-#line 1737 "configure"
|
yann@402
|
751 |
+#line 1804 "configure"
|
yann@402
|
752 |
#include "confdefs.h"
|
yann@402
|
753 |
|
yann@402
|
754 |
int main() {
|
yann@402
|
755 |
|
yann@402
|
756 |
; return 0; }
|
yann@402
|
757 |
EOF
|
yann@402
|
758 |
-if { (eval echo configure:1744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
yann@402
|
759 |
+if { (eval echo configure:1811: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
yann@402
|
760 |
rm -rf conftest*
|
yann@402
|
761 |
lt_cv_cc_needs_belf=yes
|
yann@402
|
762 |
else
|
yann@402
|
763 |
@@ -1868,7 +1935,7 @@
|
yann@402
|
764 |
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
|
yann@402
|
765 |
# ./install, which can be erroneously created by make from ./install.sh.
|
yann@402
|
766 |
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
|
yann@402
|
767 |
-echo "configure:1872: checking for a BSD compatible install" >&5
|
yann@402
|
768 |
+echo "configure:1939: checking for a BSD compatible install" >&5
|
yann@402
|
769 |
if test -z "$INSTALL"; then
|
yann@402
|
770 |
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
|
yann@402
|
771 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
772 |
@@ -1921,7 +1988,7 @@
|
yann@402
|
773 |
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
|
yann@402
|
774 |
|
yann@402
|
775 |
echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
|
yann@402
|
776 |
-echo "configure:1925: checking whether build environment is sane" >&5
|
yann@402
|
777 |
+echo "configure:1992: checking whether build environment is sane" >&5
|
yann@402
|
778 |
# Just in case
|
yann@402
|
779 |
sleep 1
|
yann@402
|
780 |
echo timestamp > conftestfile
|
yann@402
|
781 |
@@ -1978,7 +2045,7 @@
|
yann@402
|
782 |
test "$program_transform_name" = "" && program_transform_name="s,x,x,"
|
yann@402
|
783 |
|
yann@402
|
784 |
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
|
yann@402
|
785 |
-echo "configure:1982: checking whether ${MAKE-make} sets \${MAKE}" >&5
|
yann@402
|
786 |
+echo "configure:2049: checking whether ${MAKE-make} sets \${MAKE}" >&5
|
yann@402
|
787 |
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
|
yann@402
|
788 |
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
|
yann@402
|
789 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
790 |
@@ -2017,7 +2084,7 @@
|
yann@402
|
791 |
|
yann@402
|
792 |
missing_dir=`cd $ac_aux_dir && pwd`
|
yann@402
|
793 |
echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
|
yann@402
|
794 |
-echo "configure:2021: checking for working aclocal" >&5
|
yann@402
|
795 |
+echo "configure:2088: checking for working aclocal" >&5
|
yann@402
|
796 |
# Run test in a subshell; some versions of sh will print an error if
|
yann@402
|
797 |
# an executable is not found, even if stderr is redirected.
|
yann@402
|
798 |
# Redirect stdin to placate older versions of autoconf. Sigh.
|
yann@402
|
799 |
@@ -2030,7 +2097,7 @@
|
yann@402
|
800 |
fi
|
yann@402
|
801 |
|
yann@402
|
802 |
echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
|
yann@402
|
803 |
-echo "configure:2034: checking for working autoconf" >&5
|
yann@402
|
804 |
+echo "configure:2101: checking for working autoconf" >&5
|
yann@402
|
805 |
# Run test in a subshell; some versions of sh will print an error if
|
yann@402
|
806 |
# an executable is not found, even if stderr is redirected.
|
yann@402
|
807 |
# Redirect stdin to placate older versions of autoconf. Sigh.
|
yann@402
|
808 |
@@ -2043,7 +2110,7 @@
|
yann@402
|
809 |
fi
|
yann@402
|
810 |
|
yann@402
|
811 |
echo $ac_n "checking for working automake""... $ac_c" 1>&6
|
yann@402
|
812 |
-echo "configure:2047: checking for working automake" >&5
|
yann@402
|
813 |
+echo "configure:2114: checking for working automake" >&5
|
yann@402
|
814 |
# Run test in a subshell; some versions of sh will print an error if
|
yann@402
|
815 |
# an executable is not found, even if stderr is redirected.
|
yann@402
|
816 |
# Redirect stdin to placate older versions of autoconf. Sigh.
|
yann@402
|
817 |
@@ -2056,7 +2123,7 @@
|
yann@402
|
818 |
fi
|
yann@402
|
819 |
|
yann@402
|
820 |
echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
|
yann@402
|
821 |
-echo "configure:2060: checking for working autoheader" >&5
|
yann@402
|
822 |
+echo "configure:2127: checking for working autoheader" >&5
|
yann@402
|
823 |
# Run test in a subshell; some versions of sh will print an error if
|
yann@402
|
824 |
# an executable is not found, even if stderr is redirected.
|
yann@402
|
825 |
# Redirect stdin to placate older versions of autoconf. Sigh.
|
yann@402
|
826 |
@@ -2069,7 +2136,7 @@
|
yann@402
|
827 |
fi
|
yann@402
|
828 |
|
yann@402
|
829 |
echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
|
yann@402
|
830 |
-echo "configure:2073: checking for working makeinfo" >&5
|
yann@402
|
831 |
+echo "configure:2140: checking for working makeinfo" >&5
|
yann@402
|
832 |
# Run test in a subshell; some versions of sh will print an error if
|
yann@402
|
833 |
# an executable is not found, even if stderr is redirected.
|
yann@402
|
834 |
# Redirect stdin to placate older versions of autoconf. Sigh.
|
yann@402
|
835 |
@@ -2086,7 +2153,7 @@
|
yann@402
|
836 |
|
yann@402
|
837 |
|
yann@402
|
838 |
echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
|
yann@402
|
839 |
-echo "configure:2090: checking for executable suffix" >&5
|
yann@402
|
840 |
+echo "configure:2157: checking for executable suffix" >&5
|
yann@402
|
841 |
if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
|
yann@402
|
842 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
843 |
else
|
yann@402
|
844 |
@@ -2096,7 +2163,7 @@
|
yann@402
|
845 |
rm -f conftest*
|
yann@402
|
846 |
echo 'int main () { return 0; }' > conftest.$ac_ext
|
yann@402
|
847 |
ac_cv_exeext=
|
yann@402
|
848 |
- if { (eval echo configure:2100: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
|
yann@402
|
849 |
+ if { (eval echo configure:2167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
|
yann@402
|
850 |
for file in conftest.*; do
|
yann@402
|
851 |
case $file in
|
yann@402
|
852 |
*.c | *.o | *.obj) ;;
|
yann@402
|
853 |
@@ -2117,7 +2184,7 @@
|
yann@402
|
854 |
ac_exeext=$EXEEXT
|
yann@402
|
855 |
|
yann@402
|
856 |
echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
|
yann@402
|
857 |
-echo "configure:2121: checking whether to enable maintainer-specific portions of Makefiles" >&5
|
yann@402
|
858 |
+echo "configure:2188: checking whether to enable maintainer-specific portions of Makefiles" >&5
|
yann@402
|
859 |
# Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
|
yann@402
|
860 |
if test "${enable_maintainer_mode+set}" = set; then
|
yann@402
|
861 |
enableval="$enable_maintainer_mode"
|
yann@402
|
862 |
@@ -2143,7 +2210,7 @@
|
yann@402
|
863 |
# Extract the first word of "gcc", so it can be a program name with args.
|
yann@402
|
864 |
set dummy gcc; ac_word=$2
|
yann@402
|
865 |
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
yann@402
|
866 |
-echo "configure:2147: checking for $ac_word" >&5
|
yann@402
|
867 |
+echo "configure:2214: checking for $ac_word" >&5
|
yann@402
|
868 |
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
|
yann@402
|
869 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
870 |
else
|
yann@402
|
871 |
@@ -2173,7 +2240,7 @@
|
yann@402
|
872 |
# Extract the first word of "cc", so it can be a program name with args.
|
yann@402
|
873 |
set dummy cc; ac_word=$2
|
yann@402
|
874 |
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
yann@402
|
875 |
-echo "configure:2177: checking for $ac_word" >&5
|
yann@402
|
876 |
+echo "configure:2244: checking for $ac_word" >&5
|
yann@402
|
877 |
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
|
yann@402
|
878 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
879 |
else
|
yann@402
|
880 |
@@ -2224,7 +2291,7 @@
|
yann@402
|
881 |
# Extract the first word of "cl", so it can be a program name with args.
|
yann@402
|
882 |
set dummy cl; ac_word=$2
|
yann@402
|
883 |
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
yann@402
|
884 |
-echo "configure:2228: checking for $ac_word" >&5
|
yann@402
|
885 |
+echo "configure:2295: checking for $ac_word" >&5
|
yann@402
|
886 |
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
|
yann@402
|
887 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
888 |
else
|
yann@402
|
889 |
@@ -2256,7 +2323,7 @@
|
yann@402
|
890 |
fi
|
yann@402
|
891 |
|
yann@402
|
892 |
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
|
yann@402
|
893 |
-echo "configure:2260: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
|
yann@402
|
894 |
+echo "configure:2327: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
|
yann@402
|
895 |
|
yann@402
|
896 |
ac_ext=c
|
yann@402
|
897 |
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
|
yann@402
|
898 |
@@ -2267,12 +2334,12 @@
|
yann@402
|
899 |
|
yann@402
|
900 |
cat > conftest.$ac_ext << EOF
|
yann@402
|
901 |
|
yann@402
|
902 |
-#line 2271 "configure"
|
yann@402
|
903 |
+#line 2338 "configure"
|
yann@402
|
904 |
#include "confdefs.h"
|
yann@402
|
905 |
|
yann@402
|
906 |
main(){return(0);}
|
yann@402
|
907 |
EOF
|
yann@402
|
908 |
-if { (eval echo configure:2276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
yann@402
|
909 |
+if { (eval echo configure:2343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
yann@402
|
910 |
ac_cv_prog_cc_works=yes
|
yann@402
|
911 |
# If we can't run a trivial program, we are probably using a cross compiler.
|
yann@402
|
912 |
if (./conftest; exit) 2>/dev/null; then
|
yann@402
|
913 |
@@ -2298,12 +2365,12 @@
|
yann@402
|
914 |
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
|
yann@402
|
915 |
fi
|
yann@402
|
916 |
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
|
yann@402
|
917 |
-echo "configure:2302: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
|
yann@402
|
918 |
+echo "configure:2369: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
|
yann@402
|
919 |
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
|
yann@402
|
920 |
cross_compiling=$ac_cv_prog_cc_cross
|
yann@402
|
921 |
|
yann@402
|
922 |
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
|
yann@402
|
923 |
-echo "configure:2307: checking whether we are using GNU C" >&5
|
yann@402
|
924 |
+echo "configure:2374: checking whether we are using GNU C" >&5
|
yann@402
|
925 |
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
|
yann@402
|
926 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
927 |
else
|
yann@402
|
928 |
@@ -2312,7 +2379,7 @@
|
yann@402
|
929 |
yes;
|
yann@402
|
930 |
#endif
|
yann@402
|
931 |
EOF
|
yann@402
|
932 |
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2316: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
|
yann@402
|
933 |
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2383: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
|
yann@402
|
934 |
ac_cv_prog_gcc=yes
|
yann@402
|
935 |
else
|
yann@402
|
936 |
ac_cv_prog_gcc=no
|
yann@402
|
937 |
@@ -2331,7 +2398,7 @@
|
yann@402
|
938 |
ac_save_CFLAGS="$CFLAGS"
|
yann@402
|
939 |
CFLAGS=
|
yann@402
|
940 |
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
|
yann@402
|
941 |
-echo "configure:2335: checking whether ${CC-cc} accepts -g" >&5
|
yann@402
|
942 |
+echo "configure:2402: checking whether ${CC-cc} accepts -g" >&5
|
yann@402
|
943 |
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
|
yann@402
|
944 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
945 |
else
|
yann@402
|
946 |
@@ -2381,17 +2448,23 @@
|
yann@402
|
947 |
i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;;
|
yann@402
|
948 |
sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;;
|
yann@402
|
949 |
sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;;
|
yann@402
|
950 |
-sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
|
yann@402
|
951 |
-sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
|
yann@402
|
952 |
-alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;;
|
yann@402
|
953 |
+sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;;
|
yann@402
|
954 |
+sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;;
|
yann@402
|
955 |
+alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;;
|
yann@402
|
956 |
ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;;
|
yann@402
|
957 |
m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;;
|
yann@402
|
958 |
+mips64*-*);;
|
yann@402
|
959 |
+mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;;
|
yann@402
|
960 |
powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;;
|
yann@402
|
961 |
powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;;
|
yann@402
|
962 |
powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;;
|
yann@402
|
963 |
powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
|
yann@402
|
964 |
rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
|
yann@402
|
965 |
arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;;
|
yann@402
|
966 |
+s390-*-linux-*) TARGET=S390; TARGETDIR=s390;;
|
yann@402
|
967 |
+s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;;
|
yann@402
|
968 |
+x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;;
|
yann@402
|
969 |
+sh-*-linux* | sh[34]*-*-linux*) TARGET=SH; TARGETDIR=sh;;
|
yann@402
|
970 |
esac
|
yann@402
|
971 |
|
yann@402
|
972 |
if test $TARGETDIR = unknown; then
|
yann@402
|
973 |
@@ -2418,6 +2491,15 @@
|
yann@402
|
974 |
fi
|
yann@402
|
975 |
|
yann@402
|
976 |
|
yann@402
|
977 |
+if test x$TARGET = xMIPS_LINUX; then
|
yann@402
|
978 |
+ MIPS_LINUX_TRUE=
|
yann@402
|
979 |
+ MIPS_LINUX_FALSE='#'
|
yann@402
|
980 |
+else
|
yann@402
|
981 |
+ MIPS_LINUX_TRUE='#'
|
yann@402
|
982 |
+ MIPS_LINUX_FALSE=
|
yann@402
|
983 |
+fi
|
yann@402
|
984 |
+
|
yann@402
|
985 |
+
|
yann@402
|
986 |
if test x$TARGET = xSPARC; then
|
yann@402
|
987 |
SPARC_TRUE=
|
yann@402
|
988 |
SPARC_FALSE='#'
|
yann@402
|
989 |
@@ -2507,8 +2589,39 @@
|
yann@402
|
990 |
ARM_FALSE=
|
yann@402
|
991 |
fi
|
yann@402
|
992 |
|
yann@402
|
993 |
+
|
yann@402
|
994 |
+if test x$TARGET = xS390; then
|
yann@402
|
995 |
+ S390_TRUE=
|
yann@402
|
996 |
+ S390_FALSE='#'
|
yann@402
|
997 |
+else
|
yann@402
|
998 |
+ S390_TRUE='#'
|
yann@402
|
999 |
+ S390_FALSE=
|
yann@402
|
1000 |
+fi
|
yann@402
|
1001 |
+
|
yann@402
|
1002 |
+
|
yann@402
|
1003 |
+if test x$TARGET = xX86_64; then
|
yann@402
|
1004 |
+ X86_64_TRUE=
|
yann@402
|
1005 |
+ X86_64_FALSE='#'
|
yann@402
|
1006 |
+else
|
yann@402
|
1007 |
+ X86_64_TRUE='#'
|
yann@402
|
1008 |
+ X86_64_FALSE=
|
yann@402
|
1009 |
+fi
|
yann@402
|
1010 |
+
|
yann@402
|
1011 |
+
|
yann@402
|
1012 |
+if test x$TARGET = xSH; then
|
yann@402
|
1013 |
+ SH_TRUE=
|
yann@402
|
1014 |
+ SH_FALSE='#'
|
yann@402
|
1015 |
+else
|
yann@402
|
1016 |
+ SH_TRUE='#'
|
yann@402
|
1017 |
+ SH_FALSE=
|
yann@402
|
1018 |
+fi
|
yann@402
|
1019 |
+
|
yann@402
|
1020 |
+if test x$TARGET = xMIPS_LINUX; then
|
yann@402
|
1021 |
+ TARGET=MIPS
|
yann@402
|
1022 |
+fi
|
yann@402
|
1023 |
+
|
yann@402
|
1024 |
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
|
yann@402
|
1025 |
-echo "configure:2512: checking how to run the C preprocessor" >&5
|
yann@402
|
1026 |
+echo "configure:2625: checking how to run the C preprocessor" >&5
|
yann@402
|
1027 |
# On Suns, sometimes $CPP names a directory.
|
yann@402
|
1028 |
if test -n "$CPP" && test -d "$CPP"; then
|
yann@402
|
1029 |
CPP=
|
yann@402
|
1030 |
@@ -2523,13 +2636,13 @@
|
yann@402
|
1031 |
# On the NeXT, cc -E runs the code through the compiler's parser,
|
yann@402
|
1032 |
# not just through cpp.
|
yann@402
|
1033 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1034 |
-#line 2527 "configure"
|
yann@402
|
1035 |
+#line 2640 "configure"
|
yann@402
|
1036 |
#include "confdefs.h"
|
yann@402
|
1037 |
#include <assert.h>
|
yann@402
|
1038 |
Syntax Error
|
yann@402
|
1039 |
EOF
|
yann@402
|
1040 |
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
yann@402
|
1041 |
-{ (eval echo configure:2533: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
yann@402
|
1042 |
+{ (eval echo configure:2646: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
yann@402
|
1043 |
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
|
yann@402
|
1044 |
if test -z "$ac_err"; then
|
yann@402
|
1045 |
:
|
yann@402
|
1046 |
@@ -2540,13 +2653,13 @@
|
yann@402
|
1047 |
rm -rf conftest*
|
yann@402
|
1048 |
CPP="${CC-cc} -E -traditional-cpp"
|
yann@402
|
1049 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1050 |
-#line 2544 "configure"
|
yann@402
|
1051 |
+#line 2657 "configure"
|
yann@402
|
1052 |
#include "confdefs.h"
|
yann@402
|
1053 |
#include <assert.h>
|
yann@402
|
1054 |
Syntax Error
|
yann@402
|
1055 |
EOF
|
yann@402
|
1056 |
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
yann@402
|
1057 |
-{ (eval echo configure:2550: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
yann@402
|
1058 |
+{ (eval echo configure:2663: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
yann@402
|
1059 |
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
|
yann@402
|
1060 |
if test -z "$ac_err"; then
|
yann@402
|
1061 |
:
|
yann@402
|
1062 |
@@ -2557,13 +2670,13 @@
|
yann@402
|
1063 |
rm -rf conftest*
|
yann@402
|
1064 |
CPP="${CC-cc} -nologo -E"
|
yann@402
|
1065 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1066 |
-#line 2561 "configure"
|
yann@402
|
1067 |
+#line 2674 "configure"
|
yann@402
|
1068 |
#include "confdefs.h"
|
yann@402
|
1069 |
#include <assert.h>
|
yann@402
|
1070 |
Syntax Error
|
yann@402
|
1071 |
EOF
|
yann@402
|
1072 |
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
yann@402
|
1073 |
-{ (eval echo configure:2567: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
yann@402
|
1074 |
+{ (eval echo configure:2680: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
yann@402
|
1075 |
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
|
yann@402
|
1076 |
if test -z "$ac_err"; then
|
yann@402
|
1077 |
:
|
yann@402
|
1078 |
@@ -2588,12 +2701,12 @@
|
yann@402
|
1079 |
echo "$ac_t""$CPP" 1>&6
|
yann@402
|
1080 |
|
yann@402
|
1081 |
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
|
yann@402
|
1082 |
-echo "configure:2592: checking for ANSI C header files" >&5
|
yann@402
|
1083 |
+echo "configure:2705: checking for ANSI C header files" >&5
|
yann@402
|
1084 |
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
|
yann@402
|
1085 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1086 |
else
|
yann@402
|
1087 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1088 |
-#line 2597 "configure"
|
yann@402
|
1089 |
+#line 2710 "configure"
|
yann@402
|
1090 |
#include "confdefs.h"
|
yann@402
|
1091 |
#include <stdlib.h>
|
yann@402
|
1092 |
#include <stdarg.h>
|
yann@402
|
1093 |
@@ -2601,7 +2714,7 @@
|
yann@402
|
1094 |
#include <float.h>
|
yann@402
|
1095 |
EOF
|
yann@402
|
1096 |
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
yann@402
|
1097 |
-{ (eval echo configure:2605: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
yann@402
|
1098 |
+{ (eval echo configure:2718: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
yann@402
|
1099 |
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
|
yann@402
|
1100 |
if test -z "$ac_err"; then
|
yann@402
|
1101 |
rm -rf conftest*
|
yann@402
|
1102 |
@@ -2618,7 +2731,7 @@
|
yann@402
|
1103 |
if test $ac_cv_header_stdc = yes; then
|
yann@402
|
1104 |
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
|
yann@402
|
1105 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1106 |
-#line 2622 "configure"
|
yann@402
|
1107 |
+#line 2735 "configure"
|
yann@402
|
1108 |
#include "confdefs.h"
|
yann@402
|
1109 |
#include <string.h>
|
yann@402
|
1110 |
EOF
|
yann@402
|
1111 |
@@ -2636,7 +2749,7 @@
|
yann@402
|
1112 |
if test $ac_cv_header_stdc = yes; then
|
yann@402
|
1113 |
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
|
yann@402
|
1114 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1115 |
-#line 2640 "configure"
|
yann@402
|
1116 |
+#line 2753 "configure"
|
yann@402
|
1117 |
#include "confdefs.h"
|
yann@402
|
1118 |
#include <stdlib.h>
|
yann@402
|
1119 |
EOF
|
yann@402
|
1120 |
@@ -2657,7 +2770,7 @@
|
yann@402
|
1121 |
:
|
yann@402
|
1122 |
else
|
yann@402
|
1123 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1124 |
-#line 2661 "configure"
|
yann@402
|
1125 |
+#line 2774 "configure"
|
yann@402
|
1126 |
#include "confdefs.h"
|
yann@402
|
1127 |
#include <ctype.h>
|
yann@402
|
1128 |
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
|
yann@402
|
1129 |
@@ -2668,7 +2781,7 @@
|
yann@402
|
1130 |
exit (0); }
|
yann@402
|
1131 |
|
yann@402
|
1132 |
EOF
|
yann@402
|
1133 |
-if { (eval echo configure:2672: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
|
yann@402
|
1134 |
+if { (eval echo configure:2785: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
|
yann@402
|
1135 |
then
|
yann@402
|
1136 |
:
|
yann@402
|
1137 |
else
|
yann@402
|
1138 |
@@ -2694,12 +2807,12 @@
|
yann@402
|
1139 |
for ac_func in memcpy
|
yann@402
|
1140 |
do
|
yann@402
|
1141 |
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
|
yann@402
|
1142 |
-echo "configure:2698: checking for $ac_func" >&5
|
yann@402
|
1143 |
+echo "configure:2811: checking for $ac_func" >&5
|
yann@402
|
1144 |
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
|
yann@402
|
1145 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1146 |
else
|
yann@402
|
1147 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1148 |
-#line 2703 "configure"
|
yann@402
|
1149 |
+#line 2816 "configure"
|
yann@402
|
1150 |
#include "confdefs.h"
|
yann@402
|
1151 |
/* System header to define __stub macros and hopefully few prototypes,
|
yann@402
|
1152 |
which can conflict with char $ac_func(); below. */
|
yann@402
|
1153 |
@@ -2722,7 +2835,7 @@
|
yann@402
|
1154 |
|
yann@402
|
1155 |
; return 0; }
|
yann@402
|
1156 |
EOF
|
yann@402
|
1157 |
-if { (eval echo configure:2726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
yann@402
|
1158 |
+if { (eval echo configure:2839: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
yann@402
|
1159 |
rm -rf conftest*
|
yann@402
|
1160 |
eval "ac_cv_func_$ac_func=yes"
|
yann@402
|
1161 |
else
|
yann@402
|
1162 |
@@ -2749,19 +2862,19 @@
|
yann@402
|
1163 |
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
|
yann@402
|
1164 |
# for constant arguments. Useless!
|
yann@402
|
1165 |
echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
|
yann@402
|
1166 |
-echo "configure:2753: checking for working alloca.h" >&5
|
yann@402
|
1167 |
+echo "configure:2866: checking for working alloca.h" >&5
|
yann@402
|
1168 |
if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
|
yann@402
|
1169 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1170 |
else
|
yann@402
|
1171 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1172 |
-#line 2758 "configure"
|
yann@402
|
1173 |
+#line 2871 "configure"
|
yann@402
|
1174 |
#include "confdefs.h"
|
yann@402
|
1175 |
#include <alloca.h>
|
yann@402
|
1176 |
int main() {
|
yann@402
|
1177 |
char *p = alloca(2 * sizeof(int));
|
yann@402
|
1178 |
; return 0; }
|
yann@402
|
1179 |
EOF
|
yann@402
|
1180 |
-if { (eval echo configure:2765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
yann@402
|
1181 |
+if { (eval echo configure:2878: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
yann@402
|
1182 |
rm -rf conftest*
|
yann@402
|
1183 |
ac_cv_header_alloca_h=yes
|
yann@402
|
1184 |
else
|
yann@402
|
1185 |
@@ -2782,12 +2895,12 @@
|
yann@402
|
1186 |
fi
|
yann@402
|
1187 |
|
yann@402
|
1188 |
echo $ac_n "checking for alloca""... $ac_c" 1>&6
|
yann@402
|
1189 |
-echo "configure:2786: checking for alloca" >&5
|
yann@402
|
1190 |
+echo "configure:2899: checking for alloca" >&5
|
yann@402
|
1191 |
if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
|
yann@402
|
1192 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1193 |
else
|
yann@402
|
1194 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1195 |
-#line 2791 "configure"
|
yann@402
|
1196 |
+#line 2904 "configure"
|
yann@402
|
1197 |
#include "confdefs.h"
|
yann@402
|
1198 |
|
yann@402
|
1199 |
#ifdef __GNUC__
|
yann@402
|
1200 |
@@ -2815,7 +2928,7 @@
|
yann@402
|
1201 |
char *p = (char *) alloca(1);
|
yann@402
|
1202 |
; return 0; }
|
yann@402
|
1203 |
EOF
|
yann@402
|
1204 |
-if { (eval echo configure:2819: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
yann@402
|
1205 |
+if { (eval echo configure:2932: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
yann@402
|
1206 |
rm -rf conftest*
|
yann@402
|
1207 |
ac_cv_func_alloca_works=yes
|
yann@402
|
1208 |
else
|
yann@402
|
1209 |
@@ -2847,12 +2960,12 @@
|
yann@402
|
1210 |
|
yann@402
|
1211 |
|
yann@402
|
1212 |
echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
|
yann@402
|
1213 |
-echo "configure:2851: checking whether alloca needs Cray hooks" >&5
|
yann@402
|
1214 |
+echo "configure:2964: checking whether alloca needs Cray hooks" >&5
|
yann@402
|
1215 |
if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
|
yann@402
|
1216 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1217 |
else
|
yann@402
|
1218 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1219 |
-#line 2856 "configure"
|
yann@402
|
1220 |
+#line 2969 "configure"
|
yann@402
|
1221 |
#include "confdefs.h"
|
yann@402
|
1222 |
#if defined(CRAY) && ! defined(CRAY2)
|
yann@402
|
1223 |
webecray
|
yann@402
|
1224 |
@@ -2877,12 +2990,12 @@
|
yann@402
|
1225 |
if test $ac_cv_os_cray = yes; then
|
yann@402
|
1226 |
for ac_func in _getb67 GETB67 getb67; do
|
yann@402
|
1227 |
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
|
yann@402
|
1228 |
-echo "configure:2881: checking for $ac_func" >&5
|
yann@402
|
1229 |
+echo "configure:2994: checking for $ac_func" >&5
|
yann@402
|
1230 |
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
|
yann@402
|
1231 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1232 |
else
|
yann@402
|
1233 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1234 |
-#line 2886 "configure"
|
yann@402
|
1235 |
+#line 2999 "configure"
|
yann@402
|
1236 |
#include "confdefs.h"
|
yann@402
|
1237 |
/* System header to define __stub macros and hopefully few prototypes,
|
yann@402
|
1238 |
which can conflict with char $ac_func(); below. */
|
yann@402
|
1239 |
@@ -2905,7 +3018,7 @@
|
yann@402
|
1240 |
|
yann@402
|
1241 |
; return 0; }
|
yann@402
|
1242 |
EOF
|
yann@402
|
1243 |
-if { (eval echo configure:2909: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
yann@402
|
1244 |
+if { (eval echo configure:3022: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
yann@402
|
1245 |
rm -rf conftest*
|
yann@402
|
1246 |
eval "ac_cv_func_$ac_func=yes"
|
yann@402
|
1247 |
else
|
yann@402
|
1248 |
@@ -2932,7 +3045,7 @@
|
yann@402
|
1249 |
fi
|
yann@402
|
1250 |
|
yann@402
|
1251 |
echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
|
yann@402
|
1252 |
-echo "configure:2936: checking stack direction for C alloca" >&5
|
yann@402
|
1253 |
+echo "configure:3049: checking stack direction for C alloca" >&5
|
yann@402
|
1254 |
if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
|
yann@402
|
1255 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1256 |
else
|
yann@402
|
1257 |
@@ -2940,7 +3053,7 @@
|
yann@402
|
1258 |
ac_cv_c_stack_direction=0
|
yann@402
|
1259 |
else
|
yann@402
|
1260 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1261 |
-#line 2944 "configure"
|
yann@402
|
1262 |
+#line 3057 "configure"
|
yann@402
|
1263 |
#include "confdefs.h"
|
yann@402
|
1264 |
find_stack_direction ()
|
yann@402
|
1265 |
{
|
yann@402
|
1266 |
@@ -2959,7 +3072,7 @@
|
yann@402
|
1267 |
exit (find_stack_direction() < 0);
|
yann@402
|
1268 |
}
|
yann@402
|
1269 |
EOF
|
yann@402
|
1270 |
-if { (eval echo configure:2963: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
|
yann@402
|
1271 |
+if { (eval echo configure:3076: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
|
yann@402
|
1272 |
then
|
yann@402
|
1273 |
ac_cv_c_stack_direction=1
|
yann@402
|
1274 |
else
|
yann@402
|
1275 |
@@ -2982,13 +3095,13 @@
|
yann@402
|
1276 |
|
yann@402
|
1277 |
|
yann@402
|
1278 |
echo $ac_n "checking size of short""... $ac_c" 1>&6
|
yann@402
|
1279 |
-echo "configure:2986: checking size of short" >&5
|
yann@402
|
1280 |
+echo "configure:3099: checking size of short" >&5
|
yann@402
|
1281 |
if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
|
yann@402
|
1282 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1283 |
else
|
yann@402
|
1284 |
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
|
yann@402
|
1285 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1286 |
-#line 2992 "configure"
|
yann@402
|
1287 |
+#line 3105 "configure"
|
yann@402
|
1288 |
#include "confdefs.h"
|
yann@402
|
1289 |
#include "confdefs.h"
|
yann@402
|
1290 |
#include <sys/types.h>
|
yann@402
|
1291 |
@@ -2998,7 +3111,7 @@
|
yann@402
|
1292 |
switch (0) case 0: case (sizeof (short) == $ac_size):;
|
yann@402
|
1293 |
; return 0; }
|
yann@402
|
1294 |
EOF
|
yann@402
|
1295 |
-if { (eval echo configure:3002: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1296 |
+if { (eval echo configure:3115: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1297 |
rm -rf conftest*
|
yann@402
|
1298 |
ac_cv_sizeof_short=$ac_size
|
yann@402
|
1299 |
else
|
yann@402
|
1300 |
@@ -3021,13 +3134,13 @@
|
yann@402
|
1301 |
|
yann@402
|
1302 |
|
yann@402
|
1303 |
echo $ac_n "checking size of int""... $ac_c" 1>&6
|
yann@402
|
1304 |
-echo "configure:3025: checking size of int" >&5
|
yann@402
|
1305 |
+echo "configure:3138: checking size of int" >&5
|
yann@402
|
1306 |
if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
|
yann@402
|
1307 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1308 |
else
|
yann@402
|
1309 |
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
|
yann@402
|
1310 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1311 |
-#line 3031 "configure"
|
yann@402
|
1312 |
+#line 3144 "configure"
|
yann@402
|
1313 |
#include "confdefs.h"
|
yann@402
|
1314 |
#include "confdefs.h"
|
yann@402
|
1315 |
#include <sys/types.h>
|
yann@402
|
1316 |
@@ -3037,7 +3150,7 @@
|
yann@402
|
1317 |
switch (0) case 0: case (sizeof (int) == $ac_size):;
|
yann@402
|
1318 |
; return 0; }
|
yann@402
|
1319 |
EOF
|
yann@402
|
1320 |
-if { (eval echo configure:3041: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1321 |
+if { (eval echo configure:3154: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1322 |
rm -rf conftest*
|
yann@402
|
1323 |
ac_cv_sizeof_int=$ac_size
|
yann@402
|
1324 |
else
|
yann@402
|
1325 |
@@ -3060,13 +3173,13 @@
|
yann@402
|
1326 |
|
yann@402
|
1327 |
|
yann@402
|
1328 |
echo $ac_n "checking size of long""... $ac_c" 1>&6
|
yann@402
|
1329 |
-echo "configure:3064: checking size of long" >&5
|
yann@402
|
1330 |
+echo "configure:3177: checking size of long" >&5
|
yann@402
|
1331 |
if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
|
yann@402
|
1332 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1333 |
else
|
yann@402
|
1334 |
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
|
yann@402
|
1335 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1336 |
-#line 3070 "configure"
|
yann@402
|
1337 |
+#line 3183 "configure"
|
yann@402
|
1338 |
#include "confdefs.h"
|
yann@402
|
1339 |
#include "confdefs.h"
|
yann@402
|
1340 |
#include <sys/types.h>
|
yann@402
|
1341 |
@@ -3076,7 +3189,7 @@
|
yann@402
|
1342 |
switch (0) case 0: case (sizeof (long) == $ac_size):;
|
yann@402
|
1343 |
; return 0; }
|
yann@402
|
1344 |
EOF
|
yann@402
|
1345 |
-if { (eval echo configure:3080: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1346 |
+if { (eval echo configure:3193: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1347 |
rm -rf conftest*
|
yann@402
|
1348 |
ac_cv_sizeof_long=$ac_size
|
yann@402
|
1349 |
else
|
yann@402
|
1350 |
@@ -3099,13 +3212,13 @@
|
yann@402
|
1351 |
|
yann@402
|
1352 |
|
yann@402
|
1353 |
echo $ac_n "checking size of long long""... $ac_c" 1>&6
|
yann@402
|
1354 |
-echo "configure:3103: checking size of long long" >&5
|
yann@402
|
1355 |
+echo "configure:3216: checking size of long long" >&5
|
yann@402
|
1356 |
if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then
|
yann@402
|
1357 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1358 |
else
|
yann@402
|
1359 |
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
|
yann@402
|
1360 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1361 |
-#line 3109 "configure"
|
yann@402
|
1362 |
+#line 3222 "configure"
|
yann@402
|
1363 |
#include "confdefs.h"
|
yann@402
|
1364 |
#include "confdefs.h"
|
yann@402
|
1365 |
#include <sys/types.h>
|
yann@402
|
1366 |
@@ -3115,7 +3228,7 @@
|
yann@402
|
1367 |
switch (0) case 0: case (sizeof (long long) == $ac_size):;
|
yann@402
|
1368 |
; return 0; }
|
yann@402
|
1369 |
EOF
|
yann@402
|
1370 |
-if { (eval echo configure:3119: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1371 |
+if { (eval echo configure:3232: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1372 |
rm -rf conftest*
|
yann@402
|
1373 |
ac_cv_sizeof_long_long=$ac_size
|
yann@402
|
1374 |
else
|
yann@402
|
1375 |
@@ -3138,13 +3251,13 @@
|
yann@402
|
1376 |
|
yann@402
|
1377 |
|
yann@402
|
1378 |
echo $ac_n "checking size of float""... $ac_c" 1>&6
|
yann@402
|
1379 |
-echo "configure:3142: checking size of float" >&5
|
yann@402
|
1380 |
+echo "configure:3255: checking size of float" >&5
|
yann@402
|
1381 |
if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then
|
yann@402
|
1382 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1383 |
else
|
yann@402
|
1384 |
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
|
yann@402
|
1385 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1386 |
-#line 3148 "configure"
|
yann@402
|
1387 |
+#line 3261 "configure"
|
yann@402
|
1388 |
#include "confdefs.h"
|
yann@402
|
1389 |
#include "confdefs.h"
|
yann@402
|
1390 |
#include <sys/types.h>
|
yann@402
|
1391 |
@@ -3154,7 +3267,7 @@
|
yann@402
|
1392 |
switch (0) case 0: case (sizeof (float) == $ac_size):;
|
yann@402
|
1393 |
; return 0; }
|
yann@402
|
1394 |
EOF
|
yann@402
|
1395 |
-if { (eval echo configure:3158: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1396 |
+if { (eval echo configure:3271: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1397 |
rm -rf conftest*
|
yann@402
|
1398 |
ac_cv_sizeof_float=$ac_size
|
yann@402
|
1399 |
else
|
yann@402
|
1400 |
@@ -3177,13 +3290,13 @@
|
yann@402
|
1401 |
|
yann@402
|
1402 |
|
yann@402
|
1403 |
echo $ac_n "checking size of double""... $ac_c" 1>&6
|
yann@402
|
1404 |
-echo "configure:3181: checking size of double" >&5
|
yann@402
|
1405 |
+echo "configure:3294: checking size of double" >&5
|
yann@402
|
1406 |
if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then
|
yann@402
|
1407 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1408 |
else
|
yann@402
|
1409 |
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
|
yann@402
|
1410 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1411 |
-#line 3187 "configure"
|
yann@402
|
1412 |
+#line 3300 "configure"
|
yann@402
|
1413 |
#include "confdefs.h"
|
yann@402
|
1414 |
#include "confdefs.h"
|
yann@402
|
1415 |
#include <sys/types.h>
|
yann@402
|
1416 |
@@ -3193,7 +3306,7 @@
|
yann@402
|
1417 |
switch (0) case 0: case (sizeof (double) == $ac_size):;
|
yann@402
|
1418 |
; return 0; }
|
yann@402
|
1419 |
EOF
|
yann@402
|
1420 |
-if { (eval echo configure:3197: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1421 |
+if { (eval echo configure:3310: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1422 |
rm -rf conftest*
|
yann@402
|
1423 |
ac_cv_sizeof_double=$ac_size
|
yann@402
|
1424 |
else
|
yann@402
|
1425 |
@@ -3216,13 +3329,13 @@
|
yann@402
|
1426 |
|
yann@402
|
1427 |
|
yann@402
|
1428 |
echo $ac_n "checking size of long double""... $ac_c" 1>&6
|
yann@402
|
1429 |
-echo "configure:3220: checking size of long double" >&5
|
yann@402
|
1430 |
+echo "configure:3333: checking size of long double" >&5
|
yann@402
|
1431 |
if eval "test \"`echo '$''{'ac_cv_sizeof_long_double'+set}'`\" = set"; then
|
yann@402
|
1432 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1433 |
else
|
yann@402
|
1434 |
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
|
yann@402
|
1435 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1436 |
-#line 3226 "configure"
|
yann@402
|
1437 |
+#line 3339 "configure"
|
yann@402
|
1438 |
#include "confdefs.h"
|
yann@402
|
1439 |
#include "confdefs.h"
|
yann@402
|
1440 |
#include <sys/types.h>
|
yann@402
|
1441 |
@@ -3232,7 +3345,7 @@
|
yann@402
|
1442 |
switch (0) case 0: case (sizeof (long double) == $ac_size):;
|
yann@402
|
1443 |
; return 0; }
|
yann@402
|
1444 |
EOF
|
yann@402
|
1445 |
-if { (eval echo configure:3236: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1446 |
+if { (eval echo configure:3349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1447 |
rm -rf conftest*
|
yann@402
|
1448 |
ac_cv_sizeof_long_double=$ac_size
|
yann@402
|
1449 |
else
|
yann@402
|
1450 |
@@ -3256,13 +3369,13 @@
|
yann@402
|
1451 |
|
yann@402
|
1452 |
|
yann@402
|
1453 |
echo $ac_n "checking size of void *""... $ac_c" 1>&6
|
yann@402
|
1454 |
-echo "configure:3260: checking size of void *" >&5
|
yann@402
|
1455 |
+echo "configure:3373: checking size of void *" >&5
|
yann@402
|
1456 |
if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set"; then
|
yann@402
|
1457 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1458 |
else
|
yann@402
|
1459 |
for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence.
|
yann@402
|
1460 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1461 |
-#line 3266 "configure"
|
yann@402
|
1462 |
+#line 3379 "configure"
|
yann@402
|
1463 |
#include "confdefs.h"
|
yann@402
|
1464 |
#include "confdefs.h"
|
yann@402
|
1465 |
#include <sys/types.h>
|
yann@402
|
1466 |
@@ -3272,7 +3385,7 @@
|
yann@402
|
1467 |
switch (0) case 0: case (sizeof (void *) == $ac_size):;
|
yann@402
|
1468 |
; return 0; }
|
yann@402
|
1469 |
EOF
|
yann@402
|
1470 |
-if { (eval echo configure:3276: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1471 |
+if { (eval echo configure:3389: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1472 |
rm -rf conftest*
|
yann@402
|
1473 |
ac_cv_sizeof_void_p=$ac_size
|
yann@402
|
1474 |
else
|
yann@402
|
1475 |
@@ -3295,14 +3408,14 @@
|
yann@402
|
1476 |
|
yann@402
|
1477 |
|
yann@402
|
1478 |
echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
|
yann@402
|
1479 |
-echo "configure:3299: checking whether byte ordering is bigendian" >&5
|
yann@402
|
1480 |
+echo "configure:3412: checking whether byte ordering is bigendian" >&5
|
yann@402
|
1481 |
if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
|
yann@402
|
1482 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1483 |
else
|
yann@402
|
1484 |
ac_cv_c_bigendian=unknown
|
yann@402
|
1485 |
# See if sys/param.h defines the BYTE_ORDER macro.
|
yann@402
|
1486 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1487 |
-#line 3306 "configure"
|
yann@402
|
1488 |
+#line 3419 "configure"
|
yann@402
|
1489 |
#include "confdefs.h"
|
yann@402
|
1490 |
#include <sys/types.h>
|
yann@402
|
1491 |
#include <sys/param.h>
|
yann@402
|
1492 |
@@ -3313,11 +3426,11 @@
|
yann@402
|
1493 |
#endif
|
yann@402
|
1494 |
; return 0; }
|
yann@402
|
1495 |
EOF
|
yann@402
|
1496 |
-if { (eval echo configure:3317: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1497 |
+if { (eval echo configure:3430: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1498 |
rm -rf conftest*
|
yann@402
|
1499 |
# It does; now see whether it defined to BIG_ENDIAN or not.
|
yann@402
|
1500 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1501 |
-#line 3321 "configure"
|
yann@402
|
1502 |
+#line 3434 "configure"
|
yann@402
|
1503 |
#include "confdefs.h"
|
yann@402
|
1504 |
#include <sys/types.h>
|
yann@402
|
1505 |
#include <sys/param.h>
|
yann@402
|
1506 |
@@ -3328,7 +3441,7 @@
|
yann@402
|
1507 |
#endif
|
yann@402
|
1508 |
; return 0; }
|
yann@402
|
1509 |
EOF
|
yann@402
|
1510 |
-if { (eval echo configure:3332: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1511 |
+if { (eval echo configure:3445: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
yann@402
|
1512 |
rm -rf conftest*
|
yann@402
|
1513 |
ac_cv_c_bigendian=yes
|
yann@402
|
1514 |
else
|
yann@402
|
1515 |
@@ -3348,7 +3461,7 @@
|
yann@402
|
1516 |
echo $ac_n "cross-compiling... " 2>&6
|
yann@402
|
1517 |
else
|
yann@402
|
1518 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1519 |
-#line 3352 "configure"
|
yann@402
|
1520 |
+#line 3465 "configure"
|
yann@402
|
1521 |
#include "confdefs.h"
|
yann@402
|
1522 |
main () {
|
yann@402
|
1523 |
/* Are we little or big endian? From Harbison&Steele. */
|
yann@402
|
1524 |
@@ -3361,7 +3474,7 @@
|
yann@402
|
1525 |
exit (u.c[sizeof (long) - 1] == 1);
|
yann@402
|
1526 |
}
|
yann@402
|
1527 |
EOF
|
yann@402
|
1528 |
-if { (eval echo configure:3365: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
|
yann@402
|
1529 |
+if { (eval echo configure:3478: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
|
yann@402
|
1530 |
then
|
yann@402
|
1531 |
ac_cv_c_bigendian=no
|
yann@402
|
1532 |
else
|
yann@402
|
1533 |
@@ -3379,7 +3492,7 @@
|
yann@402
|
1534 |
echo "$ac_t""$ac_cv_c_bigendian" 1>&6
|
yann@402
|
1535 |
if test $ac_cv_c_bigendian = unknown; then
|
yann@402
|
1536 |
echo $ac_n "checking to probe for byte ordering""... $ac_c" 1>&6
|
yann@402
|
1537 |
-echo "configure:3383: checking to probe for byte ordering" >&5
|
yann@402
|
1538 |
+echo "configure:3496: checking to probe for byte ordering" >&5
|
yann@402
|
1539 |
|
yann@402
|
1540 |
cat >conftest.c <<EOF
|
yann@402
|
1541 |
short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
|
yann@402
|
1542 |
@@ -3414,6 +3527,10 @@
|
yann@402
|
1543 |
#define WORDS_BIGENDIAN 1
|
yann@402
|
1544 |
EOF
|
yann@402
|
1545 |
|
yann@402
|
1546 |
+ cat >> confdefs.h <<\EOF
|
yann@402
|
1547 |
+#define HOST_WORDS_BIG_ENDIAN 1
|
yann@402
|
1548 |
+EOF
|
yann@402
|
1549 |
+
|
yann@402
|
1550 |
BYTEORDER=4321
|
yann@402
|
1551 |
else
|
yann@402
|
1552 |
BYTEORDER=1234
|
yann@402
|
1553 |
@@ -3429,7 +3546,7 @@
|
yann@402
|
1554 |
|
yann@402
|
1555 |
if test x$TARGET = xSPARC; then
|
yann@402
|
1556 |
echo $ac_n "checking assembler and linker support unaligned pc related relocs""... $ac_c" 1>&6
|
yann@402
|
1557 |
-echo "configure:3433: checking assembler and linker support unaligned pc related relocs" >&5
|
yann@402
|
1558 |
+echo "configure:3550: checking assembler and linker support unaligned pc related relocs" >&5
|
yann@402
|
1559 |
if eval "test \"`echo '$''{'libffi_cv_as_sparc_ua_pcrel'+set}'`\" = set"; then
|
yann@402
|
1560 |
echo $ac_n "(cached) $ac_c" 1>&6
|
yann@402
|
1561 |
else
|
yann@402
|
1562 |
@@ -3439,14 +3556,14 @@
|
yann@402
|
1563 |
CFLAGS="$CFLAGS -fpic"
|
yann@402
|
1564 |
LDFLAGS="$LDFLAGS -shared"
|
yann@402
|
1565 |
cat > conftest.$ac_ext <<EOF
|
yann@402
|
1566 |
-#line 3443 "configure"
|
yann@402
|
1567 |
+#line 3560 "configure"
|
yann@402
|
1568 |
#include "confdefs.h"
|
yann@402
|
1569 |
asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text");
|
yann@402
|
1570 |
int main() {
|
yann@402
|
1571 |
|
yann@402
|
1572 |
; return 0; }
|
yann@402
|
1573 |
EOF
|
yann@402
|
1574 |
-if { (eval echo configure:3450: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
yann@402
|
1575 |
+if { (eval echo configure:3567: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
|
yann@402
|
1576 |
rm -rf conftest*
|
yann@402
|
1577 |
libffi_cv_as_sparc_ua_pcrel=yes
|
yann@402
|
1578 |
else
|
yann@402
|
1579 |
@@ -3709,6 +3826,8 @@
|
yann@402
|
1580 |
s%@MIPS_GCC_FALSE@%$MIPS_GCC_FALSE%g
|
yann@402
|
1581 |
s%@MIPS_SGI_TRUE@%$MIPS_SGI_TRUE%g
|
yann@402
|
1582 |
s%@MIPS_SGI_FALSE@%$MIPS_SGI_FALSE%g
|
yann@402
|
1583 |
+s%@MIPS_LINUX_TRUE@%$MIPS_LINUX_TRUE%g
|
yann@402
|
1584 |
+s%@MIPS_LINUX_FALSE@%$MIPS_LINUX_FALSE%g
|
yann@402
|
1585 |
s%@SPARC_TRUE@%$SPARC_TRUE%g
|
yann@402
|
1586 |
s%@SPARC_FALSE@%$SPARC_FALSE%g
|
yann@402
|
1587 |
s%@X86_TRUE@%$X86_TRUE%g
|
yann@402
|
1588 |
@@ -3729,6 +3848,12 @@
|
yann@402
|
1589 |
s%@POWERPC_DARWIN_FALSE@%$POWERPC_DARWIN_FALSE%g
|
yann@402
|
1590 |
s%@ARM_TRUE@%$ARM_TRUE%g
|
yann@402
|
1591 |
s%@ARM_FALSE@%$ARM_FALSE%g
|
yann@402
|
1592 |
+s%@S390_TRUE@%$S390_TRUE%g
|
yann@402
|
1593 |
+s%@S390_FALSE@%$S390_FALSE%g
|
yann@402
|
1594 |
+s%@X86_64_TRUE@%$X86_64_TRUE%g
|
yann@402
|
1595 |
+s%@X86_64_FALSE@%$X86_64_FALSE%g
|
yann@402
|
1596 |
+s%@SH_TRUE@%$SH_TRUE%g
|
yann@402
|
1597 |
+s%@SH_FALSE@%$SH_FALSE%g
|
yann@402
|
1598 |
s%@CPP@%$CPP%g
|
yann@402
|
1599 |
s%@ALLOCA@%$ALLOCA%g
|
yann@402
|
1600 |
s%@TARGET@%$TARGET%g
|
yann@402
|
1601 |
@@ -3969,7 +4094,7 @@
|
yann@402
|
1602 |
|
yann@402
|
1603 |
if test -n "$CONFIG_FILES"; then
|
yann@402
|
1604 |
LD="${ORIGINAL_LD_FOR_MULTILIBS}"
|
yann@402
|
1605 |
- ac_file=Makefile . ${libffi_basedir}/../config-ml.in
|
yann@402
|
1606 |
+ ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in
|
yann@402
|
1607 |
fi
|
yann@402
|
1608 |
|
yann@402
|
1609 |
exit 0
|
yann@402
|
1610 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure.in gcc/libffi/configure.in
|
yann@402
|
1611 |
--- gcc-3.2.2.orig/libffi/configure.in Tue Jan 28 10:43:56 2003
|
yann@402
|
1612 |
+++ gcc/libffi/configure.in Sat Feb 1 20:16:19 2003
|
yann@402
|
1613 |
@@ -22,14 +22,15 @@
|
yann@402
|
1614 |
|
yann@402
|
1615 |
if test "${srcdir}" = "."; then
|
yann@402
|
1616 |
if test "${with_target_subdir}" != "."; then
|
yann@402
|
1617 |
- libffi_basedir="${srcdir}/${with_multisrctop}.."
|
yann@402
|
1618 |
+ libffi_basedir="${with_multisrctop}../"
|
yann@402
|
1619 |
else
|
yann@402
|
1620 |
- libffi_basedir="${srcdir}/${with_multisrctop}"
|
yann@402
|
1621 |
+ libffi_basedir="${with_multisrctop}"
|
yann@402
|
1622 |
fi
|
yann@402
|
1623 |
else
|
yann@402
|
1624 |
- libffi_basedir="${srcdir}"
|
yann@402
|
1625 |
+ libffi_basedir=
|
yann@402
|
1626 |
fi
|
yann@402
|
1627 |
AC_SUBST(libffi_basedir)
|
yann@402
|
1628 |
+AC_CONFIG_AUX_DIR(${libffi_basedir}..)
|
yann@402
|
1629 |
|
yann@402
|
1630 |
AC_CANONICAL_HOST
|
yann@402
|
1631 |
|
yann@402
|
1632 |
@@ -56,17 +57,23 @@
|
yann@402
|
1633 |
i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;;
|
yann@402
|
1634 |
sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;;
|
yann@402
|
1635 |
sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;;
|
yann@402
|
1636 |
-sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
|
yann@402
|
1637 |
-sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;;
|
yann@402
|
1638 |
-alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;;
|
yann@402
|
1639 |
+sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;;
|
yann@402
|
1640 |
+sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;;
|
yann@402
|
1641 |
+alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;;
|
yann@402
|
1642 |
ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;;
|
yann@402
|
1643 |
m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;;
|
yann@402
|
1644 |
+mips64*-*);;
|
yann@402
|
1645 |
+mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;;
|
yann@402
|
1646 |
powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;;
|
yann@402
|
1647 |
powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;;
|
yann@402
|
1648 |
powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;;
|
yann@402
|
1649 |
powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
|
yann@402
|
1650 |
rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;;
|
yann@402
|
1651 |
arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;;
|
yann@402
|
1652 |
+s390-*-linux-*) TARGET=S390; TARGETDIR=s390;;
|
yann@402
|
1653 |
+s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;;
|
yann@402
|
1654 |
+x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;;
|
yann@402
|
1655 |
+sh-*-linux* | sh[[34]]*-*-linux*) TARGET=SH; TARGETDIR=sh;;
|
yann@402
|
1656 |
esac
|
yann@402
|
1657 |
|
yann@402
|
1658 |
if test $TARGETDIR = unknown; then
|
yann@402
|
1659 |
@@ -75,6 +82,7 @@
|
yann@402
|
1660 |
|
yann@402
|
1661 |
AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes)
|
yann@402
|
1662 |
AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno)
|
yann@402
|
1663 |
+AM_CONDITIONAL(MIPS_LINUX, test x$TARGET = xMIPS_LINUX)
|
yann@402
|
1664 |
AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
|
yann@402
|
1665 |
AM_CONDITIONAL(X86, test x$TARGET = xX86)
|
yann@402
|
1666 |
AM_CONDITIONAL(X86_WIN32, test x$TARGET = xX86_WIN32)
|
yann@402
|
1667 |
@@ -85,6 +93,13 @@
|
yann@402
|
1668 |
AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX)
|
yann@402
|
1669 |
AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN)
|
yann@402
|
1670 |
AM_CONDITIONAL(ARM, test x$TARGET = xARM)
|
yann@402
|
1671 |
+AM_CONDITIONAL(S390, test x$TARGET = xS390)
|
yann@402
|
1672 |
+AM_CONDITIONAL(X86_64, test x$TARGET = xX86_64)
|
yann@402
|
1673 |
+AM_CONDITIONAL(SH, test x$TARGET = xSH)
|
yann@402
|
1674 |
+
|
yann@402
|
1675 |
+if test x$TARGET = xMIPS_LINUX; then
|
yann@402
|
1676 |
+ TARGET=MIPS
|
yann@402
|
1677 |
+fi
|
yann@402
|
1678 |
|
yann@402
|
1679 |
AC_HEADER_STDC
|
yann@402
|
1680 |
AC_CHECK_FUNCS(memcpy)
|
yann@402
|
1681 |
@@ -171,7 +186,7 @@
|
yann@402
|
1682 |
[
|
yann@402
|
1683 |
if test -n "$CONFIG_FILES"; then
|
yann@402
|
1684 |
LD="${ORIGINAL_LD_FOR_MULTILIBS}"
|
yann@402
|
1685 |
- ac_file=Makefile . ${libffi_basedir}/../config-ml.in
|
yann@402
|
1686 |
+ ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in
|
yann@402
|
1687 |
fi
|
yann@402
|
1688 |
],
|
yann@402
|
1689 |
srcdir=${srcdir}
|
yann@402
|
1690 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/Makefile.in gcc/libffi/include/Makefile.in
|
yann@402
|
1691 |
--- gcc-3.2.2.orig/libffi/include/Makefile.in Tue Oct 9 14:32:16 2001
|
yann@402
|
1692 |
+++ gcc/libffi/include/Makefile.in Mon Apr 29 13:14:44 2002
|
yann@402
|
1693 |
@@ -99,7 +99,7 @@
|
yann@402
|
1694 |
|
yann@402
|
1695 |
DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
|
yann@402
|
1696 |
|
yann@402
|
1697 |
-TAR = gnutar
|
yann@402
|
1698 |
+TAR = gtar
|
yann@402
|
1699 |
GZIP_ENV = --best
|
yann@402
|
1700 |
all: all-redirect
|
yann@402
|
1701 |
.SUFFIXES:
|
yann@402
|
1702 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/ffi.h.in gcc/libffi/include/ffi.h.in
|
yann@402
|
1703 |
--- gcc-3.2.2.orig/libffi/include/ffi.h.in Wed Mar 13 07:35:56 2002
|
yann@402
|
1704 |
+++ gcc/libffi/include/ffi.h.in Wed Jan 29 00:54:28 2003
|
yann@402
|
1705 |
@@ -1,5 +1,5 @@
|
yann@402
|
1706 |
/* -----------------------------------------------------------------*-C-*-
|
yann@402
|
1707 |
- libffi @VERSION@ - Copyright (c) 1996-2002 Cygnus Solutions
|
yann@402
|
1708 |
+ libffi @VERSION@ - Copyright (c) 1996-2003 Cygnus Solutions
|
yann@402
|
1709 |
|
yann@402
|
1710 |
Permission is hereby granted, free of charge, to any person obtaining
|
yann@402
|
1711 |
a copy of this software and associated documentation files (the
|
yann@402
|
1712 |
@@ -164,6 +164,12 @@
|
yann@402
|
1713 |
#endif
|
yann@402
|
1714 |
#endif
|
yann@402
|
1715 |
|
yann@402
|
1716 |
+#ifdef S390
|
yann@402
|
1717 |
+#if defined (__s390x__)
|
yann@402
|
1718 |
+#define S390X
|
yann@402
|
1719 |
+#endif
|
yann@402
|
1720 |
+#endif
|
yann@402
|
1721 |
+
|
yann@402
|
1722 |
#ifndef LIBFFI_ASM
|
yann@402
|
1723 |
|
yann@402
|
1724 |
/* ---- Generic type definitions ----------------------------------------- */
|
yann@402
|
1725 |
@@ -189,16 +195,23 @@
|
yann@402
|
1726 |
#endif
|
yann@402
|
1727 |
#endif
|
yann@402
|
1728 |
|
yann@402
|
1729 |
- /* ---- Intel x86 ---------------- */
|
yann@402
|
1730 |
-#ifdef X86
|
yann@402
|
1731 |
+ /* ---- Intel x86 Win32 ---------- */
|
yann@402
|
1732 |
+#ifdef X86_WIN32
|
yann@402
|
1733 |
FFI_SYSV,
|
yann@402
|
1734 |
+ FFI_STDCALL,
|
yann@402
|
1735 |
+ /* TODO: Add fastcall support for the sake of completeness */
|
yann@402
|
1736 |
FFI_DEFAULT_ABI = FFI_SYSV,
|
yann@402
|
1737 |
#endif
|
yann@402
|
1738 |
|
yann@402
|
1739 |
- /* ---- Intel x86 Win32 ---------- */
|
yann@402
|
1740 |
-#ifdef X86_WIN32
|
yann@402
|
1741 |
+ /* ---- Intel x86 and AMD x86-64 - */
|
yann@402
|
1742 |
+#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__))
|
yann@402
|
1743 |
FFI_SYSV,
|
yann@402
|
1744 |
+ FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */
|
yann@402
|
1745 |
+#ifdef __i386__
|
yann@402
|
1746 |
FFI_DEFAULT_ABI = FFI_SYSV,
|
yann@402
|
1747 |
+#else
|
yann@402
|
1748 |
+ FFI_DEFAULT_ABI = FFI_UNIX64,
|
yann@402
|
1749 |
+#endif
|
yann@402
|
1750 |
#endif
|
yann@402
|
1751 |
|
yann@402
|
1752 |
/* ---- Intel ia64 ---------------- */
|
yann@402
|
1753 |
@@ -251,6 +264,18 @@
|
yann@402
|
1754 |
FFI_DEFAULT_ABI = FFI_SYSV,
|
yann@402
|
1755 |
#endif
|
yann@402
|
1756 |
|
yann@402
|
1757 |
+ /* ---- S390 --------------------- */
|
yann@402
|
1758 |
+#ifdef S390
|
yann@402
|
1759 |
+ FFI_SYSV,
|
yann@402
|
1760 |
+ FFI_DEFAULT_ABI = FFI_SYSV,
|
yann@402
|
1761 |
+#endif
|
yann@402
|
1762 |
+
|
yann@402
|
1763 |
+ /* ---- SuperH ------------------- */
|
yann@402
|
1764 |
+#ifdef SH
|
yann@402
|
1765 |
+ FFI_SYSV,
|
yann@402
|
1766 |
+ FFI_DEFAULT_ABI = FFI_SYSV,
|
yann@402
|
1767 |
+#endif
|
yann@402
|
1768 |
+
|
yann@402
|
1769 |
/* Leave this for debugging purposes */
|
yann@402
|
1770 |
FFI_LAST_ABI
|
yann@402
|
1771 |
|
yann@402
|
1772 |
@@ -264,7 +289,7 @@
|
yann@402
|
1773 |
/*@null@*/ struct _ffi_type **elements;
|
yann@402
|
1774 |
} ffi_type;
|
yann@402
|
1775 |
|
yann@402
|
1776 |
-/* These are defined in ffi.c */
|
yann@402
|
1777 |
+/* These are defined in types.c */
|
yann@402
|
1778 |
extern ffi_type ffi_type_void;
|
yann@402
|
1779 |
extern ffi_type ffi_type_uint8;
|
yann@402
|
1780 |
extern ffi_type ffi_type_sint8;
|
yann@402
|
1781 |
@@ -373,13 +398,7 @@
|
yann@402
|
1782 |
|
yann@402
|
1783 |
/* ---- Definitions for closures ----------------------------------------- */
|
yann@402
|
1784 |
|
yann@402
|
1785 |
-#ifdef X86
|
yann@402
|
1786 |
-
|
yann@402
|
1787 |
-#define FFI_CLOSURES 1 /* x86 supports closures */
|
yann@402
|
1788 |
-#define FFI_TRAMPOLINE_SIZE 10
|
yann@402
|
1789 |
-#define FFI_NATIVE_RAW_API 1 /* and has native raw api support */
|
yann@402
|
1790 |
-
|
yann@402
|
1791 |
-#elif defined(X86_WIN32)
|
yann@402
|
1792 |
+#ifdef __i386__
|
yann@402
|
1793 |
|
yann@402
|
1794 |
#define FFI_CLOSURES 1 /* x86 supports closures */
|
yann@402
|
1795 |
#define FFI_TRAMPOLINE_SIZE 10
|
yann@402
|
1796 |
@@ -424,6 +443,40 @@
|
yann@402
|
1797 |
#define FFI_TRAMPOLINE_SIZE 24 /* see struct below */
|
yann@402
|
1798 |
#define FFI_NATIVE_RAW_API 0
|
yann@402
|
1799 |
|
yann@402
|
1800 |
+#elif defined(SPARC64)
|
yann@402
|
1801 |
+
|
yann@402
|
1802 |
+#define FFI_CLOSURES 1
|
yann@402
|
1803 |
+#define FFI_TRAMPOLINE_SIZE 24
|
yann@402
|
1804 |
+#define FFI_NATIVE_RAW_API 0
|
yann@402
|
1805 |
+
|
yann@402
|
1806 |
+#elif defined(SPARC)
|
yann@402
|
1807 |
+
|
yann@402
|
1808 |
+#define FFI_CLOSURES 1
|
yann@402
|
1809 |
+#define FFI_TRAMPOLINE_SIZE 16
|
yann@402
|
1810 |
+#define FFI_NATIVE_RAW_API 0
|
yann@402
|
1811 |
+
|
yann@402
|
1812 |
+#elif defined(S390)
|
yann@402
|
1813 |
+
|
yann@402
|
1814 |
+#define FFI_CLOSURES 1
|
yann@402
|
1815 |
+#ifdef S390X
|
yann@402
|
1816 |
+#define FFI_TRAMPOLINE_SIZE 32
|
yann@402
|
1817 |
+#else
|
yann@402
|
1818 |
+#define FFI_TRAMPOLINE_SIZE 16
|
yann@402
|
1819 |
+#endif
|
yann@402
|
1820 |
+#define FFI_NATIVE_RAW_API 0
|
yann@402
|
1821 |
+
|
yann@402
|
1822 |
+#elif defined(SH)
|
yann@402
|
1823 |
+
|
yann@402
|
1824 |
+#define FFI_CLOSURES 1
|
yann@402
|
1825 |
+#define FFI_TRAMPOLINE_SIZE 16
|
yann@402
|
1826 |
+#define FFI_NATIVE_RAW_API 0
|
yann@402
|
1827 |
+
|
yann@402
|
1828 |
+#elif defined(__x86_64__)
|
yann@402
|
1829 |
+
|
yann@402
|
1830 |
+#define FFI_CLOSURES 1
|
yann@402
|
1831 |
+#define FFI_TRAMPOLINE_SIZE 24
|
yann@402
|
1832 |
+#define FFI_NATIVE_RAW_API 0
|
yann@402
|
1833 |
+
|
yann@402
|
1834 |
#else
|
yann@402
|
1835 |
|
yann@402
|
1836 |
#define FFI_CLOSURES 0
|
yann@402
|
1837 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/ffi.c gcc/libffi/src/arm/ffi.c
|
yann@402
|
1838 |
--- gcc-3.2.2.orig/libffi/src/arm/ffi.c Sat Mar 3 07:21:23 2001
|
yann@402
|
1839 |
+++ gcc/libffi/src/arm/ffi.c Fri Jul 19 08:08:30 2002
|
yann@402
|
1840 |
@@ -36,13 +36,10 @@
|
yann@402
|
1841 |
/*@=exportheader@*/
|
yann@402
|
1842 |
{
|
yann@402
|
1843 |
register unsigned int i;
|
yann@402
|
1844 |
- register int tmp;
|
yann@402
|
1845 |
- register unsigned int avn;
|
yann@402
|
1846 |
register void **p_argv;
|
yann@402
|
1847 |
register char *argp;
|
yann@402
|
1848 |
register ffi_type **p_arg;
|
yann@402
|
1849 |
|
yann@402
|
1850 |
- tmp = 0;
|
yann@402
|
1851 |
argp = stack;
|
yann@402
|
1852 |
|
yann@402
|
1853 |
if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) {
|
yann@402
|
1854 |
@@ -50,11 +47,10 @@
|
yann@402
|
1855 |
argp += 4;
|
yann@402
|
1856 |
}
|
yann@402
|
1857 |
|
yann@402
|
1858 |
- avn = ecif->cif->nargs;
|
yann@402
|
1859 |
p_argv = ecif->avalue;
|
yann@402
|
1860 |
|
yann@402
|
1861 |
for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
|
yann@402
|
1862 |
- (i != 0) && (avn != 0);
|
yann@402
|
1863 |
+ (i != 0);
|
yann@402
|
1864 |
i--, p_arg++)
|
yann@402
|
1865 |
{
|
yann@402
|
1866 |
size_t z;
|
yann@402
|
1867 |
@@ -64,9 +60,6 @@
|
yann@402
|
1868 |
argp = (char *) ALIGN(argp, (*p_arg)->alignment);
|
yann@402
|
1869 |
}
|
yann@402
|
1870 |
|
yann@402
|
1871 |
- if (avn != 0)
|
yann@402
|
1872 |
- {
|
yann@402
|
1873 |
- avn--;
|
yann@402
|
1874 |
z = (*p_arg)->size;
|
yann@402
|
1875 |
if (z < sizeof(int))
|
yann@402
|
1876 |
{
|
yann@402
|
1877 |
@@ -107,7 +100,6 @@
|
yann@402
|
1878 |
}
|
yann@402
|
1879 |
p_argv++;
|
yann@402
|
1880 |
argp += z;
|
yann@402
|
1881 |
- }
|
yann@402
|
1882 |
}
|
yann@402
|
1883 |
|
yann@402
|
1884 |
return;
|
yann@402
|
1885 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/sysv.S gcc/libffi/src/arm/sysv.S
|
yann@402
|
1886 |
--- gcc-3.2.2.orig/libffi/src/arm/sysv.S Sat Mar 3 07:21:23 2001
|
yann@402
|
1887 |
+++ gcc/libffi/src/arm/sysv.S Mon Sep 30 03:08:58 2002
|
yann@402
|
1888 |
@@ -28,8 +28,15 @@
|
yann@402
|
1889 |
#ifdef HAVE_MACHINE_ASM_H
|
yann@402
|
1890 |
#include <machine/asm.h>
|
yann@402
|
1891 |
#else
|
yann@402
|
1892 |
-/* XXX these lose for some platforms, I'm sure. */
|
yann@402
|
1893 |
+#ifdef __USER_LABEL_PREFIX__
|
yann@402
|
1894 |
+#define CONCAT1(a, b) CONCAT2(a, b)
|
yann@402
|
1895 |
+#define CONCAT2(a, b) a ## b
|
yann@402
|
1896 |
+
|
yann@402
|
1897 |
+/* Use the right prefix for global labels. */
|
yann@402
|
1898 |
+#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x)
|
yann@402
|
1899 |
+#else
|
yann@402
|
1900 |
#define CNAME(x) x
|
yann@402
|
1901 |
+#endif
|
yann@402
|
1902 |
#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
|
yann@402
|
1903 |
#endif
|
yann@402
|
1904 |
|
yann@402
|
1905 |
@@ -96,12 +103,20 @@
|
yann@402
|
1906 |
|
yann@402
|
1907 |
# return FLOAT
|
yann@402
|
1908 |
cmp a4, #FFI_TYPE_FLOAT
|
yann@402
|
1909 |
+#ifdef __SOFTFP__
|
yann@402
|
1910 |
+ streq a1, [a3]
|
yann@402
|
1911 |
+#else
|
yann@402
|
1912 |
stfeqs f0, [a3]
|
yann@402
|
1913 |
+#endif
|
yann@402
|
1914 |
beq epilogue
|
yann@402
|
1915 |
|
yann@402
|
1916 |
# return DOUBLE or LONGDOUBLE
|
yann@402
|
1917 |
cmp a4, #FFI_TYPE_DOUBLE
|
yann@402
|
1918 |
+#ifdef __SOFTFP__
|
yann@402
|
1919 |
+ stmeqia a3, {a1, a2}
|
yann@402
|
1920 |
+#else
|
yann@402
|
1921 |
stfeqd f0, [a3]
|
yann@402
|
1922 |
+#endif
|
yann@402
|
1923 |
|
yann@402
|
1924 |
epilogue:
|
yann@402
|
1925 |
ldmfd sp!, {a1-a4, fp, pc}
|
yann@402
|
1926 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/java_raw_api.c gcc/libffi/src/java_raw_api.c
|
yann@402
|
1927 |
--- gcc-3.2.2.orig/libffi/src/java_raw_api.c Tue Apr 9 07:31:14 2002
|
yann@402
|
1928 |
+++ gcc/libffi/src/java_raw_api.c Tue Oct 8 23:55:02 2002
|
yann@402
|
1929 |
@@ -81,21 +81,14 @@
|
yann@402
|
1930 |
{
|
yann@402
|
1931 |
case FFI_TYPE_UINT8:
|
yann@402
|
1932 |
case FFI_TYPE_SINT8:
|
yann@402
|
1933 |
- *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 1);
|
yann@402
|
1934 |
+ *args = (void*) ((char*)(raw++) + 3);
|
yann@402
|
1935 |
break;
|
yann@402
|
1936 |
|
yann@402
|
1937 |
case FFI_TYPE_UINT16:
|
yann@402
|
1938 |
case FFI_TYPE_SINT16:
|
yann@402
|
1939 |
- *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 2);
|
yann@402
|
1940 |
+ *args = (void*) ((char*)(raw++) + 2);
|
yann@402
|
1941 |
break;
|
yann@402
|
1942 |
|
yann@402
|
1943 |
-#if SIZEOF_ARG >= 4
|
yann@402
|
1944 |
- case FFI_TYPE_UINT32:
|
yann@402
|
1945 |
- case FFI_TYPE_SINT32:
|
yann@402
|
1946 |
- *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 4);
|
yann@402
|
1947 |
- break;
|
yann@402
|
1948 |
-#endif
|
yann@402
|
1949 |
-
|
yann@402
|
1950 |
#if SIZEOF_ARG == 8
|
yann@402
|
1951 |
case FFI_TYPE_UINT64:
|
yann@402
|
1952 |
case FFI_TYPE_SINT64:
|
yann@402
|
1953 |
@@ -157,31 +150,54 @@
|
yann@402
|
1954 |
switch ((*tp)->type)
|
yann@402
|
1955 |
{
|
yann@402
|
1956 |
case FFI_TYPE_UINT8:
|
yann@402
|
1957 |
+#if WORDS_BIGENDIAN
|
yann@402
|
1958 |
+ *(UINT32*)(raw++) = *(UINT8*) (*args);
|
yann@402
|
1959 |
+#else
|
yann@402
|
1960 |
(raw++)->uint = *(UINT8*) (*args);
|
yann@402
|
1961 |
+#endif
|
yann@402
|
1962 |
break;
|
yann@402
|
1963 |
|
yann@402
|
1964 |
case FFI_TYPE_SINT8:
|
yann@402
|
1965 |
+#if WORDS_BIGENDIAN
|
yann@402
|
1966 |
+ *(SINT32*)(raw++) = *(SINT8*) (*args);
|
yann@402
|
1967 |
+#else
|
yann@402
|
1968 |
(raw++)->sint = *(SINT8*) (*args);
|
yann@402
|
1969 |
+#endif
|
yann@402
|
1970 |
break;
|
yann@402
|
1971 |
|
yann@402
|
1972 |
case FFI_TYPE_UINT16:
|
yann@402
|
1973 |
+#if WORDS_BIGENDIAN
|
yann@402
|
1974 |
+ *(UINT32*)(raw++) = *(UINT16*) (*args);
|
yann@402
|
1975 |
+#else
|
yann@402
|
1976 |
(raw++)->uint = *(UINT16*) (*args);
|
yann@402
|
1977 |
+#endif
|
yann@402
|
1978 |
break;
|
yann@402
|
1979 |
|
yann@402
|
1980 |
case FFI_TYPE_SINT16:
|
yann@402
|
1981 |
+#if WORDS_BIGENDIAN
|
yann@402
|
1982 |
+ *(SINT32*)(raw++) = *(SINT16*) (*args);
|
yann@402
|
1983 |
+#else
|
yann@402
|
1984 |
(raw++)->sint = *(SINT16*) (*args);
|
yann@402
|
1985 |
+#endif
|
yann@402
|
1986 |
break;
|
yann@402
|
1987 |
|
yann@402
|
1988 |
-#if SIZEOF_ARG >= 4
|
yann@402
|
1989 |
case FFI_TYPE_UINT32:
|
yann@402
|
1990 |
+#if WORDS_BIGENDIAN
|
yann@402
|
1991 |
+ *(UINT32*)(raw++) = *(UINT32*) (*args);
|
yann@402
|
1992 |
+#else
|
yann@402
|
1993 |
(raw++)->uint = *(UINT32*) (*args);
|
yann@402
|
1994 |
+#endif
|
yann@402
|
1995 |
break;
|
yann@402
|
1996 |
|
yann@402
|
1997 |
case FFI_TYPE_SINT32:
|
yann@402
|
1998 |
+#if WORDS_BIGENDIAN
|
yann@402
|
1999 |
+ *(SINT32*)(raw++) = *(SINT32*) (*args);
|
yann@402
|
2000 |
+#else
|
yann@402
|
2001 |
(raw++)->sint = *(SINT32*) (*args);
|
yann@402
|
2002 |
- break;
|
yann@402
|
2003 |
#endif
|
yann@402
|
2004 |
- case FFI_TYPE_FLOAT:
|
yann@402
|
2005 |
+ break;
|
yann@402
|
2006 |
+
|
yann@402
|
2007 |
+ case FFI_TYPE_FLOAT:
|
yann@402
|
2008 |
(raw++)->flt = *(FLOAT32*) (*args);
|
yann@402
|
2009 |
break;
|
yann@402
|
2010 |
|
yann@402
|
2011 |
@@ -211,6 +227,55 @@
|
yann@402
|
2012 |
|
yann@402
|
2013 |
#if !FFI_NATIVE_RAW_API
|
yann@402
|
2014 |
|
yann@402
|
2015 |
+static void
|
yann@402
|
2016 |
+ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue)
|
yann@402
|
2017 |
+{
|
yann@402
|
2018 |
+#if WORDS_BIGENDIAN && SIZEOF_ARG == 8
|
yann@402
|
2019 |
+ switch (cif->rtype->type)
|
yann@402
|
2020 |
+ {
|
yann@402
|
2021 |
+ case FFI_TYPE_UINT8:
|
yann@402
|
2022 |
+ case FFI_TYPE_UINT16:
|
yann@402
|
2023 |
+ case FFI_TYPE_UINT32:
|
yann@402
|
2024 |
+ *(UINT64 *)rvalue <<= 32;
|
yann@402
|
2025 |
+ break;
|
yann@402
|
2026 |
+
|
yann@402
|
2027 |
+ case FFI_TYPE_SINT8:
|
yann@402
|
2028 |
+ case FFI_TYPE_SINT16:
|
yann@402
|
2029 |
+ case FFI_TYPE_SINT32:
|
yann@402
|
2030 |
+ case FFI_TYPE_INT:
|
yann@402
|
2031 |
+ *(SINT64 *)rvalue <<= 32;
|
yann@402
|
2032 |
+ break;
|
yann@402
|
2033 |
+
|
yann@402
|
2034 |
+ default:
|
yann@402
|
2035 |
+ break;
|
yann@402
|
2036 |
+ }
|
yann@402
|
2037 |
+#endif
|
yann@402
|
2038 |
+}
|
yann@402
|
2039 |
+
|
yann@402
|
2040 |
+static void
|
yann@402
|
2041 |
+ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue)
|
yann@402
|
2042 |
+{
|
yann@402
|
2043 |
+#if WORDS_BIGENDIAN && SIZEOF_ARG == 8
|
yann@402
|
2044 |
+ switch (cif->rtype->type)
|
yann@402
|
2045 |
+ {
|
yann@402
|
2046 |
+ case FFI_TYPE_UINT8:
|
yann@402
|
2047 |
+ case FFI_TYPE_UINT16:
|
yann@402
|
2048 |
+ case FFI_TYPE_UINT32:
|
yann@402
|
2049 |
+ *(UINT64 *)rvalue >>= 32;
|
yann@402
|
2050 |
+ break;
|
yann@402
|
2051 |
+
|
yann@402
|
2052 |
+ case FFI_TYPE_SINT8:
|
yann@402
|
2053 |
+ case FFI_TYPE_SINT16:
|
yann@402
|
2054 |
+ case FFI_TYPE_SINT32:
|
yann@402
|
2055 |
+ case FFI_TYPE_INT:
|
yann@402
|
2056 |
+ *(SINT64 *)rvalue >>= 32;
|
yann@402
|
2057 |
+ break;
|
yann@402
|
2058 |
+
|
yann@402
|
2059 |
+ default:
|
yann@402
|
2060 |
+ break;
|
yann@402
|
2061 |
+ }
|
yann@402
|
2062 |
+#endif
|
yann@402
|
2063 |
+}
|
yann@402
|
2064 |
|
yann@402
|
2065 |
/* This is a generic definition of ffi_raw_call, to be used if the
|
yann@402
|
2066 |
* native system does not provide a machine-specific implementation.
|
yann@402
|
2067 |
@@ -227,6 +292,7 @@
|
yann@402
|
2068 |
void **avalue = (void**) alloca (cif->nargs * sizeof (void*));
|
yann@402
|
2069 |
ffi_java_raw_to_ptrarray (cif, raw, avalue);
|
yann@402
|
2070 |
ffi_call (cif, fn, rvalue, avalue);
|
yann@402
|
2071 |
+ ffi_java_rvalue_to_raw (cif, rvalue);
|
yann@402
|
2072 |
}
|
yann@402
|
2073 |
|
yann@402
|
2074 |
#if FFI_CLOSURES /* base system provides closures */
|
yann@402
|
2075 |
@@ -240,6 +306,7 @@
|
yann@402
|
2076 |
|
yann@402
|
2077 |
ffi_java_ptrarray_to_raw (cif, avalue, raw);
|
yann@402
|
2078 |
(*cl->fun) (cif, rvalue, raw, cl->user_data);
|
yann@402
|
2079 |
+ ffi_java_raw_to_rvalue (cif, rvalue);
|
yann@402
|
2080 |
}
|
yann@402
|
2081 |
|
yann@402
|
2082 |
/* Again, here is the generic version of ffi_prep_raw_closure, which
|
yann@402
|
2083 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/m68k/ffi.c gcc/libffi/src/m68k/ffi.c
|
yann@402
|
2084 |
--- gcc-3.2.2.orig/libffi/src/m68k/ffi.c Sun Aug 8 22:27:19 1999
|
yann@402
|
2085 |
+++ gcc/libffi/src/m68k/ffi.c Fri Jul 19 08:08:30 2002
|
yann@402
|
2086 |
@@ -16,14 +16,11 @@
|
yann@402
|
2087 |
ffi_prep_args (void *stack, extended_cif *ecif)
|
yann@402
|
2088 |
{
|
yann@402
|
2089 |
unsigned int i;
|
yann@402
|
2090 |
- int tmp;
|
yann@402
|
2091 |
- unsigned int avn;
|
yann@402
|
2092 |
void **p_argv;
|
yann@402
|
2093 |
char *argp;
|
yann@402
|
2094 |
ffi_type **p_arg;
|
yann@402
|
2095 |
void *struct_value_ptr;
|
yann@402
|
2096 |
|
yann@402
|
2097 |
- tmp = 0;
|
yann@402
|
2098 |
argp = stack;
|
yann@402
|
2099 |
|
yann@402
|
2100 |
if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
|
yann@402
|
2101 |
@@ -32,11 +29,10 @@
|
yann@402
|
2102 |
else
|
yann@402
|
2103 |
struct_value_ptr = NULL;
|
yann@402
|
2104 |
|
yann@402
|
2105 |
- avn = ecif->cif->nargs;
|
yann@402
|
2106 |
p_argv = ecif->avalue;
|
yann@402
|
2107 |
|
yann@402
|
2108 |
for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
|
yann@402
|
2109 |
- i != 0 && avn != 0;
|
yann@402
|
2110 |
+ i != 0;
|
yann@402
|
2111 |
i--, p_arg++)
|
yann@402
|
2112 |
{
|
yann@402
|
2113 |
size_t z;
|
yann@402
|
2114 |
@@ -45,9 +41,6 @@
|
yann@402
|
2115 |
if (((*p_arg)->alignment - 1) & (unsigned) argp)
|
yann@402
|
2116 |
argp = (char *) ALIGN (argp, (*p_arg)->alignment);
|
yann@402
|
2117 |
|
yann@402
|
2118 |
- if (avn != 0)
|
yann@402
|
2119 |
- {
|
yann@402
|
2120 |
- avn--;
|
yann@402
|
2121 |
z = (*p_arg)->size;
|
yann@402
|
2122 |
if (z < sizeof (int))
|
yann@402
|
2123 |
{
|
yann@402
|
2124 |
@@ -82,7 +75,6 @@
|
yann@402
|
2125 |
memcpy (argp, *p_argv, z);
|
yann@402
|
2126 |
p_argv++;
|
yann@402
|
2127 |
argp += z;
|
yann@402
|
2128 |
- }
|
yann@402
|
2129 |
}
|
yann@402
|
2130 |
|
yann@402
|
2131 |
return struct_value_ptr;
|
yann@402
|
2132 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/mips/ffi.c gcc/libffi/src/mips/ffi.c
|
yann@402
|
2133 |
--- gcc-3.2.2.orig/libffi/src/mips/ffi.c Sat Mar 3 07:21:23 2001
|
yann@402
|
2134 |
+++ gcc/libffi/src/mips/ffi.c Fri Jul 19 08:08:31 2002
|
yann@402
|
2135 |
@@ -23,6 +23,7 @@
|
yann@402
|
2136 |
OTHER DEALINGS IN THE SOFTWARE.
|
yann@402
|
2137 |
----------------------------------------------------------------------- */
|
yann@402
|
2138 |
|
yann@402
|
2139 |
+#include <sgidefs.h>
|
yann@402
|
2140 |
#include <ffi.h>
|
yann@402
|
2141 |
#include <ffi_common.h>
|
yann@402
|
2142 |
|
yann@402
|
2143 |
@@ -50,7 +51,6 @@
|
yann@402
|
2144 |
int flags)
|
yann@402
|
2145 |
{
|
yann@402
|
2146 |
register int i;
|
yann@402
|
2147 |
- register int avn;
|
yann@402
|
2148 |
register void **p_argv;
|
yann@402
|
2149 |
register char *argp;
|
yann@402
|
2150 |
register ffi_type **p_arg;
|
yann@402
|
2151 |
@@ -80,12 +80,9 @@
|
yann@402
|
2152 |
FIX_ARGP;
|
yann@402
|
2153 |
}
|
yann@402
|
2154 |
|
yann@402
|
2155 |
- avn = ecif->cif->nargs;
|
yann@402
|
2156 |
p_argv = ecif->avalue;
|
yann@402
|
2157 |
|
yann@402
|
2158 |
- for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
|
yann@402
|
2159 |
- i && avn;
|
yann@402
|
2160 |
- i--, p_arg++)
|
yann@402
|
2161 |
+ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++)
|
yann@402
|
2162 |
{
|
yann@402
|
2163 |
size_t z;
|
yann@402
|
2164 |
|
yann@402
|
2165 |
@@ -101,9 +98,6 @@
|
yann@402
|
2166 |
#define OFFSET sizeof(int)
|
yann@402
|
2167 |
#endif
|
yann@402
|
2168 |
|
yann@402
|
2169 |
- if (avn)
|
yann@402
|
2170 |
- {
|
yann@402
|
2171 |
- avn--;
|
yann@402
|
2172 |
z = (*p_arg)->size;
|
yann@402
|
2173 |
if (z < sizeof(SLOT_TYPE_UNSIGNED))
|
yann@402
|
2174 |
{
|
yann@402
|
2175 |
@@ -179,7 +173,6 @@
|
yann@402
|
2176 |
p_argv++;
|
yann@402
|
2177 |
argp += z;
|
yann@402
|
2178 |
FIX_ARGP;
|
yann@402
|
2179 |
- }
|
yann@402
|
2180 |
}
|
yann@402
|
2181 |
|
yann@402
|
2182 |
return;
|
yann@402
|
2183 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/powerpc/darwin.S gcc/libffi/src/powerpc/darwin.S
|
yann@402
|
2184 |
--- gcc-3.2.2.orig/libffi/src/powerpc/darwin.S Sat Jan 19 01:22:34 2002
|
yann@402
|
2185 |
+++ gcc/libffi/src/powerpc/darwin.S Thu Jan 23 03:21:55 2003
|
yann@402
|
2186 |
@@ -3,8 +3,6 @@
|
yann@402
|
2187 |
|
yann@402
|
2188 |
PowerPC Assembly glue.
|
yann@402
|
2189 |
|
yann@402
|
2190 |
- $Id: darwin.S,v 1.2 2002/01/18 16:22:34 dje Exp $
|
yann@402
|
2191 |
-
|
yann@402
|
2192 |
Permission is hereby granted, free of charge, to any person obtaining
|
yann@402
|
2193 |
a copy of this software and associated documentation files (the
|
yann@402
|
2194 |
``Software''), to deal in the Software without restriction, including
|
yann@402
|
2195 |
@@ -39,30 +37,34 @@
|
yann@402
|
2196 |
.text
|
yann@402
|
2197 |
.align 2
|
yann@402
|
2198 |
_ffi_call_DARWIN:
|
yann@402
|
2199 |
- mr r12,r8 // We only need r12 until the call, so it doesn't have to be saved...
|
yann@402
|
2200 |
+LFB0:
|
yann@402
|
2201 |
+ mr r12,r8 /* We only need r12 until the call,
|
yann@402
|
2202 |
+ so it doesn't have to be saved... */
|
yann@402
|
2203 |
+LFB1:
|
yann@402
|
2204 |
/* Save the old stack pointer as AP. */
|
yann@402
|
2205 |
mr r8,r1
|
yann@402
|
2206 |
-
|
yann@402
|
2207 |
+LCFI0:
|
yann@402
|
2208 |
/* Allocate the stack space we need. */
|
yann@402
|
2209 |
stwux r1,r1,r4
|
yann@402
|
2210 |
|
yann@402
|
2211 |
/* Save registers we use. */
|
yann@402
|
2212 |
mflr r9
|
yann@402
|
2213 |
|
yann@402
|
2214 |
- stw r28,-16(r8)
|
yann@402
|
2215 |
+ stw r28,-16(r8)
|
yann@402
|
2216 |
stw r29,-12(r8)
|
yann@402
|
2217 |
stw r30, -8(r8)
|
yann@402
|
2218 |
stw r31, -4(r8)
|
yann@402
|
2219 |
-
|
yann@402
|
2220 |
- stw r9, 8(r8)
|
yann@402
|
2221 |
+
|
yann@402
|
2222 |
+ stw r9, 8(r8)
|
yann@402
|
2223 |
stw r2, 20(r1)
|
yann@402
|
2224 |
+LCFI1:
|
yann@402
|
2225 |
|
yann@402
|
2226 |
/* Save arguments over call... */
|
yann@402
|
2227 |
- mr r31,r5 /* flags, */
|
yann@402
|
2228 |
- mr r30,r6 /* rvalue, */
|
yann@402
|
2229 |
- mr r29,r7 /* function address, */
|
yann@402
|
2230 |
- mr r28,r8 /* our AP. */
|
yann@402
|
2231 |
-
|
yann@402
|
2232 |
+ mr r31,r5 /* flags, */
|
yann@402
|
2233 |
+ mr r30,r6 /* rvalue, */
|
yann@402
|
2234 |
+ mr r29,r7 /* function address, */
|
yann@402
|
2235 |
+ mr r28,r8 /* our AP. */
|
yann@402
|
2236 |
+LCFI2:
|
yann@402
|
2237 |
/* Call ffi_prep_args. */
|
yann@402
|
2238 |
mr r4,r1
|
yann@402
|
2239 |
li r9,0
|
yann@402
|
2240 |
@@ -145,7 +147,8 @@
|
yann@402
|
2241 |
L(float_return_value):
|
yann@402
|
2242 |
stfs f1,0(r30)
|
yann@402
|
2243 |
b L(done_return_value)
|
yann@402
|
2244 |
-//END(_ffi_call_DARWIN)
|
yann@402
|
2245 |
+LFE1:
|
yann@402
|
2246 |
+/* END(_ffi_call_DARWIN) */
|
yann@402
|
2247 |
|
yann@402
|
2248 |
/* Provide a null definition of _ffi_call_AIX. */
|
yann@402
|
2249 |
.text
|
yann@402
|
2250 |
@@ -155,5 +158,61 @@
|
yann@402
|
2251 |
.align 2
|
yann@402
|
2252 |
_ffi_call_AIX:
|
yann@402
|
2253 |
blr
|
yann@402
|
2254 |
-//END(_ffi_call_AIX)
|
yann@402
|
2255 |
+/* END(_ffi_call_AIX) */
|
yann@402
|
2256 |
|
yann@402
|
2257 |
+.data
|
yann@402
|
2258 |
+.section __TEXT,__eh_frame
|
yann@402
|
2259 |
+Lframe1:
|
yann@402
|
2260 |
+ .set L$set$0,LECIE1-LSCIE1
|
yann@402
|
2261 |
+ .long L$set$0 ; Length of Common Information Entry
|
yann@402
|
2262 |
+LSCIE1:
|
yann@402
|
2263 |
+ .long 0x0 ; CIE Identifier Tag
|
yann@402
|
2264 |
+ .byte 0x1 ; CIE Version
|
yann@402
|
2265 |
+ .ascii "zR\0" ; CIE Augmentation
|
yann@402
|
2266 |
+ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor
|
yann@402
|
2267 |
+ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor
|
yann@402
|
2268 |
+ .byte 0x41 ; CIE RA Column
|
yann@402
|
2269 |
+ .byte 0x1 ; uleb128 0x1; Augmentation size
|
yann@402
|
2270 |
+ .byte 0x10 ; FDE Encoding (pcrel)
|
yann@402
|
2271 |
+ .byte 0xc ; DW_CFA_def_cfa
|
yann@402
|
2272 |
+ .byte 0x1 ; uleb128 0x1
|
yann@402
|
2273 |
+ .byte 0x0 ; uleb128 0x0
|
yann@402
|
2274 |
+ .align 2
|
yann@402
|
2275 |
+LECIE1:
|
yann@402
|
2276 |
+LSFDE1:
|
yann@402
|
2277 |
+ .set L$set$1,LEFDE1-LASFDE1
|
yann@402
|
2278 |
+ .long L$set$1 ; FDE Length
|
yann@402
|
2279 |
+LASFDE1:
|
yann@402
|
2280 |
+ .set L$set$2,LASFDE1-Lframe1
|
yann@402
|
2281 |
+ .long L$set$2 ; FDE CIE offset
|
yann@402
|
2282 |
+ .long LFB0-. ; FDE initial location
|
yann@402
|
2283 |
+ .set L$set$3,LFE1-LFB0
|
yann@402
|
2284 |
+ .long L$set$3 ; FDE address range
|
yann@402
|
2285 |
+ .byte 0x0 ; uleb128 0x0; Augmentation size
|
yann@402
|
2286 |
+ .byte 0x4 ; DW_CFA_advance_loc4
|
yann@402
|
2287 |
+ .set L$set$4,LCFI0-LFB1
|
yann@402
|
2288 |
+ .long L$set$4
|
yann@402
|
2289 |
+ .byte 0xd ; DW_CFA_def_cfa_register
|
yann@402
|
2290 |
+ .byte 0x08 ; uleb128 0x08
|
yann@402
|
2291 |
+ .byte 0x4 ; DW_CFA_advance_loc4
|
yann@402
|
2292 |
+ .set L$set$5,LCFI1-LCFI0
|
yann@402
|
2293 |
+ .long L$set$5
|
yann@402
|
2294 |
+ .byte 0x11 ; DW_CFA_offset_extended_sf
|
yann@402
|
2295 |
+ .byte 0x41 ; uleb128 0x41
|
yann@402
|
2296 |
+ .byte 0x7e ; sleb128 -2
|
yann@402
|
2297 |
+ .byte 0x9f ; DW_CFA_offset, column 0x1f
|
yann@402
|
2298 |
+ .byte 0x1 ; uleb128 0x1
|
yann@402
|
2299 |
+ .byte 0x9e ; DW_CFA_offset, column 0x1e
|
yann@402
|
2300 |
+ .byte 0x2 ; uleb128 0x2
|
yann@402
|
2301 |
+ .byte 0x9d ; DW_CFA_offset, column 0x1d
|
yann@402
|
2302 |
+ .byte 0x3 ; uleb128 0x3
|
yann@402
|
2303 |
+ .byte 0x9c ; DW_CFA_offset, column 0x1c
|
yann@402
|
2304 |
+ .byte 0x4 ; uleb128 0x4
|
yann@402
|
2305 |
+ .byte 0x4 ; DW_CFA_advance_loc4
|
yann@402
|
2306 |
+ .set L$set$6,LCFI2-LCFI1
|
yann@402
|
2307 |
+ .long L$set$6
|
yann@402
|
2308 |
+ .byte 0xd ; DW_CFA_def_cfa_register
|
yann@402
|
2309 |
+ .byte 0x1c ; uleb128 0x1c
|
yann@402
|
2310 |
+ .align 2
|
yann@402
|
2311 |
+LEFDE1:
|
yann@402
|
2312 |
+
|
yann@402
|
2313 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/prep_cif.c gcc/libffi/src/prep_cif.c
|
yann@402
|
2314 |
--- gcc-3.2.2.orig/libffi/src/prep_cif.c Sat Mar 3 07:21:22 2001
|
yann@402
|
2315 |
+++ gcc/libffi/src/prep_cif.c Mon Sep 30 20:59:42 2002
|
yann@402
|
2316 |
@@ -103,7 +103,8 @@
|
yann@402
|
2317 |
/* Perform a sanity check on the return type */
|
yann@402
|
2318 |
FFI_ASSERT(ffi_type_test(cif->rtype));
|
yann@402
|
2319 |
|
yann@402
|
2320 |
-#ifndef M68K
|
yann@402
|
2321 |
+ /* x86-64 and s390 stack space allocation is handled in prep_machdep. */
|
yann@402
|
2322 |
+#if !defined M68K && !defined __x86_64__ && !defined S390
|
yann@402
|
2323 |
/* Make space for the return structure pointer */
|
yann@402
|
2324 |
if (cif->rtype->type == FFI_TYPE_STRUCT
|
yann@402
|
2325 |
#ifdef SPARC
|
yann@402
|
2326 |
@@ -122,6 +123,7 @@
|
yann@402
|
2327 |
if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK))
|
yann@402
|
2328 |
return FFI_BAD_TYPEDEF;
|
yann@402
|
2329 |
|
yann@402
|
2330 |
+#if !defined __x86_64__ && !defined S390
|
yann@402
|
2331 |
#ifdef SPARC
|
yann@402
|
2332 |
if (((*ptr)->type == FFI_TYPE_STRUCT
|
yann@402
|
2333 |
&& ((*ptr)->size > 16 || cif->abi != FFI_V9))
|
yann@402
|
2334 |
@@ -137,6 +139,7 @@
|
yann@402
|
2335 |
|
yann@402
|
2336 |
bytes += STACK_ARG_SIZE((*ptr)->size);
|
yann@402
|
2337 |
}
|
yann@402
|
2338 |
+#endif
|
yann@402
|
2339 |
}
|
yann@402
|
2340 |
|
yann@402
|
2341 |
cif->bytes = bytes;
|
yann@402
|
2342 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/ffi.c gcc/libffi/src/s390/ffi.c
|
yann@402
|
2343 |
--- gcc-3.2.2.orig/libffi/src/s390/ffi.c Thu Jan 1 09:00:00 1970
|
yann@402
|
2344 |
+++ gcc/libffi/src/s390/ffi.c Thu Feb 6 08:58:57 2003
|
yann@402
|
2345 |
@@ -0,0 +1,753 @@
|
yann@402
|
2346 |
+/* -----------------------------------------------------------------------
|
yann@402
|
2347 |
+ ffi.c - Copyright (c) 2000 Software AG
|
yann@402
|
2348 |
+
|
yann@402
|
2349 |
+ S390 Foreign Function Interface
|
yann@402
|
2350 |
+
|
yann@402
|
2351 |
+ Permission is hereby granted, free of charge, to any person obtaining
|
yann@402
|
2352 |
+ a copy of this software and associated documentation files (the
|
yann@402
|
2353 |
+ ``Software''), to deal in the Software without restriction, including
|
yann@402
|
2354 |
+ without limitation the rights to use, copy, modify, merge, publish,
|
yann@402
|
2355 |
+ distribute, sublicense, and/or sell copies of the Software, and to
|
yann@402
|
2356 |
+ permit persons to whom the Software is furnished to do so, subject to
|
yann@402
|
2357 |
+ the following conditions:
|
yann@402
|
2358 |
+
|
yann@402
|
2359 |
+ The above copyright notice and this permission notice shall be included
|
yann@402
|
2360 |
+ in all copies or substantial portions of the Software.
|
yann@402
|
2361 |
+
|
yann@402
|
2362 |
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
yann@402
|
2363 |
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
yann@402
|
2364 |
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
yann@402
|
2365 |
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
yann@402
|
2366 |
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
yann@402
|
2367 |
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
yann@402
|
2368 |
+ OTHER DEALINGS IN THE SOFTWARE.
|
yann@402
|
2369 |
+ ----------------------------------------------------------------------- */
|
yann@402
|
2370 |
+/*====================================================================*/
|
yann@402
|
2371 |
+/* Includes */
|
yann@402
|
2372 |
+/* -------- */
|
yann@402
|
2373 |
+/*====================================================================*/
|
yann@402
|
2374 |
+
|
yann@402
|
2375 |
+#include <ffi.h>
|
yann@402
|
2376 |
+#include <ffi_common.h>
|
yann@402
|
2377 |
+
|
yann@402
|
2378 |
+#include <stdlib.h>
|
yann@402
|
2379 |
+#include <stdio.h>
|
yann@402
|
2380 |
+
|
yann@402
|
2381 |
+/*====================== End of Includes =============================*/
|
yann@402
|
2382 |
+
|
yann@402
|
2383 |
+/*====================================================================*/
|
yann@402
|
2384 |
+/* Defines */
|
yann@402
|
2385 |
+/* ------- */
|
yann@402
|
2386 |
+/*====================================================================*/
|
yann@402
|
2387 |
+
|
yann@402
|
2388 |
+/* Maximum number of GPRs available for argument passing. */
|
yann@402
|
2389 |
+#define MAX_GPRARGS 5
|
yann@402
|
2390 |
+
|
yann@402
|
2391 |
+/* Maximum number of FPRs available for argument passing. */
|
yann@402
|
2392 |
+#ifdef __s390x__
|
yann@402
|
2393 |
+#define MAX_FPRARGS 4
|
yann@402
|
2394 |
+#else
|
yann@402
|
2395 |
+#define MAX_FPRARGS 2
|
yann@402
|
2396 |
+#endif
|
yann@402
|
2397 |
+
|
yann@402
|
2398 |
+/* Round to multiple of 16. */
|
yann@402
|
2399 |
+#define ROUND_SIZE(size) (((size) + 15) & ~15)
|
yann@402
|
2400 |
+
|
yann@402
|
2401 |
+/* If these values change, sysv.S must be adapted! */
|
yann@402
|
2402 |
+#define FFI390_RET_VOID 0
|
yann@402
|
2403 |
+#define FFI390_RET_STRUCT 1
|
yann@402
|
2404 |
+#define FFI390_RET_FLOAT 2
|
yann@402
|
2405 |
+#define FFI390_RET_DOUBLE 3
|
yann@402
|
2406 |
+#define FFI390_RET_INT32 4
|
yann@402
|
2407 |
+#define FFI390_RET_INT64 5
|
yann@402
|
2408 |
+
|
yann@402
|
2409 |
+/*===================== End of Defines ===============================*/
|
yann@402
|
2410 |
+
|
yann@402
|
2411 |
+/*====================================================================*/
|
yann@402
|
2412 |
+/* Prototypes */
|
yann@402
|
2413 |
+/* ---------- */
|
yann@402
|
2414 |
+/*====================================================================*/
|
yann@402
|
2415 |
+
|
yann@402
|
2416 |
+static void ffi_prep_args (unsigned char *, extended_cif *);
|
yann@402
|
2417 |
+static int ffi_check_float_struct (ffi_type *);
|
yann@402
|
2418 |
+void
|
yann@402
|
2419 |
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
|
yann@402
|
2420 |
+__attribute__ ((visibility ("hidden")))
|
yann@402
|
2421 |
+#endif
|
yann@402
|
2422 |
+ffi_closure_helper_SYSV (ffi_closure *, unsigned long *,
|
yann@402
|
2423 |
+ unsigned long long *, unsigned long *);
|
yann@402
|
2424 |
+
|
yann@402
|
2425 |
+/*====================== End of Prototypes ===========================*/
|
yann@402
|
2426 |
+
|
yann@402
|
2427 |
+/*====================================================================*/
|
yann@402
|
2428 |
+/* Externals */
|
yann@402
|
2429 |
+/* --------- */
|
yann@402
|
2430 |
+/*====================================================================*/
|
yann@402
|
2431 |
+
|
yann@402
|
2432 |
+extern void ffi_call_SYSV(unsigned,
|
yann@402
|
2433 |
+ extended_cif *,
|
yann@402
|
2434 |
+ void (*)(unsigned char *, extended_cif *),
|
yann@402
|
2435 |
+ unsigned,
|
yann@402
|
2436 |
+ void *,
|
yann@402
|
2437 |
+ void (*fn)());
|
yann@402
|
2438 |
+
|
yann@402
|
2439 |
+extern void ffi_closure_SYSV(void);
|
yann@402
|
2440 |
+
|
yann@402
|
2441 |
+/*====================== End of Externals ============================*/
|
yann@402
|
2442 |
+
|
yann@402
|
2443 |
+/*====================================================================*/
|
yann@402
|
2444 |
+/* */
|
yann@402
|
2445 |
+/* Name - ffi_check_struct_type. */
|
yann@402
|
2446 |
+/* */
|
yann@402
|
2447 |
+/* Function - Determine if a structure can be passed within a */
|
yann@402
|
2448 |
+/* general purpose or floating point register. */
|
yann@402
|
2449 |
+/* */
|
yann@402
|
2450 |
+/*====================================================================*/
|
yann@402
|
2451 |
+
|
yann@402
|
2452 |
+static int
|
yann@402
|
2453 |
+ffi_check_struct_type (ffi_type *arg)
|
yann@402
|
2454 |
+{
|
yann@402
|
2455 |
+ size_t size = arg->size;
|
yann@402
|
2456 |
+
|
yann@402
|
2457 |
+ /* If the struct has just one element, look at that element
|
yann@402
|
2458 |
+ to find out whether to consider the struct as floating point. */
|
yann@402
|
2459 |
+ while (arg->type == FFI_TYPE_STRUCT
|
yann@402
|
2460 |
+ && arg->elements[0] && !arg->elements[1])
|
yann@402
|
2461 |
+ arg = arg->elements[0];
|
yann@402
|
2462 |
+
|
yann@402
|
2463 |
+ /* Structs of size 1, 2, 4, and 8 are passed in registers,
|
yann@402
|
2464 |
+ just like the corresponding int/float types. */
|
yann@402
|
2465 |
+ switch (size)
|
yann@402
|
2466 |
+ {
|
yann@402
|
2467 |
+ case 1:
|
yann@402
|
2468 |
+ return FFI_TYPE_UINT8;
|
yann@402
|
2469 |
+
|
yann@402
|
2470 |
+ case 2:
|
yann@402
|
2471 |
+ return FFI_TYPE_UINT16;
|
yann@402
|
2472 |
+
|
yann@402
|
2473 |
+ case 4:
|
yann@402
|
2474 |
+ if (arg->type == FFI_TYPE_FLOAT)
|
yann@402
|
2475 |
+ return FFI_TYPE_FLOAT;
|
yann@402
|
2476 |
+ else
|
yann@402
|
2477 |
+ return FFI_TYPE_UINT32;
|
yann@402
|
2478 |
+
|
yann@402
|
2479 |
+ case 8:
|
yann@402
|
2480 |
+ if (arg->type == FFI_TYPE_DOUBLE)
|
yann@402
|
2481 |
+ return FFI_TYPE_DOUBLE;
|
yann@402
|
2482 |
+ else
|
yann@402
|
2483 |
+ return FFI_TYPE_UINT64;
|
yann@402
|
2484 |
+
|
yann@402
|
2485 |
+ default:
|
yann@402
|
2486 |
+ break;
|
yann@402
|
2487 |
+ }
|
yann@402
|
2488 |
+
|
yann@402
|
2489 |
+ /* Other structs are passed via a pointer to the data. */
|
yann@402
|
2490 |
+ return FFI_TYPE_POINTER;
|
yann@402
|
2491 |
+}
|
yann@402
|
2492 |
+
|
yann@402
|
2493 |
+/*======================== End of Routine ============================*/
|
yann@402
|
2494 |
+
|
yann@402
|
2495 |
+/*====================================================================*/
|
yann@402
|
2496 |
+/* */
|
yann@402
|
2497 |
+/* Name - ffi_prep_args. */
|
yann@402
|
2498 |
+/* */
|
yann@402
|
2499 |
+/* Function - Prepare parameters for call to function. */
|
yann@402
|
2500 |
+/* */
|
yann@402
|
2501 |
+/* ffi_prep_args is called by the assembly routine once stack space */
|
yann@402
|
2502 |
+/* has been allocated for the function's arguments. */
|
yann@402
|
2503 |
+/* */
|
yann@402
|
2504 |
+/*====================================================================*/
|
yann@402
|
2505 |
+
|
yann@402
|
2506 |
+static void
|
yann@402
|
2507 |
+ffi_prep_args (unsigned char *stack, extended_cif *ecif)
|
yann@402
|
2508 |
+{
|
yann@402
|
2509 |
+ /* The stack space will be filled with those areas:
|
yann@402
|
2510 |
+
|
yann@402
|
2511 |
+ FPR argument register save area (highest addresses)
|
yann@402
|
2512 |
+ GPR argument register save area
|
yann@402
|
2513 |
+ temporary struct copies
|
yann@402
|
2514 |
+ overflow argument area (lowest addresses)
|
yann@402
|
2515 |
+
|
yann@402
|
2516 |
+ We set up the following pointers:
|
yann@402
|
2517 |
+
|
yann@402
|
2518 |
+ p_fpr: bottom of the FPR area (growing upwards)
|
yann@402
|
2519 |
+ p_gpr: bottom of the GPR area (growing upwards)
|
yann@402
|
2520 |
+ p_ov: bottom of the overflow area (growing upwards)
|
yann@402
|
2521 |
+ p_struct: top of the struct copy area (growing downwards)
|
yann@402
|
2522 |
+
|
yann@402
|
2523 |
+ All areas are kept aligned to twice the word size. */
|
yann@402
|
2524 |
+
|
yann@402
|
2525 |
+ int gpr_off = ecif->cif->bytes;
|
yann@402
|
2526 |
+ int fpr_off = gpr_off + ROUND_SIZE (MAX_GPRARGS * sizeof (long));
|
yann@402
|
2527 |
+
|
yann@402
|
2528 |
+ unsigned long long *p_fpr = (unsigned long long *)(stack + fpr_off);
|
yann@402
|
2529 |
+ unsigned long *p_gpr = (unsigned long *)(stack + gpr_off);
|
yann@402
|
2530 |
+ unsigned char *p_struct = (unsigned char *)p_gpr;
|
yann@402
|
2531 |
+ unsigned long *p_ov = (unsigned long *)stack;
|
yann@402
|
2532 |
+
|
yann@402
|
2533 |
+ int n_fpr = 0;
|
yann@402
|
2534 |
+ int n_gpr = 0;
|
yann@402
|
2535 |
+ int n_ov = 0;
|
yann@402
|
2536 |
+
|
yann@402
|
2537 |
+ ffi_type **ptr;
|
yann@402
|
2538 |
+ void **p_argv = ecif->avalue;
|
yann@402
|
2539 |
+ int i;
|
yann@402
|
2540 |
+
|
yann@402
|
2541 |
+ /* If we returning a structure then we set the first parameter register
|
yann@402
|
2542 |
+ to the address of where we are returning this structure. */
|
yann@402
|
2543 |
+
|
yann@402
|
2544 |
+ if (ecif->cif->flags == FFI390_RET_STRUCT)
|
yann@402
|
2545 |
+ p_gpr[n_gpr++] = (unsigned long) ecif->rvalue;
|
yann@402
|
2546 |
+
|
yann@402
|
2547 |
+ /* Now for the arguments. */
|
yann@402
|
2548 |
+
|
yann@402
|
2549 |
+ for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs;
|
yann@402
|
2550 |
+ i > 0;
|
yann@402
|
2551 |
+ i--, ptr++, p_argv++)
|
yann@402
|
2552 |
+ {
|
yann@402
|
2553 |
+ void *arg = *p_argv;
|
yann@402
|
2554 |
+ int type = (*ptr)->type;
|
yann@402
|
2555 |
+
|
yann@402
|
2556 |
+ /* Check how a structure type is passed. */
|
yann@402
|
2557 |
+ if (type == FFI_TYPE_STRUCT)
|
yann@402
|
2558 |
+ {
|
yann@402
|
2559 |
+ type = ffi_check_struct_type (*ptr);
|
yann@402
|
2560 |
+
|
yann@402
|
2561 |
+ /* If we pass the struct via pointer, copy the data. */
|
yann@402
|
2562 |
+ if (type == FFI_TYPE_POINTER)
|
yann@402
|
2563 |
+ {
|
yann@402
|
2564 |
+ p_struct -= ROUND_SIZE ((*ptr)->size);
|
yann@402
|
2565 |
+ memcpy (p_struct, (char *)arg, (*ptr)->size);
|
yann@402
|
2566 |
+ arg = &p_struct;
|
yann@402
|
2567 |
+ }
|
yann@402
|
2568 |
+ }
|
yann@402
|
2569 |
+
|
yann@402
|
2570 |
+ /* Pointers are passed like UINTs of the same size. */
|
yann@402
|
2571 |
+ if (type == FFI_TYPE_POINTER)
|
yann@402
|
2572 |
+#ifdef __s390x__
|
yann@402
|
2573 |
+ type = FFI_TYPE_UINT64;
|
yann@402
|
2574 |
+#else
|
yann@402
|
2575 |
+ type = FFI_TYPE_UINT32;
|
yann@402
|
2576 |
+#endif
|
yann@402
|
2577 |
+
|
yann@402
|
2578 |
+ /* Now handle all primitive int/float data types. */
|
yann@402
|
2579 |
+ switch (type)
|
yann@402
|
2580 |
+ {
|
yann@402
|
2581 |
+ case FFI_TYPE_DOUBLE:
|
yann@402
|
2582 |
+ if (n_fpr < MAX_FPRARGS)
|
yann@402
|
2583 |
+ p_fpr[n_fpr++] = *(unsigned long long *) arg;
|
yann@402
|
2584 |
+ else
|
yann@402
|
2585 |
+#ifdef __s390x__
|
yann@402
|
2586 |
+ p_ov[n_ov++] = *(unsigned long *) arg;
|
yann@402
|
2587 |
+#else
|
yann@402
|
2588 |
+ p_ov[n_ov++] = ((unsigned long *) arg)[0],
|
yann@402
|
2589 |
+ p_ov[n_ov++] = ((unsigned long *) arg)[1];
|
yann@402
|
2590 |
+#endif
|
yann@402
|
2591 |
+ break;
|
yann@402
|
2592 |
+
|
yann@402
|
2593 |
+ case FFI_TYPE_FLOAT:
|
yann@402
|
2594 |
+ if (n_fpr < MAX_FPRARGS)
|
yann@402
|
2595 |
+ p_fpr[n_fpr++] = (long long) *(unsigned int *) arg << 32;
|
yann@402
|
2596 |
+ else
|
yann@402
|
2597 |
+ p_ov[n_ov++] = *(unsigned int *) arg;
|
yann@402
|
2598 |
+ break;
|
yann@402
|
2599 |
+
|
yann@402
|
2600 |
+ case FFI_TYPE_UINT64:
|
yann@402
|
2601 |
+ case FFI_TYPE_SINT64:
|
yann@402
|
2602 |
+#ifdef __s390x__
|
yann@402
|
2603 |
+ if (n_gpr < MAX_GPRARGS)
|
yann@402
|
2604 |
+ p_gpr[n_gpr++] = *(unsigned long *) arg;
|
yann@402
|
2605 |
+ else
|
yann@402
|
2606 |
+ p_ov[n_ov++] = *(unsigned long *) arg;
|
yann@402
|
2607 |
+#else
|
yann@402
|
2608 |
+ if (n_gpr == MAX_GPRARGS-1)
|
yann@402
|
2609 |
+ n_gpr = MAX_GPRARGS;
|
yann@402
|
2610 |
+ if (n_gpr < MAX_GPRARGS)
|
yann@402
|
2611 |
+ p_gpr[n_gpr++] = ((unsigned long *) arg)[0],
|
yann@402
|
2612 |
+ p_gpr[n_gpr++] = ((unsigned long *) arg)[1];
|
yann@402
|
2613 |
+ else
|
yann@402
|
2614 |
+ p_ov[n_ov++] = ((unsigned long *) arg)[0],
|
yann@402
|
2615 |
+ p_ov[n_ov++] = ((unsigned long *) arg)[1];
|
yann@402
|
2616 |
+#endif
|
yann@402
|
2617 |
+ break;
|
yann@402
|
2618 |
+
|
yann@402
|
2619 |
+ case FFI_TYPE_UINT32:
|
yann@402
|
2620 |
+ if (n_gpr < MAX_GPRARGS)
|
yann@402
|
2621 |
+ p_gpr[n_gpr++] = *(unsigned int *) arg;
|
yann@402
|
2622 |
+ else
|
yann@402
|
2623 |
+ p_ov[n_ov++] = *(unsigned int *) arg;
|
yann@402
|
2624 |
+ break;
|
yann@402
|
2625 |
+
|
yann@402
|
2626 |
+ case FFI_TYPE_INT:
|
yann@402
|
2627 |
+ case FFI_TYPE_SINT32:
|
yann@402
|
2628 |
+ if (n_gpr < MAX_GPRARGS)
|
yann@402
|
2629 |
+ p_gpr[n_gpr++] = *(signed int *) arg;
|
yann@402
|
2630 |
+ else
|
yann@402
|
2631 |
+ p_ov[n_ov++] = *(signed int *) arg;
|
yann@402
|
2632 |
+ break;
|
yann@402
|
2633 |
+
|
yann@402
|
2634 |
+ case FFI_TYPE_UINT16:
|
yann@402
|
2635 |
+ if (n_gpr < MAX_GPRARGS)
|
yann@402
|
2636 |
+ p_gpr[n_gpr++] = *(unsigned short *) arg;
|
yann@402
|
2637 |
+ else
|
yann@402
|
2638 |
+ p_ov[n_ov++] = *(unsigned short *) arg;
|
yann@402
|
2639 |
+ break;
|
yann@402
|
2640 |
+
|
yann@402
|
2641 |
+ case FFI_TYPE_SINT16:
|
yann@402
|
2642 |
+ if (n_gpr < MAX_GPRARGS)
|
yann@402
|
2643 |
+ p_gpr[n_gpr++] = *(signed short *) arg;
|
yann@402
|
2644 |
+ else
|
yann@402
|
2645 |
+ p_ov[n_ov++] = *(signed short *) arg;
|
yann@402
|
2646 |
+ break;
|
yann@402
|
2647 |
+
|
yann@402
|
2648 |
+ case FFI_TYPE_UINT8:
|
yann@402
|
2649 |
+ if (n_gpr < MAX_GPRARGS)
|
yann@402
|
2650 |
+ p_gpr[n_gpr++] = *(unsigned char *) arg;
|
yann@402
|
2651 |
+ else
|
yann@402
|
2652 |
+ p_ov[n_ov++] = *(unsigned char *) arg;
|
yann@402
|
2653 |
+ break;
|
yann@402
|
2654 |
+
|
yann@402
|
2655 |
+ case FFI_TYPE_SINT8:
|
yann@402
|
2656 |
+ if (n_gpr < MAX_GPRARGS)
|
yann@402
|
2657 |
+ p_gpr[n_gpr++] = *(signed char *) arg;
|
yann@402
|
2658 |
+ else
|
yann@402
|
2659 |
+ p_ov[n_ov++] = *(signed char *) arg;
|
yann@402
|
2660 |
+ break;
|
yann@402
|
2661 |
+
|
yann@402
|
2662 |
+ default:
|
yann@402
|
2663 |
+ FFI_ASSERT (0);
|
yann@402
|
2664 |
+ break;
|
yann@402
|
2665 |
+ }
|
yann@402
|
2666 |
+ }
|
yann@402
|
2667 |
+}
|
yann@402
|
2668 |
+
|
yann@402
|
2669 |
+/*======================== End of Routine ============================*/
|
yann@402
|
2670 |
+
|
yann@402
|
2671 |
+/*====================================================================*/
|
yann@402
|
2672 |
+/* */
|
yann@402
|
2673 |
+/* Name - ffi_prep_cif_machdep. */
|
yann@402
|
2674 |
+/* */
|
yann@402
|
2675 |
+/* Function - Perform machine dependent CIF processing. */
|
yann@402
|
2676 |
+/* */
|
yann@402
|
2677 |
+/*====================================================================*/
|
yann@402
|
2678 |
+
|
yann@402
|
2679 |
+ffi_status
|
yann@402
|
2680 |
+ffi_prep_cif_machdep(ffi_cif *cif)
|
yann@402
|
2681 |
+{
|
yann@402
|
2682 |
+ size_t struct_size = 0;
|
yann@402
|
2683 |
+ int n_gpr = 0;
|
yann@402
|
2684 |
+ int n_fpr = 0;
|
yann@402
|
2685 |
+ int n_ov = 0;
|
yann@402
|
2686 |
+
|
yann@402
|
2687 |
+ ffi_type **ptr;
|
yann@402
|
2688 |
+ int i;
|
yann@402
|
2689 |
+
|
yann@402
|
2690 |
+ /* Determine return value handling. */
|
yann@402
|
2691 |
+
|
yann@402
|
2692 |
+ switch (cif->rtype->type)
|
yann@402
|
2693 |
+ {
|
yann@402
|
2694 |
+ /* Void is easy. */
|
yann@402
|
2695 |
+ case FFI_TYPE_VOID:
|
yann@402
|
2696 |
+ cif->flags = FFI390_RET_VOID;
|
yann@402
|
2697 |
+ break;
|
yann@402
|
2698 |
+
|
yann@402
|
2699 |
+ /* Structures are returned via a hidden pointer. */
|
yann@402
|
2700 |
+ case FFI_TYPE_STRUCT:
|
yann@402
|
2701 |
+ cif->flags = FFI390_RET_STRUCT;
|
yann@402
|
2702 |
+ n_gpr++; /* We need one GPR to pass the pointer. */
|
yann@402
|
2703 |
+ break;
|
yann@402
|
2704 |
+
|
yann@402
|
2705 |
+ /* Floating point values are returned in fpr 0. */
|
yann@402
|
2706 |
+ case FFI_TYPE_FLOAT:
|
yann@402
|
2707 |
+ cif->flags = FFI390_RET_FLOAT;
|
yann@402
|
2708 |
+ break;
|
yann@402
|
2709 |
+
|
yann@402
|
2710 |
+ case FFI_TYPE_DOUBLE:
|
yann@402
|
2711 |
+ cif->flags = FFI390_RET_DOUBLE;
|
yann@402
|
2712 |
+ break;
|
yann@402
|
2713 |
+
|
yann@402
|
2714 |
+ /* Integer values are returned in gpr 2 (and gpr 3
|
yann@402
|
2715 |
+ for 64-bit values on 31-bit machines). */
|
yann@402
|
2716 |
+ case FFI_TYPE_UINT64:
|
yann@402
|
2717 |
+ case FFI_TYPE_SINT64:
|
yann@402
|
2718 |
+ cif->flags = FFI390_RET_INT64;
|
yann@402
|
2719 |
+ break;
|
yann@402
|
2720 |
+
|
yann@402
|
2721 |
+ case FFI_TYPE_POINTER:
|
yann@402
|
2722 |
+ case FFI_TYPE_INT:
|
yann@402
|
2723 |
+ case FFI_TYPE_UINT32:
|
yann@402
|
2724 |
+ case FFI_TYPE_SINT32:
|
yann@402
|
2725 |
+ case FFI_TYPE_UINT16:
|
yann@402
|
2726 |
+ case FFI_TYPE_SINT16:
|
yann@402
|
2727 |
+ case FFI_TYPE_UINT8:
|
yann@402
|
2728 |
+ case FFI_TYPE_SINT8:
|
yann@402
|
2729 |
+ /* These are to be extended to word size. */
|
yann@402
|
2730 |
+#ifdef __s390x__
|
yann@402
|
2731 |
+ cif->flags = FFI390_RET_INT64;
|
yann@402
|
2732 |
+#else
|
yann@402
|
2733 |
+ cif->flags = FFI390_RET_INT32;
|
yann@402
|
2734 |
+#endif
|
yann@402
|
2735 |
+ break;
|
yann@402
|
2736 |
+
|
yann@402
|
2737 |
+ default:
|
yann@402
|
2738 |
+ FFI_ASSERT (0);
|
yann@402
|
2739 |
+ break;
|
yann@402
|
2740 |
+ }
|
yann@402
|
2741 |
+
|
yann@402
|
2742 |
+ /* Now for the arguments. */
|
yann@402
|
2743 |
+
|
yann@402
|
2744 |
+ for (ptr = cif->arg_types, i = cif->nargs;
|
yann@402
|
2745 |
+ i > 0;
|
yann@402
|
2746 |
+ i--, ptr++)
|
yann@402
|
2747 |
+ {
|
yann@402
|
2748 |
+ int type = (*ptr)->type;
|
yann@402
|
2749 |
+
|
yann@402
|
2750 |
+ /* Check how a structure type is passed. */
|
yann@402
|
2751 |
+ if (type == FFI_TYPE_STRUCT)
|
yann@402
|
2752 |
+ {
|
yann@402
|
2753 |
+ type = ffi_check_struct_type (*ptr);
|
yann@402
|
2754 |
+
|
yann@402
|
2755 |
+ /* If we pass the struct via pointer, we must reserve space
|
yann@402
|
2756 |
+ to copy its data for proper call-by-value semantics. */
|
yann@402
|
2757 |
+ if (type == FFI_TYPE_POINTER)
|
yann@402
|
2758 |
+ struct_size += ROUND_SIZE ((*ptr)->size);
|
yann@402
|
2759 |
+ }
|
yann@402
|
2760 |
+
|
yann@402
|
2761 |
+ /* Now handle all primitive int/float data types. */
|
yann@402
|
2762 |
+ switch (type)
|
yann@402
|
2763 |
+ {
|
yann@402
|
2764 |
+ /* The first MAX_FPRARGS floating point arguments
|
yann@402
|
2765 |
+ go in FPRs, the rest overflow to the stack. */
|
yann@402
|
2766 |
+
|
yann@402
|
2767 |
+ case FFI_TYPE_DOUBLE:
|
yann@402
|
2768 |
+ if (n_fpr < MAX_FPRARGS)
|
yann@402
|
2769 |
+ n_fpr++;
|
yann@402
|
2770 |
+ else
|
yann@402
|
2771 |
+ n_ov += sizeof (double) / sizeof (long);
|
yann@402
|
2772 |
+ break;
|
yann@402
|
2773 |
+
|
yann@402
|
2774 |
+ case FFI_TYPE_FLOAT:
|
yann@402
|
2775 |
+ if (n_fpr < MAX_FPRARGS)
|
yann@402
|
2776 |
+ n_fpr++;
|
yann@402
|
2777 |
+ else
|
yann@402
|
2778 |
+ n_ov++;
|
yann@402
|
2779 |
+ break;
|
yann@402
|
2780 |
+
|
yann@402
|
2781 |
+ /* On 31-bit machines, 64-bit integers are passed in GPR pairs,
|
yann@402
|
2782 |
+ if one is still available, or else on the stack. If only one
|
yann@402
|
2783 |
+ register is free, skip the register (it won't be used for any
|
yann@402
|
2784 |
+ subsequent argument either). */
|
yann@402
|
2785 |
+
|
yann@402
|
2786 |
+#ifndef __s390x__
|
yann@402
|
2787 |
+ case FFI_TYPE_UINT64:
|
yann@402
|
2788 |
+ case FFI_TYPE_SINT64:
|
yann@402
|
2789 |
+ if (n_gpr == MAX_GPRARGS-1)
|
yann@402
|
2790 |
+ n_gpr = MAX_GPRARGS;
|
yann@402
|
2791 |
+ if (n_gpr < MAX_GPRARGS)
|
yann@402
|
2792 |
+ n_gpr += 2;
|
yann@402
|
2793 |
+ else
|
yann@402
|
2794 |
+ n_ov += 2;
|
yann@402
|
2795 |
+ break;
|
yann@402
|
2796 |
+#endif
|
yann@402
|
2797 |
+
|
yann@402
|
2798 |
+ /* Everything else is passed in GPRs (until MAX_GPRARGS
|
yann@402
|
2799 |
+ have been used) or overflows to the stack. */
|
yann@402
|
2800 |
+
|
yann@402
|
2801 |
+ default:
|
yann@402
|
2802 |
+ if (n_gpr < MAX_GPRARGS)
|
yann@402
|
2803 |
+ n_gpr++;
|
yann@402
|
2804 |
+ else
|
yann@402
|
2805 |
+ n_ov++;
|
yann@402
|
2806 |
+ break;
|
yann@402
|
2807 |
+ }
|
yann@402
|
2808 |
+ }
|
yann@402
|
2809 |
+
|
yann@402
|
2810 |
+ /* Total stack space as required for overflow arguments
|
yann@402
|
2811 |
+ and temporary structure copies. */
|
yann@402
|
2812 |
+
|
yann@402
|
2813 |
+ cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size;
|
yann@402
|
2814 |
+
|
yann@402
|
2815 |
+ return FFI_OK;
|
yann@402
|
2816 |
+}
|
yann@402
|
2817 |
+
|
yann@402
|
2818 |
+/*======================== End of Routine ============================*/
|
yann@402
|
2819 |
+
|
yann@402
|
2820 |
+/*====================================================================*/
|
yann@402
|
2821 |
+/* */
|
yann@402
|
2822 |
+/* Name - ffi_call. */
|
yann@402
|
2823 |
+/* */
|
yann@402
|
2824 |
+/* Function - Call the FFI routine. */
|
yann@402
|
2825 |
+/* */
|
yann@402
|
2826 |
+/*====================================================================*/
|
yann@402
|
2827 |
+
|
yann@402
|
2828 |
+void
|
yann@402
|
2829 |
+ffi_call(ffi_cif *cif,
|
yann@402
|
2830 |
+ void (*fn)(),
|
yann@402
|
2831 |
+ void *rvalue,
|
yann@402
|
2832 |
+ void **avalue)
|
yann@402
|
2833 |
+{
|
yann@402
|
2834 |
+ int ret_type = cif->flags;
|
yann@402
|
2835 |
+ extended_cif ecif;
|
yann@402
|
2836 |
+
|
yann@402
|
2837 |
+ ecif.cif = cif;
|
yann@402
|
2838 |
+ ecif.avalue = avalue;
|
yann@402
|
2839 |
+ ecif.rvalue = rvalue;
|
yann@402
|
2840 |
+
|
yann@402
|
2841 |
+ /* If we don't have a return value, we need to fake one. */
|
yann@402
|
2842 |
+ if (rvalue == NULL)
|
yann@402
|
2843 |
+ {
|
yann@402
|
2844 |
+ if (ret_type == FFI390_RET_STRUCT)
|
yann@402
|
2845 |
+ ecif.rvalue = alloca (cif->rtype->size);
|
yann@402
|
2846 |
+ else
|
yann@402
|
2847 |
+ ret_type = FFI390_RET_VOID;
|
yann@402
|
2848 |
+ }
|
yann@402
|
2849 |
+
|
yann@402
|
2850 |
+ switch (cif->abi)
|
yann@402
|
2851 |
+ {
|
yann@402
|
2852 |
+ case FFI_SYSV:
|
yann@402
|
2853 |
+ ffi_call_SYSV (cif->bytes, &ecif, ffi_prep_args,
|
yann@402
|
2854 |
+ ret_type, ecif.rvalue, fn);
|
yann@402
|
2855 |
+ break;
|
yann@402
|
2856 |
+
|
yann@402
|
2857 |
+ default:
|
yann@402
|
2858 |
+ FFI_ASSERT (0);
|
yann@402
|
2859 |
+ break;
|
yann@402
|
2860 |
+ }
|
yann@402
|
2861 |
+}
|
yann@402
|
2862 |
+
|
yann@402
|
2863 |
+/*======================== End of Routine ============================*/
|
yann@402
|
2864 |
+
|
yann@402
|
2865 |
+/*====================================================================*/
|
yann@402
|
2866 |
+/* */
|
yann@402
|
2867 |
+/* Name - ffi_closure_helper_SYSV. */
|
yann@402
|
2868 |
+/* */
|
yann@402
|
2869 |
+/* Function - Call a FFI closure target function. */
|
yann@402
|
2870 |
+/* */
|
yann@402
|
2871 |
+/*====================================================================*/
|
yann@402
|
2872 |
+
|
yann@402
|
2873 |
+void
|
yann@402
|
2874 |
+ffi_closure_helper_SYSV (ffi_closure *closure,
|
yann@402
|
2875 |
+ unsigned long *p_gpr,
|
yann@402
|
2876 |
+ unsigned long long *p_fpr,
|
yann@402
|
2877 |
+ unsigned long *p_ov)
|
yann@402
|
2878 |
+{
|
yann@402
|
2879 |
+ unsigned long long ret_buffer;
|
yann@402
|
2880 |
+
|
yann@402
|
2881 |
+ void *rvalue = &ret_buffer;
|
yann@402
|
2882 |
+ void **avalue;
|
yann@402
|
2883 |
+ void **p_arg;
|
yann@402
|
2884 |
+
|
yann@402
|
2885 |
+ int n_gpr = 0;
|
yann@402
|
2886 |
+ int n_fpr = 0;
|
yann@402
|
2887 |
+ int n_ov = 0;
|
yann@402
|
2888 |
+
|
yann@402
|
2889 |
+ ffi_type **ptr;
|
yann@402
|
2890 |
+ int i;
|
yann@402
|
2891 |
+
|
yann@402
|
2892 |
+ /* Allocate buffer for argument list pointers. */
|
yann@402
|
2893 |
+
|
yann@402
|
2894 |
+ p_arg = avalue = alloca (closure->cif->nargs * sizeof (void *));
|
yann@402
|
2895 |
+
|
yann@402
|
2896 |
+ /* If we returning a structure, pass the structure address
|
yann@402
|
2897 |
+ directly to the target function. Otherwise, have the target
|
yann@402
|
2898 |
+ function store the return value to the GPR save area. */
|
yann@402
|
2899 |
+
|
yann@402
|
2900 |
+ if (closure->cif->flags == FFI390_RET_STRUCT)
|
yann@402
|
2901 |
+ rvalue = (void *) p_gpr[n_gpr++];
|
yann@402
|
2902 |
+
|
yann@402
|
2903 |
+ /* Now for the arguments. */
|
yann@402
|
2904 |
+
|
yann@402
|
2905 |
+ for (ptr = closure->cif->arg_types, i = closure->cif->nargs;
|
yann@402
|
2906 |
+ i > 0;
|
yann@402
|
2907 |
+ i--, p_arg++, ptr++)
|
yann@402
|
2908 |
+ {
|
yann@402
|
2909 |
+ int deref_struct_pointer = 0;
|
yann@402
|
2910 |
+ int type = (*ptr)->type;
|
yann@402
|
2911 |
+
|
yann@402
|
2912 |
+ /* Check how a structure type is passed. */
|
yann@402
|
2913 |
+ if (type == FFI_TYPE_STRUCT)
|
yann@402
|
2914 |
+ {
|
yann@402
|
2915 |
+ type = ffi_check_struct_type (*ptr);
|
yann@402
|
2916 |
+
|
yann@402
|
2917 |
+ /* If we pass the struct via pointer, remember to
|
yann@402
|
2918 |
+ retrieve the pointer later. */
|
yann@402
|
2919 |
+ if (type == FFI_TYPE_POINTER)
|
yann@402
|
2920 |
+ deref_struct_pointer = 1;
|
yann@402
|
2921 |
+ }
|
yann@402
|
2922 |
+
|
yann@402
|
2923 |
+ /* Pointers are passed like UINTs of the same size. */
|
yann@402
|
2924 |
+ if (type == FFI_TYPE_POINTER)
|
yann@402
|
2925 |
+#ifdef __s390x__
|
yann@402
|
2926 |
+ type = FFI_TYPE_UINT64;
|
yann@402
|
2927 |
+#else
|
yann@402
|
2928 |
+ type = FFI_TYPE_UINT32;
|
yann@402
|
2929 |
+#endif
|
yann@402
|
2930 |
+
|
yann@402
|
2931 |
+ /* Now handle all primitive int/float data types. */
|
yann@402
|
2932 |
+ switch (type)
|
yann@402
|
2933 |
+ {
|
yann@402
|
2934 |
+ case FFI_TYPE_DOUBLE:
|
yann@402
|
2935 |
+ if (n_fpr < MAX_FPRARGS)
|
yann@402
|
2936 |
+ *p_arg = &p_fpr[n_fpr++];
|
yann@402
|
2937 |
+ else
|
yann@402
|
2938 |
+ *p_arg = &p_ov[n_ov],
|
yann@402
|
2939 |
+ n_ov += sizeof (double) / sizeof (long);
|
yann@402
|
2940 |
+ break;
|
yann@402
|
2941 |
+
|
yann@402
|
2942 |
+ case FFI_TYPE_FLOAT:
|
yann@402
|
2943 |
+ if (n_fpr < MAX_FPRARGS)
|
yann@402
|
2944 |
+ *p_arg = &p_fpr[n_fpr++];
|
yann@402
|
2945 |
+ else
|
yann@402
|
2946 |
+ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
|
yann@402
|
2947 |
+ break;
|
yann@402
|
2948 |
+
|
yann@402
|
2949 |
+ case FFI_TYPE_UINT64:
|
yann@402
|
2950 |
+ case FFI_TYPE_SINT64:
|
yann@402
|
2951 |
+#ifdef __s390x__
|
yann@402
|
2952 |
+ if (n_gpr < MAX_GPRARGS)
|
yann@402
|
2953 |
+ *p_arg = &p_gpr[n_gpr++];
|
yann@402
|
2954 |
+ else
|
yann@402
|
2955 |
+ *p_arg = &p_ov[n_ov++];
|
yann@402
|
2956 |
+#else
|
yann@402
|
2957 |
+ if (n_gpr == MAX_GPRARGS-1)
|
yann@402
|
2958 |
+ n_gpr = MAX_GPRARGS;
|
yann@402
|
2959 |
+ if (n_gpr < MAX_GPRARGS)
|
yann@402
|
2960 |
+ *p_arg = &p_gpr[n_gpr], n_gpr += 2;
|
yann@402
|
2961 |
+ else
|
yann@402
|
2962 |
+ *p_arg = &p_ov[n_ov], n_ov += 2;
|
yann@402
|
2963 |
+#endif
|
yann@402
|
2964 |
+ break;
|
yann@402
|
2965 |
+
|
yann@402
|
2966 |
+ case FFI_TYPE_INT:
|
yann@402
|
2967 |
+ case FFI_TYPE_UINT32:
|
yann@402
|
2968 |
+ case FFI_TYPE_SINT32:
|
yann@402
|
2969 |
+ if (n_gpr < MAX_GPRARGS)
|
yann@402
|
2970 |
+ *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4;
|
yann@402
|
2971 |
+ else
|
yann@402
|
2972 |
+ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4;
|
yann@402
|
2973 |
+ break;
|
yann@402
|
2974 |
+
|
yann@402
|
2975 |
+ case FFI_TYPE_UINT16:
|
yann@402
|
2976 |
+ case FFI_TYPE_SINT16:
|
yann@402
|
2977 |
+ if (n_gpr < MAX_GPRARGS)
|
yann@402
|
2978 |
+ *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2;
|
yann@402
|
2979 |
+ else
|
yann@402
|
2980 |
+ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2;
|
yann@402
|
2981 |
+ break;
|
yann@402
|
2982 |
+
|
yann@402
|
2983 |
+ case FFI_TYPE_UINT8:
|
yann@402
|
2984 |
+ case FFI_TYPE_SINT8:
|
yann@402
|
2985 |
+ if (n_gpr < MAX_GPRARGS)
|
yann@402
|
2986 |
+ *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1;
|
yann@402
|
2987 |
+ else
|
yann@402
|
2988 |
+ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1;
|
yann@402
|
2989 |
+ break;
|
yann@402
|
2990 |
+
|
yann@402
|
2991 |
+ default:
|
yann@402
|
2992 |
+ FFI_ASSERT (0);
|
yann@402
|
2993 |
+ break;
|
yann@402
|
2994 |
+ }
|
yann@402
|
2995 |
+
|
yann@402
|
2996 |
+ /* If this is a struct passed via pointer, we need to
|
yann@402
|
2997 |
+ actually retrieve that pointer. */
|
yann@402
|
2998 |
+ if (deref_struct_pointer)
|
yann@402
|
2999 |
+ *p_arg = *(void **)*p_arg;
|
yann@402
|
3000 |
+ }
|
yann@402
|
3001 |
+
|
yann@402
|
3002 |
+
|
yann@402
|
3003 |
+ /* Call the target function. */
|
yann@402
|
3004 |
+ (closure->fun) (closure->cif, rvalue, avalue, closure->user_data);
|
yann@402
|
3005 |
+
|
yann@402
|
3006 |
+ /* Convert the return value. */
|
yann@402
|
3007 |
+ switch (closure->cif->rtype->type)
|
yann@402
|
3008 |
+ {
|
yann@402
|
3009 |
+ /* Void is easy, and so is struct. */
|
yann@402
|
3010 |
+ case FFI_TYPE_VOID:
|
yann@402
|
3011 |
+ case FFI_TYPE_STRUCT:
|
yann@402
|
3012 |
+ break;
|
yann@402
|
3013 |
+
|
yann@402
|
3014 |
+ /* Floating point values are returned in fpr 0. */
|
yann@402
|
3015 |
+ case FFI_TYPE_FLOAT:
|
yann@402
|
3016 |
+ p_fpr[0] = (long long) *(unsigned int *) rvalue << 32;
|
yann@402
|
3017 |
+ break;
|
yann@402
|
3018 |
+
|
yann@402
|
3019 |
+ case FFI_TYPE_DOUBLE:
|
yann@402
|
3020 |
+ p_fpr[0] = *(unsigned long long *) rvalue;
|
yann@402
|
3021 |
+ break;
|
yann@402
|
3022 |
+
|
yann@402
|
3023 |
+ /* Integer values are returned in gpr 2 (and gpr 3
|
yann@402
|
3024 |
+ for 64-bit values on 31-bit machines). */
|
yann@402
|
3025 |
+ case FFI_TYPE_UINT64:
|
yann@402
|
3026 |
+ case FFI_TYPE_SINT64:
|
yann@402
|
3027 |
+#ifdef __s390x__
|
yann@402
|
3028 |
+ p_gpr[0] = *(unsigned long *) rvalue;
|
yann@402
|
3029 |
+#else
|
yann@402
|
3030 |
+ p_gpr[0] = ((unsigned long *) rvalue)[0],
|
yann@402
|
3031 |
+ p_gpr[1] = ((unsigned long *) rvalue)[1];
|
yann@402
|
3032 |
+#endif
|
yann@402
|
3033 |
+ break;
|
yann@402
|
3034 |
+
|
yann@402
|
3035 |
+ case FFI_TYPE_POINTER:
|
yann@402
|
3036 |
+ case FFI_TYPE_UINT32:
|
yann@402
|
3037 |
+ case FFI_TYPE_UINT16:
|
yann@402
|
3038 |
+ case FFI_TYPE_UINT8:
|
yann@402
|
3039 |
+ p_gpr[0] = *(unsigned long *) rvalue;
|
yann@402
|
3040 |
+ break;
|
yann@402
|
3041 |
+
|
yann@402
|
3042 |
+ case FFI_TYPE_INT:
|
yann@402
|
3043 |
+ case FFI_TYPE_SINT32:
|
yann@402
|
3044 |
+ case FFI_TYPE_SINT16:
|
yann@402
|
3045 |
+ case FFI_TYPE_SINT8:
|
yann@402
|
3046 |
+ p_gpr[0] = *(signed long *) rvalue;
|
yann@402
|
3047 |
+ break;
|
yann@402
|
3048 |
+
|
yann@402
|
3049 |
+ default:
|
yann@402
|
3050 |
+ FFI_ASSERT (0);
|
yann@402
|
3051 |
+ break;
|
yann@402
|
3052 |
+ }
|
yann@402
|
3053 |
+}
|
yann@402
|
3054 |
+
|
yann@402
|
3055 |
+/*======================== End of Routine ============================*/
|
yann@402
|
3056 |
+
|
yann@402
|
3057 |
+/*====================================================================*/
|
yann@402
|
3058 |
+/* */
|
yann@402
|
3059 |
+/* Name - ffi_prep_closure. */
|
yann@402
|
3060 |
+/* */
|
yann@402
|
3061 |
+/* Function - Prepare a FFI closure. */
|
yann@402
|
3062 |
+/* */
|
yann@402
|
3063 |
+/*====================================================================*/
|
yann@402
|
3064 |
+
|
yann@402
|
3065 |
+ffi_status
|
yann@402
|
3066 |
+ffi_prep_closure (ffi_closure *closure,
|
yann@402
|
3067 |
+ ffi_cif *cif,
|
yann@402
|
3068 |
+ void (*fun) (ffi_cif *, void *, void **, void *),
|
yann@402
|
3069 |
+ void *user_data)
|
yann@402
|
3070 |
+{
|
yann@402
|
3071 |
+ FFI_ASSERT (cif->abi == FFI_SYSV);
|
yann@402
|
3072 |
+
|
yann@402
|
3073 |
+#ifndef __s390x__
|
yann@402
|
3074 |
+ *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */
|
yann@402
|
3075 |
+ *(short *)&closure->tramp [2] = 0x9801; /* lm %r0,%r1,6(%r1) */
|
yann@402
|
3076 |
+ *(short *)&closure->tramp [4] = 0x1006;
|
yann@402
|
3077 |
+ *(short *)&closure->tramp [6] = 0x07f1; /* br %r1 */
|
yann@402
|
3078 |
+ *(long *)&closure->tramp [8] = (long)closure;
|
yann@402
|
3079 |
+ *(long *)&closure->tramp[12] = (long)&ffi_closure_SYSV;
|
yann@402
|
3080 |
+#else
|
yann@402
|
3081 |
+ *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */
|
yann@402
|
3082 |
+ *(short *)&closure->tramp [2] = 0xeb01; /* lmg %r0,%r1,14(%r1) */
|
yann@402
|
3083 |
+ *(short *)&closure->tramp [4] = 0x100e;
|
yann@402
|
3084 |
+ *(short *)&closure->tramp [6] = 0x0004;
|
yann@402
|
3085 |
+ *(short *)&closure->tramp [8] = 0x07f1; /* br %r1 */
|
yann@402
|
3086 |
+ *(long *)&closure->tramp[16] = (long)closure;
|
yann@402
|
3087 |
+ *(long *)&closure->tramp[24] = (long)&ffi_closure_SYSV;
|
yann@402
|
3088 |
+#endif
|
yann@402
|
3089 |
+
|
yann@402
|
3090 |
+ closure->cif = cif;
|
yann@402
|
3091 |
+ closure->user_data = user_data;
|
yann@402
|
3092 |
+ closure->fun = fun;
|
yann@402
|
3093 |
+
|
yann@402
|
3094 |
+ return FFI_OK;
|
yann@402
|
3095 |
+}
|
yann@402
|
3096 |
+
|
yann@402
|
3097 |
+/*======================== End of Routine ============================*/
|
yann@402
|
3098 |
+
|
yann@402
|
3099 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/sysv.S gcc/libffi/src/s390/sysv.S
|
yann@402
|
3100 |
--- gcc-3.2.2.orig/libffi/src/s390/sysv.S Thu Jan 1 09:00:00 1970
|
yann@402
|
3101 |
+++ gcc/libffi/src/s390/sysv.S Thu Nov 28 01:44:35 2002
|
yann@402
|
3102 |
@@ -0,0 +1,425 @@
|
yann@402
|
3103 |
+/* -----------------------------------------------------------------------
|
yann@402
|
3104 |
+ sysv.S - Copyright (c) 2000 Software AG
|
yann@402
|
3105 |
+
|
yann@402
|
3106 |
+ S390 Foreign Function Interface
|
yann@402
|
3107 |
+
|
yann@402
|
3108 |
+ Permission is hereby granted, free of charge, to any person obtaining
|
yann@402
|
3109 |
+ a copy of this software and associated documentation files (the
|
yann@402
|
3110 |
+ ``Software''), to deal in the Software without restriction, including
|
yann@402
|
3111 |
+ without limitation the rights to use, copy, modify, merge, publish,
|
yann@402
|
3112 |
+ distribute, sublicense, and/or sell copies of the Software, and to
|
yann@402
|
3113 |
+ permit persons to whom the Software is furnished to do so, subject to
|
yann@402
|
3114 |
+ the following conditions:
|
yann@402
|
3115 |
+
|
yann@402
|
3116 |
+ The above copyright notice and this permission notice shall be included
|
yann@402
|
3117 |
+ in all copies or substantial portions of the Software.
|
yann@402
|
3118 |
+
|
yann@402
|
3119 |
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
yann@402
|
3120 |
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
yann@402
|
3121 |
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
yann@402
|
3122 |
+ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
yann@402
|
3123 |
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
yann@402
|
3124 |
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
yann@402
|
3125 |
+ OTHER DEALINGS IN THE SOFTWARE.
|
yann@402
|
3126 |
+ ----------------------------------------------------------------------- */
|
yann@402
|
3127 |
+
|
yann@402
|
3128 |
+#ifndef __s390x__
|
yann@402
|
3129 |
+
|
yann@402
|
3130 |
+.text
|
yann@402
|
3131 |
+
|
yann@402
|
3132 |
+ # r2: cif->bytes
|
yann@402
|
3133 |
+ # r3: &ecif
|
yann@402
|
3134 |
+ # r4: ffi_prep_args
|
yann@402
|
3135 |
+ # r5: ret_type
|
yann@402
|
3136 |
+ # r6: ecif.rvalue
|
yann@402
|
3137 |
+ # ov: fn
|
yann@402
|
3138 |
+
|
yann@402
|
3139 |
+ # This assumes we are using gas.
|
yann@402
|
3140 |
+ .globl ffi_call_SYSV
|
yann@402
|
3141 |
+ .type ffi_call_SYSV,%function
|
yann@402
|
3142 |
+ffi_call_SYSV:
|
yann@402
|
3143 |
+.LFB1:
|
yann@402
|
3144 |
+ stm %r6,%r15,24(%r15) # Save registers
|
yann@402
|
3145 |
+.LCFI0:
|
yann@402
|
3146 |
+ basr %r13,0 # Set up base register
|
yann@402
|
3147 |
+.Lbase:
|
yann@402
|
3148 |
+ lr %r11,%r15 # Set up frame pointer
|
yann@402
|
3149 |
+.LCFI1:
|
yann@402
|
3150 |
+ sr %r15,%r2
|
yann@402
|
3151 |
+ ahi %r15,-96-48 # Allocate stack
|
yann@402
|
3152 |
+ lr %r8,%r6 # Save ecif.rvalue
|
yann@402
|
3153 |
+ sr %r9,%r9
|
yann@402
|
3154 |
+ ic %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address
|
yann@402
|
3155 |
+ l %r7,96(%r11) # Load function address
|
yann@402
|
3156 |
+ st %r11,0(%r15) # Set up back chain
|
yann@402
|
3157 |
+ ahi %r11,-48 # Register save area
|
yann@402
|
3158 |
+.LCFI2:
|
yann@402
|
3159 |
+
|
yann@402
|
3160 |
+ la %r2,96(%r15) # Save area
|
yann@402
|
3161 |
+ # r3 already holds &ecif
|
yann@402
|
3162 |
+ basr %r14,%r4 # Call ffi_prep_args
|
yann@402
|
3163 |
+
|
yann@402
|
3164 |
+ lm %r2,%r6,0(%r11) # Load arguments
|
yann@402
|
3165 |
+ ld %f0,32(%r11)
|
yann@402
|
3166 |
+ ld %f2,40(%r11)
|
yann@402
|
3167 |
+ la %r14,0(%r13,%r9) # Set return address
|
yann@402
|
3168 |
+ br %r7 # ... and call function
|
yann@402
|
3169 |
+
|
yann@402
|
3170 |
+.LretNone: # Return void
|
yann@402
|
3171 |
+ l %r4,48+56(%r11)
|
yann@402
|
3172 |
+ lm %r6,%r15,48+24(%r11)
|
yann@402
|
3173 |
+ br %r4
|
yann@402
|
3174 |
+
|
yann@402
|
3175 |
+.LretFloat:
|
yann@402
|
3176 |
+ l %r4,48+56(%r11)
|
yann@402
|
3177 |
+ ste %f0,0(%r8) # Return float
|
yann@402
|
3178 |
+ lm %r6,%r15,48+24(%r11)
|
yann@402
|
3179 |
+ br %r4
|
yann@402
|
3180 |
+
|
yann@402
|
3181 |
+.LretDouble:
|
yann@402
|
3182 |
+ l %r4,48+56(%r11)
|
yann@402
|
3183 |
+ std %f0,0(%r8) # Return double
|
yann@402
|
3184 |
+ lm %r6,%r15,48+24(%r11)
|
yann@402
|
3185 |
+ br %r4
|
yann@402
|
3186 |
+
|
yann@402
|
3187 |
+.LretInt32:
|
yann@402
|
3188 |
+ l %r4,48+56(%r11)
|
yann@402
|
3189 |
+ st %r2,0(%r8) # Return int
|
yann@402
|
3190 |
+ lm %r6,%r15,48+24(%r11)
|
yann@402
|
3191 |
+ br %r4
|
yann@402
|
3192 |
+
|
yann@402
|
3193 |
+.LretInt64:
|
yann@402
|
3194 |
+ l %r4,48+56(%r11)
|
yann@402
|
3195 |
+ stm %r2,%r3,0(%r8) # Return long long
|
yann@402
|
3196 |
+ lm %r6,%r15,48+24(%r11)
|
yann@402
|
3197 |
+ br %r4
|
yann@402
|
3198 |
+
|
yann@402
|
3199 |
+.Ltable:
|
yann@402
|
3200 |
+ .byte .LretNone-.Lbase # FFI390_RET_VOID
|
yann@402
|
3201 |
+ .byte .LretNone-.Lbase # FFI390_RET_STRUCT
|
yann@402
|
3202 |
+ .byte .LretFloat-.Lbase # FFI390_RET_FLOAT
|
yann@402
|
3203 |
+ .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE
|
yann@402
|
3204 |
+ .byte .LretInt32-.Lbase # FFI390_RET_INT32
|
yann@402
|
3205 |
+ .byte .LretInt64-.Lbase # FFI390_RET_INT64
|
yann@402
|
3206 |
+
|
yann@402
|
3207 |
+.LFE1:
|
yann@402
|
3208 |
+.ffi_call_SYSV_end:
|
yann@402
|
3209 |
+ .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
|
yann@402
|
3210 |
+
|
yann@402
|
3211 |
+
|
yann@402
|
3212 |
+ .globl ffi_closure_SYSV
|
yann@402
|
3213 |
+ .type ffi_closure_SYSV,%function
|
yann@402
|
3214 |
+ffi_closure_SYSV:
|
yann@402
|
3215 |
+.LFB2:
|
yann@402
|
3216 |
+ stm %r12,%r15,48(%r15) # Save registers
|
yann@402
|
3217 |
+.LCFI10:
|
yann@402
|
3218 |
+ basr %r13,0 # Set up base register
|
yann@402
|
3219 |
+.Lcbase:
|
yann@402
|
3220 |
+ stm %r2,%r6,8(%r15) # Save arguments
|
yann@402
|
3221 |
+ std %f0,64(%r15)
|
yann@402
|
3222 |
+ std %f2,72(%r15)
|
yann@402
|
3223 |
+ lr %r1,%r15 # Set up stack frame
|
yann@402
|
3224 |
+ ahi %r15,-96
|
yann@402
|
3225 |
+.LCFI11:
|
yann@402
|
3226 |
+ l %r12,.Lchelper-.Lcbase(%r13) # Get helper function
|
yann@402
|
3227 |
+ lr %r2,%r0 # Closure
|
yann@402
|
3228 |
+ la %r3,8(%r1) # GPRs
|
yann@402
|
3229 |
+ la %r4,64(%r1) # FPRs
|
yann@402
|
3230 |
+ la %r5,96(%r1) # Overflow
|
yann@402
|
3231 |
+ st %r1,0(%r15) # Set up back chain
|
yann@402
|
3232 |
+
|
yann@402
|
3233 |
+ bas %r14,0(%r12,%r13) # Call helper
|
yann@402
|
3234 |
+
|
yann@402
|
3235 |
+ l %r4,96+56(%r15)
|
yann@402
|
3236 |
+ ld %f0,96+64(%r15) # Load return registers
|
yann@402
|
3237 |
+ lm %r2,%r3,96+8(%r15)
|
yann@402
|
3238 |
+ lm %r12,%r15,96+48(%r15)
|
yann@402
|
3239 |
+ br %r4
|
yann@402
|
3240 |
+
|
yann@402
|
3241 |
+ .align 4
|
yann@402
|
3242 |
+.Lchelper:
|
yann@402
|
3243 |
+ .long ffi_closure_helper_SYSV-.Lcbase
|
yann@402
|
3244 |
+
|
yann@402
|
3245 |
+.LFE2:
|
yann@402
|
3246 |
+
|
yann@402
|
3247 |
+.ffi_closure_SYSV_end:
|
yann@402
|
3248 |
+ .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
|
yann@402
|
3249 |
+
|
yann@402
|
3250 |
+
|
yann@402
|
3251 |
+ .section .eh_frame,"a",@progbits
|
yann@402
|
3252 |
+.Lframe1:
|
yann@402
|
3253 |
+ .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry
|
yann@402
|
3254 |
+.LSCIE1:
|
yann@402
|
3255 |
+ .4byte 0x0 # CIE Identifier Tag
|
yann@402
|
3256 |
+ .byte 0x1 # CIE Version
|
yann@402
|
3257 |
+ .ascii "zR\0" # CIE Augmentation
|
yann@402
|
3258 |
+ .uleb128 0x1 # CIE Code Alignment Factor
|
yann@402
|
3259 |
+ .sleb128 -4 # CIE Data Alignment Factor
|
yann@402
|
3260 |
+ .byte 0xe # CIE RA Column
|
yann@402
|
3261 |
+ .uleb128 0x1 # Augmentation size
|
yann@402
|
3262 |
+ .byte 0x1b # FDE Encoding (pcrel sdata4)
|
yann@402
|
3263 |
+ .byte 0xc # DW_CFA_def_cfa
|
yann@402
|
3264 |
+ .uleb128 0xf
|
yann@402
|
3265 |
+ .uleb128 0x60
|
yann@402
|
3266 |
+ .align 4
|
yann@402
|
3267 |
+.LECIE1:
|
yann@402
|
3268 |
+.LSFDE1:
|
yann@402
|
3269 |
+ .4byte .LEFDE1-.LASFDE1 # FDE Length
|
yann@402
|
3270 |
+.LASFDE1:
|
yann@402
|
3271 |
+ .4byte .LASFDE1-.Lframe1 # FDE CIE offset
|
yann@402
|
3272 |
+ .4byte .LFB1-. # FDE initial location
|
yann@402
|
3273 |
+ .4byte .LFE1-.LFB1 # FDE address range
|
yann@402
|
3274 |
+ .uleb128 0x0 # Augmentation size
|
yann@402
|
3275 |
+ .byte 0x4 # DW_CFA_advance_loc4
|
yann@402
|
3276 |
+ .4byte .LCFI0-.LFB1
|
yann@402
|
3277 |
+ .byte 0x8f # DW_CFA_offset, column 0xf
|
yann@402
|
3278 |
+ .uleb128 0x9
|
yann@402
|
3279 |
+ .byte 0x8e # DW_CFA_offset, column 0xe
|
yann@402
|
3280 |
+ .uleb128 0xa
|
yann@402
|
3281 |
+ .byte 0x8d # DW_CFA_offset, column 0xd
|
yann@402
|
3282 |
+ .uleb128 0xb
|
yann@402
|
3283 |
+ .byte 0x8c # DW_CFA_offset, column 0xc
|
yann@402
|
3284 |
+ .uleb128 0xc
|
yann@402
|
3285 |
+ .byte 0x8b # DW_CFA_offset, column 0xb
|
yann@402
|
3286 |
+ .uleb128 0xd
|
yann@402
|
3287 |
+ .byte 0x8a # DW_CFA_offset, column 0xa
|
yann@402
|
3288 |
+ .uleb128 0xe
|
yann@402
|
3289 |
+ .byte 0x89 # DW_CFA_offset, column 0x9
|
yann@402
|
3290 |
+ .uleb128 0xf
|
yann@402
|
3291 |
+ .byte 0x88 # DW_CFA_offset, column 0x8
|
yann@402
|
3292 |
+ .uleb128 0x10
|
yann@402
|
3293 |
+ .byte 0x87 # DW_CFA_offset, column 0x7
|
yann@402
|
3294 |
+ .uleb128 0x11
|
yann@402
|
3295 |
+ .byte 0x86 # DW_CFA_offset, column 0x6
|
yann@402
|
3296 |
+ .uleb128 0x12
|
yann@402
|
3297 |
+ .byte 0x4 # DW_CFA_advance_loc4
|
yann@402
|
3298 |
+ .4byte .LCFI1-.LCFI0
|
yann@402
|
3299 |
+ .byte 0xd # DW_CFA_def_cfa_register
|
yann@402
|
3300 |
+ .uleb128 0xb
|
yann@402
|
3301 |
+ .byte 0x4 # DW_CFA_advance_loc4
|
yann@402
|
3302 |
+ .4byte .LCFI2-.LCFI1
|
yann@402
|
3303 |
+ .byte 0xe # DW_CFA_def_cfa_offset
|
yann@402
|
3304 |
+ .uleb128 0x90
|
yann@402
|
3305 |
+ .align 4
|
yann@402
|
3306 |
+.LEFDE1:
|
yann@402
|
3307 |
+.LSFDE2:
|
yann@402
|
3308 |
+ .4byte .LEFDE2-.LASFDE2 # FDE Length
|
yann@402
|
3309 |
+.LASFDE2:
|
yann@402
|
3310 |
+ .4byte .LASFDE2-.Lframe1 # FDE CIE offset
|
yann@402
|
3311 |
+ .4byte .LFB2-. # FDE initial location
|
yann@402
|
3312 |
+ .4byte .LFE2-.LFB2 # FDE address range
|
yann@402
|
3313 |
+ .uleb128 0x0 # Augmentation size
|
yann@402
|
3314 |
+ .byte 0x4 # DW_CFA_advance_loc4
|
yann@402
|
3315 |
+ .4byte .LCFI10-.LFB2
|
yann@402
|
3316 |
+ .byte 0x8f # DW_CFA_offset, column 0xf
|
yann@402
|
3317 |
+ .uleb128 0x9
|
yann@402
|
3318 |
+ .byte 0x8e # DW_CFA_offset, column 0xe
|
yann@402
|
3319 |
+ .uleb128 0xa
|
yann@402
|
3320 |
+ .byte 0x8d # DW_CFA_offset, column 0xd
|
yann@402
|
3321 |
+ .uleb128 0xb
|
yann@402
|
3322 |
+ .byte 0x8c # DW_CFA_offset, column 0xc
|
yann@402
|
3323 |
+ .uleb128 0xc
|
yann@402
|
3324 |
+ .byte 0x4 # DW_CFA_advance_loc4
|
yann@402
|
3325 |
+ .4byte .LCFI11-.LCFI10
|
yann@402
|
3326 |
+ .byte 0xe # DW_CFA_def_cfa_offset
|
yann@402
|
3327 |
+ .uleb128 0xc0
|
yann@402
|
3328 |
+ .align 4
|
yann@402
|
3329 |
+.LEFDE2:
|
yann@402
|
3330 |
+
|
yann@402
|
3331 |
+#else
|
yann@402
|
3332 |
+
|
yann@402
|
3333 |
+.text
|
yann@402
|
3334 |
+
|
yann@402
|
3335 |
+ # r2: cif->bytes
|
yann@402
|
3336 |
+ # r3: &ecif
|
yann@402
|
3337 |
+ # r4: ffi_prep_args
|
yann@402
|
3338 |
+ # r5: ret_type
|
yann@402
|
3339 |
+ # r6: ecif.rvalue
|
yann@402
|
3340 |
+ # ov: fn
|
yann@402
|
3341 |
+
|
yann@402
|
3342 |
+ # This assumes we are using gas.
|
yann@402
|
3343 |
+ .globl ffi_call_SYSV
|
yann@402
|
3344 |
+ .type ffi_call_SYSV,%function
|
yann@402
|
3345 |
+ffi_call_SYSV:
|
yann@402
|
3346 |
+.LFB1:
|
yann@402
|
3347 |
+ stmg %r6,%r15,48(%r15) # Save registers
|
yann@402
|
3348 |
+.LCFI0:
|
yann@402
|
3349 |
+ larl %r13,.Lbase # Set up base register
|
yann@402
|
3350 |
+ lgr %r11,%r15 # Set up frame pointer
|
yann@402
|
3351 |
+.LCFI1:
|
yann@402
|
3352 |
+ sgr %r15,%r2
|
yann@402
|
3353 |
+ aghi %r15,-160-80 # Allocate stack
|
yann@402
|
3354 |
+ lgr %r8,%r6 # Save ecif.rvalue
|
yann@402
|
3355 |
+ llgc %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address
|
yann@402
|
3356 |
+ lg %r7,160(%r11) # Load function address
|
yann@402
|
3357 |
+ stg %r11,0(%r15) # Set up back chain
|
yann@402
|
3358 |
+ aghi %r11,-80 # Register save area
|
yann@402
|
3359 |
+.LCFI2:
|
yann@402
|
3360 |
+
|
yann@402
|
3361 |
+ la %r2,160(%r15) # Save area
|
yann@402
|
3362 |
+ # r3 already holds &ecif
|
yann@402
|
3363 |
+ basr %r14,%r4 # Call ffi_prep_args
|
yann@402
|
3364 |
+
|
yann@402
|
3365 |
+ lmg %r2,%r6,0(%r11) # Load arguments
|
yann@402
|
3366 |
+ ld %f0,48(%r11)
|
yann@402
|
3367 |
+ ld %f2,56(%r11)
|
yann@402
|
3368 |
+ ld %f4,64(%r11)
|
yann@402
|
3369 |
+ ld %f6,72(%r11)
|
yann@402
|
3370 |
+ la %r14,0(%r13,%r9) # Set return address
|
yann@402
|
3371 |
+ br %r7 # ... and call function
|
yann@402
|
3372 |
+
|
yann@402
|
3373 |
+.Lbase:
|
yann@402
|
3374 |
+.LretNone: # Return void
|
yann@402
|
3375 |
+ lg %r4,80+112(%r11)
|
yann@402
|
3376 |
+ lmg %r6,%r15,80+48(%r11)
|
yann@402
|
3377 |
+ br %r4
|
yann@402
|
3378 |
+
|
yann@402
|
3379 |
+.LretFloat:
|
yann@402
|
3380 |
+ lg %r4,80+112(%r11)
|
yann@402
|
3381 |
+ ste %f0,0(%r8) # Return float
|
yann@402
|
3382 |
+ lmg %r6,%r15,80+48(%r11)
|
yann@402
|
3383 |
+ br %r4
|
yann@402
|
3384 |
+
|
yann@402
|
3385 |
+.LretDouble:
|
yann@402
|
3386 |
+ lg %r4,80+112(%r11)
|
yann@402
|
3387 |
+ std %f0,0(%r8) # Return double
|
yann@402
|
3388 |
+ lmg %r6,%r15,80+48(%r11)
|
yann@402
|
3389 |
+ br %r4
|
yann@402
|
3390 |
+
|
yann@402
|
3391 |
+.LretInt32:
|
yann@402
|
3392 |
+ lg %r4,80+112(%r11)
|
yann@402
|
3393 |
+ st %r2,0(%r8) # Return int
|
yann@402
|
3394 |
+ lmg %r6,%r15,80+48(%r11)
|
yann@402
|
3395 |
+ br %r4
|
yann@402
|
3396 |
+
|
yann@402
|
3397 |
+.LretInt64:
|
yann@402
|
3398 |
+ lg %r4,80+112(%r11)
|
yann@402
|
3399 |
+ stg %r2,0(%r8) # Return long
|
yann@402
|
3400 |
+ lmg %r6,%r15,80+48(%r11)
|
yann@402
|
3401 |
+ br %r4
|
yann@402
|
3402 |
+
|
yann@402
|
3403 |
+.Ltable:
|
yann@402
|
3404 |
+ .byte .LretNone-.Lbase # FFI390_RET_VOID
|
yann@402
|
3405 |
+ .byte .LretNone-.Lbase # FFI390_RET_STRUCT
|
yann@402
|
3406 |
+ .byte .LretFloat-.Lbase # FFI390_RET_FLOAT
|
yann@402
|
3407 |
+ .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE
|
yann@402
|
3408 |
+ .byte .LretInt32-.Lbase # FFI390_RET_INT32
|
yann@402
|
3409 |
+ .byte .LretInt64-.Lbase # FFI390_RET_INT64
|
yann@402
|
3410 |
+
|
yann@402
|
3411 |
+.LFE1:
|
yann@402
|
3412 |
+.ffi_call_SYSV_end:
|
yann@402
|
3413 |
+ .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV
|
yann@402
|
3414 |
+
|
yann@402
|
3415 |
+
|
yann@402
|
3416 |
+ .globl ffi_closure_SYSV
|
yann@402
|
3417 |
+ .type ffi_closure_SYSV,%function
|
yann@402
|
3418 |
+ffi_closure_SYSV:
|
yann@402
|
3419 |
+.LFB2:
|
yann@402
|
3420 |
+ stmg %r14,%r15,112(%r15) # Save registers
|
yann@402
|
3421 |
+.LCFI10:
|
yann@402
|
3422 |
+ stmg %r2,%r6,16(%r15) # Save arguments
|
yann@402
|
3423 |
+ std %f0,128(%r15)
|
yann@402
|
3424 |
+ std %f2,136(%r15)
|
yann@402
|
3425 |
+ std %f4,144(%r15)
|
yann@402
|
3426 |
+ std %f6,152(%r15)
|
yann@402
|
3427 |
+ lgr %r1,%r15 # Set up stack frame
|
yann@402
|
3428 |
+ aghi %r15,-160
|
yann@402
|
3429 |
+.LCFI11:
|
yann@402
|
3430 |
+ lgr %r2,%r0 # Closure
|
yann@402
|
3431 |
+ la %r3,16(%r1) # GPRs
|
yann@402
|
3432 |
+ la %r4,128(%r1) # FPRs
|
yann@402
|
3433 |
+ la %r5,160(%r1) # Overflow
|
yann@402
|
3434 |
+ stg %r1,0(%r15) # Set up back chain
|
yann@402
|
3435 |
+
|
yann@402
|
3436 |
+ brasl %r14,ffi_closure_helper_SYSV # Call helper
|
yann@402
|
3437 |
+
|
yann@402
|
3438 |
+ lg %r14,160+112(%r15)
|
yann@402
|
3439 |
+ ld %f0,160+128(%r15) # Load return registers
|
yann@402
|
3440 |
+ lg %r2,160+16(%r15)
|
yann@402
|
3441 |
+ la %r15,160(%r15)
|
yann@402
|
3442 |
+ br %r14
|
yann@402
|
3443 |
+.LFE2:
|
yann@402
|
3444 |
+
|
yann@402
|
3445 |
+.ffi_closure_SYSV_end:
|
yann@402
|
3446 |
+ .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV
|
yann@402
|
3447 |
+
|
yann@402
|
3448 |
+
|
yann@402
|
3449 |
+
|
yann@402
|
3450 |
+ .section .eh_frame,"a",@progbits
|
yann@402
|
3451 |
+.Lframe1:
|
yann@402
|
3452 |
+ .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry
|
yann@402
|
3453 |
+.LSCIE1:
|
yann@402
|
3454 |
+ .4byte 0x0 # CIE Identifier Tag
|
yann@402
|
3455 |
+ .byte 0x1 # CIE Version
|
yann@402
|
3456 |
+ .ascii "zR\0" # CIE Augmentation
|
yann@402
|
3457 |
+ .uleb128 0x1 # CIE Code Alignment Factor
|
yann@402
|
3458 |
+ .sleb128 -8 # CIE Data Alignment Factor
|
yann@402
|
3459 |
+ .byte 0xe # CIE RA Column
|
yann@402
|
3460 |
+ .uleb128 0x1 # Augmentation size
|
yann@402
|
3461 |
+ .byte 0x1b # FDE Encoding (pcrel sdata4)
|
yann@402
|
3462 |
+ .byte 0xc # DW_CFA_def_cfa
|
yann@402
|
3463 |
+ .uleb128 0xf
|
yann@402
|
3464 |
+ .uleb128 0xa0
|
yann@402
|
3465 |
+ .align 8
|
yann@402
|
3466 |
+.LECIE1:
|
yann@402
|
3467 |
+.LSFDE1:
|
yann@402
|
3468 |
+ .4byte .LEFDE1-.LASFDE1 # FDE Length
|
yann@402
|
3469 |
+.LASFDE1:
|
yann@402
|
3470 |
+ .4byte .LASFDE1-.Lframe1 # FDE CIE offset
|
yann@402
|
3471 |
+ .4byte .LFB1-. # FDE initial location
|
yann@402
|
3472 |
+ .4byte .LFE1-.LFB1 # FDE address range
|
yann@402
|
3473 |
+ .uleb128 0x0 # Augmentation size
|
yann@402
|
3474 |
+ .byte 0x4 # DW_CFA_advance_loc4
|
yann@402
|
3475 |
+ .4byte .LCFI0-.LFB1
|
yann@402
|
3476 |
+ .byte 0x8f # DW_CFA_offset, column 0xf
|
yann@402
|
3477 |
+ .uleb128 0x5
|
yann@402
|
3478 |
+ .byte 0x8e # DW_CFA_offset, column 0xe
|
yann@402
|
3479 |
+ .uleb128 0x6
|
yann@402
|
3480 |
+ .byte 0x8d # DW_CFA_offset, column 0xd
|
yann@402
|
3481 |
+ .uleb128 0x7
|
yann@402
|
3482 |
+ .byte 0x8c # DW_CFA_offset, column 0xc
|
yann@402
|
3483 |
+ .uleb128 0x8
|
yann@402
|
3484 |
+ .byte 0x8b # DW_CFA_offset, column 0xb
|
yann@402
|
3485 |
+ .uleb128 0x9
|
yann@402
|
3486 |
+ .byte 0x8a # DW_CFA_offset, column 0xa
|
yann@402
|
3487 |
+ .uleb128 0xa
|
yann@402
|
3488 |
+ .byte 0x89 # DW_CFA_offset, column 0x9
|
yann@402
|
3489 |
+ .uleb128 0xb
|
yann@402
|
3490 |
+ .byte 0x88 # DW_CFA_offset, column 0x8
|
yann@402
|
3491 |
+ .uleb128 0xc
|
yann@402
|
3492 |
+ .byte 0x87 # DW_CFA_offset, column 0x7
|
yann@402
|
3493 |
+ .uleb128 0xd
|
yann@402
|
3494 |
+ .byte 0x86 # DW_CFA_offset, column 0x6
|
yann@402
|
3495 |
+ .uleb128 0xe
|
yann@402
|
3496 |
+ .byte 0x4 # DW_CFA_advance_loc4
|
yann@402
|
3497 |
+ .4byte .LCFI1-.LCFI0
|
yann@402
|
3498 |
+ .byte 0xd # DW_CFA_def_cfa_register
|
yann@402
|
3499 |
+ .uleb128 0xb
|
yann@402
|
3500 |
+ .byte 0x4 # DW_CFA_advance_loc4
|
yann@402
|
3501 |
+ .4byte .LCFI2-.LCFI1
|
yann@402
|
3502 |
+ .byte 0xe # DW_CFA_def_cfa_offset
|
yann@402
|
3503 |
+ .uleb128 0xf0
|
yann@402
|
3504 |
+ .align 8
|
yann@402
|
3505 |
+.LEFDE1:
|
yann@402
|
3506 |
+.LSFDE2:
|
yann@402
|
3507 |
+ .4byte .LEFDE2-.LASFDE2 # FDE Length
|
yann@402
|
3508 |
+.LASFDE2:
|
yann@402
|
3509 |
+ .4byte .LASFDE2-.Lframe1 # FDE CIE offset
|
yann@402
|
3510 |
+ .4byte .LFB2-. # FDE initial location
|
yann@402
|
3511 |
+ .4byte .LFE2-.LFB2 # FDE address range
|
yann@402
|
3512 |
+ .uleb128 0x0 # Augmentation size
|
yann@402
|
3513 |
+ .byte 0x4 # DW_CFA_advance_loc4
|
yann@402
|
3514 |
+ .4byte .LCFI10-.LFB2
|
yann@402
|
3515 |
+ .byte 0x8f # DW_CFA_offset, column 0xf
|
yann@402
|
3516 |
+ .uleb128 0x5
|
yann@402
|
3517 |
+ .byte 0x8e # DW_CFA_offset, column 0xe
|
yann@402
|
3518 |
+ .uleb128 0x6
|
yann@402
|
3519 |
+ .byte 0x4 # DW_CFA_advance_loc4
|
yann@402
|
3520 |
+ .4byte .LCFI11-.LCFI10
|
yann@402
|
3521 |
+ .byte 0xe # DW_CFA_def_cfa_offset
|
yann@402
|
3522 |
+ .uleb128 0x140
|
yann@402
|
3523 |
+ .align 8
|
yann@402
|
3524 |
+.LEFDE2:
|
yann@402
|
3525 |
+
|
yann@402
|
3526 |
+#endif
|
yann@402
|
3527 |
+
|
yann@402
|
3528 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/ffi.c gcc/libffi/src/sh/ffi.c
|
yann@402
|
3529 |
--- gcc-3.2.2.orig/libffi/src/sh/ffi.c Thu Jan 1 09:00:00 1970
|
yann@402
|
3530 |
+++ gcc/libffi/src/sh/ffi.c Fri Jul 19 10:08:43 2002
|
yann@402
|
3531 |
@@ -0,0 +1,722 @@
|
yann@402
|
3532 |
+/* -----------------------------------------------------------------------
|
yann@402
|
3533 |
+ ffi.c - Copyright (c) 2002 Kaz Kojima
|
yann@402
|
3534 |
+
|
yann@402
|
3535 |
+ SuperH Foreign Function Interface
|
yann@402
|
3536 |
+
|
yann@402
|
3537 |
+ Permission is hereby granted, free of charge, to any person obtaining
|
yann@402
|
3538 |
+ a copy of this software and associated documentation files (the
|
yann@402
|
3539 |
+ ``Software''), to deal in the Software without restriction, including
|
yann@402
|
3540 |
+ without limitation the rights to use, copy, modify, merge, publish,
|
yann@402
|
3541 |
+ distribute, sublicense, and/or sell copies of the Software, and to
|
yann@402
|
3542 |
+ permit persons to whom the Software is furnished to do so, subject to
|
yann@402
|
3543 |
+ the following conditions:
|
yann@402
|
3544 |
+
|
yann@402
|
3545 |
+ The above copyright notice and this permission notice shall be included
|
yann@402
|
3546 |
+ in all copies or substantial portions of the Software.
|
yann@402
|
3547 |
+
|
yann@402
|
3548 |
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
yann@402
|
3549 |
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
yann@402
|
3550 |
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
yann@402
|
3551 |
+ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
yann@402
|
3552 |
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
yann@402
|
3553 |
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
yann@402
|
3554 |
+ OTHER DEALINGS IN THE SOFTWARE.
|
yann@402
|
3555 |
+ ----------------------------------------------------------------------- */
|
yann@402
|
3556 |
+
|
yann@402
|
3557 |
+#include <ffi.h>
|
yann@402
|
3558 |
+#include <ffi_common.h>
|
yann@402
|
3559 |
+
|
yann@402
|
3560 |
+#include <stdlib.h>
|
yann@402
|
3561 |
+
|
yann@402
|
3562 |
+#define NGREGARG 4
|
yann@402
|
3563 |
+#if defined(__SH4__)
|
yann@402
|
3564 |
+#define NFREGARG 8
|
yann@402
|
3565 |
+#endif
|
yann@402
|
3566 |
+
|
yann@402
|
3567 |
+#if defined(__HITACHI__)
|
yann@402
|
3568 |
+#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
|
yann@402
|
3569 |
+#else
|
yann@402
|
3570 |
+#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
|
yann@402
|
3571 |
+#endif
|
yann@402
|
3572 |
+
|
yann@402
|
3573 |
+/* If the structure has essentialy an unique element, return its type. */
|
yann@402
|
3574 |
+static int
|
yann@402
|
3575 |
+simple_type (ffi_type *arg)
|
yann@402
|
3576 |
+{
|
yann@402
|
3577 |
+ if (arg->type != FFI_TYPE_STRUCT)
|
yann@402
|
3578 |
+ return arg->type;
|
yann@402
|
3579 |
+ else if (arg->elements[1])
|
yann@402
|
3580 |
+ return FFI_TYPE_STRUCT;
|
yann@402
|
3581 |
+
|
yann@402
|
3582 |
+ return simple_type (arg->elements[0]);
|
yann@402
|
3583 |
+}
|
yann@402
|
3584 |
+
|
yann@402
|
3585 |
+static int
|
yann@402
|
3586 |
+return_type (ffi_type *arg)
|
yann@402
|
3587 |
+{
|
yann@402
|
3588 |
+ unsigned short type;
|
yann@402
|
3589 |
+
|
yann@402
|
3590 |
+ if (arg->type != FFI_TYPE_STRUCT)
|
yann@402
|
3591 |
+ return arg->type;
|
yann@402
|
3592 |
+
|
yann@402
|
3593 |
+ type = simple_type (arg->elements[0]);
|
yann@402
|
3594 |
+ if (! arg->elements[1])
|
yann@402
|
3595 |
+ {
|
yann@402
|
3596 |
+ switch (type)
|
yann@402
|
3597 |
+ {
|
yann@402
|
3598 |
+ case FFI_TYPE_SINT8:
|
yann@402
|
3599 |
+ case FFI_TYPE_UINT8:
|
yann@402
|
3600 |
+ case FFI_TYPE_SINT16:
|
yann@402
|
3601 |
+ case FFI_TYPE_UINT16:
|
yann@402
|
3602 |
+ case FFI_TYPE_SINT32:
|
yann@402
|
3603 |
+ case FFI_TYPE_UINT32:
|
yann@402
|
3604 |
+ return FFI_TYPE_INT;
|
yann@402
|
3605 |
+
|
yann@402
|
3606 |
+ default:
|
yann@402
|
3607 |
+ return type;
|
yann@402
|
3608 |
+ }
|
yann@402
|
3609 |
+ }
|
yann@402
|
3610 |
+
|
yann@402
|
3611 |
+ /* gcc uses r0/r1 pair for some kind of structures. */
|
yann@402
|
3612 |
+ if (arg->size <= 2 * sizeof (int))
|
yann@402
|
3613 |
+ {
|
yann@402
|
3614 |
+ int i = 0;
|
yann@402
|
3615 |
+ ffi_type *e;
|
yann@402
|
3616 |
+
|
yann@402
|
3617 |
+ while ((e = arg->elements[i++]))
|
yann@402
|
3618 |
+ {
|
yann@402
|
3619 |
+ type = simple_type (e);
|
yann@402
|
3620 |
+ switch (type)
|
yann@402
|
3621 |
+ {
|
yann@402
|
3622 |
+ case FFI_TYPE_SINT32:
|
yann@402
|
3623 |
+ case FFI_TYPE_UINT32:
|
yann@402
|
3624 |
+ case FFI_TYPE_INT:
|
yann@402
|
3625 |
+ case FFI_TYPE_FLOAT:
|
yann@402
|
3626 |
+ return FFI_TYPE_UINT64;
|
yann@402
|
3627 |
+
|
yann@402
|
3628 |
+ default:
|
yann@402
|
3629 |
+ break;
|
yann@402
|
3630 |
+ }
|
yann@402
|
3631 |
+ }
|
yann@402
|
3632 |
+ }
|
yann@402
|
3633 |
+
|
yann@402
|
3634 |
+ return FFI_TYPE_STRUCT;
|
yann@402
|
3635 |
+}
|
yann@402
|
3636 |
+
|
yann@402
|
3637 |
+/* ffi_prep_args is called by the assembly routine once stack space
|
yann@402
|
3638 |
+ has been allocated for the function's arguments */
|
yann@402
|
3639 |
+
|
yann@402
|
3640 |
+/*@-exportheader@*/
|
yann@402
|
3641 |
+void ffi_prep_args(char *stack, extended_cif *ecif)
|
yann@402
|
3642 |
+/*@=exportheader@*/
|
yann@402
|
3643 |
+{
|
yann@402
|
3644 |
+ register unsigned int i;
|
yann@402
|
3645 |
+ register int tmp;
|
yann@402
|
3646 |
+ register unsigned int avn;
|
yann@402
|
3647 |
+ register void **p_argv;
|
yann@402
|
3648 |
+ register char *argp;
|
yann@402
|
3649 |
+ register ffi_type **p_arg;
|
yann@402
|
3650 |
+ int greg, ireg;
|
yann@402
|
3651 |
+#if defined(__SH4__)
|
yann@402
|
3652 |
+ int freg = 0;
|
yann@402
|
3653 |
+#endif
|
yann@402
|
3654 |
+
|
yann@402
|
3655 |
+ tmp = 0;
|
yann@402
|
3656 |
+ argp = stack;
|
yann@402
|
3657 |
+
|
yann@402
|
3658 |
+ if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT)
|
yann@402
|
3659 |
+ {
|
yann@402
|
3660 |
+ *(void **) argp = ecif->rvalue;
|
yann@402
|
3661 |
+ argp += 4;
|
yann@402
|
3662 |
+ ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0;
|
yann@402
|
3663 |
+ }
|
yann@402
|
3664 |
+ else
|
yann@402
|
3665 |
+ ireg = 0;
|
yann@402
|
3666 |
+
|
yann@402
|
3667 |
+ /* Set arguments for registers. */
|
yann@402
|
3668 |
+ greg = ireg;
|
yann@402
|
3669 |
+ avn = ecif->cif->nargs;
|
yann@402
|
3670 |
+ p_argv = ecif->avalue;
|
yann@402
|
3671 |
+
|
yann@402
|
3672 |
+ for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
|
yann@402
|
3673 |
+ {
|
yann@402
|
3674 |
+ size_t z;
|
yann@402
|
3675 |
+
|
yann@402
|
3676 |
+ z = (*p_arg)->size;
|
yann@402
|
3677 |
+ if (z < sizeof(int))
|
yann@402
|
3678 |
+ {
|
yann@402
|
3679 |
+ if (greg++ >= NGREGARG)
|
yann@402
|
3680 |
+ continue;
|
yann@402
|
3681 |
+
|
yann@402
|
3682 |
+ z = sizeof(int);
|
yann@402
|
3683 |
+ switch ((*p_arg)->type)
|
yann@402
|
3684 |
+ {
|
yann@402
|
3685 |
+ case FFI_TYPE_SINT8:
|
yann@402
|
3686 |
+ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
|
yann@402
|
3687 |
+ break;
|
yann@402
|
3688 |
+
|
yann@402
|
3689 |
+ case FFI_TYPE_UINT8:
|
yann@402
|
3690 |
+ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
|
yann@402
|
3691 |
+ break;
|
yann@402
|
3692 |
+
|
yann@402
|
3693 |
+ case FFI_TYPE_SINT16:
|
yann@402
|
3694 |
+ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
|
yann@402
|
3695 |
+ break;
|
yann@402
|
3696 |
+
|
yann@402
|
3697 |
+ case FFI_TYPE_UINT16:
|
yann@402
|
3698 |
+ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
|
yann@402
|
3699 |
+ break;
|
yann@402
|
3700 |
+
|
yann@402
|
3701 |
+ case FFI_TYPE_STRUCT:
|
yann@402
|
3702 |
+ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
|
yann@402
|
3703 |
+ break;
|
yann@402
|
3704 |
+
|
yann@402
|
3705 |
+ default:
|
yann@402
|
3706 |
+ FFI_ASSERT(0);
|
yann@402
|
3707 |
+ }
|
yann@402
|
3708 |
+ argp += z;
|
yann@402
|
3709 |
+ }
|
yann@402
|
3710 |
+ else if (z == sizeof(int))
|
yann@402
|
3711 |
+ {
|
yann@402
|
3712 |
+#if defined(__SH4__)
|
yann@402
|
3713 |
+ if ((*p_arg)->type == FFI_TYPE_FLOAT)
|
yann@402
|
3714 |
+ {
|
yann@402
|
3715 |
+ if (freg++ >= NFREGARG)
|
yann@402
|
3716 |
+ continue;
|
yann@402
|
3717 |
+ }
|
yann@402
|
3718 |
+ else
|
yann@402
|
3719 |
+#endif
|
yann@402
|
3720 |
+ {
|
yann@402
|
3721 |
+ if (greg++ >= NGREGARG)
|
yann@402
|
3722 |
+ continue;
|
yann@402
|
3723 |
+ }
|
yann@402
|
3724 |
+ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
|
yann@402
|
3725 |
+ argp += z;
|
yann@402
|
3726 |
+ }
|
yann@402
|
3727 |
+#if defined(__SH4__)
|
yann@402
|
3728 |
+ else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
|
yann@402
|
3729 |
+ {
|
yann@402
|
3730 |
+ if (freg + 1 >= NFREGARG)
|
yann@402
|
3731 |
+ continue;
|
yann@402
|
3732 |
+ freg = (freg + 1) & ~1;
|
yann@402
|
3733 |
+ freg += 2;
|
yann@402
|
3734 |
+ memcpy (argp, *p_argv, z);
|
yann@402
|
3735 |
+ argp += z;
|
yann@402
|
3736 |
+ }
|
yann@402
|
3737 |
+#endif
|
yann@402
|
3738 |
+ else
|
yann@402
|
3739 |
+ {
|
yann@402
|
3740 |
+ int n = (z + sizeof (int) - 1) / sizeof (int);
|
yann@402
|
3741 |
+#if defined(__SH4__)
|
yann@402
|
3742 |
+ if (greg + n - 1 >= NGREGARG)
|
yann@402
|
3743 |
+ continue;
|
yann@402
|
3744 |
+ greg += n;
|
yann@402
|
3745 |
+#else
|
yann@402
|
3746 |
+ if (greg >= NGREGARG)
|
yann@402
|
3747 |
+ continue;
|
yann@402
|
3748 |
+ else if (greg + n - 1 >= NGREGARG)
|
yann@402
|
3749 |
+ greg = NGREGARG;
|
yann@402
|
3750 |
+ else
|
yann@402
|
3751 |
+ greg += n;
|
yann@402
|
3752 |
+#endif
|
yann@402
|
3753 |
+ memcpy (argp, *p_argv, z);
|
yann@402
|
3754 |
+ argp += z;
|
yann@402
|
3755 |
+ }
|
yann@402
|
3756 |
+ }
|
yann@402
|
3757 |
+
|
yann@402
|
3758 |
+ /* Set arguments on stack. */
|
yann@402
|
3759 |
+ greg = ireg;
|
yann@402
|
3760 |
+#if defined(__SH4__)
|
yann@402
|
3761 |
+ freg = 0;
|
yann@402
|
3762 |
+#endif
|
yann@402
|
3763 |
+ p_argv = ecif->avalue;
|
yann@402
|
3764 |
+
|
yann@402
|
3765 |
+ for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++)
|
yann@402
|
3766 |
+ {
|
yann@402
|
3767 |
+ size_t z;
|
yann@402
|
3768 |
+
|
yann@402
|
3769 |
+ z = (*p_arg)->size;
|
yann@402
|
3770 |
+ if (z < sizeof(int))
|
yann@402
|
3771 |
+ {
|
yann@402
|
3772 |
+ if (greg++ < NGREGARG)
|
yann@402
|
3773 |
+ continue;
|
yann@402
|
3774 |
+
|
yann@402
|
3775 |
+ z = sizeof(int);
|
yann@402
|
3776 |
+ switch ((*p_arg)->type)
|
yann@402
|
3777 |
+ {
|
yann@402
|
3778 |
+ case FFI_TYPE_SINT8:
|
yann@402
|
3779 |
+ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv);
|
yann@402
|
3780 |
+ break;
|
yann@402
|
3781 |
+
|
yann@402
|
3782 |
+ case FFI_TYPE_UINT8:
|
yann@402
|
3783 |
+ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv);
|
yann@402
|
3784 |
+ break;
|
yann@402
|
3785 |
+
|
yann@402
|
3786 |
+ case FFI_TYPE_SINT16:
|
yann@402
|
3787 |
+ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv);
|
yann@402
|
3788 |
+ break;
|
yann@402
|
3789 |
+
|
yann@402
|
3790 |
+ case FFI_TYPE_UINT16:
|
yann@402
|
3791 |
+ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv);
|
yann@402
|
3792 |
+ break;
|
yann@402
|
3793 |
+
|
yann@402
|
3794 |
+ case FFI_TYPE_STRUCT:
|
yann@402
|
3795 |
+ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
|
yann@402
|
3796 |
+ break;
|
yann@402
|
3797 |
+
|
yann@402
|
3798 |
+ default:
|
yann@402
|
3799 |
+ FFI_ASSERT(0);
|
yann@402
|
3800 |
+ }
|
yann@402
|
3801 |
+ argp += z;
|
yann@402
|
3802 |
+ }
|
yann@402
|
3803 |
+ else if (z == sizeof(int))
|
yann@402
|
3804 |
+ {
|
yann@402
|
3805 |
+#if defined(__SH4__)
|
yann@402
|
3806 |
+ if ((*p_arg)->type == FFI_TYPE_FLOAT)
|
yann@402
|
3807 |
+ {
|
yann@402
|
3808 |
+ if (freg++ < NFREGARG)
|
yann@402
|
3809 |
+ continue;
|
yann@402
|
3810 |
+ }
|
yann@402
|
3811 |
+ else
|
yann@402
|
3812 |
+#endif
|
yann@402
|
3813 |
+ {
|
yann@402
|
3814 |
+ if (greg++ < NGREGARG)
|
yann@402
|
3815 |
+ continue;
|
yann@402
|
3816 |
+ }
|
yann@402
|
3817 |
+ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
|
yann@402
|
3818 |
+ argp += z;
|
yann@402
|
3819 |
+ }
|
yann@402
|
3820 |
+#if defined(__SH4__)
|
yann@402
|
3821 |
+ else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
|
yann@402
|
3822 |
+ {
|
yann@402
|
3823 |
+ if (freg + 1 < NFREGARG)
|
yann@402
|
3824 |
+ {
|
yann@402
|
3825 |
+ freg = (freg + 1) & ~1;
|
yann@402
|
3826 |
+ freg += 2;
|
yann@402
|
3827 |
+ continue;
|
yann@402
|
3828 |
+ }
|
yann@402
|
3829 |
+ memcpy (argp, *p_argv, z);
|
yann@402
|
3830 |
+ argp += z;
|
yann@402
|
3831 |
+ }
|
yann@402
|
3832 |
+#endif
|
yann@402
|
3833 |
+ else
|
yann@402
|
3834 |
+ {
|
yann@402
|
3835 |
+ int n = (z + sizeof (int) - 1) / sizeof (int);
|
yann@402
|
3836 |
+ if (greg + n - 1 < NGREGARG)
|
yann@402
|
3837 |
+ {
|
yann@402
|
3838 |
+ greg += n;
|
yann@402
|
3839 |
+ continue;
|
yann@402
|
3840 |
+ }
|
yann@402
|
3841 |
+#if (! defined(__SH4__))
|
yann@402
|
3842 |
+ else if (greg < NGREGARG)
|
yann@402
|
3843 |
+ {
|
yann@402
|
3844 |
+ greg = NGREGARG;
|
yann@402
|
3845 |
+ continue;
|
yann@402
|
3846 |
+ }
|
yann@402
|
3847 |
+#endif
|
yann@402
|
3848 |
+ memcpy (argp, *p_argv, z);
|
yann@402
|
3849 |
+ argp += z;
|
yann@402
|
3850 |
+ }
|
yann@402
|
3851 |
+ }
|
yann@402
|
3852 |
+
|
yann@402
|
3853 |
+ return;
|
yann@402
|
3854 |
+}
|
yann@402
|
3855 |
+
|
yann@402
|
3856 |
+/* Perform machine dependent cif processing */
|
yann@402
|
3857 |
+ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
|
yann@402
|
3858 |
+{
|
yann@402
|
3859 |
+ int i, j;
|
yann@402
|
3860 |
+ int size, type;
|
yann@402
|
3861 |
+ int n, m;
|
yann@402
|
3862 |
+ int greg;
|
yann@402
|
3863 |
+#if defined(__SH4__)
|
yann@402
|
3864 |
+ int freg = 0;
|
yann@402
|
3865 |
+#endif
|
yann@402
|
3866 |
+
|
yann@402
|
3867 |
+ cif->flags = 0;
|
yann@402
|
3868 |
+
|
yann@402
|
3869 |
+ greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) &&
|
yann@402
|
3870 |
+ STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0;
|
yann@402
|
3871 |
+
|
yann@402
|
3872 |
+#if defined(__SH4__)
|
yann@402
|
3873 |
+ for (i = j = 0; i < cif->nargs && j < 12; i++)
|
yann@402
|
3874 |
+ {
|
yann@402
|
3875 |
+ type = (cif->arg_types)[i]->type;
|
yann@402
|
3876 |
+ switch (type)
|
yann@402
|
3877 |
+ {
|
yann@402
|
3878 |
+ case FFI_TYPE_FLOAT:
|
yann@402
|
3879 |
+ if (freg >= NFREGARG)
|
yann@402
|
3880 |
+ continue;
|
yann@402
|
3881 |
+ freg++;
|
yann@402
|
3882 |
+ cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
|
yann@402
|
3883 |
+ j++;
|
yann@402
|
3884 |
+ break;
|
yann@402
|
3885 |
+
|
yann@402
|
3886 |
+ case FFI_TYPE_DOUBLE:
|
yann@402
|
3887 |
+ if ((freg + 1) >= NFREGARG)
|
yann@402
|
3888 |
+ continue;
|
yann@402
|
3889 |
+ freg = (freg + 1) & ~1;
|
yann@402
|
3890 |
+ freg += 2;
|
yann@402
|
3891 |
+ cif->flags += ((cif->arg_types)[i]->type) << (2 * j);
|
yann@402
|
3892 |
+ j++;
|
yann@402
|
3893 |
+ break;
|
yann@402
|
3894 |
+
|
yann@402
|
3895 |
+ default:
|
yann@402
|
3896 |
+ size = (cif->arg_types)[i]->size;
|
yann@402
|
3897 |
+ n = (size + sizeof (int) - 1) / sizeof (int);
|
yann@402
|
3898 |
+ if (greg + n - 1 >= NGREGARG)
|
yann@402
|
3899 |
+ continue;
|
yann@402
|
3900 |
+ greg += n;
|
yann@402
|
3901 |
+ for (m = 0; m < n; m++)
|
yann@402
|
3902 |
+ cif->flags += FFI_TYPE_INT << (2 * j++);
|
yann@402
|
3903 |
+ break;
|
yann@402
|
3904 |
+ }
|
yann@402
|
3905 |
+ }
|
yann@402
|
3906 |
+#else
|
yann@402
|
3907 |
+ for (i = j = 0; i < cif->nargs && j < 4; i++)
|
yann@402
|
3908 |
+ {
|
yann@402
|
3909 |
+ size = (cif->arg_types)[i]->size;
|
yann@402
|
3910 |
+ n = (size + sizeof (int) - 1) / sizeof (int);
|
yann@402
|
3911 |
+ if (greg >= NGREGARG)
|
yann@402
|
3912 |
+ continue;
|
yann@402
|
3913 |
+ else if (greg + n - 1 >= NGREGARG)
|
yann@402
|
3914 |
+ greg = NGREGARG;
|
yann@402
|
3915 |
+ else
|
yann@402
|
3916 |
+ greg += n;
|
yann@402
|
3917 |
+ for (m = 0; m < n; m++)
|
yann@402
|
3918 |
+ cif->flags += FFI_TYPE_INT << (2 * j++);
|
yann@402
|
3919 |
+ }
|
yann@402
|
3920 |
+#endif
|
yann@402
|
3921 |
+
|
yann@402
|
3922 |
+ /* Set the return type flag */
|
yann@402
|
3923 |
+ switch (cif->rtype->type)
|
yann@402
|
3924 |
+ {
|
yann@402
|
3925 |
+ case FFI_TYPE_STRUCT:
|
yann@402
|
3926 |
+ cif->flags += (unsigned) (return_type (cif->rtype)) << 24;
|
yann@402
|
3927 |
+ break;
|
yann@402
|
3928 |
+
|
yann@402
|
3929 |
+ case FFI_TYPE_VOID:
|
yann@402
|
3930 |
+ case FFI_TYPE_FLOAT:
|
yann@402
|
3931 |
+ case FFI_TYPE_DOUBLE:
|
yann@402
|
3932 |
+ case FFI_TYPE_SINT64:
|
yann@402
|
3933 |
+ case FFI_TYPE_UINT64:
|
yann@402
|
3934 |
+ cif->flags += (unsigned) cif->rtype->type << 24;
|
yann@402
|
3935 |
+ break;
|
yann@402
|
3936 |
+
|
yann@402
|
3937 |
+ default:
|
yann@402
|
3938 |
+ cif->flags += FFI_TYPE_INT << 24;
|
yann@402
|
3939 |
+ break;
|
yann@402
|
3940 |
+ }
|
yann@402
|
3941 |
+
|
yann@402
|
3942 |
+ return FFI_OK;
|
yann@402
|
3943 |
+}
|
yann@402
|
3944 |
+
|
yann@402
|
3945 |
+/*@-declundef@*/
|
yann@402
|
3946 |
+/*@-exportheader@*/
|
yann@402
|
3947 |
+extern void ffi_call_SYSV(void (*)(char *, extended_cif *),
|
yann@402
|
3948 |
+ /*@out@*/ extended_cif *,
|
yann@402
|
3949 |
+ unsigned, unsigned,
|
yann@402
|
3950 |
+ /*@out@*/ unsigned *,
|
yann@402
|
3951 |
+ void (*fn)());
|
yann@402
|
3952 |
+/*@=declundef@*/
|
yann@402
|
3953 |
+/*@=exportheader@*/
|
yann@402
|
3954 |
+
|
yann@402
|
3955 |
+void ffi_call(/*@dependent@*/ ffi_cif *cif,
|
yann@402
|
3956 |
+ void (*fn)(),
|
yann@402
|
3957 |
+ /*@out@*/ void *rvalue,
|
yann@402
|
3958 |
+ /*@dependent@*/ void **avalue)
|
yann@402
|
3959 |
+{
|
yann@402
|
3960 |
+ extended_cif ecif;
|
yann@402
|
3961 |
+
|
yann@402
|
3962 |
+ ecif.cif = cif;
|
yann@402
|
3963 |
+ ecif.avalue = avalue;
|
yann@402
|
3964 |
+
|
yann@402
|
3965 |
+ /* If the return value is a struct and we don't have a return */
|
yann@402
|
3966 |
+ /* value address then we need to make one */
|
yann@402
|
3967 |
+
|
yann@402
|
3968 |
+ if ((rvalue == NULL) &&
|
yann@402
|
3969 |
+ (cif->rtype->type == FFI_TYPE_STRUCT))
|
yann@402
|
3970 |
+ {
|
yann@402
|
3971 |
+ /*@-sysunrecog@*/
|
yann@402
|
3972 |
+ ecif.rvalue = alloca(cif->rtype->size);
|
yann@402
|
3973 |
+ /*@=sysunrecog@*/
|
yann@402
|
3974 |
+ }
|
yann@402
|
3975 |
+ else
|
yann@402
|
3976 |
+ ecif.rvalue = rvalue;
|
yann@402
|
3977 |
+
|
yann@402
|
3978 |
+
|
yann@402
|
3979 |
+ switch (cif->abi)
|
yann@402
|
3980 |
+ {
|
yann@402
|
3981 |
+ case FFI_SYSV:
|
yann@402
|
3982 |
+ /*@-usedef@*/
|
yann@402
|
3983 |
+ ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes,
|
yann@402
|
3984 |
+ cif->flags, ecif.rvalue, fn);
|
yann@402
|
3985 |
+ /*@=usedef@*/
|
yann@402
|
3986 |
+ break;
|
yann@402
|
3987 |
+ default:
|
yann@402
|
3988 |
+ FFI_ASSERT(0);
|
yann@402
|
3989 |
+ break;
|
yann@402
|
3990 |
+ }
|
yann@402
|
3991 |
+}
|
yann@402
|
3992 |
+
|
yann@402
|
3993 |
+extern void ffi_closure_SYSV (void);
|
yann@402
|
3994 |
+#if defined(__SH4__)
|
yann@402
|
3995 |
+extern void __ic_invalidate (void *line);
|
yann@402
|
3996 |
+#endif
|
yann@402
|
3997 |
+
|
yann@402
|
3998 |
+ffi_status
|
yann@402
|
3999 |
+ffi_prep_closure (ffi_closure* closure,
|
yann@402
|
4000 |
+ ffi_cif* cif,
|
yann@402
|
4001 |
+ void (*fun)(ffi_cif*, void*, void**, void*),
|
yann@402
|
4002 |
+ void *user_data)
|
yann@402
|
4003 |
+{
|
yann@402
|
4004 |
+ unsigned int *tramp;
|
yann@402
|
4005 |
+
|
yann@402
|
4006 |
+ FFI_ASSERT (cif->abi == FFI_GCC_SYSV);
|
yann@402
|
4007 |
+
|
yann@402
|
4008 |
+ tramp = (unsigned int *) &closure->tramp[0];
|
yann@402
|
4009 |
+#ifdef __LITTLE_ENDIAN__
|
yann@402
|
4010 |
+ tramp[0] = 0xd301d202;
|
yann@402
|
4011 |
+ tramp[1] = 0x0009422b;
|
yann@402
|
4012 |
+#else
|
yann@402
|
4013 |
+ tramp[0] = 0xd202d301;
|
yann@402
|
4014 |
+ tramp[1] = 0x422b0009;
|
yann@402
|
4015 |
+#endif
|
yann@402
|
4016 |
+ *(void **) &tramp[2] = (void *)closure; /* ctx */
|
yann@402
|
4017 |
+ *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */
|
yann@402
|
4018 |
+
|
yann@402
|
4019 |
+ closure->cif = cif;
|
yann@402
|
4020 |
+ closure->fun = fun;
|
yann@402
|
4021 |
+ closure->user_data = user_data;
|
yann@402
|
4022 |
+
|
yann@402
|
4023 |
+#if defined(__SH4__)
|
yann@402
|
4024 |
+ /* Flush the icache. */
|
yann@402
|
4025 |
+ __ic_invalidate(&closure->tramp[0]);
|
yann@402
|
4026 |
+#endif
|
yann@402
|
4027 |
+
|
yann@402
|
4028 |
+ return FFI_OK;
|
yann@402
|
4029 |
+}
|
yann@402
|
4030 |
+
|
yann@402
|
4031 |
+/* Basically the trampoline invokes ffi_closure_SYSV, and on
|
yann@402
|
4032 |
+ * entry, r3 holds the address of the closure.
|
yann@402
|
4033 |
+ * After storing the registers that could possibly contain
|
yann@402
|
4034 |
+ * parameters to be passed into the stack frame and setting
|
yann@402
|
4035 |
+ * up space for a return value, ffi_closure_SYSV invokes the
|
yann@402
|
4036 |
+ * following helper function to do most of the work.
|
yann@402
|
4037 |
+ */
|
yann@402
|
4038 |
+
|
yann@402
|
4039 |
+#ifdef __LITTLE_ENDIAN__
|
yann@402
|
4040 |
+#define OFS_INT8 0
|
yann@402
|
4041 |
+#define OFS_INT16 2
|
yann@402
|
4042 |
+#else
|
yann@402
|
4043 |
+#define OFS_INT8 3
|
yann@402
|
4044 |
+#define OFS_INT16 2
|
yann@402
|
4045 |
+#endif
|
yann@402
|
4046 |
+
|
yann@402
|
4047 |
+int
|
yann@402
|
4048 |
+ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
|
yann@402
|
4049 |
+ unsigned long *pgr, unsigned long *pfr,
|
yann@402
|
4050 |
+ unsigned long *pst)
|
yann@402
|
4051 |
+{
|
yann@402
|
4052 |
+ void **avalue;
|
yann@402
|
4053 |
+ ffi_type **p_arg;
|
yann@402
|
4054 |
+ int i, avn;
|
yann@402
|
4055 |
+ int ireg, greg = 0;
|
yann@402
|
4056 |
+#if defined(__SH4__)
|
yann@402
|
4057 |
+ int freg = 0;
|
yann@402
|
4058 |
+#endif
|
yann@402
|
4059 |
+ ffi_cif *cif;
|
yann@402
|
4060 |
+ double temp;
|
yann@402
|
4061 |
+
|
yann@402
|
4062 |
+ cif = closure->cif;
|
yann@402
|
4063 |
+ avalue = alloca(cif->nargs * sizeof(void *));
|
yann@402
|
4064 |
+
|
yann@402
|
4065 |
+ /* Copy the caller's structure return value address so that the closure
|
yann@402
|
4066 |
+ returns the data directly to the caller. */
|
yann@402
|
4067 |
+ if (cif->rtype->type == FFI_TYPE_STRUCT)
|
yann@402
|
4068 |
+ {
|
yann@402
|
4069 |
+ rvalue = *pgr++;
|
yann@402
|
4070 |
+ ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0;
|
yann@402
|
4071 |
+ }
|
yann@402
|
4072 |
+ else
|
yann@402
|
4073 |
+ ireg = 0;
|
yann@402
|
4074 |
+
|
yann@402
|
4075 |
+ cif = closure->cif;
|
yann@402
|
4076 |
+ greg = ireg;
|
yann@402
|
4077 |
+ avn = cif->nargs;
|
yann@402
|
4078 |
+
|
yann@402
|
4079 |
+ /* Grab the addresses of the arguments from the stack frame. */
|
yann@402
|
4080 |
+ for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
|
yann@402
|
4081 |
+ {
|
yann@402
|
4082 |
+ size_t z;
|
yann@402
|
4083 |
+
|
yann@402
|
4084 |
+ z = (*p_arg)->size;
|
yann@402
|
4085 |
+ if (z < sizeof(int))
|
yann@402
|
4086 |
+ {
|
yann@402
|
4087 |
+ if (greg++ >= NGREGARG)
|
yann@402
|
4088 |
+ continue;
|
yann@402
|
4089 |
+
|
yann@402
|
4090 |
+ z = sizeof(int);
|
yann@402
|
4091 |
+ switch ((*p_arg)->type)
|
yann@402
|
4092 |
+ {
|
yann@402
|
4093 |
+ case FFI_TYPE_SINT8:
|
yann@402
|
4094 |
+ case FFI_TYPE_UINT8:
|
yann@402
|
4095 |
+ avalue[i] = (((char *)pgr) + OFS_INT8);
|
yann@402
|
4096 |
+ break;
|
yann@402
|
4097 |
+
|
yann@402
|
4098 |
+ case FFI_TYPE_SINT16:
|
yann@402
|
4099 |
+ case FFI_TYPE_UINT16:
|
yann@402
|
4100 |
+ avalue[i] = (((char *)pgr) + OFS_INT16);
|
yann@402
|
4101 |
+ break;
|
yann@402
|
4102 |
+
|
yann@402
|
4103 |
+ case FFI_TYPE_STRUCT:
|
yann@402
|
4104 |
+ avalue[i] = pgr;
|
yann@402
|
4105 |
+ break;
|
yann@402
|
4106 |
+
|
yann@402
|
4107 |
+ default:
|
yann@402
|
4108 |
+ FFI_ASSERT(0);
|
yann@402
|
4109 |
+ }
|
yann@402
|
4110 |
+ pgr++;
|
yann@402
|
4111 |
+ }
|
yann@402
|
4112 |
+ else if (z == sizeof(int))
|
yann@402
|
4113 |
+ {
|
yann@402
|
4114 |
+#if defined(__SH4__)
|
yann@402
|
4115 |
+ if ((*p_arg)->type == FFI_TYPE_FLOAT)
|
yann@402
|
4116 |
+ {
|
yann@402
|
4117 |
+ if (freg++ >= NFREGARG)
|
yann@402
|
4118 |
+ continue;
|
yann@402
|
4119 |
+ avalue[i] = pfr;
|
yann@402
|
4120 |
+ pfr++;
|
yann@402
|
4121 |
+ }
|
yann@402
|
4122 |
+ else
|
yann@402
|
4123 |
+#endif
|
yann@402
|
4124 |
+ {
|
yann@402
|
4125 |
+ if (greg++ >= NGREGARG)
|
yann@402
|
4126 |
+ continue;
|
yann@402
|
4127 |
+ avalue[i] = pgr;
|
yann@402
|
4128 |
+ pgr++;
|
yann@402
|
4129 |
+ }
|
yann@402
|
4130 |
+ }
|
yann@402
|
4131 |
+#if defined(__SH4__)
|
yann@402
|
4132 |
+ else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
|
yann@402
|
4133 |
+ {
|
yann@402
|
4134 |
+ if (freg + 1 >= NFREGARG)
|
yann@402
|
4135 |
+ continue;
|
yann@402
|
4136 |
+ freg = (freg + 1) & ~1;
|
yann@402
|
4137 |
+ freg += 2;
|
yann@402
|
4138 |
+ avalue[i] = pfr;
|
yann@402
|
4139 |
+ pfr += 2;
|
yann@402
|
4140 |
+ }
|
yann@402
|
4141 |
+#endif
|
yann@402
|
4142 |
+ else
|
yann@402
|
4143 |
+ {
|
yann@402
|
4144 |
+ int n = (z + sizeof (int) - 1) / sizeof (int);
|
yann@402
|
4145 |
+#if defined(__SH4__)
|
yann@402
|
4146 |
+ if (greg + n - 1 >= NGREGARG)
|
yann@402
|
4147 |
+ continue;
|
yann@402
|
4148 |
+ greg += n;
|
yann@402
|
4149 |
+#else
|
yann@402
|
4150 |
+ if (greg >= NGREGARG)
|
yann@402
|
4151 |
+ continue;
|
yann@402
|
4152 |
+ else if (greg + n - 1 >= NGREGARG)
|
yann@402
|
4153 |
+ greg = NGREGARG;
|
yann@402
|
4154 |
+ else
|
yann@402
|
4155 |
+ greg += n;
|
yann@402
|
4156 |
+#endif
|
yann@402
|
4157 |
+ avalue[i] = pgr;
|
yann@402
|
4158 |
+ pgr += n;
|
yann@402
|
4159 |
+ }
|
yann@402
|
4160 |
+ }
|
yann@402
|
4161 |
+
|
yann@402
|
4162 |
+ greg = ireg;
|
yann@402
|
4163 |
+#if defined(__SH4__)
|
yann@402
|
4164 |
+ freg = 0;
|
yann@402
|
4165 |
+#endif
|
yann@402
|
4166 |
+
|
yann@402
|
4167 |
+ for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++)
|
yann@402
|
4168 |
+ {
|
yann@402
|
4169 |
+ size_t z;
|
yann@402
|
4170 |
+
|
yann@402
|
4171 |
+ z = (*p_arg)->size;
|
yann@402
|
4172 |
+ if (z < sizeof(int))
|
yann@402
|
4173 |
+ {
|
yann@402
|
4174 |
+ if (greg++ < NGREGARG)
|
yann@402
|
4175 |
+ continue;
|
yann@402
|
4176 |
+
|
yann@402
|
4177 |
+ z = sizeof(int);
|
yann@402
|
4178 |
+ switch ((*p_arg)->type)
|
yann@402
|
4179 |
+ {
|
yann@402
|
4180 |
+ case FFI_TYPE_SINT8:
|
yann@402
|
4181 |
+ case FFI_TYPE_UINT8:
|
yann@402
|
4182 |
+ avalue[i] = (((char *)pst) + OFS_INT8);
|
yann@402
|
4183 |
+ break;
|
yann@402
|
4184 |
+
|
yann@402
|
4185 |
+ case FFI_TYPE_SINT16:
|
yann@402
|
4186 |
+ case FFI_TYPE_UINT16:
|
yann@402
|
4187 |
+ avalue[i] = (((char *)pst) + OFS_INT16);
|
yann@402
|
4188 |
+ break;
|
yann@402
|
4189 |
+
|
yann@402
|
4190 |
+ case FFI_TYPE_STRUCT:
|
yann@402
|
4191 |
+ avalue[i] = pst;
|
yann@402
|
4192 |
+ break;
|
yann@402
|
4193 |
+
|
yann@402
|
4194 |
+ default:
|
yann@402
|
4195 |
+ FFI_ASSERT(0);
|
yann@402
|
4196 |
+ }
|
yann@402
|
4197 |
+ pst++;
|
yann@402
|
4198 |
+ }
|
yann@402
|
4199 |
+ else if (z == sizeof(int))
|
yann@402
|
4200 |
+ {
|
yann@402
|
4201 |
+#if defined(__SH4__)
|
yann@402
|
4202 |
+ if ((*p_arg)->type == FFI_TYPE_FLOAT)
|
yann@402
|
4203 |
+ {
|
yann@402
|
4204 |
+ if (freg++ < NFREGARG)
|
yann@402
|
4205 |
+ continue;
|
yann@402
|
4206 |
+ }
|
yann@402
|
4207 |
+ else
|
yann@402
|
4208 |
+#endif
|
yann@402
|
4209 |
+ {
|
yann@402
|
4210 |
+ if (greg++ < NGREGARG)
|
yann@402
|
4211 |
+ continue;
|
yann@402
|
4212 |
+ }
|
yann@402
|
4213 |
+ avalue[i] = pst;
|
yann@402
|
4214 |
+ pst++;
|
yann@402
|
4215 |
+ }
|
yann@402
|
4216 |
+#if defined(__SH4__)
|
yann@402
|
4217 |
+ else if ((*p_arg)->type == FFI_TYPE_DOUBLE)
|
yann@402
|
4218 |
+ {
|
yann@402
|
4219 |
+ if (freg + 1 < NFREGARG)
|
yann@402
|
4220 |
+ {
|
yann@402
|
4221 |
+ freg = (freg + 1) & ~1;
|
yann@402
|
4222 |
+ freg += 2;
|
yann@402
|
4223 |
+ continue;
|
yann@402
|
4224 |
+ }
|
yann@402
|
4225 |
+ avalue[i] = pst;
|
yann@402
|
4226 |
+ pst += 2;
|
yann@402
|
4227 |
+ }
|
yann@402
|
4228 |
+#endif
|
yann@402
|
4229 |
+ else
|
yann@402
|
4230 |
+ {
|
yann@402
|
4231 |
+ int n = (z + sizeof (int) - 1) / sizeof (int);
|
yann@402
|
4232 |
+ if (greg + n - 1 < NGREGARG)
|
yann@402
|
4233 |
+ {
|
yann@402
|
4234 |
+ greg += n;
|
yann@402
|
4235 |
+ continue;
|
yann@402
|
4236 |
+ }
|
yann@402
|
4237 |
+#if (! defined(__SH4__))
|
yann@402
|
4238 |
+ else if (greg < NGREGARG)
|
yann@402
|
4239 |
+ {
|
yann@402
|
4240 |
+ greg = NGREGARG;
|
yann@402
|
4241 |
+ continue;
|
yann@402
|
4242 |
+ }
|
yann@402
|
4243 |
+#endif
|
yann@402
|
4244 |
+ avalue[i] = pst;
|
yann@402
|
4245 |
+ pst += n;
|
yann@402
|
4246 |
+ }
|
yann@402
|
4247 |
+ }
|
yann@402
|
4248 |
+
|
yann@402
|
4249 |
+ (closure->fun) (cif, rvalue, avalue, closure->user_data);
|
yann@402
|
4250 |
+
|
yann@402
|
4251 |
+ /* Tell ffi_closure_osf how to perform return type promotions. */
|
yann@402
|
4252 |
+ return cif->rtype->type;
|
yann@402
|
4253 |
+}
|
yann@402
|
4254 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/sysv.S gcc/libffi/src/sh/sysv.S
|
yann@402
|
4255 |
--- gcc-3.2.2.orig/libffi/src/sh/sysv.S Thu Jan 1 09:00:00 1970
|
yann@402
|
4256 |
+++ gcc/libffi/src/sh/sysv.S Tue Dec 17 03:22:48 2002
|
yann@402
|
4257 |
@@ -0,0 +1,773 @@
|
yann@402
|
4258 |
+/* -----------------------------------------------------------------------
|
yann@402
|
4259 |
+ sysv.S - Copyright (c) 2002 Kaz Kojima
|
yann@402
|
4260 |
+
|
yann@402
|
4261 |
+ SuperH Foreign Function Interface
|
yann@402
|
4262 |
+
|
yann@402
|
4263 |
+ Permission is hereby granted, free of charge, to any person obtaining
|
yann@402
|
4264 |
+ a copy of this software and associated documentation files (the
|
yann@402
|
4265 |
+ ``Software''), to deal in the Software without restriction, including
|
yann@402
|
4266 |
+ without limitation the rights to use, copy, modify, merge, publish,
|
yann@402
|
4267 |
+ distribute, sublicense, and/or sell copies of the Software, and to
|
yann@402
|
4268 |
+ permit persons to whom the Software is furnished to do so, subject to
|
yann@402
|
4269 |
+ the following conditions:
|
yann@402
|
4270 |
+
|
yann@402
|
4271 |
+ The above copyright notice and this permission notice shall be included
|
yann@402
|
4272 |
+ in all copies or substantial portions of the Software.
|
yann@402
|
4273 |
+
|
yann@402
|
4274 |
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
yann@402
|
4275 |
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
yann@402
|
4276 |
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
yann@402
|
4277 |
+ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
yann@402
|
4278 |
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
yann@402
|
4279 |
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
yann@402
|
4280 |
+ OTHER DEALINGS IN THE SOFTWARE.
|
yann@402
|
4281 |
+ ----------------------------------------------------------------------- */
|
yann@402
|
4282 |
+
|
yann@402
|
4283 |
+#define LIBFFI_ASM
|
yann@402
|
4284 |
+#include <ffi.h>
|
yann@402
|
4285 |
+#ifdef HAVE_MACHINE_ASM_H
|
yann@402
|
4286 |
+#include <machine/asm.h>
|
yann@402
|
4287 |
+#else
|
yann@402
|
4288 |
+/* XXX these lose for some platforms, I'm sure. */
|
yann@402
|
4289 |
+#define CNAME(x) x
|
yann@402
|
4290 |
+#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
|
yann@402
|
4291 |
+#endif
|
yann@402
|
4292 |
+
|
yann@402
|
4293 |
+#if defined(__HITACHI__)
|
yann@402
|
4294 |
+#define STRUCT_VALUE_ADDRESS_WITH_ARG 1
|
yann@402
|
4295 |
+#else
|
yann@402
|
4296 |
+#define STRUCT_VALUE_ADDRESS_WITH_ARG 0
|
yann@402
|
4297 |
+#endif
|
yann@402
|
4298 |
+
|
yann@402
|
4299 |
+.text
|
yann@402
|
4300 |
+
|
yann@402
|
4301 |
+ # r4: ffi_prep_args
|
yann@402
|
4302 |
+ # r5: &ecif
|
yann@402
|
4303 |
+ # r6: bytes
|
yann@402
|
4304 |
+ # r7: flags
|
yann@402
|
4305 |
+ # sp+0: rvalue
|
yann@402
|
4306 |
+ # sp+4: fn
|
yann@402
|
4307 |
+
|
yann@402
|
4308 |
+ # This assumes we are using gas.
|
yann@402
|
4309 |
+ENTRY(ffi_call_SYSV)
|
yann@402
|
4310 |
+ # Save registers
|
yann@402
|
4311 |
+.LFB1:
|
yann@402
|
4312 |
+ mov.l r8,@-r15
|
yann@402
|
4313 |
+.LCFI0:
|
yann@402
|
4314 |
+ mov.l r9,@-r15
|
yann@402
|
4315 |
+.LCFI1:
|
yann@402
|
4316 |
+ mov.l r10,@-r15
|
yann@402
|
4317 |
+.LCFI2:
|
yann@402
|
4318 |
+ mov.l r12,@-r15
|
yann@402
|
4319 |
+.LCFI3:
|
yann@402
|
4320 |
+ mov.l r14,@-r15
|
yann@402
|
4321 |
+.LCFI4:
|
yann@402
|
4322 |
+ sts.l pr,@-r15
|
yann@402
|
4323 |
+.LCFI5:
|
yann@402
|
4324 |
+ mov r15,r14
|
yann@402
|
4325 |
+.LCFI6:
|
yann@402
|
4326 |
+#if defined(__SH4__)
|
yann@402
|
4327 |
+ mov r6,r8
|
yann@402
|
4328 |
+ mov r7,r9
|
yann@402
|
4329 |
+
|
yann@402
|
4330 |
+ sub r6,r15
|
yann@402
|
4331 |
+ add #-16,r15
|
yann@402
|
4332 |
+ mov #~7,r0
|
yann@402
|
4333 |
+ and r0,r15
|
yann@402
|
4334 |
+
|
yann@402
|
4335 |
+ mov r4,r0
|
yann@402
|
4336 |
+ jsr @r0
|
yann@402
|
4337 |
+ mov r15,r4
|
yann@402
|
4338 |
+
|
yann@402
|
4339 |
+ mov r9,r1
|
yann@402
|
4340 |
+ shlr8 r9
|
yann@402
|
4341 |
+ shlr8 r9
|
yann@402
|
4342 |
+ shlr8 r9
|
yann@402
|
4343 |
+
|
yann@402
|
4344 |
+ mov #FFI_TYPE_STRUCT,r2
|
yann@402
|
4345 |
+ cmp/eq r2,r9
|
yann@402
|
4346 |
+ bf 1f
|
yann@402
|
4347 |
+#if STRUCT_VALUE_ADDRESS_WITH_ARG
|
yann@402
|
4348 |
+ mov.l @r15+,r4
|
yann@402
|
4349 |
+ bra 2f
|
yann@402
|
4350 |
+ mov #5,r2
|
yann@402
|
4351 |
+#else
|
yann@402
|
4352 |
+ mov.l @r15+,r10
|
yann@402
|
4353 |
+#endif
|
yann@402
|
4354 |
+1:
|
yann@402
|
4355 |
+ mov #4,r2
|
yann@402
|
4356 |
+2:
|
yann@402
|
4357 |
+ mov #4,r3
|
yann@402
|
4358 |
+
|
yann@402
|
4359 |
+L_pass:
|
yann@402
|
4360 |
+ cmp/pl r8
|
yann@402
|
4361 |
+ bf L_call_it
|
yann@402
|
4362 |
+
|
yann@402
|
4363 |
+ mov r1,r0
|
yann@402
|
4364 |
+ and #3,r0
|
yann@402
|
4365 |
+
|
yann@402
|
4366 |
+L_pass_d:
|
yann@402
|
4367 |
+ cmp/eq #FFI_TYPE_DOUBLE,r0
|
yann@402
|
4368 |
+ bf L_pass_f
|
yann@402
|
4369 |
+
|
yann@402
|
4370 |
+ mov r3,r0
|
yann@402
|
4371 |
+ and #1,r0
|
yann@402
|
4372 |
+ tst r0,r0
|
yann@402
|
4373 |
+ bt 1f
|
yann@402
|
4374 |
+ add #1,r3
|
yann@402
|
4375 |
+1:
|
yann@402
|
4376 |
+ mov r15,r0
|
yann@402
|
4377 |
+ and #7,r0
|
yann@402
|
4378 |
+ tst r0,r0
|
yann@402
|
4379 |
+ bt 2f
|
yann@402
|
4380 |
+ add #4,r15
|
yann@402
|
4381 |
+2:
|
yann@402
|
4382 |
+ mov #12,r0
|
yann@402
|
4383 |
+ cmp/hs r0,r3
|
yann@402
|
4384 |
+ bt/s 3f
|
yann@402
|
4385 |
+ shlr2 r1
|
yann@402
|
4386 |
+ bsr L_pop_d
|
yann@402
|
4387 |
+ nop
|
yann@402
|
4388 |
+3:
|
yann@402
|
4389 |
+ add #2,r3
|
yann@402
|
4390 |
+ bra L_pass
|
yann@402
|
4391 |
+ add #-8,r8
|
yann@402
|
4392 |
+
|
yann@402
|
4393 |
+L_pop_d:
|
yann@402
|
4394 |
+ mov r3,r0
|
yann@402
|
4395 |
+ add r0,r0
|
yann@402
|
4396 |
+ add r3,r0
|
yann@402
|
4397 |
+ add #-12,r0
|
yann@402
|
4398 |
+ braf r0
|
yann@402
|
4399 |
+ nop
|
yann@402
|
4400 |
+#ifdef __LITTLE_ENDIAN__
|
yann@402
|
4401 |
+ fmov.s @r15+,fr5
|
yann@402
|
4402 |
+ rts
|
yann@402
|
4403 |
+ fmov.s @r15+,fr4
|
yann@402
|
4404 |
+ fmov.s @r15+,fr7
|
yann@402
|
4405 |
+ rts
|
yann@402
|
4406 |
+ fmov.s @r15+,fr6
|
yann@402
|
4407 |
+ fmov.s @r15+,fr9
|
yann@402
|
4408 |
+ rts
|
yann@402
|
4409 |
+ fmov.s @r15+,fr8
|
yann@402
|
4410 |
+ fmov.s @r15+,fr11
|
yann@402
|
4411 |
+ rts
|
yann@402
|
4412 |
+ fmov.s @r15+,fr10
|
yann@402
|
4413 |
+#else
|
yann@402
|
4414 |
+ fmov.s @r15+,fr4
|
yann@402
|
4415 |
+ rts
|
yann@402
|
4416 |
+ fmov.s @r15+,fr5
|
yann@402
|
4417 |
+ fmov.s @r15+,fr6
|
yann@402
|
4418 |
+ rts
|
yann@402
|
4419 |
+ fmov.s @r15+,fr7
|
yann@402
|
4420 |
+ fmov.s @r15+,fr8
|
yann@402
|
4421 |
+ rts
|
yann@402
|
4422 |
+ fmov.s @r15+,fr9
|
yann@402
|
4423 |
+ fmov.s @r15+,fr10
|
yann@402
|
4424 |
+ rts
|
yann@402
|
4425 |
+ fmov.s @r15+,fr11
|
yann@402
|
4426 |
+#endif
|
yann@402
|
4427 |
+
|
yann@402
|
4428 |
+L_pass_f:
|
yann@402
|
4429 |
+ cmp/eq #FFI_TYPE_FLOAT,r0
|
yann@402
|
4430 |
+ bf L_pass_i
|
yann@402
|
4431 |
+
|
yann@402
|
4432 |
+ mov #12,r0
|
yann@402
|
4433 |
+ cmp/hs r0,r3
|
yann@402
|
4434 |
+ bt/s 2f
|
yann@402
|
4435 |
+ shlr2 r1
|
yann@402
|
4436 |
+ bsr L_pop_f
|
yann@402
|
4437 |
+ nop
|
yann@402
|
4438 |
+2:
|
yann@402
|
4439 |
+ add #1,r3
|
yann@402
|
4440 |
+ bra L_pass
|
yann@402
|
4441 |
+ add #-4,r8
|
yann@402
|
4442 |
+
|
yann@402
|
4443 |
+L_pop_f:
|
yann@402
|
4444 |
+ mov r3,r0
|
yann@402
|
4445 |
+ shll2 r0
|
yann@402
|
4446 |
+ add #-16,r0
|
yann@402
|
4447 |
+ braf r0
|
yann@402
|
4448 |
+ nop
|
yann@402
|
4449 |
+#ifdef __LITTLE_ENDIAN__
|
yann@402
|
4450 |
+ rts
|
yann@402
|
4451 |
+ fmov.s @r15+,fr5
|
yann@402
|
4452 |
+ rts
|
yann@402
|
4453 |
+ fmov.s @r15+,fr4
|
yann@402
|
4454 |
+ rts
|
yann@402
|
4455 |
+ fmov.s @r15+,fr7
|
yann@402
|
4456 |
+ rts
|
yann@402
|
4457 |
+ fmov.s @r15+,fr6
|
yann@402
|
4458 |
+ rts
|
yann@402
|
4459 |
+ fmov.s @r15+,fr9
|
yann@402
|
4460 |
+ rts
|
yann@402
|
4461 |
+ fmov.s @r15+,fr8
|
yann@402
|
4462 |
+ rts
|
yann@402
|
4463 |
+ fmov.s @r15+,fr11
|
yann@402
|
4464 |
+ rts
|
yann@402
|
4465 |
+ fmov.s @r15+,fr10
|
yann@402
|
4466 |
+#else
|
yann@402
|
4467 |
+ rts
|
yann@402
|
4468 |
+ fmov.s @r15+,fr4
|
yann@402
|
4469 |
+ rts
|
yann@402
|
4470 |
+ fmov.s @r15+,fr5
|
yann@402
|
4471 |
+ rts
|
yann@402
|
4472 |
+ fmov.s @r15+,fr6
|
yann@402
|
4473 |
+ rts
|
yann@402
|
4474 |
+ fmov.s @r15+,fr7
|
yann@402
|
4475 |
+ rts
|
yann@402
|
4476 |
+ fmov.s @r15+,fr8
|
yann@402
|
4477 |
+ rts
|
yann@402
|
4478 |
+ fmov.s @r15+,fr9
|
yann@402
|
4479 |
+ rts
|
yann@402
|
4480 |
+ fmov.s @r15+,fr10
|
yann@402
|
4481 |
+ rts
|
yann@402
|
4482 |
+ fmov.s @r15+,fr11
|
yann@402
|
4483 |
+#endif
|
yann@402
|
4484 |
+
|
yann@402
|
4485 |
+L_pass_i:
|
yann@402
|
4486 |
+ cmp/eq #FFI_TYPE_INT,r0
|
yann@402
|
4487 |
+ bf L_call_it
|
yann@402
|
4488 |
+
|
yann@402
|
4489 |
+ mov #8,r0
|
yann@402
|
4490 |
+ cmp/hs r0,r2
|
yann@402
|
4491 |
+ bt/s 2f
|
yann@402
|
4492 |
+ shlr2 r1
|
yann@402
|
4493 |
+ bsr L_pop_i
|
yann@402
|
4494 |
+ nop
|
yann@402
|
4495 |
+2:
|
yann@402
|
4496 |
+ add #1,r2
|
yann@402
|
4497 |
+ bra L_pass
|
yann@402
|
4498 |
+ add #-4,r8
|
yann@402
|
4499 |
+
|
yann@402
|
4500 |
+L_pop_i:
|
yann@402
|
4501 |
+ mov r2,r0
|
yann@402
|
4502 |
+ shll2 r0
|
yann@402
|
4503 |
+ add #-16,r0
|
yann@402
|
4504 |
+ braf r0
|
yann@402
|
4505 |
+ nop
|
yann@402
|
4506 |
+ rts
|
yann@402
|
4507 |
+ mov.l @r15+,r4
|
yann@402
|
4508 |
+ rts
|
yann@402
|
4509 |
+ mov.l @r15+,r5
|
yann@402
|
4510 |
+ rts
|
yann@402
|
4511 |
+ mov.l @r15+,r6
|
yann@402
|
4512 |
+ rts
|
yann@402
|
4513 |
+ mov.l @r15+,r7
|
yann@402
|
4514 |
+
|
yann@402
|
4515 |
+L_call_it:
|
yann@402
|
4516 |
+ # call function
|
yann@402
|
4517 |
+#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
|
yann@402
|
4518 |
+ mov r10, r2
|
yann@402
|
4519 |
+#endif
|
yann@402
|
4520 |
+ mov.l @(28,r14),r1
|
yann@402
|
4521 |
+ jsr @r1
|
yann@402
|
4522 |
+ nop
|
yann@402
|
4523 |
+
|
yann@402
|
4524 |
+L_ret_d:
|
yann@402
|
4525 |
+ mov #FFI_TYPE_DOUBLE,r2
|
yann@402
|
4526 |
+ cmp/eq r2,r9
|
yann@402
|
4527 |
+ bf L_ret_ll
|
yann@402
|
4528 |
+
|
yann@402
|
4529 |
+ mov.l @(24,r14),r1
|
yann@402
|
4530 |
+#ifdef __LITTLE_ENDIAN__
|
yann@402
|
4531 |
+ fmov.s fr1,@r1
|
yann@402
|
4532 |
+ add #4,r1
|
yann@402
|
4533 |
+ bra L_epilogue
|
yann@402
|
4534 |
+ fmov.s fr0,@r1
|
yann@402
|
4535 |
+#else
|
yann@402
|
4536 |
+ fmov.s fr0,@r1
|
yann@402
|
4537 |
+ add #4,r1
|
yann@402
|
4538 |
+ bra L_epilogue
|
yann@402
|
4539 |
+ fmov.s fr1,@r1
|
yann@402
|
4540 |
+#endif
|
yann@402
|
4541 |
+
|
yann@402
|
4542 |
+L_ret_ll:
|
yann@402
|
4543 |
+ mov #FFI_TYPE_SINT64,r2
|
yann@402
|
4544 |
+ cmp/eq r2,r9
|
yann@402
|
4545 |
+ bt/s 1f
|
yann@402
|
4546 |
+ mov #FFI_TYPE_UINT64,r2
|
yann@402
|
4547 |
+ cmp/eq r2,r9
|
yann@402
|
4548 |
+ bf L_ret_f
|
yann@402
|
4549 |
+
|
yann@402
|
4550 |
+1:
|
yann@402
|
4551 |
+ mov.l @(24,r14),r2
|
yann@402
|
4552 |
+ mov.l r0,@r2
|
yann@402
|
4553 |
+ bra L_epilogue
|
yann@402
|
4554 |
+ mov.l r1,@(4,r2)
|
yann@402
|
4555 |
+
|
yann@402
|
4556 |
+L_ret_f:
|
yann@402
|
4557 |
+ mov #FFI_TYPE_FLOAT,r2
|
yann@402
|
4558 |
+ cmp/eq r2,r9
|
yann@402
|
4559 |
+ bf L_ret_i
|
yann@402
|
4560 |
+
|
yann@402
|
4561 |
+ mov.l @(24,r14),r1
|
yann@402
|
4562 |
+ bra L_epilogue
|
yann@402
|
4563 |
+ fmov.s fr0,@r1
|
yann@402
|
4564 |
+
|
yann@402
|
4565 |
+L_ret_i:
|
yann@402
|
4566 |
+ mov #FFI_TYPE_INT,r2
|
yann@402
|
4567 |
+ cmp/eq r2,r9
|
yann@402
|
4568 |
+ bf L_epilogue
|
yann@402
|
4569 |
+
|
yann@402
|
4570 |
+ mov.l @(24,r14),r1
|
yann@402
|
4571 |
+ bra L_epilogue
|
yann@402
|
4572 |
+ mov.l r0,@r1
|
yann@402
|
4573 |
+
|
yann@402
|
4574 |
+L_epilogue:
|
yann@402
|
4575 |
+ # Remove the space we pushed for the args
|
yann@402
|
4576 |
+ mov r14,r15
|
yann@402
|
4577 |
+
|
yann@402
|
4578 |
+ lds.l @r15+,pr
|
yann@402
|
4579 |
+ mov.l @r15+,r14
|
yann@402
|
4580 |
+ mov.l @r15+,r12
|
yann@402
|
4581 |
+ mov.l @r15+,r10
|
yann@402
|
4582 |
+ mov.l @r15+,r9
|
yann@402
|
4583 |
+ rts
|
yann@402
|
4584 |
+ mov.l @r15+,r8
|
yann@402
|
4585 |
+#else
|
yann@402
|
4586 |
+ mov r6,r8
|
yann@402
|
4587 |
+ mov r7,r9
|
yann@402
|
4588 |
+
|
yann@402
|
4589 |
+ sub r6,r15
|
yann@402
|
4590 |
+ add #-16,r15
|
yann@402
|
4591 |
+ mov #~7,r0
|
yann@402
|
4592 |
+ and r0,r15
|
yann@402
|
4593 |
+
|
yann@402
|
4594 |
+ mov r4,r0
|
yann@402
|
4595 |
+ jsr @r0
|
yann@402
|
4596 |
+ mov r15,r4
|
yann@402
|
4597 |
+
|
yann@402
|
4598 |
+ mov r9,r3
|
yann@402
|
4599 |
+ shlr8 r9
|
yann@402
|
4600 |
+ shlr8 r9
|
yann@402
|
4601 |
+ shlr8 r9
|
yann@402
|
4602 |
+
|
yann@402
|
4603 |
+ mov #FFI_TYPE_STRUCT,r2
|
yann@402
|
4604 |
+ cmp/eq r2,r9
|
yann@402
|
4605 |
+ bf 1f
|
yann@402
|
4606 |
+#if STRUCT_VALUE_ADDRESS_WITH_ARG
|
yann@402
|
4607 |
+ mov.l @r15+,r4
|
yann@402
|
4608 |
+ bra 2f
|
yann@402
|
4609 |
+ mov #5,r2
|
yann@402
|
4610 |
+#else
|
yann@402
|
4611 |
+ mov.l @r15+,r10
|
yann@402
|
4612 |
+#endif
|
yann@402
|
4613 |
+1:
|
yann@402
|
4614 |
+ mov #4,r2
|
yann@402
|
4615 |
+2:
|
yann@402
|
4616 |
+
|
yann@402
|
4617 |
+L_pass:
|
yann@402
|
4618 |
+ cmp/pl r8
|
yann@402
|
4619 |
+ bf L_call_it
|
yann@402
|
4620 |
+
|
yann@402
|
4621 |
+ mov r3,r0
|
yann@402
|
4622 |
+ and #3,r0
|
yann@402
|
4623 |
+
|
yann@402
|
4624 |
+L_pass_d:
|
yann@402
|
4625 |
+ cmp/eq #FFI_TYPE_DOUBLE,r0
|
yann@402
|
4626 |
+ bf L_pass_i
|
yann@402
|
4627 |
+
|
yann@402
|
4628 |
+ mov r15,r0
|
yann@402
|
4629 |
+ and #7,r0
|
yann@402
|
4630 |
+ tst r0,r0
|
yann@402
|
4631 |
+ bt 1f
|
yann@402
|
4632 |
+ add #4,r15
|
yann@402
|
4633 |
+1:
|
yann@402
|
4634 |
+ mov #8,r0
|
yann@402
|
4635 |
+ cmp/hs r0,r2
|
yann@402
|
4636 |
+ bt/s 2f
|
yann@402
|
4637 |
+ shlr2 r3
|
yann@402
|
4638 |
+ bsr L_pop_d
|
yann@402
|
4639 |
+ nop
|
yann@402
|
4640 |
+2:
|
yann@402
|
4641 |
+ add #2,r2
|
yann@402
|
4642 |
+ bra L_pass
|
yann@402
|
4643 |
+ add #-8,r8
|
yann@402
|
4644 |
+
|
yann@402
|
4645 |
+L_pop_d:
|
yann@402
|
4646 |
+ mov r2,r0
|
yann@402
|
4647 |
+ add r0,r0
|
yann@402
|
4648 |
+ add r2,r0
|
yann@402
|
4649 |
+ add #-12,r0
|
yann@402
|
4650 |
+ add r0,r0
|
yann@402
|
4651 |
+ braf r0
|
yann@402
|
4652 |
+ nop
|
yann@402
|
4653 |
+ mov.l @r15+,r4
|
yann@402
|
4654 |
+ rts
|
yann@402
|
4655 |
+ mov.l @r15+,r5
|
yann@402
|
4656 |
+ mov.l @r15+,r5
|
yann@402
|
4657 |
+ rts
|
yann@402
|
4658 |
+ mov.l @r15+,r6
|
yann@402
|
4659 |
+ mov.l @r15+,r6
|
yann@402
|
4660 |
+ rts
|
yann@402
|
4661 |
+ mov.l @r15+,r7
|
yann@402
|
4662 |
+ rts
|
yann@402
|
4663 |
+ mov.l @r15+,r7
|
yann@402
|
4664 |
+
|
yann@402
|
4665 |
+L_pass_i:
|
yann@402
|
4666 |
+ mov #8,r0
|
yann@402
|
4667 |
+ cmp/hs r0,r2
|
yann@402
|
4668 |
+ bt/s 2f
|
yann@402
|
4669 |
+ shlr2 r3
|
yann@402
|
4670 |
+ bsr L_pop_i
|
yann@402
|
4671 |
+ nop
|
yann@402
|
4672 |
+2:
|
yann@402
|
4673 |
+ add #1,r2
|
yann@402
|
4674 |
+ bra L_pass
|
yann@402
|
4675 |
+ add #-4,r8
|
yann@402
|
4676 |
+
|
yann@402
|
4677 |
+L_pop_i:
|
yann@402
|
4678 |
+ mov r2,r0
|
yann@402
|
4679 |
+ shll2 r0
|
yann@402
|
4680 |
+ add #-16,r0
|
yann@402
|
4681 |
+ braf r0
|
yann@402
|
4682 |
+ nop
|
yann@402
|
4683 |
+ rts
|
yann@402
|
4684 |
+ mov.l @r15+,r4
|
yann@402
|
4685 |
+ rts
|
yann@402
|
4686 |
+ mov.l @r15+,r5
|
yann@402
|
4687 |
+ rts
|
yann@402
|
4688 |
+ mov.l @r15+,r6
|
yann@402
|
4689 |
+ rts
|
yann@402
|
4690 |
+ mov.l @r15+,r7
|
yann@402
|
4691 |
+
|
yann@402
|
4692 |
+L_call_it:
|
yann@402
|
4693 |
+ # call function
|
yann@402
|
4694 |
+#if (! STRUCT_VALUE_ADDRESS_WITH_ARG)
|
yann@402
|
4695 |
+ mov r10, r2
|
yann@402
|
4696 |
+#endif
|
yann@402
|
4697 |
+ mov.l @(28,r14),r1
|
yann@402
|
4698 |
+ jsr @r1
|
yann@402
|
4699 |
+ nop
|
yann@402
|
4700 |
+
|
yann@402
|
4701 |
+L_ret_d:
|
yann@402
|
4702 |
+ mov #FFI_TYPE_DOUBLE,r2
|
yann@402
|
4703 |
+ cmp/eq r2,r9
|
yann@402
|
4704 |
+ bf L_ret_ll
|
yann@402
|
4705 |
+
|
yann@402
|
4706 |
+ mov.l @(24,r14),r2
|
yann@402
|
4707 |
+ mov.l r0,@r2
|
yann@402
|
4708 |
+ bra L_epilogue
|
yann@402
|
4709 |
+ mov.l r1,@(4,r2)
|
yann@402
|
4710 |
+
|
yann@402
|
4711 |
+L_ret_ll:
|
yann@402
|
4712 |
+ mov #FFI_TYPE_SINT64,r2
|
yann@402
|
4713 |
+ cmp/eq r2,r9
|
yann@402
|
4714 |
+ bt/s 1f
|
yann@402
|
4715 |
+ mov #FFI_TYPE_UINT64,r2
|
yann@402
|
4716 |
+ cmp/eq r2,r9
|
yann@402
|
4717 |
+ bf L_ret_i
|
yann@402
|
4718 |
+
|
yann@402
|
4719 |
+1:
|
yann@402
|
4720 |
+ mov.l @(24,r14),r2
|
yann@402
|
4721 |
+ mov.l r0,@r2
|
yann@402
|
4722 |
+ bra L_epilogue
|
yann@402
|
4723 |
+ mov.l r1,@(4,r2)
|
yann@402
|
4724 |
+
|
yann@402
|
4725 |
+L_ret_i:
|
yann@402
|
4726 |
+ mov #FFI_TYPE_FLOAT,r2
|
yann@402
|
4727 |
+ cmp/eq r2,r9
|
yann@402
|
4728 |
+ bt 1f
|
yann@402
|
4729 |
+ mov #FFI_TYPE_INT,r2
|
yann@402
|
4730 |
+ cmp/eq r2,r9
|
yann@402
|
4731 |
+ bf L_epilogue
|
yann@402
|
4732 |
+1:
|
yann@402
|
4733 |
+ mov.l @(24,r14),r1
|
yann@402
|
4734 |
+ bra L_epilogue
|
yann@402
|
4735 |
+ mov.l r0,@r1
|
yann@402
|
4736 |
+
|
yann@402
|
4737 |
+L_epilogue:
|
yann@402
|
4738 |
+ # Remove the space we pushed for the args
|
yann@402
|
4739 |
+ mov r14,r15
|
yann@402
|
4740 |
+
|
yann@402
|
4741 |
+ lds.l @r15+,pr
|
yann@402
|
4742 |
+ mov.l @r15+,r14
|
yann@402
|
4743 |
+ mov.l @r15+,r12
|
yann@402
|
4744 |
+ mov.l @r15+,r10
|
yann@402
|
4745 |
+ mov.l @r15+,r9
|
yann@402
|
4746 |
+ rts
|
yann@402
|
4747 |
+ mov.l @r15+,r8
|
yann@402
|
4748 |
+#endif
|
yann@402
|
4749 |
+.LFE1:
|
yann@402
|
4750 |
+.ffi_call_SYSV_end:
|
yann@402
|
4751 |
+ .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
|
yann@402
|
4752 |
+
|
yann@402
|
4753 |
+.globl ffi_closure_helper_SYSV
|
yann@402
|
4754 |
+
|
yann@402
|
4755 |
+ENTRY(ffi_closure_SYSV)
|
yann@402
|
4756 |
+.LFB2:
|
yann@402
|
4757 |
+ mov.l r14,@-r15
|
yann@402
|
4758 |
+.LCFI7:
|
yann@402
|
4759 |
+ sts.l pr,@-r15
|
yann@402
|
4760 |
+
|
yann@402
|
4761 |
+ /* Stack layout:
|
yann@402
|
4762 |
+ ...
|
yann@402
|
4763 |
+ 32 bytes (floating register parameters, SH-4 only)
|
yann@402
|
4764 |
+ 16 bytes (register parameters)
|
yann@402
|
4765 |
+ 4 bytes (result)
|
yann@402
|
4766 |
+ 4 bytes (5th arg)
|
yann@402
|
4767 |
+ <- new stack pointer
|
yann@402
|
4768 |
+ */
|
yann@402
|
4769 |
+.LCFI8:
|
yann@402
|
4770 |
+#if defined(__SH4__)
|
yann@402
|
4771 |
+ add #-56,r15
|
yann@402
|
4772 |
+#else
|
yann@402
|
4773 |
+ add #-24,r15
|
yann@402
|
4774 |
+#endif
|
yann@402
|
4775 |
+.LCFI9:
|
yann@402
|
4776 |
+ mov r15,r14
|
yann@402
|
4777 |
+.LCFIA:
|
yann@402
|
4778 |
+ mov r14,r1
|
yann@402
|
4779 |
+ add #24,r1
|
yann@402
|
4780 |
+ mov.l r7,@-r1
|
yann@402
|
4781 |
+ mov.l r6,@-r1
|
yann@402
|
4782 |
+ mov.l r5,@-r1
|
yann@402
|
4783 |
+ mov.l r4,@-r1
|
yann@402
|
4784 |
+ mov r1,r6
|
yann@402
|
4785 |
+
|
yann@402
|
4786 |
+#if defined(__SH4__)
|
yann@402
|
4787 |
+ mov r14,r1
|
yann@402
|
4788 |
+ add #56,r1
|
yann@402
|
4789 |
+#ifdef __LITTLE_ENDIAN__
|
yann@402
|
4790 |
+ fmov.s fr10,@-r1
|
yann@402
|
4791 |
+ fmov.s fr11,@-r1
|
yann@402
|
4792 |
+ fmov.s fr8,@-r1
|
yann@402
|
4793 |
+ fmov.s fr9,@-r1
|
yann@402
|
4794 |
+ fmov.s fr6,@-r1
|
yann@402
|
4795 |
+ fmov.s fr7,@-r1
|
yann@402
|
4796 |
+ fmov.s fr4,@-r1
|
yann@402
|
4797 |
+ fmov.s fr5,@-r1
|
yann@402
|
4798 |
+#else
|
yann@402
|
4799 |
+ fmov.s fr11,@-r1
|
yann@402
|
4800 |
+ fmov.s fr10,@-r1
|
yann@402
|
4801 |
+ fmov.s fr9,@-r1
|
yann@402
|
4802 |
+ fmov.s fr8,@-r1
|
yann@402
|
4803 |
+ fmov.s fr7,@-r1
|
yann@402
|
4804 |
+ fmov.s fr6,@-r1
|
yann@402
|
4805 |
+ fmov.s fr5,@-r1
|
yann@402
|
4806 |
+ fmov.s fr4,@-r1
|
yann@402
|
4807 |
+#endif
|
yann@402
|
4808 |
+ mov r1,r7
|
yann@402
|
4809 |
+#endif
|
yann@402
|
4810 |
+
|
yann@402
|
4811 |
+ mov r14,r1
|
yann@402
|
4812 |
+ add #4,r1
|
yann@402
|
4813 |
+ mov r1,r5
|
yann@402
|
4814 |
+
|
yann@402
|
4815 |
+ mov r14,r1
|
yann@402
|
4816 |
+#if defined(__SH4__)
|
yann@402
|
4817 |
+ add #64,r1
|
yann@402
|
4818 |
+#else
|
yann@402
|
4819 |
+ add #32,r1
|
yann@402
|
4820 |
+#endif
|
yann@402
|
4821 |
+ mov.l r1,@r14
|
yann@402
|
4822 |
+
|
yann@402
|
4823 |
+ mov.l L_helper,r0
|
yann@402
|
4824 |
+ jsr @r0
|
yann@402
|
4825 |
+ mov r3,r4
|
yann@402
|
4826 |
+
|
yann@402
|
4827 |
+ shll r0
|
yann@402
|
4828 |
+ mov r0,r1
|
yann@402
|
4829 |
+ mova L_table,r0
|
yann@402
|
4830 |
+ add r1,r0
|
yann@402
|
4831 |
+ mov.w @r0,r0
|
yann@402
|
4832 |
+ mov r14,r2
|
yann@402
|
4833 |
+ braf r0
|
yann@402
|
4834 |
+ add #4,r2
|
yann@402
|
4835 |
+0:
|
yann@402
|
4836 |
+ .align 2
|
yann@402
|
4837 |
+L_helper:
|
yann@402
|
4838 |
+ .long ffi_closure_helper_SYSV
|
yann@402
|
4839 |
+L_table:
|
yann@402
|
4840 |
+ .short L_case_v - 0b /* FFI_TYPE_VOID */
|
yann@402
|
4841 |
+ .short L_case_i - 0b /* FFI_TYPE_INT */
|
yann@402
|
4842 |
+#if defined(__SH4__)
|
yann@402
|
4843 |
+ .short L_case_f - 0b /* FFI_TYPE_FLOAT */
|
yann@402
|
4844 |
+ .short L_case_d - 0b /* FFI_TYPE_DOUBLE */
|
yann@402
|
4845 |
+ .short L_case_d - 0b /* FFI_TYPE_LONGDOUBLE */
|
yann@402
|
4846 |
+#else
|
yann@402
|
4847 |
+ .short L_case_i - 0b /* FFI_TYPE_FLOAT */
|
yann@402
|
4848 |
+ .short L_case_ll - 0b /* FFI_TYPE_DOUBLE */
|
yann@402
|
4849 |
+ .short L_case_ll - 0b /* FFI_TYPE_LONGDOUBLE */
|
yann@402
|
4850 |
+#endif
|
yann@402
|
4851 |
+ .short L_case_uq - 0b /* FFI_TYPE_UINT8 */
|
yann@402
|
4852 |
+ .short L_case_q - 0b /* FFI_TYPE_SINT8 */
|
yann@402
|
4853 |
+ .short L_case_uh - 0b /* FFI_TYPE_UINT16 */
|
yann@402
|
4854 |
+ .short L_case_h - 0b /* FFI_TYPE_SINT16 */
|
yann@402
|
4855 |
+ .short L_case_i - 0b /* FFI_TYPE_UINT32 */
|
yann@402
|
4856 |
+ .short L_case_i - 0b /* FFI_TYPE_SINT32 */
|
yann@402
|
4857 |
+ .short L_case_ll - 0b /* FFI_TYPE_UINT64 */
|
yann@402
|
4858 |
+ .short L_case_ll - 0b /* FFI_TYPE_SINT64 */
|
yann@402
|
4859 |
+ .short L_case_v - 0b /* FFI_TYPE_STRUCT */
|
yann@402
|
4860 |
+ .short L_case_i - 0b /* FFI_TYPE_POINTER */
|
yann@402
|
4861 |
+
|
yann@402
|
4862 |
+#if defined(__SH4__)
|
yann@402
|
4863 |
+L_case_d:
|
yann@402
|
4864 |
+#ifdef __LITTLE_ENDIAN__
|
yann@402
|
4865 |
+ fmov.s @r2+,fr1
|
yann@402
|
4866 |
+ bra L_case_v
|
yann@402
|
4867 |
+ fmov.s @r2,fr0
|
yann@402
|
4868 |
+#else
|
yann@402
|
4869 |
+ fmov.s @r2+,fr0
|
yann@402
|
4870 |
+ bra L_case_v
|
yann@402
|
4871 |
+ fmov.s @r2,fr1
|
yann@402
|
4872 |
+#endif
|
yann@402
|
4873 |
+
|
yann@402
|
4874 |
+L_case_f:
|
yann@402
|
4875 |
+ bra L_case_v
|
yann@402
|
4876 |
+ fmov.s @r2,fr0
|
yann@402
|
4877 |
+#endif
|
yann@402
|
4878 |
+
|
yann@402
|
4879 |
+L_case_ll:
|
yann@402
|
4880 |
+ mov.l @r2+,r0
|
yann@402
|
4881 |
+ bra L_case_v
|
yann@402
|
4882 |
+ mov.l @r2,r1
|
yann@402
|
4883 |
+
|
yann@402
|
4884 |
+L_case_i:
|
yann@402
|
4885 |
+ bra L_case_v
|
yann@402
|
4886 |
+ mov.l @r2,r0
|
yann@402
|
4887 |
+
|
yann@402
|
4888 |
+L_case_q:
|
yann@402
|
4889 |
+#ifdef __LITTLE_ENDIAN__
|
yann@402
|
4890 |
+#else
|
yann@402
|
4891 |
+ add #3,r2
|
yann@402
|
4892 |
+#endif
|
yann@402
|
4893 |
+ bra L_case_v
|
yann@402
|
4894 |
+ mov.b @r2,r0
|
yann@402
|
4895 |
+
|
yann@402
|
4896 |
+L_case_uq:
|
yann@402
|
4897 |
+#ifdef __LITTLE_ENDIAN__
|
yann@402
|
4898 |
+#else
|
yann@402
|
4899 |
+ add #3,r2
|
yann@402
|
4900 |
+#endif
|
yann@402
|
4901 |
+ mov.b @r2,r0
|
yann@402
|
4902 |
+ bra L_case_v
|
yann@402
|
4903 |
+ extu.b r0,r0
|
yann@402
|
4904 |
+
|
yann@402
|
4905 |
+L_case_h:
|
yann@402
|
4906 |
+#ifdef __LITTLE_ENDIAN__
|
yann@402
|
4907 |
+#else
|
yann@402
|
4908 |
+ add #2,r2
|
yann@402
|
4909 |
+#endif
|
yann@402
|
4910 |
+ bra L_case_v
|
yann@402
|
4911 |
+ mov.w @r2,r0
|
yann@402
|
4912 |
+
|
yann@402
|
4913 |
+L_case_uh:
|
yann@402
|
4914 |
+#ifdef __LITTLE_ENDIAN__
|
yann@402
|
4915 |
+#else
|
yann@402
|
4916 |
+ add #2,r2
|
yann@402
|
4917 |
+#endif
|
yann@402
|
4918 |
+ mov.w @r2,r0
|
yann@402
|
4919 |
+ extu.w r0,r0
|
yann@402
|
4920 |
+ /* fall through */
|
yann@402
|
4921 |
+
|
yann@402
|
4922 |
+L_case_v:
|
yann@402
|
4923 |
+#if defined(__SH4__)
|
yann@402
|
4924 |
+ add #56,r15
|
yann@402
|
4925 |
+#else
|
yann@402
|
4926 |
+ add #24,r15
|
yann@402
|
4927 |
+#endif
|
yann@402
|
4928 |
+ lds.l @r15+,pr
|
yann@402
|
4929 |
+ rts
|
yann@402
|
4930 |
+ mov.l @r15+,r14
|
yann@402
|
4931 |
+.LFE2:
|
yann@402
|
4932 |
+.ffi_closure_SYSV_end:
|
yann@402
|
4933 |
+ .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
|
yann@402
|
4934 |
+
|
yann@402
|
4935 |
+ .section ".eh_frame","aw",@progbits
|
yann@402
|
4936 |
+__FRAME_BEGIN__:
|
yann@402
|
4937 |
+ .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */
|
yann@402
|
4938 |
+.LSCIE1:
|
yann@402
|
4939 |
+ .4byte 0x0 /* CIE Identifier Tag */
|
yann@402
|
4940 |
+ .byte 0x1 /* CIE Version */
|
yann@402
|
4941 |
+ .byte 0x0 /* CIE Augmentation */
|
yann@402
|
4942 |
+ .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */
|
yann@402
|
4943 |
+ .byte 0x7c /* sleb128 -4; CIE Data Alignment Factor */
|
yann@402
|
4944 |
+ .byte 0x11 /* CIE RA Column */
|
yann@402
|
4945 |
+ .byte 0xc /* DW_CFA_def_cfa */
|
yann@402
|
4946 |
+ .byte 0xf /* uleb128 0xf */
|
yann@402
|
4947 |
+ .byte 0x0 /* uleb128 0x0 */
|
yann@402
|
4948 |
+ .align 2
|
yann@402
|
4949 |
+.LECIE1:
|
yann@402
|
4950 |
+.LSFDE1:
|
yann@402
|
4951 |
+ .4byte .LEFDE1-.LASFDE1 /* FDE Length */
|
yann@402
|
4952 |
+.LASFDE1:
|
yann@402
|
4953 |
+ .4byte .LASFDE1-__FRAME_BEGIN__ /* FDE CIE offset */
|
yann@402
|
4954 |
+ .4byte .LFB1 /* FDE initial location */
|
yann@402
|
4955 |
+ .4byte .LFE1-.LFB1 /* FDE address range */
|
yann@402
|
4956 |
+ .byte 0x4 /* DW_CFA_advance_loc4 */
|
yann@402
|
4957 |
+ .4byte .LCFI0-.LFB1
|
yann@402
|
4958 |
+ .byte 0xe /* DW_CFA_def_cfa_offset */
|
yann@402
|
4959 |
+ .byte 0x4 /* uleb128 0x4 */
|
yann@402
|
4960 |
+ .byte 0x4 /* DW_CFA_advance_loc4 */
|
yann@402
|
4961 |
+ .4byte .LCFI1-.LCFI0
|
yann@402
|
4962 |
+ .byte 0xe /* DW_CFA_def_cfa_offset */
|
yann@402
|
4963 |
+ .byte 0x8 /* uleb128 0x4 */
|
yann@402
|
4964 |
+ .byte 0x4 /* DW_CFA_advance_loc4 */
|
yann@402
|
4965 |
+ .4byte .LCFI2-.LCFI1
|
yann@402
|
4966 |
+ .byte 0xe /* DW_CFA_def_cfa_offset */
|
yann@402
|
4967 |
+ .byte 0xc /* uleb128 0x4 */
|
yann@402
|
4968 |
+ .byte 0x4 /* DW_CFA_advance_loc4 */
|
yann@402
|
4969 |
+ .4byte .LCFI3-.LCFI2
|
yann@402
|
4970 |
+ .byte 0xe /* DW_CFA_def_cfa_offset */
|
yann@402
|
4971 |
+ .byte 0x10 /* uleb128 0x4 */
|
yann@402
|
4972 |
+ .byte 0x4 /* DW_CFA_advance_loc4 */
|
yann@402
|
4973 |
+ .4byte .LCFI4-.LCFI3
|
yann@402
|
4974 |
+ .byte 0xe /* DW_CFA_def_cfa_offset */
|
yann@402
|
4975 |
+ .byte 0x14 /* uleb128 0x4 */
|
yann@402
|
4976 |
+ .byte 0x4 /* DW_CFA_advance_loc4 */
|
yann@402
|
4977 |
+ .4byte .LCFI5-.LCFI4
|
yann@402
|
4978 |
+ .byte 0xe /* DW_CFA_def_cfa_offset */
|
yann@402
|
4979 |
+ .byte 0x18 /* uleb128 0x4 */
|
yann@402
|
4980 |
+ .byte 0x91 /* DW_CFA_offset, column 0x11 */
|
yann@402
|
4981 |
+ .byte 0x6 /* uleb128 0x6 */
|
yann@402
|
4982 |
+ .byte 0x8e /* DW_CFA_offset, column 0xe */
|
yann@402
|
4983 |
+ .byte 0x5 /* uleb128 0x5 */
|
yann@402
|
4984 |
+ .byte 0x8c /* DW_CFA_offset, column 0xc */
|
yann@402
|
4985 |
+ .byte 0x4 /* uleb128 0x4 */
|
yann@402
|
4986 |
+ .byte 0x8a /* DW_CFA_offset, column 0xa */
|
yann@402
|
4987 |
+ .byte 0x3 /* uleb128 0x3 */
|
yann@402
|
4988 |
+ .byte 0x89 /* DW_CFA_offset, column 0x9 */
|
yann@402
|
4989 |
+ .byte 0x2 /* uleb128 0x2 */
|
yann@402
|
4990 |
+ .byte 0x88 /* DW_CFA_offset, column 0x8 */
|
yann@402
|
4991 |
+ .byte 0x1 /* uleb128 0x1 */
|
yann@402
|
4992 |
+ .byte 0x4 /* DW_CFA_advance_loc4 */
|
yann@402
|
4993 |
+ .4byte .LCFI6-.LCFI5
|
yann@402
|
4994 |
+ .byte 0xd /* DW_CFA_def_cfa_register */
|
yann@402
|
4995 |
+ .byte 0xe /* uleb128 0xe */
|
yann@402
|
4996 |
+ .align 2
|
yann@402
|
4997 |
+.LEFDE1:
|
yann@402
|
4998 |
+
|
yann@402
|
4999 |
+.LSFDE3:
|
yann@402
|
5000 |
+ .4byte .LEFDE3-.LASFDE3 /* FDE Length */
|
yann@402
|
5001 |
+.LASFDE3:
|
yann@402
|
5002 |
+ .4byte .LASFDE3-__FRAME_BEGIN__ /* FDE CIE offset */
|
yann@402
|
5003 |
+ .4byte .LFB2 /* FDE initial location */
|
yann@402
|
5004 |
+ .4byte .LFE2-.LFB2 /* FDE address range */
|
yann@402
|
5005 |
+ .byte 0x4 /* DW_CFA_advance_loc4 */
|
yann@402
|
5006 |
+ .4byte .LCFI7-.LFB2
|
yann@402
|
5007 |
+ .byte 0xe /* DW_CFA_def_cfa_offset */
|
yann@402
|
5008 |
+ .byte 0x4 /* uleb128 0x4 */
|
yann@402
|
5009 |
+ .byte 0x4 /* DW_CFA_advance_loc4 */
|
yann@402
|
5010 |
+ .4byte .LCFI8-.LCFI7
|
yann@402
|
5011 |
+ .byte 0xe /* DW_CFA_def_cfa_offset */
|
yann@402
|
5012 |
+ .byte 0x8 /* uleb128 0x8 */
|
yann@402
|
5013 |
+ .byte 0x4 /* DW_CFA_advance_loc4 */
|
yann@402
|
5014 |
+ .4byte .LCFI9-.LCFI8
|
yann@402
|
5015 |
+ .byte 0xe /* DW_CFA_def_cfa_offset */
|
yann@402
|
5016 |
+#if defined(__SH4__)
|
yann@402
|
5017 |
+ .byte 8+56 /* uleb128 8+56 */
|
yann@402
|
5018 |
+#else
|
yann@402
|
5019 |
+ .byte 8+24 /* uleb128 8+24 */
|
yann@402
|
5020 |
+#endif
|
yann@402
|
5021 |
+ .byte 0x91 /* DW_CFA_offset, column 0x11 */
|
yann@402
|
5022 |
+ .byte 0x2
|
yann@402
|
5023 |
+ .byte 0x8e /* DW_CFA_offset, column 0xe */
|
yann@402
|
5024 |
+ .byte 0x1
|
yann@402
|
5025 |
+ .byte 0x4 /* DW_CFA_advance_loc4 */
|
yann@402
|
5026 |
+ .4byte .LCFIA-.LCFI9
|
yann@402
|
5027 |
+ .byte 0xd /* DW_CFA_def_cfa_register */
|
yann@402
|
5028 |
+ .byte 0xe /* uleb128 0xe */
|
yann@402
|
5029 |
+ .align 2
|
yann@402
|
5030 |
+.LEFDE3:
|
yann@402
|
5031 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/ffi.c gcc/libffi/src/sparc/ffi.c
|
yann@402
|
5032 |
--- gcc-3.2.2.orig/libffi/src/sparc/ffi.c Sat Mar 3 07:21:23 2001
|
yann@402
|
5033 |
+++ gcc/libffi/src/sparc/ffi.c Sat Jan 4 08:08:56 2003
|
yann@402
|
5034 |
@@ -1,5 +1,5 @@
|
yann@402
|
5035 |
/* -----------------------------------------------------------------------
|
yann@402
|
5036 |
- ffi.c - Copyright (c) 1996 Cygnus Solutions
|
yann@402
|
5037 |
+ ffi.c - Copyright (c) 1996, 2003 Cygnus Solutions
|
yann@402
|
5038 |
|
yann@402
|
5039 |
Sparc Foreign Function Interface
|
yann@402
|
5040 |
|
yann@402
|
5041 |
@@ -28,20 +28,22 @@
|
yann@402
|
5042 |
|
yann@402
|
5043 |
#include <stdlib.h>
|
yann@402
|
5044 |
|
yann@402
|
5045 |
+#ifdef SPARC64
|
yann@402
|
5046 |
+extern void ffi_closure_v9(void);
|
yann@402
|
5047 |
+#else
|
yann@402
|
5048 |
+extern void ffi_closure_v8(void);
|
yann@402
|
5049 |
+#endif
|
yann@402
|
5050 |
+
|
yann@402
|
5051 |
/* ffi_prep_args is called by the assembly routine once stack space
|
yann@402
|
5052 |
has been allocated for the function's arguments */
|
yann@402
|
5053 |
|
yann@402
|
5054 |
void ffi_prep_args_v8(char *stack, extended_cif *ecif)
|
yann@402
|
5055 |
{
|
yann@402
|
5056 |
int i;
|
yann@402
|
5057 |
- int tmp;
|
yann@402
|
5058 |
- int avn;
|
yann@402
|
5059 |
void **p_argv;
|
yann@402
|
5060 |
char *argp;
|
yann@402
|
5061 |
ffi_type **p_arg;
|
yann@402
|
5062 |
|
yann@402
|
5063 |
- tmp = 0;
|
yann@402
|
5064 |
-
|
yann@402
|
5065 |
/* Skip 16 words for the window save area */
|
yann@402
|
5066 |
argp = stack + 16*sizeof(int);
|
yann@402
|
5067 |
|
yann@402
|
5068 |
@@ -66,18 +68,12 @@
|
yann@402
|
5069 |
((int*)argp)[5] = 0;
|
yann@402
|
5070 |
#endif
|
yann@402
|
5071 |
|
yann@402
|
5072 |
- avn = ecif->cif->nargs;
|
yann@402
|
5073 |
p_argv = ecif->avalue;
|
yann@402
|
5074 |
|
yann@402
|
5075 |
- for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
|
yann@402
|
5076 |
- i && avn;
|
yann@402
|
5077 |
- i--, p_arg++)
|
yann@402
|
5078 |
+ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++)
|
yann@402
|
5079 |
{
|
yann@402
|
5080 |
size_t z;
|
yann@402
|
5081 |
|
yann@402
|
5082 |
- if (avn)
|
yann@402
|
5083 |
- {
|
yann@402
|
5084 |
- avn--;
|
yann@402
|
5085 |
if ((*p_arg)->type == FFI_TYPE_STRUCT
|
yann@402
|
5086 |
#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|
yann@402
|
5087 |
|| (*p_arg)->type == FFI_TYPE_LONGDOUBLE
|
yann@402
|
5088 |
@@ -122,7 +118,6 @@
|
yann@402
|
5089 |
}
|
yann@402
|
5090 |
p_argv++;
|
yann@402
|
5091 |
argp += z;
|
yann@402
|
5092 |
- }
|
yann@402
|
5093 |
}
|
yann@402
|
5094 |
|
yann@402
|
5095 |
return;
|
yann@402
|
5096 |
@@ -420,3 +415,101 @@
|
yann@402
|
5097 |
}
|
yann@402
|
5098 |
|
yann@402
|
5099 |
}
|
yann@402
|
5100 |
+
|
yann@402
|
5101 |
+ffi_status
|
yann@402
|
5102 |
+ffi_prep_closure (ffi_closure* closure,
|
yann@402
|
5103 |
+ ffi_cif* cif,
|
yann@402
|
5104 |
+ void (*fun)(ffi_cif*, void*, void**, void*),
|
yann@402
|
5105 |
+ void *user_data)
|
yann@402
|
5106 |
+{
|
yann@402
|
5107 |
+ unsigned int *tramp = (unsigned int *) &closure->tramp[0];
|
yann@402
|
5108 |
+ unsigned long fn;
|
yann@402
|
5109 |
+ unsigned long ctx = (unsigned long) closure;
|
yann@402
|
5110 |
+
|
yann@402
|
5111 |
+#ifdef SPARC64
|
yann@402
|
5112 |
+ /* Trampoline address is equal to the closure address. We take advantage
|
yann@402
|
5113 |
+ of that to reduce the trampoline size by 8 bytes. */
|
yann@402
|
5114 |
+ FFI_ASSERT (cif->abi == FFI_V9);
|
yann@402
|
5115 |
+ fn = (unsigned long) ffi_closure_v9;
|
yann@402
|
5116 |
+ tramp[0] = 0x83414000; /* rd %pc, %g1 */
|
yann@402
|
5117 |
+ tramp[1] = 0xca586010; /* ldx [%g1+16], %g5 */
|
yann@402
|
5118 |
+ tramp[2] = 0x81c14000; /* jmp %g5 */
|
yann@402
|
5119 |
+ tramp[3] = 0x01000000; /* nop */
|
yann@402
|
5120 |
+ *((unsigned long *) &tramp[4]) = fn;
|
yann@402
|
5121 |
+#else
|
yann@402
|
5122 |
+ FFI_ASSERT (cif->abi == FFI_V8);
|
yann@402
|
5123 |
+ fn = (unsigned long) ffi_closure_v8;
|
yann@402
|
5124 |
+ tramp[0] = 0x03000000 | fn >> 10; /* sethi %hi(fn), %g1 */
|
yann@402
|
5125 |
+ tramp[1] = 0x05000000 | ctx >> 10; /* sethi %hi(ctx), %g2 */
|
yann@402
|
5126 |
+ tramp[2] = 0x81c06000 | (fn & 0x3ff); /* jmp %g1+%lo(fn) */
|
yann@402
|
5127 |
+ tramp[3] = 0x8410a000 | (ctx & 0x3ff);/* or %g2, %lo(ctx) */
|
yann@402
|
5128 |
+#endif
|
yann@402
|
5129 |
+
|
yann@402
|
5130 |
+ closure->cif = cif;
|
yann@402
|
5131 |
+ closure->fun = fun;
|
yann@402
|
5132 |
+ closure->user_data = user_data;
|
yann@402
|
5133 |
+
|
yann@402
|
5134 |
+ /* Flush the Icache. FIXME: alignment isn't certain, assume 8 bytes */
|
yann@402
|
5135 |
+#ifdef SPARC64
|
yann@402
|
5136 |
+ asm volatile ("flush %0" : : "r" (closure) : "memory");
|
yann@402
|
5137 |
+ asm volatile ("flush %0" : : "r" (((char *) closure) + 8) : "memory");
|
yann@402
|
5138 |
+#else
|
yann@402
|
5139 |
+ asm volatile ("iflush %0" : : "r" (closure) : "memory");
|
yann@402
|
5140 |
+ asm volatile ("iflush %0" : : "r" (((char *) closure) + 8) : "memory");
|
yann@402
|
5141 |
+#endif
|
yann@402
|
5142 |
+
|
yann@402
|
5143 |
+ return FFI_OK;
|
yann@402
|
5144 |
+}
|
yann@402
|
5145 |
+
|
yann@402
|
5146 |
+int
|
yann@402
|
5147 |
+ffi_closure_sparc_inner(ffi_closure *closure,
|
yann@402
|
5148 |
+ void *rvalue, unsigned long *gpr, double *fpr)
|
yann@402
|
5149 |
+{
|
yann@402
|
5150 |
+ ffi_cif *cif;
|
yann@402
|
5151 |
+ void **avalue;
|
yann@402
|
5152 |
+ ffi_type **arg_types;
|
yann@402
|
5153 |
+ int i, avn, argn;
|
yann@402
|
5154 |
+
|
yann@402
|
5155 |
+ cif = closure->cif;
|
yann@402
|
5156 |
+ avalue = alloca(cif->nargs * sizeof(void *));
|
yann@402
|
5157 |
+
|
yann@402
|
5158 |
+ argn = 0;
|
yann@402
|
5159 |
+
|
yann@402
|
5160 |
+ /* Copy the caller's structure return address to that the closure
|
yann@402
|
5161 |
+ returns the data directly to the caller. */
|
yann@402
|
5162 |
+ if (cif->flags == FFI_TYPE_STRUCT)
|
yann@402
|
5163 |
+ {
|
yann@402
|
5164 |
+ rvalue = (void *) gpr[0];
|
yann@402
|
5165 |
+ argn = 1;
|
yann@402
|
5166 |
+ }
|
yann@402
|
5167 |
+
|
yann@402
|
5168 |
+ i = 0;
|
yann@402
|
5169 |
+ avn = cif->nargs;
|
yann@402
|
5170 |
+ arg_types = cif->arg_types;
|
yann@402
|
5171 |
+
|
yann@402
|
5172 |
+ /* Grab the addresses of the arguments from the stack frame. */
|
yann@402
|
5173 |
+ while (i < avn)
|
yann@402
|
5174 |
+ {
|
yann@402
|
5175 |
+ /* Assume big-endian. FIXME */
|
yann@402
|
5176 |
+ argn += ALIGN(arg_types[i]->size, SIZEOF_ARG) / SIZEOF_ARG;
|
yann@402
|
5177 |
+
|
yann@402
|
5178 |
+#ifdef SPARC64
|
yann@402
|
5179 |
+ if (i < 6 && (arg_types[i]->type == FFI_TYPE_FLOAT
|
yann@402
|
5180 |
+ || arg_types[i]->type == FFI_TYPE_DOUBLE
|
yann@402
|
5181 |
+#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE
|
yann@402
|
5182 |
+ || arg_types[i]->type == FFI_TYPE_LONGDOUBLE
|
yann@402
|
5183 |
+#endif
|
yann@402
|
5184 |
+ ))
|
yann@402
|
5185 |
+ avalue[i] = ((char *) &fpr[argn]) - arg_types[i]->size;
|
yann@402
|
5186 |
+ else
|
yann@402
|
5187 |
+#endif
|
yann@402
|
5188 |
+ avalue[i] = ((char *) &gpr[argn]) - arg_types[i]->size;
|
yann@402
|
5189 |
+ i++;
|
yann@402
|
5190 |
+ }
|
yann@402
|
5191 |
+
|
yann@402
|
5192 |
+ /* Invoke the closure. */
|
yann@402
|
5193 |
+ (closure->fun) (cif, rvalue, avalue, closure->user_data);
|
yann@402
|
5194 |
+
|
yann@402
|
5195 |
+ /* Tell ffi_closure_sparc how to perform return type promotions. */
|
yann@402
|
5196 |
+ return cif->rtype->type;
|
yann@402
|
5197 |
+}
|
yann@402
|
5198 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/v8.S gcc/libffi/src/sparc/v8.S
|
yann@402
|
5199 |
--- gcc-3.2.2.orig/libffi/src/sparc/v8.S Mon Apr 29 05:12:04 2002
|
yann@402
|
5200 |
+++ gcc/libffi/src/sparc/v8.S Sat Jan 4 08:08:56 2003
|
yann@402
|
5201 |
@@ -1,5 +1,5 @@
|
yann@402
|
5202 |
/* -----------------------------------------------------------------------
|
yann@402
|
5203 |
- v8.S - Copyright (c) 1996, 1997 Cygnus Solutions
|
yann@402
|
5204 |
+ v8.S - Copyright (c) 1996, 1997, 2003 Cygnus Solutions
|
yann@402
|
5205 |
|
yann@402
|
5206 |
Sparc Foreign Function Interface
|
yann@402
|
5207 |
|
yann@402
|
5208 |
@@ -94,6 +94,72 @@
|
yann@402
|
5209 |
.ffi_call_V8_end:
|
yann@402
|
5210 |
.size ffi_call_V8,.ffi_call_V8_end-ffi_call_V8
|
yann@402
|
5211 |
|
yann@402
|
5212 |
+
|
yann@402
|
5213 |
+#define STACKFRAME 104 /* 16*4 register window +
|
yann@402
|
5214 |
+ 1*4 struct return +
|
yann@402
|
5215 |
+ 6*4 args backing store +
|
yann@402
|
5216 |
+ 3*4 locals */
|
yann@402
|
5217 |
+
|
yann@402
|
5218 |
+/* ffi_closure_v8(...)
|
yann@402
|
5219 |
+
|
yann@402
|
5220 |
+ Receives the closure argument in %g2. */
|
yann@402
|
5221 |
+
|
yann@402
|
5222 |
+ .text
|
yann@402
|
5223 |
+ .align 8
|
yann@402
|
5224 |
+ .globl ffi_closure_v8
|
yann@402
|
5225 |
+
|
yann@402
|
5226 |
+ffi_closure_v8:
|
yann@402
|
5227 |
+ .register %g2, #scratch
|
yann@402
|
5228 |
+.LLFB2:
|
yann@402
|
5229 |
+ save %sp, -STACKFRAME, %sp
|
yann@402
|
5230 |
+.LLCFI1:
|
yann@402
|
5231 |
+
|
yann@402
|
5232 |
+ ! Store all of the potential argument registers in va_list format.
|
yann@402
|
5233 |
+ st %i0, [%fp+68+0]
|
yann@402
|
5234 |
+ st %i1, [%fp+68+4]
|
yann@402
|
5235 |
+ st %i2, [%fp+68+8]
|
yann@402
|
5236 |
+ st %i3, [%fp+68+12]
|
yann@402
|
5237 |
+ st %i4, [%fp+68+16]
|
yann@402
|
5238 |
+ st %i5, [%fp+68+20]
|
yann@402
|
5239 |
+
|
yann@402
|
5240 |
+ ! Call ffi_closure_sparc_inner to do the bulk of the work.
|
yann@402
|
5241 |
+ mov %g2, %o0
|
yann@402
|
5242 |
+ add %fp, -8, %o1
|
yann@402
|
5243 |
+ add %fp, 68, %o2
|
yann@402
|
5244 |
+ call ffi_closure_sparc_inner
|
yann@402
|
5245 |
+ mov 0, %o3
|
yann@402
|
5246 |
+
|
yann@402
|
5247 |
+ ! Load up the return value in the proper type.
|
yann@402
|
5248 |
+ cmp %o0, FFI_TYPE_VOID
|
yann@402
|
5249 |
+ be done1
|
yann@402
|
5250 |
+
|
yann@402
|
5251 |
+ cmp %o0, FFI_TYPE_FLOAT
|
yann@402
|
5252 |
+ be,a done1
|
yann@402
|
5253 |
+ ld [%fp-8], %f0
|
yann@402
|
5254 |
+
|
yann@402
|
5255 |
+ cmp %o0, FFI_TYPE_DOUBLE
|
yann@402
|
5256 |
+ be,a done1
|
yann@402
|
5257 |
+ ldd [%fp-8], %f0
|
yann@402
|
5258 |
+
|
yann@402
|
5259 |
+ cmp %o0, FFI_TYPE_SINT64
|
yann@402
|
5260 |
+ be,a integer
|
yann@402
|
5261 |
+ ld [%fp-4], %i1
|
yann@402
|
5262 |
+
|
yann@402
|
5263 |
+ cmp %o0, FFI_TYPE_UINT64
|
yann@402
|
5264 |
+ be,a integer
|
yann@402
|
5265 |
+ ld [%fp-4], %i1
|
yann@402
|
5266 |
+
|
yann@402
|
5267 |
+integer:
|
yann@402
|
5268 |
+ ld [%fp-8], %i0
|
yann@402
|
5269 |
+
|
yann@402
|
5270 |
+done1:
|
yann@402
|
5271 |
+ ret
|
yann@402
|
5272 |
+ restore
|
yann@402
|
5273 |
+.LLFE2:
|
yann@402
|
5274 |
+
|
yann@402
|
5275 |
+.ffi_closure_v8_end:
|
yann@402
|
5276 |
+ .size ffi_closure_v8,.ffi_closure_v8_end-ffi_closure_v8
|
yann@402
|
5277 |
+
|
yann@402
|
5278 |
#ifdef SPARC64
|
yann@402
|
5279 |
#define WS 8
|
yann@402
|
5280 |
#define nword xword
|
yann@402
|
5281 |
@@ -148,3 +214,26 @@
|
yann@402
|
5282 |
.byte 0x1f ! uleb128 0x1f
|
yann@402
|
5283 |
.align WS
|
yann@402
|
5284 |
.LLEFDE1:
|
yann@402
|
5285 |
+.LLSFDE2:
|
yann@402
|
5286 |
+ .uaword .LLEFDE2-.LLASFDE2 ! FDE Length
|
yann@402
|
5287 |
+.LLASFDE2:
|
yann@402
|
5288 |
+ .uaword .LLASFDE2-.LLframe1 ! FDE CIE offset
|
yann@402
|
5289 |
+#ifdef HAVE_AS_SPARC_UA_PCREL
|
yann@402
|
5290 |
+ .uaword %r_disp32(.LLFB2)
|
yann@402
|
5291 |
+ .uaword .LLFE2-.LLFB2 ! FDE address range
|
yann@402
|
5292 |
+#else
|
yann@402
|
5293 |
+ .align WS
|
yann@402
|
5294 |
+ .nword .LLFB2
|
yann@402
|
5295 |
+ .uanword .LLFE2-.LLFB2 ! FDE address range
|
yann@402
|
5296 |
+#endif
|
yann@402
|
5297 |
+ .byte 0x0 ! uleb128 0x0; Augmentation size
|
yann@402
|
5298 |
+ .byte 0x4 ! DW_CFA_advance_loc4
|
yann@402
|
5299 |
+ .uaword .LLCFI1-.LLFB2
|
yann@402
|
5300 |
+ .byte 0xd ! DW_CFA_def_cfa_register
|
yann@402
|
5301 |
+ .byte 0x1e ! uleb128 0x1e
|
yann@402
|
5302 |
+ .byte 0x2d ! DW_CFA_GNU_window_save
|
yann@402
|
5303 |
+ .byte 0x9 ! DW_CFA_register
|
yann@402
|
5304 |
+ .byte 0xf ! uleb128 0xf
|
yann@402
|
5305 |
+ .byte 0x1f ! uleb128 0x1f
|
yann@402
|
5306 |
+ .align WS
|
yann@402
|
5307 |
+.LLEFDE2:
|
yann@402
|
5308 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/v9.S gcc/libffi/src/sparc/v9.S
|
yann@402
|
5309 |
--- gcc-3.2.2.orig/libffi/src/sparc/v9.S Mon Apr 29 05:12:04 2002
|
yann@402
|
5310 |
+++ gcc/libffi/src/sparc/v9.S Sat Jan 4 08:08:56 2003
|
yann@402
|
5311 |
@@ -1,5 +1,5 @@
|
yann@402
|
5312 |
/* -----------------------------------------------------------------------
|
yann@402
|
5313 |
- v9.S - Copyright (c) 2000 Cygnus Solutions
|
yann@402
|
5314 |
+ v9.S - Copyright (c) 2000, 2003 Cygnus Solutions
|
yann@402
|
5315 |
|
yann@402
|
5316 |
Sparc 64bit Foreign Function Interface
|
yann@402
|
5317 |
|
yann@402
|
5318 |
@@ -99,7 +99,7 @@
|
yann@402
|
5319 |
cmp %i3, FFI_TYPE_STRUCT
|
yann@402
|
5320 |
be,pn %icc, dostruct
|
yann@402
|
5321 |
|
yann@402
|
5322 |
- cmp %i3, FFI_TYPE_LONGDOUBLE
|
yann@402
|
5323 |
+ cmp %i3, FFI_TYPE_LONGDOUBLE
|
yann@402
|
5324 |
bne,pt %icc, done
|
yann@402
|
5325 |
nop
|
yann@402
|
5326 |
std %f0, [%i4+0]
|
yann@402
|
5327 |
@@ -125,6 +125,88 @@
|
yann@402
|
5328 |
.ffi_call_V9_end:
|
yann@402
|
5329 |
.size ffi_call_V9,.ffi_call_V9_end-ffi_call_V9
|
yann@402
|
5330 |
|
yann@402
|
5331 |
+
|
yann@402
|
5332 |
+#define STACKFRAME 240 /* 16*8 register window +
|
yann@402
|
5333 |
+ 6*8 args backing store +
|
yann@402
|
5334 |
+ 8*8 locals */
|
yann@402
|
5335 |
+#define FP %fp+STACK_BIAS
|
yann@402
|
5336 |
+
|
yann@402
|
5337 |
+/* ffi_closure_v9(...)
|
yann@402
|
5338 |
+
|
yann@402
|
5339 |
+ Receives the closure argument in %g1. */
|
yann@402
|
5340 |
+
|
yann@402
|
5341 |
+ .text
|
yann@402
|
5342 |
+ .align 8
|
yann@402
|
5343 |
+ .globl ffi_closure_v9
|
yann@402
|
5344 |
+
|
yann@402
|
5345 |
+ffi_closure_v9:
|
yann@402
|
5346 |
+.LLFB2:
|
yann@402
|
5347 |
+ save %sp, -STACKFRAME, %sp
|
yann@402
|
5348 |
+.LLCFI1:
|
yann@402
|
5349 |
+
|
yann@402
|
5350 |
+ ! Store all of the potential argument registers in va_list format.
|
yann@402
|
5351 |
+ stx %i0, [FP+128+0]
|
yann@402
|
5352 |
+ stx %i1, [FP+128+8]
|
yann@402
|
5353 |
+ stx %i2, [FP+128+16]
|
yann@402
|
5354 |
+ stx %i3, [FP+128+24]
|
yann@402
|
5355 |
+ stx %i4, [FP+128+32]
|
yann@402
|
5356 |
+ stx %i5, [FP+128+40]
|
yann@402
|
5357 |
+
|
yann@402
|
5358 |
+ ! Store possible floating point argument registers too.
|
yann@402
|
5359 |
+ std %f0, [FP-48]
|
yann@402
|
5360 |
+ std %f2, [FP-40]
|
yann@402
|
5361 |
+ std %f4, [FP-32]
|
yann@402
|
5362 |
+ std %f6, [FP-24]
|
yann@402
|
5363 |
+ std %f8, [FP-16]
|
yann@402
|
5364 |
+ std %f10, [FP-8]
|
yann@402
|
5365 |
+
|
yann@402
|
5366 |
+ ! Call ffi_closure_sparc_inner to do the bulk of the work.
|
yann@402
|
5367 |
+ mov %g1, %o0
|
yann@402
|
5368 |
+ add %fp, STACK_BIAS-64, %o1
|
yann@402
|
5369 |
+ add %fp, STACK_BIAS+128, %o2
|
yann@402
|
5370 |
+ call ffi_closure_sparc_inner
|
yann@402
|
5371 |
+ add %fp, STACK_BIAS-48, %o3
|
yann@402
|
5372 |
+
|
yann@402
|
5373 |
+ ! Load up the return value in the proper type.
|
yann@402
|
5374 |
+ cmp %o0, FFI_TYPE_VOID
|
yann@402
|
5375 |
+ be,pn %icc, done1
|
yann@402
|
5376 |
+
|
yann@402
|
5377 |
+ cmp %o0, FFI_TYPE_FLOAT
|
yann@402
|
5378 |
+ be,a,pn %icc, done1
|
yann@402
|
5379 |
+ ld [FP-64], %f0
|
yann@402
|
5380 |
+
|
yann@402
|
5381 |
+ cmp %o0, FFI_TYPE_DOUBLE
|
yann@402
|
5382 |
+ be,a,pn %icc, done1
|
yann@402
|
5383 |
+ ldd [FP-64], %f0
|
yann@402
|
5384 |
+
|
yann@402
|
5385 |
+ cmp %o0, FFI_TYPE_LONGDOUBLE
|
yann@402
|
5386 |
+ be,a,pn %icc, longdouble1
|
yann@402
|
5387 |
+ ldd [FP-64], %f0
|
yann@402
|
5388 |
+
|
yann@402
|
5389 |
+ cmp %o0, FFI_TYPE_STRUCT
|
yann@402
|
5390 |
+ be,pn %icc, struct1
|
yann@402
|
5391 |
+
|
yann@402
|
5392 |
+ ! FFI_TYPE_UINT64 | FFI_TYPE_SINT64 | FFI_TYPE_POINTER
|
yann@402
|
5393 |
+ ldx [FP-64], %i0
|
yann@402
|
5394 |
+
|
yann@402
|
5395 |
+done1:
|
yann@402
|
5396 |
+ ret
|
yann@402
|
5397 |
+ restore
|
yann@402
|
5398 |
+
|
yann@402
|
5399 |
+struct1:
|
yann@402
|
5400 |
+ ldx [FP-56], %i2
|
yann@402
|
5401 |
+ ret
|
yann@402
|
5402 |
+ restore
|
yann@402
|
5403 |
+
|
yann@402
|
5404 |
+longdouble1:
|
yann@402
|
5405 |
+ ldd [FP-56], %f2
|
yann@402
|
5406 |
+ ret
|
yann@402
|
5407 |
+ restore
|
yann@402
|
5408 |
+.LLFE2:
|
yann@402
|
5409 |
+
|
yann@402
|
5410 |
+.ffi_closure_v9_end:
|
yann@402
|
5411 |
+ .size ffi_closure_v9,.ffi_closure_v9_end-ffi_closure_v9
|
yann@402
|
5412 |
+
|
yann@402
|
5413 |
.section ".eh_frame",#alloc,#write
|
yann@402
|
5414 |
.LLframe1:
|
yann@402
|
5415 |
.uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry
|
yann@402
|
5416 |
@@ -169,5 +251,27 @@
|
yann@402
|
5417 |
.byte 0x1f ! uleb128 0x1f
|
yann@402
|
5418 |
.align 8
|
yann@402
|
5419 |
.LLEFDE1:
|
yann@402
|
5420 |
-
|
yann@402
|
5421 |
+.LLSFDE2:
|
yann@402
|
5422 |
+ .uaword .LLEFDE2-.LLASFDE2 ! FDE Length
|
yann@402
|
5423 |
+.LLASFDE2:
|
yann@402
|
5424 |
+ .uaword .LLASFDE2-.LLframe1 ! FDE CIE offset
|
yann@402
|
5425 |
+#ifdef HAVE_AS_SPARC_UA_PCREL
|
yann@402
|
5426 |
+ .uaword %r_disp32(.LLFB2)
|
yann@402
|
5427 |
+ .uaword .LLFE2-.LLFB2 ! FDE address range
|
yann@402
|
5428 |
+#else
|
yann@402
|
5429 |
+ .align 8
|
yann@402
|
5430 |
+ .xword .LLFB2
|
yann@402
|
5431 |
+ .uaxword .LLFE2-.LLFB2 ! FDE address range
|
yann@402
|
5432 |
+#endif
|
yann@402
|
5433 |
+ .byte 0x0 ! uleb128 0x0; Augmentation size
|
yann@402
|
5434 |
+ .byte 0x4 ! DW_CFA_advance_loc4
|
yann@402
|
5435 |
+ .uaword .LLCFI1-.LLFB2
|
yann@402
|
5436 |
+ .byte 0xd ! DW_CFA_def_cfa_register
|
yann@402
|
5437 |
+ .byte 0x1e ! uleb128 0x1e
|
yann@402
|
5438 |
+ .byte 0x2d ! DW_CFA_GNU_window_save
|
yann@402
|
5439 |
+ .byte 0x9 ! DW_CFA_register
|
yann@402
|
5440 |
+ .byte 0xf ! uleb128 0xf
|
yann@402
|
5441 |
+ .byte 0x1f ! uleb128 0x1f
|
yann@402
|
5442 |
+ .align 8
|
yann@402
|
5443 |
+.LLEFDE2:
|
yann@402
|
5444 |
#endif
|
yann@402
|
5445 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/types.c gcc/libffi/src/types.c
|
yann@402
|
5446 |
--- gcc-3.2.2.orig/libffi/src/types.c Tue Mar 27 11:39:16 2001
|
yann@402
|
5447 |
+++ gcc/libffi/src/types.c Wed Nov 27 07:24:05 2002
|
yann@402
|
5448 |
@@ -42,7 +42,8 @@
|
yann@402
|
5449 |
FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32);
|
yann@402
|
5450 |
FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT);
|
yann@402
|
5451 |
|
yann@402
|
5452 |
-#if defined ALPHA || defined SPARC64
|
yann@402
|
5453 |
+#if defined ALPHA || defined SPARC64 || defined X86_64 || defined S390X \
|
yann@402
|
5454 |
+ || defined IA64
|
yann@402
|
5455 |
|
yann@402
|
5456 |
FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER);
|
yann@402
|
5457 |
|
yann@402
|
5458 |
@@ -52,22 +53,12 @@
|
yann@402
|
5459 |
|
yann@402
|
5460 |
#endif
|
yann@402
|
5461 |
|
yann@402
|
5462 |
-#ifdef X86
|
yann@402
|
5463 |
+#if defined X86 || defined X86_WIN32 || defined ARM || defined M68K
|
yann@402
|
5464 |
|
yann@402
|
5465 |
FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
|
yann@402
|
5466 |
FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
|
yann@402
|
5467 |
|
yann@402
|
5468 |
-#elif defined X86_WIN32
|
yann@402
|
5469 |
-
|
yann@402
|
5470 |
-FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
|
yann@402
|
5471 |
-FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
|
yann@402
|
5472 |
-
|
yann@402
|
5473 |
-#elif defined ARM
|
yann@402
|
5474 |
-
|
yann@402
|
5475 |
-FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
|
yann@402
|
5476 |
-FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
|
yann@402
|
5477 |
-
|
yann@402
|
5478 |
-#elif defined M68K
|
yann@402
|
5479 |
+#elif defined SH
|
yann@402
|
5480 |
|
yann@402
|
5481 |
FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64);
|
yann@402
|
5482 |
FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64);
|
yann@402
|
5483 |
@@ -80,12 +71,7 @@
|
yann@402
|
5484 |
#endif
|
yann@402
|
5485 |
|
yann@402
|
5486 |
|
yann@402
|
5487 |
-#ifdef X86
|
yann@402
|
5488 |
-
|
yann@402
|
5489 |
-FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
|
yann@402
|
5490 |
-FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
|
yann@402
|
5491 |
-
|
yann@402
|
5492 |
-#elif defined X86_WIN32
|
yann@402
|
5493 |
+#if defined X86 || defined X86_WIN32 || defined M68K
|
yann@402
|
5494 |
|
yann@402
|
5495 |
FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
|
yann@402
|
5496 |
FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
|
yann@402
|
5497 |
@@ -95,25 +81,25 @@
|
yann@402
|
5498 |
FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
|
yann@402
|
5499 |
FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE);
|
yann@402
|
5500 |
|
yann@402
|
5501 |
-#elif defined M68K
|
yann@402
|
5502 |
+#elif defined SH
|
yann@402
|
5503 |
|
yann@402
|
5504 |
FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE);
|
yann@402
|
5505 |
-FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE);
|
yann@402
|
5506 |
+FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE);
|
yann@402
|
5507 |
|
yann@402
|
5508 |
#elif defined SPARC
|
yann@402
|
5509 |
|
yann@402
|
5510 |
FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
|
yann@402
|
5511 |
-
|
yann@402
|
5512 |
#ifdef SPARC64
|
yann@402
|
5513 |
-
|
yann@402
|
5514 |
FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE);
|
yann@402
|
5515 |
-
|
yann@402
|
5516 |
#else
|
yann@402
|
5517 |
-
|
yann@402
|
5518 |
FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE);
|
yann@402
|
5519 |
-
|
yann@402
|
5520 |
#endif
|
yann@402
|
5521 |
|
yann@402
|
5522 |
+#elif defined X86_64
|
yann@402
|
5523 |
+
|
yann@402
|
5524 |
+FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
|
yann@402
|
5525 |
+FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE);
|
yann@402
|
5526 |
+
|
yann@402
|
5527 |
#else
|
yann@402
|
5528 |
|
yann@402
|
5529 |
FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE);
|
yann@402
|
5530 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/ffi.c gcc/libffi/src/x86/ffi.c
|
yann@402
|
5531 |
--- gcc-3.2.2.orig/libffi/src/x86/ffi.c Tue May 28 18:22:08 2002
|
yann@402
|
5532 |
+++ gcc/libffi/src/x86/ffi.c Fri Dec 6 10:16:45 2002
|
yann@402
|
5533 |
@@ -1,5 +1,8 @@
|
yann@402
|
5534 |
/* -----------------------------------------------------------------------
|
yann@402
|
5535 |
- ffi.c - Copyright (c) 1996, 1998, 1999 Cygnus Solutions
|
yann@402
|
5536 |
+ ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc.
|
yann@402
|
5537 |
+ Copyright (c) 2002 Ranjit Mathew
|
yann@402
|
5538 |
+ Copyright (c) 2002 Bo Thorsen
|
yann@402
|
5539 |
+ Copyright (c) 2002 Roger Sayle
|
yann@402
|
5540 |
|
yann@402
|
5541 |
x86 Foreign Function Interface
|
yann@402
|
5542 |
|
yann@402
|
5543 |
@@ -23,6 +26,8 @@
|
yann@402
|
5544 |
OTHER DEALINGS IN THE SOFTWARE.
|
yann@402
|
5545 |
----------------------------------------------------------------------- */
|
yann@402
|
5546 |
|
yann@402
|
5547 |
+#ifndef __x86_64__
|
yann@402
|
5548 |
+
|
yann@402
|
5549 |
#include <ffi.h>
|
yann@402
|
5550 |
#include <ffi_common.h>
|
yann@402
|
5551 |
|
yann@402
|
5552 |
@@ -36,12 +41,10 @@
|
yann@402
|
5553 |
/*@=exportheader@*/
|
yann@402
|
5554 |
{
|
yann@402
|
5555 |
register unsigned int i;
|
yann@402
|
5556 |
- register int tmp;
|
yann@402
|
5557 |
register void **p_argv;
|
yann@402
|
5558 |
register char *argp;
|
yann@402
|
5559 |
register ffi_type **p_arg;
|
yann@402
|
5560 |
|
yann@402
|
5561 |
- tmp = 0;
|
yann@402
|
5562 |
argp = stack;
|
yann@402
|
5563 |
|
yann@402
|
5564 |
if (ecif->cif->rtype->type == FFI_TYPE_STRUCT)
|
yann@402
|
5565 |
@@ -148,6 +151,18 @@
|
yann@402
|
5566 |
/*@=declundef@*/
|
yann@402
|
5567 |
/*@=exportheader@*/
|
yann@402
|
5568 |
|
yann@402
|
5569 |
+#ifdef X86_WIN32
|
yann@402
|
5570 |
+/*@-declundef@*/
|
yann@402
|
5571 |
+/*@-exportheader@*/
|
yann@402
|
5572 |
+extern void ffi_call_STDCALL(void (*)(char *, extended_cif *),
|
yann@402
|
5573 |
+ /*@out@*/ extended_cif *,
|
yann@402
|
5574 |
+ unsigned, unsigned,
|
yann@402
|
5575 |
+ /*@out@*/ unsigned *,
|
yann@402
|
5576 |
+ void (*fn)());
|
yann@402
|
5577 |
+/*@=declundef@*/
|
yann@402
|
5578 |
+/*@=exportheader@*/
|
yann@402
|
5579 |
+#endif /* X86_WIN32 */
|
yann@402
|
5580 |
+
|
yann@402
|
5581 |
void ffi_call(/*@dependent@*/ ffi_cif *cif,
|
yann@402
|
5582 |
void (*fn)(),
|
yann@402
|
5583 |
/*@out@*/ void *rvalue,
|
yann@402
|
5584 |
@@ -180,6 +195,14 @@
|
yann@402
|
5585 |
cif->flags, ecif.rvalue, fn);
|
yann@402
|
5586 |
/*@=usedef@*/
|
yann@402
|
5587 |
break;
|
yann@402
|
5588 |
+#ifdef X86_WIN32
|
yann@402
|
5589 |
+ case FFI_STDCALL:
|
yann@402
|
5590 |
+ /*@-usedef@*/
|
yann@402
|
5591 |
+ ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes,
|
yann@402
|
5592 |
+ cif->flags, ecif.rvalue, fn);
|
yann@402
|
5593 |
+ /*@=usedef@*/
|
yann@402
|
5594 |
+ break;
|
yann@402
|
5595 |
+#endif /* X86_WIN32 */
|
yann@402
|
5596 |
default:
|
yann@402
|
5597 |
FFI_ASSERT(0);
|
yann@402
|
5598 |
break;
|
yann@402
|
5599 |
@@ -266,12 +289,10 @@
|
yann@402
|
5600 |
/*@=exportheader@*/
|
yann@402
|
5601 |
{
|
yann@402
|
5602 |
register unsigned int i;
|
yann@402
|
5603 |
- register int tmp;
|
yann@402
|
5604 |
register void **p_argv;
|
yann@402
|
5605 |
register char *argp;
|
yann@402
|
5606 |
register ffi_type **p_arg;
|
yann@402
|
5607 |
|
yann@402
|
5608 |
- tmp = 0;
|
yann@402
|
5609 |
argp = stack;
|
yann@402
|
5610 |
|
yann@402
|
5611 |
if ( cif->rtype->type == FFI_TYPE_STRUCT ) {
|
yann@402
|
5612 |
@@ -281,13 +302,14 @@
|
yann@402
|
5613 |
|
yann@402
|
5614 |
p_argv = avalue;
|
yann@402
|
5615 |
|
yann@402
|
5616 |
- for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++)
|
yann@402
|
5617 |
+ for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++)
|
yann@402
|
5618 |
{
|
yann@402
|
5619 |
size_t z;
|
yann@402
|
5620 |
|
yann@402
|
5621 |
/* Align if necessary */
|
yann@402
|
5622 |
- if (((*p_arg)->alignment - 1) & (unsigned) argp)
|
yann@402
|
5623 |
+ if (((*p_arg)->alignment - 1) & (unsigned) argp) {
|
yann@402
|
5624 |
argp = (char *) ALIGN(argp, (*p_arg)->alignment);
|
yann@402
|
5625 |
+ }
|
yann@402
|
5626 |
|
yann@402
|
5627 |
z = (*p_arg)->size;
|
yann@402
|
5628 |
|
yann@402
|
5629 |
@@ -298,7 +320,7 @@
|
yann@402
|
5630 |
p_argv++;
|
yann@402
|
5631 |
argp += z;
|
yann@402
|
5632 |
}
|
yann@402
|
5633 |
-
|
yann@402
|
5634 |
+
|
yann@402
|
5635 |
return;
|
yann@402
|
5636 |
}
|
yann@402
|
5637 |
|
yann@402
|
5638 |
@@ -449,6 +471,15 @@
|
yann@402
|
5639 |
/*@out@*/ unsigned *,
|
yann@402
|
5640 |
void (*fn)());
|
yann@402
|
5641 |
|
yann@402
|
5642 |
+#ifdef X86_WIN32
|
yann@402
|
5643 |
+extern void
|
yann@402
|
5644 |
+ffi_call_STDCALL(void (*)(char *, extended_cif *),
|
yann@402
|
5645 |
+ /*@out@*/ extended_cif *,
|
yann@402
|
5646 |
+ unsigned, unsigned,
|
yann@402
|
5647 |
+ /*@out@*/ unsigned *,
|
yann@402
|
5648 |
+ void (*fn)());
|
yann@402
|
5649 |
+#endif /* X86_WIN32 */
|
yann@402
|
5650 |
+
|
yann@402
|
5651 |
void
|
yann@402
|
5652 |
ffi_raw_call(/*@dependent@*/ ffi_cif *cif,
|
yann@402
|
5653 |
void (*fn)(),
|
yann@402
|
5654 |
@@ -483,6 +514,14 @@
|
yann@402
|
5655 |
cif->flags, ecif.rvalue, fn);
|
yann@402
|
5656 |
/*@=usedef@*/
|
yann@402
|
5657 |
break;
|
yann@402
|
5658 |
+#ifdef X86_WIN32
|
yann@402
|
5659 |
+ case FFI_STDCALL:
|
yann@402
|
5660 |
+ /*@-usedef@*/
|
yann@402
|
5661 |
+ ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes,
|
yann@402
|
5662 |
+ cif->flags, ecif.rvalue, fn);
|
yann@402
|
5663 |
+ /*@=usedef@*/
|
yann@402
|
5664 |
+ break;
|
yann@402
|
5665 |
+#endif /* X86_WIN32 */
|
yann@402
|
5666 |
default:
|
yann@402
|
5667 |
FFI_ASSERT(0);
|
yann@402
|
5668 |
break;
|
yann@402
|
5669 |
@@ -490,3 +529,5 @@
|
yann@402
|
5670 |
}
|
yann@402
|
5671 |
|
yann@402
|
5672 |
#endif
|
yann@402
|
5673 |
+
|
yann@402
|
5674 |
+#endif /* __x86_64__ */
|
yann@402
|
5675 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/ffi64.c gcc/libffi/src/x86/ffi64.c
|
yann@402
|
5676 |
--- gcc-3.2.2.orig/libffi/src/x86/ffi64.c Thu Jan 1 09:00:00 1970
|
yann@402
|
5677 |
+++ gcc/libffi/src/x86/ffi64.c Wed Jan 29 00:54:28 2003
|
yann@402
|
5678 |
@@ -0,0 +1,706 @@
|
yann@402
|
5679 |
+/* -----------------------------------------------------------------------
|
yann@402
|
5680 |
+ ffi.c - Copyright (c) 2002 Bo Thorsen <bo@suse.de>
|
yann@402
|
5681 |
+
|
yann@402
|
5682 |
+ x86-64 Foreign Function Interface
|
yann@402
|
5683 |
+
|
yann@402
|
5684 |
+ Permission is hereby granted, free of charge, to any person obtaining
|
yann@402
|
5685 |
+ a copy of this software and associated documentation files (the
|
yann@402
|
5686 |
+ ``Software''), to deal in the Software without restriction, including
|
yann@402
|
5687 |
+ without limitation the rights to use, copy, modify, merge, publish,
|
yann@402
|
5688 |
+ distribute, sublicense, and/or sell copies of the Software, and to
|
yann@402
|
5689 |
+ permit persons to whom the Software is furnished to do so, subject to
|
yann@402
|
5690 |
+ the following conditions:
|
yann@402
|
5691 |
+
|
yann@402
|
5692 |
+ The above copyright notice and this permission notice shall be included
|
yann@402
|
5693 |
+ in all copies or substantial portions of the Software.
|
yann@402
|
5694 |
+
|
yann@402
|
5695 |
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
yann@402
|
5696 |
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
yann@402
|
5697 |
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
yann@402
|
5698 |
+ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
yann@402
|
5699 |
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
yann@402
|
5700 |
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
yann@402
|
5701 |
+ OTHER DEALINGS IN THE SOFTWARE.
|
yann@402
|
5702 |
+ ----------------------------------------------------------------------- */
|
yann@402
|
5703 |
+
|
yann@402
|
5704 |
+#include <ffi.h>
|
yann@402
|
5705 |
+#include <ffi_common.h>
|
yann@402
|
5706 |
+
|
yann@402
|
5707 |
+#include <stdlib.h>
|
yann@402
|
5708 |
+#include <stdarg.h>
|
yann@402
|
5709 |
+
|
yann@402
|
5710 |
+/* ffi_prep_args is called by the assembly routine once stack space
|
yann@402
|
5711 |
+ has been allocated for the function's arguments */
|
yann@402
|
5712 |
+
|
yann@402
|
5713 |
+#ifdef __x86_64__
|
yann@402
|
5714 |
+
|
yann@402
|
5715 |
+#define MAX_GPR_REGS 6
|
yann@402
|
5716 |
+#define MAX_SSE_REGS 8
|
yann@402
|
5717 |
+typedef struct
|
yann@402
|
5718 |
+{
|
yann@402
|
5719 |
+ /* Registers for argument passing. */
|
yann@402
|
5720 |
+ long gpr[MAX_GPR_REGS];
|
yann@402
|
5721 |
+ __int128_t sse[MAX_SSE_REGS];
|
yann@402
|
5722 |
+
|
yann@402
|
5723 |
+ /* Stack space for arguments. */
|
yann@402
|
5724 |
+ char argspace[0];
|
yann@402
|
5725 |
+} stackLayout;
|
yann@402
|
5726 |
+
|
yann@402
|
5727 |
+/* All reference to register classes here is identical to the code in
|
yann@402
|
5728 |
+ gcc/config/i386/i386.c. Do *not* change one without the other. */
|
yann@402
|
5729 |
+
|
yann@402
|
5730 |
+/* Register class used for passing given 64bit part of the argument.
|
yann@402
|
5731 |
+ These represent classes as documented by the PS ABI, with the exception
|
yann@402
|
5732 |
+ of SSESF, SSEDF classes, that are basically SSE class, just gcc will
|
yann@402
|
5733 |
+ use SF or DFmode move instead of DImode to avoid reformating penalties.
|
yann@402
|
5734 |
+
|
yann@402
|
5735 |
+ Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves
|
yann@402
|
5736 |
+ whenever possible (upper half does contain padding).
|
yann@402
|
5737 |
+ */
|
yann@402
|
5738 |
+enum x86_64_reg_class
|
yann@402
|
5739 |
+ {
|
yann@402
|
5740 |
+ X86_64_NO_CLASS,
|
yann@402
|
5741 |
+ X86_64_INTEGER_CLASS,
|
yann@402
|
5742 |
+ X86_64_INTEGERSI_CLASS,
|
yann@402
|
5743 |
+ X86_64_SSE_CLASS,
|
yann@402
|
5744 |
+ X86_64_SSESF_CLASS,
|
yann@402
|
5745 |
+ X86_64_SSEDF_CLASS,
|
yann@402
|
5746 |
+ X86_64_SSEUP_CLASS,
|
yann@402
|
5747 |
+ X86_64_X87_CLASS,
|
yann@402
|
5748 |
+ X86_64_X87UP_CLASS,
|
yann@402
|
5749 |
+ X86_64_MEMORY_CLASS
|
yann@402
|
5750 |
+ };
|
yann@402
|
5751 |
+
|
yann@402
|
5752 |
+#define MAX_CLASSES 4
|
yann@402
|
5753 |
+
|
yann@402
|
5754 |
+/* x86-64 register passing implementation. See x86-64 ABI for details. Goal
|
yann@402
|
5755 |
+ of this code is to classify each 8bytes of incoming argument by the register
|
yann@402
|
5756 |
+ class and assign registers accordingly. */
|
yann@402
|
5757 |
+
|
yann@402
|
5758 |
+/* Return the union class of CLASS1 and CLASS2.
|
yann@402
|
5759 |
+ See the x86-64 PS ABI for details. */
|
yann@402
|
5760 |
+
|
yann@402
|
5761 |
+static enum x86_64_reg_class
|
yann@402
|
5762 |
+merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2)
|
yann@402
|
5763 |
+{
|
yann@402
|
5764 |
+ /* Rule #1: If both classes are equal, this is the resulting class. */
|
yann@402
|
5765 |
+ if (class1 == class2)
|
yann@402
|
5766 |
+ return class1;
|
yann@402
|
5767 |
+
|
yann@402
|
5768 |
+ /* Rule #2: If one of the classes is NO_CLASS, the resulting class is
|
yann@402
|
5769 |
+ the other class. */
|
yann@402
|
5770 |
+ if (class1 == X86_64_NO_CLASS)
|
yann@402
|
5771 |
+ return class2;
|
yann@402
|
5772 |
+ if (class2 == X86_64_NO_CLASS)
|
yann@402
|
5773 |
+ return class1;
|
yann@402
|
5774 |
+
|
yann@402
|
5775 |
+ /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */
|
yann@402
|
5776 |
+ if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS)
|
yann@402
|
5777 |
+ return X86_64_MEMORY_CLASS;
|
yann@402
|
5778 |
+
|
yann@402
|
5779 |
+ /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */
|
yann@402
|
5780 |
+ if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS)
|
yann@402
|
5781 |
+ || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS))
|
yann@402
|
5782 |
+ return X86_64_INTEGERSI_CLASS;
|
yann@402
|
5783 |
+ if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS
|
yann@402
|
5784 |
+ || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS)
|
yann@402
|
5785 |
+ return X86_64_INTEGER_CLASS;
|
yann@402
|
5786 |
+
|
yann@402
|
5787 |
+ /* Rule #5: If one of the classes is X87 or X87UP class, MEMORY is used. */
|
yann@402
|
5788 |
+ if (class1 == X86_64_X87_CLASS || class1 == X86_64_X87UP_CLASS
|
yann@402
|
5789 |
+ || class2 == X86_64_X87_CLASS || class2 == X86_64_X87UP_CLASS)
|
yann@402
|
5790 |
+ return X86_64_MEMORY_CLASS;
|
yann@402
|
5791 |
+
|
yann@402
|
5792 |
+ /* Rule #6: Otherwise class SSE is used. */
|
yann@402
|
5793 |
+ return X86_64_SSE_CLASS;
|
yann@402
|
5794 |
+}
|
yann@402
|
5795 |
+
|
yann@402
|
5796 |
+/* Classify the argument of type TYPE and mode MODE.
|
yann@402
|
5797 |
+ CLASSES will be filled by the register class used to pass each word
|
yann@402
|
5798 |
+ of the operand. The number of words is returned. In case the parameter
|
yann@402
|
5799 |
+ should be passed in memory, 0 is returned. As a special case for zero
|
yann@402
|
5800 |
+ sized containers, classes[0] will be NO_CLASS and 1 is returned.
|
yann@402
|
5801 |
+
|
yann@402
|
5802 |
+ See the x86-64 PS ABI for details.
|
yann@402
|
5803 |
+*/
|
yann@402
|
5804 |
+static int
|
yann@402
|
5805 |
+classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
|
yann@402
|
5806 |
+ int *byte_offset)
|
yann@402
|
5807 |
+{
|
yann@402
|
5808 |
+ /* First, align to the right place. */
|
yann@402
|
5809 |
+ *byte_offset = ALIGN(*byte_offset, type->alignment);
|
yann@402
|
5810 |
+
|
yann@402
|
5811 |
+ switch (type->type)
|
yann@402
|
5812 |
+ {
|
yann@402
|
5813 |
+ case FFI_TYPE_UINT8:
|
yann@402
|
5814 |
+ case FFI_TYPE_SINT8:
|
yann@402
|
5815 |
+ case FFI_TYPE_UINT16:
|
yann@402
|
5816 |
+ case FFI_TYPE_SINT16:
|
yann@402
|
5817 |
+ case FFI_TYPE_UINT32:
|
yann@402
|
5818 |
+ case FFI_TYPE_SINT32:
|
yann@402
|
5819 |
+ case FFI_TYPE_UINT64:
|
yann@402
|
5820 |
+ case FFI_TYPE_SINT64:
|
yann@402
|
5821 |
+ case FFI_TYPE_POINTER:
|
yann@402
|
5822 |
+ if (((*byte_offset) % 8 + type->size) <= 4)
|
yann@402
|
5823 |
+ classes[0] = X86_64_INTEGERSI_CLASS;
|
yann@402
|
5824 |
+ else
|
yann@402
|
5825 |
+ classes[0] = X86_64_INTEGER_CLASS;
|
yann@402
|
5826 |
+ return 1;
|
yann@402
|
5827 |
+ case FFI_TYPE_FLOAT:
|
yann@402
|
5828 |
+ if (((*byte_offset) % 8) == 0)
|
yann@402
|
5829 |
+ classes[0] = X86_64_SSESF_CLASS;
|
yann@402
|
5830 |
+ else
|
yann@402
|
5831 |
+ classes[0] = X86_64_SSE_CLASS;
|
yann@402
|
5832 |
+ return 1;
|
yann@402
|
5833 |
+ case FFI_TYPE_DOUBLE:
|
yann@402
|
5834 |
+ classes[0] = X86_64_SSEDF_CLASS;
|
yann@402
|
5835 |
+ return 1;
|
yann@402
|
5836 |
+ case FFI_TYPE_LONGDOUBLE:
|
yann@402
|
5837 |
+ classes[0] = X86_64_X87_CLASS;
|
yann@402
|
5838 |
+ classes[1] = X86_64_X87UP_CLASS;
|
yann@402
|
5839 |
+ return 2;
|
yann@402
|
5840 |
+ case FFI_TYPE_STRUCT:
|
yann@402
|
5841 |
+ {
|
yann@402
|
5842 |
+ const int UNITS_PER_WORD = 8;
|
yann@402
|
5843 |
+ int words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
|
yann@402
|
5844 |
+ ffi_type **ptr;
|
yann@402
|
5845 |
+ int i;
|
yann@402
|
5846 |
+ enum x86_64_reg_class subclasses[MAX_CLASSES];
|
yann@402
|
5847 |
+
|
yann@402
|
5848 |
+ /* If the struct is larger than 16 bytes, pass it on the stack. */
|
yann@402
|
5849 |
+ if (type->size > 16)
|
yann@402
|
5850 |
+ return 0;
|
yann@402
|
5851 |
+
|
yann@402
|
5852 |
+ for (i = 0; i < words; i++)
|
yann@402
|
5853 |
+ classes[i] = X86_64_NO_CLASS;
|
yann@402
|
5854 |
+
|
yann@402
|
5855 |
+ /* Merge the fields of structure. */
|
yann@402
|
5856 |
+ for (ptr=type->elements; (*ptr)!=NULL; ptr++)
|
yann@402
|
5857 |
+ {
|
yann@402
|
5858 |
+ int num;
|
yann@402
|
5859 |
+
|
yann@402
|
5860 |
+ num = classify_argument (*ptr, subclasses, byte_offset);
|
yann@402
|
5861 |
+ if (num == 0)
|
yann@402
|
5862 |
+ return 0;
|
yann@402
|
5863 |
+ for (i = 0; i < num; i++)
|
yann@402
|
5864 |
+ {
|
yann@402
|
5865 |
+ int pos = *byte_offset / 8;
|
yann@402
|
5866 |
+ classes[i + pos] =
|
yann@402
|
5867 |
+ merge_classes (subclasses[i], classes[i + pos]);
|
yann@402
|
5868 |
+ }
|
yann@402
|
5869 |
+
|
yann@402
|
5870 |
+ if ((*ptr)->type != FFI_TYPE_STRUCT)
|
yann@402
|
5871 |
+ *byte_offset += (*ptr)->size;
|
yann@402
|
5872 |
+ }
|
yann@402
|
5873 |
+
|
yann@402
|
5874 |
+ /* Final merger cleanup. */
|
yann@402
|
5875 |
+ for (i = 0; i < words; i++)
|
yann@402
|
5876 |
+ {
|
yann@402
|
5877 |
+ /* If one class is MEMORY, everything should be passed in
|
yann@402
|
5878 |
+ memory. */
|
yann@402
|
5879 |
+ if (classes[i] == X86_64_MEMORY_CLASS)
|
yann@402
|
5880 |
+ return 0;
|
yann@402
|
5881 |
+
|
yann@402
|
5882 |
+ /* The X86_64_SSEUP_CLASS should be always preceded by
|
yann@402
|
5883 |
+ X86_64_SSE_CLASS. */
|
yann@402
|
5884 |
+ if (classes[i] == X86_64_SSEUP_CLASS
|
yann@402
|
5885 |
+ && (i == 0 || classes[i - 1] != X86_64_SSE_CLASS))
|
yann@402
|
5886 |
+ classes[i] = X86_64_SSE_CLASS;
|
yann@402
|
5887 |
+
|
yann@402
|
5888 |
+ /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */
|
yann@402
|
5889 |
+ if (classes[i] == X86_64_X87UP_CLASS
|
yann@402
|
5890 |
+ && (i == 0 || classes[i - 1] != X86_64_X87_CLASS))
|
yann@402
|
5891 |
+ classes[i] = X86_64_SSE_CLASS;
|
yann@402
|
5892 |
+ }
|
yann@402
|
5893 |
+ return words;
|
yann@402
|
5894 |
+ }
|
yann@402
|
5895 |
+
|
yann@402
|
5896 |
+ default:
|
yann@402
|
5897 |
+ FFI_ASSERT(0);
|
yann@402
|
5898 |
+ }
|
yann@402
|
5899 |
+ return 0; /* Never reached. */
|
yann@402
|
5900 |
+}
|
yann@402
|
5901 |
+
|
yann@402
|
5902 |
+/* Examine the argument and return set number of register required in each
|
yann@402
|
5903 |
+ class. Return 0 iff parameter should be passed in memory. */
|
yann@402
|
5904 |
+static int
|
yann@402
|
5905 |
+examine_argument (ffi_type *type, int in_return, int *int_nregs,int *sse_nregs)
|
yann@402
|
5906 |
+{
|
yann@402
|
5907 |
+ enum x86_64_reg_class class[MAX_CLASSES];
|
yann@402
|
5908 |
+ int offset = 0;
|
yann@402
|
5909 |
+ int n;
|
yann@402
|
5910 |
+
|
yann@402
|
5911 |
+ n = classify_argument (type, class, &offset);
|
yann@402
|
5912 |
+
|
yann@402
|
5913 |
+ if (n == 0)
|
yann@402
|
5914 |
+ return 0;
|
yann@402
|
5915 |
+
|
yann@402
|
5916 |
+ *int_nregs = 0;
|
yann@402
|
5917 |
+ *sse_nregs = 0;
|
yann@402
|
5918 |
+ for (n--; n>=0; n--)
|
yann@402
|
5919 |
+ switch (class[n])
|
yann@402
|
5920 |
+ {
|
yann@402
|
5921 |
+ case X86_64_INTEGER_CLASS:
|
yann@402
|
5922 |
+ case X86_64_INTEGERSI_CLASS:
|
yann@402
|
5923 |
+ (*int_nregs)++;
|
yann@402
|
5924 |
+ break;
|
yann@402
|
5925 |
+ case X86_64_SSE_CLASS:
|
yann@402
|
5926 |
+ case X86_64_SSESF_CLASS:
|
yann@402
|
5927 |
+ case X86_64_SSEDF_CLASS:
|
yann@402
|
5928 |
+ (*sse_nregs)++;
|
yann@402
|
5929 |
+ break;
|
yann@402
|
5930 |
+ case X86_64_NO_CLASS:
|
yann@402
|
5931 |
+ case X86_64_SSEUP_CLASS:
|
yann@402
|
5932 |
+ break;
|
yann@402
|
5933 |
+ case X86_64_X87_CLASS:
|
yann@402
|
5934 |
+ case X86_64_X87UP_CLASS:
|
yann@402
|
5935 |
+ if (!in_return)
|
yann@402
|
5936 |
+ return 0;
|
yann@402
|
5937 |
+ break;
|
yann@402
|
5938 |
+ default:
|
yann@402
|
5939 |
+ abort ();
|
yann@402
|
5940 |
+ }
|
yann@402
|
5941 |
+ return 1;
|
yann@402
|
5942 |
+}
|
yann@402
|
5943 |
+
|
yann@402
|
5944 |
+/* Functions to load floats and double to an SSE register placeholder. */
|
yann@402
|
5945 |
+extern void float2sse (float, __int128_t *);
|
yann@402
|
5946 |
+extern void double2sse (double, __int128_t *);
|
yann@402
|
5947 |
+extern void floatfloat2sse (void *, __int128_t *);
|
yann@402
|
5948 |
+
|
yann@402
|
5949 |
+/* Functions to put the floats and doubles back. */
|
yann@402
|
5950 |
+extern float sse2float (__int128_t *);
|
yann@402
|
5951 |
+extern double sse2double (__int128_t *);
|
yann@402
|
5952 |
+extern void sse2floatfloat(__int128_t *, void *);
|
yann@402
|
5953 |
+
|
yann@402
|
5954 |
+/*@-exportheader@*/
|
yann@402
|
5955 |
+void
|
yann@402
|
5956 |
+ffi_prep_args (stackLayout *stack, extended_cif *ecif)
|
yann@402
|
5957 |
+/*@=exportheader@*/
|
yann@402
|
5958 |
+{
|
yann@402
|
5959 |
+ int gprcount, ssecount, i, g, s;
|
yann@402
|
5960 |
+ void **p_argv;
|
yann@402
|
5961 |
+ void *argp = &stack->argspace;
|
yann@402
|
5962 |
+ ffi_type **p_arg;
|
yann@402
|
5963 |
+
|
yann@402
|
5964 |
+ /* First check if the return value should be passed in memory. If so,
|
yann@402
|
5965 |
+ pass the pointer as the first argument. */
|
yann@402
|
5966 |
+ gprcount = ssecount = 0;
|
yann@402
|
5967 |
+ if (ecif->cif->rtype->type != FFI_TYPE_VOID
|
yann@402
|
5968 |
+ && examine_argument (ecif->cif->rtype, 1, &g, &s) == 0)
|
yann@402
|
5969 |
+ (void *)stack->gpr[gprcount++] = ecif->rvalue;
|
yann@402
|
5970 |
+
|
yann@402
|
5971 |
+ for (i=ecif->cif->nargs, p_arg=ecif->cif->arg_types, p_argv = ecif->avalue;
|
yann@402
|
5972 |
+ i!=0; i--, p_arg++, p_argv++)
|
yann@402
|
5973 |
+ {
|
yann@402
|
5974 |
+ int in_register = 0;
|
yann@402
|
5975 |
+
|
yann@402
|
5976 |
+ switch ((*p_arg)->type)
|
yann@402
|
5977 |
+ {
|
yann@402
|
5978 |
+ case FFI_TYPE_SINT8:
|
yann@402
|
5979 |
+ case FFI_TYPE_SINT16:
|
yann@402
|
5980 |
+ case FFI_TYPE_SINT32:
|
yann@402
|
5981 |
+ case FFI_TYPE_SINT64:
|
yann@402
|
5982 |
+ case FFI_TYPE_UINT8:
|
yann@402
|
5983 |
+ case FFI_TYPE_UINT16:
|
yann@402
|
5984 |
+ case FFI_TYPE_UINT32:
|
yann@402
|
5985 |
+ case FFI_TYPE_UINT64:
|
yann@402
|
5986 |
+ case FFI_TYPE_POINTER:
|
yann@402
|
5987 |
+ if (gprcount < MAX_GPR_REGS)
|
yann@402
|
5988 |
+ {
|
yann@402
|
5989 |
+ stack->gpr[gprcount] = 0;
|
yann@402
|
5990 |
+ stack->gpr[gprcount++] = *(long long *)(*p_argv);
|
yann@402
|
5991 |
+ in_register = 1;
|
yann@402
|
5992 |
+ }
|
yann@402
|
5993 |
+ break;
|
yann@402
|
5994 |
+
|
yann@402
|
5995 |
+ case FFI_TYPE_FLOAT:
|
yann@402
|
5996 |
+ if (ssecount < MAX_SSE_REGS)
|
yann@402
|
5997 |
+ {
|
yann@402
|
5998 |
+ float2sse (*(float *)(*p_argv), &stack->sse[ssecount++]);
|
yann@402
|
5999 |
+ in_register = 1;
|
yann@402
|
6000 |
+ }
|
yann@402
|
6001 |
+ break;
|
yann@402
|
6002 |
+
|
yann@402
|
6003 |
+ case FFI_TYPE_DOUBLE:
|
yann@402
|
6004 |
+ if (ssecount < MAX_SSE_REGS)
|
yann@402
|
6005 |
+ {
|
yann@402
|
6006 |
+ double2sse (*(double *)(*p_argv), &stack->sse[ssecount++]);
|
yann@402
|
6007 |
+ in_register = 1;
|
yann@402
|
6008 |
+ }
|
yann@402
|
6009 |
+ break;
|
yann@402
|
6010 |
+ }
|
yann@402
|
6011 |
+
|
yann@402
|
6012 |
+ if (in_register)
|
yann@402
|
6013 |
+ continue;
|
yann@402
|
6014 |
+
|
yann@402
|
6015 |
+ /* Either all places in registers where filled, or this is a
|
yann@402
|
6016 |
+ type that potentially goes into a memory slot. */
|
yann@402
|
6017 |
+ if (examine_argument (*p_arg, 0, &g, &s) == 0
|
yann@402
|
6018 |
+ || gprcount + g > MAX_GPR_REGS || ssecount + s > MAX_SSE_REGS)
|
yann@402
|
6019 |
+ {
|
yann@402
|
6020 |
+ /* Pass this argument in memory. */
|
yann@402
|
6021 |
+ argp = (void *)ALIGN(argp, (*p_arg)->alignment);
|
yann@402
|
6022 |
+ memcpy (argp, *p_argv, (*p_arg)->size);
|
yann@402
|
6023 |
+ argp += (*p_arg)->size;
|
yann@402
|
6024 |
+ }
|
yann@402
|
6025 |
+ else
|
yann@402
|
6026 |
+ {
|
yann@402
|
6027 |
+ /* All easy cases are eliminated. Now fire the big guns. */
|
yann@402
|
6028 |
+
|
yann@402
|
6029 |
+ enum x86_64_reg_class classes[MAX_CLASSES];
|
yann@402
|
6030 |
+ int offset = 0, j, num;
|
yann@402
|
6031 |
+ void *a;
|
yann@402
|
6032 |
+
|
yann@402
|
6033 |
+ num = classify_argument (*p_arg, classes, &offset);
|
yann@402
|
6034 |
+ for (j=0, a=*p_argv; j<num; j++, a+=8)
|
yann@402
|
6035 |
+ {
|
yann@402
|
6036 |
+ switch (classes[j])
|
yann@402
|
6037 |
+ {
|
yann@402
|
6038 |
+ case X86_64_INTEGER_CLASS:
|
yann@402
|
6039 |
+ case X86_64_INTEGERSI_CLASS:
|
yann@402
|
6040 |
+ stack->gpr[gprcount++] = *(long long *)a;
|
yann@402
|
6041 |
+ break;
|
yann@402
|
6042 |
+ case X86_64_SSE_CLASS:
|
yann@402
|
6043 |
+ floatfloat2sse (a, &stack->sse[ssecount++]);
|
yann@402
|
6044 |
+ break;
|
yann@402
|
6045 |
+ case X86_64_SSESF_CLASS:
|
yann@402
|
6046 |
+ float2sse (*(float *)a, &stack->sse[ssecount++]);
|
yann@402
|
6047 |
+ break;
|
yann@402
|
6048 |
+ case X86_64_SSEDF_CLASS:
|
yann@402
|
6049 |
+ double2sse (*(double *)a, &stack->sse[ssecount++]);
|
yann@402
|
6050 |
+ break;
|
yann@402
|
6051 |
+ default:
|
yann@402
|
6052 |
+ abort();
|
yann@402
|
6053 |
+ }
|
yann@402
|
6054 |
+ }
|
yann@402
|
6055 |
+ }
|
yann@402
|
6056 |
+ }
|
yann@402
|
6057 |
+}
|
yann@402
|
6058 |
+
|
yann@402
|
6059 |
+/* Perform machine dependent cif processing. */
|
yann@402
|
6060 |
+ffi_status
|
yann@402
|
6061 |
+ffi_prep_cif_machdep (ffi_cif *cif)
|
yann@402
|
6062 |
+{
|
yann@402
|
6063 |
+ int gprcount, ssecount, i, g, s;
|
yann@402
|
6064 |
+
|
yann@402
|
6065 |
+ gprcount = ssecount = 0;
|
yann@402
|
6066 |
+
|
yann@402
|
6067 |
+ /* Reset the byte count. We handle this size estimation here. */
|
yann@402
|
6068 |
+ cif->bytes = 0;
|
yann@402
|
6069 |
+
|
yann@402
|
6070 |
+ /* If the return value should be passed in memory, pass the pointer
|
yann@402
|
6071 |
+ as the first argument. The actual memory isn't allocated here. */
|
yann@402
|
6072 |
+ if (cif->rtype->type != FFI_TYPE_VOID
|
yann@402
|
6073 |
+ && examine_argument (cif->rtype, 1, &g, &s) == 0)
|
yann@402
|
6074 |
+ gprcount = 1;
|
yann@402
|
6075 |
+
|
yann@402
|
6076 |
+ /* Go over all arguments and determine the way they should be passed.
|
yann@402
|
6077 |
+ If it's in a register and there is space for it, let that be so. If
|
yann@402
|
6078 |
+ not, add it's size to the stack byte count. */
|
yann@402
|
6079 |
+ for (i=0; i<cif->nargs; i++)
|
yann@402
|
6080 |
+ {
|
yann@402
|
6081 |
+ if (examine_argument (cif->arg_types[i], 0, &g, &s) == 0
|
yann@402
|
6082 |
+ || gprcount + g > MAX_GPR_REGS || ssecount + s > MAX_SSE_REGS)
|
yann@402
|
6083 |
+ {
|
yann@402
|
6084 |
+ /* This is passed in memory. First align to the basic type. */
|
yann@402
|
6085 |
+ cif->bytes = ALIGN(cif->bytes, cif->arg_types[i]->alignment);
|
yann@402
|
6086 |
+
|
yann@402
|
6087 |
+ /* Stack arguments are *always* at least 8 byte aligned. */
|
yann@402
|
6088 |
+ cif->bytes = ALIGN(cif->bytes, 8);
|
yann@402
|
6089 |
+
|
yann@402
|
6090 |
+ /* Now add the size of this argument. */
|
yann@402
|
6091 |
+ cif->bytes += cif->arg_types[i]->size;
|
yann@402
|
6092 |
+ }
|
yann@402
|
6093 |
+ else
|
yann@402
|
6094 |
+ {
|
yann@402
|
6095 |
+ gprcount += g;
|
yann@402
|
6096 |
+ ssecount += s;
|
yann@402
|
6097 |
+ }
|
yann@402
|
6098 |
+ }
|
yann@402
|
6099 |
+
|
yann@402
|
6100 |
+ /* Set the flag for the closures return. */
|
yann@402
|
6101 |
+ switch (cif->rtype->type)
|
yann@402
|
6102 |
+ {
|
yann@402
|
6103 |
+ case FFI_TYPE_VOID:
|
yann@402
|
6104 |
+ case FFI_TYPE_STRUCT:
|
yann@402
|
6105 |
+ case FFI_TYPE_SINT64:
|
yann@402
|
6106 |
+ case FFI_TYPE_FLOAT:
|
yann@402
|
6107 |
+ case FFI_TYPE_DOUBLE:
|
yann@402
|
6108 |
+ case FFI_TYPE_LONGDOUBLE:
|
yann@402
|
6109 |
+ cif->flags = (unsigned) cif->rtype->type;
|
yann@402
|
6110 |
+ break;
|
yann@402
|
6111 |
+
|
yann@402
|
6112 |
+ case FFI_TYPE_UINT64:
|
yann@402
|
6113 |
+ cif->flags = FFI_TYPE_SINT64;
|
yann@402
|
6114 |
+ break;
|
yann@402
|
6115 |
+
|
yann@402
|
6116 |
+ default:
|
yann@402
|
6117 |
+ cif->flags = FFI_TYPE_INT;
|
yann@402
|
6118 |
+ break;
|
yann@402
|
6119 |
+ }
|
yann@402
|
6120 |
+
|
yann@402
|
6121 |
+ return FFI_OK;
|
yann@402
|
6122 |
+}
|
yann@402
|
6123 |
+
|
yann@402
|
6124 |
+typedef struct
|
yann@402
|
6125 |
+{
|
yann@402
|
6126 |
+ long gpr[2];
|
yann@402
|
6127 |
+ __int128_t sse[2];
|
yann@402
|
6128 |
+ long double st0;
|
yann@402
|
6129 |
+} return_value;
|
yann@402
|
6130 |
+
|
yann@402
|
6131 |
+void
|
yann@402
|
6132 |
+ffi_fill_return_value (return_value *rv, extended_cif *ecif)
|
yann@402
|
6133 |
+{
|
yann@402
|
6134 |
+ enum x86_64_reg_class classes[MAX_CLASSES];
|
yann@402
|
6135 |
+ int i = 0, num;
|
yann@402
|
6136 |
+ long *gpr = rv->gpr;
|
yann@402
|
6137 |
+ __int128_t *sse = rv->sse;
|
yann@402
|
6138 |
+ signed char sc;
|
yann@402
|
6139 |
+ signed short ss;
|
yann@402
|
6140 |
+
|
yann@402
|
6141 |
+ /* This is needed because of the way x86-64 handles signed short
|
yann@402
|
6142 |
+ integers. */
|
yann@402
|
6143 |
+ switch (ecif->cif->rtype->type)
|
yann@402
|
6144 |
+ {
|
yann@402
|
6145 |
+ case FFI_TYPE_SINT8:
|
yann@402
|
6146 |
+ sc = *(signed char *)gpr;
|
yann@402
|
6147 |
+ *(long long *)ecif->rvalue = (long long)sc;
|
yann@402
|
6148 |
+ return;
|
yann@402
|
6149 |
+ case FFI_TYPE_SINT16:
|
yann@402
|
6150 |
+ ss = *(signed short *)gpr;
|
yann@402
|
6151 |
+ *(long long *)ecif->rvalue = (long long)ss;
|
yann@402
|
6152 |
+ return;
|
yann@402
|
6153 |
+ default:
|
yann@402
|
6154 |
+ /* Just continue. */
|
yann@402
|
6155 |
+ ;
|
yann@402
|
6156 |
+ }
|
yann@402
|
6157 |
+
|
yann@402
|
6158 |
+ num = classify_argument (ecif->cif->rtype, classes, &i);
|
yann@402
|
6159 |
+
|
yann@402
|
6160 |
+ if (num == 0)
|
yann@402
|
6161 |
+ /* Return in memory. */
|
yann@402
|
6162 |
+ ecif->rvalue = (void *) rv->gpr[0];
|
yann@402
|
6163 |
+ else if (num == 2 && classes[0] == X86_64_X87_CLASS &&
|
yann@402
|
6164 |
+ classes[1] == X86_64_X87UP_CLASS)
|
yann@402
|
6165 |
+ /* This is a long double (this is easiest to handle this way instead
|
yann@402
|
6166 |
+ of an eightbyte at a time as in the loop below. */
|
yann@402
|
6167 |
+ *((long double *)ecif->rvalue) = rv->st0;
|
yann@402
|
6168 |
+ else
|
yann@402
|
6169 |
+ {
|
yann@402
|
6170 |
+ void *a;
|
yann@402
|
6171 |
+
|
yann@402
|
6172 |
+ for (i=0, a=ecif->rvalue; i<num; i++, a+=8)
|
yann@402
|
6173 |
+ {
|
yann@402
|
6174 |
+ switch (classes[i])
|
yann@402
|
6175 |
+ {
|
yann@402
|
6176 |
+ case X86_64_INTEGER_CLASS:
|
yann@402
|
6177 |
+ case X86_64_INTEGERSI_CLASS:
|
yann@402
|
6178 |
+ *(long long *)a = *gpr;
|
yann@402
|
6179 |
+ gpr++;
|
yann@402
|
6180 |
+ break;
|
yann@402
|
6181 |
+ case X86_64_SSE_CLASS:
|
yann@402
|
6182 |
+ sse2floatfloat (sse++, a);
|
yann@402
|
6183 |
+ break;
|
yann@402
|
6184 |
+ case X86_64_SSESF_CLASS:
|
yann@402
|
6185 |
+ *(float *)a = sse2float (sse++);
|
yann@402
|
6186 |
+ break;
|
yann@402
|
6187 |
+ case X86_64_SSEDF_CLASS:
|
yann@402
|
6188 |
+ *(double *)a = sse2double (sse++);
|
yann@402
|
6189 |
+ break;
|
yann@402
|
6190 |
+ default:
|
yann@402
|
6191 |
+ abort();
|
yann@402
|
6192 |
+ }
|
yann@402
|
6193 |
+ }
|
yann@402
|
6194 |
+ }
|
yann@402
|
6195 |
+}
|
yann@402
|
6196 |
+
|
yann@402
|
6197 |
+/*@-declundef@*/
|
yann@402
|
6198 |
+/*@-exportheader@*/
|
yann@402
|
6199 |
+extern void ffi_call_UNIX64(void (*)(stackLayout *, extended_cif *),
|
yann@402
|
6200 |
+ void (*) (return_value *, extended_cif *),
|
yann@402
|
6201 |
+ /*@out@*/ extended_cif *,
|
yann@402
|
6202 |
+ unsigned, /*@out@*/ unsigned *, void (*fn)());
|
yann@402
|
6203 |
+/*@=declundef@*/
|
yann@402
|
6204 |
+/*@=exportheader@*/
|
yann@402
|
6205 |
+
|
yann@402
|
6206 |
+void ffi_call(/*@dependent@*/ ffi_cif *cif,
|
yann@402
|
6207 |
+ void (*fn)(),
|
yann@402
|
6208 |
+ /*@out@*/ void *rvalue,
|
yann@402
|
6209 |
+ /*@dependent@*/ void **avalue)
|
yann@402
|
6210 |
+{
|
yann@402
|
6211 |
+ extended_cif ecif;
|
yann@402
|
6212 |
+ int dummy;
|
yann@402
|
6213 |
+
|
yann@402
|
6214 |
+ ecif.cif = cif;
|
yann@402
|
6215 |
+ ecif.avalue = avalue;
|
yann@402
|
6216 |
+
|
yann@402
|
6217 |
+ /* If the return value is a struct and we don't have a return */
|
yann@402
|
6218 |
+ /* value address then we need to make one */
|
yann@402
|
6219 |
+
|
yann@402
|
6220 |
+ if ((rvalue == NULL) &&
|
yann@402
|
6221 |
+ (examine_argument (cif->rtype, 1, &dummy, &dummy) == 0))
|
yann@402
|
6222 |
+ {
|
yann@402
|
6223 |
+ /*@-sysunrecog@*/
|
yann@402
|
6224 |
+ ecif.rvalue = alloca(cif->rtype->size);
|
yann@402
|
6225 |
+ /*@=sysunrecog@*/
|
yann@402
|
6226 |
+ }
|
yann@402
|
6227 |
+ else
|
yann@402
|
6228 |
+ ecif.rvalue = rvalue;
|
yann@402
|
6229 |
+
|
yann@402
|
6230 |
+ /* Stack must always be 16byte aligned. Make it so. */
|
yann@402
|
6231 |
+ cif->bytes = ALIGN(cif->bytes, 16);
|
yann@402
|
6232 |
+
|
yann@402
|
6233 |
+ switch (cif->abi)
|
yann@402
|
6234 |
+ {
|
yann@402
|
6235 |
+ case FFI_SYSV:
|
yann@402
|
6236 |
+ /* Calling 32bit code from 64bit is not possible */
|
yann@402
|
6237 |
+ FFI_ASSERT(0);
|
yann@402
|
6238 |
+ break;
|
yann@402
|
6239 |
+
|
yann@402
|
6240 |
+ case FFI_UNIX64:
|
yann@402
|
6241 |
+ /*@-usedef@*/
|
yann@402
|
6242 |
+ ffi_call_UNIX64 (ffi_prep_args, ffi_fill_return_value, &ecif,
|
yann@402
|
6243 |
+ cif->bytes, ecif.rvalue, fn);
|
yann@402
|
6244 |
+ /*@=usedef@*/
|
yann@402
|
6245 |
+ break;
|
yann@402
|
6246 |
+
|
yann@402
|
6247 |
+ default:
|
yann@402
|
6248 |
+ FFI_ASSERT(0);
|
yann@402
|
6249 |
+ break;
|
yann@402
|
6250 |
+ }
|
yann@402
|
6251 |
+}
|
yann@402
|
6252 |
+
|
yann@402
|
6253 |
+extern void ffi_closure_UNIX64(void);
|
yann@402
|
6254 |
+
|
yann@402
|
6255 |
+ffi_status
|
yann@402
|
6256 |
+ffi_prep_closure (ffi_closure* closure,
|
yann@402
|
6257 |
+ ffi_cif* cif,
|
yann@402
|
6258 |
+ void (*fun)(ffi_cif*, void*, void**, void*),
|
yann@402
|
6259 |
+ void *user_data)
|
yann@402
|
6260 |
+{
|
yann@402
|
6261 |
+ volatile unsigned short *tramp;
|
yann@402
|
6262 |
+
|
yann@402
|
6263 |
+ /* FFI_ASSERT (cif->abi == FFI_OSF); */
|
yann@402
|
6264 |
+
|
yann@402
|
6265 |
+ tramp = (volatile unsigned short *) &closure->tramp[0];
|
yann@402
|
6266 |
+ tramp[0] = 0xbb49; /* mov <code>, %r11 */
|
yann@402
|
6267 |
+ tramp[5] = 0xba49; /* mov <data>, %r10 */
|
yann@402
|
6268 |
+ tramp[10] = 0xff49; /* jmp *%r11 */
|
yann@402
|
6269 |
+ tramp[11] = 0x00e3;
|
yann@402
|
6270 |
+ *(void * volatile *) &tramp[1] = ffi_closure_UNIX64;
|
yann@402
|
6271 |
+ *(void * volatile *) &tramp[6] = closure;
|
yann@402
|
6272 |
+
|
yann@402
|
6273 |
+ closure->cif = cif;
|
yann@402
|
6274 |
+ closure->fun = fun;
|
yann@402
|
6275 |
+ closure->user_data = user_data;
|
yann@402
|
6276 |
+
|
yann@402
|
6277 |
+ return FFI_OK;
|
yann@402
|
6278 |
+}
|
yann@402
|
6279 |
+
|
yann@402
|
6280 |
+int
|
yann@402
|
6281 |
+ffi_closure_UNIX64_inner(ffi_closure *closure, va_list l, void *rp)
|
yann@402
|
6282 |
+{
|
yann@402
|
6283 |
+ ffi_cif *cif;
|
yann@402
|
6284 |
+ void **avalue;
|
yann@402
|
6285 |
+ ffi_type **arg_types;
|
yann@402
|
6286 |
+ long i, avn, argn;
|
yann@402
|
6287 |
+
|
yann@402
|
6288 |
+ cif = closure->cif;
|
yann@402
|
6289 |
+ avalue = alloca(cif->nargs * sizeof(void *));
|
yann@402
|
6290 |
+
|
yann@402
|
6291 |
+ argn = 0;
|
yann@402
|
6292 |
+
|
yann@402
|
6293 |
+ i = 0;
|
yann@402
|
6294 |
+ avn = cif->nargs;
|
yann@402
|
6295 |
+ arg_types = cif->arg_types;
|
yann@402
|
6296 |
+
|
yann@402
|
6297 |
+ /* Grab the addresses of the arguments from the stack frame. */
|
yann@402
|
6298 |
+ while (i < avn)
|
yann@402
|
6299 |
+ {
|
yann@402
|
6300 |
+ switch (arg_types[i]->type)
|
yann@402
|
6301 |
+ {
|
yann@402
|
6302 |
+ case FFI_TYPE_SINT8:
|
yann@402
|
6303 |
+ case FFI_TYPE_UINT8:
|
yann@402
|
6304 |
+ case FFI_TYPE_SINT16:
|
yann@402
|
6305 |
+ case FFI_TYPE_UINT16:
|
yann@402
|
6306 |
+ case FFI_TYPE_SINT32:
|
yann@402
|
6307 |
+ case FFI_TYPE_UINT32:
|
yann@402
|
6308 |
+ case FFI_TYPE_SINT64:
|
yann@402
|
6309 |
+ case FFI_TYPE_UINT64:
|
yann@402
|
6310 |
+ case FFI_TYPE_POINTER:
|
yann@402
|
6311 |
+ {
|
yann@402
|
6312 |
+ if (l->gp_offset > 48-8)
|
yann@402
|
6313 |
+ {
|
yann@402
|
6314 |
+ avalue[i] = l->overflow_arg_area;
|
yann@402
|
6315 |
+ l->overflow_arg_area = (char *)l->overflow_arg_area + 8;
|
yann@402
|
6316 |
+ }
|
yann@402
|
6317 |
+ else
|
yann@402
|
6318 |
+ {
|
yann@402
|
6319 |
+ avalue[i] = (char *)l->reg_save_area + l->gp_offset;
|
yann@402
|
6320 |
+ l->gp_offset += 8;
|
yann@402
|
6321 |
+ }
|
yann@402
|
6322 |
+ }
|
yann@402
|
6323 |
+ break;
|
yann@402
|
6324 |
+
|
yann@402
|
6325 |
+ case FFI_TYPE_STRUCT:
|
yann@402
|
6326 |
+ /* FIXME */
|
yann@402
|
6327 |
+ FFI_ASSERT(0);
|
yann@402
|
6328 |
+ break;
|
yann@402
|
6329 |
+
|
yann@402
|
6330 |
+ case FFI_TYPE_DOUBLE:
|
yann@402
|
6331 |
+ {
|
yann@402
|
6332 |
+ if (l->fp_offset > 176-16)
|
yann@402
|
6333 |
+ {
|
yann@402
|
6334 |
+ avalue[i] = l->overflow_arg_area;
|
yann@402
|
6335 |
+ l->overflow_arg_area = (char *)l->overflow_arg_area + 8;
|
yann@402
|
6336 |
+ }
|
yann@402
|
6337 |
+ else
|
yann@402
|
6338 |
+ {
|
yann@402
|
6339 |
+ avalue[i] = (char *)l->reg_save_area + l->fp_offset;
|
yann@402
|
6340 |
+ l->fp_offset += 16;
|
yann@402
|
6341 |
+ }
|
yann@402
|
6342 |
+ }
|
yann@402
|
6343 |
+#if DEBUG_FFI
|
yann@402
|
6344 |
+ fprintf (stderr, "double arg %d = %g\n", i, *(double *)avalue[i]);
|
yann@402
|
6345 |
+#endif
|
yann@402
|
6346 |
+ break;
|
yann@402
|
6347 |
+
|
yann@402
|
6348 |
+ case FFI_TYPE_FLOAT:
|
yann@402
|
6349 |
+ {
|
yann@402
|
6350 |
+ if (l->fp_offset > 176-16)
|
yann@402
|
6351 |
+ {
|
yann@402
|
6352 |
+ avalue[i] = l->overflow_arg_area;
|
yann@402
|
6353 |
+ l->overflow_arg_area = (char *)l->overflow_arg_area + 8;
|
yann@402
|
6354 |
+ }
|
yann@402
|
6355 |
+ else
|
yann@402
|
6356 |
+ {
|
yann@402
|
6357 |
+ avalue[i] = (char *)l->reg_save_area + l->fp_offset;
|
yann@402
|
6358 |
+ l->fp_offset += 16;
|
yann@402
|
6359 |
+ }
|
yann@402
|
6360 |
+ }
|
yann@402
|
6361 |
+#if DEBUG_FFI
|
yann@402
|
6362 |
+ fprintf (stderr, "float arg %d = %g\n", i, *(float *)avalue[i]);
|
yann@402
|
6363 |
+#endif
|
yann@402
|
6364 |
+ break;
|
yann@402
|
6365 |
+
|
yann@402
|
6366 |
+ default:
|
yann@402
|
6367 |
+ FFI_ASSERT(0);
|
yann@402
|
6368 |
+ }
|
yann@402
|
6369 |
+
|
yann@402
|
6370 |
+ argn += ALIGN(arg_types[i]->size, SIZEOF_ARG) / SIZEOF_ARG;
|
yann@402
|
6371 |
+ i++;
|
yann@402
|
6372 |
+ }
|
yann@402
|
6373 |
+
|
yann@402
|
6374 |
+ /* Invoke the closure. */
|
yann@402
|
6375 |
+ (closure->fun) (cif, rp, avalue, closure->user_data);
|
yann@402
|
6376 |
+
|
yann@402
|
6377 |
+ /* FIXME: Structs not supported. */
|
yann@402
|
6378 |
+ FFI_ASSERT(cif->rtype->type != FFI_TYPE_STRUCT);
|
yann@402
|
6379 |
+
|
yann@402
|
6380 |
+ /* Tell ffi_closure_UNIX64 how to perform return type promotions. */
|
yann@402
|
6381 |
+
|
yann@402
|
6382 |
+ return cif->rtype->type;
|
yann@402
|
6383 |
+}
|
yann@402
|
6384 |
+#endif /* ifndef __x86_64__ */
|
yann@402
|
6385 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/sysv.S gcc/libffi/src/x86/sysv.S
|
yann@402
|
6386 |
--- gcc-3.2.2.orig/libffi/src/x86/sysv.S Tue Jul 17 02:10:53 2001
|
yann@402
|
6387 |
+++ gcc/libffi/src/x86/sysv.S Fri Jul 19 08:08:31 2002
|
yann@402
|
6388 |
@@ -1,5 +1,5 @@
|
yann@402
|
6389 |
/* -----------------------------------------------------------------------
|
yann@402
|
6390 |
- sysv.S - Copyright (c) 1996, 1998, 2001 Cygnus Solutions
|
yann@402
|
6391 |
+ sysv.S - Copyright (c) 1996, 1998, 2001, 2002 Cygnus Solutions
|
yann@402
|
6392 |
|
yann@402
|
6393 |
X86 Foreign Function Interface
|
yann@402
|
6394 |
|
yann@402
|
6395 |
@@ -23,6 +23,8 @@
|
yann@402
|
6396 |
OTHER DEALINGS IN THE SOFTWARE.
|
yann@402
|
6397 |
----------------------------------------------------------------------- */
|
yann@402
|
6398 |
|
yann@402
|
6399 |
+#ifndef __x86_64__
|
yann@402
|
6400 |
+
|
yann@402
|
6401 |
#define LIBFFI_ASM
|
yann@402
|
6402 |
#include <ffi.h>
|
yann@402
|
6403 |
|
yann@402
|
6404 |
@@ -163,3 +165,5 @@
|
yann@402
|
6405 |
.align 4
|
yann@402
|
6406 |
.LEFDE1:
|
yann@402
|
6407 |
.set .LLFDE1,.LEFDE1-.LSFDE1
|
yann@402
|
6408 |
+
|
yann@402
|
6409 |
+#endif /* ifndef __x86_64__ */
|
yann@402
|
6410 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/unix64.S gcc/libffi/src/x86/unix64.S
|
yann@402
|
6411 |
--- gcc-3.2.2.orig/libffi/src/x86/unix64.S Thu Jan 1 09:00:00 1970
|
yann@402
|
6412 |
+++ gcc/libffi/src/x86/unix64.S Wed Jan 29 00:54:28 2003
|
yann@402
|
6413 |
@@ -0,0 +1,302 @@
|
yann@402
|
6414 |
+/* -----------------------------------------------------------------------
|
yann@402
|
6415 |
+ unix64.S - Copyright (c) 2002 Bo Thorsen <bo@suse.de>
|
yann@402
|
6416 |
+
|
yann@402
|
6417 |
+ x86-64 Foreign Function Interface
|
yann@402
|
6418 |
+
|
yann@402
|
6419 |
+ Permission is hereby granted, free of charge, to any person obtaining
|
yann@402
|
6420 |
+ a copy of this software and associated documentation files (the
|
yann@402
|
6421 |
+ ``Software''), to deal in the Software without restriction, including
|
yann@402
|
6422 |
+ without limitation the rights to use, copy, modify, merge, publish,
|
yann@402
|
6423 |
+ distribute, sublicense, and/or sell copies of the Software, and to
|
yann@402
|
6424 |
+ permit persons to whom the Software is furnished to do so, subject to
|
yann@402
|
6425 |
+ the following conditions:
|
yann@402
|
6426 |
+
|
yann@402
|
6427 |
+ The above copyright notice and this permission notice shall be included
|
yann@402
|
6428 |
+ in all copies or substantial portions of the Software.
|
yann@402
|
6429 |
+
|
yann@402
|
6430 |
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
yann@402
|
6431 |
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
yann@402
|
6432 |
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
yann@402
|
6433 |
+ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
yann@402
|
6434 |
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
yann@402
|
6435 |
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
yann@402
|
6436 |
+ OTHER DEALINGS IN THE SOFTWARE.
|
yann@402
|
6437 |
+ ----------------------------------------------------------------------- */
|
yann@402
|
6438 |
+
|
yann@402
|
6439 |
+#ifdef __x86_64__
|
yann@402
|
6440 |
+#define LIBFFI_ASM
|
yann@402
|
6441 |
+#include <ffi.h>
|
yann@402
|
6442 |
+
|
yann@402
|
6443 |
+ .section .rodata
|
yann@402
|
6444 |
+.LC0:
|
yann@402
|
6445 |
+ .string "asm in progress %lld\n"
|
yann@402
|
6446 |
+.LC1:
|
yann@402
|
6447 |
+ .string "asm in progress\n"
|
yann@402
|
6448 |
+.text
|
yann@402
|
6449 |
+ .align 2
|
yann@402
|
6450 |
+.globl ffi_call_UNIX64
|
yann@402
|
6451 |
+ .type ffi_call_UNIX64,@function
|
yann@402
|
6452 |
+
|
yann@402
|
6453 |
+ffi_call_UNIX64:
|
yann@402
|
6454 |
+.LFB1:
|
yann@402
|
6455 |
+ pushq %rbp
|
yann@402
|
6456 |
+.LCFI0:
|
yann@402
|
6457 |
+ movq %rsp, %rbp
|
yann@402
|
6458 |
+.LCFI1:
|
yann@402
|
6459 |
+ /* Save all arguments */
|
yann@402
|
6460 |
+ subq $48, %rsp
|
yann@402
|
6461 |
+.LCFI2:
|
yann@402
|
6462 |
+ movq %rdi, -8(%rbp) /* ffi_prep_args */
|
yann@402
|
6463 |
+ movq %rsi, -16(%rbp) /* ffi_fill_return_value */
|
yann@402
|
6464 |
+ movq %rdx, -24(%rbp) /* ecif */
|
yann@402
|
6465 |
+ movq %rcx, -32(%rbp) /* cif->bytes */
|
yann@402
|
6466 |
+ movq %r8, -40(%rbp) /* ecif.rvalue */
|
yann@402
|
6467 |
+ movq %r9, -48(%rbp) /* fn */
|
yann@402
|
6468 |
+
|
yann@402
|
6469 |
+ /* Make room for all of the new args and the register args */
|
yann@402
|
6470 |
+ addl $176, %ecx
|
yann@402
|
6471 |
+.LCFI3:
|
yann@402
|
6472 |
+ subq %rcx, %rsp
|
yann@402
|
6473 |
+.LCFI4:
|
yann@402
|
6474 |
+ /* Setup the call to ffi_prep_args. */
|
yann@402
|
6475 |
+ movq %rdi, %rax /* &ffi_prep_args */
|
yann@402
|
6476 |
+ movq %rsp, %rdi /* stackLayout */
|
yann@402
|
6477 |
+ movq %rdx, %rsi /* ecif */
|
yann@402
|
6478 |
+ call *%rax /* ffi_prep_args(stackLayout, ecif);*/
|
yann@402
|
6479 |
+
|
yann@402
|
6480 |
+ /* ffi_prep_args have put all the register contents into the */
|
yann@402
|
6481 |
+ /* stackLayout struct. Now put the register values in place. */
|
yann@402
|
6482 |
+ movq (%rsp), %rdi
|
yann@402
|
6483 |
+ movq 8(%rsp), %rsi
|
yann@402
|
6484 |
+ movq 16(%rsp), %rdx
|
yann@402
|
6485 |
+ movq 24(%rsp), %rcx
|
yann@402
|
6486 |
+ movq 32(%rsp), %r8
|
yann@402
|
6487 |
+ movq 40(%rsp), %r9
|
yann@402
|
6488 |
+ movaps 48(%rsp), %xmm0
|
yann@402
|
6489 |
+ movaps 64(%rsp), %xmm1
|
yann@402
|
6490 |
+ movaps 80(%rsp), %xmm2
|
yann@402
|
6491 |
+ movaps 96(%rsp), %xmm3
|
yann@402
|
6492 |
+ movaps 112(%rsp), %xmm4
|
yann@402
|
6493 |
+ movaps 128(%rsp), %xmm5
|
yann@402
|
6494 |
+ movaps 144(%rsp), %xmm6
|
yann@402
|
6495 |
+ movaps 160(%rsp), %xmm7
|
yann@402
|
6496 |
+
|
yann@402
|
6497 |
+ /* Remove space for stackLayout so stack arguments are placed
|
yann@402
|
6498 |
+ correctly for the call. */
|
yann@402
|
6499 |
+.LCFI5:
|
yann@402
|
6500 |
+ addq $176, %rsp
|
yann@402
|
6501 |
+.LCFI6:
|
yann@402
|
6502 |
+ /* Call the user function. */
|
yann@402
|
6503 |
+ call *-48(%rbp)
|
yann@402
|
6504 |
+
|
yann@402
|
6505 |
+ /* Make stack space for the return_value struct. */
|
yann@402
|
6506 |
+ subq $64, %rsp
|
yann@402
|
6507 |
+
|
yann@402
|
6508 |
+ /* Fill in all potential return values to this struct. */
|
yann@402
|
6509 |
+ movq %rax, (%rsp)
|
yann@402
|
6510 |
+ movq %rdx, 8(%rsp)
|
yann@402
|
6511 |
+ movaps %xmm0, 16(%rsp)
|
yann@402
|
6512 |
+ movaps %xmm1, 32(%rsp)
|
yann@402
|
6513 |
+ fstpt 48(%rsp)
|
yann@402
|
6514 |
+
|
yann@402
|
6515 |
+ /* Now call ffi_fill_return_value. */
|
yann@402
|
6516 |
+ movq %rsp, %rdi /* struct return_value */
|
yann@402
|
6517 |
+ movq -24(%rbp), %rsi /* ecif */
|
yann@402
|
6518 |
+ movq -16(%rbp), %rax /* &ffi_fill_return_value */
|
yann@402
|
6519 |
+ call *%rax /* call it */
|
yann@402
|
6520 |
+
|
yann@402
|
6521 |
+ /* And the work is done. */
|
yann@402
|
6522 |
+ leave
|
yann@402
|
6523 |
+ ret
|
yann@402
|
6524 |
+.LFE1:
|
yann@402
|
6525 |
+.ffi_call_UNIX64_end:
|
yann@402
|
6526 |
+ .size ffi_call_UNIX64,.ffi_call_UNIX64_end-ffi_call_UNIX64
|
yann@402
|
6527 |
+
|
yann@402
|
6528 |
+.text
|
yann@402
|
6529 |
+ .align 2
|
yann@402
|
6530 |
+.globl float2sse
|
yann@402
|
6531 |
+ .type float2sse,@function
|
yann@402
|
6532 |
+float2sse:
|
yann@402
|
6533 |
+ /* Save the contents of this sse-float in a pointer. */
|
yann@402
|
6534 |
+ movaps %xmm0, (%rdi)
|
yann@402
|
6535 |
+ ret
|
yann@402
|
6536 |
+
|
yann@402
|
6537 |
+ .align 2
|
yann@402
|
6538 |
+.globl floatfloat2sse
|
yann@402
|
6539 |
+ .type floatfloat2sse,@function
|
yann@402
|
6540 |
+floatfloat2sse:
|
yann@402
|
6541 |
+ /* Save the contents of these two sse-floats in a pointer. */
|
yann@402
|
6542 |
+ movq (%rdi), %xmm0
|
yann@402
|
6543 |
+ movaps %xmm0, (%rsi)
|
yann@402
|
6544 |
+ ret
|
yann@402
|
6545 |
+
|
yann@402
|
6546 |
+ .align 2
|
yann@402
|
6547 |
+.globl double2sse
|
yann@402
|
6548 |
+ .type double2sse,@function
|
yann@402
|
6549 |
+double2sse:
|
yann@402
|
6550 |
+ /* Save the contents of this sse-double in a pointer. */
|
yann@402
|
6551 |
+ movaps %xmm0, (%rdi)
|
yann@402
|
6552 |
+ ret
|
yann@402
|
6553 |
+
|
yann@402
|
6554 |
+ .align 2
|
yann@402
|
6555 |
+.globl sse2float
|
yann@402
|
6556 |
+ .type sse2float,@function
|
yann@402
|
6557 |
+sse2float:
|
yann@402
|
6558 |
+ /* Save the contents of this sse-float in a pointer. */
|
yann@402
|
6559 |
+ movaps (%rdi), %xmm0
|
yann@402
|
6560 |
+ ret
|
yann@402
|
6561 |
+
|
yann@402
|
6562 |
+ .align 2
|
yann@402
|
6563 |
+.globl sse2double
|
yann@402
|
6564 |
+ .type sse2double,@function
|
yann@402
|
6565 |
+sse2double:
|
yann@402
|
6566 |
+ /* Save the contents of this pointer in a sse-double. */
|
yann@402
|
6567 |
+ movaps (%rdi), %xmm0
|
yann@402
|
6568 |
+ ret
|
yann@402
|
6569 |
+
|
yann@402
|
6570 |
+ .align 2
|
yann@402
|
6571 |
+.globl sse2floatfloat
|
yann@402
|
6572 |
+ .type sse2floatfloat,@function
|
yann@402
|
6573 |
+sse2floatfloat:
|
yann@402
|
6574 |
+ /* Save the contents of this pointer in two sse-floats. */
|
yann@402
|
6575 |
+ movaps (%rdi), %xmm0
|
yann@402
|
6576 |
+ movq %xmm0, (%rsi)
|
yann@402
|
6577 |
+ ret
|
yann@402
|
6578 |
+
|
yann@402
|
6579 |
+ .align 2
|
yann@402
|
6580 |
+.globl ffi_closure_UNIX64
|
yann@402
|
6581 |
+ .type ffi_closure_UNIX64,@function
|
yann@402
|
6582 |
+
|
yann@402
|
6583 |
+ffi_closure_UNIX64:
|
yann@402
|
6584 |
+.LFB2:
|
yann@402
|
6585 |
+ pushq %rbp
|
yann@402
|
6586 |
+.LCFI10:
|
yann@402
|
6587 |
+ movq %rsp, %rbp
|
yann@402
|
6588 |
+.LCFI11:
|
yann@402
|
6589 |
+ subq $240, %rsp
|
yann@402
|
6590 |
+.LCFI12:
|
yann@402
|
6591 |
+ movq %rdi, -176(%rbp)
|
yann@402
|
6592 |
+ movq %rsi, -168(%rbp)
|
yann@402
|
6593 |
+ movq %rdx, -160(%rbp)
|
yann@402
|
6594 |
+ movq %rcx, -152(%rbp)
|
yann@402
|
6595 |
+ movq %r8, -144(%rbp)
|
yann@402
|
6596 |
+ movq %r9, -136(%rbp)
|
yann@402
|
6597 |
+ /* FIXME: We can avoid all this stashing of XMM registers by
|
yann@402
|
6598 |
+ (in ffi_prep_closure) computing the number of
|
yann@402
|
6599 |
+ floating-point args and moving it into %rax before calling
|
yann@402
|
6600 |
+ this function. Once this is done, uncomment the next few
|
yann@402
|
6601 |
+ lines and only the essential XMM registers will be written
|
yann@402
|
6602 |
+ to memory. This is a significant saving. */
|
yann@402
|
6603 |
+/* movzbl %al, %eax */
|
yann@402
|
6604 |
+/* movq %rax, %rdx */
|
yann@402
|
6605 |
+/* leaq 0(,%rdx,4), %rax */
|
yann@402
|
6606 |
+/* leaq 2f(%rip), %rdx */
|
yann@402
|
6607 |
+/* subq %rax, %rdx */
|
yann@402
|
6608 |
+ leaq -1(%rbp), %rax
|
yann@402
|
6609 |
+/* jmp *%rdx */
|
yann@402
|
6610 |
+ movaps %xmm7, -15(%rax)
|
yann@402
|
6611 |
+ movaps %xmm6, -31(%rax)
|
yann@402
|
6612 |
+ movaps %xmm5, -47(%rax)
|
yann@402
|
6613 |
+ movaps %xmm4, -63(%rax)
|
yann@402
|
6614 |
+ movaps %xmm3, -79(%rax)
|
yann@402
|
6615 |
+ movaps %xmm2, -95(%rax)
|
yann@402
|
6616 |
+ movaps %xmm1, -111(%rax)
|
yann@402
|
6617 |
+ movaps %xmm0, -127(%rax)
|
yann@402
|
6618 |
+2:
|
yann@402
|
6619 |
+ movl %edi, -180(%rbp)
|
yann@402
|
6620 |
+ movl $0, -224(%rbp)
|
yann@402
|
6621 |
+ movl $48, -220(%rbp)
|
yann@402
|
6622 |
+ leaq 16(%rbp), %rax
|
yann@402
|
6623 |
+ movq %rax, -216(%rbp)
|
yann@402
|
6624 |
+ leaq -176(%rbp), %rdx
|
yann@402
|
6625 |
+ movq %rdx, -208(%rbp)
|
yann@402
|
6626 |
+ leaq -224(%rbp), %rsi
|
yann@402
|
6627 |
+ movq %r10, %rdi
|
yann@402
|
6628 |
+ movq %rsp, %rdx
|
yann@402
|
6629 |
+ call ffi_closure_UNIX64_inner@PLT
|
yann@402
|
6630 |
+
|
yann@402
|
6631 |
+ cmpl $FFI_TYPE_FLOAT, %eax
|
yann@402
|
6632 |
+ je 1f
|
yann@402
|
6633 |
+ cmpl $FFI_TYPE_DOUBLE, %eax
|
yann@402
|
6634 |
+ je 2f
|
yann@402
|
6635 |
+ cmpl $FFI_TYPE_LONGDOUBLE, %eax
|
yann@402
|
6636 |
+ je 3f
|
yann@402
|
6637 |
+ cmpl $FFI_TYPE_STRUCT, %eax
|
yann@402
|
6638 |
+ je 4f
|
yann@402
|
6639 |
+ popq %rax
|
yann@402
|
6640 |
+ leave
|
yann@402
|
6641 |
+ ret
|
yann@402
|
6642 |
+1:
|
yann@402
|
6643 |
+2:
|
yann@402
|
6644 |
+3:
|
yann@402
|
6645 |
+ movaps -240(%rbp), %xmm0
|
yann@402
|
6646 |
+ leave
|
yann@402
|
6647 |
+ ret
|
yann@402
|
6648 |
+4:
|
yann@402
|
6649 |
+ leave
|
yann@402
|
6650 |
+ ret
|
yann@402
|
6651 |
+.LFE2:
|
yann@402
|
6652 |
+
|
yann@402
|
6653 |
+ .section .eh_frame,"a",@progbits
|
yann@402
|
6654 |
+.Lframe0:
|
yann@402
|
6655 |
+ .long .LECIE1-.LSCIE1
|
yann@402
|
6656 |
+.LSCIE1:
|
yann@402
|
6657 |
+ .long 0x0
|
yann@402
|
6658 |
+ .byte 0x1
|
yann@402
|
6659 |
+ .string "zR"
|
yann@402
|
6660 |
+ .uleb128 0x1
|
yann@402
|
6661 |
+ .sleb128 -8
|
yann@402
|
6662 |
+ .byte 0x10
|
yann@402
|
6663 |
+ .uleb128 0x1
|
yann@402
|
6664 |
+ .byte 0x1b
|
yann@402
|
6665 |
+ .byte 0xc
|
yann@402
|
6666 |
+ .uleb128 0x7
|
yann@402
|
6667 |
+ .uleb128 0x8
|
yann@402
|
6668 |
+ .byte 0x90
|
yann@402
|
6669 |
+ .uleb128 0x1
|
yann@402
|
6670 |
+ .align 8
|
yann@402
|
6671 |
+.LECIE1:
|
yann@402
|
6672 |
+.LSFDE1:
|
yann@402
|
6673 |
+ .long .LEFDE1-.LASFDE1
|
yann@402
|
6674 |
+.LASFDE1:
|
yann@402
|
6675 |
+ .long .LASFDE1-.Lframe0
|
yann@402
|
6676 |
+
|
yann@402
|
6677 |
+ .long .LFB1-.
|
yann@402
|
6678 |
+ .long .LFE1-.LFB1
|
yann@402
|
6679 |
+ .uleb128 0x0
|
yann@402
|
6680 |
+ .byte 0x4 # DW_CFA_advance_loc4
|
yann@402
|
6681 |
+ .long .LCFI0-.LFB1
|
yann@402
|
6682 |
+ .byte 0xe # DW_CFA_def_cfa_offset
|
yann@402
|
6683 |
+ .uleb128 0x10
|
yann@402
|
6684 |
+ .byte 0x86 # DW_CFA_offset: r6 at cfa-16
|
yann@402
|
6685 |
+ .uleb128 0x2
|
yann@402
|
6686 |
+ .byte 0x4 # DW_CFA_advance_loc4
|
yann@402
|
6687 |
+ .long .LCFI1-.LCFI0
|
yann@402
|
6688 |
+ .byte 0x86 # DW_CFA_offset: r6 at cfa-16
|
yann@402
|
6689 |
+ .uleb128 0x2
|
yann@402
|
6690 |
+ .byte 0xd # DW_CFA_def_cfa_reg: r6
|
yann@402
|
6691 |
+ .uleb128 0x6
|
yann@402
|
6692 |
+ .align 8
|
yann@402
|
6693 |
+.LEFDE1:
|
yann@402
|
6694 |
+.LSFDE3:
|
yann@402
|
6695 |
+ .long .LEFDE3-.LASFDE3 # FDE Length
|
yann@402
|
6696 |
+.LASFDE3:
|
yann@402
|
6697 |
+ .long .LASFDE3-.Lframe0 # FDE CIE offset
|
yann@402
|
6698 |
+
|
yann@402
|
6699 |
+ .long .LFB2-. # FDE initial location
|
yann@402
|
6700 |
+ .long .LFE2-.LFB2 # FDE address range
|
yann@402
|
6701 |
+ .uleb128 0x0 # Augmentation size
|
yann@402
|
6702 |
+ .byte 0x4 # DW_CFA_advance_loc4
|
yann@402
|
6703 |
+ .long .LCFI10-.LFB2
|
yann@402
|
6704 |
+ .byte 0xe # DW_CFA_def_cfa_offset
|
yann@402
|
6705 |
+ .uleb128 0x10
|
yann@402
|
6706 |
+ .byte 0x86 # DW_CFA_offset, column 0x6
|
yann@402
|
6707 |
+ .uleb128 0x2
|
yann@402
|
6708 |
+ .byte 0x4 # DW_CFA_advance_loc4
|
yann@402
|
6709 |
+ .long .LCFI11-.LCFI10
|
yann@402
|
6710 |
+ .byte 0xd # DW_CFA_def_cfa_register
|
yann@402
|
6711 |
+ .uleb128 0x6
|
yann@402
|
6712 |
+ .align 8
|
yann@402
|
6713 |
+.LEFDE3:
|
yann@402
|
6714 |
+
|
yann@402
|
6715 |
+#endif /* __x86_64__ */
|
yann@402
|
6716 |
diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/win32.S gcc/libffi/src/x86/win32.S
|
yann@402
|
6717 |
--- gcc-3.2.2.orig/libffi/src/x86/win32.S Tue Mar 27 11:39:16 2001
|
yann@402
|
6718 |
+++ gcc/libffi/src/x86/win32.S Fri Dec 6 10:16:45 2002
|
yann@402
|
6719 |
@@ -1,5 +1,8 @@
|
yann@402
|
6720 |
/* -----------------------------------------------------------------------
|
yann@402
|
6721 |
- win32.S - Copyright (c) 1996, 1998, 2001 Cygnus Solutions
|
yann@402
|
6722 |
+ win32.S - Copyright (c) 1996, 1998, 2001, 2002 Red Hat, Inc.
|
yann@402
|
6723 |
+ Copyright (c) 2001 John Beniton
|
yann@402
|
6724 |
+ Copyright (c) 2002 Ranjit Mathew
|
yann@402
|
6725 |
+
|
yann@402
|
6726 |
|
yann@402
|
6727 |
X86 Foreign Function Interface
|
yann@402
|
6728 |
|
yann@402
|
6729 |
@@ -52,7 +55,10 @@
|
yann@402
|
6730 |
# Return stack to previous state and call the function
|
yann@402
|
6731 |
addl $8,%esp
|
yann@402
|
6732 |
|
yann@402
|
6733 |
- call *28(%ebp)
|
yann@402
|
6734 |
+ # FIXME: Align the stack to a 128-bit boundary to avoid
|
yann@402
|
6735 |
+ # potential performance hits.
|
yann@402
|
6736 |
+
|
yann@402
|
6737 |
+ call *28(%ebp)
|
yann@402
|
6738 |
|
yann@402
|
6739 |
# Remove the space we pushed for the args
|
yann@402
|
6740 |
movl 16(%ebp),%ecx
|
yann@402
|
6741 |
@@ -123,3 +129,98 @@
|
yann@402
|
6742 |
ret
|
yann@402
|
6743 |
|
yann@402
|
6744 |
.ffi_call_SYSV_end:
|
yann@402
|
6745 |
+
|
yann@402
|
6746 |
+ # This assumes we are using gas.
|
yann@402
|
6747 |
+ .balign 16
|
yann@402
|
6748 |
+.globl _ffi_call_STDCALL
|
yann@402
|
6749 |
+
|
yann@402
|
6750 |
+_ffi_call_STDCALL:
|
yann@402
|
6751 |
+ pushl %ebp
|
yann@402
|
6752 |
+ movl %esp,%ebp
|
yann@402
|
6753 |
+
|
yann@402
|
6754 |
+ # Make room for all of the new args.
|
yann@402
|
6755 |
+ movl 16(%ebp),%ecx
|
yann@402
|
6756 |
+ subl %ecx,%esp
|
yann@402
|
6757 |
+
|
yann@402
|
6758 |
+ movl %esp,%eax
|
yann@402
|
6759 |
+
|
yann@402
|
6760 |
+ # Place all of the ffi_prep_args in position
|
yann@402
|
6761 |
+ pushl 12(%ebp)
|
yann@402
|
6762 |
+ pushl %eax
|
yann@402
|
6763 |
+ call *8(%ebp)
|
yann@402
|
6764 |
+
|
yann@402
|
6765 |
+ # Return stack to previous state and call the function
|
yann@402
|
6766 |
+ addl $8,%esp
|
yann@402
|
6767 |
+
|
yann@402
|
6768 |
+ # FIXME: Align the stack to a 128-bit boundary to avoid
|
yann@402
|
6769 |
+ # potential performance hits.
|
yann@402
|
6770 |
+
|
yann@402
|
6771 |
+ call *28(%ebp)
|
yann@402
|
6772 |
+
|
yann@402
|
6773 |
+ # stdcall functions pop arguments off the stack themselves
|
yann@402
|
6774 |
+
|
yann@402
|
6775 |
+ # Load %ecx with the return type code
|
yann@402
|
6776 |
+ movl 20(%ebp),%ecx
|
yann@402
|
6777 |
+
|
yann@402
|
6778 |
+ # If the return value pointer is NULL, assume no return value.
|
yann@402
|
6779 |
+ cmpl $0,24(%ebp)
|
yann@402
|
6780 |
+ jne sc_retint
|
yann@402
|
6781 |
+
|
yann@402
|
6782 |
+ # Even if there is no space for the return value, we are
|
yann@402
|
6783 |
+ # obliged to handle floating-point values.
|
yann@402
|
6784 |
+ cmpl $FFI_TYPE_FLOAT,%ecx
|
yann@402
|
6785 |
+ jne sc_noretval
|
yann@402
|
6786 |
+ fstp %st(0)
|
yann@402
|
6787 |
+
|
yann@402
|
6788 |
+ jmp sc_epilogue
|
yann@402
|
6789 |
+
|
yann@402
|
6790 |
+sc_retint:
|
yann@402
|
6791 |
+ cmpl $FFI_TYPE_INT,%ecx
|
yann@402
|
6792 |
+ jne sc_retfloat
|
yann@402
|
6793 |
+ # Load %ecx with the pointer to storage for the return value
|
yann@402
|
6794 |
+ movl 24(%ebp),%ecx
|
yann@402
|
6795 |
+ movl %eax,0(%ecx)
|
yann@402
|
6796 |
+ jmp sc_epilogue
|
yann@402
|
6797 |
+
|
yann@402
|
6798 |
+sc_retfloat:
|
yann@402
|
6799 |
+ cmpl $FFI_TYPE_FLOAT,%ecx
|
yann@402
|
6800 |
+ jne sc_retdouble
|
yann@402
|
6801 |
+ # Load %ecx with the pointer to storage for the return value
|
yann@402
|
6802 |
+ movl 24(%ebp),%ecx
|
yann@402
|
6803 |
+ fstps (%ecx)
|
yann@402
|
6804 |
+ jmp sc_epilogue
|
yann@402
|
6805 |
+
|
yann@402
|
6806 |
+sc_retdouble:
|
yann@402
|
6807 |
+ cmpl $FFI_TYPE_DOUBLE,%ecx
|
yann@402
|
6808 |
+ jne sc_retlongdouble
|
yann@402
|
6809 |
+ # Load %ecx with the pointer to storage for the return value
|
yann@402
|
6810 |
+ movl 24(%ebp),%ecx
|
yann@402
|
6811 |
+ fstpl (%ecx)
|
yann@402
|
6812 |
+ jmp sc_epilogue
|
yann@402
|
6813 |
+
|
yann@402
|
6814 |
+sc_retlongdouble:
|
yann@402
|
6815 |
+ cmpl $FFI_TYPE_LONGDOUBLE,%ecx
|
yann@402
|
6816 |
+ jne sc_retint64
|
yann@402
|
6817 |
+ # Load %ecx with the pointer to storage for the return value
|
yann@402
|
6818 |
+ movl 24(%ebp),%ecx
|
yann@402
|
6819 |
+ fstpt (%ecx)
|
yann@402
|
6820 |
+ jmp sc_epilogue
|
yann@402
|
6821 |
+
|
yann@402
|
6822 |
+sc_retint64:
|
yann@402
|
6823 |
+ cmpl $FFI_TYPE_SINT64,%ecx
|
yann@402
|
6824 |
+ jne sc_retstruct
|
yann@402
|
6825 |
+ # Load %ecx with the pointer to storage for the return value
|
yann@402
|
6826 |
+ movl 24(%ebp),%ecx
|
yann@402
|
6827 |
+ movl %eax,0(%ecx)
|
yann@402
|
6828 |
+ movl %edx,4(%ecx)
|
yann@402
|
6829 |
+
|
yann@402
|
6830 |
+sc_retstruct:
|
yann@402
|
6831 |
+ # Nothing to do!
|
yann@402
|
6832 |
+
|
yann@402
|
6833 |
+sc_noretval:
|
yann@402
|
6834 |
+sc_epilogue:
|
yann@402
|
6835 |
+ movl %ebp,%esp
|
yann@402
|
6836 |
+ popl %ebp
|
yann@402
|
6837 |
+ ret
|
yann@402
|
6838 |
+
|
yann@402
|
6839 |
+.ffi_call_STDCALL_end:
|
yann@402
|
6840 |
--- gcc-3.2.2.orig/libjava/configure.host Mon Jun 10 13:15:26 2002
|
yann@402
|
6841 |
+++ gcc-3.2.2/libjava/configure.host Sat Feb 15 19:57:25 2003
|
yann@402
|
6842 |
@@ -115,6 +115,12 @@
|
yann@402
|
6843 |
enable_getenv_properties_default=no
|
yann@402
|
6844 |
enable_main_args_default=no
|
yann@402
|
6845 |
;;
|
yann@402
|
6846 |
+ sh-* | sh[34]*-*)
|
yann@402
|
6847 |
+ sysdeps_dir=sh
|
yann@402
|
6848 |
+ libgcj_flags="${libgcj_flags} -mieee"
|
yann@402
|
6849 |
+ libgcj_interpreter=yes
|
yann@402
|
6850 |
+ enable_hash_synchronization_default=yes
|
yann@402
|
6851 |
+ ;;
|
yann@402
|
6852 |
esac
|
yann@402
|
6853 |
|
yann@402
|
6854 |
# This case statement supports generic port properties and may refine
|
yann@402
|
6855 |
@@ -126,7 +132,8 @@
|
yann@402
|
6856 |
powerpc*-linux* | \
|
yann@402
|
6857 |
alpha*-linux* | \
|
yann@402
|
6858 |
sparc*-linux* | \
|
yann@402
|
6859 |
- ia64-*)
|
yann@402
|
6860 |
+ ia64-* | \
|
yann@402
|
6861 |
+ sh-linux* | sh[34]*-linux*)
|
yann@402
|
6862 |
can_unwind_signal=yes
|
yann@402
|
6863 |
;;
|
yann@402
|
6864 |
*-*-darwin*)
|