ffi 1.0.11 → 1.0.12.pre

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ffi might be problematic. Click here for more details.

Files changed (159) hide show
  1. data/Rakefile +1 -1
  2. data/ext/ffi_c/AbstractMemory.c +9 -0
  3. data/ext/ffi_c/AbstractMemory.h +4 -0
  4. data/ext/ffi_c/Buffer.c +8 -0
  5. data/ext/ffi_c/Call.c +8 -0
  6. data/ext/ffi_c/ClosurePool.c +12 -0
  7. data/ext/ffi_c/DynamicLibrary.c +7 -1
  8. data/ext/ffi_c/Function.c +11 -1
  9. data/ext/ffi_c/Function.h +6 -0
  10. data/ext/ffi_c/FunctionInfo.c +8 -0
  11. data/ext/ffi_c/LastError.c +8 -0
  12. data/ext/ffi_c/MemoryPointer.c +8 -0
  13. data/ext/ffi_c/MemoryPointer.h +6 -0
  14. data/ext/ffi_c/MethodHandle.c +8 -0
  15. data/ext/ffi_c/Platform.c +8 -0
  16. data/ext/ffi_c/Pointer.c +8 -0
  17. data/ext/ffi_c/Pointer.h +6 -0
  18. data/ext/ffi_c/Struct.c +6 -0
  19. data/ext/ffi_c/StructByReference.c +8 -0
  20. data/ext/ffi_c/StructByValue.c +8 -0
  21. data/ext/ffi_c/StructLayout.c +6 -0
  22. data/ext/ffi_c/Thread.c +7 -0
  23. data/ext/ffi_c/Thread.h +6 -0
  24. data/ext/ffi_c/Type.c +3 -0
  25. data/ext/ffi_c/Types.h +4 -0
  26. data/ext/ffi_c/Variadic.c +8 -0
  27. data/ext/ffi_c/endian.h +3 -0
  28. data/ext/ffi_c/extconf.rb +6 -1
  29. data/ext/ffi_c/libffi.vc.mk +26 -0
  30. data/ext/ffi_c/libffi.vc64.mk +26 -0
  31. data/ext/ffi_c/libffi/ChangeLog +541 -0
  32. data/ext/ffi_c/libffi/ChangeLog.libffi +13 -87
  33. data/ext/ffi_c/libffi/LICENSE +3 -3
  34. data/ext/ffi_c/libffi/Makefile.am +41 -32
  35. data/ext/ffi_c/libffi/Makefile.in +95 -66
  36. data/ext/ffi_c/libffi/Makefile.vc +141 -0
  37. data/ext/ffi_c/libffi/Makefile.vc64 +141 -0
  38. data/ext/ffi_c/libffi/README +40 -4
  39. data/ext/ffi_c/libffi/aclocal.m4 +729 -7854
  40. data/ext/ffi_c/libffi/build-ios.sh +67 -0
  41. data/ext/ffi_c/libffi/compile +11 -10
  42. data/ext/ffi_c/libffi/config.guess +4 -1
  43. data/ext/ffi_c/libffi/config.sub +6 -3
  44. data/ext/ffi_c/libffi/configure +6264 -6354
  45. data/ext/ffi_c/libffi/configure.ac +155 -63
  46. data/ext/ffi_c/libffi/depcomp +81 -35
  47. data/ext/ffi_c/libffi/doc/libffi.info +78 -18
  48. data/ext/ffi_c/libffi/doc/libffi.texi +64 -5
  49. data/ext/ffi_c/libffi/doc/stamp-vti +4 -4
  50. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  51. data/ext/ffi_c/libffi/fficonfig.h.in +18 -0
  52. data/ext/ffi_c/libffi/fficonfig.hw +57 -0
  53. data/ext/ffi_c/libffi/include/Makefile.in +21 -3
  54. data/ext/ffi_c/libffi/include/ffi.h.in +42 -14
  55. data/ext/ffi_c/libffi/include/ffi.h.vc +427 -0
  56. data/ext/ffi_c/libffi/include/ffi.h.vc64 +427 -0
  57. data/ext/ffi_c/libffi/include/ffi_common.h +9 -5
  58. data/ext/ffi_c/libffi/install-sh +364 -167
  59. data/ext/ffi_c/libffi/ltmain.sh +2599 -1369
  60. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +176 -0
  61. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +195 -0
  62. data/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4 +76 -0
  63. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +63 -0
  64. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +70 -0
  65. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +300 -0
  66. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +215 -0
  67. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +79 -0
  68. data/ext/ffi_c/libffi/m4/libtool.m4 +1239 -768
  69. data/ext/ffi_c/libffi/m4/ltoptions.m4 +7 -6
  70. data/ext/ffi_c/libffi/m4/ltversion.m4 +6 -6
  71. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +9 -3
  72. data/ext/ffi_c/libffi/man/Makefile.in +21 -3
  73. data/ext/ffi_c/libffi/mdate-sh +0 -0
  74. data/ext/ffi_c/libffi/missing +60 -44
  75. data/ext/ffi_c/libffi/msvcc.sh +197 -0
  76. data/ext/ffi_c/libffi/src/alpha/osf.S +39 -18
  77. data/ext/ffi_c/libffi/src/arm/ffi.c +443 -24
  78. data/ext/ffi_c/libffi/src/arm/ffitarget.h +17 -1
  79. data/ext/ffi_c/libffi/src/arm/gentramp.sh +118 -0
  80. data/ext/ffi_c/libffi/src/arm/sysv.S +206 -15
  81. data/ext/ffi_c/libffi/src/arm/trampoline.S +4450 -0
  82. data/ext/ffi_c/libffi/src/avr32/ffi.c +4 -2
  83. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +2 -2
  84. data/ext/ffi_c/libffi/src/closures.c +17 -35
  85. data/ext/ffi_c/libffi/src/cris/ffi.c +1 -1
  86. data/ext/ffi_c/libffi/src/cris/ffitarget.h +2 -2
  87. data/ext/ffi_c/libffi/src/dlmalloc.c +66 -4
  88. data/ext/ffi_c/libffi/src/frv/ffitarget.h +2 -6
  89. data/ext/ffi_c/libffi/src/ia64/ffi.c +7 -5
  90. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +2 -2
  91. data/ext/ffi_c/libffi/src/java_raw_api.c +1 -1
  92. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +2 -2
  93. data/ext/ffi_c/libffi/src/m68k/ffi.c +10 -0
  94. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +2 -2
  95. data/ext/ffi_c/libffi/src/m68k/sysv.S +36 -0
  96. data/ext/ffi_c/libffi/src/mips/ffi.c +12 -5
  97. data/ext/ffi_c/libffi/src/mips/ffitarget.h +18 -11
  98. data/ext/ffi_c/libffi/src/mips/n32.S +4 -4
  99. data/ext/ffi_c/libffi/src/moxie/eabi.S +128 -0
  100. data/ext/ffi_c/libffi/src/moxie/ffi.c +276 -0
  101. data/ext/ffi_c/libffi/src/pa/ffi.c +7 -4
  102. data/ext/ffi_c/libffi/src/pa/ffitarget.h +6 -5
  103. data/ext/ffi_c/libffi/src/powerpc/aix.S +5 -1
  104. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +2 -0
  105. data/ext/ffi_c/libffi/src/powerpc/asm.h +1 -1
  106. data/ext/ffi_c/libffi/src/powerpc/darwin.S +215 -77
  107. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +358 -100
  108. data/ext/ffi_c/libffi/src/powerpc/ffi.c +11 -5
  109. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +603 -172
  110. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +17 -4
  111. data/ext/ffi_c/libffi/src/prep_cif.c +16 -13
  112. data/ext/ffi_c/libffi/src/s390/ffitarget.h +4 -2
  113. data/ext/ffi_c/libffi/src/sh/ffitarget.h +2 -2
  114. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +2 -2
  115. data/ext/ffi_c/libffi/src/sparc/ffi.c +55 -11
  116. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +5 -3
  117. data/ext/ffi_c/libffi/src/x86/ffi.c +54 -92
  118. data/ext/ffi_c/libffi/src/x86/ffi64.c +17 -8
  119. data/ext/ffi_c/libffi/src/x86/ffitarget.h +15 -14
  120. data/ext/ffi_c/libffi/src/x86/sysv.S +40 -26
  121. data/ext/ffi_c/libffi/src/x86/unix64.S +4 -0
  122. data/ext/ffi_c/libffi/src/x86/win32.S +379 -191
  123. data/ext/ffi_c/libffi/src/x86/win64.S +15 -7
  124. data/ext/ffi_c/libffi/testsuite/Makefile.am +1 -1
  125. data/ext/ffi_c/libffi/testsuite/Makefile.in +22 -4
  126. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +350 -0
  127. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +1 -5
  128. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +1 -1
  129. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +1 -1
  130. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +1 -0
  131. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +1 -0
  132. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +3 -0
  133. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +2 -2
  134. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +3 -0
  135. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +1 -1
  136. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +1 -1
  137. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +1 -0
  138. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +2 -3
  139. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -1
  140. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +36 -0
  141. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +17 -17
  142. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +1 -0
  143. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +1 -0
  144. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +1 -1
  145. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +1 -3
  146. data/ext/ffi_c/win32/stdint.h +199 -0
  147. data/gen/Rakefile +18 -2
  148. data/lib/ffi/platform/arm-linux/types.conf +102 -0
  149. data/lib/ffi/platform/i486-gnu/types.conf +107 -0
  150. data/lib/ffi/platform/ia64-linux/types.conf +102 -0
  151. data/lib/ffi/platform/mips-linux/types.conf +102 -0
  152. data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
  153. data/lib/ffi/platform/powerpc-linux/types.conf +100 -0
  154. data/lib/ffi/platform/s390-linux/types.conf +102 -0
  155. data/lib/ffi/platform/s390x-linux/types.conf +102 -0
  156. data/lib/ffi/platform/sparc-linux/types.conf +102 -0
  157. data/lib/ffi/tools/types_generator.rb +8 -1
  158. data/lib/ffi_c.bundle +0 -0
  159. metadata +72 -42
