X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fsymfile.c;h=0c8d574e6032403188a340a30c887c843b90fea0;hb=ea764154c27a11619ba764a4c92f395ba5007234;hp=baed72e936eac2f7a61e7e9e7318891c1a244a04;hpb=5486c5174894a1a6e68b9fdf1865b838b9c792d8;p=binutils-gdb.git diff --git a/gdb/symfile.c b/gdb/symfile.c index baed72e936e..0c8d574e603 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -1,6 +1,6 @@ /* Generic symbol file reading for the GNU debugger, GDB. - Copyright (C) 1990-2020 Free Software Foundation, Inc. + Copyright (C) 1990-2022 Free Software Foundation, Inc. Contributed by Cygnus Support, using pieces from other GDB modules. @@ -40,7 +40,7 @@ #include "regcache.h" #include "filenames.h" /* for DOSish file names */ #include "gdb-stabs.h" -#include "gdb_obstack.h" +#include "gdbsupport/gdb_obstack.h" #include "completer.h" #include "bcache.h" #include "hashtab.h" @@ -61,6 +61,7 @@ #include "gdbsupport/selftest.h" #include "cli/cli-style.h" #include "gdbsupport/forward-scope-exit.h" +#include "gdbsupport/buildargv.h" #include #include @@ -69,8 +70,6 @@ #include #include -#include "psymtab.h" - int (*deprecated_ui_load_progress_hook) (const char *section, unsigned long num); void (*deprecated_show_load_progress) (const char *section, @@ -85,8 +84,14 @@ using clear_symtab_users_cleanup = FORWARD_SCOPE_EXIT (clear_symtab_users); /* Global variables owned by this file. */ -int readnow_symbol_files; /* Read full symbols immediately. */ -int readnever_symbol_files; /* Never read full symbols. */ + +/* See symfile.h. */ + +int readnow_symbol_files; + +/* See symfile.h. */ + +int readnever_symbol_files; /* Functions this file defines. */ @@ -212,21 +217,18 @@ find_lowest_section (asection *sect, asection **lowest) an existing section table. */ section_addr_info -build_section_addr_info_from_section_table (const struct target_section *start, - const struct target_section *end) +build_section_addr_info_from_section_table (const target_section_table &table) { - const struct target_section *stp; - section_addr_info sap; - for (stp = start; stp != end; stp++) + for (const target_section &stp : table) { - struct bfd_section *asect = stp->the_bfd_section; + struct bfd_section *asect = stp.the_bfd_section; bfd *abfd = asect->owner; if (bfd_section_flags (asect) & (SEC_ALLOC | SEC_LOAD) - && sap.size () < end - start) - sap.emplace_back (stp->addr, + && sap.size () < table.size ()) + sap.emplace_back (stp.addr, bfd_section_name (asect), gdb_bfd_section_index (abfd, asect)); } @@ -414,11 +416,11 @@ relative_addr_info_to_section_offsets (section_offsets §ion_offsets, osp = &addrs[i]; if (osp->sectindex == -1) - continue; + continue; /* Record all sections in offsets. */ /* The section_offsets in the objfile are here filled in using - the BFD index. */ + the BFD index. */ section_offsets[osp->sectindex] = osp->addr; } } @@ -772,7 +774,7 @@ read_symbols (struct objfile *objfile, symfile_add_flags add_flags) /* find_separate_debug_file_in_section should be called only if there is single binary with no existing separate debug info file. */ - if (!objfile_has_partial_symbols (objfile) + if (!objfile->has_partial_symbols () && objfile->separate_debug_objfile == NULL && objfile->separate_debug_objfile_backlink == NULL) { @@ -790,7 +792,7 @@ read_symbols (struct objfile *objfile, symfile_add_flags add_flags) } } if ((add_flags & SYMFILE_NO_READ) == 0) - require_partial_symbols (objfile, false); + objfile->require_partial_symbols (false); } /* Initialize entry point information for this objfile. */ @@ -810,7 +812,7 @@ init_entry_point_info (struct objfile *objfile) if (bfd_get_file_flags (objfile->obfd) & EXEC_P) { /* Executable file -- record its entry point so we'll recognize - the startup file because it contains the entry point. */ + the startup file because it contains the entry point. */ ei->entry_point = bfd_get_start_address (objfile->obfd); ei->entry_point_p = 1; } @@ -837,10 +839,8 @@ init_entry_point_info (struct objfile *objfile) /* Make certain that the address points at real code, and not a function descriptor. */ - entry_point - = gdbarch_convert_from_func_ptr_addr (objfile->arch (), - entry_point, - current_top_target ()); + entry_point = gdbarch_convert_from_func_ptr_addr + (objfile->arch (), entry_point, current_inferior ()->top_target ()); /* Remove any ISA markers, so that this matches entries in the symbol table. */ @@ -901,6 +901,7 @@ syms_from_objfile_1 (struct objfile *objfile, const int mainline = add_flags & SYMFILE_MAINLINE; objfile_set_sym_fns (objfile, find_sym_fns (objfile->obfd)); + objfile->qf.clear (); if (objfile->sf == NULL) { @@ -927,21 +928,21 @@ syms_from_objfile_1 (struct objfile *objfile, if (mainline) { /* We will modify the main symbol table, make sure that all its users - will be cleaned up if an error occurs during symbol reading. */ + will be cleaned up if an error occurs during symbol reading. */ defer_clear_users.emplace ((symfile_add_flag) 0); /* Since no error yet, throw away the old symbol table. */ - if (symfile_objfile != NULL) + if (current_program_space->symfile_object_file != NULL) { - symfile_objfile->unlink (); - gdb_assert (symfile_objfile == NULL); + current_program_space->symfile_object_file->unlink (); + gdb_assert (current_program_space->symfile_object_file == NULL); } /* Currently we keep symbols from the add-symbol-file command. - If the user wants to get rid of them, they should do "symbol-file" - without arguments first. Not sure this is the best behavior - (PR 2207). */ + If the user wants to get rid of them, they should do "symbol-file" + without arguments first. Not sure this is the best behavior + (PR 2207). */ (*objfile->sf->sym_new_init) (objfile); } @@ -998,7 +999,7 @@ finish_new_objfile (struct objfile *objfile, symfile_add_flags add_flags) if (add_flags & SYMFILE_MAINLINE) { /* OK, make it the "real" symbol file. */ - symfile_objfile = objfile; + current_program_space->symfile_object_file = objfile; clear_symtab_users (add_flags); } @@ -1097,8 +1098,7 @@ symbol_file_add_with_addrs (bfd *abfd, const char *name, printf_filtered (_("Expanding full symbols from %ps...\n"), styled_string (file_name_style.style (), name)); - if (objfile->sf) - objfile->sf->qf->expand_all_symtabs (objfile); + objfile->expand_all_symtabs (); } /* Note that we only print a message if we have no symbols and have @@ -1163,7 +1163,7 @@ struct objfile * symbol_file_add_from_bfd (bfd *abfd, const char *name, symfile_add_flags add_flags, section_addr_info *addrs, - objfile_flags flags, struct objfile *parent) + objfile_flags flags, struct objfile *parent) { return symbol_file_add_with_addrs (abfd, name, add_flags, addrs, flags, parent); @@ -1219,9 +1219,9 @@ symbol_file_clear (int from_tty) { if ((have_full_symbols () || have_partial_symbols ()) && from_tty - && (symfile_objfile + && (current_program_space->symfile_object_file ? !query (_("Discard symbol table from `%s'? "), - objfile_name (symfile_objfile)) + objfile_name (current_program_space->symfile_object_file)) : !query (_("Discard symbol table? ")))) error (_("Not confirmed.")); @@ -1233,7 +1233,7 @@ symbol_file_clear (int from_tty) clear_symtab_users (0); - gdb_assert (symfile_objfile == NULL); + gdb_assert (current_program_space->symfile_object_file == NULL); if (from_tty) printf_filtered (_("No symbol file now.\n")); } @@ -1262,8 +1262,8 @@ separate_debug_file_exists (const std::string &name, unsigned long crc, if (separate_debug_file_debug) { - printf_filtered (_(" Trying %s..."), name.c_str ()); - gdb_flush (gdb_stdout); + fprintf_filtered (gdb_stdlog, _(" Trying %s..."), name.c_str ()); + gdb_flush (gdb_stdlog); } gdb_bfd_ref_ptr abfd (gdb_bfd_open (name.c_str (), gnutarget)); @@ -1271,7 +1271,7 @@ separate_debug_file_exists (const std::string &name, unsigned long crc, if (abfd == NULL) { if (separate_debug_file_debug) - printf_filtered (_(" no, unable to open.\n")); + fprintf_filtered (gdb_stdlog, _(" no, unable to open.\n")); return 0; } @@ -1295,7 +1295,8 @@ separate_debug_file_exists (const std::string &name, unsigned long crc, && abfd_stat.st_ino == parent_stat.st_ino) { if (separate_debug_file_debug) - printf_filtered (_(" no, same file as the objfile.\n")); + fprintf_filtered (gdb_stdlog, + _(" no, same file as the objfile.\n")); return 0; } @@ -1309,7 +1310,7 @@ separate_debug_file_exists (const std::string &name, unsigned long crc, if (!file_crc_p) { if (separate_debug_file_debug) - printf_filtered (_(" no, error computing CRC.\n")); + fprintf_filtered (gdb_stdlog, _(" no, error computing CRC.\n")); return 0; } @@ -1327,7 +1328,8 @@ separate_debug_file_exists (const std::string &name, unsigned long crc, if (!gdb_bfd_crc (parent_objfile->obfd, &parent_crc)) { if (separate_debug_file_debug) - printf_filtered (_(" no, error computing CRC.\n")); + fprintf_filtered (gdb_stdlog, + _(" no, error computing CRC.\n")); return 0; } @@ -1339,18 +1341,18 @@ separate_debug_file_exists (const std::string &name, unsigned long crc, name.c_str (), objfile_name (parent_objfile)); if (separate_debug_file_debug) - printf_filtered (_(" no, CRC doesn't match.\n")); + fprintf_filtered (gdb_stdlog, _(" no, CRC doesn't match.\n")); return 0; } if (separate_debug_file_debug) - printf_filtered (_(" yes!\n")); + fprintf_filtered (gdb_stdlog, _(" yes!\n")); return 1; } -char *debug_file_directory = NULL; +std::string debug_file_directory; static void show_debug_file_directory (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) @@ -1380,8 +1382,9 @@ find_separate_debug_file (const char *dir, unsigned long crc32, struct objfile *objfile) { if (separate_debug_file_debug) - printf_filtered (_("\nLooking for separate debug info (debug link) for " - "%s\n"), objfile_name (objfile)); + fprintf_filtered (gdb_stdlog, + _("\nLooking for separate debug info (debug link) for " + "%s\n"), objfile_name (objfile)); /* First try in the same directory as the original file. */ std::string debugfile = dir; @@ -1407,8 +1410,9 @@ find_separate_debug_file (const char *dir, bool target_prefix = startswith (dir, "target:"); const char *dir_notarget = target_prefix ? dir + strlen ("target:") : dir; std::vector> debugdir_vec - = dirnames_to_char_ptr_vec (debug_file_directory); - gdb::unique_xmalloc_ptr canon_sysroot = gdb_realpath (gdb_sysroot); + = dirnames_to_char_ptr_vec (debug_file_directory.c_str ()); + gdb::unique_xmalloc_ptr canon_sysroot + = gdb_realpath (gdb_sysroot.c_str ()); /* MS-Windows/MS-DOS don't allow colons in file names; we must convert the drive letter into a one-letter directory, so that the @@ -1434,7 +1438,7 @@ find_separate_debug_file (const char *dir, for (const gdb::unique_xmalloc_ptr &debugdir : debugdir_vec) { debugfile = target_prefix ? "target:" : ""; - debugfile += debugdir.get (); + debugfile += debugdir; debugfile += "/"; debugfile += drive; debugfile += dir_notarget; @@ -1449,14 +1453,14 @@ find_separate_debug_file (const char *dir, if (canon_sysroot.get () != NULL) base_path = child_path (canon_sysroot.get (), canon_dir); else - base_path = child_path (gdb_sysroot, canon_dir); + base_path = child_path (gdb_sysroot.c_str (), canon_dir); } if (base_path != NULL) { /* If the file is in the sysroot, try using its base path in the global debugfile directory. */ debugfile = target_prefix ? "target:" : ""; - debugfile += debugdir.get (); + debugfile += debugdir; debugfile += "/"; debugfile += base_path; debugfile += "/"; @@ -1469,7 +1473,7 @@ find_separate_debug_file (const char *dir, the sysroot's global debugfile directory. */ debugfile = target_prefix ? "target:" : ""; debugfile += gdb_sysroot; - debugfile += debugdir.get (); + debugfile += debugdir; debugfile += "/"; debugfile += base_path; debugfile += "/"; @@ -1797,7 +1801,7 @@ load_command (const char *arg, int from_tty) /* The user might be reloading because the binary has changed. Take this opportunity to check. */ reopen_exec_file (); - reread_symbols (); + reread_symbols (from_tty); std::string temp; if (arg == NULL) @@ -1986,7 +1990,7 @@ load_one_section (bfd *abfd, asection *asec, static void print_transfer_performance (struct ui_file *stream, unsigned long data_count, unsigned long write_count, - std::chrono::steady_clock::duration d); + std::chrono::steady_clock::duration d); /* See symfile.h. */ @@ -2011,9 +2015,9 @@ generic_load (const char *args, int from_tty) cbdata.load_offset = strtoulst (argv[1], &endptr, 0); /* If the last word was not a valid number then - treat it as a file name with spaces in. */ + treat it as a file name with spaces in. */ if (argv[1] == endptr) - error (_("Invalid download offset:%s."), argv[1]); + error (_("Invalid download offset:%s."), argv[1]); if (argv[2] != NULL) error (_("Too many parameters.")); @@ -2273,8 +2277,8 @@ add_symbol_file_command (const char *args, int from_tty) statements because hex_string returns a local static string. */ - printf_unfiltered (_("add symbol table from file \"%s\""), - filename.get ()); + printf_filtered (_("add symbol table from file \"%s\""), + filename.get ()); section_addr_info section_addrs; std::vector::const_iterator it = sect_opts.begin (); if (!seen_addr) @@ -2286,14 +2290,14 @@ add_symbol_file_command (const char *args, int from_tty) const char *sec = it->name; if (section_addrs.empty ()) - printf_unfiltered (_(" at\n")); + printf_filtered (_(" at\n")); addr = parse_and_eval_address (val); /* Here we store the section offsets in the order they were - entered on the command line. Every array element is - assigned an ascending section index to preserve the above - order over an unstable sorting algorithm. This dummy - index is not used for any other purpose. + entered on the command line. Every array element is + assigned an ascending section index to preserve the above + order over an unstable sorting algorithm. This dummy + index is not used for any other purpose. */ section_addrs.emplace_back (addr, sec, section_addrs.size ()); printf_filtered ("\t%s_addr = %s\n", sec, @@ -2306,13 +2310,13 @@ add_symbol_file_command (const char *args, int from_tty) so we can't determine what section names are valid. */ } if (seen_offset) - printf_unfiltered (_("%s offset by %s\n"), - (section_addrs.empty () - ? _(" with all sections") - : _("with other sections")), - paddress (gdbarch, offset)); + printf_filtered (_("%s offset by %s\n"), + (section_addrs.empty () + ? _(" with all sections") + : _("with other sections")), + paddress (gdbarch, offset)); else if (section_addrs.empty ()) - printf_unfiltered ("\n"); + printf_filtered ("\n"); if (from_tty && (!query ("%s", ""))) error (_("Not confirmed.")); @@ -2326,7 +2330,7 @@ add_symbol_file_command (const char *args, int from_tty) if (seen_offset) set_objfile_default_section_offset (objf, section_addrs, offset); - add_target_sections_of_objfile (objf); + current_program_space->add_target_sections (objf); /* Getting new symbols may change our opinion about what is frameless. */ @@ -2411,7 +2415,7 @@ remove_symbol_file_command (const char *args, int from_tty) /* Re-read symbols if a symbol-file has changed. */ void -reread_symbols (void) +reread_symbols (int from_tty) { long new_modtime; struct stat new_statbuf; @@ -2463,9 +2467,9 @@ reread_symbols (void) /* We need to do this whenever any symbols go away. */ clear_symtab_users_cleanup defer_clear_users (0); - if (exec_bfd != NULL + if (current_program_space->exec_bfd () != NULL && filename_cmp (bfd_get_filename (objfile->obfd), - bfd_get_filename (exec_bfd)) == 0) + bfd_get_filename (current_program_space->exec_bfd ())) == 0) { /* Reload EXEC_BFD without asking anything. */ @@ -2519,8 +2523,6 @@ reread_symbols (void) error (_("Can't read symbols from %s: %s."), objfile_name (objfile), bfd_errmsg (bfd_get_error ())); - objfile->reset_psymtabs (); - /* NB: after this call to obstack_free, objfiles_changed will need to be called (see discussion below). */ obstack_free (&objfile->objfile_obstack, 0); @@ -2552,13 +2554,14 @@ reread_symbols (void) based on whether .gdb_index is present, and we need it to start over. PR symtab/15885 */ objfile_set_sym_fns (objfile, find_sym_fns (objfile->obfd)); + objfile->qf.clear (); build_objfile_section_table (objfile); /* What the hell is sym_new_init for, anyway? The concept of distinguishing between the main file and additional files in this way seems rather dubious. */ - if (objfile == symfile_objfile) + if (objfile == current_program_space->symfile_object_file) { (*objfile->sf->sym_new_init) (objfile); } @@ -2589,11 +2592,24 @@ reread_symbols (void) read_symbols (objfile, 0); + if ((objfile->flags & OBJF_READNOW)) + { + const int mainline = objfile->flags & OBJF_MAINLINE; + const int should_print = (print_symbol_loading_p (from_tty, mainline, 1) + && readnow_symbol_files); + if (should_print) + printf_filtered (_("Expanding full symbols from %ps...\n"), + styled_string (file_name_style.style (), + objfile_name (objfile))); + + objfile->expand_all_symtabs (); + } + if (!objfile_has_symbols (objfile)) { - wrap_here (""); + gdb_stdout->wrap_here (0); printf_filtered (_("(no debugging symbols found)\n")); - wrap_here (""); + gdb_stdout->wrap_here (0); } /* We're done reading the symbol file; finish off complaints. */ @@ -2629,7 +2645,7 @@ reread_symbols (void) gdb::observers::new_objfile.notify (iter); /* At least one objfile has changed, so we can consider that - the executable we're debugging has changed too. */ + the executable we're debugging has changed too. */ gdb::observers::executable_changed.notify (); } } @@ -2656,7 +2672,7 @@ add_filename_language (const char *ext, enum language lang) filename_language_table.emplace_back (ext, lang); } -static char *ext_args; +static std::string ext_args; static void show_ext_args (struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value) @@ -2671,48 +2687,48 @@ static void set_ext_lang_command (const char *args, int from_tty, struct cmd_list_element *e) { - char *cp = ext_args; - enum language lang; + const char *begin = ext_args.c_str (); + const char *end = ext_args.c_str (); /* First arg is filename extension, starting with '.' */ - if (*cp != '.') - error (_("'%s': Filename extension must begin with '.'"), ext_args); + if (*end != '.') + error (_("'%s': Filename extension must begin with '.'"), ext_args.c_str ()); /* Find end of first arg. */ - while (*cp && !isspace (*cp)) - cp++; + while (*end != '\0' && !isspace (*end)) + end++; - if (*cp == '\0') + if (*end == '\0') error (_("'%s': two arguments required -- " "filename extension and language"), - ext_args); + ext_args.c_str ()); - /* Null-terminate first arg. */ - *cp++ = '\0'; + /* Extract first arg, the extension. */ + std::string extension = ext_args.substr (0, end - begin); /* Find beginning of second arg, which should be a source language. */ - cp = skip_spaces (cp); + begin = skip_spaces (end); - if (*cp == '\0') + if (*begin == '\0') error (_("'%s': two arguments required -- " "filename extension and language"), - ext_args); + ext_args.c_str ()); /* Lookup the language from among those we know. */ - lang = language_enum (cp); + language lang = language_enum (begin); auto it = filename_language_table.begin (); /* Now lookup the filename extension: do we already know it? */ for (; it != filename_language_table.end (); it++) { - if (it->ext == ext_args) + if (it->ext == extension) break; } if (it == filename_language_table.end ()) { /* New file extension. */ - add_filename_language (ext_args, lang); + add_filename_language (extension.data (), lang); } else { @@ -2758,13 +2774,13 @@ deduce_language_from_filename (const char *filename) struct symtab * allocate_symtab (struct compunit_symtab *cust, const char *filename) { - struct objfile *objfile = cust->objfile; + struct objfile *objfile = cust->objfile (); struct symtab *symtab = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct symtab); symtab->filename = objfile->intern (filename); symtab->fullname = NULL; - symtab->language = deduce_language_from_filename (filename); + symtab->set_language (deduce_language_from_filename (filename)); /* This can be very verbose with lots of headers. Only print at higher debug levels. */ @@ -2772,16 +2788,15 @@ allocate_symtab (struct compunit_symtab *cust, const char *filename) { /* Be a bit clever with debugging messages, and don't print objfile every time, only when it changes. */ - static char *last_objfile_name = NULL; + static std::string last_objfile_name; + const char *this_objfile_name = objfile_name (objfile); - if (last_objfile_name == NULL - || strcmp (last_objfile_name, objfile_name (objfile)) != 0) + if (last_objfile_name.empty () || last_objfile_name != this_objfile_name) { - xfree (last_objfile_name); - last_objfile_name = xstrdup (objfile_name (objfile)); + last_objfile_name = this_objfile_name; fprintf_filtered (gdb_stdlog, "Creating one or more symtabs for objfile %s ...\n", - last_objfile_name); + this_objfile_name); } fprintf_filtered (gdb_stdlog, "Created symtab %s for module %s.\n", @@ -2789,19 +2804,10 @@ allocate_symtab (struct compunit_symtab *cust, const char *filename) } /* Add it to CUST's list of symtabs. */ - if (cust->filetabs == NULL) - { - cust->filetabs = symtab; - cust->last_filetab = symtab; - } - else - { - cust->last_filetab->next = symtab; - cust->last_filetab = symtab; - } + cust->add_filetab (symtab); /* Backlink to the containing compunit symtab. */ - symtab->compunit_symtab = cust; + symtab->set_compunit (cust); return symtab; } @@ -2817,7 +2823,7 @@ allocate_compunit_symtab (struct objfile *objfile, const char *name) struct compunit_symtab); const char *saved_name; - cu->objfile = objfile; + cu->set_objfile (objfile); /* The name we record here is only for display/debugging purposes. Just save the basename to avoid path issues (too long for display, @@ -2825,7 +2831,7 @@ allocate_compunit_symtab (struct objfile *objfile, const char *name) saved_name = lbasename (name); cu->name = obstack_strdup (&objfile->objfile_obstack, saved_name); - COMPUNIT_DEBUGFORMAT (cu) = "unknown"; + cu->set_debugformat ("unknown"); if (symtab_create_debug) { @@ -2843,8 +2849,8 @@ allocate_compunit_symtab (struct objfile *objfile, const char *name) void add_compunit_symtab_to_objfile (struct compunit_symtab *cu) { - cu->next = cu->objfile->compunit_symtabs; - cu->objfile->compunit_symtabs = cu; + cu->next = cu->objfile ()->compunit_symtabs; + cu->objfile ()->compunit_symtabs = cu; } @@ -2985,7 +2991,7 @@ section_is_mapped (struct obj_section *osect) return 0; /* overlay debugging off */ case ovly_auto: /* overlay debugging automatic */ /* Unles there is a gdbarch_overlay_update function, - there's really nothing useful to do here (can't really go auto). */ + there's really nothing useful to do here (can't really go auto). */ gdbarch = osect->objfile->arch (); if (gdbarch_overlay_update_p (gdbarch)) { @@ -3015,7 +3021,7 @@ pc_in_unmapped_range (CORE_ADDR pc, struct obj_section *section) /* We assume the LMA is relocated by the same offset as the VMA. */ bfd_vma size = bfd_section_size (bfd_section); - CORE_ADDR offset = obj_section_offset (section); + CORE_ADDR offset = section->offset (); if (bfd_section_lma (bfd_section) + offset <= pc && pc < bfd_section_lma (bfd_section) + offset + size) @@ -3033,8 +3039,8 @@ pc_in_mapped_range (CORE_ADDR pc, struct obj_section *section) { if (section_is_overlay (section)) { - if (obj_section_addr (section) <= pc - && pc < obj_section_endaddr (section)) + if (section->addr () <= pc + && pc < section->endaddr ()) return 1; } @@ -3047,10 +3053,10 @@ pc_in_mapped_range (CORE_ADDR pc, struct obj_section *section) static int sections_overlap (struct obj_section *a, struct obj_section *b) { - CORE_ADDR a_start = obj_section_addr (a); - CORE_ADDR a_end = obj_section_endaddr (a); - CORE_ADDR b_start = obj_section_addr (b); - CORE_ADDR b_end = obj_section_endaddr (b); + CORE_ADDR a_start = a->addr (); + CORE_ADDR a_end = a->endaddr (); + CORE_ADDR b_start = b->addr (); + CORE_ADDR b_end = b->endaddr (); return (a_start < b_end && b_start < a_end); } @@ -3196,13 +3202,13 @@ list_overlays_command (const char *args, int from_tty) name = bfd_section_name (osect->the_bfd_section); printf_filtered ("Section %s, loaded at ", name); - fputs_filtered (paddress (gdbarch, lma), gdb_stdout); + puts_filtered (paddress (gdbarch, lma)); puts_filtered (" - "); - fputs_filtered (paddress (gdbarch, lma + size), gdb_stdout); + puts_filtered (paddress (gdbarch, lma + size)); printf_filtered (", mapped at "); - fputs_filtered (paddress (gdbarch, vma), gdb_stdout); + puts_filtered (paddress (gdbarch, vma)); puts_filtered (" - "); - fputs_filtered (paddress (gdbarch, vma + size), gdb_stdout); + puts_filtered (paddress (gdbarch, vma + size)); puts_filtered ("\n"); nmapped++; @@ -3248,8 +3254,8 @@ map_overlay_command (const char *args, int from_tty) sec2)) { if (info_verbose) - printf_unfiltered (_("Note: section %s unmapped by overlap\n"), - bfd_section_name (sec2->the_bfd_section)); + printf_filtered (_("Note: section %s unmapped by overlap\n"), + bfd_section_name (sec2->the_bfd_section)); sec2->ovly_mapped = 0; /* sec2 overlaps sec: unmap sec2. */ } return; @@ -3297,7 +3303,7 @@ overlay_auto_command (const char *args, int from_tty) overlay_debugging = ovly_auto; enable_overlay_breakpoints (); if (info_verbose) - printf_unfiltered (_("Automatic overlay debugging enabled.")); + printf_filtered (_("Automatic overlay debugging enabled.")); } /* Function: overlay_manual_command @@ -3310,7 +3316,7 @@ overlay_manual_command (const char *args, int from_tty) overlay_debugging = ovly_on; disable_overlay_breakpoints (); if (info_verbose) - printf_unfiltered (_("Overlay debugging enabled.")); + printf_filtered (_("Overlay debugging enabled.")); } /* Function: overlay_off_command @@ -3323,7 +3329,7 @@ overlay_off_command (const char *args, int from_tty) overlay_debugging = ovly_off; disable_overlay_breakpoints (); if (info_verbose) - printf_unfiltered (_("Overlay debugging disabled.")); + printf_filtered (_("Overlay debugging disabled.")); } static void @@ -3426,8 +3432,8 @@ simple_read_overlay_table (void) if (! novlys_msym.minsym) { error (_("Error reading inferior's overlay table: " - "couldn't find `_novlys' variable\n" - "in inferior. Use `overlay manual' mode.")); + "couldn't find `_novlys' variable\n" + "in inferior. Use `overlay manual' mode.")); return 0; } @@ -3435,8 +3441,8 @@ simple_read_overlay_table (void) if (! ovly_table_msym.minsym) { error (_("Error reading inferior's overlay table: couldn't find " - "`_ovly_table' array\n" - "in inferior. Use `overlay manual' mode.")); + "`_ovly_table' array\n" + "in inferior. Use `overlay manual' mode.")); return 0; } @@ -3450,8 +3456,8 @@ simple_read_overlay_table (void) = (unsigned int (*)[4]) xmalloc (cache_novlys * sizeof (*cache_ovly_table)); cache_ovly_table_base = BMSYMBOL_VALUE_ADDRESS (ovly_table_msym); read_target_long_array (cache_ovly_table_base, - (unsigned int *) cache_ovly_table, - cache_novlys * 4, word_size, byte_order); + (unsigned int *) cache_ovly_table, + cache_novlys * 4, word_size, byte_order); return 1; /* SUCCESS */ } @@ -3555,7 +3561,7 @@ simple_overlay_update (struct obj_section *osect) bfd_byte * default_symfile_relocate (struct objfile *objfile, asection *sectp, - bfd_byte *buf) + bfd_byte *buf) { /* Use sectp->owner instead of objfile->obfd. sectp may point to a DWO file. */ @@ -3593,7 +3599,7 @@ default_symfile_relocate (struct objfile *objfile, asection *sectp, bfd_byte * symfile_relocate_debug_section (struct objfile *objfile, - asection *sectp, bfd_byte *buf) + asection *sectp, bfd_byte *buf) { gdb_assert (objfile->sf->sym_relocate); @@ -3652,14 +3658,14 @@ symfile_map_offsets_to_segments (bfd *abfd, gdb_assert (0 <= which && which <= data->segments.size ()); /* Don't bother computing offsets for sections that aren't - loaded as part of any segment. */ + loaded as part of any segment. */ if (! which) - continue; + continue; /* Use the last SEGMENT_BASES entry as the address of any extra - segments mentioned in DATA->segment_info. */ + segments mentioned in DATA->segment_info. */ if (which > num_segment_bases) - which = num_segment_bases; + which = num_segment_bases; offsets[i] = segment_bases[which - 1] - data->segments[which - 1].base; } @@ -3712,29 +3718,32 @@ symfile_free_objfile (struct objfile *objfile) { /* Remove the target sections owned by this objfile. */ if (objfile != NULL) - remove_target_sections ((void *) objfile); + current_program_space->remove_target_sections ((void *) objfile); } /* Wrapper around the quick_symbol_functions expand_symtabs_matching "method". Expand all symtabs that match the specified criteria. See quick_symbol_functions.expand_symtabs_matching for details. */ -void +bool expand_symtabs_matching (gdb::function_view file_matcher, const lookup_name_info &lookup_name, gdb::function_view symbol_matcher, gdb::function_view expansion_notify, + block_search_flags search_flags, enum search_domain kind) { for (objfile *objfile : current_program_space->objfiles ()) - { - if (objfile->sf) - objfile->sf->qf->expand_symtabs_matching (objfile, file_matcher, - &lookup_name, - symbol_matcher, - expansion_notify, kind); - } + if (!objfile->expand_symtabs_matching (file_matcher, + &lookup_name, + symbol_matcher, + expansion_notify, + search_flags, + UNDEF_DOMAIN, + kind)) + return false; + return true; } /* Wrapper around the quick_symbol_functions map_symbol_filenames "method". @@ -3742,15 +3751,11 @@ expand_symtabs_matching See quick_symbol_functions.map_symbol_filenames for details. */ void -map_symbol_filenames (symbol_filename_ftype *fun, void *data, - int need_fullname) +map_symbol_filenames (gdb::function_view fun, + bool need_fullname) { for (objfile *objfile : current_program_space->objfiles ()) - { - if (objfile->sf) - objfile->sf->qf->map_symbol_filenames (objfile, fun, data, - need_fullname); - } + objfile->map_symbol_filenames (fun, need_fullname); } #if GDB_SELF_TEST @@ -3788,8 +3793,7 @@ test_set_ext_lang_command () SELF_CHECK (lang == language_unknown); /* Test adding a new extension using the CLI command. */ - auto args_holder = make_unique_xstrdup (".hello rust"); - ext_args = args_holder.get (); + ext_args = ".hello rust"; set_ext_lang_command (NULL, 1, NULL); lang = deduce_language_from_filename ("cake.hello"); @@ -3797,8 +3801,7 @@ test_set_ext_lang_command () /* Test overriding an existing extension using the CLI command. */ int size_before = filename_language_table.size (); - args_holder.reset (xstrdup (".hello pascal")); - ext_args = args_holder.get (); + ext_args = ".hello pascal"; set_ext_lang_command (NULL, 1, NULL); int size_after = filename_language_table.size (); @@ -3818,7 +3821,7 @@ _initialize_symfile () { struct cmd_list_element *c; - gdb::observers::free_objfile.attach (symfile_free_objfile); + gdb::observers::free_objfile.attach (symfile_free_objfile, "symfile"); #define READNOW_READNEVER_HELP \ "The '-readnow' option will cause GDB to read the entire symbol file\n\ @@ -3867,12 +3870,13 @@ When OFFSET is provided, FILE must also be provided. FILE can be provided\n\ on its own."), &cmdlist); set_cmd_completer (c, filename_completer); - add_basic_prefix_cmd ("overlay", class_support, - _("Commands for debugging overlays."), &overlaylist, - "overlay ", 0, &cmdlist); + cmd_list_element *overlay_cmd + = add_basic_prefix_cmd ("overlay", class_support, + _("Commands for debugging overlays."), &overlaylist, + 0, &cmdlist); - add_com_alias ("ovly", "overlay", class_support, 1); - add_com_alias ("ov", "overlay", class_support, 1); + add_com_alias ("ovly", overlay_cmd, class_support, 1); + add_com_alias ("ov", overlay_cmd, class_support, 1); add_cmd ("map-overlay", class_support, map_overlay_command, _("Assert that an overlay section is mapped."), &overlaylist); @@ -3924,9 +3928,9 @@ Set printing of symbol loading messages."), _("\ Show printing of symbol loading messages."), _("\ off == turn all messages off\n\ brief == print messages for the executable,\n\ - and brief messages for shared libraries\n\ + and brief messages for shared libraries\n\ full == print messages for the executable,\n\ - and messages for each shared library."), + and messages for each shared library."), NULL, NULL, &setprintlist, &showprintlist);