ffi 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. data/LICENSE +1 -27
  2. data/Rakefile +9 -12
  3. data/ext/ffi_c/AbstractMemory.c +11 -8
  4. data/ext/ffi_c/AbstractMemory.h +23 -21
  5. data/ext/ffi_c/AutoPointer.c +0 -1
  6. data/ext/ffi_c/Buffer.c +24 -8
  7. data/ext/ffi_c/Call.c +28 -0
  8. data/ext/ffi_c/Call.h +8 -4
  9. data/ext/ffi_c/ClosurePool.c +7 -5
  10. data/ext/ffi_c/DynamicLibrary.c +0 -1
  11. data/ext/ffi_c/Function.c +19 -2
  12. data/ext/ffi_c/MemoryPointer.c +3 -3
  13. data/ext/ffi_c/MethodHandle.c +1 -1
  14. data/ext/ffi_c/Pointer.c +23 -9
  15. data/ext/ffi_c/Struct.c +142 -69
  16. data/ext/ffi_c/Struct.h +16 -7
  17. data/ext/ffi_c/StructLayout.c +92 -55
  18. data/ext/ffi_c/Type.c +5 -22
  19. data/ext/ffi_c/Type.h +1 -1
  20. data/ext/ffi_c/Types.c +8 -2
  21. data/ext/ffi_c/Types.h +2 -0
  22. data/ext/ffi_c/Variadic.c +7 -19
  23. data/ext/ffi_c/endian.h +1 -1
  24. data/ext/ffi_c/extconf.rb +20 -11
  25. data/ext/ffi_c/libffi/ChangeLog +900 -84
  26. data/ext/ffi_c/libffi/ChangeLog.libffi +311 -0
  27. data/ext/ffi_c/libffi/LICENSE +1 -1
  28. data/ext/ffi_c/libffi/Makefile.am +14 -4
  29. data/ext/ffi_c/libffi/Makefile.in +362 -211
  30. data/ext/ffi_c/libffi/README +70 -92
  31. data/ext/ffi_c/libffi/aclocal.m4 +6068 -4586
  32. data/ext/ffi_c/libffi/config.guess +125 -143
  33. data/ext/ffi_c/libffi/config.sub +103 -27
  34. data/ext/ffi_c/libffi/configure +11364 -18497
  35. data/ext/ffi_c/libffi/configure.ac +43 -4
  36. data/ext/ffi_c/libffi/doc/libffi.info +15 -15
  37. data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
  38. data/ext/ffi_c/libffi/doc/stamp-vti +4 -4
  39. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  40. data/ext/ffi_c/libffi/fficonfig.h.in +24 -3
  41. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  42. data/ext/ffi_c/libffi/include/Makefile.in +97 -50
  43. data/ext/ffi_c/libffi/include/ffi.h.in +8 -2
  44. data/ext/ffi_c/libffi/include/ffi_common.h +24 -0
  45. data/ext/ffi_c/libffi/libtool-version +1 -1
  46. data/ext/ffi_c/libffi/ltmain.sh +7346 -5870
  47. data/ext/ffi_c/libffi/m4/libtool.m4 +7360 -0
  48. data/ext/ffi_c/libffi/m4/ltoptions.m4 +368 -0
  49. data/ext/ffi_c/libffi/m4/ltsugar.m4 +123 -0
  50. data/ext/ffi_c/libffi/m4/ltversion.m4 +23 -0
  51. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +92 -0
  52. data/ext/ffi_c/libffi/man/Makefile.in +115 -62
  53. data/ext/ffi_c/libffi/man/ffi_call.3 +3 -3
  54. data/ext/ffi_c/libffi/missing +15 -8
  55. data/ext/ffi_c/libffi/src/arm/sysv.S +15 -8
  56. data/ext/ffi_c/libffi/src/avr32/ffi.c +421 -0
  57. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +50 -0
  58. data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
  59. data/ext/ffi_c/libffi/src/closures.c +47 -10
  60. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  61. data/ext/ffi_c/libffi/src/java_raw_api.c +0 -3
  62. data/ext/ffi_c/libffi/src/mips/ffi.c +135 -32
  63. data/ext/ffi_c/libffi/src/mips/ffitarget.h +37 -4
  64. data/ext/ffi_c/libffi/src/mips/n32.S +67 -10
  65. data/ext/ffi_c/libffi/src/mips/o32.S +8 -8
  66. data/ext/ffi_c/libffi/src/pa/ffi.c +7 -0
  67. data/ext/ffi_c/libffi/src/powerpc/aix.S +163 -64
  68. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +308 -112
  69. data/ext/ffi_c/libffi/src/powerpc/ffi.c +20 -7
  70. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +208 -80
  71. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +11 -3
  72. data/ext/ffi_c/libffi/src/powerpc/sysv.S +12 -23
  73. data/ext/ffi_c/libffi/src/s390/sysv.S +1 -1
  74. data/ext/ffi_c/libffi/src/sh/sysv.S +9 -9
  75. data/ext/ffi_c/libffi/src/sh64/ffi.c +37 -22
  76. data/ext/ffi_c/libffi/src/sh64/sysv.S +23 -14
  77. data/ext/ffi_c/libffi/src/sparc/ffi.c +21 -6
  78. data/ext/ffi_c/libffi/src/sparc/v8.S +55 -14
  79. data/ext/ffi_c/libffi/src/x86/darwin.S +10 -9
  80. data/ext/ffi_c/libffi/src/x86/ffi.c +293 -86
  81. data/ext/ffi_c/libffi/src/x86/ffi64.c +73 -19
  82. data/ext/ffi_c/libffi/src/x86/ffitarget.h +30 -0
  83. data/ext/ffi_c/libffi/src/x86/sysv.S +21 -4
  84. data/ext/ffi_c/libffi/src/x86/unix64.S +8 -4
  85. data/ext/ffi_c/libffi/src/x86/win32.S +633 -147
  86. data/ext/ffi_c/libffi/src/x86/win64.S +460 -0
  87. data/ext/ffi_c/libffi/testsuite/Makefile.am +63 -54
  88. data/ext/ffi_c/libffi/testsuite/Makefile.in +112 -77
  89. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +12 -1
  90. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -4
  91. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +7 -15
  92. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +7 -15
  93. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +7 -15
  94. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +7 -15
  95. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +7 -15
  96. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +7 -14
  97. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +7 -15
  98. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
  99. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +6 -14
  100. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -12
  101. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -12
  102. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -12
  103. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -12
  104. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -12
  105. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -12
  106. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -12
  107. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +4 -12
  108. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -12
  109. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -12
  110. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -12
  111. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -12
  112. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -12
  113. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -12
  114. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -12
  115. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -12
  116. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +4 -12
  117. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -12
  118. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -12
  119. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -12
  120. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -12
  121. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -12
  122. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -12
  123. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -12
  124. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -12
  125. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -12
  126. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -12
  127. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +134 -0
  128. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +117 -0
  129. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +11 -17
  130. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -12
  131. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -12
  132. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +7 -15
  133. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -12
  134. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -12
  135. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +7 -15
  136. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
  137. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +4 -12
  138. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +57 -0
  139. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +4 -13
  140. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
  141. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +57 -0
  142. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +4 -12
  143. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +4 -12
  144. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +4 -12
  145. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +4 -12
  146. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +4 -12
  147. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +4 -12
  148. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
  149. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +140 -0
  150. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +4 -12
  151. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +4 -12
  152. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +4 -12
  153. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +4 -12
  154. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +4 -12
  155. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +8 -16
  156. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +4 -12
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +37 -0
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +25 -0
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +31 -0
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +2 -1
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +342 -0
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +4 -12
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +4 -12
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +4 -12
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +4 -12
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +4 -12
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +4 -12
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +4 -12
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +4 -12
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +4 -12
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +4 -12
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +4 -12
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +4 -12
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +1 -1
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +124 -0
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
  181. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +10 -0
  182. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +4 -5
  183. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +17 -16
  184. data/ext/ffi_c/libffi/texinfo.tex +155 -427
  185. data/ext/ffi_c/libffi.bsd.mk +1 -1
  186. data/lib/ffi/autopointer.rb +79 -20
  187. data/lib/ffi/buffer.rb +4 -0
  188. data/lib/ffi/callback.rb +4 -10
  189. data/lib/ffi/enum.rb +28 -0
  190. data/lib/ffi/ffi.rb +0 -1
  191. data/lib/ffi/io.rb +28 -0
  192. data/lib/ffi/library.rb +237 -182
  193. data/lib/ffi/memorypointer.rb +28 -62
  194. data/lib/ffi/platform.rb +27 -0
  195. data/lib/ffi/pointer.rb +28 -0
  196. data/lib/ffi/struct.rb +55 -1
  197. data/lib/ffi/types.rb +29 -0
  198. data/lib/ffi/variadic.rb +29 -0
  199. data/spec/ffi/library_spec.rb +31 -5
  200. data/spec/ffi/managed_struct_spec.rb +1 -1
  201. data/spec/ffi/pointer_spec.rb +1 -1
  202. data/spec/ffi/rbx/attach_function_spec.rb +2 -1
  203. data/spec/ffi/rbx/memory_pointer_spec.rb +2 -1
  204. data/spec/ffi/spec_helper.rb +5 -1
  205. data/spec/ffi/struct_spec.rb +77 -0
  206. metadata +28 -18
  207. data/ext/ffi_c/libffi/TODO +0 -1
  208. data/ext/ffi_c/libffi/ltcf-c.sh +0 -861
  209. data/ext/ffi_c/libffi/ltcf-cxx.sh +0 -1069
  210. data/ext/ffi_c/libffi/ltcf-gcj.sh +0 -700
  211. data/ext/ffi_c/libffi/ltconfig +0 -2862
  212. data/ext/ffi_c/libffi/mkinstalldirs +0 -158
