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
@@ -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
+ }
@@ -14,7 +14,7 @@ closure_test_stdcall(ffi_cif* cif __UNUSED__, void* resp, void** args,
14
14
  *(ffi_arg*)resp =
15
15
  (int)*(int *)args[0] + (int)(*(int *)args[1])
16
16
  + (int)(*(int *)args[2]) + (int)(*(int *)args[3])
17
- + (int)(long)userdata;
17
+ + (int)(intptr_t)userdata;
18
18
 
19
19
  printf("%d %d %d %d: %d\n",
20
20
  (int)*(int *)args[0], (int)(*(int *)args[1]),
@@ -28,22 +28,14 @@ typedef int (__stdcall *closure_test_type0)(int, int, int, int);
28
28
  int main (void)
29
29
  {
30
30
  ffi_cif cif;
31
- #ifndef USING_MMAP
32
- static ffi_closure cl;
33
- #endif
34
- ffi_closure *pcl;
31
+ void *code;
32
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
35
33
  ffi_type * cl_arg_types[17];
36
34
  int res;
37
35
  void* sp_pre;
38
36
  void* sp_post;
39
37
  char buf[1024];
40
38
 
41
- #ifdef USING_MMAP
42
- pcl = allocate_mmap (sizeof(ffi_closure));
43
- #else
44
- pcl = &cl;
45
- #endif
46
-
47
39
  cl_arg_types[0] = &ffi_type_uint;
48
40
  cl_arg_types[1] = &ffi_type_uint;
49
41
  cl_arg_types[2] = &ffi_type_uint;
@@ -54,11 +46,11 @@ int main (void)
54
46
  CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 4,
55
47
  &ffi_type_sint, cl_arg_types) == FFI_OK);
56
48
 
57
- CHECK(ffi_prep_closure(pcl, &cif, closure_test_stdcall,
58
- (void *) 3 /* userdata */) == FFI_OK);
49
+ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_stdcall,
50
+ (void *) 3 /* userdata */, code) == FFI_OK);
59
51
 
60
52
  asm volatile (" movl %%esp,%0" : "=g" (sp_pre));
61
- res = (*(closure_test_type0)pcl)(0, 1, 2, 3);
53
+ res = (*(closure_test_type0)code)(0, 1, 2, 3);
62
54
  asm volatile (" movl %%esp,%0" : "=g" (sp_post));
63
55
  /* { dg-output "0 1 2 3: 9" } */
64
56
 
@@ -42,21 +42,13 @@ static void cls_struct_12byte_gn(ffi_cif* cif __UNUSED__, void* resp,
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
  void* args_dbl[5];
50
48
  ffi_type* cls_struct_fields[4];
51
49
  ffi_type cls_struct_type;
52
50
  ffi_type* dbl_arg_types[5];
53
51
 
54
- #ifdef USING_MMAP
55
- pcl = allocate_mmap (sizeof(ffi_closure));
56
- #else
57
- pcl = &cl;
58
- #endif
59
-
60
52
  cls_struct_type.size = 0;
61
53
  cls_struct_type.alignment = 0;
62
54
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -87,13 +79,13 @@ int main (void)
87
79
  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
88
80
  /* { dg-output "\nres: 8 9 12" } */
89
81
 
90
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_12byte_gn, NULL) == FFI_OK);
82
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_12byte_gn, NULL, code) == FFI_OK);
91
83
 
92
84
  res_dbl.a = 0;
93
85
  res_dbl.b = 0;
94
86
  res_dbl.c = 0;
95
87
 
96
- res_dbl = ((cls_struct_12byte(*)(cls_struct_12byte, cls_struct_12byte))(pcl))(h_dbl, j_dbl);
88
+ res_dbl = ((cls_struct_12byte(*)(cls_struct_12byte, cls_struct_12byte))(code))(h_dbl, j_dbl);
97
89
  /* { dg-output "\n7 4 9 1 5 3: 8 9 12" } */
98
90
  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
99
91
  /* { dg-output "\nres: 8 9 12" } */
