X-Git-Url: http://drtracing.org/?a=blobdiff_plain;ds=inline;f=gdb%2Fsymfile-debug.c;h=f233b963062f7db8a62112684444ec4b8099fe96;hb=89a65580f4522f81ef7e4e49298b24f3ebc14355;hp=80039a015e729640d3ac65157db49d8876035cbe;hpb=61baf725eca99af2569262d10aca03dcde2698f6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/symfile-debug.c b/gdb/symfile-debug.c index 80039a015e..f233b96306 100644 --- a/gdb/symfile-debug.c +++ b/gdb/symfile-debug.c @@ -1,6 +1,6 @@ /* Debug logging for the symbol file functions for the GNU debugger, GDB. - Copyright (C) 2013-2017 Free Software Foundation, Inc. + Copyright (C) 2013-2020 Free Software Foundation, Inc. Contributed by Cygnus Support, using pieces from other GDB modules. @@ -28,7 +28,7 @@ #include "defs.h" #include "gdbcmd.h" #include "objfiles.h" -#include "observer.h" +#include "observable.h" #include "source.h" #include "symtab.h" #include "symfile.h" @@ -39,16 +39,17 @@ struct debug_sym_fns_data { - const struct sym_fns *real_sf; - struct sym_fns debug_sf; + const struct sym_fns *real_sf = nullptr; + struct sym_fns debug_sf {}; }; /* We need to record a pointer to the real set of functions for each objfile. */ -static const struct objfile_data *symfile_debug_objfile_data_key; +static const struct objfile_key + symfile_debug_objfile_data_key; -/* If non-zero all calls to the symfile functions are logged. */ -static int debug_symfile = 0; +/* If true all calls to the symfile functions are logged. */ +static bool debug_symfile = false; /* Return non-zero if symfile debug logging is installed. */ @@ -56,7 +57,7 @@ static int symfile_debug_installed (struct objfile *objfile) { return (objfile->sf != NULL - && objfile_data (objfile, symfile_debug_objfile_data_key) != NULL); + && symfile_debug_objfile_data_key.get (objfile) != NULL); } /* Utility return the name to print for SYMTAB. */ @@ -73,8 +74,7 @@ static int debug_qf_has_symbols (struct objfile *objfile) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); int retval; retval = debug_data->real_sf->qf->has_symbols (objfile); @@ -89,8 +89,7 @@ static struct symtab * debug_qf_find_last_source_symtab (struct objfile *objfile) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); struct symtab *retval; fprintf_filtered (gdb_stdlog, "qf->find_last_source_symtab (%s)\n", @@ -108,8 +107,7 @@ static void debug_qf_forget_cached_source_info (struct objfile *objfile) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, "qf->forget_cached_source_info (%s)\n", objfile_debug_name (objfile)); @@ -117,28 +115,22 @@ debug_qf_forget_cached_source_info (struct objfile *objfile) debug_data->real_sf->qf->forget_cached_source_info (objfile); } -static int -debug_qf_map_symtabs_matching_filename (struct objfile *objfile, - const char *name, - const char *real_path, - int (*callback) (struct symtab *, - void *), - void *data) +static bool +debug_qf_map_symtabs_matching_filename + (struct objfile *objfile, const char *name, const char *real_path, + gdb::function_view callback) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); - int retval; + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, - "qf->map_symtabs_matching_filename (%s, \"%s\", \"%s\", %s, %s)\n", + "qf->map_symtabs_matching_filename (%s, \"%s\", \"%s\", %s)\n", objfile_debug_name (objfile), name, real_path ? real_path : NULL, - host_address_to_string (callback), - host_address_to_string (data)); + host_address_to_string (&callback)); - retval = debug_data->real_sf->qf->map_symtabs_matching_filename - (objfile, name, real_path, callback, data); + bool retval = (debug_data->real_sf->qf->map_symtabs_matching_filename + (objfile, name, real_path, callback)); fprintf_filtered (gdb_stdlog, "qf->map_symtabs_matching_filename (...) = %d\n", @@ -148,12 +140,11 @@ debug_qf_map_symtabs_matching_filename (struct objfile *objfile, } static struct compunit_symtab * -debug_qf_lookup_symbol (struct objfile *objfile, int kind, const char *name, - domain_enum domain) +debug_qf_lookup_symbol (struct objfile *objfile, block_enum kind, + const char *name, domain_enum domain) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); struct compunit_symtab *retval; fprintf_filtered (gdb_stdlog, @@ -176,8 +167,7 @@ static void debug_qf_print_stats (struct objfile *objfile) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, "qf->print_stats (%s)\n", objfile_debug_name (objfile)); @@ -189,8 +179,7 @@ static void debug_qf_dump (struct objfile *objfile) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, "qf->dump (%s)\n", objfile_debug_name (objfile)); @@ -198,30 +187,12 @@ debug_qf_dump (struct objfile *objfile) debug_data->real_sf->qf->dump (objfile); } -static void -debug_qf_relocate (struct objfile *objfile, - const struct section_offsets *new_offsets, - const struct section_offsets *delta) -{ - const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); - - fprintf_filtered (gdb_stdlog, "qf->relocate (%s, %s, %s)\n", - objfile_debug_name (objfile), - host_address_to_string (new_offsets), - host_address_to_string (delta)); - - debug_data->real_sf->qf->relocate (objfile, new_offsets, delta); -} - static void debug_qf_expand_symtabs_for_function (struct objfile *objfile, const char *func_name) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, "qf->expand_symtabs_for_function (%s, \"%s\")\n", @@ -234,8 +205,7 @@ static void debug_qf_expand_all_symtabs (struct objfile *objfile) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, "qf->expand_all_symtabs (%s)\n", objfile_debug_name (objfile)); @@ -248,8 +218,7 @@ debug_qf_expand_symtabs_with_fullname (struct objfile *objfile, const char *fullname) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, "qf->expand_symtabs_with_fullname (%s, \"%s\")\n", @@ -259,61 +228,54 @@ debug_qf_expand_symtabs_with_fullname (struct objfile *objfile, } static void -debug_qf_map_matching_symbols (struct objfile *objfile, - const char *name, domain_enum domain, - int global, - int (*callback) (struct block *, - struct symbol *, void *), - void *data, - symbol_compare_ftype *match, - symbol_compare_ftype *ordered_compare) +debug_qf_map_matching_symbols + (struct objfile *objfile, + const lookup_name_info &name, domain_enum domain, + int global, + gdb::function_view callback, + symbol_compare_ftype *ordered_compare) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, - "qf->map_matching_symbols (%s, \"%s\", %s, %d, %s, %s, %s, %s)\n", - objfile_debug_name (objfile), name, + "qf->map_matching_symbols (%s, %s, %d, %s)\n", + objfile_debug_name (objfile), domain_name (domain), global, - host_address_to_string (callback), - host_address_to_string (data), - host_address_to_string (match), host_address_to_string (ordered_compare)); debug_data->real_sf->qf->map_matching_symbols (objfile, name, domain, global, - callback, data, - match, + callback, ordered_compare); } static void debug_qf_expand_symtabs_matching (struct objfile *objfile, - expand_symtabs_file_matcher_ftype *file_matcher, - expand_symtabs_symbol_matcher_ftype *symbol_matcher, - expand_symtabs_exp_notify_ftype *expansion_notify, - enum search_domain kind, void *data) + gdb::function_view file_matcher, + const lookup_name_info &lookup_name, + gdb::function_view symbol_matcher, + gdb::function_view expansion_notify, + enum search_domain kind) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, - "qf->expand_symtabs_matching (%s, %s, %s, %s, %s, %s)\n", + "qf->expand_symtabs_matching (%s, %s, %s, %s, %s)\n", objfile_debug_name (objfile), - host_address_to_string (file_matcher), - host_address_to_string (symbol_matcher), - host_address_to_string (expansion_notify), - search_domain_name (kind), - host_address_to_string (data)); + host_address_to_string (&file_matcher), + host_address_to_string (&symbol_matcher), + host_address_to_string (&expansion_notify), + search_domain_name (kind)); debug_data->real_sf->qf->expand_symtabs_matching (objfile, file_matcher, + lookup_name, symbol_matcher, expansion_notify, - kind, data); + kind); } static struct compunit_symtab * @@ -324,8 +286,7 @@ debug_qf_find_pc_sect_compunit_symtab (struct objfile *objfile, int warn_if_readin) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); struct compunit_symtab *retval; fprintf_filtered (gdb_stdlog, @@ -356,8 +317,7 @@ debug_qf_map_symbol_filenames (struct objfile *objfile, int need_fullname) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, "qf->map_symbol_filenames (%s, %s, %s, %d)\n", objfile_debug_name (objfile), @@ -369,6 +329,32 @@ debug_qf_map_symbol_filenames (struct objfile *objfile, need_fullname); } +static struct compunit_symtab * +debug_qf_find_compunit_symtab_by_address (struct objfile *objfile, + CORE_ADDR address) +{ + const struct debug_sym_fns_data *debug_data + = symfile_debug_objfile_data_key.get (objfile); + fprintf_filtered (gdb_stdlog, + "qf->find_compunit_symtab_by_address (%s, %s)\n", + objfile_debug_name (objfile), + hex_string (address)); + + struct compunit_symtab *result = NULL; + if (debug_data->real_sf->qf->map_symbol_filenames != NULL) + result + = debug_data->real_sf->qf->find_compunit_symtab_by_address (objfile, + address); + + fprintf_filtered (gdb_stdlog, + "qf->find_compunit_symtab_by_address (...) = %s\n", + result + ? debug_symtab_name (compunit_primary_filetab (result)) + : "NULL"); + + return result; +} + static const struct quick_symbol_functions debug_sym_quick_functions = { debug_qf_has_symbols, @@ -378,32 +364,31 @@ static const struct quick_symbol_functions debug_sym_quick_functions = debug_qf_lookup_symbol, debug_qf_print_stats, debug_qf_dump, - debug_qf_relocate, debug_qf_expand_symtabs_for_function, debug_qf_expand_all_symtabs, debug_qf_expand_symtabs_with_fullname, debug_qf_map_matching_symbols, debug_qf_expand_symtabs_matching, debug_qf_find_pc_sect_compunit_symtab, + debug_qf_find_compunit_symtab_by_address, debug_qf_map_symbol_filenames }; /* Debugging version of struct sym_probe_fns. */ -static VEC (probe_p) * +static const std::vector> & debug_sym_get_probes (struct objfile *objfile) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); - VEC (probe_p) *retval; + = symfile_debug_objfile_data_key.get (objfile); - retval = debug_data->real_sf->sym_probe_fns->sym_get_probes (objfile); + const std::vector> &retval + = debug_data->real_sf->sym_probe_fns->sym_get_probes (objfile); fprintf_filtered (gdb_stdlog, "probes->sym_get_probes (%s) = %s\n", objfile_debug_name (objfile), - host_address_to_string (retval)); + host_address_to_string (retval.data ())); return retval; } @@ -419,8 +404,7 @@ static void debug_sym_new_init (struct objfile *objfile) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, "sf->sym_new_init (%s)\n", objfile_debug_name (objfile)); @@ -432,8 +416,7 @@ static void debug_sym_init (struct objfile *objfile) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, "sf->sym_init (%s)\n", objfile_debug_name (objfile)); @@ -445,8 +428,7 @@ static void debug_sym_read (struct objfile *objfile, symfile_add_flags symfile_flags) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, "sf->sym_read (%s, 0x%x)\n", objfile_debug_name (objfile), (unsigned) symfile_flags); @@ -458,8 +440,7 @@ static void debug_sym_read_psymbols (struct objfile *objfile) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, "sf->sym_read_psymbols (%s)\n", objfile_debug_name (objfile)); @@ -471,8 +452,7 @@ static void debug_sym_finish (struct objfile *objfile) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, "sf->sym_finish (%s)\n", objfile_debug_name (objfile)); @@ -482,15 +462,14 @@ debug_sym_finish (struct objfile *objfile) static void debug_sym_offsets (struct objfile *objfile, - const struct section_addr_info *info) + const section_addr_info &info) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, "sf->sym_offsets (%s, %s)\n", objfile_debug_name (objfile), - host_address_to_string (info)); + host_address_to_string (&info)); debug_data->real_sf->sym_offsets (objfile, info); } @@ -508,8 +487,7 @@ static void debug_sym_read_linetable (struct objfile *objfile) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); fprintf_filtered (gdb_stdlog, "sf->sym_read_linetable (%s)\n", objfile_debug_name (objfile)); @@ -521,8 +499,7 @@ static bfd_byte * debug_sym_relocate (struct objfile *objfile, asection *sectp, bfd_byte *buf) { const struct debug_sym_fns_data *debug_data - = ((const struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + = symfile_debug_objfile_data_key.get (objfile); bfd_byte *retval; retval = debug_data->real_sf->sym_relocate (objfile, sectp, buf); @@ -557,14 +534,6 @@ static const struct sym_fns debug_sym_fns = &debug_sym_quick_functions }; -/* Free the copy of sym_fns recorded in the registry. */ - -static void -symfile_debug_free_objfile (struct objfile *objfile, void *datum) -{ - xfree (datum); -} - /* Install the debugging versions of the symfile functions for OBJFILE. Do not call this if the debug versions are already installed. */ @@ -580,7 +549,7 @@ install_symfile_debug_logging (struct objfile *objfile) real_sf = objfile->sf; /* Alas we have to preserve NULL entries in REAL_SF. */ - debug_data = XCNEW (struct debug_sym_fns_data); + debug_data = new struct debug_sym_fns_data; #define COPY_SF_PTR(from, to, name, func) \ do { \ @@ -606,7 +575,7 @@ install_symfile_debug_logging (struct objfile *objfile) #undef COPY_SF_PTR debug_data->real_sf = real_sf; - set_objfile_data (objfile, symfile_debug_objfile_data_key, debug_data); + symfile_debug_objfile_data_key.set (objfile, debug_data); objfile->sf = &debug_data->debug_sf; } @@ -621,12 +590,10 @@ uninstall_symfile_debug_logging (struct objfile *objfile) /* The debug versions should be currently installed. */ gdb_assert (symfile_debug_installed (objfile)); - debug_data = ((struct debug_sym_fns_data *) - objfile_data (objfile, symfile_debug_objfile_data_key)); + debug_data = symfile_debug_objfile_data_key.get (objfile); objfile->sf = debug_data->real_sf; - xfree (debug_data); - set_objfile_data (objfile, symfile_debug_objfile_data_key, NULL); + symfile_debug_objfile_data_key.clear (objfile); } /* Call this function to set OBJFILE->SF. @@ -651,25 +618,24 @@ objfile_set_sym_fns (struct objfile *objfile, const struct sym_fns *sf) } static void -set_debug_symfile (char *args, int from_tty, struct cmd_list_element *c) +set_debug_symfile (const char *args, int from_tty, struct cmd_list_element *c) { struct program_space *pspace; - struct objfile *objfile; ALL_PSPACES (pspace) - ALL_PSPACE_OBJFILES (pspace, objfile) - { - if (debug_symfile) - { - if (!symfile_debug_installed (objfile)) - install_symfile_debug_logging (objfile); - } - else - { - if (symfile_debug_installed (objfile)) - uninstall_symfile_debug_logging (objfile); - } - } + for (objfile *objfile : pspace->objfiles ()) + { + if (debug_symfile) + { + if (!symfile_debug_installed (objfile)) + install_symfile_debug_logging (objfile); + } + else + { + if (symfile_debug_installed (objfile)) + uninstall_symfile_debug_logging (objfile); + } + } } static void @@ -679,14 +645,9 @@ show_debug_symfile (struct ui_file *file, int from_tty, fprintf_filtered (file, _("Symfile debugging is %s.\n"), value); } -initialize_file_ftype _initialize_symfile_debug; - void _initialize_symfile_debug (void) { - symfile_debug_objfile_data_key - = register_objfile_data_with_cleanup (NULL, symfile_debug_free_objfile); - add_setshow_boolean_cmd ("symfile", no_class, &debug_symfile, _("\ Set debugging of the symfile functions."), _("\ Show debugging of the symfile functions."), _("\