2011-02-16 Tom Tromey <tromey@redhat.com>
[platform/upstream/binutils.git] / gdb / testsuite / gdb.trace / collection.c
1 /*
2  * Test program for trace collection
3  */
4
5 /*
6  * Typedefs
7  */
8
9 typedef struct TEST_STRUCT {
10   char   memberc;
11   int    memberi;
12   float  memberf;
13   double memberd;
14 } test_struct;
15
16 typedef int test_array [4];
17
18 /* 
19  * Global variables to be collected
20  */
21
22 char         globalc;
23 int          globali;
24 float        globalf;
25 double       globald;
26 test_struct  globalstruct;
27 test_struct *globalp;
28 int          globalarr[16];
29 int          globalarr2[4];
30 int          globalarr3[4];
31
32 struct global_pieces {
33   unsigned int a;
34   unsigned int b;
35 } global_pieces =
36   {
37     0x12345678, 0x87654321
38   };
39
40 /*
41  * Additional globals used in arithmetic tests
42  */
43
44 signed char  c0,  c1,  c2,  c3,  c4,  c5,  c6,  c7, 
45              c8,  c9,  c10, c11, c12, c13, c14, c15, cminus;
46 signed short s0,  s1,  s2,  s3,  s4,  s5,  s6,  s7,
47              s8,  s9,  s10, s11, s12, s13, s14, s15, sminus;
48 signed long  l0,  l1,  l2,  l3,  l4,  l5,  l6,  l7,
49              l8,  l9,  l10, l11, l12, l13, l14, l15, lminus;
50
51
52 /*
53  * Test functions
54  */
55
56 static void begin ()    /* called before anything else */
57 {
58 }
59
60 static void end ()      /* called after everything else */
61 {
62 }
63
64 /* Test collecting args. */
65 int args_test_func (argc, argi, argf, argd, argstruct, argarray)
66      char   argc;
67      int    argi;
68      float  argf;
69      double argd;
70      test_struct argstruct;
71      int argarray[4];
72 {
73   int i;
74
75   i =  (int) argc + argi + argf + argd + argstruct.memberi + argarray[1];
76
77   return i;
78 }
79
80 /* Test collecting struct args. */
81 int argstruct_test_func (argstruct)
82      test_struct argstruct;
83 {
84   return (int) argstruct.memberc + argstruct.memberi + 
85                  argstruct.memberf + argstruct.memberd;
86 }
87
88 /* Test collecting array args. */
89 int argarray_test_func (argarray)
90      int argarray[4];
91 {
92   return (int) argarray[0] + argarray[1] + argarray[2] + argarray[3];
93 }
94
95
96
97 int local_test_func ()                  /* test collecting locals */
98 {
99   char        locc  = 11;
100   int         loci  = 12;
101   float       locf  = 13.3;
102   double      locd  = 14.4;
103   test_struct locst;
104   int         locar[4];
105   int         i;
106   struct localstruct {} locdefst;
107
108   locst.memberc  = 15;
109   locst.memberi  = 16;
110   locst.memberf  = 17.7;
111   locst.memberd  = 18.8;
112   locar[0] = 121;
113   locar[1] = 122;
114   locar[2] = 123;
115   locar[3] = 124;
116
117   i = /* Set_Tracepoint_Here */
118     (int) locc + loci + locf + locd + locst.memberi + locar[1];
119
120   return i;
121 }
122
123 int reglocal_test_func ()               /* test collecting register locals */
124 {
125   register char        locc = 11;
126   register int         loci = 12;
127   register float       locf = 13.3;
128   register double      locd = 14.4;
129   register test_struct locst;
130   register int         locar[4];
131   int                  i;
132
133   locst.memberc  = 15;
134   locst.memberi  = 16;
135   locst.memberf  = 17.7;
136   locst.memberd  = 18.8;
137   locar[0] = 121;
138   locar[1] = 122;
139   locar[2] = 123;
140   locar[3] = 124;
141
142   i = /* Set_Tracepoint_Here */
143     (int) locc + loci + locf + locd + locst.memberi + locar[1];
144
145   return i;
146 }
147
148 int statlocal_test_func ()              /* test collecting static locals */
149 {
150   static   char        locc;
151   static   int         loci;
152   static   float       locf;
153   static   double      locd;
154   static   test_struct locst;
155   static   int         locar[4];
156   int                  i;
157
158   locc = 11;
159   loci = 12;
160   locf = 13.3;
161   locd = 14.4;
162   locst.memberc = 15;
163   locst.memberi = 16;
164   locst.memberf = 17.7;
165   locst.memberd = 18.8;
166   locar[0] = 121;
167   locar[1] = 122;
168   locar[2] = 123;
169   locar[3] = 124;
170
171   i = /* Set_Tracepoint_Here */
172     (int) locc + loci + locf + locd + locst.memberi + locar[1];
173
174   /* Set static locals back to zero so collected values are clearly special. */
175   locc = 0;
176   loci = 0;
177   locf = 0;
178   locd = 0;
179   locst.memberc = 0;
180   locst.memberi = 0;
181   locst.memberf = 0;
182   locst.memberd = 0;
183   locar[0] = 0;
184   locar[1] = 0;
185   locar[2] = 0;
186   locar[3] = 0;
187
188   return i;
189 }
190
191
192 int globals_test_func ()
193 {
194   int i = 0;
195
196   i += globalc + globali + globalf + globald;
197   i += globalstruct.memberc + globalstruct.memberi;
198   i += globalstruct.memberf + globalstruct.memberd;
199   i += globalarr[1];
200
201   return i;     /* Set_Tracepoint_Here */
202 }
203
204 int
205 main (argc, argv, envp)
206      int argc;
207      char *argv[], **envp;
208 {
209   int         i = 0;
210   test_struct mystruct;
211   int         myarray[4];
212
213 #ifdef usestubs
214   set_debug_traps ();
215   breakpoint ();
216 #endif
217
218   begin ();
219   /* Assign collectable values to global variables. */
220   l0  = s0  = c0  = 0;     l1  = s1  = c1  = 1;
221   l2  = s2  = c2  = 2;     l3  = s3  = c3  = 3;
222   l4  = s4  = c4  = 4;     l5  = s5  = c5  = 5;
223   l6  = s6  = c6  = 6;     l7  = s7  = c7  = 7;
224   l8  = s8  = c8  = 8;     l9  = s9  = c9  = 9;
225   l10 = s10 = c10 = 10;    l11 = s11 = c11 = 11;
226   l12 = s12 = c12 = 12;    l13 = s13 = c13 = 13;
227   l14 = s14 = c14 = 14;    l15 = s15 = c15 = 15;
228   lminus = sminus = cminus = -2;
229   globalc = 71;
230   globali = 72;
231   globalf = 73.3;
232   globald = 74.4;
233   globalstruct.memberc = 81;
234   globalstruct.memberi = 82;
235   globalstruct.memberf = 83.3;
236   globalstruct.memberd = 84.4;
237   globalp = &globalstruct;
238
239   for (i = 0; i < 15; i++)
240     globalarr[i] = i;
241
242   for (i = 0; i < 4; i++)
243     globalarr2[i] = i;
244
245   for (i = 0; i < 4; i++)
246     globalarr3[3 - i] = i;
247
248   mystruct.memberc = 101;
249   mystruct.memberi = 102;
250   mystruct.memberf = 103.3;
251   mystruct.memberd = 104.4;
252   myarray[0] = 111;
253   myarray[1] = 112;
254   myarray[2] = 113;
255   myarray[3] = 114;
256
257   /* Call test functions, so they can be traced and data collected.  */
258   i = 0;
259   i += args_test_func (1, 2, 3.3, 4.4, mystruct, myarray);
260   i += argstruct_test_func (mystruct);
261   i += argarray_test_func (myarray);
262   i += local_test_func ();
263   i += reglocal_test_func ();
264   i += statlocal_test_func ();
265   i += globals_test_func ();
266
267   /* Values of globals at end of test should be different from
268      values that they had when trace data was captured.  */
269
270   l0  = s0  = c0  = 0;     l1  = s1  = c1  = 0;
271   l2  = s2  = c2  = 0;     l3  = s3  = c3  = 0;
272   l4  = s4  = c4  = 0;     l5  = s5  = c5  = 0;
273   l6  = s6  = c6  = 0;     l7  = s7  = c7  = 0;
274   l8  = s8  = c8  = 0;     l9  = s9  = c9  = 0;
275   l10 = s10 = c10 = 0;     l11 = s11 = c11 = 0;
276   l12 = s12 = c12 = 0;     l13 = s13 = c13 = 0;
277   l14 = s14 = c14 = 0;     l15 = s15 = c15 = 0;
278   lminus = sminus = cminus = 0;
279
280   /* Set 'em back to zero, so that the collected values will be
281      distinctly different from the "realtime" (end of test) values.  */
282
283   globalc = 0;
284   globali = 0;
285   globalf = 0;
286   globald = 0;
287   globalstruct.memberc = 0;
288   globalstruct.memberi = 0;
289   globalstruct.memberf = 0;
290   globalstruct.memberd = 0;
291   globalp = 0;
292   for (i = 0; i < 15; i++)
293     globalarr[i] = 0;
294   for (i = 0; i < 4; i++)
295     globalarr2[i] = 0;
296   for (i = 0; i < 4; i++)
297     globalarr3[i] = 0;
298
299   end ();
300   return 0;
301 }