annotate libbacktrace/btest.c @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
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
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2012-2020 Free Software Foundation, Inc.
111
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>
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
40 #include <unistd.h>
111
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 #include "filenames.h"
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 #include "backtrace.h"
kono
parents:
diff changeset
45 #include "backtrace-supported.h"
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 #include "testlib.h"
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 /* Test the backtrace function with non-inlined functions. */
kono
parents:
diff changeset
50
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
51 static int test1 (void) __attribute__ ((noinline, noclone, unused));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
52 static int f2 (int) __attribute__ ((noinline, noclone));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
53 static int f3 (int, int) __attribute__ ((noinline, noclone));
111
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 static int
kono
parents:
diff changeset
56 test1 (void)
kono
parents:
diff changeset
57 {
kono
parents:
diff changeset
58 /* Returning a value here and elsewhere avoids a tailcall which
kono
parents:
diff changeset
59 would mess up the backtrace. */
kono
parents:
diff changeset
60 return f2 (__LINE__) + 1;
kono
parents:
diff changeset
61 }
kono
parents:
diff changeset
62
kono
parents:
diff changeset
63 static int
kono
parents:
diff changeset
64 f2 (int f1line)
kono
parents:
diff changeset
65 {
kono
parents:
diff changeset
66 return f3 (f1line, __LINE__) + 2;
kono
parents:
diff changeset
67 }
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 static int
kono
parents:
diff changeset
70 f3 (int f1line, int f2line)
kono
parents:
diff changeset
71 {
kono
parents:
diff changeset
72 struct info all[20];
kono
parents:
diff changeset
73 struct bdata data;
kono
parents:
diff changeset
74 int f3line;
kono
parents:
diff changeset
75 int i;
kono
parents:
diff changeset
76
kono
parents:
diff changeset
77 data.all = &all[0];
kono
parents:
diff changeset
78 data.index = 0;
kono
parents:
diff changeset
79 data.max = 20;
kono
parents:
diff changeset
80 data.failed = 0;
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 f3line = __LINE__ + 1;
kono
parents:
diff changeset
83 i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 if (i != 0)
kono
parents:
diff changeset
86 {
kono
parents:
diff changeset
87 fprintf (stderr, "test1: unexpected return value %d\n", i);
kono
parents:
diff changeset
88 data.failed = 1;
kono
parents:
diff changeset
89 }
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 if (data.index < 3)
kono
parents:
diff changeset
92 {
kono
parents:
diff changeset
93 fprintf (stderr,
kono
parents:
diff changeset
94 "test1: not enough frames; got %zu, expected at least 3\n",
kono
parents:
diff changeset
95 data.index);
kono
parents:
diff changeset
96 data.failed = 1;
kono
parents:
diff changeset
97 }
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 check ("test1", 0, all, f3line, "f3", "btest.c", &data.failed);
kono
parents:
diff changeset
100 check ("test1", 1, all, f2line, "f2", "btest.c", &data.failed);
kono
parents:
diff changeset
101 check ("test1", 2, all, f1line, "test1", "btest.c", &data.failed);
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 printf ("%s: backtrace_full noinline\n", data.failed ? "FAIL" : "PASS");
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 if (data.failed)
kono
parents:
diff changeset
106 ++failures;
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 return failures;
kono
parents:
diff changeset
109 }
kono
parents:
diff changeset
110
kono
parents:
diff changeset
111 /* Test the backtrace function with inlined functions. */
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 static inline int test2 (void) __attribute__ ((always_inline, unused));
kono
parents:
diff changeset
114 static inline int f12 (int) __attribute__ ((always_inline));
kono
parents:
diff changeset
115 static inline int f13 (int, int) __attribute__ ((always_inline));
kono
parents:
diff changeset
116
kono
parents:
diff changeset
117 static inline int
kono
parents:
diff changeset
118 test2 (void)
kono
parents:
diff changeset
119 {
kono
parents:
diff changeset
120 return f12 (__LINE__) + 1;
kono
parents:
diff changeset
121 }
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 static inline int
kono
parents:
diff changeset
124 f12 (int f1line)
kono
parents:
diff changeset
125 {
kono
parents:
diff changeset
126 return f13 (f1line, __LINE__) + 2;
kono
parents:
diff changeset
127 }
kono
parents:
diff changeset
128
kono
parents:
diff changeset
129 static inline int
kono
parents:
diff changeset
130 f13 (int f1line, int f2line)
kono
parents:
diff changeset
131 {
kono
parents:
diff changeset
132 struct info all[20];
kono
parents:
diff changeset
133 struct bdata data;
kono
parents:
diff changeset
134 int f3line;
kono
parents:
diff changeset
135 int i;
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 data.all = &all[0];
kono
parents:
diff changeset
138 data.index = 0;
kono
parents:
diff changeset
139 data.max = 20;
kono
parents:
diff changeset
140 data.failed = 0;
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 f3line = __LINE__ + 1;
kono
parents:
diff changeset
143 i = backtrace_full (state, 0, callback_one, error_callback_one, &data);
kono
parents:
diff changeset
144
kono
parents:
diff changeset
145 if (i != 0)
kono
parents:
diff changeset
146 {
kono
parents:
diff changeset
147 fprintf (stderr, "test2: unexpected return value %d\n", i);
kono
parents:
diff changeset
148 data.failed = 1;
kono
parents:
diff changeset
149 }
kono
parents:
diff changeset
150
kono
parents:
diff changeset
151 check ("test2", 0, all, f3line, "f13", "btest.c", &data.failed);
kono
parents:
diff changeset
152 check ("test2", 1, all, f2line, "f12", "btest.c", &data.failed);
kono
parents:
diff changeset
153 check ("test2", 2, all, f1line, "test2", "btest.c", &data.failed);
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 printf ("%s: backtrace_full inline\n", data.failed ? "FAIL" : "PASS");
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 if (data.failed)
kono
parents:
diff changeset
158 ++failures;
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 return failures;
kono
parents:
diff changeset
161 }
kono
parents:
diff changeset
162
kono
parents:
diff changeset
163 /* Test the backtrace_simple function with non-inlined functions. */
kono
parents:
diff changeset
164
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
165 static int test3 (void) __attribute__ ((noinline, noclone, unused));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
166 static int f22 (int) __attribute__ ((noinline, noclone));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
167 static int f23 (int, int) __attribute__ ((noinline, noclone));
111
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 static int
kono
parents:
diff changeset
170 test3 (void)
kono
parents:
diff changeset
171 {
kono
parents:
diff changeset
172 return f22 (__LINE__) + 1;
kono
parents:
diff changeset
173 }
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 static int
kono
parents:
diff changeset
176 f22 (int f1line)
kono
parents:
diff changeset
177 {
kono
parents:
diff changeset
178 return f23 (f1line, __LINE__) + 2;
kono
parents:
diff changeset
179 }
kono
parents:
diff changeset
180
kono
parents:
diff changeset
181 static int
kono
parents:
diff changeset
182 f23 (int f1line, int f2line)
kono
parents:
diff changeset
183 {
kono
parents:
diff changeset
184 uintptr_t addrs[20];
kono
parents:
diff changeset
185 struct sdata data;
kono
parents:
diff changeset
186 int f3line;
kono
parents:
diff changeset
187 int i;
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 data.addrs = &addrs[0];
kono
parents:
diff changeset
190 data.index = 0;
kono
parents:
diff changeset
191 data.max = 20;
kono
parents:
diff changeset
192 data.failed = 0;
kono
parents:
diff changeset
193
kono
parents:
diff changeset
194 f3line = __LINE__ + 1;
kono
parents:
diff changeset
195 i = backtrace_simple (state, 0, callback_two, error_callback_two, &data);
kono
parents:
diff changeset
196
kono
parents:
diff changeset
197 if (i != 0)
kono
parents:
diff changeset
198 {
kono
parents:
diff changeset
199 fprintf (stderr, "test3: unexpected return value %d\n", i);
kono
parents:
diff changeset
200 data.failed = 1;
kono
parents:
diff changeset
201 }
kono
parents:
diff changeset
202
kono
parents:
diff changeset
203 if (!data.failed)
kono
parents:
diff changeset
204 {
kono
parents:
diff changeset
205 struct info all[20];
kono
parents:
diff changeset
206 struct bdata bdata;
kono
parents:
diff changeset
207 int j;
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 bdata.all = &all[0];
kono
parents:
diff changeset
210 bdata.index = 0;
kono
parents:
diff changeset
211 bdata.max = 20;
kono
parents:
diff changeset
212 bdata.failed = 0;
kono
parents:
diff changeset
213
kono
parents:
diff changeset
214 for (j = 0; j < 3; ++j)
kono
parents:
diff changeset
215 {
kono
parents:
diff changeset
216 i = backtrace_pcinfo (state, addrs[j], callback_one,
kono
parents:
diff changeset
217 error_callback_one, &bdata);
kono
parents:
diff changeset
218 if (i != 0)
kono
parents:
diff changeset
219 {
kono
parents:
diff changeset
220 fprintf (stderr,
kono
parents:
diff changeset
221 ("test3: unexpected return value "
kono
parents:
diff changeset
222 "from backtrace_pcinfo %d\n"),
kono
parents:
diff changeset
223 i);
kono
parents:
diff changeset
224 bdata.failed = 1;
kono
parents:
diff changeset
225 }
kono
parents:
diff changeset
226 if (!bdata.failed && bdata.index != (size_t) (j + 1))
kono
parents:
diff changeset
227 {
kono
parents:
diff changeset
228 fprintf (stderr,
kono
parents:
diff changeset
229 ("wrong number of calls from backtrace_pcinfo "
kono
parents:
diff changeset
230 "got %u expected %d\n"),
kono
parents:
diff changeset
231 (unsigned int) bdata.index, j + 1);
kono
parents:
diff changeset
232 bdata.failed = 1;
kono
parents:
diff changeset
233 }
kono
parents:
diff changeset
234 }
kono
parents:
diff changeset
235
kono
parents:
diff changeset
236 check ("test3", 0, all, f3line, "f23", "btest.c", &bdata.failed);
kono
parents:
diff changeset
237 check ("test3", 1, all, f2line, "f22", "btest.c", &bdata.failed);
kono
parents:
diff changeset
238 check ("test3", 2, all, f1line, "test3", "btest.c", &bdata.failed);
kono
parents:
diff changeset
239
kono
parents:
diff changeset
240 if (bdata.failed)
kono
parents:
diff changeset
241 data.failed = 1;
kono
parents:
diff changeset
242
kono
parents:
diff changeset
243 for (j = 0; j < 3; ++j)
kono
parents:
diff changeset
244 {
kono
parents:
diff changeset
245 struct symdata symdata;
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 symdata.name = NULL;
kono
parents:
diff changeset
248 symdata.val = 0;
kono
parents:
diff changeset
249 symdata.size = 0;
kono
parents:
diff changeset
250 symdata.failed = 0;
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 i = backtrace_syminfo (state, addrs[j], callback_three,
kono
parents:
diff changeset
253 error_callback_three, &symdata);
kono
parents:
diff changeset
254 if (i == 0)
kono
parents:
diff changeset
255 {
kono
parents:
diff changeset
256 fprintf (stderr,
kono
parents:
diff changeset
257 ("test3: [%d]: unexpected return value "
kono
parents:
diff changeset
258 "from backtrace_syminfo %d\n"),
kono
parents:
diff changeset
259 j, i);
kono
parents:
diff changeset
260 symdata.failed = 1;
kono
parents:
diff changeset
261 }
kono
parents:
diff changeset
262
kono
parents:
diff changeset
263 if (!symdata.failed)
kono
parents:
diff changeset
264 {
kono
parents:
diff changeset
265 const char *expected;
kono
parents:
diff changeset
266
kono
parents:
diff changeset
267 switch (j)
kono
parents:
diff changeset
268 {
kono
parents:
diff changeset
269 case 0:
kono
parents:
diff changeset
270 expected = "f23";
kono
parents:
diff changeset
271 break;
kono
parents:
diff changeset
272 case 1:
kono
parents:
diff changeset
273 expected = "f22";
kono
parents:
diff changeset
274 break;
kono
parents:
diff changeset
275 case 2:
kono
parents:
diff changeset
276 expected = "test3";
kono
parents:
diff changeset
277 break;
kono
parents:
diff changeset
278 default:
kono
parents:
diff changeset
279 assert (0);
kono
parents:
diff changeset
280 }
kono
parents:
diff changeset
281
kono
parents:
diff changeset
282 if (symdata.name == NULL)
kono
parents:
diff changeset
283 {
kono
parents:
diff changeset
284 fprintf (stderr, "test3: [%d]: NULL syminfo name\n", j);
kono
parents:
diff changeset
285 symdata.failed = 1;
kono
parents:
diff changeset
286 }
kono
parents:
diff changeset
287 /* Use strncmp, not strcmp, because GCC might create a
kono
parents:
diff changeset
288 clone. */
kono
parents:
diff changeset
289 else if (strncmp (symdata.name, expected, strlen (expected))
kono
parents:
diff changeset
290 != 0)
kono
parents:
diff changeset
291 {
kono
parents:
diff changeset
292 fprintf (stderr,
kono
parents:
diff changeset
293 ("test3: [%d]: unexpected syminfo name "
kono
parents:
diff changeset
294 "got %s expected %s\n"),
kono
parents:
diff changeset
295 j, symdata.name, expected);
kono
parents:
diff changeset
296 symdata.failed = 1;
kono
parents:
diff changeset
297 }
kono
parents:
diff changeset
298 }
kono
parents:
diff changeset
299
kono
parents:
diff changeset
300 if (symdata.failed)
kono
parents:
diff changeset
301 data.failed = 1;
kono
parents:
diff changeset
302 }
kono
parents:
diff changeset
303 }
kono
parents:
diff changeset
304
kono
parents:
diff changeset
305 printf ("%s: backtrace_simple noinline\n", data.failed ? "FAIL" : "PASS");
kono
parents:
diff changeset
306
kono
parents:
diff changeset
307 if (data.failed)
kono
parents:
diff changeset
308 ++failures;
kono
parents:
diff changeset
309
kono
parents:
diff changeset
310 return failures;
kono
parents:
diff changeset
311 }
kono
parents:
diff changeset
312
kono
parents:
diff changeset
313 /* Test the backtrace_simple function with inlined functions. */
kono
parents:
diff changeset
314
kono
parents:
diff changeset
315 static inline int test4 (void) __attribute__ ((always_inline, unused));
kono
parents:
diff changeset
316 static inline int f32 (int) __attribute__ ((always_inline));
kono
parents:
diff changeset
317 static inline int f33 (int, int) __attribute__ ((always_inline));
kono
parents:
diff changeset
318
kono
parents:
diff changeset
319 static inline int
kono
parents:
diff changeset
320 test4 (void)
kono
parents:
diff changeset
321 {
kono
parents:
diff changeset
322 return f32 (__LINE__) + 1;
kono
parents:
diff changeset
323 }
kono
parents:
diff changeset
324
kono
parents:
diff changeset
325 static inline int
kono
parents:
diff changeset
326 f32 (int f1line)
kono
parents:
diff changeset
327 {
kono
parents:
diff changeset
328 return f33 (f1line, __LINE__) + 2;
kono
parents:
diff changeset
329 }
kono
parents:
diff changeset
330
kono
parents:
diff changeset
331 static inline int
kono
parents:
diff changeset
332 f33 (int f1line, int f2line)
kono
parents:
diff changeset
333 {
kono
parents:
diff changeset
334 uintptr_t addrs[20];
kono
parents:
diff changeset
335 struct sdata data;
kono
parents:
diff changeset
336 int f3line;
kono
parents:
diff changeset
337 int i;
kono
parents:
diff changeset
338
kono
parents:
diff changeset
339 data.addrs = &addrs[0];
kono
parents:
diff changeset
340 data.index = 0;
kono
parents:
diff changeset
341 data.max = 20;
kono
parents:
diff changeset
342 data.failed = 0;
kono
parents:
diff changeset
343
kono
parents:
diff changeset
344 f3line = __LINE__ + 1;
kono
parents:
diff changeset
345 i = backtrace_simple (state, 0, callback_two, error_callback_two, &data);
kono
parents:
diff changeset
346
kono
parents:
diff changeset
347 if (i != 0)
kono
parents:
diff changeset
348 {
kono
parents:
diff changeset
349 fprintf (stderr, "test3: unexpected return value %d\n", i);
kono
parents:
diff changeset
350 data.failed = 1;
kono
parents:
diff changeset
351 }
kono
parents:
diff changeset
352
kono
parents:
diff changeset
353 if (!data.failed)
kono
parents:
diff changeset
354 {
kono
parents:
diff changeset
355 struct info all[20];
kono
parents:
diff changeset
356 struct bdata bdata;
kono
parents:
diff changeset
357
kono
parents:
diff changeset
358 bdata.all = &all[0];
kono
parents:
diff changeset
359 bdata.index = 0;
kono
parents:
diff changeset
360 bdata.max = 20;
kono
parents:
diff changeset
361 bdata.failed = 0;
kono
parents:
diff changeset
362
kono
parents:
diff changeset
363 i = backtrace_pcinfo (state, addrs[0], callback_one, error_callback_one,
kono
parents:
diff changeset
364 &bdata);
kono
parents:
diff changeset
365 if (i != 0)
kono
parents:
diff changeset
366 {
kono
parents:
diff changeset
367 fprintf (stderr,
kono
parents:
diff changeset
368 ("test4: unexpected return value "
kono
parents:
diff changeset
369 "from backtrace_pcinfo %d\n"),
kono
parents:
diff changeset
370 i);
kono
parents:
diff changeset
371 bdata.failed = 1;
kono
parents:
diff changeset
372 }
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 check ("test4", 0, all, f3line, "f33", "btest.c", &bdata.failed);
kono
parents:
diff changeset
375 check ("test4", 1, all, f2line, "f32", "btest.c", &bdata.failed);
kono
parents:
diff changeset
376 check ("test4", 2, all, f1line, "test4", "btest.c", &bdata.failed);
kono
parents:
diff changeset
377
kono
parents:
diff changeset
378 if (bdata.failed)
kono
parents:
diff changeset
379 data.failed = 1;
kono
parents:
diff changeset
380 }
kono
parents:
diff changeset
381
kono
parents:
diff changeset
382 printf ("%s: backtrace_simple inline\n", data.failed ? "FAIL" : "PASS");
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 if (data.failed)
kono
parents:
diff changeset
385 ++failures;
kono
parents:
diff changeset
386
kono
parents:
diff changeset
387 return failures;
kono
parents:
diff changeset
388 }
kono
parents:
diff changeset
389
kono
parents:
diff changeset
390 static int test5 (void) __attribute__ ((unused));
kono
parents:
diff changeset
391
kono
parents:
diff changeset
392 int global = 1;
kono
parents:
diff changeset
393
kono
parents:
diff changeset
394 static int
kono
parents:
diff changeset
395 test5 (void)
kono
parents:
diff changeset
396 {
kono
parents:
diff changeset
397 struct symdata symdata;
kono
parents:
diff changeset
398 int i;
kono
parents:
diff changeset
399 uintptr_t addr = (uintptr_t) &global;
kono
parents:
diff changeset
400
kono
parents:
diff changeset
401 if (sizeof (global) > 1)
kono
parents:
diff changeset
402 addr += 1;
kono
parents:
diff changeset
403
kono
parents:
diff changeset
404 symdata.name = NULL;
kono
parents:
diff changeset
405 symdata.val = 0;
kono
parents:
diff changeset
406 symdata.size = 0;
kono
parents:
diff changeset
407 symdata.failed = 0;
kono
parents:
diff changeset
408
kono
parents:
diff changeset
409 i = backtrace_syminfo (state, addr, callback_three,
kono
parents:
diff changeset
410 error_callback_three, &symdata);
kono
parents:
diff changeset
411 if (i == 0)
kono
parents:
diff changeset
412 {
kono
parents:
diff changeset
413 fprintf (stderr,
kono
parents:
diff changeset
414 "test5: unexpected return value from backtrace_syminfo %d\n",
kono
parents:
diff changeset
415 i);
kono
parents:
diff changeset
416 symdata.failed = 1;
kono
parents:
diff changeset
417 }
kono
parents:
diff changeset
418
kono
parents:
diff changeset
419 if (!symdata.failed)
kono
parents:
diff changeset
420 {
kono
parents:
diff changeset
421 if (symdata.name == NULL)
kono
parents:
diff changeset
422 {
kono
parents:
diff changeset
423 fprintf (stderr, "test5: NULL syminfo name\n");
kono
parents:
diff changeset
424 symdata.failed = 1;
kono
parents:
diff changeset
425 }
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
426 else if (!(strncmp (symdata.name, "global", 6) == 0
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
427 && (symdata.name[6] == '\0'|| symdata.name[6] == '.')))
111
kono
parents:
diff changeset
428 {
kono
parents:
diff changeset
429 fprintf (stderr,
kono
parents:
diff changeset
430 "test5: unexpected syminfo name got %s expected %s\n",
kono
parents:
diff changeset
431 symdata.name, "global");
kono
parents:
diff changeset
432 symdata.failed = 1;
kono
parents:
diff changeset
433 }
kono
parents:
diff changeset
434 else if (symdata.val != (uintptr_t) &global)
kono
parents:
diff changeset
435 {
kono
parents:
diff changeset
436 fprintf (stderr,
kono
parents:
diff changeset
437 "test5: unexpected syminfo value got %lx expected %lx\n",
kono
parents:
diff changeset
438 (unsigned long) symdata.val,
kono
parents:
diff changeset
439 (unsigned long) (uintptr_t) &global);
kono
parents:
diff changeset
440 symdata.failed = 1;
kono
parents:
diff changeset
441 }
kono
parents:
diff changeset
442 else if (symdata.size != sizeof (global))
kono
parents:
diff changeset
443 {
kono
parents:
diff changeset
444 fprintf (stderr,
kono
parents:
diff changeset
445 "test5: unexpected syminfo size got %lx expected %lx\n",
kono
parents:
diff changeset
446 (unsigned long) symdata.size,
kono
parents:
diff changeset
447 (unsigned long) sizeof (global));
kono
parents:
diff changeset
448 symdata.failed = 1;
kono
parents:
diff changeset
449 }
kono
parents:
diff changeset
450 }
kono
parents:
diff changeset
451
kono
parents:
diff changeset
452 printf ("%s: backtrace_syminfo variable\n",
kono
parents:
diff changeset
453 symdata.failed ? "FAIL" : "PASS");
kono
parents:
diff changeset
454
kono
parents:
diff changeset
455 if (symdata.failed)
kono
parents:
diff changeset
456 ++failures;
kono
parents:
diff changeset
457
kono
parents:
diff changeset
458 return failures;
kono
parents:
diff changeset
459 }
kono
parents:
diff changeset
460
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
461 /* Check that are no files left open. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
462
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
463 static void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
464 check_open_files (void)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
465 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
466 int i;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
467
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
468 for (i = 3; i < 10; i++)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
469 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
470 if (close (i) == 0)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
471 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
472 fprintf (stderr,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
473 "ERROR: descriptor %d still open after tests complete\n",
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
474 i);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
475 ++failures;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
476 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
477 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
478 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
479
111
kono
parents:
diff changeset
480 /* Run all the tests. */
kono
parents:
diff changeset
481
kono
parents:
diff changeset
482 int
kono
parents:
diff changeset
483 main (int argc ATTRIBUTE_UNUSED, char **argv)
kono
parents:
diff changeset
484 {
kono
parents:
diff changeset
485 state = backtrace_create_state (argv[0], BACKTRACE_SUPPORTS_THREADS,
kono
parents:
diff changeset
486 error_callback_create, NULL);
kono
parents:
diff changeset
487
kono
parents:
diff changeset
488 #if BACKTRACE_SUPPORTED
kono
parents:
diff changeset
489 test1 ();
kono
parents:
diff changeset
490 test2 ();
kono
parents:
diff changeset
491 test3 ();
kono
parents:
diff changeset
492 test4 ();
kono
parents:
diff changeset
493 #if BACKTRACE_SUPPORTS_DATA
kono
parents:
diff changeset
494 test5 ();
kono
parents:
diff changeset
495 #endif
kono
parents:
diff changeset
496 #endif
kono
parents:
diff changeset
497
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
498 check_open_files ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
499
111
kono
parents:
diff changeset
500 exit (failures ? EXIT_FAILURE : EXIT_SUCCESS);
kono
parents:
diff changeset
501 }