gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / psympriv.h
index 29332dd3cf9a5485d19fe5796b330cc69385127f..4622be389bd557f758c71168d4c3735c54906a7b 100644 (file)
@@ -1,6 +1,6 @@
 /* Private partial symbol table definitions.
 
-   Copyright (C) 2009-2019 Free Software Foundation, Inc.
+   Copyright (C) 2009-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -22,6 +22,7 @@
 
 #include "psymtab.h"
 #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
 /* This structure is space critical.  See space comments at the top of
    symtab.h.  */
 
-struct partial_symbol : public general_symbol_info
+struct partial_symbol
 {
   /* 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];
+    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 value.address;
+    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 value.address + ANOFFSET (objfile->section_offsets, section);
+    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)
   {
-    value.address = 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 : SYMBOL_DOMAIN_BITS;
@@ -93,11 +99,65 @@ enum psymtab_search_status
    They are all chained on partial symtab lists.
 
    Even after the source file has been read into a symtab, the
-   partial_symtab remains around.  They are allocated on an obstack,
-   objfile_obstack.  */
+   partial_symtab remains around.  */
 
 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.  The
+     partial symtab will also be installed using
+     psymtab_storage::install.  */
+
+  partial_symtab (const char *filename, struct objfile *objfile)
+    ATTRIBUTE_NONNULL (2) ATTRIBUTE_NONNULL (3);
+
+  /* Like the above, but also sets the initial text low and text high
+     from the ADDR argument, and sets the global- and
+     static-offsets.  */
+
+  partial_symtab (const char *filename, struct objfile *objfile,
+                 CORE_ADDR addr)
+    ATTRIBUTE_NONNULL (2) ATTRIBUTE_NONNULL (3);
+
+  virtual ~partial_symtab ()
+  {
+  }
+
+  /* Psymtab expansion is done in two steps:
+     - a call to read_symtab
+     - while that call is in progress, calls to expand_psymtab can be made,
+       both for this psymtab, and its dependencies.
+     This makes a distinction between a toplevel psymtab (for which both
+     read_symtab and expand_psymtab will be called) and a non-toplevel
+     psymtab (for which only expand_psymtab will be called). The
+     distinction can be used f.i. to do things before and after all
+     dependencies of a top-level psymtab have been expanded.
+
+     Read the full symbol table corresponding to this partial symbol
+     table.  Typically calls expand_psymtab.  */
+  virtual void read_symtab (struct objfile *) = 0;
+
+  /* Expand the full symbol table for this partial symbol table.  Typically
+     calls expand_dependencies.  */
+  virtual void expand_psymtab (struct objfile *) = 0;
+
+  /* Ensure that all the dependencies are read in.  Calls
+     expand_psymtab for each non-shared dependency.  */
+  void expand_dependencies (struct objfile *);
+
+  /* Return true if the symtab corresponding to this psymtab has been
+     read in in the context of this objfile.  */
+  virtual bool readin_p (struct objfile *) const = 0;
+
+  /* Return a pointer to the compunit allocated for this source file
+     in the context of this objfile.
+
+     Return nullptr if the compunit was not read in or if there was no
+     symtab.  */
+  virtual struct compunit_symtab *get_compunit_symtab
+    (struct objfile *) const = 0;
+
   /* Return the raw low text address of this partial_symtab.  */
   CORE_ADDR raw_text_low () const
   {
@@ -113,15 +173,13 @@ struct partial_symtab
   /* 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 m_text_low + objfile->text_section_offset ();
   }
 
   /* 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));
+    return m_text_high + objfile->text_section_offset ();
   }
 
   /* Set the low text address of this partial_symtab.  */
@@ -141,21 +199,21 @@ struct partial_symtab
 
   /* Chain of all existing partial symtabs.  */
 
-  struct partial_symtab *next;
+  struct partial_symtab *next = nullptr;
 
   /* Name of the source file which this partial_symtab defines,
      or if the psymtab is anonymous then a descriptive name for
      debugging purposes, or "".  It must not be NULL.  */
 
-  const char *filename;
+  const char *filename = nullptr;
 
   /* Full path of the source file.  NULL if not known.  */
 
-  char *fullname;
+  char *fullname = nullptr;
 
   /* Directory in which it was compiled, or NULL if we don't know.  */
 
-  const char *dirname;
+  const char *dirname = nullptr;
 
   /* Range of text addresses covered by this file; texthigh is the
      beginning of the next section.  Do not use if PSYMTABS_ADDRMAP_SUPPORTED
@@ -164,8 +222,8 @@ struct partial_symtab
      text_low_valid and text_high_valid fields; these are located later
      in this structure for better packing.  */
 
-  CORE_ADDR m_text_low;
-  CORE_ADDR m_text_high;
+  CORE_ADDR m_text_low = 0;
+  CORE_ADDR m_text_high = 0;
 
   /* If NULL, this is an ordinary partial symbol table.
 
@@ -194,7 +252,7 @@ struct partial_symtab
      The choice of which one should be canonical is left to the
      debuginfo reader; it can be arbitrary.  */
 
-  struct partial_symtab *user;
+  struct partial_symtab *user = nullptr;
 
   /* Array of pointers to all of the partial_symtab's which this one
      depends on.  Since this array can only be set to previous or
@@ -205,17 +263,17 @@ struct partial_symtab
      in foo.h may use type numbers defined in foo.c.  For other debugging
      formats there may be no need to use dependencies.  */
 
-  struct partial_symtab **dependencies;
+  struct partial_symtab **dependencies = nullptr;
 
-  int number_of_dependencies;
+  int number_of_dependencies = 0;
 
   /* Global symbol list.  This list will be sorted after readin to
      improve access.  Binary search will be the usual method of
      finding a symbol within it.  globals_offset is an integer offset
      within global_psymbols[].  */
 
-  int globals_offset;
-  int n_global_syms;
+  int globals_offset = 0;
+  int n_global_syms = 0;
 
   /* Static symbol list.  This list will *not* be sorted after readin;
      to find a symbol in it, exhaustive search must be used.  This is
@@ -225,24 +283,18 @@ struct partial_symtab
      how long errors take).  This is an offset and size within
      static_psymbols[].  */
 
-  int statics_offset;
-  int n_static_syms;
-
-  /* Non-zero if the symtab corresponding to this psymtab has been
-     readin.  This is located here so that this structure packs better
-     on 64-bit systems.  */
-
-  unsigned char readin;
+  int statics_offset = 0;
+  int n_static_syms = 0;
 
   /* True iff objfile->psymtabs_addrmap is properly populated for this
      partial_symtab.  For discontiguous overlapping psymtabs is the only usable
      info in PSYMTABS_ADDRMAP.  */
 
-  unsigned char psymtabs_addrmap_supported;
+  bool psymtabs_addrmap_supported = false;
 
   /* True if the name of this partial symtab is not a source file name.  */
 
-  unsigned char anonymous;
+  bool anonymous = false;
 
   /* A flag that is temporarily used when searching psymtabs.  */
 
@@ -252,49 +304,142 @@ struct partial_symtab
 
   unsigned int text_low_valid : 1;
   unsigned int text_high_valid : 1;
+};
+
+/* A partial symtab that tracks the "readin" and "compunit_symtab"
+   information in the ordinary way -- by storing it directly in this
+   object.  */
+struct standard_psymtab : public partial_symtab
+{
+  standard_psymtab (const char *filename, struct objfile *objfile)
+    : partial_symtab (filename, objfile)
+  {
+  }
+
+  standard_psymtab (const char *filename, struct objfile *objfile,
+                   CORE_ADDR addr)
+    : partial_symtab (filename, objfile, addr)
+  {
+  }
+
+  bool readin_p (struct objfile *) const override
+  {
+    return readin;
+  }
+
+  struct compunit_symtab *get_compunit_symtab (struct objfile *) const override
+  {
+    return compunit_symtab;
+  }
+
+  /* True if the symtab corresponding to this psymtab has been
+     readin.  */
+
+  bool readin = false;
 
   /* 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.  */
 
-  struct compunit_symtab *compunit_symtab;
+  struct compunit_symtab *compunit_symtab = nullptr;
+};
+
+/* A partial_symtab that works in the historical db way.  This should
+   not be used in new code, but exists to transition the somewhat
+   unmaintained "legacy" debug formats.  */
+
+struct legacy_psymtab : public standard_psymtab
+{
+  legacy_psymtab (const char *filename, struct objfile *objfile)
+    : standard_psymtab (filename, objfile)
+  {
+  }
+
+  legacy_psymtab (const char *filename, struct objfile *objfile,
+                 CORE_ADDR addr)
+    : standard_psymtab (filename, objfile, addr)
+  {
+  }
+
+  void read_symtab (struct objfile *objf) override
+  {
+    if (legacy_read_symtab)
+      (*legacy_read_symtab) (this, objf);
+  }
+
+  void expand_psymtab (struct objfile *objf) override
+  {
+    (*legacy_expand_psymtab) (this, objf);
+  }
 
   /* Pointer to function which will read in the symtab corresponding to
      this psymtab.  */
 
-  void (*read_symtab) (struct partial_symtab *, struct objfile *);
+  void (*legacy_read_symtab) (legacy_psymtab *, struct objfile *) = nullptr;
+
+  /* Pointer to function which will actually expand this psymtab into
+     a full symtab.  */
+
+  void (*legacy_expand_psymtab) (legacy_psymtab *, struct objfile *) = nullptr;
 
   /* Information that lets read_symtab() locate the part of the symbol table
      that this psymtab corresponds to.  This information is private to the
      format-dependent symbol reading routines.  For further detail examine
      the various symbol reading modules.  */
 
-  void *read_symtab_private;
+  void *read_symtab_private = nullptr;
+};
+
+/* Specify whether a partial psymbol should be allocated on the global
+   list or the static list.  */
+
+enum class psymbol_placement
+{
+  STATIC,
+  GLOBAL
 };
 
-/* Add any kind of symbol to a partial_symbol vector.  */
+/* Add a symbol to the partial symbol table of OBJFILE.
 
-extern void add_psymbol_to_list (const char *, int,
-                                int, domain_enum,
-                                enum address_class,
-                                short /* section */,
-                                std::vector<partial_symbol *> *,
-                                CORE_ADDR,
-                                enum language, struct objfile *);
+   If COPY_NAME is true, make a copy of NAME, otherwise use the passed
+   reference.
 
