/* Private partial symbol table definitions.
- Copyright (C) 2009-2015 Free Software Foundation, Inc.
+ Copyright (C) 2009-2019 Free Software Foundation, Inc.
This file is part of GDB.
#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
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;
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. */
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;
/* 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.
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. */
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 */