@@ -1,6 +1,7 @@
1
1
  /* -----------------------------------------------------------------------
2
- darwin_closure.S - Copyright (c) 2002, 2003, 2004, Free Software Foundation,
3
- Inc. based on ppc_closure.S
2
+ darwin_closure.S - Copyright (c) 2002, 2003, 2004, 2010,
3
+ Free Software Foundation, Inc.
4
+ based on ppc_closure.S
4
5
 
5
6
  PowerPC Assembly glue.
6
7
 
@@ -33,91 +34,177 @@
33
34
  #define MODE_CHOICE(x, y) x
34
35
  #endif
35
36
 
36
- #define lgu MODE_CHOICE(lwzu, ldu)
37
-
38
- #define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */
37
+ #define machine_choice MODE_CHOICE(ppc7400,ppc64)
38
+
39
+ ; Define some pseudo-opcodes for size-independent load & store of GPRs ...
40
+ #define lgu MODE_CHOICE(lwzu, ldu)
41
+ #define lg MODE_CHOICE(lwz,ld)
42
+ #define sg MODE_CHOICE(stw,std)
43
+ #define sgu MODE_CHOICE(stwu,stdu)
44
+
45
+ ; ... and the size of GPRs and their storage indicator.
46
+ #define GPR_BYTES MODE_CHOICE(4,8)
47
+ #define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */
48
+ #define g_long MODE_CHOICE(long, quad) /* usage is ".g_long" */
49
+
50
+ ; From the ABI doc: "Mac OS X ABI Function Call Guide" Version 2009-02-04.
51
+ #define LINKAGE_SIZE MODE_CHOICE(24,48)
52
+ #define PARAM_AREA MODE_CHOICE(32,64)
53
+
54
+ #define SAVED_CR_OFFSET MODE_CHOICE(4,8) /* save position for CR */
55
+ #define SAVED_LR_OFFSET MODE_CHOICE(8,16) /* save position for lr */
56
+
57
+ /* WARNING: if ffi_type is changed... here be monsters.
58
+ Offsets of items within the result type. */
59
+ #define FFI_TYPE_TYPE MODE_CHOICE(6,10)
60
+ #define FFI_TYPE_ELEM MODE_CHOICE(8,16)
61
+
62
+ #define SAVED_FPR_COUNT 13
63
+ #define FPR_SIZE 8
64
+ /* biggest m64 struct ret is 8GPRS + 13FPRS = 168 bytes - rounded to 16bytes = 176. */
65
+ #define RESULT_BYTES MODE_CHOICE(16,176)
66
+
67
+ ; The whole stack frame **MUST** be 16byte-aligned.
68
+ #define SAVE_SIZE (((LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES)+15) & -16LL)
69
+ #define PAD_SIZE (SAVE_SIZE-(LINKAGE_SIZE+PARAM_AREA+SAVED_FPR_COUNT*FPR_SIZE+RESULT_BYTES))
70
+
71
+ #define PARENT_PARM_BASE (SAVE_SIZE+LINKAGE_SIZE)
72
+ #define FP_SAVE_BASE (LINKAGE_SIZE+PARAM_AREA)
73
+
74
+ #if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050
75
+ ; We no longer need the pic symbol stub for Darwin >= 9.
76
+ #define BLCLS_HELP _ffi_closure_helper_DARWIN
77
+ #define STRUCT_RETVALUE_P _darwin64_struct_ret_by_value_p
78
+ #define PASS_STR_FLOATS _darwin64_pass_struct_floats
79
+ #undef WANT_STUB
80
+ #else
81
+ #define BLCLS_HELP L_ffi_closure_helper_DARWIN$stub
82
+ #define STRUCT_RETVALUE_P L_darwin64_struct_ret_by_value_p$stub
83
+ #define PASS_STR_FLOATS L_darwin64_pass_struct_floats$stub
84
+ #define WANT_STUB
85
+ #endif
39
86
 
