X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fpsympriv.h;h=e7630050e1803573ca22d4ca0c53bc9be8c30999;hb=c0b0a14290e1909a6cc3febb443560c3e95562c2;hp=250fc08188ee412373de0a440de2c842b49dc75a;hpb=95cf586902b681310e63ee06d89ba2498d1d5dcf;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/psympriv.h b/gdb/psympriv.h index 250fc08188..e7630050e1 100644 --- a/gdb/psympriv.h +++ b/gdb/psympriv.h @@ -1,6 +1,6 @@ /* Private partial symbol table definitions. - Copyright (C) 2009-2015 Free Software Foundation, Inc. + Copyright (C) 2009-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -21,8 +21,8 @@ #define PSYMPRIV_H #include "psymtab.h" - -struct psymbol_allocation_list; +#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 @@ -36,24 +36,51 @@ struct psymbol_allocation_list; struct partial_symbol { - /* The general symbol info required for all types of symbols. */ + /* 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 (ginfo.section >= 0) + return &objfile->sections[ginfo.section]; + return nullptr; + } + + /* Return the unrelocated address of this partial symbol. */ + CORE_ADDR unrelocated_address () const + { + 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 ginfo.value.address + objfile->section_offsets[ginfo.section]; + } + + /* Set the address of this partial symbol. The address must be + unrelocated. */ + void set_unrelocated_address (CORE_ADDR 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 : 6; + ENUM_BITFIELD(domain_enum_tag) domain : SYMBOL_DOMAIN_BITS; /* Address class (for info_symbols). Note that we don't allow synthetic "aclass" values here at present, simply because there's no need. */ - ENUM_BITFIELD(address_class) aclass : 6; + ENUM_BITFIELD(address_class) aclass : SYMBOL_ACLASS_BITS; }; -#define PSYMBOL_DOMAIN(psymbol) (psymbol)->domain -#define PSYMBOL_CLASS(psymbol) (psymbol)->aclass - /* A convenience enum to give names to some constants used when searching psymtabs. This is internal to psymtab and should not be used elsewhere. */ @@ -77,6 +104,45 @@ enum psymtab_search_status struct partial_symtab { + /* Return the raw low text address of this partial_symtab. */ + CORE_ADDR raw_text_low () const + { + return m_text_low; + } + + /* Return the raw high text address of this partial_symtab. */ + CORE_ADDR raw_text_high () const + { + return m_text_high; + } + + /* Return the relocated low text address of this partial_symtab. */ + CORE_ADDR text_low (struct objfile *objfile) const + { + return m_text_low + objfile->section_offsets[SECT_OFF_TEXT (objfile)]; + } + + /* Return the relocated high text address of this partial_symtab. */ + CORE_ADDR text_high (struct objfile *objfile) const + { + return m_text_high + objfile->section_offsets[SECT_OFF_TEXT (objfile)]; + } + + /* Set the low text address of this partial_symtab. */ + void set_text_low (CORE_ADDR addr) + { + m_text_low = addr; + text_low_valid = 1; + } + + /* Set the hight text address of this partial_symtab. */ + void set_text_high (CORE_ADDR addr) + { + m_text_high = addr; + text_high_valid = 1; + } + + /* Chain of all existing partial symtabs. */ struct partial_symtab *next; @@ -97,10 +163,13 @@ struct partial_symtab /* Range of text addresses covered by this file; texthigh is the beginning of the next section. Do not use if PSYMTABS_ADDRMAP_SUPPORTED - is set. */ + is set. Do not refer directly to these fields. Instead, use the + accessors. The validity of these fields is determined by the + text_low_valid and text_high_valid fields; these are located later + in this structure for better packing. */ - CORE_ADDR textlow; - CORE_ADDR texthigh; + CORE_ADDR m_text_low; + CORE_ADDR m_text_high; /* If NULL, this is an ordinary partial symbol table. @@ -183,6 +252,11 @@ struct partial_symtab ENUM_BITFIELD (psymtab_search_status) searched_flag : 2; + /* Validity of the m_text_low and m_text_high fields. */ + + unsigned int text_low_valid : 1; + unsigned int text_high_valid : 1; + /* 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. */ @@ -201,35 +275,101 @@ struct partial_symtab void *read_symtab_private; }; -extern void sort_pst_symbols (struct objfile *, struct partial_symtab *); +/* 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. + + SECTION is the index of the section of OBJFILE in which the symbol is found. + + 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. */ -/* Add any kind of symbol to a psymbol_allocation_list. */ +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); -extern void add_psymbol_to_list (const char *, int, - int, domain_enum, - enum address_class, - struct psymbol_allocation_list *, - long, CORE_ADDR, - enum language, struct 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 *, int); +extern void init_psymbol_list (struct objfile *objfile, int total_symbols); extern struct partial_symtab *start_psymtab_common (struct objfile *, - const char *, CORE_ADDR, - struct partial_symbol **, - struct partial_symbol **); + const char *, CORE_ADDR); -extern struct partial_symtab *allocate_psymtab (const char *, - struct objfile *) +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); -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); +} -extern struct cleanup *make_cleanup_discard_psymtabs (struct objfile *); +/* 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. */ +class psymtab_discarder +{ + public: -/* Traverse all psymtabs in one objfile. */ + psymtab_discarder (struct objfile *objfile) + : m_objfile (objfile), + m_psymtab (objfile->partial_symtabs->psymtabs) + { + } -#define ALL_OBJFILE_PSYMTABS(objfile, p) \ - for ((p) = (objfile) -> psymtabs; (p) != NULL; (p) = (p) -> next) + ~psymtab_discarder () + { + if (m_objfile != NULL) + m_objfile->partial_symtabs->discard_psymtabs_to (m_psymtab); + } + + /* Keep any partial symbol tables that were built. */ + void keep () + { + m_objfile = NULL; + } + + private: + + /* The objfile. If NULL this serves as a sentinel to indicate that + the psymtabs should be kept. */ + struct objfile *m_objfile; + /* How far back to free. */ + struct partial_symtab *m_psymtab; +}; #endif /* PSYMPRIV_H */