@@ -43,21 +43,13 @@ static void cls_struct_16byte_gn(ffi_cif* cif __UNUSED__, void* resp,
43
43
  int main (void)
44
44
  {
45
45
  ffi_cif cif;
46
- #ifndef USING_MMAP
47
- static ffi_closure cl;
48
- #endif
49
- ffi_closure *pcl;
46
+ void *code;
47
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
50
48
  void* args_dbl[5];
51
49
  ffi_type* cls_struct_fields[4];
52
50
  ffi_type cls_struct_type;
53
51
  ffi_type* dbl_arg_types[5];
54
52
 
55
- #ifdef USING_MMAP
56
- pcl = allocate_mmap (sizeof(ffi_closure));
57
- #else
58
- pcl = &cl;
59
- #endif
60
-
61
53
  cls_struct_type.size = 0;
62
54
  cls_struct_type.alignment = 0;
63
55
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -92,9 +84,9 @@ int main (void)
92
84
  res_dbl.b = 0.0;
93
85
  res_dbl.c = 0;
94
86
 
95
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_16byte_gn, NULL) == FFI_OK);
87
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_16byte_gn, NULL, code) == FFI_OK);
96
88
 
97
- res_dbl = ((cls_struct_16byte(*)(cls_struct_16byte, cls_struct_16byte))(pcl))(h_dbl, j_dbl);
89
+ res_dbl = ((cls_struct_16byte(*)(cls_struct_16byte, cls_struct_16byte))(code))(h_dbl, j_dbl);
98
90
  /* { dg-output "\n7 8 9 1 9 3: 8 17 12" } */
99
91
  printf("res: %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
100
92
  /* { dg-output "\nres: 8 17 12" } */
@@ -47,21 +47,13 @@ cls_struct_18byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
47
47
  int main (void)
48
48
  {
49
49
  ffi_cif cif;
50
- #ifndef USING_MMAP
51
- static ffi_closure cl;
52
- #endif
53
- ffi_closure *pcl;
50
+ void *code;
51
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
54
52
  void* args_dbl[3];
55
53
  ffi_type* cls_struct_fields[5];
56
54
  ffi_type cls_struct_type;
57
55
  ffi_type* dbl_arg_types[3];
58
56
 
59
- #ifdef USING_MMAP
60
- pcl = allocate_mmap (sizeof(ffi_closure));
61
- #else
62
- pcl = &cl;
63
- #endif
64
-
65
57
  cls_struct_type.size = 0;
66
58
  cls_struct_type.alignment = 0;
67
59
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -93,9 +85,9 @@ int main (void)
93
85
  printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
94
86
  /* { dg-output "\nres: 5 252 250 8" } */
95
87
 
96
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_18byte_gn, NULL) == FFI_OK);
88
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_18byte_gn, NULL, code) == FFI_OK);
97
89
 
98
- res_dbl = ((cls_struct_18byte(*)(cls_struct_18byte, cls_struct_18byte))(pcl))(g_dbl, f_dbl);
90
+ res_dbl = ((cls_struct_18byte(*)(cls_struct_18byte, cls_struct_18byte))(code))(g_dbl, f_dbl);
99
91
  /* { dg-output "\n1 127 126 3 4 125 124 5: 5 252 250 8" } */
100
92
  printf("res: %g %d %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
101
93
  /* { dg-output "\nres: 5 252 250 8" } */
@@ -50,21 +50,13 @@ cls_struct_19byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
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
  void* args_dbl[3];
58
56
  ffi_type* cls_struct_fields[6];
59
57
  ffi_type cls_struct_type;
60
58
  ffi_type* dbl_arg_types[3];
61
59
 
62
- #ifdef USING_MMAP
63
- pcl = allocate_mmap (sizeof(ffi_closure));
64
- #else
65
- pcl = &cl;
66
- #endif
67
-
68
60
  cls_struct_type.size = 0;
69
61
  cls_struct_type.alignment = 0;
70
62
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -98,9 +90,9 @@ int main (void)
98
90
  res_dbl.d, res_dbl.e);
