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
@@ -0,0 +1,134 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Check structure alignment of long double.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: <hos@tamanegi.org> 20031203 */
6
+
7
+ /* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
8
+ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
9
+ /* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */
10
+ /* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
11
+
12
+ #include "ffitest.h"
13
+
14
+ typedef struct cls_struct_align {
15
+ long double a;
16
+ long double b;
17
+ long double c;
18
+ long double d;
19
+ long double e;
20
+ long double f;
21
+ long double g;
22
+ } cls_struct_align;
23
+
24
+ cls_struct_align cls_struct_align_fn(
25
+ cls_struct_align a1,
26
+ cls_struct_align a2)
27
+ {
28
+ struct cls_struct_align r;
29
+
30
+ r.a = a1.a + a2.a;
31
+ r.b = a1.b + a2.b;
32
+ r.c = a1.c + a2.c;
33
+ r.d = a1.d + a2.d;
34
+ r.e = a1.e + a2.e;
35
+ r.f = a1.f + a2.f;
36
+ r.g = a1.g + a2.g;
37
+
38
+ printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: "
39
+ "%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n",
40
+ a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g,
41
+ a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g,
42
+ r.a, r.b, r.c, r.d, r.e, r.f, r.g);
43
+
44
+ return r;
45
+ }
46
+
47
+ cls_struct_align cls_struct_align_fn2(
48
+ cls_struct_align a1)
49
+ {
50
+ struct cls_struct_align r;
51
+
52
+ r.a = a1.a + 1;
53
+ r.b = a1.b + 1;
54
+ r.c = a1.c + 1;
55
+ r.d = a1.d + 1;
56
+ r.e = a1.e + 1;
57
+ r.f = a1.f + 1;
58
+ r.g = a1.g + 1;
59
+
60
+ printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg: "
61
+ "%Lg %Lg %Lg %Lg %Lg %Lg %Lg\n",
62
+ a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g,
63
+ r.a, r.b, r.c, r.d, r.e, r.f, r.g);
64
+
65
+ return r;
66
+ }
67
+
68
+ static void
69
+ cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
70
+ void* userdata __UNUSED__)
71
+ {
72
+ struct cls_struct_align a1, a2;
73
+
74
+ a1 = *(struct cls_struct_align*)(args[0]);
75
+ a2 = *(struct cls_struct_align*)(args[1]);
76
+
77
+ *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
78
+ }
79
+
80
+ int main (void)
81
+ {
82
+ ffi_cif cif;
83
+ void *code;
84
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
85
+ void* args_dbl[3];
86
+ ffi_type* cls_struct_fields[8];
87
+ ffi_type cls_struct_type;
88
+ ffi_type* dbl_arg_types[3];
89
+
90
+ cls_struct_type.size = 0;
91
+ cls_struct_type.alignment = 0;
92
+ cls_struct_type.type = FFI_TYPE_STRUCT;
93
+ cls_struct_type.elements = cls_struct_fields;
94
+
95
+ struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 };
96
+ struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 };
97
+ struct cls_struct_align res_dbl;
98
+
99
+ cls_struct_fields[0] = &ffi_type_longdouble;
100
+ cls_struct_fields[1] = &ffi_type_longdouble;
101
+ cls_struct_fields[2] = &ffi_type_longdouble;
102
+ cls_struct_fields[3] = &ffi_type_longdouble;
103
+ cls_struct_fields[4] = &ffi_type_longdouble;
104
+ cls_struct_fields[5] = &ffi_type_longdouble;
105
+ cls_struct_fields[6] = &ffi_type_longdouble;
106
+ cls_struct_fields[7] = NULL;
107
+
108
+ dbl_arg_types[0] = &cls_struct_type;
109
+ dbl_arg_types[1] = &cls_struct_type;
110
+ dbl_arg_types[2] = NULL;
111
+
112
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
113
+ dbl_arg_types) == FFI_OK);
114
+
115
+ args_dbl[0] = &g_dbl;
116
+ args_dbl[1] = &f_dbl;
117
+ args_dbl[2] = NULL;
118
+
119
+ ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
120
+ /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */
121
+ printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b,
122
+ res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
123
+ /* { dg-output "\nres: 9 11 13 15 17 19 21" } */
124
+
125
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
126
+
127
+ res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
128
+ /* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */
129
+ printf("res: %Lg %Lg %Lg %Lg %Lg %Lg %Lg\n", res_dbl.a, res_dbl.b,
130
+ res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
131
+ /* { dg-output "\nres: 9 11 13 15 17 19 21" } */
132
+
133
+ exit(0);
134
+ }
@@ -0,0 +1,117 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Check structure alignment of long double.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: Blake Chaffin 6/18/2007
6
+ */
7
+
8
+ /* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
9
+ /* { dg-do run { xfail strongarm*-*-* } } */
10
+ /* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */
11
+ /* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
12
+
13
+ #include "ffitest.h"
14
+
15
+ typedef struct cls_struct_align {
16
+ long double a;
17
+ long double b;
18
+ long double c;
19
+ long double d;
20
+ long double e;
21
+ double f;
22
+ long double g;
23
+ } cls_struct_align;
24
+
25
+ cls_struct_align cls_struct_align_fn(
26
+ cls_struct_align a1,
27
+ cls_struct_align a2)
28
+ {
29
+ struct cls_struct_align r;
30
+
31
+ r.a = a1.a + a2.a;
32
+ r.b = a1.b + a2.b;
33
+ r.c = a1.c + a2.c;
34
+ r.d = a1.d + a2.d;
35
+ r.e = a1.e + a2.e;
36
+ r.f = a1.f + a2.f;
37
+ r.g = a1.g + a2.g;
38
+
39
+ printf("%Lg %Lg %Lg %Lg %Lg %g %Lg %Lg %Lg %Lg %Lg %Lg %g %Lg: "
40
+ "%Lg %Lg %Lg %Lg %Lg %g %Lg\n",
41
+ a1.a, a1.b, a1.c, a1.d, a1.e, a1.f, a1.g,
42
+ a2.a, a2.b, a2.c, a2.d, a2.e, a2.f, a2.g,
43
+ r.a, r.b, r.c, r.d, r.e, r.f, r.g);
44
+
45
+ return r;
46
+ }
47
+
48
+ static void
49
+ cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
50
+ void* userdata __UNUSED__)
51
+ {
52
+ struct cls_struct_align a1, a2;
53
+
54
+ a1 = *(struct cls_struct_align*)(args[0]);
55
+ a2 = *(struct cls_struct_align*)(args[1]);
56
+
57
+ *(cls_struct_align*)resp = cls_struct_align_fn(a1, a2);
58
+ }
59
+
60
+ int main (void)
61
+ {
62
+ ffi_cif cif;
63
+ void *code;
64
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
65
+ void* args_dbl[3];
66
+ ffi_type* cls_struct_fields[8];
67
+ ffi_type cls_struct_type;
68
+ ffi_type* dbl_arg_types[3];
69
+
70
+ cls_struct_type.size = 0;
71
+ cls_struct_type.alignment = 0;
72
+ cls_struct_type.type = FFI_TYPE_STRUCT;
73
+ cls_struct_type.elements = cls_struct_fields;
74
+
75
+ struct cls_struct_align g_dbl = { 1, 2, 3, 4, 5, 6, 7 };
76
+ struct cls_struct_align f_dbl = { 8, 9, 10, 11, 12, 13, 14 };
77
+ struct cls_struct_align res_dbl;
78
+
79
+ cls_struct_fields[0] = &ffi_type_longdouble;
80
+ cls_struct_fields[1] = &ffi_type_longdouble;
81
+ cls_struct_fields[2] = &ffi_type_longdouble;
82
+ cls_struct_fields[3] = &ffi_type_longdouble;
83
+ cls_struct_fields[4] = &ffi_type_longdouble;
84
+ cls_struct_fields[5] = &ffi_type_double;
85
+ cls_struct_fields[6] = &ffi_type_longdouble;
86
+ cls_struct_fields[7] = NULL;
87
+
88
+ dbl_arg_types[0] = &cls_struct_type;
89
+ dbl_arg_types[1] = &cls_struct_type;
90
+ dbl_arg_types[2] = NULL;
91
+
92
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type,
93
+ dbl_arg_types) == FFI_OK);
94
+
95
+ args_dbl[0] = &g_dbl;
96
+ args_dbl[1] = &f_dbl;
97
+ args_dbl[2] = NULL;
98
+
99
+ ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
100
+ /* { dg-output "1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */
101
+ printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b,
102
+ res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
103
+ /* { dg-output "\nres: 9 11 13 15 17 19 21" } */
104
+
105
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
106
+
107
+ res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
108
+ /* { dg-output "\n1 2 3 4 5 6 7 8 9 10 11 12 13 14: 9 11 13 15 17 19 21" } */
109
+ printf("res: %Lg %Lg %Lg %Lg %Lg %g %Lg\n", res_dbl.a, res_dbl.b,
110
+ res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g);
111
+ /* { dg-output "\nres: 9 11 13 15 17 19 21" } */
112
+
113
+ exit(0);
114
+ }
115
+
116
+
117
+
@@ -19,11 +19,13 @@ cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
19
19
  struct cls_struct_align result;
