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