X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fcomplaints.c;h=b35c81de342618c2561d6872b804f29a165a4f2b;hb=35fd2deb6916e972248d52b1bc1d584fa9059f8f;hp=3f9be14bfa882ee4b91dce189fe6fb394be8a5e7;hpb=3d263c1d0a2f82fcf209a00e029b32ac8cf8f838;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/complaints.c b/gdb/complaints.c index 3f9be14bfa..b35c81de34 100644 --- a/gdb/complaints.c +++ b/gdb/complaints.c @@ -1,13 +1,12 @@ /* Support for complaint handling during symbol reading in GDB. - Copyright 1990, 1991, 1992, 1993, 1995, 1998, 1999, 2000, 2002, - 2004 Free Software Foundation, Inc. + Copyright (C) 1990-2016 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -16,33 +15,29 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "complaints.h" -#include "gdb_assert.h" #include "command.h" #include "gdbcmd.h" extern void _initialize_complaints (void); -/* Should each complaint message be self explanatory, or should we assume that - a series of complaints is being produced? */ +/* Should each complaint message be self explanatory, or should we + assume that a series of complaints is being produced? */ -/* case 1: First message of a series that must - start off with explanation. case 2: Subsequent message of a series - that needs no explanation (the user already knows we have a problem - so we can just state our piece). */ enum complaint_series { /* Isolated self explanatory message. */ ISOLATED_MESSAGE, + /* First message of a series, includes an explanation. */ FIRST_MESSAGE, + /* First message of a series, but does not need to include any sort of explanation. */ SHORT_FIRST_MESSAGE, + /* Subsequent message of a series that needs no explanation (the user already knows we have a problem so we can just state our piece). */ @@ -73,13 +68,7 @@ struct complaints { struct complain *root; - /* Should each complaint be self explanatory, or should we assume - that a series of complaints is being produced? case 0: Isolated - self explanatory message. case 1: First message of a series that - must start off with explanation. case 2: Subsequent message of a - series that needs no explanation (the user already knows we have - a problem so we can just state our piece). */ - int series; + enum complaint_series series; /* The explanatory messages that should accompany the complaint. NOTE: cagney/2002-08-14: In a desperate attempt at being vaguely @@ -103,7 +92,7 @@ static struct explanation symfile_explanations[] = { static struct complaints symfile_complaint_book = { &complaint_sentinel, - 0, + ISOLATED_MESSAGE, symfile_explanations }; struct complaints *symfile_complaints = &symfile_complaint_book; @@ -115,14 +104,14 @@ get_complaints (struct complaints **c) { if ((*c) != NULL) return (*c); - (*c) = XMALLOC (struct complaints); + (*c) = XNEW (struct complaints); (*c)->root = &complaint_sentinel; (*c)->series = ISOLATED_MESSAGE; (*c)->explanation = NULL; return (*c); } -static struct complain * +static struct complain * ATTRIBUTE_PRINTF (4, 0) find_complaint (struct complaints *complaints, const char *file, int line, const char *fmt) { @@ -143,7 +132,7 @@ find_complaint (struct complaints *complaints, const char *file, } /* Oops not seen before, fill in a new complaint. */ - complaint = XMALLOC (struct complain); + complaint = XNEW (struct complain); complaint->fmt = fmt; complaint->file = file; complaint->line = line; @@ -161,18 +150,21 @@ find_complaint (struct complaints *complaints, const char *file, before we stop whining about it? Default is no whining at all, since so many systems have ill-constructed symbol files. */ -static unsigned int stop_whining = 0; +static int stop_whining = 0; /* Print a complaint, and link the complaint block into a chain for later handling. */ -static void -vcomplaint (struct complaints **c, const char *file, int line, const char *fmt, +static void ATTRIBUTE_PRINTF (4, 0) +vcomplaint (struct complaints **c, const char *file, + int line, const char *fmt, va_list args) { struct complaints *complaints = get_complaints (c); - struct complain *complaint = find_complaint (complaints, file, line, fmt); + struct complain *complaint = find_complaint (complaints, file, + line, fmt); enum complaint_series series; + gdb_assert (complaints != NULL); complaint->counter++; @@ -184,20 +176,27 @@ vcomplaint (struct complaints **c, const char *file, int line, const char *fmt, else series = complaints->series; + /* Pass 'fmt' instead of 'complaint->fmt' to printf-like callees + from here on, to avoid "format string is not a string literal" + warnings. 'fmt' is this function's printf-format parameter, so + the compiler can assume the passed in argument is a literal + string somewhere up the call chain. */ + gdb_assert (complaint->fmt == fmt); + if (complaint->file != NULL) - internal_vwarning (complaint->file, complaint->line, complaint->fmt, args); + internal_vwarning (complaint->file, complaint->line, fmt, args); else if (deprecated_warning_hook) - (*deprecated_warning_hook) (complaint->fmt, args); + (*deprecated_warning_hook) (fmt, args); else { if (complaints->explanation == NULL) /* A [v]warning() call always appends a newline. */ - vwarning (complaint->fmt, args); + vwarning (fmt, args); else { char *msg; struct cleanup *cleanups; - msg = xstrvprintf (complaint->fmt, args); + msg = xstrvprintf (fmt, args); cleanups = make_cleanup (xfree, msg); wrap_here (""); if (series != SUBSEQUENT_MESSAGE) @@ -245,6 +244,7 @@ void complaint (struct complaints **complaints, const char *fmt, ...) { va_list args; + va_start (args, fmt); vcomplaint (complaints, NULL/*file*/, 0/*line*/, fmt, args); va_end (args); @@ -294,7 +294,8 @@ clear_complaints (struct complaints **c, int less_verbose, int noisy) case SUBSEQUENT_MESSAGE: /* It would be really nice to use begin_line() here. Unfortunately that function doesn't track GDB_STDERR and - consequently will sometimes supress a line when it shouldn't. */ + consequently will sometimes supress a line when it + shouldn't. */ fputs_unfiltered ("\n", gdb_stderr); break; default: @@ -309,14 +310,22 @@ clear_complaints (struct complaints **c, int less_verbose, int noisy) complaints->series = SHORT_FIRST_MESSAGE; } +static void +complaints_show_value (struct ui_file *file, int from_tty, + struct cmd_list_element *cmd, const char *value) +{ + fprintf_filtered (file, _("Max number of complaints about incorrect" + " symbols is %s.\n"), + value); +} + void _initialize_complaints (void) { - add_setshow_zinteger_cmd ("complaints", class_support, &stop_whining, _("\ + add_setshow_zinteger_cmd ("complaints", class_support, + &stop_whining, _("\ Set max number of complaints about incorrect symbols."), _("\ -Show max number of complaints about incorrect symbols."), NULL, _("\ -Max number of complaints about incorrect symbols is %s."), - NULL, NULL, +Show max number of complaints about incorrect symbols."), NULL, + NULL, complaints_show_value, &setlist, &showlist); - }