X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fpsympriv.h;h=4622be389bd557f758c71168d4c3735c54906a7b;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=3e89742d8d5773c70696b9ed6a14fe3156546b31;hpb=703a86c2fa74e6c998ed24a8823658119f176b2d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/psympriv.h b/gdb/psympriv.h index 3e89742d8d..4622be389b 100644 --- a/gdb/psympriv.h +++ b/gdb/psympriv.h @@ -1,6 +1,6 @@ /* Private partial symbol table definitions. - Copyright (C) 2009-2019 Free Software Foundation, Inc. + Copyright (C) 2009-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -22,6 +22,7 @@ #include "psymtab.h" #include "objfiles.h" +#include "gdbsupport/gdb_string_view.h" /* A partial_symbol records the name, domain, and address class of symbols whose types we have not parsed yet. For functions, it also @@ -54,8 +55,7 @@ struct partial_symbol the offsets provided in OBJFILE. */ CORE_ADDR address (const struct objfile *objfile) const { - return (ginfo.value.address - + ANOFFSET (objfile->section_offsets, ginfo.section)); + return ginfo.value.address + objfile->section_offsets[ginfo.section]; } /* Set the address of this partial symbol. The address must be @@ -99,11 +99,65 @@ enum psymtab_search_status They are all chained on partial symtab lists. Even after the source file has been read into a symtab, the - partial_symtab remains around. They are allocated on an obstack, - objfile_obstack. */ + partial_symtab remains around. */ struct partial_symtab { + /* Allocate a new partial symbol table associated with OBJFILE. + 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 + psymtab_storage::install. */ + + partial_symtab (const char *filename, struct objfile *objfile) + ATTRIBUTE_NONNULL (2) ATTRIBUTE_NONNULL (3); + + /* Like the above, but also sets the initial text low and text high + from the ADDR argument, and sets the global- and + static-offsets. */ + + partial_symtab (const char *filename, struct objfile *objfile, + CORE_ADDR addr) + ATTRIBUTE_NONNULL (2) ATTRIBUTE_NONNULL (3); + + virtual ~partial_symtab () + { + } + + /* Psymtab expansion is done in two steps: + - a call to read_symtab + - while that call is in progress, calls to expand_psymtab can be made, + both for this psymtab, and its dependencies. + This makes a distinction between a toplevel psymtab (for which both + read_symtab and expand_psymtab will be called) and a non-toplevel + psymtab (for which only expand_psymtab will be called). The + distinction can be used f.i. to do things before and after all + dependencies of a top-level psymtab have been expanded. + + Read the full symbol table corresponding to this partial symbol + table. Typically calls expand_psymtab. */ + virtual void read_symtab (struct objfile *) = 0; + + /* Expand the full symbol table for this partial symbol table. Typically + calls expand_dependencies. */ + virtual void expand_psymtab (struct objfile *) = 0; + + /* Ensure that all the dependencies are read in. Calls + expand_psymtab for each non-shared dependency. */ + void expand_dependencies (struct objfile *); + + /* Return true if the symtab corresponding to this psymtab has been + read in in the context of this objfile. */ + virtual bool readin_p (struct objfile *) const = 0; + + /* Return a pointer to the compunit allocated for this source file + in the context of this objfile. + + Return nullptr if the compunit was not read in or if there was no + symtab. */ + virtual struct compunit_symtab *get_compunit_symtab + (struct objfile *) const = 0; + /* Return the raw low text address of this partial_symtab. */ CORE_ADDR raw_text_low () const { @@ -119,15 +173,13 @@ struct partial_symtab /* Return the relocated low text address of this partial_symtab. */ CORE_ADDR text_low (struct objfile *objfile) const { - return m_text_low + ANOFFSET (objfile->section_offsets, - SECT_OFF_TEXT (objfile)); + return m_text_low + objfile->text_section_offset (); } /* Return the relocated high text address of this partial_symtab. */ CORE_ADDR text_high (struct objfile *objfile) const { - return m_text_high + ANOFFSET (objfile->section_offsets, - SECT_OFF_TEXT (objfile)); + return m_text_high + objfile->text_section_offset (); } /* Set the low text address of this partial_symtab. */ @@ -147,21 +199,21 @@ struct partial_symtab /* Chain of all existing partial symtabs. */ - struct partial_symtab *next; + struct partial_symtab *next = nullptr; /* Name of the source file which this partial_symtab defines, or if the psymtab is anonymous then a descriptive name for debugging purposes, or "". It must not be NULL. */ - const char *filename; + const char *filename = nullptr; /* Full path of the source file. NULL if not known. */ - char *fullname; + char *fullname = nullptr; /* Directory in which it was compiled, or NULL if we don't know. */ - const char *dirname; + const char *dirname = nullptr; /* Range of text addresses covered by this file; texthigh is the beginning of the next section. Do not use if PSYMTABS_ADDRMAP_SUPPORTED @@ -170,8 +222,8 @@ struct partial_symtab text_low_valid and text_high_valid fields; these are located later in this structure for better packing. */ - CORE_ADDR m_text_low; - CORE_ADDR m_text_high; + CORE_ADDR m_text_low = 0; + CORE_ADDR m_text_high = 0; /* If NULL, this is an ordinary partial symbol table. @@ -200,7 +252,7 @@ struct partial_symtab The choice of which one should be canonical is left to the debuginfo reader; it can be arbitrary. */ - struct partial_symtab *user; + struct partial_symtab *user = nullptr; /* Array of pointers to all of the partial_symtab's which this one depends on. Since this array can only be set to previous or @@ -211,17 +263,17 @@ struct partial_symtab in foo.h may use type numbers defined in foo.c. For other debugging formats there may be no need to use dependencies. */ - struct partial_symtab **dependencies; + struct partial_symtab **dependencies = nullptr; - int number_of_dependencies; + int number_of_dependencies = 0; /* Global symbol list. This list will be sorted after readin to improve access. Binary search will be the usual method of finding a symbol within it. globals_offset is an integer offset within global_psymbols[]. */ - int globals_offset; - int n_global_syms; + int globals_offset = 0; + int n_global_syms = 0; /* Static symbol list. This list will *not* be sorted after readin; to find a symbol in it, exhaustive search must be used. This is @@ -231,24 +283,18 @@ struct partial_symtab how long errors take). This is an offset and size within static_psymbols[]. */ - int statics_offset; - int n_static_syms; - - /* Non-zero if the symtab corresponding to this psymtab has been - readin. This is located here so that this structure packs better - on 64-bit systems. */ - - unsigned char readin; + int statics_offset = 0; + int n_static_syms = 0; /* True iff objfile->psymtabs_addrmap is properly populated for this partial_symtab. For discontiguous overlapping psymtabs is the only usable info in PSYMTABS_ADDRMAP. */ - unsigned char psymtabs_addrmap_supported; + bool psymtabs_addrmap_supported = false; /* True if the name of this partial symtab is not a source file name. */ - unsigned char anonymous; + bool anonymous = false; /* A flag that is temporarily used when searching psymtabs. */ @@ -258,23 +304,89 @@ struct partial_symtab unsigned int text_low_valid : 1; unsigned int text_high_valid : 1; +}; + +/* A partial symtab that tracks the "readin" and "compunit_symtab" + information in the ordinary way -- by storing it directly in this + object. */ +struct standard_psymtab : public partial_symtab +{ + standard_psymtab (const char *filename, struct objfile *objfile) + : partial_symtab (filename, objfile) + { + } + + standard_psymtab (const char *filename, struct objfile *objfile, + CORE_ADDR addr) + : partial_symtab (filename, objfile, addr) + { + } + + bool readin_p (struct objfile *) const override + { + return readin; + } + + struct compunit_symtab *get_compunit_symtab (struct objfile *) const override + { + return compunit_symtab; + } + + /* True if the symtab corresponding to this psymtab has been + readin. */ + + bool readin = false; /* Pointer to compunit eventually allocated for this source file, 0 if !readin or if we haven't looked for the symtab after it was readin. */ - struct compunit_symtab *compunit_symtab; + struct compunit_symtab *compunit_symtab = nullptr; +}; + +/* A partial_symtab that works in the historical db way. This should + not be used in new code, but exists to transition the somewhat + unmaintained "legacy" debug formats. */ + +struct legacy_psymtab : public standard_psymtab +{ + legacy_psymtab (const char *filename, struct objfile *objfile) + : standard_psymtab (filename, objfile) + { + } + + legacy_psymtab (const char *filename, struct objfile *objfile, + CORE_ADDR addr) + : standard_psymtab (filename, objfile, addr) + { + } + + void read_symtab (struct objfile *objf) override + { + if (legacy_read_symtab) + (*legacy_read_symtab) (this, objf); + } + + void expand_psymtab (struct objfile *objf) override + { + (*legacy_expand_psymtab) (this, objf); + } /* Pointer to function which will read in the symtab corresponding to this psymtab. */ - void (*read_symtab) (struct partial_symtab *, struct objfile *); + void (*legacy_read_symtab) (legacy_psymtab *, struct objfile *) = nullptr; + + /* Pointer to function which will actually expand this psymtab into + a full symtab. */ + + void (*legacy_expand_psymtab) (legacy_psymtab *, struct objfile *) = nullptr; /* Information that lets read_symtab() locate the part of the symbol table that this psymtab corresponds to. This information is private to the format-dependent symbol reading routines. For further detail examine the various symbol reading modules. */ - void *read_symtab_private; + void *read_symtab_private = nullptr; }; /* Specify whether a partial psymbol should be allocated on the global @@ -304,7 +416,7 @@ enum class psymbol_placement LANGUAGE is the language from which the symbol originates. This will influence, amongst other things, how the symbol name is demangled. */ -extern void add_psymbol_to_list (const char *name, int namelength, +extern void add_psymbol_to_list (gdb::string_view name, bool copy_name, domain_enum domain, enum address_class theclass, short section, @@ -313,33 +425,22 @@ extern void add_psymbol_to_list (const char *name, int namelength, enum language language, struct objfile *objfile); +/* Add a symbol to the partial symbol table of OBJFILE. The psymbol + must be fully constructed, and the names must be set and intern'd + as appropriate. */ + +extern void add_psymbol_to_list (const partial_symbol &psym, + psymbol_placement where, + struct objfile *objfile); + /* Initialize storage for partial symbols. If partial symbol storage has already been initialized, this does nothing. TOTAL_SYMBOLS is an estimate of how many symbols there will be. */ extern void init_psymbol_list (struct objfile *objfile, int total_symbols); -extern struct partial_symtab *start_psymtab_common (struct objfile *, - const char *, CORE_ADDR); - extern void end_psymtab_common (struct objfile *, struct partial_symtab *); -/* Allocate a new partial symbol table associated with OBJFILE. - FILENAME (which must be non-NULL) is the filename of this partial - symbol table; it is copied into the appropriate storage. A new - partial symbol table is returned; aside from "next" and "filename", - its fields are initialized to zero. */ - -extern struct partial_symtab *allocate_psymtab (const char *filename, - struct objfile *objfile) - ATTRIBUTE_NONNULL (1); - -static inline void -discard_psymtab (struct objfile *objfile, struct partial_symtab *pst) -{ - objfile->partial_symtabs->discard_psymtab (pst); -} - /* Used when recording partial symbol tables. On destruction, discards any partial symbol tables that have been built. However, the tables can be kept by calling the "keep" method. */