annotate libbacktrace/btest.c @ 121:49957f95a4d1

fix fntype
author anatofuz
date Fri, 09 Mar 2018 19:18:14 +0900
parents 04ced10e8804
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* btest.c -- Test for libbacktrace library
kono
parents:
diff changeset
2 Copyright (C) 2012-2017 Free Software Foundation, Inc.
kono
parents:
diff changeset
3 Written by Ian Lance Taylor, Google.
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 Redistribution and use in source and binary forms, with or without
kono
parents:
diff changeset
6 modification, are permitted provided that the following conditions are
kono
parents:
diff changeset
7 met:
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 (1) Redistributions of source code must retain the above copyright
kono
parents:
diff changeset
10 notice, this list of conditions and the following disclaimer.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 (2) Redistributions in binary form must reproduce the above copyright
kono
parents:
diff changeset
13 notice, this list of conditions and the following disclaimer in
kono
parents:
diff changeset
14 the documentation and/or other materials provided with the
kono
parents:
diff changeset
15 distribution.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 (3) The name of the author may not be used to
kono
parents:
diff changeset
18 endorse or promote products derived from this software without
kono
parents:
diff changeset
19 specific prior written permission.
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
kono
parents:
diff changeset
22 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
kono
parents:
diff changeset
23 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
kono
parents:
diff changeset
24 DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
kono
parents:
diff changeset
25 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
kono
parents:
diff changeset
26 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
kono
parents:
diff changeset
27 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
kono
parents:
diff changeset
28 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
kono
parents:
diff changeset
29 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
kono
parents:
diff changeset
30 IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
kono
parents:
diff changeset
31 POSSIBILITY OF SUCH DAMAGE. */
kono
parents:
diff changeset
32
kono
parents:
diff changeset
33 /* This program tests the externally visible interfaces of the
kono
parents:
diff changeset
34 libbacktrace library. */
kono
parents:
diff changeset
35
kono
parents:
diff changeset
36 #include <assert.h>
kono
parents:
diff changeset
37 #include <stdio.h>
kono
parents:
diff changeset
38 #include <stdlib.h>
kono
parents:
diff changeset
39 #include <string.h>
kono
parents:
diff changeset
40
kono
parents:
diff changeset
41 #include "filenames.h"
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 #include "backtrace.h"
kono
parents:
diff changeset
44 #include "backtrace-supported.h"
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 #include "testlib.h"
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 /* Test the backtrace function with non-inlined functions. */
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 static int test1 (void) __attribute__ ((noinline, unused));
kono
parents:
diff changeset
51 static int f2 (int) __attribute__ ((noinline));
kono
parents:
diff changeset
52 static int f3 (int, int) __attribute__ ((noinline));
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 static int
kono
parents:
diff changeset
55 test1 (void)
kono
parents:
diff changeset
56 {
kono
parents:
diff changeset
57 /* Returning a value here and elsewhere avoids a tailcall which
kono
parents:
diff changeset
58 would mess up the backtrace. */
kono
parents:
diff changeset
59 return f2 (__LINE__) + 1;
kono
parents:
diff changeset
60 }
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 static int
kono
parents:
diff changeset
63 f2 (int f1line)
kono
parents:
diff changeset
64 {
kono
parents:
diff changeset
65 return f3 (f1line, __LINE__) + 2;
kono
parents:
diff changeset
66 }
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 static int
kono
parents:
diff changeset
69 f3 (int f1line, int f2line)
kono
parents:
diff changeset
70 {
kono
parents:
diff changeset
71 struct info all[20];
kono
parents:
diff changeset
72 struct bdata data;
kono
parents:
diff changeset
73 int f3line;
kono
parents:
diff changeset
74 int i;
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 data.all = &all[0];
kono
parents:
diff changeset
77 data.index = 0;
kono
parents:
diff changeset
78 data.max = 20;
kono
parents:
diff changeset
79 data.failed = 0;
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 f3line = __LINE__ + 1;
kono
parents:
diff changeset
82 i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 if (i != 0)
kono
parents:
diff changeset
85 {
kono
parents:
diff changeset
86 fprintf (stderr, "test1: unexpected return value %d\n", i);
kono
parents:
diff changeset
87 data.failed = 1;
kono
parents:
diff changeset
88 }
kono
parents:
diff changeset
89
kono
parents:
diff changeset
90 if (data.index < 3)
kono
parents:
diff changeset
91 {
kono
parents:
diff changeset
92 fprintf (stderr,
kono
parents:
diff changeset
93 "test1: not enough frames; got %zu, expected at least 3\n",
kono
parents:
diff changeset
94 data.index);
kono
parents:
diff changeset
95 data.failed = 1;
kono
parents:
diff changeset
96 }
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 check ("test1", 0, all, f3line, "f3", "btest.c", &data.failed);
kono
parents:
diff changeset
99 check ("test1", 1, all, f2line, "f2", "btest.c", &data.failed);
kono
parents:
diff changeset
100 check ("test1", 2, all, f1line, "test1", "btest.c", &data.failed);
kono
parents:
diff changeset
101
kono
parents:
diff changeset
102 printf ("%s: backtrace_full noinline\n", data.failed ? "FAIL" : "PASS");
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 if (data.failed)
kono
parents:
diff changeset
105 ++failures;
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 return failures;
kono
parents:
diff changeset
108 }
kono
parents:
diff changeset
109
kono
parents:
diff changeset
110 /* Test the backtrace function with inlined functions. */
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 static inline int test2 (void) __attribute__ ((always_inline, unused));
kono
parents:
diff changeset
113 static inline int f12 (int) __attribute__ ((always_inline));
kono
parents:
diff changeset
114 static inline int f13 (int, int) __attribute__ ((always_inline));
kono
parents:
diff changeset
115
kono
parents:
diff changeset
116 static inline int
kono
parents:
diff changeset
117 test2 (void)
kono
parents:
diff changeset
118 {
kono
parents:
diff changeset
119 return f12 (__LINE__) + 1;
kono
parents:
diff changeset
120 }
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 static inline int
kono
parents:
diff changeset
123 f12 (int f1line)
kono
parents:
diff changeset
124 {
kono
parents:
diff changeset
125 return f13 (f1line, __LINE__) + 2;
kono
parents:
diff changeset
126 }
kono
parents:
diff changeset
127
kono
parents:
diff changeset
128 static inline int
kono
parents:
diff changeset
129 f13 (int f1line, int f2line)
kono
parents:
diff changeset
130 {
kono
parents:
diff changeset
131 struct info all[20];
kono
parents:
diff changeset
132 struct bdata data;
kono
parents:
diff changeset
133 int f3line;
kono
parents:
diff changeset
134 int i;
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 data.all = &all[0];
kono
parents:
diff changeset
137 data.index = 0;
kono
parents:
diff changeset
138 data.max = 20;
kono
parents:
diff changeset
139 data.failed = 0;
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 f3line = __LINE__ + 1;
kono
parents:
diff changeset
142 i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 if (i != 0)
kono
parents:
diff changeset
145 {
kono
parents:
diff changeset
146 fprintf (stderr, "test2: unexpected return value %d\n", i);
kono
parents:
diff changeset
147 data.failed = 1;
kono
parents:
diff changeset
148 }
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 check ("test2", 0, all, f3line, "f13", "btest.c", &data.failed);
kono
parents:
diff changeset
151 check ("test2", 1, all, f2line, "f12", "btest.c", &data.failed);
kono
parents:
diff changeset
152 check ("test2", 2, all, f1line, "test2", "btest.c", &data.failed);
kono
parents:
diff changeset
153
kono
parents:
diff changeset
154 printf ("%s: backtrace_full inline\n", data.failed ? "FAIL" : "PASS");
kono
parents:
diff changeset
155
kono
parents:
diff changeset
156 if (data.failed)
kono
parents:
diff changeset
157 ++failures;
kono
parents:
diff changeset
158
kono
parents:
diff changeset
159 return failures;
kono
parents:
diff changeset
160 }
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 /* Test the backtrace_simple function with non-inlined functions. */
kono
parents:
diff changeset
163
kono
parents:
diff changeset
164 static int test3 (void) __attribute__ ((noinline, unused));
kono
parents:
diff changeset
165 static int f22 (int) __attribute__ ((noinline));
kono
parents:
diff changeset
166 static int f23 (int, int) __attribute__ ((noinline));
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 static int
kono
parents:
diff changeset
169 test3 (void)
kono
parents:
diff changeset
170 {
kono
parents:
diff changeset
171 return f22 (__LINE__) + 1;
kono
parents:
diff changeset
172 }
kono
parents:
diff changeset
173
kono
parents:
diff changeset
174 static int
kono
parents:
diff changeset
175 f22 (int f1line)
kono
parents:
diff changeset
176 {
kono
parents:
diff changeset
177 return f23 (f1line, __LINE__) + 2;
kono
parents:
diff changeset
178 }
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 static int
kono
parents:
diff changeset
181 f23 (int f1line, int f2line)
kono
parents:
diff changeset
182 {
kono
parents:
diff changeset
183 uintptr_t addrs[20];
kono
parents:
diff changeset
184 struct sdata data;
kono
parents:
diff changeset
185 int f3line;
kono
parents:
diff changeset
186 int i;
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 data.addrs = &addrs[0];
kono
parents:
diff changeset
189 data.index = 0;
kono
parents:
diff changeset
190 data.max = 20;
kono
parents:
diff changeset
191 data.failed = 0;
kono
parents:
diff changeset
192
kono
parents:
diff changeset
193 f3line = __LINE__ + 1;
kono
parents:
diff changeset
194 i = backtrace_simple (state, 0, callback_two, error_callback_two, &data);
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 if (i != 0)
kono
parents:
diff changeset
197 {
kono
parents:
diff changeset
198 fprintf (stderr, "test3: unexpected return value %d\n", i);
kono
parents:
diff changeset
199 data.failed = 1;
kono
parents:
diff changeset
200 }
kono
parents:
diff changeset
201
kono
parents:
diff changeset
202 if (!data.failed)
kono
parents:
diff changeset
203 {
kono
parents:
diff changeset
204 struct info all[20];
kono
parents:
diff changeset
205 struct bdata bdata;
kono
parents:
diff changeset
206 int j;
kono
parents:
diff changeset
207
kono
parents:
diff changeset
208 bdata.all = &all[0];
kono
parents:
diff changeset
209 bdata.index = 0;
kono
parents:
diff changeset
210 bdata.max = 20;
kono
parents:
diff changeset
211 bdata.failed = 0;
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 for (j = 0; j < 3; ++j)
kono
parents:
diff changeset
214 {
kono
parents:
diff changeset
215 i = backtrace_pcinfo (state, addrs[j], callback_one,
kono
parents:
diff changeset
216 error_callback_one, &bdata);
kono
parents:
diff changeset
217 if (i != 0)
kono
parents:
diff changeset
218 {
kono
parents:
diff changeset
219 fprintf (stderr,
kono
parents:
diff changeset
220 ("test3: unexpected return value "
kono
parents:
diff changeset
221 "from backtrace_pcinfo %d\n"),
kono
parents:
diff changeset
222 i);
kono
parents:
diff changeset
223 bdata.failed = 1;
kono
parents:
diff changeset
224 }
kono
parents:
diff changeset
225 if (!bdata.failed && bdata.index != (size_t) (j + 1))
kono
parents:
diff changeset
226 {
kono
parents:
diff changeset
227 fprintf (stderr,
kono
parents:
diff changeset
228 ("wrong number of calls from backtrace_pcinfo "
kono
parents:
diff changeset
229 "got %u expected %d\n"),
kono
parents:
diff changeset
230 (unsigned int) bdata.index, j + 1);
kono
parents:
diff changeset
231 bdata.failed = 1;
kono
parents:
diff changeset
232 }
kono
parents:
diff changeset
233 }
kono
parents:
diff changeset
234
kono
parents:
diff changeset
235 check ("test3", 0, all, f3line, "f23", "btest.c", &bdata.failed);
kono
parents:
diff changeset
236 check ("test3", 1, all, f2line, "f22", "btest.c", &bdata.failed);
kono
parents:
diff changeset
237 check ("test3", 2, all, f1line, "test3", "btest.c", &bdata.failed);
kono
parents:
diff changeset
238
kono
parents:
diff changeset
239 if (bdata.failed)
kono
parents:
diff changeset
240 data.failed = 1;
kono
parents:
diff changeset
241
kono
parents:
diff changeset
242 for (j = 0; j < 3; ++j)
kono
parents:
diff changeset
243 {
kono
parents:
diff changeset
244 struct symdata symdata;
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 symdata.name = NULL;
kono
parents:
diff changeset
247 symdata.val = 0;
kono
parents:
diff changeset
248 symdata.size = 0;
kono
parents:
diff changeset
249 symdata.failed = 0;
kono
parents:
diff changeset
250
kono
parents:
diff changeset
251 i = backtrace_syminfo (state, addrs[j], callback_three,
kono
parents:
diff changeset
252 error_callback_three, &symdata);
kono
parents:
diff changeset
253 if (i == 0)
kono
parents:
diff changeset
254 {
kono
parents:
diff changeset
255 fprintf (stderr,
kono
parents:
diff changeset
256 ("test3: [%d]: unexpected return value "
kono
parents:
diff changeset
257 "from backtrace_syminfo %d\n"),
kono
parents:
diff changeset
258 j, i);
kono
parents:
diff changeset
259 symdata.failed = 1;
kono
parents:
diff changeset
260 }
kono
parents:
diff changeset
261
kono
parents:
diff changeset
262 if (!symdata.failed)
kono
parents:
diff changeset
263 {
kono
parents:
diff changeset
264 const char *expected;
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 switch (j)
kono
parents:
diff changeset
267 {
kono
parents:
diff changeset
268 case 0:
kono
parents:
diff changeset
269 expected = "f23";
kono
parents:
diff changeset
270 break;
kono
parents:
diff changeset
271 case 1:
kono
parents:
diff changeset
272 expected = "f22";
kono
parents:
diff changeset
273 break;
kono
parents:
diff changeset
274 case 2:
kono
parents:
diff changeset
275 expected = "test3";
kono
parents:
diff changeset
276 break;
kono
parents:
diff changeset
277 default:
kono
parents:
diff changeset
278 assert (0);
kono
parents:
diff changeset
279 }
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 if (symdata.name == NULL)
kono
parents:
diff changeset
282 {
kono
parents:
diff changeset
283 fprintf (stderr, "test3: [%d]: NULL syminfo name\n", j);
kono
parents:
diff changeset
284 symdata.failed = 1;
kono
parents:
diff changeset
285 }
kono
parents:
diff changeset
286 /* Use strncmp, not strcmp, because GCC might create a
kono
parents:
diff changeset
287 clone. */
kono
parents:
diff changeset
288 else if (strncmp (symdata.name, expected, strlen (expected))
kono
parents:
diff changeset
289 != 0)
kono
parents:
diff changeset
290 {
kono
parents:
diff changeset
291 fprintf (stderr,
kono
parents:
diff changeset
292 ("test3: [%d]: unexpected syminfo name "
kono
parents:
diff changeset
293 "got %s expected %s\n"),
kono
parents:
diff changeset
294 j, symdata.name, expected);
kono
parents:
diff changeset
295 symdata.failed = 1;
kono
parents:
diff changeset
296 }
kono
parents:
diff changeset
297 }
kono
parents:
diff changeset
298
kono
parents:
diff changeset
299 if (symdata.failed)
kono
parents:
diff changeset
300 data.failed = 1;
kono
parents:
diff changeset
301 }
kono
parents:
diff changeset
302 }
kono
parents:
diff changeset
303
kono
parents:
diff changeset
304 printf ("%s: backtrace_simple noinline\n", data.failed ? "FAIL" : "PASS");
kono
parents:
diff changeset
305
kono
parents:
diff changeset
306 if (data.failed)
kono
parents:
diff changeset
307 ++failures;
kono
parents:
diff changeset
308
kono
parents:
diff changeset
309 return failures;
kono
parents:
diff changeset
310 }
kono
parents:
diff changeset
311
kono
parents:
diff changeset
312 /* Test the backtrace_simple function with inlined functions. */
kono
parents:
diff changeset
313
kono
parents:
diff changeset
314 static inline int test4 (void) __attribute__ ((always_inline, unused));
kono
parents:
diff changeset
315 static inline int f32 (int) __attribute__ ((always_inline));
kono
parents:
diff changeset
316 static inline int f33 (int, int) __attribute__ ((always_inline));
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 static inline int
kono
parents:
diff changeset
319 test4 (void)
kono
parents:
diff changeset
320 {
kono
parents:
diff changeset
321 return f32 (__LINE__) + 1;
kono
parents:
diff changeset
322 }
kono
parents:
diff changeset
323
kono
parents:
diff changeset
324 static inline int
kono
parents:
diff changeset
325 f32 (int f1line)
kono
parents:
diff changeset
326 {
kono
parents:
diff changeset
327 return f33 (f1line, __LINE__) + 2;
kono
parents:
diff changeset
328 }
kono
parents:
diff changeset
329
kono
parents:
diff changeset
330 static inline int
kono
parents:
diff changeset
331 f33 (int f1line, int f2line)
kono
parents:
diff changeset
332 {
kono
parents:
diff changeset
333 uintptr_t addrs[20];
kono
parents:
diff changeset
334 struct sdata data;
kono
parents:
diff changeset
335 int f3line;
kono
parents:
diff changeset
336 int i;
kono
parents:
diff changeset
337
kono
parents:
diff changeset
338 data.addrs = &addrs[0];
kono
parents:
diff changeset
339 data.index = 0;
kono
parents:
diff changeset
340 data.max = 20;
kono
parents:
diff changeset
341 data.failed = 0;
kono
parents:
diff changeset
342
kono
parents:
diff changeset
343 f3line = __LINE__ + 1;
kono
parents:
diff changeset
344 i = backtrace_simple (state, 0, callback_two, error_callback_two, &data);
kono
parents:
diff changeset
345
kono
parents:
diff changeset
346 if (i != 0)
kono
parents:
diff changeset
347 {
kono
parents:
diff changeset
348 fprintf (stderr, "test3: unexpected return value %d\n", i);
kono
parents:
diff changeset
349 data.failed = 1;
kono
parents:
diff changeset
350 }
kono
parents:
diff changeset
351
kono
parents:
diff changeset
352 if (!data.failed)
kono
parents:
diff changeset
353 {
kono
parents:
diff changeset
354 struct info all[20];
kono
parents:
diff changeset
355 struct bdata bdata;
kono
parents:
diff changeset
356
kono
parents:
diff changeset
357 bdata.all = &all[0];
kono
parents:
diff changeset
358 bdata.index = 0;
kono
parents:
diff changeset
359 bdata.max = 20;
kono
parents:
diff changeset
360 bdata.failed = 0;
kono
parents:
diff changeset
361
kono
parents:
diff changeset
362 i = backtrace_pcinfo (state, addrs[0], callback_one, error_callback_one,
kono
parents:
diff changeset
363 &bdata);
kono
parents:
diff changeset
364 if (i != 0)
kono
parents:
diff changeset
365 {
kono
parents:
diff changeset
366 fprintf (stderr,
kono
parents:
diff changeset
367 ("test4: unexpected return value "
kono
parents:
diff changeset
368 "from backtrace_pcinfo %d\n"),
kono
parents:
diff changeset
369 i);
kono
parents:
diff changeset
370 bdata.failed = 1;
kono
parents:
diff changeset
371 }
kono
parents:
diff changeset
372
kono
parents:
diff changeset
373 check ("test4", 0, all, f3line, "f33", "btest.c", &bdata.failed);
kono
parents:
diff changeset
374 check ("test4", 1, all, f2line, "f32", "btest.c", &bdata.failed);
kono
parents:
diff changeset
375 check ("test4", 2, all, f1line, "test4", "btest.c", &bdata.failed);
kono
parents:
diff changeset
376
kono
parents:
diff changeset
377 if (bdata.failed)
kono
parents:
diff changeset
378 data.failed = 1;
kono
parents:
diff changeset
379 }
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 printf ("%s: backtrace_simple inline\n", data.failed ? "FAIL" : "PASS");
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383 if (data.failed)
kono
parents:
diff changeset
384 ++failures;
kono
parents:
diff changeset
385
kono
parents:
diff changeset
386 return failures;
kono
parents:
diff changeset
387 }
kono
parents:
diff changeset
388
kono
parents:
diff changeset
389 static int test5 (void) __attribute__ ((unused));
kono
parents:
diff changeset
390
kono
parents:
diff changeset
391 int global = 1;
kono
parents:
diff changeset
392
kono
parents:
diff changeset
393 static int
kono
parents:
diff changeset
394 test5 (void)
kono
parents:
diff changeset
395 {
kono
parents:
diff changeset
396 struct symdata symdata;
kono
parents:
diff changeset
397 int i;
kono
parents:
diff changeset
398 uintptr_t addr = (uintptr_t) &global;
kono
parents:
diff changeset
399
kono
parents:
diff changeset
400 if (sizeof (global) > 1)
kono
parents:
diff changeset
401 addr += 1;
kono
parents:
diff changeset
402
kono
parents:
diff changeset
403 symdata.name = NULL;
kono
parents:
diff changeset
404 symdata.val = 0;
kono
parents:
diff changeset
405 symdata.size = 0;
kono
parents:
diff changeset
406 symdata.failed = 0;
kono
parents:
diff changeset
407
kono
parents:
diff changeset
408 i = backtrace_syminfo (state, addr, callback_three,
kono
parents:
diff changeset
409 error_callback_three, &symdata);
kono
parents:
diff changeset
410 if (i == 0)
kono
parents:
diff changeset
411 {
kono
parents:
diff changeset
412 fprintf (stderr,
kono
parents:
diff changeset
413 "test5: unexpected return value from backtrace_syminfo %d\n",
kono
parents:
diff changeset
414 i);
kono
parents:
diff changeset
415 symdata.failed = 1;
kono
parents:
diff changeset
416 }
kono
parents:
diff changeset
417
kono
parents:
diff changeset
418 if (!symdata.failed)
kono
parents:
diff changeset
419 {
kono
parents:
diff changeset
420 if (symdata.name == NULL)
kono
parents:
diff changeset
421 {
kono
parents:
diff changeset
422 fprintf (stderr, "test5: NULL syminfo name\n");
kono
parents:
diff changeset
423 symdata.failed = 1;
kono
parents:
diff changeset
424 }
kono
parents:
diff changeset
425 else if (strcmp (symdata.name, "global") != 0)
kono
parents:
diff changeset
426 {
kono
parents:
diff changeset
427 fprintf (stderr,
kono
parents:
diff changeset
428 "test5: unexpected syminfo name got %s expected %s\n",
kono
parents:
diff changeset
429 symdata.name, "global");
kono
parents:
diff changeset
430 symdata.failed = 1;
kono
parents:
diff changeset
431 }
kono
parents:
diff changeset
432 else if (symdata.val != (uintptr_t) &global)
kono
parents:
diff changeset
433 {
kono
parents:
diff changeset
434 fprintf (stderr,
kono
parents:
diff changeset
435 "test5: unexpected syminfo value got %lx expected %lx\n",
kono
parents:
diff changeset
436 (unsigned long) symdata.val,
kono
parents:
diff changeset
437 (unsigned long) (uintptr_t) &global);
kono
parents:
diff changeset
438 symdata.failed = 1;
kono
parents:
diff changeset
439 }
kono
parents:
diff changeset
440 else if (symdata.size != sizeof (global))
kono
parents:
diff changeset
441 {
kono
parents:
diff changeset
442 fprintf (stderr,
kono
parents:
diff changeset
443 "test5: unexpected syminfo size got %lx expected %lx\n",
kono
parents:
diff changeset
444 (unsigned long) symdata.size,
kono
parents:
diff changeset
445 (unsigned long) sizeof (global));
kono
parents:
diff changeset
446 symdata.failed = 1;
kono
parents:
diff changeset
447 }
kono
parents:
diff changeset
448 }
kono
parents:
diff changeset
449
kono
parents:
diff changeset
450 printf ("%s: backtrace_syminfo variable\n",
kono
parents:
diff changeset
451 symdata.failed ? "FAIL" : "PASS");
kono
parents:
diff changeset
452
kono
parents:
diff changeset
453 if (symdata.failed)
kono
parents:
diff changeset
454 ++failures;
kono
parents:
diff changeset
455
kono
parents:
diff changeset
456 return failures;
kono
parents:
diff changeset
457 }
kono
parents:
diff changeset
458
kono
parents:
diff changeset
459 /* Run all the tests. */
kono
parents:
diff changeset
460
kono
parents:
diff changeset
461 int
kono
parents:
diff changeset
462 main (int argc ATTRIBUTE_UNUSED, char **argv)
kono
parents:
diff changeset
463 {
kono
parents:
diff changeset
464 state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
kono
parents:
diff changeset
465 error_callback_create, NULL);
kono
parents:
diff changeset
466
kono
parents:
diff changeset
467 #if BACKTRACE_SUPPORTED
kono
parents:
diff changeset
468 test1 ();
kono
parents:
diff changeset
469 test2 ();
kono
parents:
diff changeset
470 test3 ();
kono
parents:
diff changeset
471 test4 ();
kono
parents:
diff changeset
472 #if BACKTRACE_SUPPORTS_DATA
kono
parents:
diff changeset
473 test5 ();
kono
parents:
diff changeset
474 #endif
kono
parents:
diff changeset
475 #endif
kono
parents:
diff changeset
476
kono
parents:
diff changeset
477 exit (failures ? EXIT_FAILURE : EXIT_SUCCESS);
kono
parents:
diff changeset
478 }