40
- #define LOG2_GPR_BYTES MODE_CHOICE(2,3) /* log2(GPR_BYTES) */
87
+ /* m32/m64
88
+
89
+ The stack layout looks like this:
90
+
91
+ | Additional params... | | Higher address
92
+ ~ ~ ~
93
+ | Parameters (at least 8*4/8=32/64) | | NUM_GPR_ARG_REGISTERS
94
+ |--------------------------------------------| |
95
+ | TOC=R2 (AIX) Reserved (Darwin) 4/8 | |
96
+ |--------------------------------------------| |
97
+ | Reserved 2*4/8 | |
98
+ |--------------------------------------------| |
99
+ | Space for callee`s LR 4/8 | |
100
+ |--------------------------------------------| |
101
+ | Saved CR [low word for m64] 4/8 | |
102
+ |--------------------------------------------| |
103
+ | Current backchain pointer 4/8 |-/ Parent`s frame.
104
+ |--------------------------------------------| <+ <<< on entry to
105
+ | Result Bytes 16/176 | |
106
+ |--------------------------------------------| |
107
+ ~ padding to 16-byte alignment ~ ~
108
+ |--------------------------------------------| |
109
+ | NUM_FPR_ARG_REGISTERS slots | |
110
+ | here fp13 .. fp1 13*8 | |
111
+ |--------------------------------------------| |
112
+ | R3..R10 8*4/8=32/64 | | NUM_GPR_ARG_REGISTERS
113
+ |--------------------------------------------| |
114
+ | TOC=R2 (AIX) Reserved (Darwin) 4/8 | |
115
+ |--------------------------------------------| | stack |
116
+ | Reserved [compiler,binder] 2*4/8 | | grows |
117
+ |--------------------------------------------| | down V
118
+ | Space for callees LR 4/8 | |
119
+ |--------------------------------------------| | lower addresses
120
+ | Saved CR [low word for m64] 4/8 | |
121
+ |--------------------------------------------| | stack pointer here
122
+ | Current backchain pointer 4/8 |-/ during
123
+ |--------------------------------------------| <<< call.
124
+
125
+ */
41
126
 
