Fix building with Clang for Darwin (OS X 10.6+ and iOS
[libffi.git] / patches / apple-fixes
1 Index: libffi/ChangeLog
2 ===================================================================
3 --- libffi.orig/ChangeLog
4 +++ libffi/ChangeLog
5 @@ -1,3 +1,10 @@
6 +2012-04-05  Zachary Waldowski  <zwaldowski@gmail.com>
7 +
8 +       * include/ffi.h.in: Add missing trampoline table fields.
9 +       * src/arm/sysv.S: Fix ENTRY definition, and wrap symbol references
10 +       in CNAME.
11 +       * src/x86/ffi.c: Wrap Windows specific code in ifdefs.
12 +
13  2012-04-02  Peter Rosin  <peda@lysator.liu.se>
14  
15         * src/x86/win32.S (ffi_call_win32): Sign/zero extend the return
16 Index: libffi/include/ffi.h.in
17 ===================================================================
18 --- libffi.orig/include/ffi.h.in
19 +++ libffi/include/ffi.h.in
20 @@ -297,7 +297,12 @@ size_t ffi_java_raw_size (ffi_cif *cif);
21  __declspec(align(8))
22  #endif
23  typedef struct {
24 +#if @FFI_EXEC_TRAMPOLINE_TABLE@
25 +  void *trampoline_table;
26 +  void *trampoline_table_entry;
27 +#else
28    char tramp[FFI_TRAMPOLINE_SIZE];
29 +#endif
30    ffi_cif   *cif;
31    void     (*fun)(ffi_cif*,void*,void**,void*);
32    void      *user_data;
33 @@ -330,8 +335,12 @@ ffi_prep_closure_loc (ffi_closure*,
34  # pragma pack 8
35  #endif
36  typedef struct {
37 +#if @FFI_EXEC_TRAMPOLINE_TABLE@
38 +  void *trampoline_table;
39 +  void *trampoline_table_entry;
40 +#else
41    char tramp[FFI_TRAMPOLINE_SIZE];
42 -
43 +#endif
44    ffi_cif   *cif;
45  
46  #if !FFI_NATIVE_RAW_API
47 @@ -351,7 +360,12 @@ typedef struct {
48  } ffi_raw_closure;
49  
50  typedef struct {
51 +#if @FFI_EXEC_TRAMPOLINE_TABLE@
52 +  void *trampoline_table;
53 +  void *trampoline_table_entry;
54 +#else
55    char tramp[FFI_TRAMPOLINE_SIZE];
56 +#endif
57  
58    ffi_cif   *cif;
59  
60 Index: libffi/src/arm/sysv.S
61 ===================================================================
62 --- libffi.orig/src/arm/sysv.S
63 +++ libffi/src/arm/sysv.S
64 @@ -41,7 +41,7 @@
65  #define CNAME(x) x
66  #endif
67  #ifdef __APPLE__
68 -#define ENTRY(x) .globl CNAME(x); CNAME(x):
69 +#define ENTRY(x) .globl _##x; _##x:
70  #else
71  #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x):
72  #endif /* __APPLE__ */
73 @@ -187,7 +187,7 @@ ARM_FUNC_START ffi_call_SYSV
74         @     r1 already set
75  
76         @ Call ffi_prep_args(stack, &ecif)
77 -       bl      ffi_prep_args
78 +       bl      CNAME(ffi_prep_args)
79  
80         @ move first 4 parameters in registers
81         ldmia   sp, {r0-r3}
82 @@ -364,7 +364,7 @@ ARM_FUNC_START ffi_call_VFP
83         sub     r2, fp, #64   @ VFP scratch space
84  
85         @ Call ffi_prep_args(stack, &ecif, vfp_space)
86 -       bl      ffi_prep_args
87 +       bl      CNAME(ffi_prep_args)
88  
89         @ Load VFP register args if needed
90         cmp     r0, #0
91 @@ -446,7 +446,7 @@ ARM_FUNC_START ffi_closure_VFP
92         sub     sp, sp, #72
93         str     sp, [sp, #64]
94         add     r1, sp, #64
95 -       bl      ffi_closure_SYSV_inner
96 +       bl      CNAME(ffi_closure_SYSV_inner)
97  
98         cmp     r0, #FFI_TYPE_INT
99         beq     .Lretint_vfp
100 Index: libffi/src/x86/ffi.c
101 ===================================================================
102 --- libffi.orig/src/x86/ffi.c
103 +++ libffi/src/x86/ffi.c
104 @@ -280,9 +280,11 @@ ffi_status ffi_prep_cif_machdep(ffi_cif
105        else
106  #endif
107          {
108 +#ifdef X86_WIN32
109            if (cif->abi == FFI_MS_CDECL)
110              cif->flags = FFI_TYPE_MS_STRUCT;
111            else
112 +#endif
113              cif->flags = FFI_TYPE_STRUCT;
114            /* allocate space for return value pointer */
115            cif->bytes += ALIGN(sizeof(void*), FFI_SIZEOF_ARG);