a50d8a59d574a26ab2abb940ff18880689738455
[libffi.git] / patches / ios
1 Index: libffi/ChangeLog
2 ===================================================================
3 --- libffi.orig/ChangeLog
4 +++ libffi/ChangeLog
5 @@ -93,6 +93,29 @@
6  
7         * configure: Regenerate.
8  
9 +2011-02-09  Anthony Green <green@moxielogic.com>
10 +
11 +       * README: Mention ARM iOS.
12 +
13 +2011-02-09  Landon Fuller <landonf@macports.org>
14 +
15 +       * Makefile.am (EXTRA_DIST): Add build-ios.sh, src/arm/gentramp.sh,
16 +       src/arm/trampoline.S.
17 +       (nodist_libffi_la_SOURCES): Add src/arc/trampoline.S.
18 +       * configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Define.
19 +       * src/arm/ffi.c (ffi_trampoline_table)
20 +       (ffi_closure_trampoline_table_page, ffi_trampoline_table_entry)
21 +       (FFI_TRAMPOLINE_CODELOC_CONFIG, FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET)
22 +       (FFI_TRAMPOLINE_COUNT, ffi_trampoline_lock, ffi_trampoline_tables)
23 +       (ffi_trampoline_table_alloc, ffi_closure_alloc, ffi_closure_free):
24 +       Define for FFI_EXEC_TRAMPOLINE_TABLE case (iOS).
25 +       (ffi_prep_closure_loc): Handl FFI_EXEC_TRAMPOLINE_TABLE case
26 +       separately.
27 +       * src/arm/sysv.S: Handle Apple iOS host.
28 +       * src/closures.c: Handle FFI_EXEC_TRAMPOLINE_TABLE case.
29 +       * build-ios.sh: New file.
30 +       * fficonfig.h.in, configure, Makefile.in: Rebuilt.
31 +
32  2011-02-08  Oren Held  <orenhe@il.ibm.com>
33  
34         * src/dlmalloc.c (_STRUCT_MALLINFO): Define in order to avoid
35 Index: libffi/Makefile.am
36 ===================================================================
37 --- libffi.orig/Makefile.am
38 +++ libffi/Makefile.am
39 @@ -10,31 +10,28 @@ EXTRA_DIST = LICENSE ChangeLog.v1 Change
40         src/avr32/ffi.c src/avr32/sysv.S src/avr32/ffitarget.h \
41         src/cris/ffi.c src/cris/sysv.S src/cris/ffitarget.h \
42         src/ia64/ffi.c src/ia64/ffitarget.h src/ia64/ia64_flags.h \
43 -       src/ia64/unix.S \
44 -       src/mips/ffi.c src/mips/n32.S src/mips/o32.S \
45 -       src/mips/ffitarget.h \
46 -       src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \
47 -       src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \
48 -       src/powerpc/ffi.c src/powerpc/sysv.S \
49 +       src/ia64/unix.S src/mips/ffi.c src/mips/n32.S src/mips/o32.S \
50 +       src/mips/ffitarget.h src/m32r/ffi.c src/m32r/sysv.S \
51 +       src/m32r/ffitarget.h src/m68k/ffi.c src/m68k/sysv.S \
52 +       src/m68k/ffitarget.h src/powerpc/ffi.c src/powerpc/sysv.S \
53         src/powerpc/linux64.S src/powerpc/linux64_closure.S \
54 -       src/powerpc/ppc_closure.S src/powerpc/asm.h \
55 -       src/powerpc/aix.S src/powerpc/darwin.S \
56 -       src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \
57 -       src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \
58 -       src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \
59 -       src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h \
60 -       src/sh64/ffi.c src/sh64/sysv.S src/sh64/ffitarget.h \
61 -       src/sparc/v8.S src/sparc/v9.S src/sparc/ffitarget.h \
62 -       src/sparc/ffi.c src/x86/darwin64.S \
63 +       src/powerpc/ppc_closure.S src/powerpc/asm.h src/powerpc/aix.S \
64 +       src/powerpc/darwin.S src/powerpc/aix_closure.S \
65 +       src/powerpc/darwin_closure.S src/powerpc/ffi_darwin.c \
66 +       src/powerpc/ffitarget.h src/s390/ffi.c src/s390/sysv.S \
67 +       src/s390/ffitarget.h src/sh/ffi.c src/sh/sysv.S \
68 +       src/sh/ffitarget.h src/sh64/ffi.c src/sh64/sysv.S \
69 +       src/sh64/ffitarget.h src/sparc/v8.S src/sparc/v9.S \
70 +       src/sparc/ffitarget.h src/sparc/ffi.c src/x86/darwin64.S \
71         src/x86/ffi.c src/x86/sysv.S src/x86/win32.S src/x86/darwin.S \
72 -       src/x86/win64.S src/x86/freebsd.S \
73 -       src/x86/ffi64.c src/x86/unix64.S src/x86/ffitarget.h \
74 -       src/pa/ffitarget.h src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S \
75 -       src/frv/ffi.c src/frv/eabi.S src/frv/ffitarget.h \
76 -       src/dlmalloc.c \
77 -       src/moxie/ffi.c src/moxie/eabi.S \
78 -       libtool-version ChangeLog.libffi m4/libtool.m4 \
79 -       m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4
80 +       src/x86/win64.S src/x86/freebsd.S src/x86/ffi64.c \
81 +       src/x86/unix64.S src/x86/ffitarget.h src/pa/ffitarget.h \
82 +       src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c \
83 +       src/frv/eabi.S src/frv/ffitarget.h src/dlmalloc.c \
84 +       src/moxie/ffi.c src/moxie/eabi.S libtool-version \
85 +       ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4 \
86 +       m4/ltoptions.m4 m4/ltsugar.m4
87 +       m4/ltversion.m4 build-ios.sh src/arm/gentramp.sh
88  
89  info_TEXINFOS = doc/libffi.texi
90  
91 @@ -144,6 +141,9 @@ nodist_libffi_la_SOURCES += src/powerpc/
92  endif
93  if ARM
94  nodist_libffi_la_SOURCES += src/arm/sysv.S src/arm/ffi.c
95 +if FFI_EXEC_TRAMPOLINE_TABLE
96 +nodist_libffi_la_SOURCES += src/arm/trampoline.S
97 +endif
98  endif
99  if AVR32
100  nodist_libffi_la_SOURCES += src/avr32/sysv.S src/avr32/ffi.c
101 Index: libffi/Makefile.in
102 ===================================================================
103 --- libffi.orig/Makefile.in
104 +++ libffi/Makefile.in
105 @@ -52,21 +52,22 @@ target_triplet = @target@
106  @POWERPC_DARWIN_TRUE@am__append_14 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
107  @POWERPC_FREEBSD_TRUE@am__append_15 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
108  @ARM_TRUE@am__append_16 = src/arm/sysv.S src/arm/ffi.c
109 -@AVR32_TRUE@am__append_17 = src/avr32/sysv.S src/avr32/ffi.c
110 -@LIBFFI_CRIS_TRUE@am__append_18 = src/cris/sysv.S src/cris/ffi.c
111 -@FRV_TRUE@am__append_19 = src/frv/eabi.S src/frv/ffi.c
112 -@MOXIE_TRUE@am__append_20 = src/moxie/eabi.S src/moxie/ffi.c
113 -@S390_TRUE@am__append_21 = src/s390/sysv.S src/s390/ffi.c
114 -@X86_64_TRUE@am__append_22 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
115 -@SH_TRUE@am__append_23 = src/sh/sysv.S src/sh/ffi.c
116 -@SH64_TRUE@am__append_24 = src/sh64/sysv.S src/sh64/ffi.c
117 -@PA_LINUX_TRUE@am__append_25 = src/pa/linux.S src/pa/ffi.c
118 -@PA_HPUX_TRUE@am__append_26 = src/pa/hpux32.S src/pa/ffi.c
119 +@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__append_17 = src/arm/trampoline.S
120 +@AVR32_TRUE@am__append_18 = src/avr32/sysv.S src/avr32/ffi.c
121 +@LIBFFI_CRIS_TRUE@am__append_19 = src/cris/sysv.S src/cris/ffi.c
122 +@FRV_TRUE@am__append_20 = src/frv/eabi.S src/frv/ffi.c
123 +@MOXIE_TRUE@am__append_21 = src/moxie/eabi.S src/moxie/ffi.c
124 +@S390_TRUE@am__append_22 = src/s390/sysv.S src/s390/ffi.c
125 +@X86_64_TRUE@am__append_23 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
126 +@SH_TRUE@am__append_24 = src/sh/sysv.S src/sh/ffi.c
127 +@SH64_TRUE@am__append_25 = src/sh64/sysv.S src/sh64/ffi.c
128 +@PA_LINUX_TRUE@am__append_26 = src/pa/linux.S src/pa/ffi.c
129 +@PA_HPUX_TRUE@am__append_27 = src/pa/hpux32.S src/pa/ffi.c
130  # Build debug. Define FFI_DEBUG on the commandline so that, when building with
131  # MSVC, it can link against the debug CRT.
132 -@FFI_DEBUG_TRUE@am__append_27 = -DFFI_DEBUG
133 +@FFI_DEBUG_TRUE@am__append_28 = -DFFI_DEBUG
134  # Build opt.
135 -@FFI_DEBUG_FALSE@am__append_28 = -O2
136 +@FFI_DEBUG_FALSE@am__append_29 = -O2
137  subdir = .
138  DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
139         $(srcdir)/Makefile.in $(srcdir)/doc/stamp-vti \
140 @@ -144,17 +145,18 @@ am_libffi_la_OBJECTS = src/debug.lo src/
141  @POWERPC_FREEBSD_TRUE@ src/powerpc/sysv.lo \
142  @POWERPC_FREEBSD_TRUE@ src/powerpc/ppc_closure.lo
143  @ARM_TRUE@am__objects_16 = src/arm/sysv.lo src/arm/ffi.lo
144 -@AVR32_TRUE@am__objects_17 = src/avr32/sysv.lo src/avr32/ffi.lo
145 -@LIBFFI_CRIS_TRUE@am__objects_18 = src/cris/sysv.lo src/cris/ffi.lo
146 -@FRV_TRUE@am__objects_19 = src/frv/eabi.lo src/frv/ffi.lo
147 -@MOXIE_TRUE@am__objects_20 = src/moxie/eabi.lo src/moxie/ffi.lo
148 -@S390_TRUE@am__objects_21 = src/s390/sysv.lo src/s390/ffi.lo
149 -@X86_64_TRUE@am__objects_22 = src/x86/ffi64.lo src/x86/unix64.lo \
150 +@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__objects_17 = src/arm/trampoline.lo
151 +@AVR32_TRUE@am__objects_18 = src/avr32/sysv.lo src/avr32/ffi.lo
152 +@LIBFFI_CRIS_TRUE@am__objects_19 = src/cris/sysv.lo src/cris/ffi.lo
153 +@FRV_TRUE@am__objects_20 = src/frv/eabi.lo src/frv/ffi.lo
154 +@MOXIE_TRUE@am__objects_21 = src/moxie/eabi.lo src/moxie/ffi.lo
155 +@S390_TRUE@am__objects_22 = src/s390/sysv.lo src/s390/ffi.lo
156 +@X86_64_TRUE@am__objects_23 = src/x86/ffi64.lo src/x86/unix64.lo \
157  @X86_64_TRUE@  src/x86/ffi.lo src/x86/sysv.lo
158 -@SH_TRUE@am__objects_23 = src/sh/sysv.lo src/sh/ffi.lo
159 -@SH64_TRUE@am__objects_24 = src/sh64/sysv.lo src/sh64/ffi.lo
160 -@PA_LINUX_TRUE@am__objects_25 = src/pa/linux.lo src/pa/ffi.lo
161 -@PA_HPUX_TRUE@am__objects_26 = src/pa/hpux32.lo src/pa/ffi.lo
162 +@SH_TRUE@am__objects_24 = src/sh/sysv.lo src/sh/ffi.lo
163 +@SH64_TRUE@am__objects_25 = src/sh64/sysv.lo src/sh64/ffi.lo
164 +@PA_LINUX_TRUE@am__objects_26 = src/pa/linux.lo src/pa/ffi.lo
165 +@PA_HPUX_TRUE@am__objects_27 = src/pa/hpux32.lo src/pa/ffi.lo
166  nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
167         $(am__objects_3) $(am__objects_4) $(am__objects_5) \
168         $(am__objects_6) $(am__objects_7) $(am__objects_8) \
169 @@ -163,17 +165,18 @@ nodist_libffi_la_OBJECTS = $(am__objects
170         $(am__objects_15) $(am__objects_16) $(am__objects_17) \
171         $(am__objects_18) $(am__objects_19) $(am__objects_20) \
172         $(am__objects_21) $(am__objects_22) $(am__objects_23) \
173 -       $(am__objects_24) $(am__objects_25) $(am__objects_26)
174 +       $(am__objects_24) $(am__objects_25) $(am__objects_26) \
175 +       $(am__objects_27)
176  libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \
177         $(nodist_libffi_la_OBJECTS)
178  libffi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
179         $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
180         $(libffi_la_LDFLAGS) $(LDFLAGS) -o $@
181  libffi_convenience_la_LIBADD =
182 -am__objects_27 = src/debug.lo src/prep_cif.lo src/types.lo \
183 +am__objects_28 = src/debug.lo src/prep_cif.lo src/types.lo \
184         src/raw_api.lo src/java_raw_api.lo src/closures.lo
185 -am_libffi_convenience_la_OBJECTS = $(am__objects_27)
186 -am__objects_28 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
187 +am_libffi_convenience_la_OBJECTS = $(am__objects_28)
188 +am__objects_29 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
189         $(am__objects_4) $(am__objects_5) $(am__objects_6) \
190         $(am__objects_7) $(am__objects_8) $(am__objects_9) \
191         $(am__objects_10) $(am__objects_11) $(am__objects_12) \
192 @@ -181,8 +184,8 @@ am__objects_28 = $(am__objects_1) $(am__
193         $(am__objects_16) $(am__objects_17) $(am__objects_18) \
194         $(am__objects_19) $(am__objects_20) $(am__objects_21) \
195         $(am__objects_22) $(am__objects_23) $(am__objects_24) \
196 -       $(am__objects_25) $(am__objects_26)
197 -nodist_libffi_convenience_la_OBJECTS = $(am__objects_28)
198 +       $(am__objects_25) $(am__objects_26) $(am__objects_27)
199 +nodist_libffi_convenience_la_OBJECTS = $(am__objects_29)
200  libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \
201         $(nodist_libffi_convenience_la_OBJECTS)
202  DEFAULT_INCLUDES = -I.@am__isrc@
203 @@ -300,6 +303,7 @@ ECHO_N = @ECHO_N@
204  ECHO_T = @ECHO_T@
205  EGREP = @EGREP@
206  EXEEXT = @EXEEXT@
207 +FFI_EXEC_TRAMPOLINE_TABLE = @FFI_EXEC_TRAMPOLINE_TABLE@
208  FGREP = @FGREP@
209  GREP = @GREP@
210  HAVE_LONG_DOUBLE = @HAVE_LONG_DOUBLE@
211 @@ -408,31 +412,27 @@ EXTRA_DIST = LICENSE ChangeLog.v1 Change
212         src/avr32/ffi.c src/avr32/sysv.S src/avr32/ffitarget.h \
213         src/cris/ffi.c src/cris/sysv.S src/cris/ffitarget.h \
214         src/ia64/ffi.c src/ia64/ffitarget.h src/ia64/ia64_flags.h \
215 -       src/ia64/unix.S \
216 -       src/mips/ffi.c src/mips/n32.S src/mips/o32.S \
217 -       src/mips/ffitarget.h \
218 -       src/m32r/ffi.c src/m32r/sysv.S src/m32r/ffitarget.h \
219 -       src/m68k/ffi.c src/m68k/sysv.S src/m68k/ffitarget.h \
220 -       src/powerpc/ffi.c src/powerpc/sysv.S \
221 +       src/ia64/unix.S src/mips/ffi.c src/mips/n32.S src/mips/o32.S \
222 +       src/mips/ffitarget.h src/m32r/ffi.c src/m32r/sysv.S \
223 +       src/m32r/ffitarget.h src/m68k/ffi.c src/m68k/sysv.S \
224 +       src/m68k/ffitarget.h src/powerpc/ffi.c src/powerpc/sysv.S \
225         src/powerpc/linux64.S src/powerpc/linux64_closure.S \
226 -       src/powerpc/ppc_closure.S src/powerpc/asm.h \
227 -       src/powerpc/aix.S src/powerpc/darwin.S \
228 -       src/powerpc/aix_closure.S src/powerpc/darwin_closure.S \
229 -       src/powerpc/ffi_darwin.c src/powerpc/ffitarget.h \
230 -       src/s390/ffi.c src/s390/sysv.S src/s390/ffitarget.h \
231 -       src/sh/ffi.c src/sh/sysv.S src/sh/ffitarget.h \
232 -       src/sh64/ffi.c src/sh64/sysv.S src/sh64/ffitarget.h \
233 -       src/sparc/v8.S src/sparc/v9.S src/sparc/ffitarget.h \
234 -       src/sparc/ffi.c src/x86/darwin64.S \
235 +       src/powerpc/ppc_closure.S src/powerpc/asm.h src/powerpc/aix.S \
236 +       src/powerpc/darwin.S src/powerpc/aix_closure.S \
237 +       src/powerpc/darwin_closure.S src/powerpc/ffi_darwin.c \
238 +       src/powerpc/ffitarget.h src/s390/ffi.c src/s390/sysv.S \
239 +       src/s390/ffitarget.h src/sh/ffi.c src/sh/sysv.S \
240 +       src/sh/ffitarget.h src/sh64/ffi.c src/sh64/sysv.S \
241 +       src/sh64/ffitarget.h src/sparc/v8.S src/sparc/v9.S \
242 +       src/sparc/ffitarget.h src/sparc/ffi.c src/x86/darwin64.S \
243         src/x86/ffi.c src/x86/sysv.S src/x86/win32.S src/x86/darwin.S \
244 -       src/x86/win64.S src/x86/freebsd.S \
245 -       src/x86/ffi64.c src/x86/unix64.S src/x86/ffitarget.h \
246 -       src/pa/ffitarget.h src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S \
247 -       src/frv/ffi.c src/frv/eabi.S src/frv/ffitarget.h \
248 -       src/dlmalloc.c \
249 -       src/moxie/ffi.c src/moxie/eabi.S \
250 -       libtool-version ChangeLog.libffi m4/libtool.m4 \
251 -       m4/lt~obsolete.m4 m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4
252 +       src/x86/win64.S src/x86/freebsd.S src/x86/ffi64.c \
253 +       src/x86/unix64.S src/x86/ffitarget.h src/pa/ffitarget.h \
254 +       src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c \
255 +       src/frv/eabi.S src/frv/ffitarget.h src/dlmalloc.c \
256 +       src/moxie/ffi.c src/moxie/eabi.S libtool-version \
257 +       ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4 \
258 +       m4/ltoptions.m4 m4/ltsugar.m4
259  
260  info_TEXINFOS = doc/libffi.texi
261  
262 @@ -491,10 +491,11 @@ nodist_libffi_la_SOURCES = $(am__append_
263         $(am__append_15) $(am__append_16) $(am__append_17) \
264         $(am__append_18) $(am__append_19) $(am__append_20) \
265         $(am__append_21) $(am__append_22) $(am__append_23) \
266 -       $(am__append_24) $(am__append_25) $(am__append_26)
267 +       $(am__append_24) $(am__append_25) $(am__append_26) \
268 +       $(am__append_27)
269  libffi_convenience_la_SOURCES = $(libffi_la_SOURCES)
270  nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES)
271 -AM_CFLAGS = -Wall -g -fexceptions $(am__append_27) $(am__append_28)
272 +AM_CFLAGS = -Wall -g -fexceptions $(am__append_28) $(am__append_29)
273  libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS)
274  AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src
275  AM_CCASFLAGS = $(AM_CPPFLAGS)
276 @@ -730,6 +731,8 @@ src/arm/sysv.lo: src/arm/$(am__dirstamp)
277         src/arm/$(DEPDIR)/$(am__dirstamp)
278  src/arm/ffi.lo: src/arm/$(am__dirstamp) \
279         src/arm/$(DEPDIR)/$(am__dirstamp)
280 +src/arm/trampoline.lo: src/arm/$(am__dirstamp) \
281 +       src/arm/$(DEPDIR)/$(am__dirstamp)
282  src/avr32/$(am__dirstamp):
283         @$(MKDIR_P) src/avr32
284         @: > src/avr32/$(am__dirstamp)
285 @@ -827,6 +830,8 @@ mostlyclean-compile:
286         -rm -f src/arm/ffi.lo
287         -rm -f src/arm/sysv.$(OBJEXT)
288         -rm -f src/arm/sysv.lo
289 +       -rm -f src/arm/trampoline.$(OBJEXT)
290 +       -rm -f src/arm/trampoline.lo
291         -rm -f src/avr32/ffi.$(OBJEXT)
292         -rm -f src/avr32/ffi.lo
293         -rm -f src/avr32/sysv.$(OBJEXT)
294 @@ -949,6 +954,7 @@ distclean-compile:
295  @AMDEP_TRUE@@am__include@ @am__quote@src/alpha/$(DEPDIR)/osf.Plo@am__quote@
296  @AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/ffi.Plo@am__quote@
297  @AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/sysv.Plo@am__quote@
298 +@AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/trampoline.Plo@am__quote@
299  @AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/ffi.Plo@am__quote@
300  @AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/sysv.Plo@am__quote@
301  @AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/ffi.Plo@am__quote@
302 @@ -1816,6 +1822,7 @@ uninstall-am: uninstall-dvi-am uninstall
303         uninstall-info-am uninstall-libLTLIBRARIES uninstall-pdf-am \
304         uninstall-pkgconfigDATA uninstall-ps-am
305  
306 +       m4/ltversion.m4 build-ios.sh src/arm/gentramp.sh
307  
308  # No install-html or install-pdf support in automake yet
309  .PHONY: install-html install-pdf
310 Index: libffi/configure.ac
311 ===================================================================
312 --- libffi.orig/configure.ac
313 +++ libffi/configure.ac
314 @@ -322,13 +322,23 @@ if test x$TARGET = xX86_WIN64; then
315      fi
316  fi
317  
318 +
319 +FFI_EXEC_TRAMPOLINE_TABLE=0
320  case "$target" in
321 +     *arm*-apple-darwin*)
322 +       FFI_EXEC_TRAMPOLINE_TABLE=1
323 +       AC_DEFINE(FFI_EXEC_TRAMPOLINE_TABLE, 1,
324 +                 [Cannot use PROT_EXEC on this target, so, we revert to
325 +                   alternative means])
326 +     ;;
327       *-apple-darwin10* | *-*-freebsd* | *-*-openbsd* | *-pc-solaris*)
328         AC_DEFINE(FFI_MMAP_EXEC_WRIT, 1,
329                   [Cannot use malloc on this target, so, we revert to
330                     alternative means])
331       ;;
332  esac
333 +AM_CONDITIONAL(FFI_EXEC_TRAMPOLINE_TABLE, test x$FFI_EXEC_TRAMPOLINE_TABLE = x1)
334 +AC_SUBST(FFI_EXEC_TRAMPOLINE_TABLE)
335  
336  if test x$TARGET = xX86_64; then
337      AC_CACHE_CHECK([assembler supports unwind section type],
338 Index: libffi/fficonfig.h.in
339 ===================================================================
340 --- libffi.orig/fficonfig.h.in
341 +++ libffi/fficonfig.h.in
342 @@ -17,6 +17,9 @@
343  /* Define this if you want extra debugging. */
344  #undef FFI_DEBUG
345  
346 +/* Cannot use PROT_EXEC on this target, so, we revert to alternative means */
347 +#undef FFI_EXEC_TRAMPOLINE_TABLE
348 +
349  /* Cannot use malloc on this target, so, we revert to alternative means */
350  #undef FFI_MMAP_EXEC_WRIT
351  
352 Index: libffi/src/arm/ffi.c
353 ===================================================================
354 --- libffi.orig/src/arm/ffi.c
355 +++ libffi/src/arm/ffi.c
356 @@ -1,5 +1,6 @@
357  /* -----------------------------------------------------------------------
358 -   ffi.c - Copyright (c) 1998, 2008  Red Hat, Inc.
359 +   ffi.c - Copyright (c) 1998, 2008, 2011  Red Hat, Inc.
360 +          Copyright (c) 2011 Plausible Labs Cooperative, Inc.
361     
362     ARM Foreign Function Interface 
363  
364 @@ -339,6 +340,220 @@ ffi_prep_incoming_args_SYSV(char *stack,
365  
366  extern unsigned int ffi_arm_trampoline[3];
367  
368 +#if FFI_EXEC_TRAMPOLINE_TABLE
369 +
370 +#include <mach/mach.h>
371 +#include <pthread.h>
372 +#include <stdio.h>
373 +#include <stdlib.h>
374 +
375 +extern void *ffi_closure_trampoline_table_page;
376 +
377 +typedef struct ffi_trampoline_table ffi_trampoline_table;
378 +typedef struct ffi_trampoline_table_entry ffi_trampoline_table_entry;
379 +
380 +struct ffi_trampoline_table {
381 +  /* contigious writable and executable pages */
382 +  vm_address_t config_page;
383 +  vm_address_t trampoline_page;
384 +
385 +  /* free list tracking */
386 +  uint16_t free_count;
387 +  ffi_trampoline_table_entry *free_list;
388 +  ffi_trampoline_table_entry *free_list_pool;
389 +
390 +  ffi_trampoline_table *prev;
391 +  ffi_trampoline_table *next;
392 +};
393 +
394 +struct ffi_trampoline_table_entry {
395 +  void *(*trampoline)();
396 +  ffi_trampoline_table_entry *next;
397 +};
398 +
399 +/* Override the standard architecture trampoline size */
400 +// XXX TODO - Fix
401 +#undef FFI_TRAMPOLINE_SIZE
402 +#define FFI_TRAMPOLINE_SIZE 12
403 +
404 +/* The trampoline configuration is placed at 4080 bytes prior to the trampoline's entry point */
405 +#define FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc) ((void **) (((uint8_t *) codeloc) - 4080));
406 +
407 +/* The first 16 bytes of the config page are unused, as they are unaddressable from the trampoline page. */
408 +#define FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET 16
409 +
410 +/* Total number of trampolines that fit in one trampoline table */
411 +#define FFI_TRAMPOLINE_COUNT ((PAGE_SIZE - FFI_TRAMPOLINE_CONFIG_PAGE_OFFSET) / FFI_TRAMPOLINE_SIZE)
412 +
413 +static pthread_mutex_t ffi_trampoline_lock = PTHREAD_MUTEX_INITIALIZER;
414 +static ffi_trampoline_table *ffi_trampoline_tables = NULL;
415 +
416 +static ffi_trampoline_table *
417 +ffi_trampoline_table_alloc ()
418 +{
419 +  ffi_trampoline_table *table = NULL;
420 +
421 +  /* Loop until we can allocate two contigious pages */
422 +  while (table == NULL) {
423 +    vm_address_t config_page = 0x0;
424 +    kern_return_t kt;
425 +
426 +    /* Try to allocate two pages */
427 +    kt = vm_allocate (mach_task_self (), &config_page, PAGE_SIZE*2, VM_FLAGS_ANYWHERE);
428 +    if (kt != KERN_SUCCESS) {
429 +      fprintf(stderr, "vm_allocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__);
430 +      break;
431 +    }
432 +
433 +    /* Now drop the second half of the allocation to make room for the trampoline table */
434 +    vm_address_t trampoline_page = config_page+PAGE_SIZE;
435 +    kt = vm_deallocate (mach_task_self (), trampoline_page, PAGE_SIZE);
436 +    if (kt != KERN_SUCCESS) {
437 +      fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__);
438 +      break;
439 +    }
440 +
441 +    /* Remap the trampoline table to directly follow the config page */
442 +    vm_prot_t cur_prot;
443 +    vm_prot_t max_prot;
444 +
445 +    kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_SIZE, 0x0, FALSE, mach_task_self (), (vm_address_t) &ffi_closure_trampoline_table_page, FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE);
446 +
447 +    /* If we lost access to the destination trampoline page, drop our config allocation mapping and retry */
448 +    if (kt != KERN_SUCCESS) {
449 +      /* Log unexpected failures */
450 +      if (kt != KERN_NO_SPACE) {
451 +        fprintf(stderr, "vm_remap() failure: %d at %s:%d\n", kt, __FILE__, __LINE__);
452 +      }
453 +
454 +      vm_deallocate (mach_task_self (), config_page, PAGE_SIZE);
455 +      continue;
456 +    }
457 +
458 +    /* We have valid trampoline and config pages */
459 +    table = calloc (1, sizeof(ffi_trampoline_table));
460 +    table->free_count = FFI_TRAMPOLINE_COUNT;
461 +    table->config_page = config_page;
462 +    table->trampoline_page = trampoline_page;
463 +
464 +    /* Create and initialize the free list */
465 +    table->free_list_pool = calloc(FFI_TRAMPOLINE_COUNT, sizeof(ffi_trampoline_table_entry));
466 +
467 +    uint16_t i;
468 +    for (i = 0; i < table->free_count; i++) {
469 +      ffi_trampoline_table_entry *entry = &table->free_list_pool[i];
470 +      entry->trampoline = (void *) (table->trampoline_page + (i * FFI_TRAMPOLINE_SIZE));
471 +
472 +      if (i < table->free_count - 1)
473 +        entry->next = &table->free_list_pool[i+1];
474 +    }
475 +
476 +    table->free_list = table->free_list_pool;
477 +  }
478 +
479 +  return table;
480 +}
481 +
482 +void *
483 +ffi_closure_alloc (size_t size, void **code)
484 +{
485 +  /* Create the closure */
486 +  ffi_closure *closure = malloc(size);
487 +  if (closure == NULL)
488 +    return NULL;
489 +
490 +  pthread_mutex_lock(&ffi_trampoline_lock);
491 +
492 +  /* Check for an active trampoline table with available entries. */
493 +  ffi_trampoline_table *table = ffi_trampoline_tables;
494 +  if (table == NULL || table->free_list == NULL) {
495 +    table = ffi_trampoline_table_alloc ();
496 +    if (table == NULL) {
497 +      free(closure);
498 +      return NULL;
499 +    }
500 +
501 +    /* Insert the new table at the top of the list */
502 +    table->next = ffi_trampoline_tables;
503 +    if (table->next != NULL)
504 +        table->next->prev = table;
505 +
506 +    ffi_trampoline_tables = table;
507 +  }
508 +
509 +  /* Claim the free entry */
510 +  ffi_trampoline_table_entry *entry = ffi_trampoline_tables->free_list;
511 +  ffi_trampoline_tables->free_list = entry->next;
512 +  ffi_trampoline_tables->free_count--;
513 +  entry->next = NULL;
514 +
515 +  pthread_mutex_unlock(&ffi_trampoline_lock);
516 +
517 +  /* Initialize the return values */
518 +  *code = entry->trampoline;
519 +  closure->trampoline_table = table;
520 +  closure->trampoline_table_entry = entry;
521 +
522 +  return closure;
523 +}
524 +
525 +void
526 +ffi_closure_free (void *ptr)
527 +{
528 +  ffi_closure *closure = ptr;
529 +
530 +  pthread_mutex_lock(&ffi_trampoline_lock);
531 +
532 +  /* Fetch the table and entry references */
533 +  ffi_trampoline_table *table = closure->trampoline_table;
534 +  ffi_trampoline_table_entry *entry = closure->trampoline_table_entry;
535 +
536 +  /* Return the entry to the free list */
537 +  entry->next = table->free_list;
538 +  table->free_list = entry;
539 +  table->free_count++;
540 +
541 +  /* If all trampolines within this table are free, and at least one other table exists, deallocate
542 +   * the table */
543 +  if (table->free_count == FFI_TRAMPOLINE_COUNT && ffi_trampoline_tables != table) {
544 +    /* Remove from the list */
545 +    if (table->prev != NULL)
546 +      table->prev->next = table->next;
547 +
548 +    if (table->next != NULL)
549 +      table->next->prev = table->prev;
550 +
551 +    /* Deallocate pages */
552 +    kern_return_t kt;
553 +    kt = vm_deallocate (mach_task_self (), table->config_page, PAGE_SIZE);
554 +    if (kt != KERN_SUCCESS)
555 +      fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__);
556 +
557 +    kt = vm_deallocate (mach_task_self (), table->trampoline_page, PAGE_SIZE);
558 +    if (kt != KERN_SUCCESS)
559 +      fprintf(stderr, "vm_deallocate() failure: %d at %s:%d\n", kt, __FILE__, __LINE__);
560 +
561 +    /* Deallocate free list */
562 +    free (table->free_list_pool);
563 +    free (table);
564 +  } else if (ffi_trampoline_tables != table) {
565 +    /* Otherwise, bump this table to the top of the list */
566 +    table->prev = NULL;
567 +    table->next = ffi_trampoline_tables;
568 +    if (ffi_trampoline_tables != NULL)
569 +      ffi_trampoline_tables->prev = table;
570 +
571 +    ffi_trampoline_tables = table;
572 +  }
573 +
574 +  pthread_mutex_unlock (&ffi_trampoline_lock);
575 +
576 +  /* Free the closure */
577 +  free (closure);
578 +}
579 +
580 +#else
581 +
582  #define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX)                             \
583  ({ unsigned char *__tramp = (unsigned char*)(TRAMP);                   \
584     unsigned int  __fun = (unsigned int)(FUN);                          \
585 @@ -353,6 +568,7 @@ extern unsigned int ffi_arm_trampoline[3
586                                                      mapping.  */        \
587   })
588  
589 +#endif
590  
591  /* the cif must already be prep'ed */
592  
593 @@ -372,10 +588,16 @@ ffi_prep_closure_loc (ffi_closure* closu
594    else
595      FFI_ASSERT (0);
596      
597 +#if FFI_EXEC_TRAMPOLINE_TABLE
598 +  void **config = FFI_TRAMPOLINE_CODELOC_CONFIG(codeloc);
599 +  config[0] = closure;
600 +  config[1] = closure_func;
601 +#else
602    FFI_INIT_TRAMPOLINE (&closure->tramp[0], \
603                        closure_func,  \
604                        codeloc);
605 -    
606 +#endif
607 +
608    closure->cif  = cif;
609    closure->user_data = user_data;
610    closure->fun  = fun;
611 Index: libffi/src/arm/sysv.S
612 ===================================================================
613 --- libffi.orig/src/arm/sysv.S
614 +++ libffi/src/arm/sysv.S
615 @@ -1,5 +1,6 @@
616  /* -----------------------------------------------------------------------
617 -   sysv.S - Copyright (c) 1998, 2008 Red Hat, Inc.
618 +   sysv.S - Copyright (c) 1998, 2008, 2011 Red Hat, Inc.
619 +           Copyright (c) 2011 Plausible Labs Cooperative, Inc.
620     
621     ARM Foreign Function Interface 
622  
623 @@ -39,7 +40,11 @@
624  #else
625  #define CNAME(x) x
626  #endif
627 +#ifdef __APPLE__
628 +#define ENTRY(x) .globl CNAME(x); CNAME(x):
629 +#else
630  #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
631 +#endif /* __APPLE__ */
632  #endif
633  
634  #ifdef __ELF__
635 @@ -48,6 +53,12 @@
636  #define LSYM(x) x
637  #endif
638  
639 +/* Use the SOFTFP return value ABI on Mac OS X, as per the iOS ABI
640 +  Function Call Guide */
641 +#ifdef __APPLE__
642 +#define __SOFTFP__
643 +#endif
644 +
645  /* We need a better way of testing for this, but for now, this is all 
646     we can do.  */
647  @ This selects the minimum architecture level required.
648 @@ -105,21 +116,33 @@
649         .align 0
650         .thumb
651         .thumb_func
652 +#ifdef __APPLE__
653 +       ENTRY($0)
654 +#else
655         ENTRY(\name)
656 +#endif
657         bx      pc
658         nop
659         .arm
660         UNWIND .fnstart
661  /* A hook to tell gdb that we've switched to ARM mode.  Also used to call
662     directly from other local arm routines.  */
663 -_L__\name:             
664 +#ifdef __APPLE__
665 +_L__$0:
666 +#else
667 +_L__\name:
668 +#endif
669  .endm
670  #else
671  .macro ARM_FUNC_START name
672         .text
673         .align 0
674         .arm
675 +#ifdef __APPLE__
676 +       ENTRY($0)
677 +#else
678         ENTRY(\name)
679 +#endif
680         UNWIND .fnstart
681  .endm
682  #endif
683 @@ -141,8 +164,7 @@ _L__\name:
684  #endif
685  .endm
686  
687 -
688 -       @ r0:   fn
689 +       @ r0:   ffi_prep_args
690         @ r1:   &ecif
691         @ r2:   cif->bytes
692         @ r3:   fig->flags
693 @@ -222,11 +244,18 @@ ARM_FUNC_START ffi_call_SYSV
694  #endif
695  
696  LSYM(Lepilogue):
697 -       RETLDM  "r0-r3,fp"
698 +#if defined (__INTERWORKING__)
699 +       ldmia   sp!, {r0-r3,fp, lr}
700 +       bx      lr
701 +#else
702 +       ldmia   sp!, {r0-r3,fp, pc}
703 +#endif
704  
705  .ffi_call_SYSV_end:
706         UNWIND .fnend
707 +#ifdef __ELF__
708          .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
709 +#endif
710  
711  
712  /*
713 @@ -247,7 +276,7 @@ ARM_FUNC_START ffi_closure_SYSV
714         sub     sp, sp, #16
715         str     sp, [sp, #8]
716         add     r1, sp, #8
717 -       bl      ffi_closure_SYSV_inner
718 +       bl      CNAME(ffi_closure_SYSV_inner)
719         cmp     r0, #FFI_TYPE_INT
720         beq     .Lretint
721  
722 @@ -299,7 +328,9 @@ ARM_FUNC_START ffi_closure_SYSV
723  
724  .ffi_closure_SYSV_end:
725         UNWIND .fnend
726 +#ifdef __ELF__
727          .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
728 +#endif
729  
730  
731  /* Below are VFP hard-float ABI call and closure implementations.
732 @@ -371,7 +402,7 @@ LSYM(Lbase_args):
733         @ assume no return value.
734         cmp     r2, #0
735         beq     LSYM(Lepilogue_vfp)
736 -       
737 +
738         cmp     r3, #FFI_TYPE_INT
739         streq   r0, [r2]
740         beq     LSYM(Lepilogue_vfp)
741 Index: libffi/src/closures.c
742 ===================================================================
743 --- libffi.orig/src/closures.c
744 +++ libffi/src/closures.c
745 @@ -1,6 +1,7 @@
746  /* -----------------------------------------------------------------------
747 -   closures.c - Copyright (c) 2007  Red Hat, Inc.
748 -   Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc
749 +   closures.c - Copyright (c) 2007, 2009, 2010  Red Hat, Inc.
750 +                Copyright (C) 2007, 2009, 2010 Free Software Foundation, Inc
751 +                Copyright (c) 2011 Plausible Labs Cooperative, Inc.
752  
753     Code to allocate and deallocate memory for closures.
754  
755 @@ -32,7 +33,7 @@
756  #include <ffi.h>
757  #include <ffi_common.h>
758  
759 -#ifndef FFI_MMAP_EXEC_WRIT
760 +#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE
761  # if __gnu_linux__
762  /* This macro indicates it may be forbidden to map anonymous memory
763     with both write and execute permission.  Code compiled when this
764 @@ -63,7 +64,11 @@
765  
766  #if FFI_CLOSURES
767  
768 -# if FFI_MMAP_EXEC_WRIT
769 +# if FFI_EXEC_TRAMPOLINE_TABLE
770 +
771 +// Per-target implementation; It's unclear what can reasonable be shared between two OS/architecture implementations.
772 +
773 +# elif FFI_MMAP_EXEC_WRIT /* !FFI_EXEC_TRAMPOLINE_TABLE */
774  
775  #define USE_LOCKS 1
776  #define USE_DL_PREFIX 1