X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fpsympriv.h;h=19d692bd230e7019481d1deb9f480d00e755af6d;hb=268e4f09144c48e02f01d82ab3aab359457df214;hp=915208e0d2aec121e5d630c7105179b3b62f6e15;hpb=618f726fcb851883a0094aa7fa17003889b7189f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/psympriv.h b/gdb/psympriv.h index 915208e0d2..19d692bd23 100644 --- a/gdb/psympriv.h +++ b/gdb/psympriv.h @@ -1,6 +1,6 @@ /* Private partial symbol table definitions. - Copyright (C) 2009-2016 Free Software Foundation, Inc. + Copyright (C) 2009-2019 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,7 +36,38 @@ 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 + + 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) + { + 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; @@ -51,9 +82,6 @@ struct partial_symbol 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 +105,47 @@ 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 + ANOFFSET (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 + ANOFFSET (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 +166,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 +255,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 +278,101 @@ struct partial_symtab void *read_symtab_private; }; -/* Add any kind of symbol to a psymbol_allocation_list. */ +/* 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. */ -extern void add_psymbol_to_list (const char *, int, - int, domain_enum, - enum address_class, - struct psymbol_allocation_list *, - CORE_ADDR, - enum language, struct objfile *); +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 init_psymbol_list (struct objfile *, int); +/* 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, - struct partial_symbol **, - struct partial_symbol **); + 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); +} -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 */