Update libtool version, README, tests dists
[libffi.git] / patches / mint
1 Index: libffi/ChangeLog
2 ===================================================================
3 --- libffi.orig/ChangeLog
4 +++ libffi/ChangeLog
5 @@ -1,3 +1,13 @@
6 +2012-03-19  Alan Hourihane  <alanh@fairlite.co.uk>
7 +
8 +       * src/m68k/ffi.c: Add MINT support.
9 +       * src/m68k/sysv.S: Ditto.
10 +
11 +2012-03-19  chennam  <csit@axway.com>
12 +
13 +       * src/powerpc/ffi_darwin.c (ffi_prep_closure_loc): Fix AIX closure
14 +       support.
15 +
16  2012-04-02  Peter Bergner  <bergner@vnet.ibm.com>
17  
18         * src/powerpc/ffi.c (ffi_prep_args_SYSV): Declare double_tmp.
19 @@ -6,11 +16,6 @@
20         (ffi_call): Silence possibly undefined warning.
21         (ffi_closure_helper_SYSV): Declare variable type.
22  
23 -2012-03-19  chennam  <csit@axway.com>
24 -
25 -       * src/powerpc/ffi_darwin.c (ffi_prep_closure_loc): Fix AIX closure
26 -       support.
27 -
28  2012-03-13  Kaz Kojima  <kkojima@gcc.gnu.org>
29  
30         * src/sh/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test,
31 Index: libffi/src/m68k/ffi.c
32 ===================================================================
33 --- libffi.orig/src/m68k/ffi.c
34 +++ libffi/src/m68k/ffi.c
35 @@ -1,7 +1,7 @@
36  /* -----------------------------------------------------------------------
37     ffi.c
38 -   
39 -   m68k Foreign Function Interface 
40 +
41 +   m68k Foreign Function Interface
42     ----------------------------------------------------------------------- */
43  
44  #include <ffi.h>
45 @@ -13,8 +13,13 @@
46  void rtems_cache_flush_multiple_data_lines( const void *, size_t );
47  #else
48  #include <sys/syscall.h>
49 +#ifdef __MINT__
50 +#include <mint/mintbind.h>
51 +#include <mint/ssystem.h>
52 +#else
53  #include <asm/cachectl.h>
54  #endif
55 +#endif
56  
57  void ffi_call_SYSV (extended_cif *,
58                     unsigned, unsigned,
59 @@ -39,8 +44,12 @@ ffi_prep_args (void *stack, extended_cif
60  
61    argp = stack;
62  
63 -  if (ecif->cif->rtype->type == FFI_TYPE_STRUCT
64 -      && !ecif->cif->flags)
65 +  if (
66 +#ifdef __MINT__
67 +      (ecif->cif->rtype->type == FFI_TYPE_LONGDOUBLE) ||
68 +#endif
69 +      (((ecif->cif->rtype->type == FFI_TYPE_STRUCT)
70 +        && !ecif->cif->flags)))
71      struct_value_ptr = ecif->rvalue;
72    else
73      struct_value_ptr = NULL;
74 @@ -51,12 +60,12 @@ ffi_prep_args (void *stack, extended_cif
75         i != 0;
76         i--, p_arg++)
77      {
78 -      size_t z;
79 +      size_t z = (*p_arg)->size;
80 +      int type = (*p_arg)->type;
81  
82 -      z = (*p_arg)->size;
83        if (z < sizeof (int))
84         {
85 -         switch ((*p_arg)->type)
86 +         switch (type)
87             {
88             case FFI_TYPE_SINT8:
89               *(signed int *) argp = (signed int) *(SINT8 *) *p_argv;
90 @@ -75,7 +84,14 @@ ffi_prep_args (void *stack, extended_cif
91               break;
92  
93             case FFI_TYPE_STRUCT:
94 +#ifdef __MINT__
95 +             if (z == 1 || z == 2)
96 +               memcpy (argp + 2, *p_argv, z);
97 +              else
98 +               memcpy (argp, *p_argv, z);
99 +#else
100               memcpy (argp + sizeof (int) - z, *p_argv, z);
101 +#endif
102               break;
103  
104             default:
105 @@ -120,17 +136,34 @@ ffi_prep_cif_machdep (ffi_cif *cif)
106        break;
107  
108      case FFI_TYPE_STRUCT:
109 +      if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT &&
110 +          cif->rtype->elements[1])
111 +        {
112 +          cif->flags = 0;
113 +          break;
114 +        }
115 +
116        switch (cif->rtype->size)
117         {
118         case 1:
119 +#ifdef __MINT__
120 +         cif->flags = CIF_FLAGS_STRUCT2;
121 +#else
122           cif->flags = CIF_FLAGS_STRUCT1;
123 +#endif
124           break;
125         case 2:
126           cif->flags = CIF_FLAGS_STRUCT2;
127           break;
128 +#ifdef __MINT__
129 +       case 3:
130 +#endif
131         case 4:
132           cif->flags = CIF_FLAGS_INT;
133           break;
134 +#ifdef __MINT__
135 +       case 7:
136 +#endif
137         case 8:
138           cif->flags = CIF_FLAGS_DINT;
139           break;
140 @@ -150,7 +183,11 @@ ffi_prep_cif_machdep (ffi_cif *cif)
141  
142  #if (FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE)
143      case FFI_TYPE_LONGDOUBLE:
144 +#ifdef __MINT__
145 +      cif->flags = 0;
146 +#else
147        cif->flags = CIF_FLAGS_LDOUBLE;
148 +#endif
149        break;
150  #endif
151  
152 @@ -218,6 +255,26 @@ ffi_prep_incoming_args_SYSV (char *stack
153        size_t z;
154  
155        z = (*p_arg)->size;
156 +#ifdef __MINT__
157 +      if (cif->flags &&
158 +          cif->rtype->type == FFI_TYPE_STRUCT &&
159 +          (z == 1 || z == 2))
160 +       {
161 +         *p_argv = (void *) (argp + 2);
162 +
163 +         z = 4;
164 +       }
165 +      else
166 +      if (cif->flags &&
167 +          cif->rtype->type == FFI_TYPE_STRUCT &&
168 +          (z == 3 || z == 4))
169 +       {
170 +         *p_argv = (void *) (argp);
171 +
172 +         z = 4;
173 +       }
174 +      else
175 +#endif
176        if (z <= 4)
177         {
178           *p_argv = (void *) (argp + 4 - z);
179 @@ -267,14 +324,21 @@ ffi_prep_closure_loc (ffi_closure* closu
180    *(unsigned short *)closure->tramp = 0x207c;
181    *(void **)(closure->tramp + 2) = codeloc;
182    *(unsigned short *)(closure->tramp + 6) = 0x4ef9;
183 -  if (cif->rtype->type == FFI_TYPE_STRUCT
184 -      && !cif->flags)
185 +
186 +  if (
187 +#ifdef __MINT__
188 +      (cif->rtype->type == FFI_TYPE_LONGDOUBLE) ||
189 +#endif
190 +      (((cif->rtype->type == FFI_TYPE_STRUCT)
191 +         && !cif->flags)))
192      *(void **)(closure->tramp + 8) = ffi_closure_struct_SYSV;
193    else
194      *(void **)(closure->tramp + 8) = ffi_closure_SYSV;
195  
196  #ifdef __rtems__
197    rtems_cache_flush_multiple_data_lines( codeloc, FFI_TRAMPOLINE_SIZE );
198 +#elif defined(__MINT__)
199 +  Ssystem(S_FLUSHCACHE, codeloc, FFI_TRAMPOLINE_SIZE);
200  #else
201    syscall(SYS_cacheflush, codeloc, FLUSH_SCOPE_LINE,
202           FLUSH_CACHE_BOTH, FFI_TRAMPOLINE_SIZE);
203 @@ -286,4 +350,3 @@ ffi_prep_closure_loc (ffi_closure* closu
204  
205    return FFI_OK;
206  }
207 -
208 Index: libffi/src/m68k/sysv.S
209 ===================================================================
210 --- libffi.orig/src/m68k/sysv.S
211 +++ libffi/src/m68k/sysv.S
212 @@ -1,6 +1,7 @@
213  /* -----------------------------------------------------------------------
214         
215 -   sysv.S - Copyright (c) 1998, 2012 Andreas Schwab
216 +   sysv.S - Copyright (c) 2012 Alan Hourihane
217 +           Copyright (c) 1998, 2012 Andreas Schwab
218             Copyright (c) 2008 Red Hat, Inc. 
219     
220     m68k Foreign Function Interface 
221 @@ -42,13 +43,19 @@
222  #define CFI_ENDPROC()
223  #endif
224  
225 +#ifdef __MINT__
226 +#define CALLFUNC(funcname) _ ## funcname
227 +#else
228 +#define CALLFUNC(funcname) funcname
229 +#endif
230 +
231         .text
232  
233 -       .globl  ffi_call_SYSV
234 -       .type   ffi_call_SYSV,@function
235 +       .globl  CALLFUNC(ffi_call_SYSV)
236 +       .type   CALLFUNC(ffi_call_SYSV),@function
237         .align  4
238  
239 -ffi_call_SYSV:
240 +CALLFUNC(ffi_call_SYSV):
241         CFI_STARTPROC()
242         link    %fp,#0
243         CFI_OFFSET(14,-8)
244 @@ -63,14 +70,18 @@ ffi_call_SYSV:
245         move.l  8(%fp),-(%sp)
246         pea     4(%sp)
247  #if !defined __PIC__
248 -       jsr     ffi_prep_args
249 +       jsr     CALLFUNC(ffi_prep_args)
250  #else
251 -       bsr.l   ffi_prep_args@PLTPC
252 +       bsr.l   CALLFUNC(ffi_prep_args@PLTPC)
253  #endif
254         addq.l  #8,%sp  
255  
256         | Pass pointer to struct value, if any
257 +#ifdef __MINT__
258 +       move.l  %d0,%a1
259 +#else
260         move.l  %a0,%a1
261 +#endif
262  
263         | Call the function
264         move.l  24(%fp),%a0
265 @@ -142,7 +153,11 @@ retlongdouble:
266  retpointer:
267         btst    #5,%d2
268         jbeq    retstruct1
269 +#ifdef __MINT__
270 +       move.l  %d0,(%a1)
271 +#else
272         move.l  %a0,(%a1)
273 +#endif
274         jbra    epilogue
275  
276  retstruct1:
277 @@ -162,13 +177,13 @@ epilogue:
278         unlk    %fp
279         rts
280         CFI_ENDPROC()
281 -       .size   ffi_call_SYSV,.-ffi_call_SYSV
282 +       .size   CALLFUNC(ffi_call_SYSV),.-CALLFUNC(ffi_call_SYSV)
283  
284 -       .globl  ffi_closure_SYSV
285 -       .type   ffi_closure_SYSV, @function
286 +       .globl  CALLFUNC(ffi_closure_SYSV)
287 +       .type   CALLFUNC(ffi_closure_SYSV), @function
288         .align  4
289  
290 -ffi_closure_SYSV:
291 +CALLFUNC(ffi_closure_SYSV):
292         CFI_STARTPROC()
293         link    %fp,#-12
294         CFI_OFFSET(14,-8)
295 @@ -178,9 +193,9 @@ ffi_closure_SYSV:
296         pea     -12(%fp)
297         move.l  %a0,-(%sp)
298  #if !defined __PIC__
299 -       jsr     ffi_closure_SYSV_inner
300 +       jsr     CALLFUNC(ffi_closure_SYSV_inner)
301  #else
302 -       bsr.l   ffi_closure_SYSV_inner@PLTPC
303 +       bsr.l   CALLFUNC(ffi_closure_SYSV_inner@PLTPC)
304  #endif
305  
306         lsr.l   #1,%d0
307 @@ -240,13 +255,13 @@ ffi_closure_SYSV:
308         jra     .Lcls_epilogue
309         CFI_ENDPROC()
310  
311 -       .size   ffi_closure_SYSV,.-ffi_closure_SYSV
312 +       .size   CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV)
313  
314 -       .globl  ffi_closure_struct_SYSV
315 -       .type   ffi_closure_struct_SYSV, @function
316 +       .globl  CALLFUNC(ffi_closure_struct_SYSV)
317 +       .type   CALLFUNC(ffi_closure_struct_SYSV), @function
318         .align  4
319  
320 -ffi_closure_struct_SYSV:
321 +CALLFUNC(ffi_closure_struct_SYSV):
322         CFI_STARTPROC()
323         link    %fp,#0
324         CFI_OFFSET(14,-8)
325 @@ -256,14 +271,14 @@ ffi_closure_struct_SYSV:
326         move.l  %a1,-(%sp)
327         move.l  %a0,-(%sp)
328  #if !defined __PIC__
329 -       jsr     ffi_closure_SYSV_inner
330 +       jsr     CALLFUNC(ffi_closure_SYSV_inner)
331  #else
332 -       bsr.l   ffi_closure_SYSV_inner@PLTPC
333 +       bsr.l   CALLFUNC(ffi_closure_SYSV_inner@PLTPC)
334  #endif
335         unlk    %fp
336         rts
337         CFI_ENDPROC()
338 -       .size   ffi_closure_struct_SYSV,.-ffi_closure_struct_SYSV
339 +       .size   CALLFUNC(ffi_closure_struct_SYSV),.-CALLFUNC(ffi_closure_struct_SYSV)
340  
341  #if defined __ELF__ && defined __linux__
342         .section        .note.GNU-stack,"",@progbits
343 Index: libffi/README
344 ===================================================================
345 --- libffi.orig/README
346 +++ libffi/README
347 @@ -58,6 +58,7 @@ tested:
348  | AVR32        | Linux            |
349  | HPPA         | HPUX             |
350  | IA-64        | Linux            |
351 +| M68K         | FreeMiNT         |
352  | M68K         | RTEMS            |
353  | MIPS         | IRIX             |
354  | MIPS         | Linux            |
355 @@ -152,6 +153,7 @@ See the ChangeLog files for details.
356         Add thiscall, fastcall and MSVC cdecl support on Windows.
357          Add Amiga and newer MacOS support.
358         Fix Octeon and MC68881 support.
359 +       Add m68k FreeMiNT support.
360         Fix code pessimizations.
361          Lots of build fixes.
362