ffi 0.5.4 → 0.6.0

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 (203) hide show
  1. data/LICENSE +1 -27
  2. data/Rakefile +2 -11
  3. data/ext/ffi_c/AbstractMemory.c +6 -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 +23 -8
  7. data/ext/ffi_c/Call.c +28 -0
  8. data/ext/ffi_c/Call.h +5 -1
  9. data/ext/ffi_c/DynamicLibrary.c +0 -1
  10. data/ext/ffi_c/Function.c +19 -2
  11. data/ext/ffi_c/MemoryPointer.c +2 -3
  12. data/ext/ffi_c/Pointer.c +23 -9
  13. data/ext/ffi_c/Struct.c +142 -69
  14. data/ext/ffi_c/Struct.h +16 -7
  15. data/ext/ffi_c/StructLayout.c +92 -55
  16. data/ext/ffi_c/Type.c +5 -22
  17. data/ext/ffi_c/Type.h +1 -1
  18. data/ext/ffi_c/Types.c +8 -2
  19. data/ext/ffi_c/Types.h +2 -0
  20. data/ext/ffi_c/extconf.rb +11 -7
  21. data/ext/ffi_c/libffi/ChangeLog +900 -84
  22. data/ext/ffi_c/libffi/ChangeLog.libffi +311 -0
  23. data/ext/ffi_c/libffi/LICENSE +1 -1
  24. data/ext/ffi_c/libffi/Makefile.am +14 -4
  25. data/ext/ffi_c/libffi/Makefile.in +362 -211
  26. data/ext/ffi_c/libffi/README +70 -92
  27. data/ext/ffi_c/libffi/aclocal.m4 +6068 -4586
  28. data/ext/ffi_c/libffi/config.guess +125 -143
  29. data/ext/ffi_c/libffi/config.sub +103 -27
  30. data/ext/ffi_c/libffi/configure +11364 -18497
  31. data/ext/ffi_c/libffi/configure.ac +43 -4
  32. data/ext/ffi_c/libffi/doc/libffi.info +15 -15
  33. data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
  34. data/ext/ffi_c/libffi/doc/stamp-vti +4 -4
  35. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  36. data/ext/ffi_c/libffi/fficonfig.h.in +24 -3
  37. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  38. data/ext/ffi_c/libffi/include/Makefile.in +97 -50
  39. data/ext/ffi_c/libffi/include/ffi.h.in +8 -2
  40. data/ext/ffi_c/libffi/include/ffi_common.h +24 -0
  41. data/ext/ffi_c/libffi/libtool-version +1 -1
  42. data/ext/ffi_c/libffi/ltmain.sh +7346 -5870
  43. data/ext/ffi_c/libffi/m4/libtool.m4 +7360 -0
  44. data/ext/ffi_c/libffi/m4/ltoptions.m4 +368 -0
  45. data/ext/ffi_c/libffi/m4/ltsugar.m4 +123 -0
  46. data/ext/ffi_c/libffi/m4/ltversion.m4 +23 -0
  47. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +92 -0
  48. data/ext/ffi_c/libffi/man/Makefile.in +115 -62
  49. data/ext/ffi_c/libffi/man/ffi_call.3 +3 -3
  50. data/ext/ffi_c/libffi/missing +15 -8
  51. data/ext/ffi_c/libffi/src/arm/sysv.S +15 -8
  52. data/ext/ffi_c/libffi/src/avr32/ffi.c +421 -0
  53. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +50 -0
  54. data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
  55. data/ext/ffi_c/libffi/src/closures.c +47 -10
  56. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  57. data/ext/ffi_c/libffi/src/java_raw_api.c +0 -3
  58. data/ext/ffi_c/libffi/src/mips/ffi.c +135 -32
  59. data/ext/ffi_c/libffi/src/mips/ffitarget.h +37 -4
  60. data/ext/ffi_c/libffi/src/mips/n32.S +67 -10
  61. data/ext/ffi_c/libffi/src/mips/o32.S +8 -8
  62. data/ext/ffi_c/libffi/src/pa/ffi.c +7 -0
  63. data/ext/ffi_c/libffi/src/powerpc/aix.S +163 -64
  64. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +308 -112
  65. data/ext/ffi_c/libffi/src/powerpc/ffi.c +20 -7
  66. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +208 -80
  67. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +11 -3
  68. data/ext/ffi_c/libffi/src/powerpc/sysv.S +12 -23
  69. data/ext/ffi_c/libffi/src/s390/sysv.S +1 -1
  70. data/ext/ffi_c/libffi/src/sh/sysv.S +9 -9
  71. data/ext/ffi_c/libffi/src/sh64/ffi.c +37 -22
  72. data/ext/ffi_c/libffi/src/sh64/sysv.S +23 -14
  73. data/ext/ffi_c/libffi/src/sparc/ffi.c +21 -6
  74. data/ext/ffi_c/libffi/src/sparc/v8.S +55 -14
  75. data/ext/ffi_c/libffi/src/x86/darwin.S +10 -9
  76. data/ext/ffi_c/libffi/src/x86/ffi.c +293 -86
  77. data/ext/ffi_c/libffi/src/x86/ffi64.c +73 -19
  78. data/ext/ffi_c/libffi/src/x86/ffitarget.h +30 -0
  79. data/ext/ffi_c/libffi/src/x86/sysv.S +21 -4
  80. data/ext/ffi_c/libffi/src/x86/unix64.S +8 -4
  81. data/ext/ffi_c/libffi/src/x86/win32.S +633 -147
  82. data/ext/ffi_c/libffi/src/x86/win64.S +460 -0
  83. data/ext/ffi_c/libffi/testsuite/Makefile.am +63 -54
  84. data/ext/ffi_c/libffi/testsuite/Makefile.in +112 -77
  85. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +12 -1
  86. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -4
  87. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +7 -15
  88. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +7 -15
  89. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +7 -15
  90. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +7 -15
  91. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +7 -15
  92. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +7 -14
  93. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +7 -15
  94. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
  95. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +6 -14
  96. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -12
  97. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -12
  98. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -12
  99. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -12
  100. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -12
  101. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -12
  102. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -12
  103. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +4 -12
  104. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -12
  105. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -12
  106. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -12
  107. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -12
  108. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -12
  109. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -12
  110. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -12
  111. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -12
  112. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +4 -12
  113. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -12
  114. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -12
  115. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -12
  116. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -12
  117. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -12
  118. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -12
  119. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -12
  120. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -12
  121. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -12
  122. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -12
  123. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +134 -0
  124. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +117 -0
  125. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +11 -17
  126. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -12
  127. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -12
  128. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +7 -15
  129. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -12
  130. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -12
  131. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +7 -15
  132. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
  133. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +4 -12
  134. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +57 -0
  135. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +4 -13
  136. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
  137. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +57 -0
  138. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +4 -12
  139. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +4 -12
  140. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +4 -12
  141. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +4 -12
  142. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +4 -12
  143. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +4 -12
  144. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
  145. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +140 -0
  146. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +4 -12
  147. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +4 -12
  148. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +4 -12
  149. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +4 -12
  150. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +4 -12
  151. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +8 -16
  152. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +4 -12
  153. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +37 -0
  154. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +25 -0
  155. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +31 -0
  156. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +2 -1
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +342 -0
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +4 -12
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +4 -12
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +4 -12
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +4 -12
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +4 -12
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +4 -12
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +4 -12
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +4 -12
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +4 -12
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +4 -12
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +4 -12
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +4 -12
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +1 -1
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +124 -0
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +10 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +4 -5
  179. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +17 -16
  180. data/ext/ffi_c/libffi/texinfo.tex +155 -427
  181. data/lib/ffi/autopointer.rb +79 -20
  182. data/lib/ffi/callback.rb +4 -10
  183. data/lib/ffi/enum.rb +28 -0
  184. data/lib/ffi/io.rb +28 -0
  185. data/lib/ffi/library.rb +237 -182
  186. data/lib/ffi/memorypointer.rb +28 -62
  187. data/lib/ffi/platform.rb +27 -0
  188. data/lib/ffi/pointer.rb +28 -0
  189. data/lib/ffi/struct.rb +55 -1
  190. data/lib/ffi/types.rb +29 -0
  191. data/lib/ffi/variadic.rb +29 -0
  192. data/spec/ffi/library_spec.rb +31 -5
  193. data/spec/ffi/rbx/attach_function_spec.rb +2 -1
  194. data/spec/ffi/rbx/memory_pointer_spec.rb +2 -1
  195. data/spec/ffi/spec_helper.rb +5 -1
  196. data/spec/ffi/struct_spec.rb +64 -0
  197. metadata +28 -8
  198. data/ext/ffi_c/libffi/TODO +0 -1
  199. data/ext/ffi_c/libffi/ltcf-c.sh +0 -861
  200. data/ext/ffi_c/libffi/ltcf-cxx.sh +0 -1069
  201. data/ext/ffi_c/libffi/ltcf-gcj.sh +0 -700
  202. data/ext/ffi_c/libffi/ltconfig +0 -2862
  203. data/ext/ffi_c/libffi/mkinstalldirs +0 -158
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2003, 2005, 2008 Free Software Foundation, Inc.
1
+ # Copyright (C) 2003, 2005, 2008, 2009 Free Software Foundation, Inc.
2
2
 
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
@@ -181,6 +181,13 @@ proc libffi_target_compile { source dest type options } {
181
181
  lappend options "additional_flags=-I${libffi_include} -I${srcdir}/../include -I${libffi_include}/.."
182
182
  lappend options "additional_flags=${libffi_link_flags}"
183
183
 
184
+ # Darwin needs a stack execution allowed flag.
185
+
186
+ if { [istarget "*-*-darwin9*"] || [istarget "*-*-darwin1*"]
187
+ || [istarget "*-*-darwin2*"] } {
188
+ lappend options "additional_flags=-Wl,-allow_stack_execute"
189
+ }
190
+
184
191
  # If you're building the compiler with --prefix set to a place
185
192
  # where it's not yet installed, then the linker won't be able to
186
193
  # find the libgcc used by libffi.dylib. We could pass the
@@ -190,6 +197,10 @@ proc libffi_target_compile { source dest type options } {
190
197
  lappend options "libs= -shared-libgcc"
191
198
  }
192
199
 
200
+ if { [string match "*-*-openbsd*" $target_triplet] } {
201
+ lappend options "libs= -lpthread"
202
+ }
203
+
193
204
  lappend options "libs= -lffi"
194
205
 
195
206
  verbose "options: $options"
@@ -1,8 +1,8 @@
1
- # Copyright (C) 2003, 2006 Free Software Foundation, Inc.
1
+ # Copyright (C) 2003, 2006, 2009 Free Software Foundation, Inc.
2
2
 
3
3
  # This program is free software; you can redistribute it and/or modify
4
4
  # it under the terms of the GNU General Public License as published by
5
- # the Free Software Foundation; either version 2 of the License, or
5
+ # the Free Software Foundation; either version 3 of the License, or
6
6
  # (at your option) any later version.
7
7
  #
8
8
  # This program is distributed in the hope that it will be useful,
@@ -11,8 +11,8 @@
11
11
  # GNU General Public License for more details.
12
12
  #
13
13
  # You should have received a copy of the GNU General Public License
14
- # along with this program; if not, write to the Free Software
15
- # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
14
+ # along with this program; see the file COPYING3. If not see
15
+ # <http://www.gnu.org/licenses/>.
16
16
 
17
17
  # libffi testsuite that uses the 'dg.exp' driver.
18
18
 
@@ -25,7 +25,7 @@ closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
25
25
  (int)(*(double *)args[8]) + (int)*(int *)args[9] +
26
26
  (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
27
27
  (int)*(int *)args[12] + (int)(*(int *)args[13]) +
28
- (int)(*(int *)args[14]) + *(int *)args[15] + (int)(long)userdata;
28
+ (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata;
29
29
 
30
30
  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
31
31
  (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]),
@@ -37,7 +37,7 @@ closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
37
37
  (int)(*(int *)args[10]), (int)(*(float *)args[11]),
38
38
  (int)*(int *)args[12], (int)(*(int *)args[13]),
39
39
  (int)(*(int *)args[14]),*(int *)args[15],
40
- (int)(long)userdata, (int)*(ffi_arg *)resp);
40
+ (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
41
41
 
42
42
  }
43
43
 
@@ -49,19 +49,11 @@ typedef int (*closure_test_type0)(unsigned long long, int, unsigned long long,
49
49
  int main (void)
50
50
  {
51
51
  ffi_cif cif;
52
- #ifndef USING_MMAP
53
- static ffi_closure cl;
54
- #endif
55
- ffi_closure *pcl;
52
+ void * code;
53
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
56
54
  ffi_type * cl_arg_types[17];
57
55
  int res;
58
56
 
59
- #ifdef USING_MMAP
60
- pcl = allocate_mmap (sizeof(ffi_closure));
61
- #else
62
- pcl = &cl;
63
- #endif
64
-
65
57
  cl_arg_types[0] = &ffi_type_uint64;
66
58
  cl_arg_types[1] = &ffi_type_sint;
67
59
  cl_arg_types[2] = &ffi_type_uint64;
@@ -84,10 +76,10 @@ int main (void)
84
76
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
85
77
  &ffi_type_sint, cl_arg_types) == FFI_OK);
86
78
 
87
- CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn0,
88
- (void *) 3 /* userdata */) == FFI_OK);
79
+ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0,
80
+ (void *) 3 /* userdata */, code) == FFI_OK);
89
81
 