-extern void init_psymbol_list (struct objfile *, int);
+   THECLASS is the type of symbol.
 
-extern struct partial_symtab *start_psymtab_common (struct objfile *,
-                                                   const char *, CORE_ADDR,
-                                                   std::vector<partial_symbol *> &,
-                                                   std::vector<partial_symbol *> &);
+   SECTION is the index of the section of OBJFILE in which the symbol is found.
 
-extern void end_psymtab_common (struct objfile *, struct partial_symtab *);
+   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.
 
-extern struct partial_symtab *allocate_psymtab (const char *,
-                                               struct objfile *)
-  ATTRIBUTE_NONNULL (1);
+   LANGUAGE is the language from which the symbol originates.  This will
+   influence, amongst other things, how the symbol name is demangled. */
 
-extern void discard_psymtab (struct objfile *, struct partial_symtab *);
+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);
+
+/* Add a symbol to the partial symbol table of OBJFILE.  The psymbol
+   must be fully constructed, and the names must be set and intern'd
+   as appropriate.  */
+
+extern void add_psymbol_to_list (const partial_symbol &psym,
+                                psymbol_placement where,
+                                struct objfile *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 *objfile, int total_symbols);
+
+extern void end_psymtab_common (struct objfile *, struct partial_symtab *);
 
 /* Used when recording partial symbol tables.  On destruction,
    discards any partial symbol tables that have been built.  However,
@@ -305,15 +450,14 @@ class psymtab_discarder
 
   psymtab_discarder (struct objfile *objfile)
     : m_objfile (objfile),
-      m_psymtab (objfile->psymtabs)
+      m_psymtab (objfile->partial_symtabs->psymtabs)
   {
   }
 
   ~psymtab_discarder ()
   {
     if (m_objfile != NULL)
-      while (m_objfile->psymtabs != m_psymtab)
-       discard_psymtab (m_objfile, m_objfile->psymtabs);
+      m_objfile->partial_symtabs->discard_psymtabs_to (m_psymtab);
   }
 
   /* Keep any partial symbol tables that were built.  */
@@ -331,9 +475,4 @@ class psymtab_discarder
   struct partial_symtab *m_psymtab;
 };
 
-/* Traverse all psymtabs in one objfile.  */
-
-#define        ALL_OBJFILE_PSYMTABS(objfile, p) \
-    for ((p) = (objfile) -> psymtabs; (p) != NULL; (p) = (p) -> next)
-
 #endif /* PSYMPRIV_H */
This page took 0.027456 seconds and 4 git commands to generate.