42
127
  .file "darwin_closure.S"
43
- .text
44
- .align LOG2_GPR_BYTES
45
- .globl _ffi_closure_ASM
46
128
 
47
- .text
129
+ .machine machine_choice
130
+
131
+ .text
132
+ .globl _ffi_closure_ASM
48
133
  .align LOG2_GPR_BYTES
49
134
  _ffi_closure_ASM:
50
135
  LFB1:
51
- mflr r0 /* extract return address */
52
- stw r0,8(r1) /* save the return address */
136
+ Lstartcode:
137
+ mflr r0 /* extract return address */
138
+ sg r0,SAVED_LR_OFFSET(r1) /* save the return address */
53
139
  LCFI0:
54
- /* 24 Bytes (Linkage Area)
55
- 32 Bytes (outgoing parameter area, always reserved)
56
- 104 Bytes (13*8 from FPR)
57
- 16 Bytes (result)
58
- 176 Bytes */
59
-
60
- stwu r1,-176(r1) /* skip over caller save area
61
- keep stack aligned to 16. */
140
+ sgu r1,-SAVE_SIZE(r1) /* skip over caller save area
141
+ keep stack aligned to 16. */
62
142
  LCFI1:
63
143
  /* We want to build up an area for the parameters passed
64
144
  in registers. (both floating point and integer) */
65
145
 
66
- /* We store gpr 3 to gpr 10 (aligned to 4)
67
- in the parents outgoing area. */
68
- stw r3,200(r1)
69
- stw r4,204(r1)
70
- stw r5,208(r1)
71
- stw r6,212(r1)
72
- stw r7,216(r1)
73
- stw r8,220(r1)
74
- stw r9,224(r1)
75
- stw r10,228(r1)
76
-
77
- /* We save fpr 1 to fpr 13. (aligned to 8) */
78
- stfd f1,56(r1)
79
- stfd f2,64(r1)
80
- stfd f3,72(r1)
81
- stfd f4,80(r1)
82
- stfd f5,88(r1)
83
- stfd f6,96(r1)
84
- stfd f7,104(r1)
85
- stfd f8,112(r1)
86
- stfd f9,120(r1)
87
- stfd f10,128(r1)
88
- stfd f11,136(r1)
89
- stfd f12,144(r1)
90
- stfd f13,152(r1)
146
+ /* Put gpr 3 to gpr 10 in the parents outgoing area...
147
+ ... the remainder of any params that overflowed the regs will
148
+ follow here. */
149
+ sg r3, (PARENT_PARM_BASE )(r1)
150
+ sg r4, (PARENT_PARM_BASE + GPR_BYTES )(r1)
151
+ sg r5, (PARENT_PARM_BASE + GPR_BYTES * 2)(r1)
152
+ sg r6, (PARENT_PARM_BASE + GPR_BYTES * 3)(r1)
153
+ sg r7, (PARENT_PARM_BASE + GPR_BYTES * 4)(r1)
154
+ sg r8, (PARENT_PARM_BASE + GPR_BYTES * 5)(r1)
155
+ sg r9, (PARENT_PARM_BASE + GPR_BYTES * 6)(r1)
156
+ sg r10,(PARENT_PARM_BASE + GPR_BYTES * 7)(r1)
157
+
158
+ /* We save fpr 1 to fpr 14 in our own save frame. */
159
+ stfd f1, (FP_SAVE_BASE )(r1)
160
+ stfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1)
161
+ stfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1)
162
+ stfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1)
163
+ stfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1)
164
+ stfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1)
165
+ stfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1)
166
+ stfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1)
167
+ stfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1)
168
+ stfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1)
169
+ stfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1)
170
+ stfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1)
171
+ stfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1)
91
172
 