90
- res = (*((closure_test_type0)pcl))
82
+ res = (*((closure_test_type0)code))
91
83
  (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13,
92
84
  19, 21, 1);
93
85
  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
@@ -21,7 +21,7 @@ static void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, void** args,
21
21
  (int)(*(double*)args[8]) + (int)*(int *)args[9] +
22
22
  (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
23
23
  (int)*(int *)args[12] + (int)(*(int *)args[13]) +
24
- (int)(*(int *)args[14]) + *(int *)args[15] + (int)(long)userdata;
24
+ (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata;
25
25
 
26
26
  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
27
27
  (int)*(float *)args[0], (int)(*(float *)args[1]),
@@ -32,7 +32,7 @@ static void closure_test_fn1(ffi_cif* cif __UNUSED__, void* resp, void** args,
32
32
  (int)(*(int *)args[10]), (int)(*(float *)args[11]),
33
33
  (int)*(int *)args[12], (int)(*(int *)args[13]),
34
34
  (int)(*(int *)args[14]), *(int *)args[15],
35
- (int)(long)userdata, (int)*(ffi_arg *)resp);
35
+ (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
36
36
  }
37
37
 
38
38
  typedef int (*closure_test_type1)(float, float, float, float, signed short,
@@ -41,19 +41,11 @@ typedef int (*closure_test_type1)(float, float, float, float, signed short,
41
41
  int main (void)
42
42
  {
43
43
  ffi_cif cif;
44
- #ifndef USING_MMAP
45
- static ffi_closure cl;
46
- #endif
47
- ffi_closure *pcl;
44
+ void *code;
45
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
48
46
  ffi_type * cl_arg_types[17];
49
47
  int res;
50
48
 
51
- #ifdef USING_MMAP
52
- pcl = allocate_mmap (sizeof(ffi_closure));
53
- #else
54
- pcl = &cl;
55
- #endif
56
-
57
49
  cl_arg_types[0] = &ffi_type_float;
58
50
  cl_arg_types[1] = &ffi_type_float;
59
51
  cl_arg_types[2] = &ffi_type_float;
@@ -76,10 +68,10 @@ int main (void)
76
68
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
77
69
  &ffi_type_sint, cl_arg_types) == FFI_OK);
78
70
 
79
- CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn1,
80
- (void *) 3 /* userdata */) == FFI_OK);
71
+ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn1,
72
+ (void *) 3 /* userdata */, code) == FFI_OK);
81
73
 
