21f9a87b6cc749e3c473f29893fbd4fcc6c0ec70
[libffi.git] / patches / bfin
1 Index: libffi/ChangeLog
2 ===================================================================
3 --- libffi.orig/ChangeLog
4 +++ libffi/ChangeLog
5 @@ -1,3 +1,11 @@
6 +2012-04-23  Alexandre Keunecke I. de Mendonca <alexandre.keunecke@gmail.com>
7 +
8 +       * configure.ac: Add Blackfin/sysv support
9 +       * Makefile.am: Add Blackfin/sysv support
10 +       * src/bfin/ffi.c:  Add Blackfin/sysv support
11 +       * src/bfin/ffitarget.h: Add Blackfin/sysv support
12 +       * src/bfin/sysv.S: Add Blackfin/sysv support
13 +
14  2012-04-11  Anthony Green  <green@moxielogic.com>
15  
16         * Makefile.am (EXTRA_DIST): Add new script.
17 Index: libffi/Makefile.am
18 ===================================================================
19 --- libffi.orig/Makefile.am
20 +++ libffi/Makefile.am
21 @@ -27,6 +27,7 @@ EXTRA_DIST = LICENSE ChangeLog.v1 Change
22         src/x86/win64.S src/x86/freebsd.S src/x86/ffi64.c \
23         src/x86/unix64.S src/x86/ffitarget.h src/pa/ffitarget.h \
24         src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c \
25 +       src/bfin/ffi.c src/bfin/ffitarget.h src/bfin/sysv.S \
26         src/frv/eabi.S src/frv/ffitarget.h src/dlmalloc.c \
27         src/moxie/ffi.c src/moxie/eabi.S libtool-version \
28         ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4 \
29 @@ -105,6 +106,9 @@ endif
30  if MIPS
31  nodist_libffi_la_SOURCES += src/mips/ffi.c src/mips/o32.S src/mips/n32.S
32  endif
33 +if BFIN
34 +nodist_libffi_la_SOURCES += src/bfin/ffi.c src/bfin/sysv.S
35 +endif
36  if X86
37  nodist_libffi_la_SOURCES += src/x86/ffi.c src/x86/sysv.S
38  endif
39 Index: libffi/Makefile.in
40 ===================================================================
41 --- libffi.orig/Makefile.in
42 +++ libffi/Makefile.in
43 @@ -38,35 +38,36 @@ host_triplet = @host@
44  target_triplet = @target@
45  @FFI_DEBUG_TRUE@am__append_1 = src/debug.c
46  @MIPS_TRUE@am__append_2 = src/mips/ffi.c src/mips/o32.S src/mips/n32.S
47 -@X86_TRUE@am__append_3 = src/x86/ffi.c src/x86/sysv.S
48 -@X86_FREEBSD_TRUE@am__append_4 = src/x86/ffi.c src/x86/freebsd.S
49 -@X86_WIN32_TRUE@am__append_5 = src/x86/ffi.c src/x86/win32.S
50 -@X86_WIN64_TRUE@am__append_6 = src/x86/ffi.c src/x86/win64.S
51 -@X86_DARWIN_TRUE@am__append_7 = src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S
52 -@SPARC_TRUE@am__append_8 = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S
53 -@ALPHA_TRUE@am__append_9 = src/alpha/ffi.c src/alpha/osf.S
54 -@IA64_TRUE@am__append_10 = src/ia64/ffi.c src/ia64/unix.S
55 -@M32R_TRUE@am__append_11 = src/m32r/sysv.S src/m32r/ffi.c
56 -@M68K_TRUE@am__append_12 = src/m68k/ffi.c src/m68k/sysv.S
57 -@POWERPC_TRUE@am__append_13 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S
58 -@POWERPC_AIX_TRUE@am__append_14 = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
59 -@POWERPC_DARWIN_TRUE@am__append_15 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
60 -@POWERPC_FREEBSD_TRUE@am__append_16 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
61 -@ARM_TRUE@am__append_17 = src/arm/sysv.S src/arm/ffi.c
62 -@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__append_18 = src/arm/trampoline.S
63 -@AVR32_TRUE@am__append_19 = src/avr32/sysv.S src/avr32/ffi.c
64 -@LIBFFI_CRIS_TRUE@am__append_20 = src/cris/sysv.S src/cris/ffi.c
65 -@FRV_TRUE@am__append_21 = src/frv/eabi.S src/frv/ffi.c
66 -@MOXIE_TRUE@am__append_22 = src/moxie/eabi.S src/moxie/ffi.c
67 -@S390_TRUE@am__append_23 = src/s390/sysv.S src/s390/ffi.c
68 -@X86_64_TRUE@am__append_24 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
69 -@SH_TRUE@am__append_25 = src/sh/sysv.S src/sh/ffi.c
70 -@SH64_TRUE@am__append_26 = src/sh64/sysv.S src/sh64/ffi.c
71 -@PA_LINUX_TRUE@am__append_27 = src/pa/linux.S src/pa/ffi.c
72 -@PA_HPUX_TRUE@am__append_28 = src/pa/hpux32.S src/pa/ffi.c
73 +@BFIN_TRUE@am__append_3 = src/bfin/ffi.c src/bfin/sysv.S
74 +@X86_TRUE@am__append_4 = src/x86/ffi.c src/x86/sysv.S
75 +@X86_FREEBSD_TRUE@am__append_5 = src/x86/ffi.c src/x86/freebsd.S
76 +@X86_WIN32_TRUE@am__append_6 = src/x86/ffi.c src/x86/win32.S
77 +@X86_WIN64_TRUE@am__append_7 = src/x86/ffi.c src/x86/win64.S
78 +@X86_DARWIN_TRUE@am__append_8 = src/x86/ffi.c src/x86/darwin.S src/x86/ffi64.c src/x86/darwin64.S
79 +@SPARC_TRUE@am__append_9 = src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S
80 +@ALPHA_TRUE@am__append_10 = src/alpha/ffi.c src/alpha/osf.S
81 +@IA64_TRUE@am__append_11 = src/ia64/ffi.c src/ia64/unix.S
82 +@M32R_TRUE@am__append_12 = src/m32r/sysv.S src/m32r/ffi.c
83 +@M68K_TRUE@am__append_13 = src/m68k/ffi.c src/m68k/sysv.S
84 +@POWERPC_TRUE@am__append_14 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S src/powerpc/linux64.S src/powerpc/linux64_closure.S
85 +@POWERPC_AIX_TRUE@am__append_15 = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S
86 +@POWERPC_DARWIN_TRUE@am__append_16 = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S
87 +@POWERPC_FREEBSD_TRUE@am__append_17 = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S
88 +@ARM_TRUE@am__append_18 = src/arm/sysv.S src/arm/ffi.c
89 +@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__append_19 = src/arm/trampoline.S
90 +@AVR32_TRUE@am__append_20 = src/avr32/sysv.S src/avr32/ffi.c
91 +@LIBFFI_CRIS_TRUE@am__append_21 = src/cris/sysv.S src/cris/ffi.c
92 +@FRV_TRUE@am__append_22 = src/frv/eabi.S src/frv/ffi.c
93 +@MOXIE_TRUE@am__append_23 = src/moxie/eabi.S src/moxie/ffi.c
94 +@S390_TRUE@am__append_24 = src/s390/sysv.S src/s390/ffi.c
95 +@X86_64_TRUE@am__append_25 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S
96 +@SH_TRUE@am__append_26 = src/sh/sysv.S src/sh/ffi.c
97 +@SH64_TRUE@am__append_27 = src/sh64/sysv.S src/sh64/ffi.c
98 +@PA_LINUX_TRUE@am__append_28 = src/pa/linux.S src/pa/ffi.c
99 +@PA_HPUX_TRUE@am__append_29 = src/pa/hpux32.S src/pa/ffi.c
100  # Build debug. Define FFI_DEBUG on the commandline so that, when building with
101  # MSVC, it can link against the debug CRT.
102 -@FFI_DEBUG_TRUE@am__append_29 = -DFFI_DEBUG
103 +@FFI_DEBUG_TRUE@am__append_30 = -DFFI_DEBUG
104  subdir = .
105  DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
106         $(srcdir)/Makefile.in $(srcdir)/doc/stamp-vti \
107 @@ -75,17 +76,7 @@ DIST_COMMON = README $(am__configure_dep
108         compile config.guess config.sub depcomp install-sh ltmain.sh \
109         mdate-sh missing texinfo.tex
110  ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
111 -am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \
112 -       $(top_srcdir)/m4/ax_cc_maxopt.m4 \
113 -       $(top_srcdir)/m4/ax_cflags_warn_all.m4 \
114 -       $(top_srcdir)/m4/ax_compiler_vendor.m4 \
115 -       $(top_srcdir)/m4/ax_configure_args.m4 \
116 -       $(top_srcdir)/m4/ax_enable_builddir.m4 \
117 -       $(top_srcdir)/m4/ax_gcc_archflag.m4 \
118 -       $(top_srcdir)/m4/ax_gcc_x86_cpuid.m4 \
119 -       $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
120 -       $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
121 -       $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
122 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \
123         $(top_srcdir)/configure.ac
124  am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
125         $(ACLOCAL_M4)
126 @@ -126,44 +117,45 @@ am_libffi_la_OBJECTS = src/prep_cif.lo s
127  @FFI_DEBUG_TRUE@am__objects_1 = src/debug.lo
128  @MIPS_TRUE@am__objects_2 = src/mips/ffi.lo src/mips/o32.lo \
129  @MIPS_TRUE@    src/mips/n32.lo
130 -@X86_TRUE@am__objects_3 = src/x86/ffi.lo src/x86/sysv.lo
131 -@X86_FREEBSD_TRUE@am__objects_4 = src/x86/ffi.lo src/x86/freebsd.lo
132 -@X86_WIN32_TRUE@am__objects_5 = src/x86/ffi.lo src/x86/win32.lo
133 -@X86_WIN64_TRUE@am__objects_6 = src/x86/ffi.lo src/x86/win64.lo
134 -@X86_DARWIN_TRUE@am__objects_7 = src/x86/ffi.lo src/x86/darwin.lo \
135 +@BFIN_TRUE@am__objects_3 = src/bfin/ffi.lo src/bfin/sysv.lo
136 +@X86_TRUE@am__objects_4 = src/x86/ffi.lo src/x86/sysv.lo
137 +@X86_FREEBSD_TRUE@am__objects_5 = src/x86/ffi.lo src/x86/freebsd.lo
138 +@X86_WIN32_TRUE@am__objects_6 = src/x86/ffi.lo src/x86/win32.lo
139 +@X86_WIN64_TRUE@am__objects_7 = src/x86/ffi.lo src/x86/win64.lo
140 +@X86_DARWIN_TRUE@am__objects_8 = src/x86/ffi.lo src/x86/darwin.lo \
141  @X86_DARWIN_TRUE@      src/x86/ffi64.lo src/x86/darwin64.lo
142 -@SPARC_TRUE@am__objects_8 = src/sparc/ffi.lo src/sparc/v8.lo \
143 +@SPARC_TRUE@am__objects_9 = src/sparc/ffi.lo src/sparc/v8.lo \
144  @SPARC_TRUE@   src/sparc/v9.lo
145 -@ALPHA_TRUE@am__objects_9 = src/alpha/ffi.lo src/alpha/osf.lo
146 -@IA64_TRUE@am__objects_10 = src/ia64/ffi.lo src/ia64/unix.lo
147 -@M32R_TRUE@am__objects_11 = src/m32r/sysv.lo src/m32r/ffi.lo
148 -@M68K_TRUE@am__objects_12 = src/m68k/ffi.lo src/m68k/sysv.lo
149 -@POWERPC_TRUE@am__objects_13 = src/powerpc/ffi.lo src/powerpc/sysv.lo \
150 +@ALPHA_TRUE@am__objects_10 = src/alpha/ffi.lo src/alpha/osf.lo
151 +@IA64_TRUE@am__objects_11 = src/ia64/ffi.lo src/ia64/unix.lo
152 +@M32R_TRUE@am__objects_12 = src/m32r/sysv.lo src/m32r/ffi.lo
153 +@M68K_TRUE@am__objects_13 = src/m68k/ffi.lo src/m68k/sysv.lo
154 +@POWERPC_TRUE@am__objects_14 = src/powerpc/ffi.lo src/powerpc/sysv.lo \
155  @POWERPC_TRUE@ src/powerpc/ppc_closure.lo \
156  @POWERPC_TRUE@ src/powerpc/linux64.lo \
157  @POWERPC_TRUE@ src/powerpc/linux64_closure.lo
158 -@POWERPC_AIX_TRUE@am__objects_14 = src/powerpc/ffi_darwin.lo \
159 +@POWERPC_AIX_TRUE@am__objects_15 = src/powerpc/ffi_darwin.lo \
160  @POWERPC_AIX_TRUE@     src/powerpc/aix.lo \
161  @POWERPC_AIX_TRUE@     src/powerpc/aix_closure.lo
162 -@POWERPC_DARWIN_TRUE@am__objects_15 = src/powerpc/ffi_darwin.lo \
163 +@POWERPC_DARWIN_TRUE@am__objects_16 = src/powerpc/ffi_darwin.lo \
164  @POWERPC_DARWIN_TRUE@  src/powerpc/darwin.lo \
165  @POWERPC_DARWIN_TRUE@  src/powerpc/darwin_closure.lo
166 -@POWERPC_FREEBSD_TRUE@am__objects_16 = src/powerpc/ffi.lo \
167 +@POWERPC_FREEBSD_TRUE@am__objects_17 = src/powerpc/ffi.lo \
168  @POWERPC_FREEBSD_TRUE@ src/powerpc/sysv.lo \
169  @POWERPC_FREEBSD_TRUE@ src/powerpc/ppc_closure.lo
170 -@ARM_TRUE@am__objects_17 = src/arm/sysv.lo src/arm/ffi.lo
171 -@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__objects_18 = src/arm/trampoline.lo
172 -@AVR32_TRUE@am__objects_19 = src/avr32/sysv.lo src/avr32/ffi.lo
173 -@LIBFFI_CRIS_TRUE@am__objects_20 = src/cris/sysv.lo src/cris/ffi.lo
174 -@FRV_TRUE@am__objects_21 = src/frv/eabi.lo src/frv/ffi.lo
175 -@MOXIE_TRUE@am__objects_22 = src/moxie/eabi.lo src/moxie/ffi.lo
176 -@S390_TRUE@am__objects_23 = src/s390/sysv.lo src/s390/ffi.lo
177 -@X86_64_TRUE@am__objects_24 = src/x86/ffi64.lo src/x86/unix64.lo \
178 +@ARM_TRUE@am__objects_18 = src/arm/sysv.lo src/arm/ffi.lo
179 +@ARM_TRUE@@FFI_EXEC_TRAMPOLINE_TABLE_TRUE@am__objects_19 = src/arm/trampoline.lo
180 +@AVR32_TRUE@am__objects_20 = src/avr32/sysv.lo src/avr32/ffi.lo
181 +@LIBFFI_CRIS_TRUE@am__objects_21 = src/cris/sysv.lo src/cris/ffi.lo
182 +@FRV_TRUE@am__objects_22 = src/frv/eabi.lo src/frv/ffi.lo
183 +@MOXIE_TRUE@am__objects_23 = src/moxie/eabi.lo src/moxie/ffi.lo
184 +@S390_TRUE@am__objects_24 = src/s390/sysv.lo src/s390/ffi.lo
185 +@X86_64_TRUE@am__objects_25 = src/x86/ffi64.lo src/x86/unix64.lo \
186  @X86_64_TRUE@  src/x86/ffi.lo src/x86/sysv.lo
187 -@SH_TRUE@am__objects_25 = src/sh/sysv.lo src/sh/ffi.lo
188 -@SH64_TRUE@am__objects_26 = src/sh64/sysv.lo src/sh64/ffi.lo
189 -@PA_LINUX_TRUE@am__objects_27 = src/pa/linux.lo src/pa/ffi.lo
190 -@PA_HPUX_TRUE@am__objects_28 = src/pa/hpux32.lo src/pa/ffi.lo
191 +@SH_TRUE@am__objects_26 = src/sh/sysv.lo src/sh/ffi.lo
192 +@SH64_TRUE@am__objects_27 = src/sh64/sysv.lo src/sh64/ffi.lo
193 +@PA_LINUX_TRUE@am__objects_28 = src/pa/linux.lo src/pa/ffi.lo
194 +@PA_HPUX_TRUE@am__objects_29 = src/pa/hpux32.lo src/pa/ffi.lo
195  nodist_libffi_la_OBJECTS = $(am__objects_1) $(am__objects_2) \
196         $(am__objects_3) $(am__objects_4) $(am__objects_5) \
197         $(am__objects_6) $(am__objects_7) $(am__objects_8) \
198 @@ -173,17 +165,17 @@ nodist_libffi_la_OBJECTS = $(am__objects
199         $(am__objects_18) $(am__objects_19) $(am__objects_20) \
200         $(am__objects_21) $(am__objects_22) $(am__objects_23) \
201         $(am__objects_24) $(am__objects_25) $(am__objects_26) \
202 -       $(am__objects_27) $(am__objects_28)
203 +       $(am__objects_27) $(am__objects_28) $(am__objects_29)
204  libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) \
205         $(nodist_libffi_la_OBJECTS)
206  libffi_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
207         $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
208         $(libffi_la_LDFLAGS) $(LDFLAGS) -o $@
209  libffi_convenience_la_LIBADD =
210 -am__objects_29 = src/prep_cif.lo src/types.lo src/raw_api.lo \
211 +am__objects_30 = src/prep_cif.lo src/types.lo src/raw_api.lo \
212         src/java_raw_api.lo src/closures.lo
213 -am_libffi_convenience_la_OBJECTS = $(am__objects_29)
214 -am__objects_30 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
215 +am_libffi_convenience_la_OBJECTS = $(am__objects_30)
216 +am__objects_31 = $(am__objects_1) $(am__objects_2) $(am__objects_3) \
217         $(am__objects_4) $(am__objects_5) $(am__objects_6) \
218         $(am__objects_7) $(am__objects_8) $(am__objects_9) \
219         $(am__objects_10) $(am__objects_11) $(am__objects_12) \
220 @@ -192,8 +184,8 @@ am__objects_30 = $(am__objects_1) $(am__
221         $(am__objects_19) $(am__objects_20) $(am__objects_21) \
222         $(am__objects_22) $(am__objects_23) $(am__objects_24) \
223         $(am__objects_25) $(am__objects_26) $(am__objects_27) \
224 -       $(am__objects_28)
225 -nodist_libffi_convenience_la_OBJECTS = $(am__objects_30)
226 +       $(am__objects_28) $(am__objects_29)
227 +nodist_libffi_convenience_la_OBJECTS = $(am__objects_31)
228  libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \
229         $(nodist_libffi_convenience_la_OBJECTS)
230  DEFAULT_INCLUDES = -I.@am__isrc@
231 @@ -440,6 +432,7 @@ EXTRA_DIST = LICENSE ChangeLog.v1 Change
232         src/x86/win64.S src/x86/freebsd.S src/x86/ffi64.c \
233         src/x86/unix64.S src/x86/ffitarget.h src/pa/ffitarget.h \
234         src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S src/frv/ffi.c \
235 +       src/bfin/ffi.c src/bfin/ffitarget.h src/bfin/sysv.S \
236         src/frv/eabi.S src/frv/ffitarget.h src/dlmalloc.c \
237         src/moxie/ffi.c src/moxie/eabi.S libtool-version \
238         ChangeLog.libffi m4/libtool.m4 m4/lt~obsolete.m4 \
239 @@ -508,10 +501,10 @@ nodist_libffi_la_SOURCES = $(am__append_
240         $(am__append_18) $(am__append_19) $(am__append_20) \
241         $(am__append_21) $(am__append_22) $(am__append_23) \
242         $(am__append_24) $(am__append_25) $(am__append_26) \
243 -       $(am__append_27) $(am__append_28)
244 +       $(am__append_27) $(am__append_28) $(am__append_29)
245  libffi_convenience_la_SOURCES = $(libffi_la_SOURCES)
246  nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES)
247 -AM_CFLAGS = -g $(am__append_29)
248 +AM_CFLAGS = -g $(am__append_30)
249  libffi_la_LDFLAGS = -version-info `grep -v '^\#' $(srcdir)/libtool-version` $(LTLDFLAGS) $(AM_LTLDFLAGS)
250  AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src -DFFI_BUILDING
251  AM_CCASFLAGS = $(AM_CPPFLAGS) -g
252 @@ -637,6 +630,16 @@ src/mips/o32.lo: src/mips/$(am__dirstamp
253         src/mips/$(DEPDIR)/$(am__dirstamp)
254  src/mips/n32.lo: src/mips/$(am__dirstamp) \
255         src/mips/$(DEPDIR)/$(am__dirstamp)
256 +src/bfin/$(am__dirstamp):
257 +       @$(MKDIR_P) src/bfin
258 +       @: > src/bfin/$(am__dirstamp)
259 +src/bfin/$(DEPDIR)/$(am__dirstamp):
260 +       @$(MKDIR_P) src/bfin/$(DEPDIR)
261 +       @: > src/bfin/$(DEPDIR)/$(am__dirstamp)
262 +src/bfin/ffi.lo: src/bfin/$(am__dirstamp) \
263 +       src/bfin/$(DEPDIR)/$(am__dirstamp)
264 +src/bfin/sysv.lo: src/bfin/$(am__dirstamp) \
265 +       src/bfin/$(DEPDIR)/$(am__dirstamp)
266  src/x86/$(am__dirstamp):
267         @$(MKDIR_P) src/x86
268         @: > src/x86/$(am__dirstamp)
269 @@ -852,6 +855,10 @@ mostlyclean-compile:
270         -rm -f src/avr32/ffi.lo
271         -rm -f src/avr32/sysv.$(OBJEXT)
272         -rm -f src/avr32/sysv.lo
273 +       -rm -f src/bfin/ffi.$(OBJEXT)
274 +       -rm -f src/bfin/ffi.lo
275 +       -rm -f src/bfin/sysv.$(OBJEXT)
276 +       -rm -f src/bfin/sysv.lo
277         -rm -f src/closures.$(OBJEXT)
278         -rm -f src/closures.lo
279         -rm -f src/cris/ffi.$(OBJEXT)
280 @@ -973,6 +980,8 @@ distclean-compile:
281  @AMDEP_TRUE@@am__include@ @am__quote@src/arm/$(DEPDIR)/trampoline.Plo@am__quote@
282  @AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/ffi.Plo@am__quote@
283  @AMDEP_TRUE@@am__include@ @am__quote@src/avr32/$(DEPDIR)/sysv.Plo@am__quote@
284 +@AMDEP_TRUE@@am__include@ @am__quote@src/bfin/$(DEPDIR)/ffi.Plo@am__quote@
285 +@AMDEP_TRUE@@am__include@ @am__quote@src/bfin/$(DEPDIR)/sysv.Plo@am__quote@
286  @AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/ffi.Plo@am__quote@
287  @AMDEP_TRUE@@am__include@ @am__quote@src/cris/$(DEPDIR)/sysv.Plo@am__quote@
288  @AMDEP_TRUE@@am__include@ @am__quote@src/frv/$(DEPDIR)/eabi.Plo@am__quote@
289 @@ -1077,6 +1086,7 @@ clean-libtool:
290         -rm -rf src/alpha/.libs src/alpha/_libs
291         -rm -rf src/arm/.libs src/arm/_libs
292         -rm -rf src/avr32/.libs src/avr32/_libs
293 +       -rm -rf src/bfin/.libs src/bfin/_libs
294         -rm -rf src/cris/.libs src/cris/_libs
295         -rm -rf src/frv/.libs src/frv/_libs
296         -rm -rf src/ia64/.libs src/ia64/_libs
297 @@ -1631,6 +1641,8 @@ distclean-generic:
298         -rm -f src/arm/$(am__dirstamp)
299         -rm -f src/avr32/$(DEPDIR)/$(am__dirstamp)
300         -rm -f src/avr32/$(am__dirstamp)
301 +       -rm -f src/bfin/$(DEPDIR)/$(am__dirstamp)
302 +       -rm -f src/bfin/$(am__dirstamp)
303         -rm -f src/cris/$(DEPDIR)/$(am__dirstamp)
304         -rm -f src/cris/$(am__dirstamp)
305         -rm -f src/frv/$(DEPDIR)/$(am__dirstamp)
306 @@ -1670,7 +1682,7 @@ clean-am: clean-aminfo clean-generic cle
307  
308  distclean: distclean-recursive
309         -rm -f $(am__CONFIG_DISTCLEAN_FILES)
310 -       -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR)
311 +       -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR)
312         -rm -f Makefile
313  distclean-am: clean-am distclean-compile distclean-generic \
314         distclean-hdr distclean-libtool distclean-tags
315 @@ -1790,7 +1802,7 @@ installcheck-am:
316  maintainer-clean: maintainer-clean-recursive
317         -rm -f $(am__CONFIG_DISTCLEAN_FILES)
318         -rm -rf $(top_srcdir)/autom4te.cache
319 -       -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR)
320 +       -rm -rf src/$(DEPDIR) src/alpha/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/x86/$(DEPDIR)
321         -rm -f Makefile
322  maintainer-clean-am: distclean-am maintainer-clean-aminfo \
323         maintainer-clean-generic maintainer-clean-vti
324 Index: libffi/configure
325 ===================================================================
326 --- libffi.orig/configure
327 +++ libffi/configure
328 @@ -679,6 +679,8 @@ X86_FALSE
329  X86_TRUE
330  SPARC_FALSE
331  SPARC_TRUE
332 +BFIN_FALSE
333 +BFIN_TRUE
334  MIPS_FALSE
335  MIPS_TRUE
336  AM_LTLDFLAGS
337 @@ -6840,14 +6842,7 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*
338             LD="${LD-ld} -m elf_i386_fbsd"
339             ;;
340           x86_64-*linux*)
341 -           case `/usr/bin/file conftest.o` in
342 -             *x86-64*)
343 -                LD="${LD-ld} -m elf32_x86_64"
344 -                ;;
345 -             *)
346 -                LD="${LD-ld} -m elf_i386"
347 -                ;;
348 -           esac
349 +           LD="${LD-ld} -m elf_i386"
350             ;;
351           ppc64-*linux*|powerpc64-*linux*)
352             LD="${LD-ld} -m elf32ppclinux"
353 @@ -8418,10 +8413,6 @@ _lt_linker_boilerplate=`cat conftest.err
354  $RM -r conftest*
355  
356  
357 -## CAVEAT EMPTOR:
358 -## There is no encapsulation within the following macros, do not change
359 -## the running order or otherwise move them around unless you know exactly
360 -## what you are doing...
361  if test -n "$compiler"; then
362  
363  lt_prog_compiler_no_builtin_flag=
364 @@ -10972,10 +10963,14 @@ fi
365    # before this can be enabled.
366    hardcode_into_libs=yes
367  
368 +  # Add ABI-specific directories to the system library path.
369 +  sys_lib_dlsearch_path_spec="/lib64 /usr/lib64 /lib /usr/lib"
370 +
371    # Append ld.so.conf contents to the search path
372    if test -f /etc/ld.so.conf; then
373      lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[      ]*hwcap[        ]/d;s/[:,      ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
374 -    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
375 +    sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra"
376 +
377    fi
378  
379    # We used to test for /lib/ld.so.1 and disable shared libraries on
380 @@ -12419,7 +12414,7 @@ if test "x$ax_gcc_arch" = xyes; then
381  ax_gcc_arch=""
382  if test "$cross_compiling" = no; then
383  case $host_cpu in
384 -  i[3456]86*|x86_64*) # use cpuid codes, in part from x86info-1.7 by D. Jones
385 +  i[3456]86*|x86_64*) # use cpuid codes
386  
387  ac_ext=c
388  ac_cpp='$CPP $CPPFLAGS'
389 @@ -12535,18 +12530,24 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
390            case $ax_cv_gcc_x86_cpuid_1 in
391             *5[48]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;;
392             *5??:*:*:*) ax_gcc_arch=pentium ;;
393 -           *6[3456]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
394 -           *6a?:*[01]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
395 -           *6a?:*[234]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
396 -           *6[9d]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
397 -           *6[78b]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
398 -           *6??:*:*:*) ax_gcc_arch=pentiumpro ;;
399 -            *f3[347]:*:*:*|*f41347:*:*:*)
400 +           *0?6[3456]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
401 +           *0?6a?:*[01]:*:*) ax_gcc_arch="pentium2 pentiumpro" ;;
402 +           *0?6a?:*[234]:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
403 +           *0?6[9de]?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;;
404 +           *0?6[78b]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;;
405 +           *0?6f?:*:*:*|*1?66?:*:*:*) ax_gcc_arch="core2 pentium-m pentium3 pentiumpro" ;;
406 +           *1?6[7d]?:*:*:*) ax_gcc_arch="penryn core2 pentium-m pentium3 pentiumpro" ;;
407 +           *1?6[aef]?:*:*:*|*2?6[5cef]?:*:*:*) ax_gcc_arch="corei7 core2 pentium-m pentium3 pentiumpro" ;;
408 +           *1?6c?:*:*:*|*[23]?66?:*:*:*) ax_gcc_arch="atom core2 pentium-m pentium3 pentiumpro" ;;
409 +           *2?6[ad]?:*:*:*) ax_gcc_arch="corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;;
410 +           *0?6??:*:*:*) ax_gcc_arch=pentiumpro ;;
411 +           *6??:*:*:*) ax_gcc_arch="core2 pentiumpro" ;;
412 +           ?000?f3[347]:*:*:*|?000?f41347:*:*:*|?000?f6?:*:*:*)
413                 case $host_cpu in
414 -                  x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
415 -                  *) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
416 -                esac ;;
417 -            *f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
418 +                 x86_64*) ax_gcc_arch="nocona pentium4 pentiumpro" ;;
419 +                 *) ax_gcc_arch="prescott pentium4 pentiumpro" ;;
420 +               esac ;;
421 +           ?000?f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro";;
422            esac ;;
423         *:68747541:*:*) # AMD
424            case $ax_cv_gcc_x86_cpuid_1 in
425 @@ -12618,10 +12619,13 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
426                         ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;;
427                   *) ax_gcc_arch="athlon-4 athlon k7" ;;
428                esac ;;
429 -           *f[4cef8b]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
430 -           *f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
431 -           *f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
432 -           *f??:*:*:*) ax_gcc_arch="k8" ;;
433 +           ?00??f[4cef8b]?:*:*:*) ax_gcc_arch="athlon64 k8" ;;
434 +           ?00??f5?:*:*:*) ax_gcc_arch="opteron k8" ;;
435 +           ?00??f7?:*:*:*) ax_gcc_arch="athlon-fx opteron k8" ;;
436 +           ?00??f??:*:*:*) ax_gcc_arch="k8" ;;
437 +           ?05??f??:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;;
438 +           ?06??f??:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;;
439 +           *f??:*:*:*) ax_gcc_arch="amdfam10 k8" ;;
440            esac ;;
441         *:746e6543:*:*) # IDT
442            case $ax_cv_gcc_x86_cpuid_1 in
443 @@ -13150,6 +13154,10 @@ case "$host" in
444         TARGET=AVR32; TARGETDIR=avr32
445         ;;
446  
447 +  bfin*)
448 +       TARGET=BFIN; TARGETDIR=bfin
449 +       ;;
450 +
451    cris-*-*)
452         TARGET=LIBFFI_CRIS; TARGETDIR=cris
453         ;;
454 @@ -13295,6 +13303,14 @@ else
455    MIPS_FALSE=
456  fi
457  
458 + if test x$TARGET = xBFIN; then
459 +  BFIN_TRUE=
460 +  BFIN_FALSE='#'
461 +else
462 +  BFIN_TRUE='#'
463 +  BFIN_FALSE=
464 +fi
465 +
466   if test x$TARGET = xSPARC; then
467    SPARC_TRUE=
468    SPARC_FALSE='#'
469 @@ -14134,40 +14150,7 @@ $as_echo "#define AC_APPLE_UNIVERSAL_BUI
470   esac
471  
472  
473 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler .cfi pseudo-op support" >&5
474 -$as_echo_n "checking assembler .cfi pseudo-op support... " >&6; }
475 -if ${gcc_cv_as_cfi_pseudo_op+:} false; then :
476 -  $as_echo_n "(cached) " >&6
477 -else
478 -
479 -    gcc_cv_as_cfi_pseudo_op=unknown
480 -    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
481 -/* end confdefs.h.  */
482 -asm (".cfi_startproc\n\t.cfi_endproc");
483 -int
484 -main ()
485 -{
486 -
487 -  ;
488 -  return 0;
489 -}
490 -_ACEOF
491 -if ac_fn_c_try_compile "$LINENO"; then :
492 -  gcc_cv_as_cfi_pseudo_op=yes
493 -else
494 -  gcc_cv_as_cfi_pseudo_op=no
495 -fi
496 -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
497 -
498 -fi
499 -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_as_cfi_pseudo_op" >&5
500 -$as_echo "$gcc_cv_as_cfi_pseudo_op" >&6; }
501 - if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then
502 -
503 -$as_echo "#define HAVE_AS_CFI_PSEUDO_OP 1" >>confdefs.h
504 -
505 - fi
506 -
507 +GCC_AS_CFI_PSEUDO_OP
508  
509  if test x$TARGET = xSPARC; then
510      { $as_echo "$as_me:${as_lineno-$LINENO}: checking assembler and linker support unaligned pc related relocs" >&5
511 @@ -14739,6 +14722,10 @@ if test -z "${MIPS_TRUE}" && test -z "${
512    as_fn_error $? "conditional \"MIPS\" was never defined.
513  Usually this means the macro was only invoked conditionally." "$LINENO" 5
514  fi
515 +if test -z "${BFIN_TRUE}" && test -z "${BFIN_FALSE}"; then
516 +  as_fn_error $? "conditional \"BFIN\" was never defined.
517 +Usually this means the macro was only invoked conditionally." "$LINENO" 5
518 +fi
519  if test -z "${SPARC_TRUE}" && test -z "${SPARC_FALSE}"; then
520    as_fn_error $? "conditional \"SPARC\" was never defined.
521  Usually this means the macro was only invoked conditionally." "$LINENO" 5
522 Index: libffi/configure.ac
523 ===================================================================
524 --- libffi.orig/configure.ac
525 +++ libffi/configure.ac
526 @@ -75,6 +75,10 @@ case "$host" in
527         TARGET=AVR32; TARGETDIR=avr32
528         ;;
529  
530 +  bfin*)
531 +       TARGET=BFIN; TARGETDIR=bfin
532 +       ;;
533 +
534    cris-*-*)
535         TARGET=LIBFFI_CRIS; TARGETDIR=cris
536         ;;
537 @@ -213,6 +217,7 @@ if test $TARGETDIR = unknown; then
538  fi
539  
540  AM_CONDITIONAL(MIPS, test x$TARGET = xMIPS)
541 +AM_CONDITIONAL(BFIN, test x$TARGET = xBFIN)
542  AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC)
543  AM_CONDITIONAL(X86, test x$TARGET = xX86)
544  AM_CONDITIONAL(X86_FREEBSD, test x$TARGET = xX86_FREEBSD)
545 Index: libffi/src/bfin/ffi.c
546 ===================================================================
547 --- /dev/null
548 +++ libffi/src/bfin/ffi.c
549 @@ -0,0 +1,195 @@
550 +/* -----------------------------------------------------------------------
551 +   ffi.c - Copyright (c) 2012  Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>
552 +
553 +   Blackfin Foreign Function Interface
554 +
555 +   Permission is hereby granted, free of charge, to any person obtaining
556 +   a copy of this software and associated documentation files (the
557 +   ``Software''), to deal in the Software without restriction, including
558 +   without limitation the rights to use, copy, modify, merge, publish,
559 +   distribute, sublicense, and/or sell copies of the Software, and to
560 +   permit persons to whom the Software is furnished to do so, subject to
561 +   the following conditions:
562 +
563 +   The above copyright notice and this permission notice shall be included
564 +   in all copies or substantial portions of the Software.
565 +
566 +   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
567 +   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
568 +   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
569 +   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
570 +   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
571 +   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
572 +   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
573 +   DEALINGS IN THE SOFTWARE.
574 +   ----------------------------------------------------------------------- */
575 +#include <ffi.h>
576 +#include <ffi_common.h>
577 +
578 +#include <stdlib.h>
579 +#include <stdio.h>
580 +
581 +/* Maximum number of GPRs available for argument passing.  */
582 +#define MAX_GPRARGS 3
583 +
584 +/*
585 + * Return types
586 + */
587 +#define FFIBFIN_RET_VOID 0
588 +#define FFIBFIN_RET_BYTE 1
589 +#define FFIBFIN_RET_HALFWORD 2
590 +#define FFIBFIN_RET_INT64 3
591 +#define FFIBFIN_RET_INT32 4
592 +
593 +/*====================================================================*/
594 +/*                          PROTOTYPE          *
595 + /*====================================================================*/
596 +void ffi_prep_args(unsigned char *, extended_cif *);
597 +
598 +/*====================================================================*/
599 +/*                          Externals                                 */
600 +/*                          (Assembly)                                */
601 +/*====================================================================*/
602 +
603 +extern void ffi_call_SYSV(unsigned, extended_cif *, void(*)(unsigned char *, extended_cif *), unsigned, void *, void(*fn)(void));
604 +
605 +/*====================================================================*/
606 +/*                          Implementation                            */
607 +/*                                                            */
608 +/*====================================================================*/
609 +
610 +
611 +/*
612 + * This function calculates the return type (size) based on type.
613 + */
614 +
615 +ffi_status ffi_prep_cif_machdep(ffi_cif *cif)
616 +{
617 +   /* --------------------------------------*
618 +    *   Return handling                *
619 +    * --------------------------------------*/
620 +   switch (cif->rtype->type) {
621 +      case FFI_TYPE_VOID:
622 +         cif->flags = FFIBFIN_RET_VOID;
623 +         break;
624 +      case FFI_TYPE_UINT16:
625 +      case FFI_TYPE_SINT16:
626 +         cif->flags = FFIBFIN_RET_HALFWORD;
627 +         break;
628 +      case FFI_TYPE_UINT8:
629 +         cif->flags = FFIBFIN_RET_BYTE;
630 +         break;
631 +      case FFI_TYPE_INT:
632 +      case FFI_TYPE_UINT32:
633 +      case FFI_TYPE_SINT32:
634 +      case FFI_TYPE_FLOAT:
635 +      case FFI_TYPE_POINTER:
636 +      case FFI_TYPE_SINT8:
637 +         cif->flags = FFIBFIN_RET_INT32;
638 +         break;
639 +      case FFI_TYPE_SINT64:
640 +      case FFI_TYPE_UINT64:
641 +      case FFI_TYPE_DOUBLE:
642 +          cif->flags = FFIBFIN_RET_INT64;
643 +          break;
644 +      case FFI_TYPE_STRUCT:
645 +         if (cif->rtype->size <= 4){
646 +                cif->flags = FFIBFIN_RET_INT32;
647 +         }else if (cif->rtype->size == 8){
648 +                cif->flags = FFIBFIN_RET_INT64;
649 +         }else{
650 +                //it will return via a hidden pointer in P0
651 +                cif->flags = FFIBFIN_RET_VOID;
652 +         }
653 +         break;
654 +      default:
655 +         FFI_ASSERT(0);
656 +         break;
657 +   }
658 +   return FFI_OK;
659 +}
660 +
661 +/*
662 + * This will prepare the arguments and will call the assembly routine
663 + * cif = the call interface
664 + * fn = the function to be called
665 + * rvalue = the return value
666 + * avalue = the arguments
667 + */
668 +void ffi_call(ffi_cif *cif, void(*fn)(void), void *rvalue, void **avalue)
669 +{
670 +   int ret_type = cif->flags;
671 +   extended_cif ecif;
672 +   ecif.cif = cif;
673 +   ecif.avalue = avalue;
674 +   ecif.rvalue = rvalue;
675 +
676 +   switch (cif->abi) {
677 +      case FFI_SYSV:
678 +         ffi_call_SYSV(cif->bytes, &ecif, ffi_prep_args, ret_type, ecif.rvalue, fn);
679 +         break;
680 +      default:
681 +         FFI_ASSERT(0);
682 +         break;
683 +   }
684 +}
685 +
686 +
687 +/*
688 +* This function prepares the parameters (copies them from the ecif to the stack)
689 +*  to call the function (ffi_prep_args is called by the assembly routine in file
690 +*  sysv.S, which also calls the actual function)
691 +*/
692 +void ffi_prep_args(unsigned char *stack, extended_cif *ecif)
693 +{
694 +   register unsigned int i = 0;
695 +   void **p_argv;
696 +   unsigned char *argp;
697 +   ffi_type **p_arg;
698 +   argp = stack;
699 +   p_argv = ecif->avalue;
700 +   for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types;
701 +        (i != 0);
702 +        i--, p_arg++) {
703 +      size_t z;
704 +      z = (*p_arg)->size;
705 +      if (z < sizeof(int)) {
706 +         z = sizeof(int);
707 +         switch ((*p_arg)->type) {
708 +            case FFI_TYPE_SINT8: {
709 +                  signed char v = *(SINT8 *)(* p_argv);
710 +                  signed int t = v;
711 +                  *(signed int *) argp = t;
712 +               }
713 +               break;
714 +            case FFI_TYPE_UINT8: {
715 +                  unsigned char v = *(UINT8 *)(* p_argv);
716 +                  unsigned int t = v;
717 +                  *(unsigned int *) argp = t;
718 +               }
719 +               break;
720 +            case FFI_TYPE_SINT16:
721 +               *(signed int *) argp = (signed int) * (SINT16 *)(* p_argv);
722 +               break;
723 +            case FFI_TYPE_UINT16:
724 +               *(unsigned int *) argp = (unsigned int) * (UINT16 *)(* p_argv);
725 +               break;
726 +            case FFI_TYPE_STRUCT:
727 +               memcpy(argp, *p_argv, (*p_arg)->size);
728 +               break;
729 +            default:
730 +               FFI_ASSERT(0);
731 +               break;
732 +         }
733 +      } else if (z == sizeof(int)) {
734 +         *(unsigned int *) argp = (unsigned int) * (UINT32 *)(* p_argv);
735 +      } else {
736 +         memcpy(argp, *p_argv, z);
737 +      }
738 +      p_argv++;
739 +      argp += z;
740 +   }
741 +}
742 +
743 +
744 +
745 Index: libffi/src/bfin/ffitarget.h
746 ===================================================================
747 --- /dev/null
748 +++ libffi/src/bfin/ffitarget.h
749 @@ -0,0 +1,43 @@
750 +/* -----------------------------------------------------------------------
751 +   ffitarget.h - Copyright (c) 2012  Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>
752 +
753 +   Blackfin Foreign Function Interface
754 +
755 +   Permission is hereby granted, free of charge, to any person obtaining
756 +   a copy of this software and associated documentation files (the
757 +   ``Software''), to deal in the Software without restriction, including
758 +   without limitation the rights to use, copy, modify, merge, publish,
759 +   distribute, sublicense, and/or sell copies of the Software, and to
760 +   permit persons to whom the Software is furnished to do so, subject to
761 +   the following conditions:
762 +
763 +   The above copyright notice and this permission notice shall be included
764 +   in all copies or substantial portions of the Software.
765 +
766 +   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
767 +   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
768 +   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
769 +   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
770 +   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
771 +   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
772 +   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
773 +   DEALINGS IN THE SOFTWARE.
774 +   ----------------------------------------------------------------------- */
775 +
776 +#ifndef LIBFFI_TARGET_H
777 +#define LIBFFI_TARGET_H
778 +
779 +#ifndef LIBFFI_ASM
780 +typedef unsigned long          ffi_arg;
781 +typedef signed          long          ffi_sarg;
782 +
783 +typedef enum ffi_abi {
784 +  FFI_FIRST_ABI = 0,
785 +  FFI_SYSV,
786 +  FFI_LAST_ABI,
787 +  FFI_DEFAULT_ABI = FFI_SYSV
788 +} ffi_abi;
789 +#endif
790 +
791 +#endif
792 +
793 Index: libffi/src/bfin/sysv.S
794 ===================================================================
795 --- /dev/null
796 +++ libffi/src/bfin/sysv.S
797 @@ -0,0 +1,177 @@
798 +/* -----------------------------------------------------------------------
799 +   sysv.S - Copyright (c) 2012  Alexandre K. I. de Mendonca <alexandre.keunecke@gmail.com>
800 +
801 +   Blackfin Foreign Function Interface
802 +
803 +   Permission is hereby granted, free of charge, to any person obtaining
804 +   a copy of this software and associated documentation files (the
805 +   ``Software''), to deal in the Software without restriction, including
806 +   without limitation the rights to use, copy, modify, merge, publish,
807 +   distribute, sublicense, and/or sell copies of the Software, and to
808 +   permit persons to whom the Software is furnished to do so, subject to
809 +   the following conditions:
810 +
811 +   The above copyright notice and this permission notice shall be included
812 +   in all copies or substantial portions of the Software.
813 +
814 +   THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
815 +   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
816 +   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
817 +   NONINFRINGEMENT.  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
818 +   HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
819 +   WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
820 +   OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
821 +   DEALINGS IN THE SOFTWARE.
822 +   ----------------------------------------------------------------------- */
823 +
824 +#define LIBFFI_ASM
825 +#include <fficonfig.h>
826 +#include <ffi.h>
827 +
828 +.text
829 +.align 4
830 +
831 +       /*
832 +        There is a "feature" in the bfin toolchain that it puts a _ before funcion names
833 +        that's why the function here it's called _ffi_call_SYSV and not ffi_call_SYSV
834 +        */
835 +       .global _ffi_call_SYSV;
836 +       .type _ffi_call_SYSV, STT_FUNC;
837 +       .func ffi_call_SYSV
838 +
839 +       /*
840 +       cif->bytes      = R0    (fp+8)
841 +       &ecif                   = R1    (fp+12)
842 +       ffi_prep_args   = R2    (fp+16)
843 +       ret_type                = stack (fp+20)
844 +       ecif.rvalue             = stack (fp+24)
845 +       fn                              = stack (fp+28)
846 +                                         got   (fp+32)
847 +    There is room for improvement here (we can use temporary registers
848 +        instead of saving the values in the memory)
849 +       REGS:
850 +               P5 => Stack pointer (function arguments)
851 +               R5 => cif->bytes
852 +               R4 => ret->type
853 +
854 +               FP-20 = P3
855 +               FP-16 = SP (parameters area)
856 +               FP-12 = SP (temp)
857 +               FP-08 = function return part 1 [R0]
858 +               FP-04 = function return part 2 [R1]
859 +       */
860 +
861 +_ffi_call_SYSV:
862 +.prologue:
863 +       LINK 20;
864 +       [FP-20] = P3;
865 +       [FP+8] = R0;
866 +       [FP+12] = R1;
867 +       [FP+16] = R2;
868 +
869 +.allocate_stack:
870 +       //alocate cif->bytes into the stack
871 +       R1 = [FP+8];
872 +       R0 = SP;
873 +       R0 = R0 - R1;
874 +       R1 = 4;
875 +       R0 = R0 - R1;
876 +       [FP-12] = SP;
877 +       SP = R0;
878 +       [FP-16] = SP;
879 +
880 +.call_prep_args:
881 +       //get the addr of prep_args
882 +       P0 = [P3 + _ffi_prep_args@FUNCDESC_GOT17M4];
883 +       P1 = [P0];
884 +       P3 = [P0+4];
885 +       R0 = [FP-16];//SP (parameter area)
886 +       R1 = [FP+12];//ecif
887 +       call (P1);
888 +
889 +.call_user_function:
890 +       //ajust SP so as to allow the user function access the parameters on the stack
891 +       SP = [FP-16]; //point to function parameters
892 +       R0 = [SP];
893 +       R1 = [SP+4];
894 +       R2 = [SP+8];
895 +       //load user function address
896 +       P0 = FP;
897 +       P0 +=28;
898 +       P1 = [P0];
899 +       P1 = [P1];
900 +       P3 = [P0+4];
901 +       /*
902 +               For functions returning aggregate values (struct) occupying more than 8 bytes,
903 +               the caller allocates the return value object on the stack and the address
904 +               of this object is passed to the callee as a hidden argument in register P0.
905 +       */
906 +       P0 = [FP+24];
907 +
908 +       call (P1);
909 +       SP = [FP-12];
910 +.compute_return:
911 +       P2 = [FP-20];
912 +       [FP-8] = R0;
913 +       [FP-4] = R1;
914 +
915 +       R0 = [FP+20];
916 +       R1 = R0 << 2;
917 +
918 +       R0 = [P2+.rettable@GOT17M4];
919 +       R0 = R1 + R0;
920 +       P2 = R0;
921 +       R1 = [P2];
922 +
923 +       P2 = [FP+-20];
924 +       R0 = [P2+.rettable@GOT17M4];
925 +       R0 = R1 + R0;
926 +       P2 = R0;
927 +       R0 = [FP-8];
928 +       R1 = [FP-4];
929 +       jump (P2);
930 +
931 +/*
932 +#define FFIBFIN_RET_VOID 0
933 +#define FFIBFIN_RET_BYTE 1
934 +#define FFIBFIN_RET_HALFWORD 2
935 +#define FFIBFIN_RET_INT64 3
936 +#define FFIBFIN_RET_INT32 4
937 +*/
938 +.align 4
939 +.align 4
940 +.rettable:
941 +       .dd .epilogue - .rettable
942 +       .dd     .rbyte - .rettable;
943 +       .dd     .rhalfword - .rettable;
944 +       .dd     .rint64 - .rettable;
945 +       .dd     .rint32 - .rettable;
946 +
947 +.rbyte:
948 +       P0 = [FP+24];
949 +       R0 = R0.B (Z);
950 +       [P0] = R0;
951 +       JUMP .epilogue
952 +.rhalfword:
953 +       P0 = [FP+24];
954 +       R0 = R0.L;
955 +       [P0] = R0;
956 +       JUMP .epilogue
957 +.rint64:
958 +       P0 = [FP+24];// &rvalue
959 +       [P0] = R0;
960 +       [P0+4] = R1;
961 +       JUMP .epilogue
962 +.rint32:
963 +       P0 = [FP+24];
964 +       [P0] = R0;
965 +.epilogue:
966 +       R0 = [FP+8];
967 +       R1 = [FP+12];
968 +       R2 = [FP+16];
969 +       P3 = [FP-20];
970 +       UNLINK;
971 +       RTS;
972 +
973 +.size _ffi_call_SYSV,.-_ffi_call_SYSV;
974 +.endfunc