92
173
  /* Set up registers for the routine that actually does the work
93
174
  get the context pointer from the trampoline. */
94
- mr r3,r11
175
+ mr r3,r11
95
176
 
96
177
  /* Now load up the pointer to the result storage. */
97
- addi r4,r1,160
178
+ addi r4,r1,(SAVE_SIZE-RESULT_BYTES)
98
179
 
99
180
  /* Now load up the pointer to the saved gpr registers. */
100
- addi r5,r1,200
181
+ addi r5,r1,PARENT_PARM_BASE
101
182
 
102
183
  /* Now load up the pointer to the saved fpr registers. */
103
- addi r6,r1,56
184
+ addi r6,r1,FP_SAVE_BASE
104
185
 
105
186
  /* Make the call. */
106
- bl Lffi_closure_helper_DARWIN$stub
187
+ bl BLCLS_HELP
188
+
189
+ /* r3 contains the rtype pointer... save it since we will need
190
+ it later. */
191
+ sg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type
192
+ lg r0,0(r3) ; size => r0
193
+ lhz r3,FFI_TYPE_TYPE(r3) ; type => r3
107
194
 
108
- /* Now r3 contains the return type
109
- so use it to look up in a table
195
+ /* The helper will have intercepted struture returns and inserted
196
+ the caller`s destination address for structs returned by ref. */
197
+
198
+ /* r3 contains the return type so use it to look up in a table
110
199
  so we know how to deal with each type. */
111
200
 
112
- /* Look up the proper starting point in table
113
- by using return type as offset. */
114
- addi r5,r1,160 /* Get pointer to results area. */
115
- bl Lget_ret_type0_addr /* Get pointer to Lret_type0 into LR. */
116
- mflr r4 /* Move to r4. */
117
- slwi r3,r3,4 /* Now multiply return type by 16. */
118
- add r3,r3,r4 /* Add contents of table to table address. */
119
- mtctr r3
120
- bctr /* Jump to it. */
201
+ addi r5,r1,(SAVE_SIZE-RESULT_BYTES) /* Otherwise, our return is here. */
202
+ bl Lget_ret_type0_addr /* Get pointer to Lret_type0 into LR. */
203
+ mflr r4 /* Move to r4. */
204
+ slwi r3,r3,4 /* Now multiply return type by 16. */
205
+ add r3,r3,r4 /* Add contents of table to table address. */
206
+ mtctr r3
207
+ bctr /* Jump to it. */
121
208
  LFE1:
122
209
  /* Each of the ret_typeX code fragments has to be exactly 16 bytes long
123
210
  (4 instructions). For cache effectiveness we align to a 16 byte boundary
@@ -140,7 +227,7 @@ Lret_type0:
140
227
 
141
228
  /* case FFI_TYPE_INT */
142
229
  Lret_type1:
143
- lwz r3,0(r5)
230
+ lg r3,0(r5)
144
231
  b Lfinish
145
232
  nop
146
233
  nop
@@ -168,85 +255,224 @@ Lret_type4:
168
255
 
169
256
  /* case FFI_TYPE_UINT8 */
170
257
  Lret_type5:
258
+ #if defined(__ppc64__)
259
+ lbz r3,7(r5)
260
+ #else
171
261
  lbz r3,3(r5)
262
+ #endif
172
263
  b Lfinish
173
264
  nop
174
265
  nop
175
266
 
176
267
  /* case FFI_TYPE_SINT8 */
177
268
  Lret_type6:
269
+ #if defined(__ppc64__)
270
+ lbz r3,7(r5)
271
+ #else
178
272
  lbz r3,3(r5)
273
+ #endif
179
274
  extsb r3,r3
180
275
  b Lfinish
181
276
  nop
182
277
 
183
278
  /* case FFI_TYPE_UINT16 */
184
279
  Lret_type7:
280
+ #if defined(__ppc64__)
281
+ lhz r3,6(r5)
282
+ #else
185
283
  lhz r3,2(r5)
284
+ #endif
186
285
  b Lfinish
187
286
  nop
188
287
  nop
189
288
 
190
289
  /* case FFI_TYPE_SINT16 */
191
290
  Lret_type8:
291
+ #if defined(__ppc64__)
292
+ lha r3,6(r5)
293
+ #else
192
294
  lha r3,2(r5)
295
+ #endif
193
296
  b Lfinish
194
297
  nop
195
298
  nop