82
- res = (*((closure_test_type1)pcl))
74
+ res = (*((closure_test_type1)code))
83
75
  (1.1, 2.2, 3.3, 4.4, 127, 5.5, 6.6, 8, 9, 10, 11, 12.0, 13,
84
76
  19, 21, 1);
85
77
  /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */
@@ -20,7 +20,7 @@ static void closure_test_fn2(ffi_cif* cif __UNUSED__, void* resp, void** args,
20
20
  (int)(*(double *)args[8]) + (int)*(int *)args[9] +
21
21
  (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
22
22
  (int)*(int *)args[12] + (int)(*(float *)args[13]) +
23
- (int)(*(int *)args[14]) + *(int *)args[15] + (int)(long)userdata;
23
+ (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata;
24
24
 
25
25
  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
26
26
  (int)*(double *)args[0], (int)(*(double *)args[1]),
@@ -30,7 +30,7 @@ static void closure_test_fn2(ffi_cif* cif __UNUSED__, void* resp, void** args,
30
30
  (int)(*(double*)args[8]), (int)*(int *)args[9],
31
31
  (int)(*(int *)args[10]), (int)(*(float *)args[11]),
32
32
  (int)*(int *)args[12], (int)(*(float *)args[13]),
33
- (int)(*(int *)args[14]), *(int *)args[15], (int)(long)userdata,
33
+ (int)(*(int *)args[14]), *(int *)args[15], (int)(intptr_t)userdata,
34
34
  (int)*(ffi_arg *)resp);
35
35
  }
36
36
 
@@ -41,19 +41,11 @@ typedef int (*closure_test_type2)(double, double, double, double, signed short,
41
41
  int main (void)
42
42
  {
43
43
  ffi_cif cif;
44
- #ifndef USING_MMAP
45
- static ffi_closure cl;
46
- #endif
47
- ffi_closure *pcl;
44
+ void *code;
45
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
48
46
  ffi_type * cl_arg_types[17];
49
47
  int res;
50
48
 
51
- #ifdef USING_MMAP
52
- pcl = allocate_mmap (sizeof(ffi_closure));
53
- #else
54
- pcl = &cl;
55
- #endif
56
-
57
49
  cl_arg_types[0] = &ffi_type_double;
58
50
  cl_arg_types[1] = &ffi_type_double;
59
51
  cl_arg_types[2] = &ffi_type_double;
@@ -76,10 +68,10 @@ int main (void)
76
68
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
77
69
  &ffi_type_sint, cl_arg_types) == FFI_OK);
78
70
 
79
- CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn2,
80
- (void *) 3 /* userdata */) == FFI_OK);
71
+ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn2,
72
+ (void *) 3 /* userdata */, code) == FFI_OK);
81
73
 
