ffi 0.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ffi might be problematic. Click here for more details.

Files changed (279) hide show
  1. data/LICENSE +51 -0
  2. data/README +0 -0
  3. data/Rakefile +90 -0
  4. data/ext/AbstractMemory.c +254 -0
  5. data/ext/AbstractMemory.h +36 -0
  6. data/ext/Buffer.c +94 -0
  7. data/ext/Callback.c +240 -0
  8. data/ext/Callback.h +47 -0
  9. data/ext/Invoker.c +269 -0
  10. data/ext/MemoryPointer.c +164 -0
  11. data/ext/MemoryPointer.h +25 -0
  12. data/ext/Platform.c +41 -0
  13. data/ext/Platform.h +23 -0
  14. data/ext/Types.c +65 -0
  15. data/ext/Types.h +51 -0
  16. data/ext/extconf.rb +13 -0
  17. data/ext/ffi.c +54 -0
  18. data/ext/ffi.mk +24 -0
  19. data/ext/libffi.darwin.mk +44 -0
  20. data/ext/libffi.mk +10 -0
  21. data/ext/libffi/ChangeLog +3243 -0
  22. data/ext/libffi/ChangeLog.libffi +347 -0
  23. data/ext/libffi/ChangeLog.libgcj +40 -0
  24. data/ext/libffi/ChangeLog.v1 +764 -0
  25. data/ext/libffi/LICENSE +21 -0
  26. data/ext/libffi/Makefile.am +177 -0
  27. data/ext/libffi/Makefile.in +1640 -0
  28. data/ext/libffi/README +328 -0
  29. data/ext/libffi/TODO +1 -0
  30. data/ext/libffi/acinclude.m4 +92 -0
  31. data/ext/libffi/aclocal.m4 +7516 -0
  32. data/ext/libffi/compile +142 -0
  33. data/ext/libffi/config.guess +1516 -0
  34. data/ext/libffi/config.sub +1626 -0
  35. data/ext/libffi/configure +24414 -0
  36. data/ext/libffi/configure.ac +365 -0
  37. data/ext/libffi/configure.host +11 -0
  38. data/ext/libffi/depcomp +584 -0
  39. data/ext/libffi/doc/libffi.info +533 -0
  40. data/ext/libffi/doc/libffi.texi +541 -0
  41. data/ext/libffi/doc/stamp-vti +4 -0
  42. data/ext/libffi/doc/version.texi +4 -0
  43. data/ext/libffi/fficonfig.h.in +160 -0
  44. data/ext/libffi/include/Makefile.am +9 -0
  45. data/ext/libffi/include/Makefile.in +422 -0
  46. data/ext/libffi/include/ffi.h.in +393 -0
  47. data/ext/libffi/include/ffi_common.h +98 -0
  48. data/ext/libffi/install-sh +323 -0
  49. data/ext/libffi/libffi.pc.in +10 -0
  50. data/ext/libffi/libtool-version +29 -0
  51. data/ext/libffi/ltcf-c.sh +861 -0
  52. data/ext/libffi/ltcf-cxx.sh +1069 -0
  53. data/ext/libffi/ltcf-gcj.sh +700 -0
  54. data/ext/libffi/ltconfig +2862 -0
  55. data/ext/libffi/ltmain.sh +6930 -0
  56. data/ext/libffi/man/Makefile.am +8 -0
  57. data/ext/libffi/man/Makefile.in +395 -0
  58. data/ext/libffi/man/ffi.3 +31 -0
  59. data/ext/libffi/man/ffi_call.3 +103 -0
  60. data/ext/libffi/man/ffi_prep_cif.3 +66 -0
  61. data/ext/libffi/mdate-sh +201 -0
  62. data/ext/libffi/missing +353 -0
  63. data/ext/libffi/mkinstalldirs +158 -0
  64. data/ext/libffi/src/alpha/ffi.c +284 -0
  65. data/ext/libffi/src/alpha/ffitarget.h +48 -0
  66. data/ext/libffi/src/alpha/osf.S +366 -0
  67. data/ext/libffi/src/arm/ffi.c +309 -0
  68. data/ext/libffi/src/arm/ffitarget.h +49 -0
  69. data/ext/libffi/src/arm/sysv.S +299 -0
  70. data/ext/libffi/src/closures.c +596 -0
  71. data/ext/libffi/src/cris/ffi.c +383 -0
  72. data/ext/libffi/src/cris/ffitarget.h +51 -0
  73. data/ext/libffi/src/cris/sysv.S +215 -0
  74. data/ext/libffi/src/debug.c +59 -0
  75. data/ext/libffi/src/dlmalloc.c +5099 -0
  76. data/ext/libffi/src/frv/eabi.S +128 -0
  77. data/ext/libffi/src/frv/ffi.c +292 -0
  78. data/ext/libffi/src/frv/ffitarget.h +61 -0
  79. data/ext/libffi/src/ia64/ffi.c +580 -0
  80. data/ext/libffi/src/ia64/ffitarget.h +50 -0
  81. data/ext/libffi/src/ia64/ia64_flags.h +40 -0
  82. data/ext/libffi/src/ia64/unix.S +560 -0
  83. data/ext/libffi/src/java_raw_api.c +359 -0
  84. data/ext/libffi/src/m32r/ffi.c +232 -0
  85. data/ext/libffi/src/m32r/ffitarget.h +48 -0
  86. data/ext/libffi/src/m32r/sysv.S +121 -0
  87. data/ext/libffi/src/m68k/ffi.c +278 -0
  88. data/ext/libffi/src/m68k/ffitarget.h +49 -0
  89. data/ext/libffi/src/m68k/sysv.S +234 -0
  90. data/ext/libffi/src/mips/ffi.c +926 -0
  91. data/ext/libffi/src/mips/ffitarget.h +202 -0
  92. data/ext/libffi/src/mips/n32.S +534 -0
  93. data/ext/libffi/src/mips/o32.S +381 -0
  94. data/ext/libffi/src/pa/ffi.c +709 -0
  95. data/ext/libffi/src/pa/ffitarget.h +77 -0
  96. data/ext/libffi/src/pa/hpux32.S +368 -0
  97. data/ext/libffi/src/pa/linux.S +357 -0
  98. data/ext/libffi/src/powerpc/aix.S +225 -0
  99. data/ext/libffi/src/powerpc/aix_closure.S +247 -0
  100. data/ext/libffi/src/powerpc/asm.h +125 -0
  101. data/ext/libffi/src/powerpc/darwin.S +245 -0
  102. data/ext/libffi/src/powerpc/darwin_closure.S +317 -0
  103. data/ext/libffi/src/powerpc/ffi.c +1429 -0
  104. data/ext/libffi/src/powerpc/ffi_darwin.c +800 -0
  105. data/ext/libffi/src/powerpc/ffitarget.h +118 -0
  106. data/ext/libffi/src/powerpc/linux64.S +187 -0
  107. data/ext/libffi/src/powerpc/linux64_closure.S +236 -0
  108. data/ext/libffi/src/powerpc/ppc_closure.S +327 -0
  109. data/ext/libffi/src/powerpc/sysv.S +230 -0
  110. data/ext/libffi/src/prep_cif.c +174 -0
  111. data/ext/libffi/src/raw_api.c +254 -0
  112. data/ext/libffi/src/s390/ffi.c +780 -0
  113. data/ext/libffi/src/s390/ffitarget.h +60 -0
  114. data/ext/libffi/src/s390/sysv.S +434 -0
  115. data/ext/libffi/src/sh/ffi.c +716 -0
  116. data/ext/libffi/src/sh/ffitarget.h +49 -0
  117. data/ext/libffi/src/sh/sysv.S +850 -0
  118. data/ext/libffi/src/sh64/ffi.c +453 -0
  119. data/ext/libffi/src/sh64/ffitarget.h +53 -0
  120. data/ext/libffi/src/sh64/sysv.S +530 -0
  121. data/ext/libffi/src/sparc/ffi.c +610 -0
  122. data/ext/libffi/src/sparc/ffitarget.h +66 -0
  123. data/ext/libffi/src/sparc/v8.S +272 -0
  124. data/ext/libffi/src/sparc/v9.S +307 -0
  125. data/ext/libffi/src/types.c +77 -0
  126. data/ext/libffi/src/x86/darwin.S +443 -0
  127. data/ext/libffi/src/x86/darwin64.S +416 -0
  128. data/ext/libffi/src/x86/ffi.c +475 -0
  129. data/ext/libffi/src/x86/ffi64.c +572 -0
  130. data/ext/libffi/src/x86/ffitarget.h +90 -0
  131. data/ext/libffi/src/x86/freebsd.S +458 -0
  132. data/ext/libffi/src/x86/sysv.S +437 -0
  133. data/ext/libffi/src/x86/unix64.S +418 -0
  134. data/ext/libffi/src/x86/win32.S +391 -0
  135. data/ext/libffi/testsuite/Makefile.am +71 -0
  136. data/ext/libffi/testsuite/Makefile.in +447 -0
  137. data/ext/libffi/testsuite/config/default.exp +1 -0
  138. data/ext/libffi/testsuite/lib/libffi-dg.exp +289 -0
  139. data/ext/libffi/testsuite/lib/target-libpath.exp +263 -0
  140. data/ext/libffi/testsuite/lib/wrapper.exp +45 -0
  141. data/ext/libffi/testsuite/libffi.call/call.exp +36 -0
  142. data/ext/libffi/testsuite/libffi.call/closure_fn0.c +97 -0
  143. data/ext/libffi/testsuite/libffi.call/closure_fn1.c +89 -0
  144. data/ext/libffi/testsuite/libffi.call/closure_fn2.c +89 -0
  145. data/ext/libffi/testsuite/libffi.call/closure_fn3.c +90 -0
  146. data/ext/libffi/testsuite/libffi.call/closure_fn4.c +97 -0
  147. data/ext/libffi/testsuite/libffi.call/closure_fn5.c +99 -0
  148. data/ext/libffi/testsuite/libffi.call/closure_fn6.c +98 -0
  149. data/ext/libffi/testsuite/libffi.call/closure_stdcall.c +72 -0
  150. data/ext/libffi/testsuite/libffi.call/cls_12byte.c +102 -0
  151. data/ext/libffi/testsuite/libffi.call/cls_16byte.c +103 -0
  152. data/ext/libffi/testsuite/libffi.call/cls_18byte.c +104 -0
  153. data/ext/libffi/testsuite/libffi.call/cls_19byte.c +110 -0
  154. data/ext/libffi/testsuite/libffi.call/cls_1_1byte.c +97 -0
  155. data/ext/libffi/testsuite/libffi.call/cls_20byte.c +99 -0
  156. data/ext/libffi/testsuite/libffi.call/cls_20byte1.c +101 -0
  157. data/ext/libffi/testsuite/libffi.call/cls_24byte.c +121 -0
  158. data/ext/libffi/testsuite/libffi.call/cls_2byte.c +98 -0
  159. data/ext/libffi/testsuite/libffi.call/cls_3_1byte.c +103 -0
  160. data/ext/libffi/testsuite/libffi.call/cls_3byte1.c +98 -0
  161. data/ext/libffi/testsuite/libffi.call/cls_3byte2.c +98 -0
  162. data/ext/libffi/testsuite/libffi.call/cls_4_1byte.c +106 -0
  163. data/ext/libffi/testsuite/libffi.call/cls_4byte.c +98 -0
  164. data/ext/libffi/testsuite/libffi.call/cls_5_1_byte.c +117 -0
  165. data/ext/libffi/testsuite/libffi.call/cls_5byte.c +106 -0
  166. data/ext/libffi/testsuite/libffi.call/cls_64byte.c +132 -0
  167. data/ext/libffi/testsuite/libffi.call/cls_6_1_byte.c +121 -0
  168. data/ext/libffi/testsuite/libffi.call/cls_6byte.c +107 -0
  169. data/ext/libffi/testsuite/libffi.call/cls_7_1_byte.c +125 -0
  170. data/ext/libffi/testsuite/libffi.call/cls_7byte.c +105 -0
  171. data/ext/libffi/testsuite/libffi.call/cls_8byte.c +96 -0
  172. data/ext/libffi/testsuite/libffi.call/cls_9byte1.c +98 -0
  173. data/ext/libffi/testsuite/libffi.call/cls_9byte2.c +99 -0
  174. data/ext/libffi/testsuite/libffi.call/cls_align_double.c +101 -0
  175. data/ext/libffi/testsuite/libffi.call/cls_align_float.c +99 -0
  176. data/ext/libffi/testsuite/libffi.call/cls_align_longdouble.c +100 -0
  177. data/ext/libffi/testsuite/libffi.call/cls_align_pointer.c +101 -0
  178. data/ext/libffi/testsuite/libffi.call/cls_align_sint16.c +99 -0
  179. data/ext/libffi/testsuite/libffi.call/cls_align_sint32.c +99 -0
  180. data/ext/libffi/testsuite/libffi.call/cls_align_sint64.c +99 -0
  181. data/ext/libffi/testsuite/libffi.call/cls_align_uint16.c +99 -0
  182. data/ext/libffi/testsuite/libffi.call/cls_align_uint32.c +99 -0
  183. data/ext/libffi/testsuite/libffi.call/cls_align_uint64.c +100 -0
  184. data/ext/libffi/testsuite/libffi.call/cls_double.c +51 -0
  185. data/ext/libffi/testsuite/libffi.call/cls_float.c +51 -0
  186. data/ext/libffi/testsuite/libffi.call/cls_multi_schar.c +82 -0
  187. data/ext/libffi/testsuite/libffi.call/cls_multi_sshort.c +82 -0
  188. data/ext/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +94 -0
  189. data/ext/libffi/testsuite/libffi.call/cls_multi_uchar.c +99 -0
  190. data/ext/libffi/testsuite/libffi.call/cls_multi_ushort.c +82 -0
  191. data/ext/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +94 -0
  192. data/ext/libffi/testsuite/libffi.call/cls_schar.c +52 -0
  193. data/ext/libffi/testsuite/libffi.call/cls_sint.c +50 -0
  194. data/ext/libffi/testsuite/libffi.call/cls_sshort.c +50 -0
  195. data/ext/libffi/testsuite/libffi.call/cls_uchar.c +50 -0
  196. data/ext/libffi/testsuite/libffi.call/cls_uint.c +51 -0
  197. data/ext/libffi/testsuite/libffi.call/cls_ulonglong.c +54 -0
  198. data/ext/libffi/testsuite/libffi.call/cls_ushort.c +51 -0
  199. data/ext/libffi/testsuite/libffi.call/ffitest.h +86 -0
  200. data/ext/libffi/testsuite/libffi.call/float.c +59 -0
  201. data/ext/libffi/testsuite/libffi.call/float1.c +58 -0
  202. data/ext/libffi/testsuite/libffi.call/float2.c +57 -0
  203. data/ext/libffi/testsuite/libffi.call/float3.c +72 -0
  204. data/ext/libffi/testsuite/libffi.call/float4.c +62 -0
  205. data/ext/libffi/testsuite/libffi.call/many.c +69 -0
  206. data/ext/libffi/testsuite/libffi.call/many_win32.c +63 -0
  207. data/ext/libffi/testsuite/libffi.call/negint.c +53 -0
  208. data/ext/libffi/testsuite/libffi.call/nested_struct.c +160 -0
  209. data/ext/libffi/testsuite/libffi.call/nested_struct1.c +169 -0
  210. data/ext/libffi/testsuite/libffi.call/nested_struct10.c +141 -0
  211. data/ext/libffi/testsuite/libffi.call/nested_struct2.c +118 -0
  212. data/ext/libffi/testsuite/libffi.call/nested_struct3.c +119 -0
  213. data/ext/libffi/testsuite/libffi.call/nested_struct4.c +119 -0
  214. data/ext/libffi/testsuite/libffi.call/nested_struct5.c +120 -0
  215. data/ext/libffi/testsuite/libffi.call/nested_struct6.c +139 -0
  216. data/ext/libffi/testsuite/libffi.call/nested_struct7.c +119 -0
  217. data/ext/libffi/testsuite/libffi.call/nested_struct8.c +139 -0
  218. data/ext/libffi/testsuite/libffi.call/nested_struct9.c +139 -0
  219. data/ext/libffi/testsuite/libffi.call/problem1.c +98 -0
  220. data/ext/libffi/testsuite/libffi.call/promotion.c +59 -0
  221. data/ext/libffi/testsuite/libffi.call/pyobjc-tc.c +114 -0
  222. data/ext/libffi/testsuite/libffi.call/return_dbl.c +35 -0
  223. data/ext/libffi/testsuite/libffi.call/return_dbl1.c +43 -0
  224. data/ext/libffi/testsuite/libffi.call/return_dbl2.c +42 -0
  225. data/ext/libffi/testsuite/libffi.call/return_fl.c +35 -0
  226. data/ext/libffi/testsuite/libffi.call/return_fl1.c +36 -0
  227. data/ext/libffi/testsuite/libffi.call/return_fl2.c +49 -0
  228. data/ext/libffi/testsuite/libffi.call/return_fl3.c +42 -0
  229. data/ext/libffi/testsuite/libffi.call/return_ldl.c +34 -0
  230. data/ext/libffi/testsuite/libffi.call/return_ll.c +41 -0
  231. data/ext/libffi/testsuite/libffi.call/return_ll1.c +42 -0
  232. data/ext/libffi/testsuite/libffi.call/return_sc.c +36 -0
  233. data/ext/libffi/testsuite/libffi.call/return_sl.c +38 -0
  234. data/ext/libffi/testsuite/libffi.call/return_uc.c +38 -0
  235. data/ext/libffi/testsuite/libffi.call/return_ul.c +38 -0
  236. data/ext/libffi/testsuite/libffi.call/strlen.c +44 -0
  237. data/ext/libffi/testsuite/libffi.call/strlen_win32.c +44 -0
  238. data/ext/libffi/testsuite/libffi.call/struct1.c +65 -0
  239. data/ext/libffi/testsuite/libffi.call/struct2.c +67 -0
  240. data/ext/libffi/testsuite/libffi.call/struct3.c +59 -0
  241. data/ext/libffi/testsuite/libffi.call/struct4.c +63 -0
  242. data/ext/libffi/testsuite/libffi.call/struct5.c +65 -0
  243. data/ext/libffi/testsuite/libffi.call/struct6.c +64 -0
  244. data/ext/libffi/testsuite/libffi.call/struct7.c +74 -0
  245. data/ext/libffi/testsuite/libffi.call/struct8.c +80 -0
  246. data/ext/libffi/testsuite/libffi.call/struct9.c +67 -0
  247. data/ext/libffi/testsuite/libffi.special/ffitestcxx.h +86 -0
  248. data/ext/libffi/testsuite/libffi.special/special.exp +38 -0
  249. data/ext/libffi/testsuite/libffi.special/unwindtest.cc +123 -0
  250. data/ext/libffi/testsuite/libffi.special/unwindtest_ffi_call.cc +53 -0
  251. data/ext/libffi/texinfo.tex +7482 -0
  252. data/ext/rbffi.h +32 -0
  253. data/lib/ffi.rb +2 -0
  254. data/lib/ffi/buffer.rb +25 -0
  255. data/lib/ffi/callback.rb +10 -0
  256. data/lib/ffi/ffi.rb +259 -0
  257. data/lib/ffi/memorypointer.rb +169 -0
  258. data/lib/ffi/platform.rb +75 -0
  259. data/lib/ffi/struct.rb +263 -0
  260. data/nbproject/Makefile-Default.mk +54 -0
  261. data/nbproject/Makefile-impl.mk +123 -0
  262. data/nbproject/configurations.xml +169 -0
  263. data/nbproject/private/configurations.xml +22 -0
  264. data/nbproject/private/private.xml +7 -0
  265. data/nbproject/project.properties +0 -0
  266. data/nbproject/project.xml +11 -0
  267. data/samples/getlogin.rb +7 -0
  268. data/samples/getpid.rb +7 -0
  269. data/samples/gettimeofday.rb +13 -0
  270. data/samples/hello.rb +7 -0
  271. data/samples/qsort.rb +20 -0
  272. data/specs/buffer_spec.rb +141 -0
  273. data/specs/callback_spec.rb +31 -0
  274. data/specs/rbx/attach_function_spec.rb +26 -0
  275. data/specs/rbx/memory_pointer_spec.rb +108 -0
  276. data/specs/rbx/spec_helper.rb +1 -0
  277. data/specs/rbx/struct_spec.rb +13 -0
  278. data/specs/spec_helper.rb +2 -0
  279. metadata +359 -0
