/* Debug logging for the symbol file functions for the GNU debugger, GDB.
- Copyright (C) 2013-2018 Free Software Foundation, Inc.
+ Copyright (C) 2013-2019 Free Software Foundation, Inc.
Contributed by Cygnus Support, using pieces from other GDB modules.
#include "defs.h"
#include "gdbcmd.h"
#include "objfiles.h"
-#include "observer.h"
+#include "observable.h"
#include "source.h"
#include "symtab.h"
#include "symfile.h"
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<debug_sym_fns_data>
+ 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. */
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. */
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);
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",
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));
gdb::function_view<bool (symtab *)> callback)
{
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_symtabs_matching_filename (%s, \"%s\", \"%s\", %s)\n",
}
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,
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));
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));
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",
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));
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",
}
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_name_match_type 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<symbol_found_callback_ftype> 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),
- plongest ((LONGEST) 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);
}
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)\n",
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,
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),
CORE_ADDR address)
{
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->find_compunit_symtab_by_address (%s, %s)\n",
objfile_debug_name (objfile),
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,
\f
/* Debugging version of struct sym_probe_fns. */
-static const std::vector<probe *> &
+static const std::vector<std::unique_ptr<probe>> &
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));
+ = symfile_debug_objfile_data_key.get (objfile);
- const std::vector<probe *> &retval
+ const std::vector<std::unique_ptr<probe>> &retval
= debug_data->real_sf->sym_probe_fns->sym_get_probes (objfile);
fprintf_filtered (gdb_stdlog,
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));
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));
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);
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));
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));
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),
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));
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);
&debug_sym_quick_functions
};
\f
-/* 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. */
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 { \
#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;
}
/* 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.
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
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."), _("\