20
20
 
21
21
  result.a = a1.a + a2.a;
22
- result.b = (void *)((unsigned long)a1.b + (unsigned long)a2.b);
22
+ result.b = (void *)((uintptr_t)a1.b + (uintptr_t)a2.b);
23
23
  result.c = a1.c + a2.c;
24
24
 
25
- printf("%d %lu %d %d %lu %d: %d %lu %d\n", a1.a, (unsigned long)a1.b, a1.c,
26
- a2.a, (unsigned long)a2.b, a2.c, result.a, (unsigned long)result.b,
25
+ printf("%d %" PRIuPTR " %d %d %" PRIuPTR " %d: %d %" PRIuPTR " %d\n",
26
+ a1.a, (uintptr_t)a1.b, a1.c,
27
+ a2.a, (uintptr_t)a2.b, a2.c,
28
+ result.a, (uintptr_t)result.b,
27
29
  result.c);
28
30
 
29
31
  return result;
@@ -45,21 +47,13 @@ cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
45
47
  int main (void)
46
48
  {
47
49
  ffi_cif cif;
48
- #ifndef USING_MMAP
49
- static ffi_closure cl;
50
- #endif
51
- ffi_closure *pcl;
50
+ void *code;
51
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
52
52
  void* args_dbl[5];
53
53
  ffi_type* cls_struct_fields[4];
54
54
  ffi_type cls_struct_type;
55
55
  ffi_type* dbl_arg_types[5];
56
56
 
57
- #ifdef USING_MMAP
58
- pcl = allocate_mmap (sizeof(ffi_closure));
59
- #else
60
- pcl = &cl;
61
- #endif
62
-
63
57
  cls_struct_type.size = 0;
64
58
  cls_struct_type.alignment = 0;
65
59
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -87,14 +81,14 @@ int main (void)
87
81
 
88
82
  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
89
83
  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
90
- printf("res: %d %lu %d\n", res_dbl.a, (unsigned long)res_dbl.b, res_dbl.c);
84
+ printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c);
91
85
  /* { dg-output "\nres: 13 14271 140" } */
92
86
 
93
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_align_gn, NULL) == FFI_OK);
87
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
94
88
 