@@ -1,6 +1,6 @@
1
1
  /* -----------------------------------------------------------------------
2
- ffi.c - Copyright (c) 2002, 2007 Bo Thorsen <bo@suse.de>
3
- Copyright (c) 2008 Red Hat, Inc.
2
+ ffi64.c - Copyright (c) 2002, 2007 Bo Thorsen <bo@suse.de>
3
+ Copyright (c) 2008 Red Hat, Inc.
4
4
 
5
5
  x86-64 Foreign Function Interface
6
6
 
@@ -145,13 +145,35 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
145
145
  case FFI_TYPE_UINT64:
146
146
  case FFI_TYPE_SINT64:
147
147
  case FFI_TYPE_POINTER:
148
- if (byte_offset + type->size <= 4)
149
- classes[0] = X86_64_INTEGERSI_CLASS;
150
- else
151
- classes[0] = X86_64_INTEGER_CLASS;
152
- return 1;
148
+ {
149
+ int size = byte_offset + type->size;
150
+
151
+ if (size <= 4)
152
+ {
153
+ classes[0] = X86_64_INTEGERSI_CLASS;
154
+ return 1;
155
+ }
156
+ else if (size <= 8)
157
+ {
158
+ classes[0] = X86_64_INTEGER_CLASS;
159
+ return 1;
160
+ }
161
+ else if (size <= 12)
162
+ {
163
+ classes[0] = X86_64_INTEGER_CLASS;
164
+ classes[1] = X86_64_INTEGERSI_CLASS;
165
+ return 2;
166
+ }
167
+ else if (size <= 16)
168
+ {
169
+ classes[0] = classes[1] = X86_64_INTEGERSI_CLASS;
170
+ return 2;
171
+ }
172
+ else
173
+ FFI_ASSERT (0);
174
+ }
153
175
  case FFI_TYPE_FLOAT:
154
- if (byte_offset == 0)
176
+ if (!(byte_offset % 8))
155
177
  classes[0] = X86_64_SSESF_CLASS;
156
178
  else
157
179
  classes[0] = X86_64_SSE_CLASS;
@@ -171,13 +193,21 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
171
193
  int i;
172
194
  enum x86_64_reg_class subclasses[MAX_CLASSES];
173
195
 
174
- /* If the struct is larger than 16 bytes, pass it on the stack. */
175
- if (type->size > 16)
196
+ /* If the struct is larger than 32 bytes, pass it on the stack. */
197
+ if (type->size > 32)
176
198
  return 0;