82
- res = (*((closure_test_type2)pcl))
74
+ res = (*((closure_test_type2)code))
83
75
  (1, 2, 3, 4, 127, 5, 6, 8, 9, 10, 11, 12.0, 13,
84
76
  19.0, 21, 1);
85
77
  /* { dg-output "1 2 3 4 127 5 6 8 9 10 11 12 13 19 21 1 3: 255" } */
@@ -20,7 +20,7 @@ static void closure_test_fn3(ffi_cif* cif __UNUSED__, void* resp, void** args,
20
20
  (int)(*(double *)args[8]) + (int)*(int *)args[9] +
21
21
  (int)(*(float *)args[10]) + (int)(*(float *)args[11]) +
22
22
  (int)*(int *)args[12] + (int)(*(float *)args[13]) +
23
- (int)(*(float *)args[14]) + *(int *)args[15] + (int)(long)userdata;
23
+ (int)(*(float *)args[14]) + *(int *)args[15] + (intptr_t)userdata;
24
24
 
25
25
  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
26
26
  (int)*(float *)args[0], (int)(*(float *)args[1]),
@@ -30,7 +30,7 @@ static void closure_test_fn3(ffi_cif* cif __UNUSED__, void* resp, void** args,
30
30
  (int)(*(double *)args[8]), (int)*(int *)args[9],
31
31
  (int)(*(float *)args[10]), (int)(*(float *)args[11]),
32
32
  (int)*(int *)args[12], (int)(*(float *)args[13]),
33
- (int)(*(float *)args[14]), *(int *)args[15], (int)(long)userdata,
33
+ (int)(*(float *)args[14]), *(int *)args[15], (int)(intptr_t)userdata,
34
34
  (int)*(ffi_arg *)resp);
35
35
 
36
36
  }