95
- res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(pcl))(g_dbl, f_dbl);
89
+ res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
96
90
  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
97
- printf("res: %d %lu %d\n", res_dbl.a, (unsigned long)res_dbl.b, res_dbl.c);
91
+ printf("res: %d %" PRIuPTR " %d\n", res_dbl.a, (uintptr_t)res_dbl.b, res_dbl.c);
98
92
  /* { dg-output "\nres: 13 14271 140" } */
99
93
 
100
94
  exit(0);
@@ -43,21 +43,13 @@ cls_struct_align_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: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
89
81
  /* { dg-output "\nres: 13 14271 140" } */
90
82
 
91
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_align_gn, NULL) == FFI_OK);
83
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
92
84
 
93
- res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(pcl))(g_dbl, f_dbl);
85
+ res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
94
86
  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
95
87
  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
96
88
  /* { dg-output "\nres: 13 14271 140" } */
@@ -43,21 +43,13 @@ cls_struct_align_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: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
89
81
  /* { dg-output "\nres: 13 14271 140" } */
90
82
 
91
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_align_gn, NULL) == FFI_OK);
83
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
92
84
 
93
- res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(pcl))(g_dbl, f_dbl);
85
+ res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
94
86
  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
95
87
  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
96
88
  /* { dg-output "\nres: 13 14271 140" } */
