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
@@ -57,10 +57,8 @@ B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
57
57
  int main (void)
58
58
  {
59
59
  ffi_cif cif;
60
- #ifndef USING_MMAP
61
- static ffi_closure cl;
62
- #endif
63
- ffi_closure *pcl;
60
+ void *code;
61
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
64
62
  void* args_dbl[4];
65
63
  ffi_type* cls_struct_fields[3];
66
64
  ffi_type* cls_struct_fields1[3];
@@ -68,12 +66,6 @@ int main (void)
68
66
  ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
69
67
  ffi_type* dbl_arg_types[4];
70
68
 
71
- #ifdef USING_MMAP
72
- pcl = allocate_mmap (sizeof(ffi_closure));
73
- #else
74
- pcl = &cl;
75
- #endif
76
-
77
69
  cls_struct_type.size = 0;
78
70
  cls_struct_type.alignment = 0;
79
71
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -127,9 +119,9 @@ int main (void)
127
119
  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
128
120
  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
129
121
 
130
- CHECK(ffi_prep_closure(pcl, &cif, B_gn, NULL) == FFI_OK);
122
+ CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
131
123
 
132
- res_dbl = ((B(*)(A, B, C))(pcl))(e_dbl, f_dbl, g_dbl);
124
+ res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl);
133
125
  /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */
134
126
  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d));
135
127
  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
@@ -57,10 +57,8 @@ B_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
57
57
  int main (void)
58
58
  {
59
59
  ffi_cif cif;
60
- #ifndef USING_MMAP
61
- static ffi_closure cl;
62
- #endif
63
- ffi_closure *pcl;
60
+ void *code;
61
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
64
62
  void* args_dbl[4];
65
63
  ffi_type* cls_struct_fields[3];
66
64
  ffi_type* cls_struct_fields1[3];
@@ -68,12 +66,6 @@ int main (void)
68
66
  ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
69
67
  ffi_type* dbl_arg_types[4];
70
68
 
71
- #ifdef USING_MMAP
72
- pcl = allocate_mmap (sizeof(ffi_closure));
73
- #else
74
- pcl = &cl;
75
- #endif
76
-
77
69
  cls_struct_type.size = 0;
78
70
  cls_struct_type.alignment = 0;
79
71
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -127,9 +119,9 @@ int main (void)
127
119
  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
128
120
  CHECK( res_dbl.y == (e_dbl.b + f_dbl.x.b + g_dbl.e));
129
121
 
130
- CHECK(ffi_prep_closure(pcl, &cif, B_gn, NULL) == FFI_OK);
122
+ CHECK(ffi_prep_closure_loc(pcl, &cif, B_gn, NULL, code) == FFI_OK);
131
123
 
132
- res_dbl = ((B(*)(A, B, C))(pcl))(e_dbl, f_dbl, g_dbl);
124
+ res_dbl = ((B(*)(A, B, C))(code))(e_dbl, f_dbl, g_dbl);
133
125
  /* { dg-output "\n1 7 12 127 99 2 9: 15 242 143" } */
134
126
  CHECK( res_dbl.x.a == (e_dbl.a + f_dbl.x.a + g_dbl.d));
135
127
  CHECK( res_dbl.x.b == (e_dbl.b + f_dbl.x.b + f_dbl.y + g_dbl.e));
@@ -45,19 +45,11 @@ int main(void)
45
45
  ffi_type* my_ffi_struct_fields[4];
46
46
  ffi_type my_ffi_struct_type;
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[4];
53
51
  ffi_type* arg_types[3];
54
52
 
55
- #ifdef USING_MMAP
56
- pcl = allocate_mmap (sizeof(ffi_closure));
57
- #else
58
- pcl = &cl;
59
- #endif
60
-
61
53
  struct my_ffi_struct g = { 1.0, 2.0, 3.0 };
62
54
  struct my_ffi_struct f = { 1.0, 2.0, 3.0 };
63
55
  struct my_ffi_struct res;
@@ -87,9 +79,9 @@ int main(void)
87
79
  printf("res: %g %g %g\n", res.a, res.b, res.c);
88
80
  /* { dg-output "\nres: 2 4 6" } */
89
81
 
90
- CHECK(ffi_prep_closure(pcl, &cif, stub, NULL) == FFI_OK);
82
+ CHECK(ffi_prep_closure_loc(pcl, &cif, stub, NULL, code) == FFI_OK);
91
83
 
92
- res = ((my_ffi_struct(*)(struct my_ffi_struct, struct my_ffi_struct))(pcl))(g, f);
84
+ res = ((my_ffi_struct(*)(struct my_ffi_struct, struct my_ffi_struct))(code))(g, f);
93
85
  /* { dg-output "\n1 2 3 1 2 3: 2 4 6" } */
94
86
  printf("res: %g %g %g\n", res.a, res.b, res.c);
95
87
  /* { dg-output "\nres: 2 4 6" } */
@@ -4,7 +4,7 @@
4
4
  PR: none.
5
5
  Originator: <andreast@gcc.gnu.org> 20071113 */
6
6
 
7
- /* { dg-do run } */
7
+ /* { dg-do run { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
8
8
  #include "ffitest.h"
9
9
 
10
10
  static long double return_ldl(long double ldl)
@@ -36,7 +36,7 @@ int main (void)
36
36
  ll2 = 11111111;
37
37
 
38
38
  ffi_call(&cif, FFI_FN(return_ll), &rlonglong, values);
39
- printf("res: %lld, %lld\n", rlonglong, ll0 + ll1 + ll2);
39
+ printf("res: %" PRIdLL ", %" PRIdLL "\n", rlonglong, ll0 + ll1 + ll2);
40
40
  /* { dg-output "res: 11111133333222, 11111133333222" } */
41
41
  exit(0);
42
42
  }