196
299
 
197
300
  /* case FFI_TYPE_UINT32 */
198
301
  Lret_type9:
302
+ #if defined(__ppc64__)
303
+ lwz r3,4(r5)
304
+ #else
199
305
  lwz r3,0(r5)
306
+ #endif
200
307
  b Lfinish
201
308
  nop
202
309
  nop
203
310
 
204
311
  /* case FFI_TYPE_SINT32 */
205
312
  Lret_type10:
313
+ #if defined(__ppc64__)
314
+ lwz r3,4(r5)
315
+ #else
206
316
  lwz r3,0(r5)
317
+ #endif
207
318
  b Lfinish
208
319
  nop
209
320
  nop
210
321
 
211
322
  /* case FFI_TYPE_UINT64 */
212
323
  Lret_type11:
324
+ #if defined(__ppc64__)
325
+ lg r3,0(r5)
326
+ b Lfinish
327
+ nop
328
+ #else
213
329
  lwz r3,0(r5)
214
330
  lwz r4,4(r5)
215
331
  b Lfinish
332
+ #endif
216
333
  nop
217
334
 
218
335
  /* case FFI_TYPE_SINT64 */
219
336
  Lret_type12:
337
+ #if defined(__ppc64__)
338
+ lg r3,0(r5)
339
+ b Lfinish
340
+ nop
341
+ #else
220
342
  lwz r3,0(r5)
221
343
  lwz r4,4(r5)
222
344
  b Lfinish
345
+ #endif
223
346
  nop
224
347
 
225
348
  /* case FFI_TYPE_STRUCT */
226
349
  Lret_type13:
350
+ #if defined(__ppc64__)
351
+ lg r3,0(r5) ; we need at least this...
352
+ cmpi 0,r0,4
353
+ bgt Lstructend ; not a special small case
354
+ b Lsmallstruct ; see if we need more.
355
+ #else
356
+ cmpi 0,r0,4
357
+ bgt Lfinish ; not by value
358
+ lg r3,0(r5)
227
359
  b Lfinish
228
- nop
229
- nop
230
- nop
231
-
360
+ #endif
232
361
  /* case FFI_TYPE_POINTER */
233
362
  Lret_type14:
234
- lwz r3,0(r5)
363
+ lg r3,0(r5)
235
364
  b Lfinish
236
365
  nop
237
366
  nop
238
367
 
368
+ #if defined(__ppc64__)
369
+ Lsmallstruct:
370
+ beq Lfour ; continuation of Lret13.
371
+ cmpi 0,r0,3
372
+ beq Lfinish ; don`t adjust this - can`t be any floats here...
373
+ srdi r3,r3,48
374
+ cmpi 0,r0,2
375
+ beq Lfinish ; .. or here ..
376
+ srdi r3,r3,8
377
+ b Lfinish ; .. or here.
378
+
379
+ Lfour:
380
+ lg r6,LINKAGE_SIZE(r1) ; get the result type
381
+ lg r6,FFI_TYPE_ELEM(r6) ; elements array pointer
382
+ lg r6,0(r6) ; first element
383
+ lhz r0,FFI_TYPE_TYPE(r6) ; OK go the type
384
+ cmpi 0,r0,2 ; FFI_TYPE_FLOAT
385
+ bne Lfourint
386
+ lfs f1,0(r5) ; just one float in the struct.
387
+ b Lfinish
388
+
389
+ Lfourint:
390
+ srdi r3,r3,32 ; four bytes.
391
+ b Lfinish
392
+
393
+ Lstructend:
394
+ lg r3,LINKAGE_SIZE(r1) ; get the result type
395
+ bl STRUCT_RETVALUE_P
396
+ cmpi 0,r3,0
397
+ beq Lfinish ; nope.
398
+ /* Recover a pointer to the results. */
399
+ addi r11,r1,(SAVE_SIZE-RESULT_BYTES)
400
+ lg r3,0(r11) ; we need at least this...
401
+ lg r4,8(r11)
402
+ cmpi 0,r0,16
403
+ beq Lfinish ; special case 16 bytes we don't consider floats.
404
+
405
+ /* OK, frustratingly, the process of saving the struct to mem might have
406
+ messed with the FPRs, so we have to re-load them :(.
407
+ We`ll use our FPRs space again - calling:
408
+ void darwin64_pass_struct_floats (ffi_type *s, char *src,
409
+ unsigned *nfpr, double **fprs)
410
+ We`ll temporarily pinch the first two slots of the param area for local
411
+ vars used by the routine. */
412
+ xor r6,r6,r6
413
+ addi r5,r1,PARENT_PARM_BASE ; some space
414
+ sg r6,0(r5) ; *nfpr zeroed.
415
+ addi r6,r5,8 ; **fprs
416
+ addi r3,r1,FP_SAVE_BASE ; pointer to FPRs space
417
+ sg r3,0(r6)
418
+ mr r4,r11 ; the struct is here...
419
+ lg r3,LINKAGE_SIZE(r1) ; ffi_type * result_type.
420
+ bl PASS_STR_FLOATS ; get struct floats into FPR save space.
421
+ /* See if we used any floats */
422
+ lwz r0,(SAVE_SIZE-RESULT_BYTES)(r1)
423
+ cmpi 0,r0,0
424
+ beq Lstructints ; nope.
425
+ /* OK load `em up... */
426
+ lfd f1, (FP_SAVE_BASE )(r1)
427
+ lfd f2, (FP_SAVE_BASE + FPR_SIZE )(r1)
428
+ lfd f3, (FP_SAVE_BASE + FPR_SIZE * 2 )(r1)
429
+ lfd f4, (FP_SAVE_BASE + FPR_SIZE * 3 )(r1)
430
+ lfd f5, (FP_SAVE_BASE + FPR_SIZE * 4 )(r1)
431
+ lfd f6, (FP_SAVE_BASE + FPR_SIZE * 5 )(r1)
432
+ lfd f7, (FP_SAVE_BASE + FPR_SIZE * 6 )(r1)
433
+ lfd f8, (FP_SAVE_BASE + FPR_SIZE * 7 )(r1)
434
+ lfd f9, (FP_SAVE_BASE + FPR_SIZE * 8 )(r1)
435
+ lfd f10,(FP_SAVE_BASE + FPR_SIZE * 9 )(r1)
436
+ lfd f11,(FP_SAVE_BASE + FPR_SIZE * 10)(r1)
437
+ lfd f12,(FP_SAVE_BASE + FPR_SIZE * 11)(r1)
438
+ lfd f13,(FP_SAVE_BASE + FPR_SIZE * 12)(r1)
439
+
440
+ /* point back at our saved struct. */
441
+ Lstructints:
442
+ addi r11,r1,(SAVE_SIZE-RESULT_BYTES)
443
+ lg r3,0(r11) ; we end up picking the
444
+ lg r4,8(r11) ; first two again.
445
+ lg r5,16(r11)
446
+ lg r6,24(r11)
447
+ lg r7,32(r11)
448
+ lg r8,40(r11)
449
+ lg r9,48(r11)
450
+ lg r10,56(r11)
451
+ #endif
452
+
239
453
  /* case done */
