X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fpsympriv.h;h=f8eade7df32e1f0fefcd2bf7ccec304357d6a1fd;hb=e98ee8c458f3a8405eb93e71b00f801b4bbe3635;hp=250fc08188ee412373de0a440de2c842b49dc75a;hpb=95cf586902b681310e63ee06d89ba2498d1d5dcf;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/psympriv.h b/gdb/psympriv.h index 250fc08188..f8eade7df3 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-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -21,8 +21,7 @@ #define PSYMPRIV_H #include "psymtab.h" - -struct psymbol_allocation_list; +#include "objfiles.h" /* A partial_symbol records the name, domain, and address class of symbols whose types we have not parsed yet. For functions, it also @@ -34,26 +33,48 @@ struct psymbol_allocation_list; /* This structure is space critical. See space comments at the top of symtab.h. */ -struct partial_symbol +struct partial_symbol : public general_symbol_info { - /* 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 (section >= 0) + return &objfile->sections[section]; + return nullptr; + } - struct general_symbol_info ginfo; + /* Return the unrelocated address of this partial symbol. */ + CORE_ADDR unrelocated_address () const + { + return 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); + } + + /* Set the address of this partial symbol. The address must be + unrelocated. */ + void set_unrelocated_address (CORE_ADDR addr) + { + value.address = addr; + } /* 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 +98,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 +159,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 +248,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,23 +271,24 @@ struct partial_symtab void *read_symtab_private; }; -extern void sort_pst_symbols (struct objfile *, struct partial_symtab *); - -/* Add any kind of symbol to a psymbol_allocation_list. */ +/* Add any kind of symbol to a partial_symbol vector. */ extern void add_psymbol_to_list (const char *, int, int, domain_enum, enum address_class, - struct psymbol_allocation_list *, - long, CORE_ADDR, + short /* section */, + std::vector *, + CORE_ADDR, enum language, struct objfile *); extern void init_psymbol_list (struct objfile *, int); extern struct partial_symtab *start_psymtab_common (struct objfile *, const char *, CORE_ADDR, - struct partial_symbol **, - struct partial_symbol **); + std::vector &, + std::vector &); + +extern void end_psymtab_common (struct objfile *, struct partial_symtab *); extern struct partial_symtab *allocate_psymtab (const char *, struct objfile *) @@ -225,7 +296,40 @@ extern struct partial_symtab *allocate_psymtab (const char *, extern void discard_psymtab (struct objfile *, struct partial_symtab *); -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: + + psymtab_discarder (struct objfile *objfile) + : m_objfile (objfile), + m_psymtab (objfile->psymtabs) + { + } + + ~psymtab_discarder () + { + if (m_objfile != NULL) + while (m_objfile->psymtabs != m_psymtab) + discard_psymtab (m_objfile, m_objfile->psymtabs); + } + + /* 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; +}; /* Traverse all psymtabs in one objfile. */