Remove symfile_complaints
[deliverable/binutils-gdb.git] / gdb / complaints.c
CommitLineData
c906108c 1/* Support for complaint handling during symbol reading in GDB.
b9caf505 2
e2882c85 3 Copyright (C) 1990-2018 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, but does not need to include any sort
33 of explanation. */
34 SHORT_FIRST_MESSAGE,
b9caf505
AC
35};
36
c906108c
SS
37/* Structure to manage complaints about symbol file contents. */
38
b9caf505 39struct complain
c5aa993b 40{
b9caf505
AC
41 const char *file;
42 int line;
43 const char *fmt;
44 int counter;
45 struct complain *next;
c906108c
SS
46};
47
d9170e22
AC
48/* The explanatory message that should accompany the complaint. The
49 message is in two parts - pre and post - that are printed around
50 the complaint text. */
51struct explanation
52{
53 const char *prefix;
54 const char *postfix;
55};
56
b9caf505
AC
57struct complaints
58{
59 struct complain *root;
c906108c 60
05d999b0 61 enum complaint_series series;
c906108c 62
b9caf505
AC
63 /* The explanatory messages that should accompany the complaint.
64 NOTE: cagney/2002-08-14: In a desperate attempt at being vaguely
65 i18n friendly, this is an array of two messages. When present,
d9170e22
AC
66 the PRE and POST EXPLANATION[SERIES] are used to wrap the
67 message. */
68 const struct explanation *explanation;
b9caf505 69};
c906108c 70
b9caf505 71static struct complain complaint_sentinel;
c906108c 72
b9caf505 73/* The symbol table complaint table. */
c5aa993b 74
d9170e22
AC
75static struct explanation symfile_explanations[] = {
76 { "During symbol reading, ", "." },
d9170e22
AC
77 { "", "..."},
78 { NULL, NULL }
b9caf505 79};
c906108c 80
b9caf505
AC
81static struct complaints symfile_complaint_book = {
82 &complaint_sentinel,
05d999b0 83 ISOLATED_MESSAGE,
b9caf505
AC
84 symfile_explanations
85};
c906108c 86
a0b31db1 87static struct complain * ATTRIBUTE_PRINTF (4, 0)
b9caf505
AC
88find_complaint (struct complaints *complaints, const char *file,
89 int line, const char *fmt)
90{
91 struct complain *complaint;
92
93 /* Find the complaint in the table. A more efficient search
94 algorithm (based on hash table or something) could be used. But
95 that can wait until someone shows evidence that this lookup is
96 a real bottle neck. */
97 for (complaint = complaints->root;
98 complaint != NULL;
99 complaint = complaint->next)
c906108c 100 {
b9caf505
AC
101 if (complaint->fmt == fmt
102 && complaint->file == file
103 && complaint->line == line)
104 return complaint;
c906108c 105 }
b9caf505
AC
106
107 /* Oops not seen before, fill in a new complaint. */
70ba0933 108 complaint = XNEW (struct complain);
b9caf505
AC
109 complaint->fmt = fmt;
110 complaint->file = file;
111 complaint->line = line;
112 complaint->counter = 0;
113 complaint->next = NULL;
114
115 /* File it, return it. */
116 complaint->next = complaints->root;
117 complaints->root = complaint;
118 return complaint;
119}
120
121
122/* How many complaints about a particular thing should be printed
123 before we stop whining about it? Default is no whining at all,
124 since so many systems have ill-constructed symbol files. */
125
62d7ae92 126int stop_whining = 0;
b9caf505
AC
127
128/* Print a complaint, and link the complaint block into a chain for
129 later handling. */
130
b98664d3
TT
131static void ATTRIBUTE_PRINTF (3, 0)
132vcomplaint (const char *file,
aff410f1 133 int line, const char *fmt,
b9caf505
AC
134 va_list args)
135{
b98664d3 136 struct complain *complaint = find_complaint (&symfile_complaint_book, file,
aff410f1 137 line, fmt);
b9caf505 138 enum complaint_series series;
c5504eaf 139
b9caf505 140 complaint->counter++;
c5aa993b 141 if (complaint->counter > stop_whining)
b9caf505
AC
142 return;
143
b98664d3 144 series = symfile_complaint_book.series;
b9caf505 145
77b64a49
PA
146 /* Pass 'fmt' instead of 'complaint->fmt' to printf-like callees
147 from here on, to avoid "format string is not a string literal"
148 warnings. 'fmt' is this function's printf-format parameter, so
149 the compiler can assume the passed in argument is a literal
150 string somewhere up the call chain. */
151 gdb_assert (complaint->fmt == fmt);
152
b9caf505 153 if (complaint->file != NULL)
77b64a49 154 internal_vwarning (complaint->file, complaint->line, fmt, args);
9a4105ab 155 else if (deprecated_warning_hook)
77b64a49 156 (*deprecated_warning_hook) (fmt, args);
b9caf505 157 else
c906108c 158 {
b98664d3 159 if (symfile_complaint_book.explanation == NULL)
cc3b68a5 160 /* A [v]warning() call always appends a newline. */
77b64a49 161 vwarning (fmt, args);
b9caf505
AC
162 else
163 {
55b06432 164 std::string msg = string_vprintf (fmt, args);
b9caf505 165 wrap_here ("");
43ba33c7 166 begin_line ();
3d263c1d 167 /* XXX: i18n */
d9170e22 168 fprintf_filtered (gdb_stderr, "%s%s%s",
b98664d3 169 symfile_complaint_book.explanation[series].prefix,
55b06432 170 msg.c_str (),
b98664d3 171 symfile_complaint_book.explanation[series].postfix);
43ba33c7 172 /* Force a line-break after any isolated message. */
cc3b68a5
AC
173 if (series == ISOLATED_MESSAGE)
174 /* It would be really nice to use begin_line() here.
ce2826aa 175 Unfortunately that function doesn't track GDB_STDERR and
cc3b68a5
AC
176 consequently will sometimes supress a line when it
177 shouldn't. */
178 fputs_filtered ("\n", gdb_stderr);
179 else
180 wrap_here ("");
b9caf505 181 }
c906108c 182 }
c906108c 183
b9caf505
AC
184 /* If GDB dumps core, we'd like to see the complaints first.
185 Presumably GDB will not be sending so many complaints that this
186 becomes a performance hog. */
187
6426a772 188 gdb_flush (gdb_stderr);
b9caf505
AC
189}
190
191void
b98664d3 192complaint_internal (const char *fmt, ...)
b9caf505
AC
193{
194 va_list args;
c5504eaf 195
b9caf505 196 va_start (args, fmt);
b98664d3 197 vcomplaint (NULL/*file*/, 0/*line*/, fmt, args);
b9caf505
AC
198 va_end (args);
199}
200
b9caf505
AC
201/* Clear out / initialize all complaint counters that have ever been
202 incremented. If LESS_VERBOSE is 1, be less verbose about
203 successive complaints, since the messages are appearing all
204 together during a command that is reporting a contiguous block of
4e9668d0 205 complaints (rather than being interleaved with other messages). */
c906108c
SS
206
207void
b98664d3 208clear_complaints (int less_verbose)
c906108c 209{
b9caf505 210 struct complain *p;
c906108c 211
b98664d3 212 for (p = symfile_complaint_book.root; p != NULL; p = p->next)
c906108c 213 {
c5aa993b 214 p->counter = 0;
c906108c
SS
215 }
216
b9caf505 217 if (!less_verbose)
b98664d3 218 symfile_complaint_book.series = ISOLATED_MESSAGE;
b9caf505 219 else
b98664d3 220 symfile_complaint_book.series = SHORT_FIRST_MESSAGE;
c906108c
SS
221}
222
335cca0d 223static void
08546159
AC
224complaints_show_value (struct ui_file *file, int from_tty,
225 struct cmd_list_element *cmd, const char *value)
335cca0d
AC
226{
227 fprintf_filtered (file, _("Max number of complaints about incorrect"
08546159 228 " symbols is %s.\n"),
335cca0d
AC
229 value);
230}
231
c906108c 232void
fba45db2 233_initialize_complaints (void)
c906108c 234{
aff410f1
MS
235 add_setshow_zinteger_cmd ("complaints", class_support,
236 &stop_whining, _("\
3d263c1d 237Set max number of complaints about incorrect symbols."), _("\
335cca0d 238Show max number of complaints about incorrect symbols."), NULL,
08546159 239 NULL, complaints_show_value,
b3f42336 240 &setlist, &showlist);
c906108c 241}
This page took 1.161499 seconds and 4 git commands to generate.