177
199
 
178
200
  for (i = 0; i < words; i++)
179
201
  classes[i] = X86_64_NO_CLASS;
180
202
 
203
+ /* Zero sized arrays or structures are NO_CLASS. We return 0 to
204
+ signalize memory class, so handle it as special case. */
205
+ if (!words)
206
+ {
207
+ classes[0] = X86_64_NO_CLASS;
208
+ return 1;
209
+ }
210
+
181
211
  /* Merge the fields of structure. */
182
212
  for (ptr = type->elements; *ptr != NULL; ptr++)
183
213
  {
@@ -198,6 +228,20 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
198
228
  byte_offset += (*ptr)->size;
199
229
  }
200
230
 
231
+ if (words > 2)
232
+ {
233
+ /* When size > 16 bytes, if the first one isn't
234
+ X86_64_SSE_CLASS or any other ones aren't
235
+ X86_64_SSEUP_CLASS, everything should be passed in
236
+ memory. */
237
+ if (classes[0] != X86_64_SSE_CLASS)
238
+ return 0;
239
+
240
+ for (i = 1; i < words; i++)
241
+ if (classes[i] != X86_64_SSEUP_CLASS)
242
+ return 0;
243
+ }
244
+
201
245
  /* Final merger cleanup. */
202
246
  for (i = 0; i < words; i++)