@@ -22,7 +22,7 @@ cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
22
22
  result.b = a1.b + a2.b;
23
23
  result.c = a1.c + a2.c;
24
24
 
25
- printf("%d %lld %d %d %lld %d: %d %lld %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
25
+ printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
26
26
 
27
27
  return result;
28
28
  }
@@ -43,21 +43,13 @@ cls_struct_align_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;
@@ -85,14 +77,14 @@ int main (void)
85
77
 
86
78
  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
87
79
  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
88
- printf("res: %d %lld %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
80
+ printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
89
81
  /* { dg-output "\nres: 13 14271 140" } */
90
82
 
91
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_align_gn, NULL) == FFI_OK);
83
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
92
84
 
93
- res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(pcl))(g_dbl, f_dbl);
85
+ res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
94
86
  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
95
- printf("res: %d %lld %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
87
+ printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
96
88
  /* { dg-output "\nres: 13 14271 140" } */
97
89
 
98
90
  exit(0);
@@ -43,21 +43,13 @@ cls_struct_align_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: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
89
81
  /* { dg-output "\nres: 13 14271 140" } */
90
82
 
91
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_align_gn, NULL) == FFI_OK);
83
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
92
84
 
93
- res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(pcl))(g_dbl, f_dbl);
85
+ res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
94
86
  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
95
87
  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
96
88
  /* { dg-output "\nres: 13 14271 140" } */
@@ -43,21 +43,13 @@ cls_struct_align_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: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
89
81
  /* { dg-output "\nres: 13 14271 140" } */
90
82
 
91
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_align_gn, NULL) == FFI_OK);
83
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
92
84
 
93
- res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(pcl))(g_dbl, f_dbl);
85
+ res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
94
86
  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
95
87
  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
96
88
  /* { dg-output "\nres: 13 14271 140" } */
@@ -23,7 +23,7 @@ cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
23
23
  result.b = a1.b + a2.b;
24
24
  result.c = a1.c + a2.c;
25
25
 
26
- printf("%d %lld %d %d %lld %d: %d %lld %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
26
+ printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
27
27
 
28
28
  return result;
29
29
  }
@@ -44,21 +44,13 @@ cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
44
44
  int main (void)
45
45
  {
46
46
  ffi_cif cif;
47
- #ifndef USING_MMAP
48
- static ffi_closure cl;
49
- #endif
50
- ffi_closure *pcl;
47
+ void *code;
48
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
51
49
  void* args_dbl[5];
52
50
  ffi_type* cls_struct_fields[4];
53
51
  ffi_type cls_struct_type;
54
52
  ffi_type* dbl_arg_types[5];
55
53
 
56
- #ifdef USING_MMAP
57
- pcl = allocate_mmap (sizeof(ffi_closure));
58
- #else
59
- pcl = &cl;
60
- #endif
61
-
62
54
  cls_struct_type.size = 0;
63
55
  cls_struct_type.alignment = 0;
64
56
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -86,14 +78,14 @@ int main (void)
86
78
 
87
79
  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
88
80
  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
89
- printf("res: %d %lld %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
81
+ printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
90
82
  /* { dg-output "\nres: 13 14271 140" } */
91
83
 
92
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_align_gn, NULL) == FFI_OK);
84
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
93
85
 