240
454
  Lfinish:
241
- addi r1,r1,176 /* Restore stack pointer. */
242
- lwz r0,8(r1) /* Get return address. */
243
- mtlr r0 /* Reset link register. */
455
+ addi r1,r1,SAVE_SIZE /* Restore stack pointer. */
456
+ lg r0,SAVED_LR_OFFSET(r1) /* Get return address. */
457
+ mtlr r0 /* Reset link register. */
244
458
  blr
245
-
459
+ Lendcode:
460
+ .align 1
461
+
246
462
  /* END(ffi_closure_ASM) */
247
463
 
248
- .data
249
- .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
464
+ /* EH frame stuff. */
465
+ #define EH_DATA_ALIGN_FACT MODE_CHOICE(0x7c,0x78)
466
+ /* 176, 400 */
467
+ #define EH_FRAME_OFFSETA MODE_CHOICE(176,0x90)
468
+ #define EH_FRAME_OFFSETB MODE_CHOICE(1,3)
469
+
470
+ .static_data
471
+ .align LOG2_GPR_BYTES
472
+ LLFB1$non_lazy_ptr:
473
+ .g_long Lstartcode
474
+
475
+ .section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support
250
476
  EH_frame1:
251
477
  .set L$set$0,LECIE1-LSCIE1
252
478
  .long L$set$0 ; Length of Common Information Entry
@@ -255,16 +481,16 @@ LSCIE1:
255
481
  .byte 0x1 ; CIE Version
256
482
  .ascii "zR\0" ; CIE Augmentation
257
483
  .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor
258
- .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor
484
+ .byte EH_DATA_ALIGN_FACT ; sleb128 -4; CIE Data Alignment Factor
259
485
  .byte 0x41 ; CIE RA Column
260
486
  .byte 0x1 ; uleb128 0x1; Augmentation size
261
- .byte 0x90 ; FDE Encoding (indirect pcrel)
487
+ .byte 0x10 ; FDE Encoding (indirect pcrel)
262
488
  .byte 0xc ; DW_CFA_def_cfa
263
489
  .byte 0x1 ; uleb128 0x1
264
490
  .byte 0x0 ; uleb128 0x0
265
491
  .align LOG2_GPR_BYTES
266
492
  LECIE1:
267
- .globl _ffi_closure_ASM.eh
493
+ .globl _ffi_closure_ASM.eh
268
494
  _ffi_closure_ASM.eh:
269
495
  LSFDE1:
270
496
  .set L$set$1,LEFDE1-LASFDE1