203
247
  {
@@ -207,15 +251,25 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
207
251
  return 0;
208
252
 
209
253
  /* The X86_64_SSEUP_CLASS should be always preceded by
210
- X86_64_SSE_CLASS. */
254
+ X86_64_SSE_CLASS or X86_64_SSEUP_CLASS. */
211
255
  if (classes[i] == X86_64_SSEUP_CLASS
212
- && (i == 0 || classes[i - 1] != X86_64_SSE_CLASS))
213
- classes[i] = X86_64_SSE_CLASS;
256
+ && classes[i - 1] != X86_64_SSE_CLASS
257
+ && classes[i - 1] != X86_64_SSEUP_CLASS)
258
+ {
259
+ /* The first one should never be X86_64_SSEUP_CLASS. */
260
+ FFI_ASSERT (i != 0);
261
+ classes[i] = X86_64_SSE_CLASS;
262
+ }
214
263
 
215
- /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */
264
+ /* If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
265
+ everything should be passed in memory. */
216
266
  if (classes[i] == X86_64_X87UP_CLASS
217
- && (i == 0 || classes[i - 1] != X86_64_X87_CLASS))
218
- classes[i] = X86_64_SSE_CLASS;
267
+ && (classes[i - 1] != X86_64_X87_CLASS))
268
+ {
269
+ /* The first one should never be X86_64_X87UP_CLASS. */
270
+ FFI_ASSERT (i != 0);
271
+ return 0;
272
+ }
219
273
  }
220
274
  return words;
221
275
  }
@@ -528,10 +582,10 @@ ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
528
582
  argp += arg_types[i]->size;
529
583
  }
