]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/complaints.c
Remove usages of find_thread when calling need_step_over_p
[thirdparty/binutils-gdb.git] / gdb / complaints.c
CommitLineData
c906108c 1/* Support for complaint handling during symbol reading in GDB.
b9caf505 2
61baf725 3 Copyright (C) 1990-2017 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20#include "defs.h"
21#include "complaints.h"
b9caf505 22#include "command.h"
c906108c
SS
23#include "gdbcmd.h"
24
aff410f1
MS
25/* Should each complaint message be self explanatory, or should we
26 assume that a series of complaints is being produced? */
b9caf505 27
b9caf505
AC
28enum complaint_series {
29 /* Isolated self explanatory message. */
30 ISOLATED_MESSAGE,
05d999b0 31
b9caf505
AC
32 /* First message of a series, includes an explanation. */
33 FIRST_MESSAGE,
05d999b0 34
b9caf505
AC
35 /* First message of a series, but does not need to include any sort
36 of explanation. */
37 SHORT_FIRST_MESSAGE,
05d999b0 38
b9caf505
AC
39 /* Subsequent message of a series that needs no explanation (the
40 user already knows we have a problem so we can just state our
41 piece). */
42 SUBSEQUENT_MESSAGE
43};
44
c906108c
SS
45/* Structure to manage complaints about symbol file contents. */
46
b9caf505 47struct complain
c5aa993b 48{
b9caf505
AC
49 const char *file;
50 int line;
51 const char *fmt;
52 int counter;
53 struct complain *next;
c906108c
SS
54};
55
d9170e22
AC
56/* The explanatory message that should accompany the complaint. The
57 message is in two parts - pre and post - that are printed around
58 the complaint text. */
59struct explanation
60{
61 const char *prefix;
62 const char *postfix;
63};
64
b9caf505
AC
65struct complaints
66{
67 struct complain *root;
c906108c 68
05d999b0 69 enum complaint_series series;
c906108c 70
b9caf505
AC
71 /* The explanatory messages that should accompany the complaint.
72 NOTE: cagney/2002-08-14: In a desperate attempt at being vaguely
73 i18n friendly, this is an array of two messages. When present,
d9170e22
AC
74 the PRE and POST EXPLANATION[SERIES] are used to wrap the
75 message. */
76 const struct explanation *explanation;
b9caf505 77};
c906108c 78
b9caf505 79static struct complain complaint_sentinel;
c906108c 80
b9caf505 81/* The symbol table complaint table. */
c5aa993b 82
d9170e22
AC
83static struct explanation symfile_explanations[] = {
84 { "During symbol reading, ", "." },
85 { "During symbol reading...", "..."},
86 { "", "..."},
87 { "", "..."},
88 { NULL, NULL }
b9caf505 89};
c906108c 90
b9caf505
AC
91static struct complaints symfile_complaint_book = {
92 &complaint_sentinel,
05d999b0 93 ISOLATED_MESSAGE,
b9caf505
AC
94 symfile_explanations
95};
96struct complaints *symfile_complaints = &symfile_complaint_book;
c906108c 97
b9caf505
AC
98/* Wrapper function to, on-demand, fill in a complaints object. */
99
100static struct complaints *
101get_complaints (struct complaints **c)
c906108c 102{
b9caf505
AC
103 if ((*c) != NULL)
104 return (*c);
70ba0933 105 (*c) = XNEW (struct complaints);
b9caf505
AC
106 (*c)->root = &complaint_sentinel;
107 (*c)->series = ISOLATED_MESSAGE;
108 (*c)->explanation = NULL;
109 return (*c);
110}
c906108c 111
a0b31db1 112static struct complain * ATTRIBUTE_PRINTF (4, 0)
b9caf505
AC
113find_complaint (struct complaints *complaints, const char *file,
114 int line, const char *fmt)
115{
116 struct complain *complaint;
117
118 /* Find the complaint in the table. A more efficient search
119 algorithm (based on hash table or something) could be used. But
120 that can wait until someone shows evidence that this lookup is
121 a real bottle neck. */
122 for (complaint = complaints->root;
123 complaint != NULL;
124 complaint = complaint->next)
c906108c 125 {
b9caf505
AC
126 if (complaint->fmt == fmt
127 && complaint->file == file
128 && complaint->line == line)
129 return complaint;
c906108c 130 }
b9caf505
AC
131
132 /* Oops not seen before, fill in a new complaint. */
70ba0933 133 complaint = XNEW (struct complain);
b9caf505
AC
134 complaint->fmt = fmt;
135 complaint->file = file;
136 complaint->line = line;
137 complaint->counter = 0;
138 complaint->next = NULL;
139
140 /* File it, return it. */
141 complaint->next = complaints->root;
142 complaints->root = complaint;
143 return complaint;
144}
145
146
147/* How many complaints about a particular thing should be printed
148 before we stop whining about it? Default is no whining at all,
149 since so many systems have ill-constructed symbol files. */
150
62d7ae92 151int stop_whining = 0;
b9caf505
AC
152
153/* Print a complaint, and link the complaint block into a chain for
154 later handling. */
155
a0b31db1 156static void ATTRIBUTE_PRINTF (4, 0)
aff410f1
MS
157vcomplaint (struct complaints **c, const char *file,
158 int line, const char *fmt,
b9caf505
AC
159 va_list args)
160{
161 struct complaints *complaints = get_complaints (c);
aff410f1
MS
162 struct complain *complaint = find_complaint (complaints, file,
163 line, fmt);
b9caf505 164 enum complaint_series series;
c5504eaf 165
b9caf505
AC
166 gdb_assert (complaints != NULL);
167
168 complaint->counter++;
c5aa993b 169 if (complaint->counter > stop_whining)
b9caf505
AC
170 return;
171
172 if (info_verbose)
173 series = SUBSEQUENT_MESSAGE;
174 else
175 series = complaints->series;
176
77b64a49
PA
177 /* Pass 'fmt' instead of 'complaint->fmt' to printf-like callees
178 from here on, to avoid "format string is not a string literal"
179 warnings. 'fmt' is this function's printf-format parameter, so
180 the compiler can assume the passed in argument is a literal
181 string somewhere up the call chain. */
182 gdb_assert (complaint->fmt == fmt);
183
b9caf505 184 if (complaint->file != NULL)
77b64a49 185 internal_vwarning (complaint->file, complaint->line, fmt, args);
9a4105ab 186 else if (deprecated_warning_hook)
77b64a49 187 (*deprecated_warning_hook) (fmt, args);
b9caf505 188 else
c906108c 189 {
b9caf505 190 if (complaints->explanation == NULL)
cc3b68a5 191 /* A [v]warning() call always appends a newline. */
77b64a49 192 vwarning (fmt, args);
b9caf505
AC
193 else
194 {
55b06432 195 std::string msg = string_vprintf (fmt, args);
b9caf505
AC
196 wrap_here ("");
197 if (series != SUBSEQUENT_MESSAGE)
198 begin_line ();
3d263c1d 199 /* XXX: i18n */
d9170e22 200 fprintf_filtered (gdb_stderr, "%s%s%s",
55b06432
TT
201 complaints->explanation[series].prefix,
202 msg.c_str (),
d9170e22 203 complaints->explanation[series].postfix);
cc3b68a5
AC
204 /* Force a line-break after any isolated message. For the
205 other cases, clear_complaints() takes care of any missing
206 trailing newline, the wrap_here() is just a hint. */
207 if (series == ISOLATED_MESSAGE)
208 /* It would be really nice to use begin_line() here.
ce2826aa 209 Unfortunately that function doesn't track GDB_STDERR and
cc3b68a5
AC
210 consequently will sometimes supress a line when it
211 shouldn't. */
212 fputs_filtered ("\n", gdb_stderr);
213 else
214 wrap_here ("");
b9caf505 215 }
c906108c 216 }
c906108c 217
b9caf505 218 switch (series)
c906108c 219 {
b9caf505 220 case ISOLATED_MESSAGE:
c5aa993b 221 break;
b9caf505
AC
222 case FIRST_MESSAGE:
223 complaints->series = SUBSEQUENT_MESSAGE;
224 break;
225 case SUBSEQUENT_MESSAGE:
226 case SHORT_FIRST_MESSAGE:
227 complaints->series = SUBSEQUENT_MESSAGE;
c5aa993b 228 break;
c906108c 229 }
b9caf505
AC
230
231 /* If GDB dumps core, we'd like to see the complaints first.
232 Presumably GDB will not be sending so many complaints that this
233 becomes a performance hog. */
234
6426a772 235 gdb_flush (gdb_stderr);
b9caf505
AC
236}
237
238void
62d7ae92 239complaint_internal (struct complaints **complaints, const char *fmt, ...)
b9caf505
AC
240{
241 va_list args;
c5504eaf 242
b9caf505
AC
243 va_start (args, fmt);
244 vcomplaint (complaints, NULL/*file*/, 0/*line*/, fmt, args);
245 va_end (args);
246}
247
248void
249internal_complaint (struct complaints **complaints, const char *file,
250 int line, const char *fmt, ...)
251{
252 va_list args;
253 va_start (args, fmt);
254 vcomplaint (complaints, file, line, fmt, args);
255 va_end (args);
256}
257
b9caf505
AC
258/* Clear out / initialize all complaint counters that have ever been
259 incremented. If LESS_VERBOSE is 1, be less verbose about
260 successive complaints, since the messages are appearing all
261 together during a command that is reporting a contiguous block of
262 complaints (rather than being interleaved with other messages). If
263 noisy is 1, we are in a noisy command, and our caller will print
264 enough context for the user to figure it out. */
c906108c
SS
265
266void
b9caf505 267clear_complaints (struct complaints **c, int less_verbose, int noisy)
c906108c 268{
b9caf505
AC
269 struct complaints *complaints = get_complaints (c);
270 struct complain *p;
c906108c 271
b9caf505 272 for (p = complaints->root; p != NULL; p = p->next)
c906108c 273 {
c5aa993b 274 p->counter = 0;
c906108c
SS
275 }
276
cc3b68a5 277 switch (complaints->series)
c906108c 278 {
cc3b68a5
AC
279 case FIRST_MESSAGE:
280 /* Haven't yet printed anything. */
281 break;
282 case SHORT_FIRST_MESSAGE:
283 /* Haven't yet printed anything. */
284 break;
285 case ISOLATED_MESSAGE:
286 /* The code above, always forces a line-break. No need to do it
287 here. */
288 break;
289 case SUBSEQUENT_MESSAGE:
290 /* It would be really nice to use begin_line() here.
ce2826aa 291 Unfortunately that function doesn't track GDB_STDERR and
aff410f1
MS
292 consequently will sometimes supress a line when it
293 shouldn't. */
cc3b68a5
AC
294 fputs_unfiltered ("\n", gdb_stderr);
295 break;
296 default:
3d263c1d 297 internal_error (__FILE__, __LINE__, _("bad switch"));
c906108c
SS
298 }
299
b9caf505
AC
300 if (!less_verbose)
301 complaints->series = ISOLATED_MESSAGE;
302 else if (!noisy)
303 complaints->series = FIRST_MESSAGE;
304 else
305 complaints->series = SHORT_FIRST_MESSAGE;
c906108c
SS
306}
307
335cca0d 308static void
08546159
AC
309complaints_show_value (struct ui_file *file, int from_tty,
310 struct cmd_list_element *cmd, const char *value)
335cca0d
AC
311{
312 fprintf_filtered (file, _("Max number of complaints about incorrect"
08546159 313 " symbols is %s.\n"),
335cca0d
AC
314 value);
315}
316
c906108c 317void
fba45db2 318_initialize_complaints (void)
c906108c 319{
aff410f1
MS
320 add_setshow_zinteger_cmd ("complaints", class_support,
321 &stop_whining, _("\
3d263c1d 322Set max number of complaints about incorrect symbols."), _("\
335cca0d 323Show max number of complaints about incorrect symbols."), NULL,
08546159 324 NULL, complaints_show_value,
b3f42336 325 &setlist, &showlist);
c906108c 326}