94
- res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(pcl))(g_dbl, f_dbl);
86
+ res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
95
87
  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
96
- printf("res: %d %lld %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
88
+ printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
97
89
  /* { dg-output "\nres: 13 14271 140" } */
98
90
 
99
91
  exit(0);
@@ -0,0 +1,66 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Check double arguments in structs.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: Blake Chaffin 6/23/2007 */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "ffitest.h"
10
+
11
+ typedef struct Dbls {
12
+ double x;
13
+ double y;
14
+ } Dbls;
15
+
16
+ void
17
+ closure_test_fn(Dbls p)
18
+ {
19
+ printf("%.1f %.1f\n", p.x, p.y);
20
+ }
21
+
22
+ void
23
+ closure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
24
+ void** args, void* userdata __UNUSED__)
25
+ {
26
+ closure_test_fn(*(Dbls*)args[0]);
27
+ }
28
+
29
+ int main(int argc __UNUSED__, char** argv __UNUSED__)
30
+ {
31
+ ffi_cif cif;
32
+
33
+ void *code;
34
+ ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
35
+ ffi_type* cl_arg_types[1];
36
+
37
+ ffi_type ts1_type;
38
+ ffi_type* ts1_type_elements[4];
39
+
40
+ ts1_type.size = 0;
41
+ ts1_type.alignment = 0;
42
+ ts1_type.type = FFI_TYPE_STRUCT;
43
+ ts1_type.elements = ts1_type_elements;
44
+
45
+ ts1_type_elements[0] = &ffi_type_double;
46
+ ts1_type_elements[1] = &ffi_type_double;
47
+ ts1_type_elements[2] = NULL;
48
+
49
+ cl_arg_types[0] = &ts1_type;
50
+
51
+ Dbls arg = { 1.0, 2.0 };
52
+
53
+ /* Initialize the cif */
54
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
55
+ &ffi_type_void, cl_arg_types) == FFI_OK);
56
+
57
+ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK);
58
+
59
+ ((void*(*)(Dbls))(code))(arg);
60
+ /* { dg-output "1.0 2.0\n" } */
61
+
62
+ closure_test_fn(arg);
63
+ /* { dg-output "1.0 2.0\n" } */
64
+
65
+ return 0;
66
+ }
@@ -20,19 +20,11 @@ typedef double (*cls_ret_double)(double);
20
20
  int main (void)
21
21
  {
22
22
  ffi_cif cif;
23
- #ifndef USING_MMAP
24
- static ffi_closure cl;
25
- #endif
26
- ffi_closure *pcl;
23
+ void *code;
24
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
27
25
  ffi_type * cl_arg_types[2];
28
26
  double res;
29
27
 
30
- #ifdef USING_MMAP
31
- pcl = allocate_mmap (sizeof(ffi_closure));
32
- #else
33
- pcl = &cl;
34
- #endif
35
-
36
28
  cl_arg_types[0] = &ffi_type_double;
37
29
  cl_arg_types[1] = NULL;
38
30
 
@@ -40,9 +32,9 @@ int main (void)
40
32
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
41
33
  &ffi_type_double, cl_arg_types) == FFI_OK);
42
34
 
43
- CHECK(ffi_prep_closure(pcl, &cif, cls_ret_double_fn, NULL) == FFI_OK);
35
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_double_fn, NULL, code) == FFI_OK);
44
36
 
45
- res = (*((cls_ret_double)pcl))(21474.789);
37
+ res = (*((cls_ret_double)code))(21474.789);
46
38
  /* { dg-output "21474.789000: 21474.789000" } */
47
39
  printf("res: %.6f\n", res);
48
40
  /* { dg-output "\nres: 21474.789000" } */