From 015d2e7e49056e0d5fea1c18bf8de9b1be7c096f Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Fri, 18 Sep 2015 21:43:38 -0700 Subject: [PATCH] default_read_var_value : Include minsym kind in error message. bfd/ChangeLog: * targets.c (enum bfd_flavour): Add comment. (bfd_flavour_name): New function. * bfd-in2.h: Regenerate. gdb/ChangeLog: * findvar.c (default_read_var_value) : Include the kind of minimal symbol in the error message. * objfiles.c (objfile_flavour_name): New function. * objfiles.h (objfile_flavour_name): Declare. gdb/testsuite/ChangeLog: * gdb.dwarf2/dw2-bad-unresolved.c: New file. * gdb.dwarf2/dw2-bad-unresolved.exp: New file. --- bfd/ChangeLog | 6 ++ bfd/bfd-in2.h | 3 + bfd/targets.c | 48 +++++++++++++++ gdb/ChangeLog | 7 +++ gdb/findvar.c | 14 ++++- gdb/objfiles.c | 10 ++++ gdb/objfiles.h | 5 ++ gdb/testsuite/ChangeLog | 5 ++ gdb/testsuite/gdb.dwarf2/dw2-bad-unresolved.c | 24 ++++++++ .../gdb.dwarf2/dw2-bad-unresolved.exp | 59 +++++++++++++++++++ 10 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-bad-unresolved.c create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-bad-unresolved.exp diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 3e0c7b8bb1..70d99523e5 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2015-09-18 Doug Evans + + * targets.c (enum bfd_flavour): Add comment. + (bfd_flavour_name): New function. + * bfd-in2.h: Regenerate. + 2015-09-18 Alan Modra * elf64-ppc.h (struct ppc64_elf_params ): Rename diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 51fa54f1d4..f06d76e430 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -6980,6 +6980,7 @@ bfd_boolean generic_core_file_matches_executable_p enum bfd_flavour { + /* N.B. Update bfd_flavour_name if you change this. */ bfd_target_unknown_flavour, bfd_target_aout_flavour, bfd_target_coff_flavour, @@ -7399,6 +7400,8 @@ const bfd_target *bfd_search_for_target (int (*search_func) (const bfd_target *, void *), void *); +const char *bfd_flavour_name (enum bfd_flavour flavour); + /* Extracted from format.c. */ bfd_boolean bfd_check_format (bfd *abfd, bfd_format format); diff --git a/bfd/targets.c b/bfd/targets.c index 1ada260bb5..cc9d08312a 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -144,6 +144,7 @@ DESCRIPTION .enum bfd_flavour .{ +. {* N.B. Update bfd_flavour_name if you change this. *} . bfd_target_unknown_flavour, . bfd_target_aout_flavour, . bfd_target_coff_flavour, @@ -1829,3 +1830,50 @@ bfd_search_for_target (int (*search_func) (const bfd_target *, void *), return NULL; } + +/* +FUNCTION + bfd_flavour_name + +SYNOPSIS + const char *bfd_flavour_name (enum bfd_flavour flavour); + +DESCRIPTION + Return the string form of @var{flavour}. +*/ + +const char * +bfd_flavour_name (enum bfd_flavour flavour) +{ + switch (flavour) + { + case bfd_target_unknown_flavour: return "unknown file format"; + case bfd_target_aout_flavour: return "a.out"; + case bfd_target_coff_flavour: return "COFF"; + case bfd_target_ecoff_flavour: return "ECOFF"; + case bfd_target_xcoff_flavour: return "XCOFF"; + case bfd_target_elf_flavour: return "ELF"; + case bfd_target_ieee_flavour: return "IEEE"; + case bfd_target_nlm_flavour: return "NLM"; + case bfd_target_oasys_flavour: return "Oasys"; + case bfd_target_tekhex_flavour: return "Tekhex"; + case bfd_target_srec_flavour: return "Srec"; + case bfd_target_verilog_flavour: return "Verilog"; + case bfd_target_ihex_flavour: return "Ihex"; + case bfd_target_som_flavour: return "SOM"; + case bfd_target_os9k_flavour: return "OS9K"; + case bfd_target_versados_flavour: return "Versados"; + case bfd_target_msdos_flavour: return "MSDOS"; + case bfd_target_ovax_flavour: return "Ovax"; + case bfd_target_evax_flavour: return "Evax"; + case bfd_target_mmo_flavour: return "MMO"; + case bfd_target_mach_o_flavour: return "MACH_O"; + case bfd_target_pef_flavour: return "PEF"; + case bfd_target_pef_xlib_flavour: return "PEF_XLIB"; + case bfd_target_sym_flavour: return "SYM"; + /* There is no "default" case here so that -Wswitch (part of -Wall) + catches missing entries. */ + } + + abort (); +} diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 074417d218..d0d35b0581 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2015-09-18 Doug Evans + + * findvar.c (default_read_var_value) : Include the + kind of minimal symbol in the error message. + * objfiles.c (objfile_flavour_name): New function. + * objfiles.h (objfile_flavour_name): Declare. + 2015-09-18 Yao Qi * nat/aarch64-linux.c: Include elf/common.h, diff --git a/gdb/findvar.c b/gdb/findvar.c index fd1b9d7a5f..11325cfed1 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -737,8 +737,20 @@ default_read_var_value (struct symbol *var, const struct block *var_block, symbol_objfile (var)); msym = lookup_data.result.minsym; + /* If we can't find the minsym there's a problem in the symbol info. + The symbol exists in the debug info, but it's missing in the minsym + table. */ if (msym == NULL) - error (_("No global symbol \"%s\"."), SYMBOL_LINKAGE_NAME (var)); + { + const char *flavour_name + = objfile_flavour_name (symbol_objfile (var)); + + /* We can't get here unless we've opened the file, so flavour_name + can't be NULL. */ + gdb_assert (flavour_name != NULL); + error (_("Missing %s symbol \"%s\"."), + flavour_name, SYMBOL_LINKAGE_NAME (var)); + } obj_section = MSYMBOL_OBJ_SECTION (lookup_data.result.objfile, msym); /* Relocate address, unless there is no section or the variable is a TLS variable. */ diff --git a/gdb/objfiles.c b/gdb/objfiles.c index 907126c386..f6be91ef31 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -1614,6 +1614,16 @@ objfile_debug_name (const struct objfile *objfile) return lbasename (objfile->original_name); } +/* See objfiles.h. */ + +const char * +objfile_flavour_name (struct objfile *objfile) +{ + if (objfile->obfd != NULL) + return bfd_flavour_name (bfd_get_flavour (objfile->obfd)); + return NULL; +} + /* Provide a prototype to silence -Wmissing-prototypes. */ extern initialize_file_ftype _initialize_objfiles; diff --git a/gdb/objfiles.h b/gdb/objfiles.h index be2a5ef0f3..da5ac1a2ba 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -744,6 +744,11 @@ const char *objfile_filename (const struct objfile *objfile); extern const char *objfile_debug_name (const struct objfile *objfile); +/* Return the name of the file format of OBJFILE if the file has been opened, + otherwise return NULL. */ + +const char *objfile_flavour_name (struct objfile *objfile); + /* Set the objfile's notion of the "main" name and language. */ extern void set_objfile_main_name (struct objfile *objfile, diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 53c32e881d..e5fb03c3e2 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-09-18 Doug Evans + + * gdb.dwarf2/dw2-bad-unresolved.c: New file. + * gdb.dwarf2/dw2-bad-unresolved.exp: New file. + 2015-09-18 Sandra Loosemore * gdb.base/dso2dso.exp: Don't use directory prefix when setting diff --git a/gdb/testsuite/gdb.dwarf2/dw2-bad-unresolved.c b/gdb/testsuite/gdb.dwarf2/dw2-bad-unresolved.c new file mode 100644 index 0000000000..1c35510d8e --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-bad-unresolved.c @@ -0,0 +1,24 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2015 Free Software Foundation, Inc. + + 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 . */ + +/* Dummy main function. */ + +int +main (void) +{ + return 0; +} diff --git a/gdb/testsuite/gdb.dwarf2/dw2-bad-unresolved.exp b/gdb/testsuite/gdb.dwarf2/dw2-bad-unresolved.exp new file mode 100644 index 0000000000..85c4ebbfdd --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/dw2-bad-unresolved.exp @@ -0,0 +1,59 @@ +# Copyright 2015 Free Software Foundation, Inc. + +# 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 . + +load_lib dwarf.exp + +# This test can only be run on targets which support DWARF-2 and use gas. +if {![dwarf2_support]} { + return 0 +} + +standard_testfile dw2-bad-unresolved.c dw2-bad-unresolved-2.S + +# Set up the DWARF for the test. +# The key part of this is the definition of variable "var" having no location. +# That will cause it to have LOC_UNRESOLVED. + +set asm_file [standard_output_file $srcfile2] +Dwarf::assemble $asm_file { + cu {} { + DW_TAG_compile_unit { + {DW_AT_language @DW_LANG_C} + {DW_AT_name dw2-bad-unresolved-2.c} + {DW_AT_comp_dir /tmp} + } { + declare_labels b_l + + b_l: DW_TAG_base_type { + {DW_AT_byte_size 1 DW_FORM_sdata} + {DW_AT_encoding @DW_ATE_signed} + {DW_AT_name bool} + } + DW_TAG_variable { + {name var} + {type :$b_l} + {external 1 flag} + } + } + } +} + +if { [prepare_for_testing ${testfile}.exp ${testfile} \ + [list $srcfile $asm_file] {nodebug}] } { + return -1 +} + +gdb_test "ptype var" "type = bool" +gdb_test "print var" "Missing .* symbol \"var\"."