@@ -0,0 +1,62 @@
1
+ /* Area: ffi_call
2
+ Purpose: Check denorm double value.
3
+ Limitations: none.
4
+ PR: PR26483.
5
+ Originator: From the original ffitest.c */
6
+
7
+ /* { dg-do run } */
8
+ /* { dg-options "-mieee" { target alpha*-*-* } } */
9
+
10
+ #include "ffitest.h"
11
+ #include "float.h"
12
+
13
+ typedef union
14
+ {
15
+ double d;
16
+ unsigned char c[sizeof (double)];
17
+ } value_type;
18
+
19
+ #define CANARY 0xba
20
+
21
+ static double dblit(double d)
22
+ {
23
+ return d;
24
+ }
25
+
26
+ int main (void)
27
+ {
28
+ ffi_cif cif;
29
+ ffi_type *args[MAX_ARGS];
30
+ void *values[MAX_ARGS];
31
+ double d;
32
+ value_type result[2];
33
+ unsigned int i;
34
+
35
+ args[0] = &ffi_type_double;
36
+ values[0] = &d;
37
+
38
+ /* Initialize the cif */
39
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
40
+ &ffi_type_double, args) == FFI_OK);
41
+
42
+ d = DBL_MIN / 2;
43
+
44
+ /* Put a canary in the return array. This is a regression test for
45
+ a buffer overrun. */
46
+ memset(result[1].c, CANARY, sizeof (double));
47
+
48
+ ffi_call(&cif, FFI_FN(dblit), &result[0].d, values);
49
+
50
+ /* The standard delta check doesn't work for denorms. Since we didn't do
51
+ any arithmetic, we should get the original result back, and hence an
52
+ exact check should be OK here. */
53
+
54
+ CHECK(result[0].d == dblit(d));
55
+
56
+ /* Check the canary. */
57
+ for (i = 0; i < sizeof (double); ++i)
58
+ CHECK(result[1].c[i] == CANARY);
59
+
60
+ exit(0);
61
+
62
+ }
@@ -0,0 +1,69 @@
1
+ /* Area: ffi_call
2
+ Purpose: Check return value float, with many arguments
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: From the original ffitest.c */
6
+
7
+ /* { dg-do run } */
8
+ #include "ffitest.h"
9
+
10
+ #include <float.h>
11
+
12
+ static float many(float f1,
13
+ float f2,
14
+ float f3,
15
+ float f4,
16
+ float f5,
17
+ float f6,
18
+ float f7,
19
+ float f8,
20
+ float f9,
21
+ float f10,
22
+ float f11,
23
+ float f12,
24
+ float f13)
25
+ {
26
+ #if 0
27
+ printf("%f %f %f %f %f %f %f %f %f %f %f %f %f\n",
28
+ (double) f1, (double) f2, (double) f3, (double) f4, (double) f5,
29
+ (double) f6, (double) f7, (double) f8, (double) f9, (double) f10,
30
+ (double) f11, (double) f12, (double) f13);
31
+ #endif
32
+
33
+ return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13);
34
+ }
35
+
36
+ int main (void)
37
+ {
38
+ ffi_cif cif;
39
+ ffi_type *args[13];
40
+ void *values[13];
41
+ float fa[13];
42
+ float f, ff;
43
+ int i;
44
+
45
+ for (i = 0; i < 13; i++)
46
+ {
47
+ args[i] = &ffi_type_float;
48
+ values[i] = &fa[i];
49
+ fa[i] = (float) i;
50
+ }
51
+
52
+ /* Initialize the cif */
53
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13,
54
+ &ffi_type_float, args) == FFI_OK);
55
+
56
+ ffi_call(&cif, FFI_FN(many), &f, values);
57
+
58
+ ff = many(fa[0], fa[1],
59
+ fa[2], fa[3],
60
+ fa[4], fa[5],
61
+ fa[6], fa[7],
62
+ fa[8], fa[9],
63
+ fa[10],fa[11],fa[12]);
64
+
65
+ if (f - ff < FLT_EPSILON)
66
+ exit(0);
67
+ else
68
+ abort();
69
+ }
@@ -0,0 +1,63 @@
1
+ /* Area: ffi_call
2
+ Purpose: Check stdcall many call on X86_WIN32 systems.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: From the original ffitest.c */
6
+
7
+ /* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */
8
+
9
+ #include "ffitest.h"
10
+ #include <float.h>
11
+
12
+ static float __attribute__((stdcall)) stdcall_many(float f1,
13
+ float f2,
14
+ float f3,
15
+ float f4,
16
+ float f5,
17
+ float f6,
18
+ float f7,
19
+ float f8,
20
+ float f9,
21
+ float f10,
22
+ float f11,
23
+ float f12,
24
+ float f13)
25
+ {
26
+ return ((f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13);
27
+ }
28
+
29
+ int main (void)
30
+ {
31
+ ffi_cif cif;
32
+ ffi_type *args[13];
33
+ void *values[13];
34
+ float fa[13];
35
+ float f, ff;
36
+ unsigned long ul;
37
+
38
+ for (ul = 0; ul < 13; ul++)
39
+ {
40
+ args[ul] = &ffi_type_float;
41
+ values[ul] = &fa[ul];
42
+ fa[ul] = (float) ul;
43
+ }
44
+
45
+ /* Initialize the cif */
46
+ CHECK(ffi_prep_cif(&cif, FFI_STDCALL, 13,
47
+ &ffi_type_float, args) == FFI_OK);
48
+
49
+ ff = stdcall_many(fa[0], fa[1],
50
+ fa[2], fa[3],
51
+ fa[4], fa[5],
52
+ fa[6], fa[7],
53
+ fa[8], fa[9],
54
+ fa[10], fa[11], fa[12]);
55
+
56
+ ffi_call(&cif, FFI_FN(stdcall_many), &f, values);
57
+
58
+ if (f - ff < FLT_EPSILON)
59
+ printf("stdcall many arg tests ok!\n");
60
+ else
61
+ CHECK(0);
62
+ exit(0);
63
+ }
@@ -0,0 +1,53 @@
1
+ /* Area: ffi_call
2
+ Purpose: Check that negative integers are passed correctly.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: From the original ffitest.c */
6
+
7
+ /* { dg-do run } */
8
+ /* { dg-options -O2 } */
9
+
10
+ #include "ffitest.h"
11
+
12
+ static int checking(int a, short b, signed char c)
13
+ {
14
+
15
+ return (a < 0 && b < 0 && c < 0);
16
+ }
17
+
18
+ int main (void)
19
+ {
20
+ ffi_cif cif;
21
+ ffi_type *args[MAX_ARGS];
22
+ void *values[MAX_ARGS];
23
+ ffi_arg rint;
24
+
25
+ signed int si;
26
+ signed short ss;
27
+ signed char sc;
28
+
29
+ args[0] = &ffi_type_sint;
30
+ values[0] = &si;
31
+ args[1] = &ffi_type_sshort;
32
+ values[1] = &ss;
33
+ args[2] = &ffi_type_schar;
34
+ values[2] = &sc;
35
+
36
+ /* Initialize the cif */
37
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3,
38
+ &ffi_type_sint, args) == FFI_OK);
39
+
40
+ si = -6;
41
+ ss = -12;
42
+ sc = -1;
43
+
44
+ checking (si, ss, sc);
45
+
46
+ ffi_call(&cif, FFI_FN(checking), &rint, values);
47
+
48
+ printf ("%d vs %d\n", (int)rint, checking (si, ss, sc));
49
+
50
+ CHECK(rint != 0);
51
+
52
+ exit (0);
53
+ }
@@ -0,0 +1,160 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Check structure passing with different structure size.
3
+ Contains structs as parameter of the struct itself.
4
+ Limitations: none.
5
+ PR: none.
6
+ Originator: <andreast@gcc.gnu.org> 20030828 */
7
+
8
+ /* { dg-do run } */
9
+ #include "ffitest.h"
10
+
11
+ typedef struct cls_struct_16byte1 {
12
+ double a;
13
+ float b;
14
+ int c;
15
+ } cls_struct_16byte1;
16
+
17
+ typedef struct cls_struct_16byte2 {
18
+ int ii;
19
+ double dd;
20
+ float ff;
21
+ } cls_struct_16byte2;
22
+
23
+ typedef struct cls_struct_combined {
24
+ cls_struct_16byte1 d;
25
+ cls_struct_16byte2 e;
26
+ } cls_struct_combined;
27
+
28
+ cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0,
29
+ struct cls_struct_16byte2 b1,
30
+ struct cls_struct_combined b2)
31
+ {
32
+ struct cls_struct_combined result;
33
+
34
+ result.d.a = b0.a + b1.dd + b2.d.a;
35
+ result.d.b = b0.b + b1.ff + b2.d.b;
36
+ result.d.c = b0.c + b1.ii + b2.d.c;
37
+ result.e.ii = b0.c + b1.ii + b2.e.ii;
38
+ result.e.dd = b0.a + b1.dd + b2.e.dd;
39
+ result.e.ff = b0.b + b1.ff + b2.e.ff;
40
+
41
+ printf("%g %g %d %d %g %g %g %g %d %d %g %g: %g %g %d %d %g %g\n",
42
+ b0.a, b0.b, b0.c,
43
+ b1.ii, b1.dd, b1.ff,
44
+ b2.d.a, b2.d.b, b2.d.c,
45
+ b2.e.ii, b2.e.dd, b2.e.ff,
46
+ result.d.a, result.d.b, result.d.c,
47
+ result.e.ii, result.e.dd, result.e.ff);
48
+
49
+ return result;
50
+ }
51
+
52
+ static void
53
+ cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
54
+ void* userdata __UNUSED__)
55
+ {
56
+ struct cls_struct_16byte1 b0;
57
+ struct cls_struct_16byte2 b1;
58
+ struct cls_struct_combined b2;
59
+
60
+ b0 = *(struct cls_struct_16byte1*)(args[0]);
61
+ b1 = *(struct cls_struct_16byte2*)(args[1]);
62
+ b2 = *(struct cls_struct_combined*)(args[2]);
63
+
64
+
65
+ *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2);
66
+ }
67
+
68
+ int main (void)
69
+ {
70
+ ffi_cif cif;
71
+ #ifndef USING_MMAP
72
+ static ffi_closure cl;
73
+ #endif
74
+ ffi_closure *pcl;
75
+ void* args_dbl[5];
76
+ ffi_type* cls_struct_fields[5];
77
+ ffi_type* cls_struct_fields1[5];
78
+ ffi_type* cls_struct_fields2[5];
79
+ ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
80
+ ffi_type* dbl_arg_types[5];
81
+
82
+ #ifdef USING_MMAP
83
+ pcl = allocate_mmap (sizeof(ffi_closure));
84
+ #else
85
+ pcl = &cl;
86
+ #endif
87
+
88
+ cls_struct_type.size = 0;
89
+ cls_struct_type.alignment = 0;
90
+ cls_struct_type.type = FFI_TYPE_STRUCT;
91
+ cls_struct_type.elements = cls_struct_fields;
92
+
93
+ cls_struct_type1.size = 0;
94
+ cls_struct_type1.alignment = 0;
95
+ cls_struct_type1.type = FFI_TYPE_STRUCT;
96
+ cls_struct_type1.elements = cls_struct_fields1;
97
+
98
+ cls_struct_type2.size = 0;
99
+ cls_struct_type2.alignment = 0;
100
+ cls_struct_type2.type = FFI_TYPE_STRUCT;
101
+ cls_struct_type2.elements = cls_struct_fields2;
102
+
103
+ struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6};
104
+ struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0};
105
+ struct cls_struct_combined g_dbl = {{4.0, 5.0, 6},
106
+ {3, 1.0, 8.0}};
107
+ struct cls_struct_combined res_dbl;
108
+
109
+ cls_struct_fields[0] = &ffi_type_double;
110
+ cls_struct_fields[1] = &ffi_type_float;
111
+ cls_struct_fields[2] = &ffi_type_sint;
112
+ cls_struct_fields[3] = NULL;
113
+
114
+ cls_struct_fields1[0] = &ffi_type_sint;
115
+ cls_struct_fields1[1] = &ffi_type_double;
116
+ cls_struct_fields1[2] = &ffi_type_float;
117
+ cls_struct_fields1[3] = NULL;
118
+
119
+ cls_struct_fields2[0] = &cls_struct_type;
120
+ cls_struct_fields2[1] = &cls_struct_type1;
121
+ cls_struct_fields2[2] = NULL;
122
+
123
+
124
+ dbl_arg_types[0] = &cls_struct_type;
125
+ dbl_arg_types[1] = &cls_struct_type1;
126
+ dbl_arg_types[2] = &cls_struct_type2;
127
+ dbl_arg_types[3] = NULL;
128
+
129
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &cls_struct_type2,
130
+ dbl_arg_types) == FFI_OK);
131
+
132
+ args_dbl[0] = &e_dbl;
133
+ args_dbl[1] = &f_dbl;
134
+ args_dbl[2] = &g_dbl;
135
+ args_dbl[3] = NULL;
136
+
137
+ ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl);
138
+ /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */
139
+ CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a));
140
+ CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b));
141
+ CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
142
+ CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
143
+ CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
144
+ CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
145
+
146
+ CHECK(ffi_prep_closure(pcl, &cif, cls_struct_combined_gn, NULL) == FFI_OK);
147
+
148
+ res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1,
149
+ cls_struct_16byte2,
150
+ cls_struct_combined))
151
+ (pcl))(e_dbl, f_dbl, g_dbl);
152
+ /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8: 15 10 13 10 12 13" } */
153
+ CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a));
154
+ CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b));
155
+ CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
156
+ CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
157
+ CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
158
+ CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
159
+ exit(0);
160
+ }
@@ -0,0 +1,169 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Check structure passing with different structure size.
3
+ Contains structs as parameter of the struct itself.
4
+ Limitations: none.
5
+ PR: none.
6
+ Originator: <andreast@gcc.gnu.org> 20030828 */
7
+
8
+ /* { dg-do run } */
9
+ #include "ffitest.h"
10
+
11
+ typedef struct cls_struct_16byte1 {
12
+ double a;
13
+ float b;
14
+ int c;
15
+ } cls_struct_16byte1;
16
+
17
+ typedef struct cls_struct_16byte2 {
18
+ int ii;
19
+ double dd;
20
+ float ff;
21
+ } cls_struct_16byte2;
22
+
23
+ typedef struct cls_struct_combined {
24
+ cls_struct_16byte1 d;
25
+ cls_struct_16byte2 e;
26
+ } cls_struct_combined;
27
+
28
+ cls_struct_combined cls_struct_combined_fn(struct cls_struct_16byte1 b0,
29
+ struct cls_struct_16byte2 b1,
30
+ struct cls_struct_combined b2,
31
+ struct cls_struct_16byte1 b3)
32
+ {
33
+ struct cls_struct_combined result;
34
+
35
+ result.d.a = b0.a + b1.dd + b2.d.a;
36
+ result.d.b = b0.b + b1.ff + b2.d.b;
37
+ result.d.c = b0.c + b1.ii + b2.d.c;
38
+ result.e.ii = b0.c + b1.ii + b2.e.ii;
39
+ result.e.dd = b0.a + b1.dd + b2.e.dd;
40
+ result.e.ff = b0.b + b1.ff + b2.e.ff;
41
+
42
+ printf("%g %g %d %d %g %g %g %g %d %d %g %g %g %g %d: %g %g %d %d %g %g\n",
43
+ b0.a, b0.b, b0.c,
44
+ b1.ii, b1.dd, b1.ff,
45
+ b2.d.a, b2.d.b, b2.d.c,
46
+ b2.e.ii, b2.e.dd, b2.e.ff,
47
+ b3.a, b3.b, b3.c,
48
+ result.d.a, result.d.b, result.d.c,
49
+ result.e.ii, result.e.dd, result.e.ff);
50
+
51
+ return result;
52
+ }
53
+
54
+ static void
55
+ cls_struct_combined_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
56
+ void* userdata __UNUSED__)
57
+ {
58
+ struct cls_struct_16byte1 b0;
59
+ struct cls_struct_16byte2 b1;
60
+ struct cls_struct_combined b2;
61
+ struct cls_struct_16byte1 b3;
62
+
63
+ b0 = *(struct cls_struct_16byte1*)(args[0]);
64
+ b1 = *(struct cls_struct_16byte2*)(args[1]);
65
+ b2 = *(struct cls_struct_combined*)(args[2]);
66
+ b3 = *(struct cls_struct_16byte1*)(args[3]);
67
+
68
+
69
+ *(cls_struct_combined*)resp = cls_struct_combined_fn(b0, b1, b2, b3);
70
+ }
71
+
72
+ int main (void)
73
+ {
74
+ ffi_cif cif;
75
+ #ifndef USING_MMAP
76
+ static ffi_closure cl;
77
+ #endif
78
+ ffi_closure *pcl;
79
+ void* args_dbl[5];
80
+ ffi_type* cls_struct_fields[5];
81
+ ffi_type* cls_struct_fields1[5];
82
+ ffi_type* cls_struct_fields2[5];
83
+ ffi_type cls_struct_type, cls_struct_type1, cls_struct_type2;
84
+ ffi_type* dbl_arg_types[5];
85
+
86
+ #ifdef USING_MMAP
87
+ pcl = allocate_mmap (sizeof(ffi_closure));
88
+ #else
89
+ pcl = &cl;
90
+ #endif
91
+
92
+ cls_struct_type.size = 0;
93
+ cls_struct_type.alignment = 0;
94
+ cls_struct_type.type = FFI_TYPE_STRUCT;
95
+ cls_struct_type.elements = cls_struct_fields;
96
+
97
+ cls_struct_type1.size = 0;
98
+ cls_struct_type1.alignment = 0;
99
+ cls_struct_type1.type = FFI_TYPE_STRUCT;
100
+ cls_struct_type1.elements = cls_struct_fields1;
101
+
102
+ cls_struct_type2.size = 0;
103
+ cls_struct_type2.alignment = 0;
104
+ cls_struct_type2.type = FFI_TYPE_STRUCT;
105
+ cls_struct_type2.elements = cls_struct_fields2;
106
+
107
+ struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6};
108
+ struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0};
109
+ struct cls_struct_combined g_dbl = {{4.0, 5.0, 6},
110
+ {3, 1.0, 8.0}};
111
+ struct cls_struct_16byte1 h_dbl = { 3.0, 2.0, 4};
112
+ struct cls_struct_combined res_dbl;
113
+
114
+ cls_struct_fields[0] = &ffi_type_double;
115
+ cls_struct_fields[1] = &ffi_type_float;
116
+ cls_struct_fields[2] = &ffi_type_sint;
117
+ cls_struct_fields[3] = NULL;
118
+
119
+ cls_struct_fields1[0] = &ffi_type_sint;
120
+ cls_struct_fields1[1] = &ffi_type_double;
121
+ cls_struct_fields1[2] = &ffi_type_float;
122
+ cls_struct_fields1[3] = NULL;
123
+
124
+ cls_struct_fields2[0] = &cls_struct_type;
125
+ cls_struct_fields2[1] = &cls_struct_type1;
126
+ cls_struct_fields2[2] = NULL;
127
+
128
+
129
+ dbl_arg_types[0] = &cls_struct_type;
130
+ dbl_arg_types[1] = &cls_struct_type1;
131
+ dbl_arg_types[2] = &cls_struct_type2;
132
+ dbl_arg_types[3] = &cls_struct_type;
133
+ dbl_arg_types[4] = NULL;
134
+
135
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, &cls_struct_type2,
136
+ dbl_arg_types) == FFI_OK);
137
+
138
+ args_dbl[0] = &e_dbl;
139
+ args_dbl[1] = &f_dbl;
140
+ args_dbl[2] = &g_dbl;
141
+ args_dbl[3] = &h_dbl;
142
+ args_dbl[4] = NULL;
143
+
144
+ ffi_call(&cif, FFI_FN(cls_struct_combined_fn), &res_dbl, args_dbl);
145
+ /* { dg-output "9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */
146
+ CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a));
147
+ CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b));
148
+ CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
149
+ CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
150
+ CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
151
+ CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
152
+
153
+ CHECK(ffi_prep_closure(pcl, &cif, cls_struct_combined_gn, NULL) == FFI_OK);
154
+
155
+ res_dbl = ((cls_struct_combined(*)(cls_struct_16byte1,
156
+ cls_struct_16byte2,
157
+ cls_struct_combined,
158
+ cls_struct_16byte1))
159
+ (pcl))(e_dbl, f_dbl, g_dbl, h_dbl);
160
+ /* { dg-output "\n9 2 6 1 2 3 4 5 6 3 1 8 3 2 4: 15 10 13 10 12 13" } */
161
+ CHECK( res_dbl.d.a == (e_dbl.a + f_dbl.dd + g_dbl.d.a));
162
+ CHECK( res_dbl.d.b == (e_dbl.b + f_dbl.ff + g_dbl.d.b));
163
+ CHECK( res_dbl.d.c == (e_dbl.c + f_dbl.ii + g_dbl.d.c));
164
+ CHECK( res_dbl.e.ii == (e_dbl.c + f_dbl.ii + g_dbl.e.ii));
165
+ CHECK( res_dbl.e.dd == (e_dbl.a + f_dbl.dd + g_dbl.e.dd));
166
+ CHECK( res_dbl.e.ff == (e_dbl.b + f_dbl.ff + g_dbl.e.ff));
167
+ // CHECK( 1 == 0);
168
+ exit(0);
169
+ }