@@ -273,45 +499,77 @@ LSFDE1:
273
499
  LASFDE1:
274
500
  .long LASFDE1-EH_frame1 ; FDE CIE offset
275
501
  .g_long LLFB1$non_lazy_ptr-. ; FDE initial location
276
- .set L$set$3,LFE1-LFB1
502
+ .set L$set$3,LFE1-Lstartcode
277
503
  .g_long L$set$3 ; FDE address range
278
504
  .byte 0x0 ; uleb128 0x0; Augmentation size
279
505
  .byte 0x4 ; DW_CFA_advance_loc4
280
506
  .set L$set$3,LCFI1-LCFI0
281
507
  .long L$set$3
282
508
  .byte 0xe ; DW_CFA_def_cfa_offset
283
- .byte 176,1 ; uleb128 176
509
+ .byte EH_FRAME_OFFSETA,EH_FRAME_OFFSETB ; uleb128 176,1/190,3
284
510
  .byte 0x4 ; DW_CFA_advance_loc4
285
- .set L$set$4,LCFI0-LFB1
511
+ .set L$set$4,LCFI0-Lstartcode
286
512
  .long L$set$4
287
513
  .byte 0x11 ; DW_CFA_offset_extended_sf
288
514
  .byte 0x41 ; uleb128 0x41
289
515
  .byte 0x7e ; sleb128 -2
290
516
  .align LOG2_GPR_BYTES
291
517
  LEFDE1:
292
- .data
293
- .align LOG2_GPR_BYTES
294
- LDFCM0:
295
- .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
296
- .align LOG2_GPR_BYTES
297
- Lffi_closure_helper_DARWIN$stub:
298
- #if 1
518
+ .align 1
519
+
520
+ #ifdef WANT_STUB
521
+ .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
522
+ .align 5
523
+ L_ffi_closure_helper_DARWIN$stub:
299
524
  .indirect_symbol _ffi_closure_helper_DARWIN
300
- mflr r0
301
- bcl 20,31,LO$ffi_closure_helper_DARWIN
302
- LO$ffi_closure_helper_DARWIN:
303
- mflr r11
304
- addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)
305
- mtlr r0
306
- lgu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr - LO$ffi_closure_helper_DARWIN)(r11)
307
- mtctr r12
525
+ mflr r0
526
+ bcl 20,31,"L00000000001$spb"
527
+ "L00000000001$spb":
528
+ mflr r11
529
+ addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L00000000001$spb")
530
+ mtlr r0
531
+ lwzu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L00000000001$spb")(r11)
532
+ mtctr r12
308
533
  bctr
309
- .lazy_symbol_pointer
534
+ .lazy_symbol_pointer
310
535
  L_ffi_closure_helper_DARWIN$lazy_ptr:
311
536
  .indirect_symbol _ffi_closure_helper_DARWIN
312
- .g_long dyld_stub_binding_helper
537
+ .long dyld_stub_binding_helper
538
+
539
+ #if defined(__ppc64__)
540
+ .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
541
+ .align 5
542
+ L_darwin64_struct_ret_by_value_p$stub:
543
+ .indirect_symbol _darwin64_struct_ret_by_value_p
544
+ mflr r0
545
+ bcl 20,31,"L00000000002$spb"
546
+ "L00000000002$spb":
547
+ mflr r11
548
+ addis r11,r11,ha16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L00000000002$spb")
549
+ mtlr r0
550
+ lwzu r12,lo16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L00000000002$spb")(r11)
551
+ mtctr r12
552
+ bctr
553
+ .lazy_symbol_pointer
554
+ L_darwin64_struct_ret_by_value_p$lazy_ptr:
555
+ .indirect_symbol _darwin64_struct_ret_by_value_p
556
+ .long dyld_stub_binding_helper
557
+ .section __TEXT,__picsymbolstub1,symbol_stubs,pure_instructions,32
558
+ .align 5
559
+ L_darwin64_pass_struct_floats$stub:
560
+ .indirect_symbol _darwin64_pass_struct_floats
561
+ mflr r0
562
+ bcl 20,31,"L00000000003$spb"
563
+ "L00000000003$spb":
564
+ mflr r11
565
+ addis r11,r11,ha16(L_darwin64_pass_struct_floats$lazy_ptr-"L00000000003$spb")
566
+ mtlr r0
567
+ lwzu r12,lo16(L_darwin64_pass_struct_floats$lazy_ptr-"L00000000003$spb")(r11)
568
+ mtctr r12
569
+ bctr
570
+ .lazy_symbol_pointer
571
+ L_darwin64_pass_struct_floats$lazy_ptr:
572
+ .indirect_symbol _darwin64_pass_struct_floats
573
+ .long dyld_stub_binding_helper
574
+ # endif
313
575
  #endif
314
- .data
315
- .align LOG2_GPR_BYTES
316
- LLFB1$non_lazy_ptr:
317
- .g_long LFB1