99
91
  /* { dg-output "\nres: 5 252 250 8 239" } */
100
92
 
101
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_19byte_gn, NULL) == FFI_OK);
93
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_19byte_gn, NULL, code) == FFI_OK);
102
94
 
103
- res_dbl = ((cls_struct_19byte(*)(cls_struct_19byte, cls_struct_19byte))(pcl))(g_dbl, f_dbl);
95
+ res_dbl = ((cls_struct_19byte(*)(cls_struct_19byte, cls_struct_19byte))(code))(g_dbl, f_dbl);
104
96
  /* { dg-output "\n1 127 126 3 120 4 125 124 5 119: 5 252 250 8 239" } */
105
97
  printf("res: %g %d %d %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c,
106
98
  res_dbl.d, res_dbl.e);
@@ -43,21 +43,13 @@ cls_struct_1_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
43
43
  int main (void)
44
44
  {
45
45
  ffi_cif cif;
46
- #ifndef USING_MMAP
47
- static ffi_closure cl;
48
- #endif
49
- ffi_closure *pcl;
46
+ void *code;
47
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
50
48
  void* args_dbl[5];
51
49
  ffi_type* cls_struct_fields[2];
52
50
  ffi_type cls_struct_type;
53
51
  ffi_type* dbl_arg_types[5];
54
52
 
55
- #ifdef USING_MMAP
56
- pcl = allocate_mmap (sizeof(ffi_closure));
57
- #else
58
- pcl = &cl;
59
- #endif
60
-
61
53
  cls_struct_type.size = 0;
62
54
  cls_struct_type.alignment = 0;
63
55
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -86,9 +78,9 @@ int main (void)
86
78
  printf("res: %d\n", res_dbl.a);
87
79
  /* { dg-output "\nres: 190" } */
88
80
 
89
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_1_1byte_gn, NULL) == FFI_OK);
81
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_1_1byte_gn, NULL, code) == FFI_OK);
90
82
 
91
- res_dbl = ((cls_struct_1_1byte(*)(cls_struct_1_1byte, cls_struct_1_1byte))(pcl))(g_dbl, f_dbl);
83
+ res_dbl = ((cls_struct_1_1byte(*)(cls_struct_1_1byte, cls_struct_1_1byte))(code))(g_dbl, f_dbl);
92
84
  /* { dg-output "\n12 178: 190" } */
93
85
  printf("res: %d\n", res_dbl.a);
94
86
  /* { dg-output "\nres: 190" } */
@@ -43,21 +43,13 @@ cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
43
43
  int main (void)
44
44
  {
45
45
  ffi_cif cif;
46
- #ifndef USING_MMAP
47
- static ffi_closure cl;
48
- #endif
49
- ffi_closure *pcl;
46
+ void *code;
47
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
50
48
  void* args_dbl[5];
51
49
  ffi_type* cls_struct_fields[4];
52
50
  ffi_type cls_struct_type;
53
51
  ffi_type* dbl_arg_types[5];
54
52
 
55
- #ifdef USING_MMAP
56
- pcl = allocate_mmap (sizeof(ffi_closure));
57
- #else
58
- pcl = &cl;
59
- #endif
60
-
61
53
  cls_struct_type.size = 0;
62
54
  cls_struct_type.alignment = 0;
63
55
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -88,9 +80,9 @@ int main (void)
88
80
  printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
89
81
  /* { dg-output "\nres: 5 7 10" } */
90
82
 
91
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_20byte_gn, NULL) == FFI_OK);
83
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK);
92
84
 
93
- res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(pcl))(g_dbl, f_dbl);
85
+ res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl);
94
86
  /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */
