• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Area:	ffi_call
2    Purpose:	Check structures.
3    Limitations:	none.
4    PR:		none.
5    Originator:	Sergei Trofimovich <slyfox@gentoo.org>
6 
7    The test originally discovered in ruby's bindings
8    for ffi in https://bugs.gentoo.org/634190  */
9 
10 /* { dg-do run } */
11 #include "ffitest.h"
12 
13 struct s {
14   int s32;
15   float f32;
16   signed char s8;
17 };
18 
make_s(void)19 struct s make_s(void) {
20   struct s r;
21   r.s32 = 0x1234;
22   r.f32 = 7.0;
23   r.s8  = 0x78;
24   return r;
25 }
26 
main()27 int main() {
28   ffi_cif cif;
29   struct s r;
30   ffi_type rtype;
31   ffi_type* s_fields[] = {
32     &ffi_type_sint,
33     &ffi_type_float,
34     &ffi_type_schar,
35     NULL,
36   };
37 
38   rtype.size      = 0;
39   rtype.alignment = 0,
40   rtype.type      = FFI_TYPE_STRUCT,
41   rtype.elements  = s_fields,
42 
43   r.s32 = 0xbad;
44   r.f32 = 999.999;
45   r.s8  = 0x51;
46 
47   // Here we emulate the following call:
48   //r = make_s();
49 
50   CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &rtype, NULL) == FFI_OK);
51   ffi_call(&cif, FFI_FN(make_s), &r, NULL);
52 
53   CHECK(r.s32 == 0x1234);
54   CHECK(r.f32 == 7.0);
55   CHECK(r.s8  == 0x78);
56   exit(0);
57 }
58