530
584
  /* If the argument is in a single register, or two consecutive
531
- registers, then we can use that address directly. */
585
+ integer registers, then we can use that address directly. */
532
586
  else if (n == 1
533
- || (n == 2
534
- && SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1])))
587
+ || (n == 2 && !(SSE_CLASS_P (classes[0])
588
+ || SSE_CLASS_P (classes[1]))))
535
589
  {
536
590
  /* The argument is in a single register. */
537
591
  if (SSE_CLASS_P (classes[0]))
@@ -36,11 +36,26 @@
36
36
  #define X86
37
37
  #endif
38
38
 
39
+ #ifdef X86_WIN64
40
+ #define FFI_SIZEOF_ARG 8
41
+ #define USE_BUILTIN_FFS 0 // not yet implemented in mingw-64
42
+ #endif
43
+
39
44
  /* ---- Generic type definitions ----------------------------------------- */
40
45
 
41
46
  #ifndef LIBFFI_ASM
47
+ #ifdef X86_WIN64
48
+ #ifdef _MSC_VER
49
+ typedef unsigned __int64 ffi_arg;
50
+ typedef __int64 ffi_sarg;
51
+ #else
52
+ typedef unsigned long long ffi_arg;
53
+ typedef long long ffi_sarg;
54
+ #endif
55
+ #else
42
56
  typedef unsigned long ffi_arg;
43
57
  typedef signed long ffi_sarg;
58
+ #endif
44
59
 
45
60
  typedef enum ffi_abi {
46
61
  FFI_FIRST_ABI = 0,
@@ -53,6 +68,11 @@ typedef enum ffi_abi {
53
68
  FFI_DEFAULT_ABI = FFI_SYSV,
54
69
  #endif
55
70
 
71
+ #ifdef X86_WIN64
72
+ FFI_WIN64,
73
+ FFI_DEFAULT_ABI = FFI_WIN64,
74
+ #else
75
+
56
76
  /* ---- Intel x86 and AMD x86-64 - */
57
77
  #if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__))
58
78
  FFI_SYSV,
@@ -63,6 +83,7 @@ typedef enum ffi_abi {
63
83
  FFI_DEFAULT_ABI = FFI_UNIX64,
64
84
  #endif
65
85
  #endif
86
+ #endif /* X86_WIN64 */
66
87
 
67
88
  FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
68
89
  } ffi_abi;
@@ -73,6 +94,7 @@ typedef enum ffi_abi {
73
94
  #define FFI_CLOSURES 1
74
95
  #define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1)
75
96
  #define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2)
97
+ #define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3)
76
98
 
77
99
  #if defined (X86_64) || (defined (__x86_64__) && defined (X86_DARWIN))
78
100
  #define FFI_TRAMPOLINE_SIZE 24
@@ -81,10 +103,18 @@ typedef enum ffi_abi {
81
103
  #ifdef X86_WIN32
82
104
  #define FFI_TRAMPOLINE_SIZE 13
83
105
  #else
106
+ #ifdef X86_WIN64
107
+ #define FFI_TRAMPOLINE_SIZE 29
108
+ #define FFI_NATIVE_RAW_API 0
109
+ #define FFI_NO_RAW_API 1
110
+ #else
84
111
  #define FFI_TRAMPOLINE_SIZE 10
85
112
  #endif
113
+ #endif
114
+ #ifndef X86_WIN64
86
115
  #define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */
87
116
  #endif
117
+ #endif
88
118
 
89
119
  #endif
90
120
 
@@ -242,9 +242,20 @@ ffi_closure_SYSV:
242
242
 
243
243
  #if !FFI_NO_RAW_API
244
244
 
245
+ /* Precalculate for e.g. the Solaris 10/x86 assembler. */
246
+ #if FFI_TRAMPOLINE_SIZE == 10
247
+ #define RAW_CLOSURE_CIF_OFFSET 12
248
+ #define RAW_CLOSURE_FUN_OFFSET 16
249
+ #define RAW_CLOSURE_USER_DATA_OFFSET 20
250
+ #elif FFI_TRAMPOLINE_SIZE == 24
251
+ #define RAW_CLOSURE_CIF_OFFSET 24
252
+ #define RAW_CLOSURE_FUN_OFFSET 28
253
+ #define RAW_CLOSURE_USER_DATA_OFFSET 32
254
+ #else
245
255
  #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
246
256
  #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
247
257
  #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
258
+ #endif
248
259
  #define CIF_FLAGS_OFFSET 20
249
260
 
250
261
  .align 4
@@ -343,10 +354,12 @@ ffi_closure_raw_SYSV:
343
354
  .long .LEFDE1-.LASFDE1 /* FDE Length */
344
355
  .LASFDE1:
345
356
  .long .LASFDE1-.Lframe1 /* FDE CIE offset */
346
- #ifdef __PIC__
357
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
347
358
  .long .LFB1-. /* FDE initial location */
359
+ #elif defined __PIC__
360
+ .long .LFB1@rel
348
361
  #else
349
- .long .LFB1 /* FDE initial location */
362
+ .long .LFB1
350
363
  #endif
351
364
  .long .LFE1-.LFB1 /* FDE address range */
352
365
  #ifdef __PIC__
@@ -368,8 +381,10 @@ ffi_closure_raw_SYSV:
368
381
  .long .LEFDE2-.LASFDE2 /* FDE Length */
369
382
  .LASFDE2:
370
383
  .long .LASFDE2-.Lframe1 /* FDE CIE offset */
371
- #ifdef __PIC__
384
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
372
385
  .long .LFB2-. /* FDE initial location */
386
+ #elif defined __PIC__
387
+ .long .LFB2@rel
373
388
  #else
374
389
  .long .LFB2
375
390
  #endif
@@ -402,8 +417,10 @@ ffi_closure_raw_SYSV:
402
417
  .long .LEFDE3-.LASFDE3 /* FDE Length */
403
418
  .LASFDE3:
404
419
  .long .LASFDE3-.Lframe1 /* FDE CIE offset */
405
- #ifdef __PIC__
420
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
406
421
  .long .LFB3-. /* FDE initial location */
422
+ #elif defined __PIC__
423
+ .long .LFB3@rel
407
424
  #else
408
425
  .long .LFB3
409
426
  #endif
@@ -89,7 +89,6 @@ ffi_call_unix64:
89
89
  addq %r11, %r10
90
90
  jmp *%r10
91
91
 
92
- .section .rodata
93
92
  .Lstore_table:
94
93
  .long .Lst_void-.Lstore_table /* FFI_TYPE_VOID */
95
94
  .long .Lst_sint32-.Lstore_table /* FFI_TYPE_INT */
@@ -107,7 +106,6 @@ ffi_call_unix64:
107
106
  .long .Lst_struct-.Lstore_table /* FFI_TYPE_STRUCT */
108
107
  .long .Lst_int64-.Lstore_table /* FFI_TYPE_POINTER */
109
108
 
110
- .text
111
109
  .align 2
112
110
  .Lst_void:
113
111
  ret
@@ -240,7 +238,6 @@ ffi_closure_unix64:
240
238
  addq %r11, %r10
241
239
  jmp *%r10
242
240
 
243
- .section .rodata
244
241
  .Lload_table:
245
242
  .long .Lld_void-.Lload_table /* FFI_TYPE_VOID */
246
243
  .long .Lld_int32-.Lload_table /* FFI_TYPE_INT */
@@ -258,7 +255,6 @@ ffi_closure_unix64:
258
255
  .long .Lld_struct-.Lload_table /* FFI_TYPE_STRUCT */
259
256
  .long .Lld_int64-.Lload_table /* FFI_TYPE_POINTER */
260
257
 
261
- .text
262
258
  .align 2
263
259
  .Lld_void:
264
260
  ret
@@ -351,7 +347,11 @@ ffi_closure_unix64:
351
347
  .long .LEFDE1-.LASFDE1 /* FDE Length */
352
348
  .LASFDE1:
353
349
  .long .LASFDE1-.Lframe1 /* FDE CIE offset */
350
+ #if HAVE_AS_X86_PCREL
354
351
  .long .LUW0-. /* FDE initial location */
352
+ #else
353
+ .long .LUW0@rel
354
+ #endif
355
355
  .long .LUW4-.LUW0 /* FDE address range */
356
356
  .uleb128 0x0 /* Augmentation size */
357
357
 
@@ -389,7 +389,11 @@ ffi_closure_unix64:
389
389
  .long .LEFDE3-.LASFDE3 /* FDE Length */
390
390
  .LASFDE3:
391
391
  .long .LASFDE3-.Lframe1 /* FDE CIE offset */
392
+ #if HAVE_AS_X86_PCREL
392
393
  .long .LUW5-. /* FDE initial location */
394
+ #else
395
+ .long .LUW5@rel
396
+ #endif
393
397
  .long .LUW9-.LUW5 /* FDE address range */
394
398
  .uleb128 0x0 /* Augmentation size */
395
399