gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / psympriv.h
index e4b23301e9c53f0d1696e440c250e6960d75ea87..4622be389bd557f758c71168d4c3735c54906a7b 100644 (file)
@@ -99,8 +99,7 @@ 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
 {
@@ -125,17 +124,39 @@ struct partial_symtab
   {
   }
 
-  /* Read the full symbol table corresponding to this partial symbol
-     table.  */
+  /* 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;
 
-  /* Psymtab expansion is done in two steps.  The first step is a call
-     to read_symtab; but while that is in progress, calls to
-     expand_psymtab can be made.  */
+  /* 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.  */
-  void read_dependencies (struct objfile *);
+  /* 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
@@ -265,12 +286,6 @@ struct partial_symtab
   int statics_offset = 0;
   int n_static_syms = 0;
 
-  /* True if the symtab corresponding to this psymtab has been readin.
-     This is located here so that this structure packs better on
-     64-bit systems.  */
-
-  bool readin = false;
-
   /* True iff objfile->psymtabs_addrmap is properly populated for this
      partial_symtab.  For discontiguous overlapping psymtabs is the only usable
      info in PSYMTABS_ADDRMAP.  */
@@ -289,6 +304,38 @@ 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.  */
@@ -300,16 +347,16 @@ struct partial_symtab
    not be used in new code, but exists to transition the somewhat
    unmaintained "legacy" debug formats.  */
 
-struct legacy_psymtab : public partial_symtab
+struct legacy_psymtab : public standard_psymtab
 {
   legacy_psymtab (const char *filename, struct objfile *objfile)
-    : partial_symtab (filename, objfile)
+    : standard_psymtab (filename, objfile)
   {
   }
 
   legacy_psymtab (const char *filename, struct objfile *objfile,
                  CORE_ADDR addr)
-    : partial_symtab (filename, objfile, addr)
+    : standard_psymtab (filename, objfile, addr)
   {
   }
 
@@ -378,6 +425,14 @@ extern void add_psymbol_to_list (gdb::string_view name,
                                 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.  */
@@ -386,12 +441,6 @@ extern void init_psymbol_list (struct objfile *objfile, int total_symbols);
 
 extern void end_psymtab_common (struct objfile *, struct partial_symtab *);
 
-static inline void
-discard_psymtab (struct objfile *objfile, struct partial_symtab *pst)
-{
-  objfile->partial_symtabs->discard_psymtab (pst);
-}
-
 /* 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.  */
This page took 0.026157 seconds and 4 git commands to generate.