@@ -42,19 +42,11 @@ typedef int (*closure_test_type3)(float, float, float, float, float, float,
42
42
  int main (void)
43
43
  {
44
44
  ffi_cif cif;
45
- #ifndef USING_MMAP
46
- static ffi_closure cl;
47
- #endif
48
- ffi_closure *pcl;
45
+ void *code;
46
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
49
47
  ffi_type * cl_arg_types[17];
50
48
  int res;
51
49
 
52
- #ifdef USING_MMAP
53
- pcl = allocate_mmap (sizeof(ffi_closure));
54
- #else
55
- pcl = &cl;
56
- #endif
57
-
58
50
  cl_arg_types[0] = &ffi_type_float;
59
51
  cl_arg_types[1] = &ffi_type_float;
60
52
  cl_arg_types[2] = &ffi_type_float;
@@ -77,10 +69,10 @@ int main (void)
77
69
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
78
70
  &ffi_type_sint, cl_arg_types) == FFI_OK);
79
71
 
80
- CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn3,
81
- (void *) 3 /* userdata */) == FFI_OK);
72
+ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn3,
73
+ (void *) 3 /* userdata */, code) == FFI_OK);
82
74
 
83
- res = (*((closure_test_type3)pcl))
75
+ res = (*((closure_test_type3)code))
84
76
  (1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9, 10, 11.11, 12.0, 13,
85
77
  19.19, 21.21, 1);
