OSDN Git Service

* config/default.exp, gcc.dg/cpp/cpp.exp, gcc.dg/dg.exp,
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / objc / execute / bf-common.h
1 #include <objc/encoding.h>
2
3
4 void print_ivars (Class class)
5 {
6   struct objc_ivar_list* ivars = class->ivars;
7   int i;
8
9   for (i = 0; i < ivars->ivar_count; i++) {
10     struct objc_ivar *ivar = &(ivars->ivar_list[i]);
11     printf ("ivar '%s', type '%s', offset %d\n",
12             ivar->ivar_name, ivar->ivar_type, ivar->ivar_offset);
13   }
14 }
15
16 void compare_structures (Class class, const char* type)
17 {
18   struct objc_struct_layout layout;
19   struct objc_ivar_list* ivars = class->ivars;
20   int i = 0;
21   int position;
22
23   objc_layout_structure (type, &layout);
24
25   while (objc_layout_structure_next_member (&layout))
26     {
27       struct objc_ivar *ivar;
28       const char *ivar_type;
29
30       if (i > ivars->ivar_count)
31         {
32           printf ("too many ivars in type %s, layout = %s\n",
33                   type, layout.type);
34           exit (1);
35         }
36
37       ivar = &(ivars->ivar_list[i]);
38       objc_layout_structure_get_info (&layout, &position, NULL, &ivar_type);
39       printf ("real ivar '%s' offset %d\n",
40               ivar->ivar_name, ivar->ivar_offset);
41       printf ("computed type '%s' offset %d\n", ivar_type, position);
42       if (position != ivar->ivar_offset)
43         {
44           printf ("offset %d and computed position %d don't match on ivar '%s'"
45                   " (i = %d)\n",
46                   ivar->ivar_offset, position, ivar->ivar_name, i);
47           exit (1);
48         }
49       i++;
50     }
51   
52   printf ("%d ivars checked\n", i);
53 }
54
55 int main ()
56 {
57   struct class_vars
58     {
59       @defs (MyObject);
60     };
61   int size1, size2;
62   Class class = [MyObject class];
63
64   printf ("type = %s\n", @encode (struct class_vars));
65   print_ivars (class);
66
67   compare_structures (class, @encode(struct class_vars));
68   if ((size1 = objc_sizeof_type (@encode(struct class_vars)))
69       != (size2 = sizeof (struct class_vars)))
70     {
71       printf ("sizes don't match (computed %d, exact %d)\n", size1, size2);
72       abort ();
73     }
74   
75   exit (0);
76 }