95
87
  printf("res: %g %g %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
96
88
  /* { dg-output "\nres: 5 7 10" } */
@@ -45,21 +45,13 @@ cls_struct_20byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
45
45
  int main (void)
46
46
  {
47
47
  ffi_cif cif;
48
- #ifndef USING_MMAP
49
- static ffi_closure cl;
50
- #endif
51
- ffi_closure *pcl;
48
+ void *code;
49
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
52
50
  void* args_dbl[3];
53
51
  ffi_type* cls_struct_fields[4];
54
52
  ffi_type cls_struct_type;
55
53
  ffi_type* dbl_arg_types[3];
56
54
 
57
- #ifdef USING_MMAP
58
- pcl = allocate_mmap (sizeof(ffi_closure));
59
- #else
60
- pcl = &cl;
61
- #endif
62
-
63
55
  cls_struct_type.size = 0;
64
56
  cls_struct_type.alignment = 0;
65
57
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -90,9 +82,9 @@ int main (void)
90
82
  printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c);
91
83
  /* { dg-output "\nres: 5 7 10" } */
92
84
 
93
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_20byte_gn, NULL) == FFI_OK);
85
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_20byte_gn, NULL, code) == FFI_OK);
94
86
 
95
- res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(pcl))(g_dbl, f_dbl);
87
+ res_dbl = ((cls_struct_20byte(*)(cls_struct_20byte, cls_struct_20byte))(code))(g_dbl, f_dbl);
96
88
  /* { dg-output "\n1 2 3 4 5 7: 5 7 10" } */
97
89
  printf("res: %d %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c);
98
90
  /* { dg-output "\nres: 5 7 10" } */
@@ -54,21 +54,13 @@ cls_struct_24byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
54
54
  int main (void)
55
55
  {
56
56
  ffi_cif cif;
57
- #ifndef USING_MMAP
58
- static ffi_closure cl;
59
- #endif
60
- ffi_closure *pcl;
57
+ void *code;
58
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
61
59
  void* args_dbl[5];
62
60
  ffi_type* cls_struct_fields[5];
63
61
  ffi_type cls_struct_type;
64
62
  ffi_type* dbl_arg_types[5];
65
63
 
66
- #ifdef USING_MMAP
67
- pcl = allocate_mmap (sizeof(ffi_closure));
68
- #else
69
- pcl = &cl;
70
- #endif
71
-
72
64
  cls_struct_type.size = 0;
73
65
  cls_struct_type.alignment = 0;
74
66
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -106,13 +98,13 @@ int main (void)
106
98
  printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
107
99
  /* { dg-output "\nres: 22 15 17 25" } */
108
100
 
109
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_24byte_gn, NULL) == FFI_OK);
101
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_24byte_gn, NULL, code) == FFI_OK);
110
102
 
111
103
  res_dbl = ((cls_struct_24byte(*)(cls_struct_24byte,
112
104
  cls_struct_24byte,
113
105
  cls_struct_24byte,
114
106
  cls_struct_24byte))
115
- (pcl))(e_dbl, f_dbl, g_dbl, h_dbl);
107
+ (code))(e_dbl, f_dbl, g_dbl, h_dbl);
116
108
  /* { dg-output "\n9 2 6 5 1 2 3 7 4 5 7 9 8 6 1 9: 22 15 17 25" } */
117
109
  printf("res: %g %g %d %g\n", res_dbl.a, res_dbl.b, res_dbl.c, res_dbl.d);
118
110
  /* { dg-output "\nres: 22 15 17 25" } */
@@ -43,21 +43,13 @@ cls_struct_2byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
43
43
  int main (void)
44
44
  {
45
45
  ffi_cif cif;
46
- #ifndef USING_MMAP
47
- static ffi_closure cl;
48
- #endif
49
- ffi_closure *pcl;
46
+ void *code;
47
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
50
48
  void* args_dbl[5];
51
49
  ffi_type* cls_struct_fields[4];
52
50
  ffi_type cls_struct_type;
53
51
  ffi_type* dbl_arg_types[5];
54
52
 
55
- #ifdef USING_MMAP
56
- pcl = allocate_mmap (sizeof(ffi_closure));
57
- #else
58
- pcl = &cl;
59
- #endif
60
-
61
53
  cls_struct_type.size = 0;
62
54
  cls_struct_type.alignment = 0;
63
55
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -87,9 +79,9 @@ int main (void)
87
79
  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
88
80
  /* { dg-output "\nres: 13 140" } */
89
81
 
90
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_2byte_gn, NULL) == FFI_OK);
82
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_2byte_gn, NULL, code) == FFI_OK);
91
83
 
