X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fpsympriv.h;h=19d692bd230e7019481d1deb9f480d00e755af6d;hb=77b97e006217ed089b588e6799a59334bd216c43;hp=e28adfed4ab309346d3372dae21d8d784fc891dc;hpb=b22a7c6ab6173fe4fa1352e14d00a234bbf50346;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/psympriv.h b/gdb/psympriv.h index e28adfed4a..19d692bd23 100644 --- a/gdb/psympriv.h +++ b/gdb/psympriv.h @@ -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 @@ -33,37 +34,43 @@ /* This structure is space critical. See space comments at the top of symtab.h. */ -struct partial_symbol : public general_symbol_info +struct partial_symbol { /* Return the section for this partial symbol, or nullptr if no section has been set. */ struct obj_section *obj_section (struct objfile *objfile) const { - if (section >= 0) - return &objfile->sections[section]; + if (ginfo.section >= 0) + return &objfile->sections[ginfo.section]; return nullptr; } /* Return the unrelocated address of this partial symbol. */ CORE_ADDR unrelocated_address () const { - return value.address; + return ginfo.value.address; } /* Return the address of this partial symbol, relocated according to the offsets provided in OBJFILE. */ CORE_ADDR address (const struct objfile *objfile) const { - return value.address + ANOFFSET (objfile->section_offsets, section); + return (ginfo.value.address + + ANOFFSET (objfile->section_offsets, ginfo.section)); } /* Set the address of this partial symbol. The address must be unrelocated. */ void set_unrelocated_address (CORE_ADDR addr) { - value.address = addr; + ginfo.value.address = addr; } + /* Note that partial_symbol does not derive from general_symbol_info + due to the bcache. See add_psymbol_to_bcache. */ + + struct general_symbol_info ginfo; + /* Name space code. */ ENUM_BITFIELD(domain_enum_tag) domain : SYMBOL_DOMAIN_BITS; @@ -271,30 +278,68 @@ struct partial_symtab void *read_symtab_private; }; -/* Add any kind of symbol to a partial_symbol vector. */ +/* Specify whether a partial psymbol should be allocated on the global + list or the static list. */ + +enum class psymbol_placement +{ + STATIC, + GLOBAL +}; + +/* Add a symbol to the partial symbol table of OBJFILE. + + If COPY_NAME is true, make a copy of NAME, otherwise use the passed + reference. + + THECLASS is the type of symbol. -extern void add_psymbol_to_list (const char *, int, - int, domain_enum, - enum address_class, - short /* section */, - std::vector *, - CORE_ADDR, - enum language, struct objfile *); + SECTION is the index of the section of OBJFILE in which the symbol is found. -extern void init_psymbol_list (struct objfile *, int); + WHERE determines whether the symbol goes in the list of static or global + partial symbols of OBJFILE. + + COREADDR is the address of the symbol. For partial symbols that don't have + an address, zero is passed. + + 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 (gdb::string_view name, + bool copy_name, domain_enum domain, + enum address_class theclass, + short section, + psymbol_placement where, + CORE_ADDR coreaddr, + enum language language, + 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, - std::vector &, - std::vector &); + const char *, CORE_ADDR); extern void end_psymtab_common (struct objfile *, struct partial_symtab *); -extern struct partial_symtab *allocate_psymtab (const char *, - struct objfile *) +/* 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); -extern void discard_psymtab (struct objfile *, struct partial_symtab *); +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, @@ -305,15 +350,14 @@ class psymtab_discarder psymtab_discarder (struct objfile *objfile) : m_objfile (objfile), - m_psymtab (objfile->psymtabs) + m_psymtab (objfile->partial_symtabs->psymtabs) { } ~psymtab_discarder () { if (m_objfile != NULL) - while (m_objfile->psymtabs != m_psymtab) - discard_psymtab (m_objfile, m_objfile->psymtabs); + m_objfile->partial_symtabs->discard_psymtabs_to (m_psymtab); } /* Keep any partial symbol tables that were built. */