From patchwork Sat Sep 19 04:48:33 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Evans X-Patchwork-Id: 8805 Received: (qmail 49237 invoked by alias); 19 Sep 2015 04:50:28 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 47885 invoked by uid 89); 19 Sep 2015 04:49:47 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.1 required=5.0 tests=AWL, BAYES_00, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, KAM_STOCKGEN, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=no version=3.3.2 X-Spam-User: qpsmtpd, 2 recipients X-HELO: mail-pa0-f44.google.com Received: from mail-pa0-f44.google.com (HELO mail-pa0-f44.google.com) (209.85.220.44) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Sat, 19 Sep 2015 04:49:45 +0000 Received: by pacfv12 with SMTP id fv12so68776164pac.2; Fri, 18 Sep 2015 21:49:43 -0700 (PDT) X-Received: by 10.66.243.225 with SMTP id xb1mr11263723pac.78.1442638183510; Fri, 18 Sep 2015 21:49:43 -0700 (PDT) Received: from seba.sebabeach.org.gmail.com (173-13-178-53-sfba.hfc.comcastbusiness.net. [173.13.178.53]) by smtp.gmail.com with ESMTPSA id ok4sm11871760pbb.65.2015.09.18.21.49.42 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 18 Sep 2015 21:49:43 -0700 (PDT) From: Doug Evans To: Nick Clifton Cc: gdb-patches@sourceware.org, binutils@sourceware.org Subject: Re: [PATCH] Include minimal symbol flavour name in LOC_UNRESOLVED error message. References: <55E869C1.1050801@redhat.com> Date: Fri, 18 Sep 2015 21:48:33 -0700 In-Reply-To: <55E869C1.1050801@redhat.com> (Nick Clifton's message of "Thu, 3 Sep 2015 16:39:45 +0100") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) MIME-Version: 1.0 X-IsSubscribed: yes Nick Clifton writes: > Hi Doug, > >> 2015-08-29 Doug Evans >> >> bfd/ >> * targets.c (enum bfd_flavour): Add comment. >> (bfd_flavour_name): New function. >> * bfd-in2.h: Regenerate. > > This part of the patch is approved. > > Cheers > Nick Hi Nick. Here is what I committed. It includes the change suggested here: https://sourceware.org/ml/gdb-patches/2015-08/msg00850.html 2015-09-18 Doug Evans bfd/ * targets.c (enum bfd_flavour): Add comment. (bfd_flavour_name): New function. * bfd-in2.h: Regenerate. gdb/ * 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/ * gdb.dwarf2/dw2-bad-unresolved.c: New file. * gdb.dwarf2/dw2-bad-unresolved.exp: New file. diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 51fa54f..f06d76e 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 1ada260..cc9d083 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/findvar.c b/gdb/findvar.c index fd1b9d7..11325cf 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 907126c..f6be91e 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 be2a5ef..da5ac1a 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/gdb.dwarf2/dw2-bad-unresolved.c b/gdb/testsuite/gdb.dwarf2/dw2-bad-unresolved.c new file mode 100644 index 0000000..1c35510 --- /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 0000000..85c4ebb --- /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\"."