gas: Add md_generic_table_relax_frag
[deliverable/binutils-gdb.git] / gdb / psympriv.h
index 3efb01fe48a950565c54edd1209d85c42ae666f3..19d692bd230e7019481d1deb9f480d00e755af6d 100644 (file)
@@ -1,6 +1,6 @@
 /* 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.
 
@@ -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;
 };
 
-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 */
This page took 0.029774 seconds and 4 git commands to generate.