diff options
author | Simon Marchi <simon.marchi@polymtl.ca> | 2021-04-02 11:45:25 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@polymtl.ca> | 2021-04-02 11:45:37 -0400 |
commit | 0072c873792829e2be43acf8bbf1c352c266e4c7 (patch) | |
tree | 50a2ade2ef271eede88340679e65e81e0c009a0a | |
parent | 9984dd9994c3d71fd28f41c50cdece48d6be13a6 (diff) | |
download | gdb-0072c873792829e2be43acf8bbf1c352c266e4c7.zip gdb-0072c873792829e2be43acf8bbf1c352c266e4c7.tar.gz gdb-0072c873792829e2be43acf8bbf1c352c266e4c7.tar.bz2 |
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) <partial_symtab>: Change
objfile parameter for objfile_per_bfd_storage, adjust callers.
(struct standard_psymtab) <standard_psymtab>: Likewise.
(struct legacy_psymtab) <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)
<objfile_per_bfd_storage>: Add bfd parameter, adjust callers.
<get_bfd>: New method.
<m_bfd>: New field.
* objfiles.c (get_objfile_bfd_data): Adjust.
Change-Id: I2ed3ab5d2e6f27d034bd4dc26ae2fae7b0b8a2b9
-rw-r--r-- | gdb/ChangeLog | 17 | ||||
-rw-r--r-- | gdb/ctfread.c | 6 | ||||
-rw-r--r-- | gdb/dbxread.c | 4 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 18 | ||||
-rw-r--r-- | gdb/dwarf2/read.h | 4 | ||||
-rw-r--r-- | gdb/mdebugread.c | 6 | ||||
-rw-r--r-- | gdb/objfiles.c | 2 | ||||
-rw-r--r-- | gdb/objfiles.h | 16 | ||||
-rw-r--r-- | gdb/psympriv.h | 23 | ||||
-rw-r--r-- | gdb/psymtab.c | 21 | ||||
-rw-r--r-- | gdb/xcoffread.c | 4 |
11 files changed, 75 insertions, 46 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6d61a2c..3530819 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,22 @@ 2021-04-02 Simon Marchi <simon.marchi@polymtl.ca> + * psympriv.h (struct partial_symtab) <partial_symtab>: Change + objfile parameter for objfile_per_bfd_storage, adjust callers. + (struct standard_psymtab) <standard_psymtab>: Likewise. + (struct legacy_psymtab) <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) + <objfile_per_bfd_storage>: Add bfd parameter, adjust callers. + <get_bfd>: New method. + <m_bfd>: New field. + * objfiles.c (get_objfile_bfd_data): Adjust. + +2021-04-02 Simon Marchi <simon.marchi@polymtl.ca> + * psymtab.c (partial_symtab::partial_symtab): Change last_objfile_name to be an std::string. * symfile.c (allocate_symtab): Likewise. diff --git a/gdb/ctfread.c b/gdb/ctfread.c index 616464c..fae244d 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 99a36ca..5cf77e9 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 49b07d5..43433f5 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 82ab387..416d8ea 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 7bf4564..026f2ff 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 ed51c31..7029007 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 e8a8b5f..bf6e6a1 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<nr_languages> 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 193d64f..e4bf038 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 26ea35e..6f3d856 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 30ac876..3685727 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; |