annotate libffi/testsuite/libffi.call/problem1.c @ 144:8f4e72ab4e11

fix segmentation fault caused by nothing next cur_op to end
author Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sun, 23 Dec 2018 21:23:56 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Area: ffi_call, closure_call
kono
parents:
diff changeset
2 Purpose: Check structure passing with different structure size.
kono
parents:
diff changeset
3 Limitations: none.
kono
parents:
diff changeset
4 PR: none.
kono
parents:
diff changeset
5 Originator: <andreast@gcc.gnu.org> 20030828 */
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 /* { dg-do run } */
kono
parents:
diff changeset
8 #include "ffitest.h"
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 typedef struct my_ffi_struct {
kono
parents:
diff changeset
11 double a;
kono
parents:
diff changeset
12 double b;
kono
parents:
diff changeset
13 double c;
kono
parents:
diff changeset
14 } my_ffi_struct;
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 my_ffi_struct callee(struct my_ffi_struct a1, struct my_ffi_struct a2)
kono
parents:
diff changeset
17 {
kono
parents:
diff changeset
18 struct my_ffi_struct result;
kono
parents:
diff changeset
19 result.a = a1.a + a2.a;
kono
parents:
diff changeset
20 result.b = a1.b + a2.b;
kono
parents:
diff changeset
21 result.c = a1.c + a2.c;
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 printf("%g %g %g %g %g %g: %g %g %g\n", a1.a, a1.b, a1.c,
kono
parents:
diff changeset
25 a2.a, a2.b, a2.c, result.a, result.b, result.c);
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 return result;
kono
parents:
diff changeset
28 }
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 void stub(ffi_cif* cif __UNUSED__, void* resp, void** args,
kono
parents:
diff changeset
31 void* userdata __UNUSED__)
kono
parents:
diff changeset
32 {
kono
parents:
diff changeset
33 struct my_ffi_struct a1;
kono
parents:
diff changeset
34 struct my_ffi_struct a2;
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 a1 = *(struct my_ffi_struct*)(args[0]);
kono
parents:
diff changeset
37 a2 = *(struct my_ffi_struct*)(args[1]);
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 *(my_ffi_struct *)resp = callee(a1, a2);
kono
parents:
diff changeset
40 }
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 int main(void)
kono
parents:
diff changeset
44 {
kono
parents:
diff changeset
45 ffi_type* my_ffi_struct_fields[4];
kono
parents:
diff changeset
46 ffi_type my_ffi_struct_type;
kono
parents:
diff changeset
47 ffi_cif cif;
kono
parents:
diff changeset
48 void *code;
kono
parents:
diff changeset
49 ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
kono
parents:
diff changeset
50 void* args[4];
kono
parents:
diff changeset
51 ffi_type* arg_types[3];
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 struct my_ffi_struct g = { 1.0, 2.0, 3.0 };
kono
parents:
diff changeset
54 struct my_ffi_struct f = { 1.0, 2.0, 3.0 };
kono
parents:
diff changeset
55 struct my_ffi_struct res;
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 my_ffi_struct_type.size = 0;
kono
parents:
diff changeset
58 my_ffi_struct_type.alignment = 0;
kono
parents:
diff changeset
59 my_ffi_struct_type.type = FFI_TYPE_STRUCT;
kono
parents:
diff changeset
60 my_ffi_struct_type.elements = my_ffi_struct_fields;
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 my_ffi_struct_fields[0] = &ffi_type_double;
kono
parents:
diff changeset
63 my_ffi_struct_fields[1] = &ffi_type_double;
kono
parents:
diff changeset
64 my_ffi_struct_fields[2] = &ffi_type_double;
kono
parents:
diff changeset
65 my_ffi_struct_fields[3] = NULL;
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 arg_types[0] = &my_ffi_struct_type;
kono
parents:
diff changeset
68 arg_types[1] = &my_ffi_struct_type;
kono
parents:
diff changeset
69 arg_types[2] = NULL;
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &my_ffi_struct_type,
kono
parents:
diff changeset
72 arg_types) == FFI_OK);
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 args[0] = &g;
kono
parents:
diff changeset
75 args[1] = &f;
kono
parents:
diff changeset
76 args[2] = NULL;
kono
parents:
diff changeset
77 ffi_call(&cif, FFI_FN(callee), &res, args);
kono
parents:
diff changeset
78 /* { dg-output "1 2 3 1 2 3: 2 4 6" } */
kono
parents:
diff changeset
79 printf("res: %g %g %g\n", res.a, res.b, res.c);
kono
parents:
diff changeset
80 /* { dg-output "\nres: 2 4 6" } */
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 CHECK(ffi_prep_closure_loc(pcl, &cif, stub, NULL, code) == FFI_OK);
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 res = ((my_ffi_struct(*)(struct my_ffi_struct, struct my_ffi_struct))(code))(g, f);
kono
parents:
diff changeset
85 /* { dg-output "\n1 2 3 1 2 3: 2 4 6" } */
kono
parents:
diff changeset
86 printf("res: %g %g %g\n", res.a, res.b, res.c);
kono
parents:
diff changeset
87 /* { dg-output "\nres: 2 4 6" } */
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 exit(0);;
kono
parents:
diff changeset
90 }