From 0072c873792829e2be43acf8bbf1c352c266e4c7 Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Fri, 2 Apr 2021 11:45:25 -0400 Subject: [PATCH] gdb: pass objfile_per_bfd_storage instead of objfile to partial_symtab Since partial_symtab is supposed to be objfile-independent (since series [1]), I think it would make sense for partial_symtab to not take an objfile as a parameter in its constructor. This patch replaces that parameter with an objfile_per_bfd_storage parameter. The objfile is used for two things: - to get the objfile_name, for debug messages. We can get that name from the bfd instead. - to intern the partial symtab filename. Even though it goes through an objfile method, the request is actually forwarded to the underlying objfile_per_bfd_storage. So we can ask the new objfile_per_bfd_storage instead. In order to get a reference to the BFD from the objfile_per_bfd_storage, the BFD is saved in the objfile_per_bfd_storage object. [1] https://sourceware.org/pipermail/gdb-patches/2021-February/176625.html gdb/ChangeLog: * psympriv.h (struct partial_symtab) : Change objfile parameter for objfile_per_bfd_storage, adjust callers. (struct standard_psymtab) : Likewise. (struct legacy_psymtab) : Likewise. * psymtab.c (partial_symtab::partial_symtab): Likewise. * ctfread.c (struct ctf_psymtab): Likewise. * dwarf2/read.h (struct dwarf2_psymtab): Likewise. * dwarf2/read.c (struct dwarf2_include_psymtab): Likewise. (dwarf2_create_include_psymtab): Likewise. * objfiles.h (struct objfile_per_bfd_storage) : Add bfd parameter, adjust callers. : New method. : New field. * objfiles.c (get_objfile_bfd_data): Adjust. Change-Id: I2ed3ab5d2e6f27d034bd4dc26ae2fae7b0b8a2b9 --- gdb/ChangeLog | 17 +++++++++++++++++ gdb/ctfread.c | 6 +++--- gdb/dbxread.c | 4 ++-- gdb/dwarf2/read.c | 18 ++++++++---------- gdb/dwarf2/read.h | 4 ++-- gdb/mdebugread.c | 6 +++--- gdb/objfiles.c | 2 +- gdb/objfiles.h | 16 ++++++++++++++-- gdb/psympriv.h | 23 ++++++++++++----------- gdb/psymtab.c | 21 +++++++++++---------- gdb/xcoffread.c | 4 ++-- 11 files changed, 75 insertions(+), 46 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6d61a2cc7c..3530819cf9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,20 @@ +2021-04-02 Simon Marchi + + * psympriv.h (struct partial_symtab) : Change + objfile parameter for objfile_per_bfd_storage, adjust callers. + (struct standard_psymtab) : Likewise. + (struct legacy_psymtab) : Likewise. + * psymtab.c (partial_symtab::partial_symtab): Likewise. + * ctfread.c (struct ctf_psymtab): Likewise. + * dwarf2/read.h (struct dwarf2_psymtab): Likewise. + * dwarf2/read.c (struct dwarf2_include_psymtab): Likewise. + (dwarf2_create_include_psymtab): Likewise. + * objfiles.h (struct objfile_per_bfd_storage) + : Add bfd parameter, adjust callers. + : New method. + : New field. + * objfiles.c (get_objfile_bfd_data): Adjust. + 2021-04-02 Simon Marchi * psymtab.c (partial_symtab::partial_symtab): Change diff --git a/gdb/ctfread.c b/gdb/ctfread.c index 616464c77d..fae244d448 100644 --- a/gdb/ctfread.c +++ b/gdb/ctfread.c @@ -125,9 +125,9 @@ struct ctf_psymtab : public standard_psymtab { ctf_psymtab (const char *filename, psymtab_storage *partial_symtabs, - struct objfile *objfile, + objfile_per_bfd_storage *objfile_per_bfd, CORE_ADDR addr) - : standard_psymtab (filename, partial_symtabs, objfile, addr) + : standard_psymtab (filename, partial_symtabs, objfile_per_bfd, addr) { } @@ -1369,7 +1369,7 @@ create_partial_symtab (const char *name, ctf_psymtab *pst; struct ctf_context *ccx; - pst = new ctf_psymtab (name, partial_symtabs, objfile, 0); + pst = new ctf_psymtab (name, partial_symtabs, objfile->per_bfd, 0); ccx = XOBNEW (&objfile->objfile_obstack, struct ctf_context); ccx->fp = cfp; diff --git a/gdb/dbxread.c b/gdb/dbxread.c index 99a36cafa1..5cf77e9c08 100644 --- a/gdb/dbxread.c +++ b/gdb/dbxread.c @@ -1917,7 +1917,7 @@ start_psymtab (psymtab_storage *partial_symtabs, struct objfile *objfile, const char *filename, CORE_ADDR textlow, int ldsymoff) { legacy_psymtab *result = new legacy_psymtab (filename, partial_symtabs, - objfile, textlow); + objfile->per_bfd, textlow); result->read_symtab_private = XOBNEW (&objfile->objfile_obstack, struct symloc); @@ -2040,7 +2040,7 @@ dbx_end_psymtab (struct objfile *objfile, psymtab_storage *partial_symtabs, for (i = 0; i < num_includes; i++) { legacy_psymtab *subpst = - new legacy_psymtab (include_list[i], partial_symtabs, objfile); + new legacy_psymtab (include_list[i], partial_symtabs, objfile->per_bfd); subpst->read_symtab_private = XOBNEW (&objfile->objfile_obstack, struct symloc); diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 49b07d579b..43433f50d2 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -6248,8 +6248,8 @@ struct dwarf2_include_psymtab : public partial_symtab { dwarf2_include_psymtab (const char *filename, psymtab_storage *partial_symtabs, - struct objfile *objfile) - : partial_symtab (filename, partial_symtabs, objfile) + objfile_per_bfd_storage *objfile_per_bfd) + : partial_symtab (filename, partial_symtabs, objfile_per_bfd) { } @@ -6305,10 +6305,10 @@ dwarf2_create_include_psymtab (dwarf2_per_bfd *per_bfd, const char *name, dwarf2_psymtab *pst, psymtab_storage *partial_symtabs, - struct objfile *objfile) + objfile_per_bfd_storage *objfile_per_bfd) { dwarf2_include_psymtab *subpst - = new dwarf2_include_psymtab (name, partial_symtabs, objfile); + = new dwarf2_include_psymtab (name, partial_symtabs, objfile_per_bfd); if (!IS_ABSOLUTE_PATH (subpst->filename)) subpst->dirname = pst->dirname; @@ -7560,11 +7560,9 @@ create_partial_symtab (dwarf2_per_cu_data *per_cu, dwarf2_per_objfile *per_objfile, const char *name) { - struct objfile *objfile = per_objfile->objfile; - dwarf2_psymtab *pst; - - pst = new dwarf2_psymtab (name, per_objfile->per_bfd->partial_symtabs.get (), - objfile, per_cu); + dwarf2_psymtab *pst + = new dwarf2_psymtab (name, per_objfile->per_bfd->partial_symtabs.get (), + per_objfile->objfile->per_bfd, per_cu); pst->psymtabs_addrmap_supported = true; @@ -22010,7 +22008,7 @@ dwarf_decode_lines (struct line_header *lh, const char *comp_dir, dwarf2_create_include_psymtab (cu->per_objfile->per_bfd, include_name, pst, cu->per_objfile->per_bfd->partial_symtabs.get (), - objfile); + objfile->per_bfd); } } else diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h index 82ab3879a5..416d8eae95 100644 --- a/gdb/dwarf2/read.h +++ b/gdb/dwarf2/read.h @@ -408,9 +408,9 @@ struct dwarf2_psymtab : public partial_symtab { dwarf2_psymtab (const char *filename, psymtab_storage *partial_symtabs, - struct objfile *objfile, + objfile_per_bfd_storage *objfile_per_bfd, dwarf2_per_cu_data *per_cu) - : partial_symtab (filename, partial_symtabs, objfile, 0), + : partial_symtab (filename, partial_symtabs, objfile_per_bfd, 0), per_cu_data (per_cu) { } diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index 7bf4564aec..026f2ff20d 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -2605,8 +2605,8 @@ parse_partial_symbols (minimal_symbol_reader &reader, textlow = fh->adr; else textlow = 0; - pst = new legacy_psymtab (fdr_name (fh), partial_symtabs, objfile, - textlow); + pst = new legacy_psymtab (fdr_name (fh), partial_symtabs, + objfile->per_bfd, textlow); pst->read_symtab_private = XOBNEW (&objfile->objfile_obstack, symloc); memset (pst->read_symtab_private, 0, sizeof (struct symloc)); @@ -4646,7 +4646,7 @@ new_psymtab (const char *name, psymtab_storage *partial_symtabs, { legacy_psymtab *psymtab; - psymtab = new legacy_psymtab (name, partial_symtabs, objfile); + psymtab = new legacy_psymtab (name, partial_symtabs, objfile->per_bfd); /* Keep a backpointer to the file's symbols. */ diff --git a/gdb/objfiles.c b/gdb/objfiles.c index ed51c31c8b..702900761f 100644 --- a/gdb/objfiles.c +++ b/gdb/objfiles.c @@ -134,7 +134,7 @@ get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd) if (storage == NULL) { - storage = new objfile_per_bfd_storage; + storage = new objfile_per_bfd_storage (abfd); /* If the object requires gdb to do relocations, we simply fall back to not sharing data across users. These cases are rare enough that this seems reasonable. */ diff --git a/gdb/objfiles.h b/gdb/objfiles.h index e8a8b5f6de..bf6e6a1d01 100644 --- a/gdb/objfiles.h +++ b/gdb/objfiles.h @@ -264,8 +264,8 @@ private: struct objfile_per_bfd_storage { - objfile_per_bfd_storage () - : minsyms_read (false) + objfile_per_bfd_storage (bfd *bfd) + : minsyms_read (false), m_bfd (bfd) {} ~objfile_per_bfd_storage (); @@ -287,6 +287,13 @@ struct objfile_per_bfd_storage return (const char *) string_cache.insert (str.c_str (), str.size () + 1); } + /* Get the BFD this object is associated to. */ + + bfd *get_bfd () const + { + return m_bfd; + } + /* The storage has an obstack of its own. */ auto_obstack storage_obstack; @@ -364,6 +371,11 @@ struct objfile_per_bfd_storage /* All the different languages of symbols found in the demangled hash table. */ std::bitset demangled_hash_languages; + +private: + /* The BFD this object is associated to. */ + + bfd *m_bfd; }; /* An iterator that first returns a parent objfile, and then each diff --git a/gdb/psympriv.h b/gdb/psympriv.h index 193d64fbcf..e4bf038108 100644 --- a/gdb/psympriv.h +++ b/gdb/psympriv.h @@ -111,7 +111,8 @@ enum class psymbol_placement struct partial_symtab { - /* Allocate a new partial symbol table associated with OBJFILE. + /* Allocate a new partial symbol table. + FILENAME (which must be non-NULL) is the filename of this partial symbol table; it is copied into the appropriate storage. The partial symtab will also be installed using @@ -119,7 +120,7 @@ struct partial_symtab partial_symtab (const char *filename, psymtab_storage *partial_symtabs, - struct objfile *objfile) + objfile_per_bfd_storage *objfile_per_bfd) ATTRIBUTE_NONNULL (2) ATTRIBUTE_NONNULL (3); /* Like the above, but also sets the initial text low and text high @@ -128,7 +129,7 @@ struct partial_symtab partial_symtab (const char *filename, psymtab_storage *partial_symtabs, - struct objfile *objfile, + objfile_per_bfd_storage *objfile_per_bfd, CORE_ADDR addr) ATTRIBUTE_NONNULL (2) ATTRIBUTE_NONNULL (3); @@ -369,16 +370,16 @@ struct standard_psymtab : public partial_symtab { standard_psymtab (const char *filename, psymtab_storage *partial_symtabs, - struct objfile *objfile) - : partial_symtab (filename, partial_symtabs, objfile) + objfile_per_bfd_storage *objfile_per_bfd) + : partial_symtab (filename, partial_symtabs, objfile_per_bfd) { } standard_psymtab (const char *filename, psymtab_storage *partial_symtabs, - struct objfile *objfile, + objfile_per_bfd_storage *objfile_per_bfd, CORE_ADDR addr) - : partial_symtab (filename, partial_symtabs, objfile, addr) + : partial_symtab (filename, partial_symtabs, objfile_per_bfd, addr) { } @@ -411,16 +412,16 @@ struct legacy_psymtab : public standard_psymtab { legacy_psymtab (const char *filename, psymtab_storage *partial_symtabs, - struct objfile *objfile) - : standard_psymtab (filename, partial_symtabs, objfile) + objfile_per_bfd_storage *objfile_per_bfd) + : standard_psymtab (filename, partial_symtabs, objfile_per_bfd) { } legacy_psymtab (const char *filename, psymtab_storage *partial_symtabs, - struct objfile *objfile, + objfile_per_bfd_storage *objfile_per_bfd, CORE_ADDR addr) - : standard_psymtab (filename, partial_symtabs, objfile, addr) + : standard_psymtab (filename, partial_symtabs, objfile_per_bfd, addr) { } diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 26ea35ea40..6f3d856215 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -1436,9 +1436,9 @@ psymbol_functions::find_compunit_symtab_by_address (struct objfile *objfile, partial_symtab::partial_symtab (const char *filename, psymtab_storage *partial_symtabs, - struct objfile *objfile, + objfile_per_bfd_storage *objfile_per_bfd, CORE_ADDR textlow) - : partial_symtab (filename, partial_symtabs, objfile) + : partial_symtab (filename, partial_symtabs, objfile_per_bfd) { set_text_low (textlow); set_text_high (raw_text_low ()); /* default */ @@ -1561,28 +1561,29 @@ partial_symtab::add_psymbol (gdb::string_view name, bool copy_name, partial_symtab::partial_symtab (const char *filename_, psymtab_storage *partial_symtabs, - struct objfile *objfile) + objfile_per_bfd_storage *objfile_per_bfd) : searched_flag (PST_NOT_SEARCHED), text_low_valid (0), text_high_valid (0) { partial_symtabs->install_psymtab (this); - filename = objfile->intern (filename_); + filename = objfile_per_bfd->intern (filename_); if (symtab_create_debug) { /* Be a bit clever with debugging messages, and don't print objfile every time, only when it changes. */ - static std::string last_objfile_name; - const char *this_objfile_name = objfile_name (objfile); + static std::string last_bfd_name; + const char *this_bfd_name + = bfd_get_filename (objfile_per_bfd->get_bfd ()); - if (last_objfile_name.empty () || last_objfile_name != this_objfile_name) + if (last_bfd_name.empty () || last_bfd_name != this_bfd_name) { - last_objfile_name = this_objfile_name; + last_bfd_name = this_bfd_name; fprintf_filtered (gdb_stdlog, - "Creating one or more psymtabs for objfile %s ...\n", - this_objfile_name); + "Creating one or more psymtabs for %s ...\n", + this_bfd_name); } fprintf_filtered (gdb_stdlog, "Created psymtab %s for module %s.\n", diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index 30ac876e8e..368572797f 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -1966,7 +1966,7 @@ xcoff_start_psymtab (psymtab_storage *partial_symtabs, { /* We fill in textlow later. */ legacy_psymtab *result = new legacy_psymtab (filename, partial_symtabs, - objfile, 0); + objfile->per_bfd, 0); result->read_symtab_private = XOBNEW (&objfile->objfile_obstack, struct symloc); @@ -2022,7 +2022,7 @@ xcoff_end_psymtab (struct objfile *objfile, psymtab_storage *partial_symtabs, for (i = 0; i < num_includes; i++) { legacy_psymtab *subpst = - new legacy_psymtab (include_list[i], partial_symtabs, objfile); + new legacy_psymtab (include_list[i], partial_symtabs, objfile->per_bfd); subpst->read_symtab_private = XOBNEW (&objfile->objfile_obstack, symloc); ((struct symloc *) subpst->read_symtab_private)->first_symnum = 0; -- 2.34.1