86
78
  /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 19 21 1 3: 135" } */
@@ -25,7 +25,7 @@ closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
25
25
  (int)*(unsigned long long *)args[12] +
26
26
  (int)*(unsigned long long *)args[13] +
27
27
  (int)*(unsigned long long *)args[14] +
28
- *(int *)args[15] + (int)(long)userdata;
28
+ *(int *)args[15] + (intptr_t)userdata;
29
29
 
30
30
  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
31
31
  (int)*(unsigned long long *)args[0],
@@ -44,7 +44,7 @@ closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
44
44
  (int)*(unsigned long long *)args[13],
45
45
  (int)*(unsigned long long *)args[14],
46
46
  *(int *)args[15],
47
- (int)(long)userdata, (int)*(ffi_arg *)resp);
47
+ (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
48
48
 
49
49
  }
50
50
 
@@ -60,19 +60,11 @@ typedef int (*closure_test_type0)(unsigned long long, unsigned long long,
60
60
  int main (void)
61
61
  {
62
62
  ffi_cif cif;
63
- #ifndef USING_MMAP
64
- static ffi_closure cl;
65
- #endif
66
- ffi_closure *pcl;
63
+ void *code;
64
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
67
65
  ffi_type * cl_arg_types[17];
68
66
  int i, res;
69
67
 
70
- #ifdef USING_MMAP
71
- pcl = allocate_mmap (sizeof(ffi_closure));
72
- #else
73
- pcl = &cl;
74
- #endif
75
-
76
68
  for (i = 0; i < 15; i++) {
77
69
  cl_arg_types[i] = &ffi_type_uint64;
78
70
  }
@@ -83,10 +75,10 @@ int main (void)
83
75
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
84
76
  &ffi_type_sint, cl_arg_types) == FFI_OK);
85
77
 
86
- CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn0,
87
- (void *) 3 /* userdata */) == FFI_OK);
78
+ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0,
79
+ (void *) 3 /* userdata */, code) == FFI_OK);
88
80
 
89
- res = (*((closure_test_type0)pcl))
81
+ res = (*((closure_test_type0)code))
90
82
  (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11LL, 12LL,
91
83
  13LL, 19LL, 21LL, 1);
92
84
  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
@@ -24,7 +24,7 @@ closure_test_fn5(ffi_cif* cif __UNUSED__, void* resp, void** args,
24
24
  (int)*(unsigned long long *)args[12] +
25
25
  (int)*(unsigned long long *)args[13] +
26
26
  (int)*(unsigned long long *)args[14] +
27
- *(int *)args[15] + (int)(long)userdata;
27
+ *(int *)args[15] + (intptr_t)userdata;
28
28
 
29
29
  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
30
30
  (int)*(unsigned long long *)args[0],
@@ -43,7 +43,7 @@ closure_test_fn5(ffi_cif* cif __UNUSED__, void* resp, void** args,
43
43
  (int)*(unsigned long long *)args[13],
44
44
  (int)*(unsigned long long *)args[14],
45
45
  *(int *)args[15],
46
- (int)(long)userdata, (int)*(ffi_arg *)resp);
46
+ (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
47
47
 
48
48
  }
49
49
 
@@ -59,17 +59,10 @@ typedef int (*closure_test_type0)(unsigned long long, unsigned long long,
59
59
  int main (void)
60
60
  {
61
61
  ffi_cif cif;
62
- #ifndef USING_MMAP
63
- static ffi_closure cl;
64
- #endif
65
- ffi_closure *pcl;
62
+ void *code;
63
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
66
64
  ffi_type * cl_arg_types[17];
67
65
  int i, res;
68
- #ifdef USING_MMAP
69
- pcl = allocate_mmap (sizeof(ffi_closure));
70
- #else
71
- pcl = &cl;
72
- #endif
73
66
 
74
67
  for (i = 0; i < 10; i++) {
75
68
  cl_arg_types[i] = &ffi_type_uint64;
@@ -85,10 +78,10 @@ int main (void)
85
78
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
86
79
  &ffi_type_sint, cl_arg_types) == FFI_OK);
87
80
 
88
- CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn5,
89
- (void *) 3 /* userdata */) == FFI_OK);
81
+ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn5,
82
+ (void *) 3 /* userdata */, code) == FFI_OK);
90
83
 
