b98664d386
The complaint system seems to allow for multiple different complaint topics. However, in practice only symfile_complaints has ever been defined. Seeing that complaints.c dates to 1992, and that no new complaints have been added in the intervening years, I think it is reasonable to admit that complaints are specifically related to debuginfo reading. This patch removes symfile_complaints and updates all the callers. Some of these spots should perhaps be calls to warning instead, but I did not make that change. gdb/ChangeLog 2018-05-23 Tom Tromey <tom@tromey.com> * complaints.c (symfile_complaints): Remove. (complaint_internal): Remove "complaints" parameter. (clear_complaints, vcomplaint): Remove "c" parameter. (get_complaints): Remove. * dwarf2read.c (dwarf2_statement_list_fits_in_line_number_section_complaint) (dwarf2_debug_line_missing_file_complaint) (dwarf2_debug_line_missing_end_sequence_complaint) (dwarf2_complex_location_expr_complaint) (dwarf2_const_value_length_mismatch_complaint) (dwarf2_section_buffer_overflow_complaint) (dwarf2_macro_malformed_definition_complaint) (dwarf2_invalid_attrib_class_complaint) (create_addrmap_from_index, dw2_symtab_iter_next) (dw2_expand_marked_cus) (dw2_debug_names_iterator::find_vec_in_debug_names) (dw2_debug_names_iterator::next, dw2_debug_names_iterator::next) (create_debug_type_hash_table, init_cutu_and_read_dies) (partial_die_parent_scope, add_partial_enumeration) (skip_one_die, fixup_go_packaging, quirk_rust_enum, process_die) (dwarf2_compute_name, dwarf2_physname, read_namespace_alias) (read_import_statement, read_file_scope, create_dwo_cu_reader) (create_cus_hash_table, create_dwp_hash_table) (inherit_abstract_dies, read_func_scope, read_call_site_scope) (dwarf2_rnglists_process, dwarf2_ranges_process) (dwarf2_add_type_defn, dwarf2_attach_fields_to_type) (dwarf2_add_member_fn, get_alignment, maybe_set_alignment) (handle_struct_member_die, process_structure_scope) (read_array_type, read_common_block, read_module_type) (read_tag_pointer_type, read_typedef, read_base_type) (read_subrange_type, load_partial_dies, partial_die_info::read) (partial_die_info::read, partial_die_info::read) (partial_die_info::read, read_checked_initial_length_and_offset) (dwarf2_string_attr, read_formatted_entries) (dwarf_decode_line_header) (lnp_state_machine::check_line_address, dwarf_decode_lines_1) (new_symbol, dwarf2_const_value_attr, lookup_die_type) (read_type_die_1, determine_prefix, dwarf2_get_ref_die_offset) (dwarf2_get_attr_constant_value, dwarf2_fetch_constant_bytes) (get_signatured_type, get_DW_AT_signature_type) (decode_locdesc, file_file_name, consume_improper_spaces) (skip_form_bytes, skip_unknown_opcode, dwarf_parse_macro_header) (dwarf_decode_macro_bytes, dwarf_decode_macros) (dwarf2_symbol_mark_computed, set_die_type) (read_attribute_value): Update. * stap-probe.c (handle_stap_probe, get_stap_base_address): Update. * dbxread.c (unknown_symtype_complaint) (lbrac_mismatch_complaint, repeated_header_complaint) (set_namestring, function_outside_compilation_unit_complaint) (read_dbx_symtab, process_one_symbol): Update. * gdbtypes.c (stub_noname_complaint): Update. * windows-nat.c (handle_unload_dll): Update. * coffread.c (coff_symtab_read, enter_linenos, decode_type) (decode_base_type): Update. * xcoffread.c (bf_notfound_complaint, ef_complaint) (eb_complaint, record_include_begin, record_include_end) (enter_line_range, xcoff_next_symbol_text, read_xcoff_symtab) (process_xcoff_symbol, read_symbol) (function_outside_compilation_unit_complaint) (scan_xcoff_symtab): Update. * machoread.c (macho_symtab_read, macho_add_oso_symfile): Update. * buildsym.c (finish_block_internal, make_blockvector) (end_symtab_get_static_block, augment_type_symtab): Update. * dtrace-probe.c (dtrace_process_dof) (dtrace_static_probe_ops::get_probes): Update. * complaints.h (struct complaint): Don't declare. (symfile_complaints): Remove. (complaint_internal): Remove "complaints" parameter. (complaint): Likewise. (clear_complaints): Likewise. * symfile.c (syms_from_objfile_1, finish_new_objfile) (reread_symbols): Update. * dwarf2-frame.c (dwarf2_restore_rule, execute_cfa_program) (dwarf2_frame_cache, decode_frame_entry): Update. * dwarf2loc.c (dwarf_reg_to_regnum): Update. * objc-lang.c (lookup_objc_class, lookup_child_selector) (info_selectors_command): Update. * macrotab.c (macro_include, check_for_redefinition) (macro_undef): Update. * objfiles.c (filter_overlapping_sections): Update. * stabsread.c (invalid_cpp_abbrev_complaint) (reg_value_complaint, stabs_general_complaint, dbx_lookup_type) (define_symbol, error_type, read_type, rs6000_builtin_type) (stabs_method_name_from_physname, read_member_functions) (read_cpp_abbrev, read_baseclasses, read_tilde_fields) (attach_fields_to_type, complain_about_struct_wipeout) (read_range_type, read_args, common_block_start) (common_block_end, cleanup_undefined_types_1, scan_file_globals): Update. * mdebugread.c (index_complaint, unknown_ext_complaint) (basic_type_complaint, bad_tag_guess_complaint) (bad_rfd_entry_complaint, unexpected_type_code_complaint) (reg_value_complaint, parse_symbol, parse_type, upgrade_type) (parse_procedure, parse_lines) (function_outside_compilation_unit_complaint) (parse_partial_symbols, psymtab_to_symtab_1, cross_ref) (bad_tag_guess_complaint, reg_value_complaint): Update. * cp-support.c (demangled_name_complaint): Update. * macroscope.c (sal_macro_scope): Update. * dwarf-index-write.c (class debug_names): Update. gdb/testsuite/ChangeLog 2018-05-23 Tom Tromey <tom@tromey.com> * gdb.gdb/complaints.exp (test_initial_complaints): Don't mention symfile_complaints. (test_short_complaints): Likewise. (test_empty_complaints): Likewise. (test_initial_complaints): Update.
242 lines
6.8 KiB
C
242 lines
6.8 KiB
C
/* Support for complaint handling during symbol reading in GDB.
|
|
|
|
Copyright (C) 1990-2018 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 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
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, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#include "defs.h"
|
|
#include "complaints.h"
|
|
#include "command.h"
|
|
#include "gdbcmd.h"
|
|
|
|
/* Should each complaint message be self explanatory, or should we
|
|
assume that a series of complaints is being produced? */
|
|
|
|
enum complaint_series {
|
|
/* Isolated self explanatory message. */
|
|
ISOLATED_MESSAGE,
|
|
|
|
/* First message of a series, but does not need to include any sort
|
|
of explanation. */
|
|
SHORT_FIRST_MESSAGE,
|
|
};
|
|
|
|
/* Structure to manage complaints about symbol file contents. */
|
|
|
|
struct complain
|
|
{
|
|
const char *file;
|
|
int line;
|
|
const char *fmt;
|
|
int counter;
|
|
struct complain *next;
|
|
};
|
|
|
|
/* The explanatory message that should accompany the complaint. The
|
|
message is in two parts - pre and post - that are printed around
|
|
the complaint text. */
|
|
struct explanation
|
|
{
|
|
const char *prefix;
|
|
const char *postfix;
|
|
};
|
|
|
|
struct complaints
|
|
{
|
|
struct complain *root;
|
|
|
|
enum complaint_series series;
|
|
|
|
/* The explanatory messages that should accompany the complaint.
|
|
NOTE: cagney/2002-08-14: In a desperate attempt at being vaguely
|
|
i18n friendly, this is an array of two messages. When present,
|
|
the PRE and POST EXPLANATION[SERIES] are used to wrap the
|
|
message. */
|
|
const struct explanation *explanation;
|
|
};
|
|
|
|
static struct complain complaint_sentinel;
|
|
|
|
/* The symbol table complaint table. */
|
|
|
|
static struct explanation symfile_explanations[] = {
|
|
{ "During symbol reading, ", "." },
|
|
{ "", "..."},
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
static struct complaints symfile_complaint_book = {
|
|
&complaint_sentinel,
|
|
ISOLATED_MESSAGE,
|
|
symfile_explanations
|
|
};
|
|
|
|
static struct complain * ATTRIBUTE_PRINTF (4, 0)
|
|
find_complaint (struct complaints *complaints, const char *file,
|
|
int line, const char *fmt)
|
|
{
|
|
struct complain *complaint;
|
|
|
|
/* Find the complaint in the table. A more efficient search
|
|
algorithm (based on hash table or something) could be used. But
|
|
that can wait until someone shows evidence that this lookup is
|
|
a real bottle neck. */
|
|
for (complaint = complaints->root;
|
|
complaint != NULL;
|
|
complaint = complaint->next)
|
|
{
|
|
if (complaint->fmt == fmt
|
|
&& complaint->file == file
|
|
&& complaint->line == line)
|
|
return complaint;
|
|
}
|
|
|
|
/* Oops not seen before, fill in a new complaint. */
|
|
complaint = XNEW (struct complain);
|
|
complaint->fmt = fmt;
|
|
complaint->file = file;
|
|
complaint->line = line;
|
|
complaint->counter = 0;
|
|
complaint->next = NULL;
|
|
|
|
/* File it, return it. */
|
|
complaint->next = complaints->root;
|
|
complaints->root = complaint;
|
|
return complaint;
|
|
}
|
|
|
|
|
|
/* How many complaints about a particular thing should be printed
|
|
before we stop whining about it? Default is no whining at all,
|
|
since so many systems have ill-constructed symbol files. */
|
|
|
|
int stop_whining = 0;
|
|
|
|
/* Print a complaint, and link the complaint block into a chain for
|
|
later handling. */
|
|
|
|
static void ATTRIBUTE_PRINTF (3, 0)
|
|
vcomplaint (const char *file,
|
|
int line, const char *fmt,
|
|
va_list args)
|
|
{
|
|
struct complain *complaint = find_complaint (&symfile_complaint_book, file,
|
|
line, fmt);
|
|
enum complaint_series series;
|
|
|
|
complaint->counter++;
|
|
if (complaint->counter > stop_whining)
|
|
return;
|
|
|
|
series = symfile_complaint_book.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, fmt, args);
|
|
else if (deprecated_warning_hook)
|
|
(*deprecated_warning_hook) (fmt, args);
|
|
else
|
|
{
|
|
if (symfile_complaint_book.explanation == NULL)
|
|
/* A [v]warning() call always appends a newline. */
|
|
vwarning (fmt, args);
|
|
else
|
|
{
|
|
std::string msg = string_vprintf (fmt, args);
|
|
wrap_here ("");
|
|
begin_line ();
|
|
/* XXX: i18n */
|
|
fprintf_filtered (gdb_stderr, "%s%s%s",
|
|
symfile_complaint_book.explanation[series].prefix,
|
|
msg.c_str (),
|
|
symfile_complaint_book.explanation[series].postfix);
|
|
/* Force a line-break after any isolated message. */
|
|
if (series == ISOLATED_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. */
|
|
fputs_filtered ("\n", gdb_stderr);
|
|
else
|
|
wrap_here ("");
|
|
}
|
|
}
|
|
|
|
/* If GDB dumps core, we'd like to see the complaints first.
|
|
Presumably GDB will not be sending so many complaints that this
|
|
becomes a performance hog. */
|
|
|
|
gdb_flush (gdb_stderr);
|
|
}
|
|
|
|
void
|
|
complaint_internal (const char *fmt, ...)
|
|
{
|
|
va_list args;
|
|
|
|
va_start (args, fmt);
|
|
vcomplaint (NULL/*file*/, 0/*line*/, fmt, args);
|
|
va_end (args);
|
|
}
|
|
|
|
/* Clear out / initialize all complaint counters that have ever been
|
|
incremented. If LESS_VERBOSE is 1, be less verbose about
|
|
successive complaints, since the messages are appearing all
|
|
together during a command that is reporting a contiguous block of
|
|
complaints (rather than being interleaved with other messages). */
|
|
|
|
void
|
|
clear_complaints (int less_verbose)
|
|
{
|
|
struct complain *p;
|
|
|
|
for (p = symfile_complaint_book.root; p != NULL; p = p->next)
|
|
{
|
|
p->counter = 0;
|
|
}
|
|
|
|
if (!less_verbose)
|
|
symfile_complaint_book.series = ISOLATED_MESSAGE;
|
|
else
|
|
symfile_complaint_book.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, _("\
|
|
Set max number of complaints about incorrect symbols."), _("\
|
|
Show max number of complaints about incorrect symbols."), NULL,
|
|
NULL, complaints_show_value,
|
|
&setlist, &showlist);
|
|
}
|