annotate libbacktrace/testlib.c @ 120:f93fa5091070

fix conv1.c
author mir3636
date Thu, 08 Mar 2018 14:53:42 +0900
parents 04ced10e8804
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* testlib.c -- test functions 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 #include <assert.h>
kono
parents:
diff changeset
34 #include <stdio.h>
kono
parents:
diff changeset
35 #include <stdlib.h>
kono
parents:
diff changeset
36 #include <string.h>
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 #include "filenames.h"
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 #include "backtrace.h"
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 #include "testlib.h"
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 /* The backtrace state. */
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 void *state;
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 /* The number of failures. */
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 int failures;
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 /* Return the base name in a path. */
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 const char *
kono
parents:
diff changeset
55 base (const char *p)
kono
parents:
diff changeset
56 {
kono
parents:
diff changeset
57 const char *last;
kono
parents:
diff changeset
58 const char *s;
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 last = NULL;
kono
parents:
diff changeset
61 for (s = p; *s != '\0'; ++s)
kono
parents:
diff changeset
62 {
kono
parents:
diff changeset
63 if (IS_DIR_SEPARATOR (*s))
kono
parents:
diff changeset
64 last = s + 1;
kono
parents:
diff changeset
65 }
kono
parents:
diff changeset
66 return last != NULL ? last : p;
kono
parents:
diff changeset
67 }
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 /* Check an entry in a struct info array. */
kono
parents:
diff changeset
70
kono
parents:
diff changeset
71 void
kono
parents:
diff changeset
72 check (const char *name, int index, const struct info *all, int want_lineno,
kono
parents:
diff changeset
73 const char *want_function, const char *want_file, int *failed)
kono
parents:
diff changeset
74 {
kono
parents:
diff changeset
75 if (*failed)
kono
parents:
diff changeset
76 return;
kono
parents:
diff changeset
77 if (all[index].filename == NULL || all[index].function == NULL)
kono
parents:
diff changeset
78 {
kono
parents:
diff changeset
79 fprintf (stderr, "%s: [%d]: missing file name or function name\n",
kono
parents:
diff changeset
80 name, index);
kono
parents:
diff changeset
81 *failed = 1;
kono
parents:
diff changeset
82 return;
kono
parents:
diff changeset
83 }
kono
parents:
diff changeset
84 if (strcmp (base (all[index].filename), want_file) != 0)
kono
parents:
diff changeset
85 {
kono
parents:
diff changeset
86 fprintf (stderr, "%s: [%d]: got %s expected %s\n", name, index,
kono
parents:
diff changeset
87 all[index].filename, want_file);
kono
parents:
diff changeset
88 *failed = 1;
kono
parents:
diff changeset
89 }
kono
parents:
diff changeset
90 if (all[index].lineno != want_lineno)
kono
parents:
diff changeset
91 {
kono
parents:
diff changeset
92 fprintf (stderr, "%s: [%d]: got %d expected %d\n", name, index,
kono
parents:
diff changeset
93 all[index].lineno, want_lineno);
kono
parents:
diff changeset
94 *failed = 1;
kono
parents:
diff changeset
95 }
kono
parents:
diff changeset
96 if (strcmp (all[index].function, want_function) != 0)
kono
parents:
diff changeset
97 {
kono
parents:
diff changeset
98 fprintf (stderr, "%s: [%d]: got %s expected %s\n", name, index,
kono
parents:
diff changeset
99 all[index].function, want_function);
kono
parents:
diff changeset
100 *failed = 1;
kono
parents:
diff changeset
101 }
kono
parents:
diff changeset
102 }
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 /* The backtrace callback function. */
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 int
kono
parents:
diff changeset
107 callback_one (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
108 const char *filename, int lineno, const char *function)
kono
parents:
diff changeset
109 {
kono
parents:
diff changeset
110 struct bdata *data = (struct bdata *) vdata;
kono
parents:
diff changeset
111 struct info *p;
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 if (data->index >= data->max)
kono
parents:
diff changeset
114 {
kono
parents:
diff changeset
115 fprintf (stderr, "callback_one: callback called too many times\n");
kono
parents:
diff changeset
116 data->failed = 1;
kono
parents:
diff changeset
117 return 1;
kono
parents:
diff changeset
118 }
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 p = &data->all[data->index];
kono
parents:
diff changeset
121 if (filename == NULL)
kono
parents:
diff changeset
122 p->filename = NULL;
kono
parents:
diff changeset
123 else
kono
parents:
diff changeset
124 {
kono
parents:
diff changeset
125 p->filename = strdup (filename);
kono
parents:
diff changeset
126 assert (p->filename != NULL);
kono
parents:
diff changeset
127 }
kono
parents:
diff changeset
128 p->lineno = lineno;
kono
parents:
diff changeset
129 if (function == NULL)
kono
parents:
diff changeset
130 p->function = NULL;
kono
parents:
diff changeset
131 else
kono
parents:
diff changeset
132 {
kono
parents:
diff changeset
133 p->function = strdup (function);
kono
parents:
diff changeset
134 assert (p->function != NULL);
kono
parents:
diff changeset
135 }
kono
parents:
diff changeset
136 ++data->index;
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 return 0;
kono
parents:
diff changeset
139 }
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 /* An error callback passed to backtrace. */
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 void
kono
parents:
diff changeset
144 error_callback_one (void *vdata, const char *msg, int errnum)
kono
parents:
diff changeset
145 {
kono
parents:
diff changeset
146 struct bdata *data = (struct bdata *) vdata;
kono
parents:
diff changeset
147
kono
parents:
diff changeset
148 fprintf (stderr, "%s", msg);
kono
parents:
diff changeset
149 if (errnum > 0)
kono
parents:
diff changeset
150 fprintf (stderr, ": %s", strerror (errnum));
kono
parents:
diff changeset
151 fprintf (stderr, "\n");
kono
parents:
diff changeset
152 data->failed = 1;
kono
parents:
diff changeset
153 }
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 /* The backtrace_simple callback function. */
kono
parents:
diff changeset
156
kono
parents:
diff changeset
157 int
kono
parents:
diff changeset
158 callback_two (void *vdata, uintptr_t pc)
kono
parents:
diff changeset
159 {
kono
parents:
diff changeset
160 struct sdata *data = (struct sdata *) vdata;
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 if (data->index >= data->max)
kono
parents:
diff changeset
163 {
kono
parents:
diff changeset
164 fprintf (stderr, "callback_two: callback called too many times\n");
kono
parents:
diff changeset
165 data->failed = 1;
kono
parents:
diff changeset
166 return 1;
kono
parents:
diff changeset
167 }
kono
parents:
diff changeset
168
kono
parents:
diff changeset
169 data->addrs[data->index] = pc;
kono
parents:
diff changeset
170 ++data->index;
kono
parents:
diff changeset
171
kono
parents:
diff changeset
172 return 0;
kono
parents:
diff changeset
173 }
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 /* An error callback passed to backtrace_simple. */
kono
parents:
diff changeset
176
kono
parents:
diff changeset
177 void
kono
parents:
diff changeset
178 error_callback_two (void *vdata, const char *msg, int errnum)
kono
parents:
diff changeset
179 {
kono
parents:
diff changeset
180 struct sdata *data = (struct sdata *) vdata;
kono
parents:
diff changeset
181
kono
parents:
diff changeset
182 fprintf (stderr, "%s", msg);
kono
parents:
diff changeset
183 if (errnum > 0)
kono
parents:
diff changeset
184 fprintf (stderr, ": %s", strerror (errnum));
kono
parents:
diff changeset
185 fprintf (stderr, "\n");
kono
parents:
diff changeset
186 data->failed = 1;
kono
parents:
diff changeset
187 }
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 /* The backtrace_syminfo callback function. */
kono
parents:
diff changeset
190
kono
parents:
diff changeset
191 void
kono
parents:
diff changeset
192 callback_three (void *vdata, uintptr_t pc ATTRIBUTE_UNUSED,
kono
parents:
diff changeset
193 const char *symname, uintptr_t symval,
kono
parents:
diff changeset
194 uintptr_t symsize)
kono
parents:
diff changeset
195 {
kono
parents:
diff changeset
196 struct symdata *data = (struct symdata *) vdata;
kono
parents:
diff changeset
197
kono
parents:
diff changeset
198 if (symname == NULL)
kono
parents:
diff changeset
199 data->name = NULL;
kono
parents:
diff changeset
200 else
kono
parents:
diff changeset
201 {
kono
parents:
diff changeset
202 data->name = strdup (symname);
kono
parents:
diff changeset
203 assert (data->name != NULL);
kono
parents:
diff changeset
204 }
kono
parents:
diff changeset
205 data->val = symval;
kono
parents:
diff changeset
206 data->size = symsize;
kono
parents:
diff changeset
207 }
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 /* The backtrace_syminfo error callback function. */
kono
parents:
diff changeset
210
kono
parents:
diff changeset
211 void
kono
parents:
diff changeset
212 error_callback_three (void *vdata, const char *msg, int errnum)
kono
parents:
diff changeset
213 {
kono
parents:
diff changeset
214 struct symdata *data = (struct symdata *) vdata;
kono
parents:
diff changeset
215
kono
parents:
diff changeset
216 fprintf (stderr, "%s", msg);
kono
parents:
diff changeset
217 if (errnum > 0)
kono
parents:
diff changeset
218 fprintf (stderr, ": %s", strerror (errnum));
kono
parents:
diff changeset
219 fprintf (stderr, "\n");
kono
parents:
diff changeset
220 data->failed = 1;
kono
parents:
diff changeset
221 }
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 /* The backtrace_create_state error callback function. */
kono
parents:
diff changeset
224
kono
parents:
diff changeset
225 void
kono
parents:
diff changeset
226 error_callback_create (void *data ATTRIBUTE_UNUSED, const char *msg,
kono
parents:
diff changeset
227 int errnum)
kono
parents:
diff changeset
228 {
kono
parents:
diff changeset
229 fprintf (stderr, "%s", msg);
kono
parents:
diff changeset
230 if (errnum > 0)
kono
parents:
diff changeset
231 fprintf (stderr, ": %s", strerror (errnum));
kono
parents:
diff changeset
232 fprintf (stderr, "\n");
kono
parents:
diff changeset
233 exit (EXIT_FAILURE);
kono
parents:
diff changeset
234 }