91
- res = (*((closure_test_type0)pcl))
84
+ res = (*((closure_test_type0)code))
92
85
  (1LL, 2LL, 3LL, 4LL, 127LL, 429LL, 7LL, 8LL, 9LL, 10LL, 11, 12LL,
93
86
  13LL, 19LL, 21LL, 1);
94
87
  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
@@ -23,7 +23,7 @@ closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
23
23
  (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
24
24
  (int)*(int *)args[12] + (int)(*(int *)args[13]) +
25
25
  (int)(*(double *)args[14]) + (int)*(double *)args[15] +
26
- (int)(long)userdata;
26
+ (intptr_t)userdata;
27
27
 
28
28
  printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
29
29
  (int)*(unsigned long long *)args[0],
@@ -36,7 +36,7 @@ closure_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
36
36
  (int)(*(int *)args[10]), (int)(*(float *)args[11]),
37
37
  (int)*(int *)args[12], (int)(*(int *)args[13]),
38
38
  (int)(*(double *)args[14]), (int)(*(double *)args[15]),
39
- (int)(long)userdata, (int)*(ffi_arg *)resp);
39
+ (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
40
40
 
41
41
  }
42
42
 
@@ -50,19 +50,11 @@ typedef int (*closure_test_type0)(unsigned long long,
50
50
  int main (void)
51
51
  {
52
52
  ffi_cif cif;
53
- #ifndef USING_MMAP
54
- static ffi_closure cl;
55
- #endif
56
- ffi_closure *pcl;
53
+ void *code;
54
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
57
55
  ffi_type * cl_arg_types[17];
58
56
  int res;
59
57
 
60
- #ifdef USING_MMAP
61
- pcl = allocate_mmap (sizeof(ffi_closure));
62
- #else
63
- pcl = &cl;
64
- #endif
65
-
66
58
  cl_arg_types[0] = &ffi_type_uint64;
67
59
  cl_arg_types[1] = &ffi_type_uint64;
68
60
  cl_arg_types[2] = &ffi_type_uint64;
@@ -85,10 +77,10 @@ int main (void)
85
77
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
86
78
  &ffi_type_sint, cl_arg_types) == FFI_OK);
87
79
 
88
- CHECK(ffi_prep_closure(pcl, &cif, closure_test_fn0,
89
- (void *) 3 /* userdata */) == FFI_OK);
80
+ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_fn0,
81
+ (void *) 3 /* userdata */, code) == FFI_OK);
90
82
 
91
- res = (*((closure_test_type0)pcl))
83
+ res = (*((closure_test_type0)code))
92
84
  (1, 2, 3, 4, 127, 429., 7., 8., 9.5, 10., 11, 12., 13,
93
85
  19, 21., 1.);
94
86
  /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