92
- res_dbl = ((cls_struct_2byte(*)(cls_struct_2byte, cls_struct_2byte))(pcl))(g_dbl, f_dbl);
84
+ res_dbl = ((cls_struct_2byte(*)(cls_struct_2byte, cls_struct_2byte))(code))(g_dbl, f_dbl);
93
85
  /* { dg-output "\n12 127 1 13: 13 140" } */
94
86
  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
95
87
  /* { dg-output "\nres: 13 140" } */
@@ -47,21 +47,13 @@ cls_struct_3_1byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
47
47
  int main (void)
48
48
  {
49
49
  ffi_cif cif;
50
- #ifndef USING_MMAP
51
- static ffi_closure cl;
52
- #endif
53
- ffi_closure *pcl;
50
+ void *code;
51
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
54
52
  void* args_dbl[5];
55
53
  ffi_type* cls_struct_fields[4];
56
54
  ffi_type cls_struct_type;
57
55
  ffi_type* dbl_arg_types[5];
58
56
 
59
- #ifdef USING_MMAP
60
- pcl = allocate_mmap (sizeof(ffi_closure));
61
- #else
62
- pcl = &cl;
63
- #endif
64
-
65
57
  cls_struct_type.size = 0;
66
58
  cls_struct_type.alignment = 0;
67
59
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -92,9 +84,9 @@ int main (void)
92
84
  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
93
85
  /* { dg-output "\nres: 190 192 194" } */
94
86
 
95
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_3_1byte_gn, NULL) == FFI_OK);
87
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3_1byte_gn, NULL, code) == FFI_OK);
96
88
 
97
- res_dbl = ((cls_struct_3_1byte(*)(cls_struct_3_1byte, cls_struct_3_1byte))(pcl))(g_dbl, f_dbl);
89
+ res_dbl = ((cls_struct_3_1byte(*)(cls_struct_3_1byte, cls_struct_3_1byte))(code))(g_dbl, f_dbl);
98
90
  /* { dg-output "\n12 13 14 178 179 180: 190 192 194" } */
99
91
  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
100
92
  /* { dg-output "\nres: 190 192 194" } */
@@ -43,21 +43,13 @@ cls_struct_3byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
43
43
  int main (void)
44
44
  {
45
45
  ffi_cif cif;
46
- #ifndef USING_MMAP
47
- static ffi_closure cl;
48
- #endif
49
- ffi_closure *pcl;
46
+ void *code;
47
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
50
48
  void* args_dbl[5];
51
49
  ffi_type* cls_struct_fields[4];
52
50
  ffi_type cls_struct_type;
53
51
  ffi_type* dbl_arg_types[5];
54
52
 
55
- #ifdef USING_MMAP
56
- pcl = allocate_mmap (sizeof(ffi_closure));
57
- #else
58
- pcl = &cl;
59
- #endif
60
-
61
53
  cls_struct_type.size = 0;
62
54
  cls_struct_type.alignment = 0;
63
55
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -87,9 +79,9 @@ int main (void)
87
79
  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
88
80
  /* { dg-output "\nres: 13 134" } */
89
81
 
90
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_3byte_gn, NULL) == FFI_OK);
82
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3byte_gn, NULL, code) == FFI_OK);
91
83
 
92
- res_dbl = ((cls_struct_3byte(*)(cls_struct_3byte, cls_struct_3byte))(pcl))(g_dbl, f_dbl);
84
+ res_dbl = ((cls_struct_3byte(*)(cls_struct_3byte, cls_struct_3byte))(code))(g_dbl, f_dbl);
93
85
  /* { dg-output "\n12 119 1 15: 13 134" } */
94
86
  printf("res: %d %d\n", res_dbl.a, res_dbl.b);
95
87
  /* { dg-output "\nres: 13 134" } */