@@ -0,0 +1,145 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Check structure returning with different structure size.
3
+ Depending on the ABI. Check bigger struct which overlaps
4
+ the gp and fp register count on Darwin/AIX/ppc64.
5
+ Limitations: none.
6
+ PR: none.
7
+ Originator: Blake Chaffin 6/21/2007 */
8
+
9
+ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
10
+ #include "ffitest.h"
11
+
12
+ // 13 FPRs: 104 bytes
13
+ // 14 FPRs: 112 bytes
14
+
15
+ typedef struct struct_108byte {
16
+ double a;
17
+ double b;
18
+ double c;
19
+ double d;
20
+ double e;
21
+ double f;
22
+ double g;
23
+ double h;
24
+ double i;
25
+ double j;
26
+ double k;
27
+ double l;
28
+ double m;
29
+ int n;
30
+ } struct_108byte;
31
+
32
+ struct_108byte cls_struct_108byte_fn(
33
+ struct_108byte b0,
34
+ struct_108byte b1,
35
+ struct_108byte b2,
36
+ struct_108byte b3)
37
+ {
38
+ struct_108byte result;
39
+
40
+ result.a = b0.a + b1.a + b2.a + b3.a;
41
+ result.b = b0.b + b1.b + b2.b + b3.b;
42
+ result.c = b0.c + b1.c + b2.c + b3.c;
43
+ result.d = b0.d + b1.d + b2.d + b3.d;
44
+ result.e = b0.e + b1.e + b2.e + b3.e;
45
+ result.f = b0.f + b1.f + b2.f + b3.f;
46
+ result.g = b0.g + b1.g + b2.g + b3.g;
47
+ result.h = b0.h + b1.h + b2.h + b3.h;
48
+ result.i = b0.i + b1.i + b2.i + b3.i;
49
+ result.j = b0.j + b1.j + b2.j + b3.j;
50
+ result.k = b0.k + b1.k + b2.k + b3.k;
51
+ result.l = b0.l + b1.l + b2.l + b3.l;
52
+ result.m = b0.m + b1.m + b2.m + b3.m;
53
+ result.n = b0.n + b1.n + b2.n + b3.n;
54
+
55
+ printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c,
56
+ result.d, result.e, result.f, result.g, result.h, result.i,
57
+ result.j, result.k, result.l, result.m, result.n);
58
+
59
+ return result;
60
+ }
61
+
62
+ static void
63
+ cls_struct_108byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__)
64
+ {
65
+ struct_108byte b0, b1, b2, b3;
66
+
67
+ b0 = *(struct_108byte*)(args[0]);
68
+ b1 = *(struct_108byte*)(args[1]);
69
+ b2 = *(struct_108byte*)(args[2]);
70
+ b3 = *(struct_108byte*)(args[3]);
71
+
72
+ *(struct_108byte*)resp = cls_struct_108byte_fn(b0, b1, b2, b3);
73
+ }
74
+
75
+ int main (void)
76
+ {
77
+ ffi_cif cif;
78
+ void *code;
79
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
80
+ void* args_dbl[5];
81
+ ffi_type* cls_struct_fields[15];
82
+ ffi_type cls_struct_type;
83
+ ffi_type* dbl_arg_types[5];
84
+
85
+ cls_struct_type.size = 0;
86
+ cls_struct_type.alignment = 0;
87
+ cls_struct_type.type = FFI_TYPE_STRUCT;
88
+ cls_struct_type.elements = cls_struct_fields;
89
+
90
+ struct_108byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 7 };
91
+ struct_108byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 4 };
92
+ struct_108byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 3 };
93
+ struct_108byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 2 };
94
+ struct_108byte res_dbl;
95
+
96
+ cls_struct_fields[0] = &ffi_type_double;
97
+ cls_struct_fields[1] = &ffi_type_double;
98
+ cls_struct_fields[2] = &ffi_type_double;
99
+ cls_struct_fields[3] = &ffi_type_double;
100
+ cls_struct_fields[4] = &ffi_type_double;
101
+ cls_struct_fields[5] = &ffi_type_double;
102
+ cls_struct_fields[6] = &ffi_type_double;
103
+ cls_struct_fields[7] = &ffi_type_double;
104
+ cls_struct_fields[8] = &ffi_type_double;
105
+ cls_struct_fields[9] = &ffi_type_double;
106
+ cls_struct_fields[10] = &ffi_type_double;
107
+ cls_struct_fields[11] = &ffi_type_double;
108
+ cls_struct_fields[12] = &ffi_type_double;
109
+ cls_struct_fields[13] = &ffi_type_sint32;
110
+ cls_struct_fields[14] = NULL;
111
+
112
+ dbl_arg_types[0] = &cls_struct_type;
113
+ dbl_arg_types[1] = &cls_struct_type;
114
+ dbl_arg_types[2] = &cls_struct_type;
115
+ dbl_arg_types[3] = &cls_struct_type;
116
+ dbl_arg_types[4] = NULL;
117
+
118
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
119
+ dbl_arg_types) == FFI_OK);
120
+
121
+ args_dbl[0] = &e_dbl;
122
+ args_dbl[1] = &f_dbl;
123
+ args_dbl[2] = &g_dbl;
124
+ args_dbl[3] = &h_dbl;
125
+ args_dbl[4] = NULL;
126
+
127
+ ffi_call(&cif, FFI_FN(cls_struct_108byte_fn), &res_dbl, args_dbl);
128
+ /* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */
129
+ printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b,
130
+ res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i,
131
+ res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n);
132
+ /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */
133
+
134
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_108byte_gn, NULL, code) == FFI_OK);
135
+
136
+ res_dbl = ((struct_108byte(*)(struct_108byte, struct_108byte,
137
+ struct_108byte, struct_108byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl);
138
+ /* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */
139
+ printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b,
140
+ res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i,
141
+ res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n);
142
+ /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 16" } */
143
+
144
+ exit(0);
145
+ }
@@ -0,0 +1,148 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Check structure returning with different structure size.
3
+ Depending on the ABI. Check bigger struct which overlaps
4
+ the gp and fp register count on Darwin/AIX/ppc64.
5
+ Limitations: none.
6
+ PR: none.
7
+ Originator: Blake Chaffin 6/21/2007 */
8
+
9
+ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
10
+ #include "ffitest.h"
11
+
12
+ // 13 FPRs: 104 bytes
13
+ // 14 FPRs: 112 bytes
14
+
15
+ typedef struct struct_116byte {
16
+ double a;
17
+ double b;
18
+ double c;
19
+ double d;
20
+ double e;
21
+ double f;
22
+ double g;
23
+ double h;
24
+ double i;
25
+ double j;
26
+ double k;
27
+ double l;
28
+ double m;
29
+ double n;
30
+ int o;
31
+ } struct_116byte;
32
+
33
+ struct_116byte cls_struct_116byte_fn(
34
+ struct_116byte b0,
35
+ struct_116byte b1,
36
+ struct_116byte b2,
37
+ struct_116byte b3)
38
+ {
39
+ struct_116byte result;
40
+
41
+ result.a = b0.a + b1.a + b2.a + b3.a;
42
+ result.b = b0.b + b1.b + b2.b + b3.b;
43
+ result.c = b0.c + b1.c + b2.c + b3.c;
44
+ result.d = b0.d + b1.d + b2.d + b3.d;
45
+ result.e = b0.e + b1.e + b2.e + b3.e;
46
+ result.f = b0.f + b1.f + b2.f + b3.f;
47
+ result.g = b0.g + b1.g + b2.g + b3.g;
48
+ result.h = b0.h + b1.h + b2.h + b3.h;
49
+ result.i = b0.i + b1.i + b2.i + b3.i;
50
+ result.j = b0.j + b1.j + b2.j + b3.j;
51
+ result.k = b0.k + b1.k + b2.k + b3.k;
52
+ result.l = b0.l + b1.l + b2.l + b3.l;
53
+ result.m = b0.m + b1.m + b2.m + b3.m;
54
+ result.n = b0.n + b1.n + b2.n + b3.n;
55
+ result.o = b0.o + b1.o + b2.o + b3.o;
56
+
57
+ printf("%g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", result.a, result.b, result.c,
58
+ result.d, result.e, result.f, result.g, result.h, result.i,
59
+ result.j, result.k, result.l, result.m, result.n, result.o);
60
+
61
+ return result;
62
+ }
63
+
64
+ static void
65
+ cls_struct_116byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__)
66
+ {
67
+ struct_116byte b0, b1, b2, b3;
68
+
69
+ b0 = *(struct_116byte*)(args[0]);
70
+ b1 = *(struct_116byte*)(args[1]);
71
+ b2 = *(struct_116byte*)(args[2]);
72
+ b3 = *(struct_116byte*)(args[3]);
73
+
74
+ *(struct_116byte*)resp = cls_struct_116byte_fn(b0, b1, b2, b3);
75
+ }
76
+
77
+ int main (void)
78
+ {
79
+ ffi_cif cif;
80
+ void *code;
81
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
82
+ void* args_dbl[5];
83
+ ffi_type* cls_struct_fields[16];
84
+ ffi_type cls_struct_type;
85
+ ffi_type* dbl_arg_types[5];
86
+
87
+ cls_struct_type.size = 0;
88
+ cls_struct_type.alignment = 0;
89
+ cls_struct_type.type = FFI_TYPE_STRUCT;
90
+ cls_struct_type.elements = cls_struct_fields;
91
+
92
+ struct_116byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 7 };
93
+ struct_116byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0, 5.0, 7.0, 9.0, 1.0, 6.0, 4 };
94
+ struct_116byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 8.0, 6.0, 1.0, 4.0, 0.0, 7.0, 3 };
95
+ struct_116byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 9.0, 2.0, 6.0, 5.0, 3.0, 8.0, 2 };
96
+ struct_116byte res_dbl;
97
+
98
+ cls_struct_fields[0] = &ffi_type_double;
99
+ cls_struct_fields[1] = &ffi_type_double;
100
+ cls_struct_fields[2] = &ffi_type_double;
101
+ cls_struct_fields[3] = &ffi_type_double;
102
+ cls_struct_fields[4] = &ffi_type_double;
103
+ cls_struct_fields[5] = &ffi_type_double;
104
+ cls_struct_fields[6] = &ffi_type_double;
105
+ cls_struct_fields[7] = &ffi_type_double;
106
+ cls_struct_fields[8] = &ffi_type_double;
107
+ cls_struct_fields[9] = &ffi_type_double;
108
+ cls_struct_fields[10] = &ffi_type_double;
109
+ cls_struct_fields[11] = &ffi_type_double;
110
+ cls_struct_fields[12] = &ffi_type_double;
111
+ cls_struct_fields[13] = &ffi_type_double;
112
+ cls_struct_fields[14] = &ffi_type_sint32;
113
+ cls_struct_fields[15] = NULL;
114
+
115
+ dbl_arg_types[0] = &cls_struct_type;
116
+ dbl_arg_types[1] = &cls_struct_type;
117
+ dbl_arg_types[2] = &cls_struct_type;
118
+ dbl_arg_types[3] = &cls_struct_type;
119
+ dbl_arg_types[4] = NULL;
120
+
121
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
122
+ dbl_arg_types) == FFI_OK);
123
+
124
+ args_dbl[0] = &e_dbl;
125
+ args_dbl[1] = &f_dbl;
126
+ args_dbl[2] = &g_dbl;
127
+ args_dbl[3] = &h_dbl;
128
+ args_dbl[4] = NULL;
129
+
130
+ ffi_call(&cif, FFI_FN(cls_struct_116byte_fn), &res_dbl, args_dbl);
131
+ /* { dg-output "22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */
132
+ printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b,
133
+ res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i,
134
+ res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o);
135
+ /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */
136
+
137
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_116byte_gn, NULL, code) == FFI_OK);
138
+
139
+ res_dbl = ((struct_116byte(*)(struct_116byte, struct_116byte,
140
+ struct_116byte, struct_116byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl);
141
+ /* { dg-output "\n22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */
142
+ printf("res: %g %g %g %g %g %g %g %g %g %g %g %g %g %g %d\n", res_dbl.a, res_dbl.b,
143
+ res_dbl.c, res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i,
144
+ res_dbl.j, res_dbl.k, res_dbl.l, res_dbl.m, res_dbl.n, res_dbl.o);
145
+ /* { dg-output "\nres: 22 15 17 25 6 13 19 18 22 15 17 25 6 26 16" } */
146
+
147
+ exit(0);
148
+ }
@@ -0,0 +1,124 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Check structure returning with different structure size.
3
+ Depending on the ABI. Check bigger struct which overlaps
4
+ the gp and fp register count on Darwin/AIX/ppc64.
5
+ Limitations: none.
6
+ PR: none.
7
+ Originator: Blake Chaffin 6/21/2007 */
8
+
9
+ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
10
+ #include "ffitest.h"
11
+
12
+ typedef struct struct_72byte {
13
+ double a;
14
+ double b;
15
+ double c;
16
+ double d;
17
+ double e;
18
+ double f;
19
+ double g;
20
+ double h;
21
+ double i;
22
+ } struct_72byte;
23
+
24
+ struct_72byte cls_struct_72byte_fn(
25
+ struct_72byte b0,
26
+ struct_72byte b1,
27
+ struct_72byte b2,
28
+ struct_72byte b3)
29
+ {
30
+ struct_72byte result;
31
+
32
+ result.a = b0.a + b1.a + b2.a + b3.a;
33
+ result.b = b0.b + b1.b + b2.b + b3.b;
34
+ result.c = b0.c + b1.c + b2.c + b3.c;
35
+ result.d = b0.d + b1.d + b2.d + b3.d;
36
+ result.e = b0.e + b1.e + b2.e + b3.e;
37
+ result.f = b0.f + b1.f + b2.f + b3.f;
38
+ result.g = b0.g + b1.g + b2.g + b3.g;
39
+ result.h = b0.h + b1.h + b2.h + b3.h;
40
+ result.i = b0.i + b1.i + b2.i + b3.i;
41
+
42
+ printf("%g %g %g %g %g %g %g %g %g\n", result.a, result.b, result.c,
43
+ result.d, result.e, result.f, result.g, result.h, result.i);
44
+
45
+ return result;
46
+ }
47
+
48
+ static void
49
+ cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__)
50
+ {
51
+ struct_72byte b0, b1, b2, b3;
52
+
53
+ b0 = *(struct_72byte*)(args[0]);
54
+ b1 = *(struct_72byte*)(args[1]);
55
+ b2 = *(struct_72byte*)(args[2]);
56
+ b3 = *(struct_72byte*)(args[3]);
57
+
58
+ *(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3);
59
+ }
60
+
61
+ int main (void)
62
+ {
63
+ ffi_cif cif;
64
+ void *code;
65
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
66
+ void* args_dbl[5];
67
+ ffi_type* cls_struct_fields[10];
68
+ ffi_type cls_struct_type;
69
+ ffi_type* dbl_arg_types[5];
70
+
71
+ cls_struct_type.size = 0;
72
+ cls_struct_type.alignment = 0;
73
+ cls_struct_type.type = FFI_TYPE_STRUCT;
74
+ cls_struct_type.elements = cls_struct_fields;
75
+
76
+ struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7.0 };
77
+ struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4.0 };
78
+ struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3.0 };
79
+ struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2.0 };
80
+ struct_72byte res_dbl;
81
+
82
+ cls_struct_fields[0] = &ffi_type_double;
83
+ cls_struct_fields[1] = &ffi_type_double;
84
+ cls_struct_fields[2] = &ffi_type_double;
85
+ cls_struct_fields[3] = &ffi_type_double;
86
+ cls_struct_fields[4] = &ffi_type_double;
87
+ cls_struct_fields[5] = &ffi_type_double;
88
+ cls_struct_fields[6] = &ffi_type_double;
89
+ cls_struct_fields[7] = &ffi_type_double;
90
+ cls_struct_fields[8] = &ffi_type_double;
91
+ cls_struct_fields[9] = NULL;
92
+
93
+ dbl_arg_types[0] = &cls_struct_type;
94
+ dbl_arg_types[1] = &cls_struct_type;
95
+ dbl_arg_types[2] = &cls_struct_type;
96
+ dbl_arg_types[3] = &cls_struct_type;
97
+ dbl_arg_types[4] = NULL;
98
+
99
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
100
+ dbl_arg_types) == FFI_OK);
101
+
102
+ args_dbl[0] = &e_dbl;
103
+ args_dbl[1] = &f_dbl;
104
+ args_dbl[2] = &g_dbl;
105
+ args_dbl[3] = &h_dbl;
106
+ args_dbl[4] = NULL;
107
+
108
+ ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl);
109
+ /* { dg-output "22 15 17 25 6 13 19 18 16" } */
110
+ printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c,
111
+ res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i);
112
+ /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */
113
+
114
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK);
115
+
116
+ res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte,
117
+ struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl);
118
+ /* { dg-output "\n22 15 17 25 6 13 19 18 16" } */
119
+ printf("res: %g %g %g %g %g %g %g %g %g\n", res_dbl.a, res_dbl.b, res_dbl.c,
120
+ res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i);
121
+ /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */
122
+
123
+ exit(0);
124
+ }
@@ -0,0 +1,124 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Check structure returning with different structure size.
3
+ Depending on the ABI. Check bigger struct which overlaps
4
+ the gp and fp register count on Darwin/AIX/ppc64.
5
+ Limitations: none.
6
+ PR: none.
7
+ Originator: Blake Chaffin 6/21/2007 */
8
+
9
+ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
10
+ #include "ffitest.h"
11
+
12
+ typedef struct struct_72byte {
13
+ double a;
14
+ double b;
15
+ double c;
16
+ double d;
17
+ double e;
18
+ double f;
19
+ double g;
20
+ double h;
21
+ long long i;
22
+ } struct_72byte;
23
+
24
+ struct_72byte cls_struct_72byte_fn(
25
+ struct_72byte b0,
26
+ struct_72byte b1,
27
+ struct_72byte b2,
28
+ struct_72byte b3)
29
+ {
30
+ struct_72byte result;
31
+
32
+ result.a = b0.a + b1.a + b2.a + b3.a;
33
+ result.b = b0.b + b1.b + b2.b + b3.b;
34
+ result.c = b0.c + b1.c + b2.c + b3.c;
35
+ result.d = b0.d + b1.d + b2.d + b3.d;
36
+ result.e = b0.e + b1.e + b2.e + b3.e;
37
+ result.f = b0.f + b1.f + b2.f + b3.f;
38
+ result.g = b0.g + b1.g + b2.g + b3.g;
39
+ result.h = b0.h + b1.h + b2.h + b3.h;
40
+ result.i = b0.i + b1.i + b2.i + b3.i;
41
+
42
+ printf("%g %g %g %g %g %g %g %g %" PRIdLL "\n", result.a, result.b, result.c,
43
+ result.d, result.e, result.f, result.g, result.h, result.i);
44
+
45
+ return result;
46
+ }
47
+
48
+ static void
49
+ cls_struct_72byte_gn(ffi_cif* cif __UNUSED__, void* resp, void** args, void* userdata __UNUSED__)
50
+ {
51
+ struct_72byte b0, b1, b2, b3;
52
+
53
+ b0 = *(struct_72byte*)(args[0]);
54
+ b1 = *(struct_72byte*)(args[1]);
55
+ b2 = *(struct_72byte*)(args[2]);
56
+ b3 = *(struct_72byte*)(args[3]);
57
+
58
+ *(struct_72byte*)resp = cls_struct_72byte_fn(b0, b1, b2, b3);
59
+ }
60
+
61
+ int main (void)
62
+ {
63
+ ffi_cif cif;
64
+ void *code;
65
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
66
+ void* args_dbl[5];
67
+ ffi_type* cls_struct_fields[10];
68
+ ffi_type cls_struct_type;
69
+ ffi_type* dbl_arg_types[5];
70
+
71
+ cls_struct_type.size = 0;
72
+ cls_struct_type.alignment = 0;
73
+ cls_struct_type.type = FFI_TYPE_STRUCT;
74
+ cls_struct_type.elements = cls_struct_fields;
75
+
76
+ struct_72byte e_dbl = { 9.0, 2.0, 6.0, 5.0, 3.0, 4.0, 8.0, 1.0, 7 };
77
+ struct_72byte f_dbl = { 1.0, 2.0, 3.0, 7.0, 2.0, 5.0, 6.0, 7.0, 4 };
78
+ struct_72byte g_dbl = { 4.0, 5.0, 7.0, 9.0, 1.0, 1.0, 2.0, 9.0, 3 };
79
+ struct_72byte h_dbl = { 8.0, 6.0, 1.0, 4.0, 0.0, 3.0, 3.0, 1.0, 2 };
80
+ struct_72byte res_dbl;
81
+
82
+ cls_struct_fields[0] = &ffi_type_double;
83
+ cls_struct_fields[1] = &ffi_type_double;
84
+ cls_struct_fields[2] = &ffi_type_double;
85
+ cls_struct_fields[3] = &ffi_type_double;
86
+ cls_struct_fields[4] = &ffi_type_double;
87
+ cls_struct_fields[5] = &ffi_type_double;
88
+ cls_struct_fields[6] = &ffi_type_double;
89
+ cls_struct_fields[7] = &ffi_type_double;
90
+ cls_struct_fields[8] = &ffi_type_sint64;
91
+ cls_struct_fields[9] = NULL;
92
+
93
+ dbl_arg_types[0] = &cls_struct_type;
94
+ dbl_arg_types[1] = &cls_struct_type;
95
+ dbl_arg_types[2] = &cls_struct_type;
96
+ dbl_arg_types[3] = &cls_struct_type;
97
+ dbl_arg_types[4] = NULL;
98
+
99
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type,
100
+ dbl_arg_types) == FFI_OK);
101
+
102
+ args_dbl[0] = &e_dbl;
103
+ args_dbl[1] = &f_dbl;
104
+ args_dbl[2] = &g_dbl;
105
+ args_dbl[3] = &h_dbl;
106
+ args_dbl[4] = NULL;
107
+
108
+ ffi_call(&cif, FFI_FN(cls_struct_72byte_fn), &res_dbl, args_dbl);
109
+ /* { dg-output "22 15 17 25 6 13 19 18 16" } */
110
+ printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c,
111
+ res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i);
112
+ /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */
113
+
114
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_72byte_gn, NULL, code) == FFI_OK);
115
+
116
+ res_dbl = ((struct_72byte(*)(struct_72byte, struct_72byte,
117
+ struct_72byte, struct_72byte))(code))(e_dbl, f_dbl, g_dbl, h_dbl);
118
+ /* { dg-output "\n22 15 17 25 6 13 19 18 16" } */
119
+ printf("res: %g %g %g %g %g %g %g %g %" PRIdLL "\n", res_dbl.a, res_dbl.b, res_dbl.c,
120
+ res_dbl.d, res_dbl.e, res_dbl.f, res_dbl.g, res_dbl.h, res_dbl.i);
121
+ /* { dg-output "\nres: 22 15 17 25 6 13 19 18 16" } */
122
+
123
+ exit(0);
124
+ }