@@ -0,0 +1,95 @@
1
+ /* Area: closure_call
2
+ Purpose: Check multiple values passing from different type.
3
+ Also, exceed the limit of gpr and fpr registers on PowerPC
4
+ Darwin.
5
+ Limitations: none.
6
+ PR: none.
7
+ Originator: <andreast@gcc.gnu.org> 20030828 */
8
+
9
+
10
+
11
+
12
+ /* { dg-do run } */
13
+ #include "ffitest.h"
14
+
15
+ static void
16
+ closure_loc_test_fn0(ffi_cif* cif __UNUSED__, void* resp, void** args,
17
+ void* userdata)
18
+ {
19
+ *(ffi_arg*)resp =
20
+ (int)*(unsigned long long *)args[0] + (int)(*(int *)args[1]) +
21
+ (int)(*(unsigned long long *)args[2]) + (int)*(int *)args[3] +
22
+ (int)(*(signed short *)args[4]) +
23
+ (int)(*(unsigned long long *)args[5]) +
24
+ (int)*(int *)args[6] + (int)(*(int *)args[7]) +
25
+ (int)(*(double *)args[8]) + (int)*(int *)args[9] +
26
+ (int)(*(int *)args[10]) + (int)(*(float *)args[11]) +
27
+ (int)*(int *)args[12] + (int)(*(int *)args[13]) +
28
+ (int)(*(int *)args[14]) + *(int *)args[15] + (intptr_t)userdata;
29
+
30
+ printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d: %d\n",
31
+ (int)*(unsigned long long *)args[0], (int)(*(int *)args[1]),
32
+ (int)(*(unsigned long long *)args[2]),
33
+ (int)*(int *)args[3], (int)(*(signed short *)args[4]),
34
+ (int)(*(unsigned long long *)args[5]),
35
+ (int)*(int *)args[6], (int)(*(int *)args[7]),
36
+ (int)(*(double *)args[8]), (int)*(int *)args[9],
37
+ (int)(*(int *)args[10]), (int)(*(float *)args[11]),
38
+ (int)*(int *)args[12], (int)(*(int *)args[13]),
39
+ (int)(*(int *)args[14]),*(int *)args[15],
40
+ (int)(intptr_t)userdata, (int)*(ffi_arg *)resp);
41
+
42
+ }
43
+
44
+ typedef int (*closure_loc_test_type0)(unsigned long long, int, unsigned long long,
45
+ int, signed short, unsigned long long, int,
46
+ int, double, int, int, float, int, int,
47
+ int, int);
48
+
49
+ int main (void)
50
+ {
51
+ ffi_cif cif;
52
+ ffi_closure *pcl;
53
+ ffi_type * cl_arg_types[17];
54
+ int res;
55
+ void *codeloc;
56
+
57
+ cl_arg_types[0] = &ffi_type_uint64;
58
+ cl_arg_types[1] = &ffi_type_sint;
59
+ cl_arg_types[2] = &ffi_type_uint64;
60
+ cl_arg_types[3] = &ffi_type_sint;
61
+ cl_arg_types[4] = &ffi_type_sshort;
62
+ cl_arg_types[5] = &ffi_type_uint64;
63
+ cl_arg_types[6] = &ffi_type_sint;
64
+ cl_arg_types[7] = &ffi_type_sint;
65
+ cl_arg_types[8] = &ffi_type_double;
66
+ cl_arg_types[9] = &ffi_type_sint;
67
+ cl_arg_types[10] = &ffi_type_sint;
68
+ cl_arg_types[11] = &ffi_type_float;
69
+ cl_arg_types[12] = &ffi_type_sint;
70
+ cl_arg_types[13] = &ffi_type_sint;
71
+ cl_arg_types[14] = &ffi_type_sint;
72
+ cl_arg_types[15] = &ffi_type_sint;
73
+ cl_arg_types[16] = NULL;
74
+
75
+ /* Initialize the cif */
76
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 16,
77
+ &ffi_type_sint, cl_arg_types) == FFI_OK);
78
+
79
+ pcl = ffi_closure_alloc(sizeof(ffi_closure), &codeloc);
80
+ CHECK(pcl != NULL);
81
+ CHECK(codeloc != NULL);
82
+
83
+ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_loc_test_fn0,
84
+ (void *) 3 /* userdata */, codeloc) == FFI_OK);
85
+
86
+ CHECK(memcmp(pcl, codeloc, sizeof(*pcl)) == 0);
87
+
88
+ res = (*((closure_loc_test_type0)codeloc))
89
+ (1LL, 2, 3LL, 4, 127, 429LL, 7, 8, 9.5, 10, 11, 12, 13,
90
+ 19, 21, 1);
91
+ /* { dg-output "1 2 3 4 127 429 7 8 9 10 11 12 13 19 21 1 3: 680" } */
92
+ printf("res: %d\n",res);
93
+ /* { dg-output "\nres: 680" } */
94
+ exit(0);
95
+ }