Home | History | Annotate | Line # | Download | only in gdb
psymtab.h revision 1.1.1.6
      1 /* Public partial symbol table definitions.
      2 
      3    Copyright (C) 2009-2020 Free Software Foundation, Inc.
      4 
      5    This file is part of GDB.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19 
     20 #ifndef PSYMTAB_H
     21 #define PSYMTAB_H
     22 
     23 #include "gdb_obstack.h"
     24 #include "symfile.h"
     25 #include "gdbsupport/next-iterator.h"
     26 #include "bcache.h"
     27 
     28 struct partial_symbol;
     29 
     30 /* An instance of this class manages the partial symbol tables and
     31    partial symbols for a given objfile.
     32 
     33    The core psymtab functions -- those in psymtab.c -- arrange for
     34    nearly all psymtab- and psymbol-related allocations to happen
     35    either in the psymtab_storage object (either on its obstack or in
     36    other memory managed by this class), or on the per-BFD object.  The
     37    only link from the psymtab storage object back to the objfile (or
     38    objfile_obstack) that is made by the core psymtab code is the
     39    compunit_symtab member in the standard_psymtab -- and a given
     40    symbol reader can avoid this by implementing its own subclasses of
     41    partial_symtab.
     42 
     43    However, it is up to each symbol reader to maintain this invariant
     44    in other ways, if it wants to reuse psymtabs across multiple
     45    objfiles.  The main issue here is ensuring that read_symtab_private
     46    does not point into objfile_obstack.  */
     47 
     48 class psymtab_storage
     49 {
     50 public:
     51 
     52   psymtab_storage ();
     53 
     54   ~psymtab_storage ();
     55 
     56   DISABLE_COPY_AND_ASSIGN (psymtab_storage);
     57 
     58   /* Discard all partial symbol tables starting with "psymtabs" and
     59      proceeding until "to" has been discarded.  */
     60 
     61   void discard_psymtabs_to (struct partial_symtab *to)
     62   {
     63     while (psymtabs != to)
     64       discard_psymtab (psymtabs);
     65   }
     66 
     67   /* Discard the partial symbol table.  */
     68 
     69   void discard_psymtab (struct partial_symtab *pst);
     70 
     71   /* Return the obstack that is used for storage by this object.  */
     72 
     73   struct obstack *obstack ()
     74   {
     75     if (!m_obstack.has_value ())
     76       m_obstack.emplace ();
     77     return &*m_obstack;
     78   }
     79 
     80   /* Allocate storage for the "dependencies" field of a psymtab.
     81      NUMBER says how many dependencies there are.  */
     82 
     83   struct partial_symtab **allocate_dependencies (int number)
     84   {
     85     return OBSTACK_CALLOC (obstack (), number, struct partial_symtab *);
     86   }
     87 
     88   /* Install a psymtab on the psymtab list.  This transfers ownership
     89      of PST to this object.  */
     90 
     91   void install_psymtab (partial_symtab *pst);
     92 
     93   typedef next_adapter<struct partial_symtab> partial_symtab_range;
     94 
     95   /* A range adapter that makes it possible to iterate over all
     96      psymtabs in one objfile.  */
     97 
     98   partial_symtab_range range ()
     99   {
    100     return partial_symtab_range (psymtabs);
    101   }
    102 
    103 
    104   /* Each objfile points to a linked list of partial symtabs derived from
    105      this file, one partial symtab structure for each compilation unit
    106      (source file).  */
    107 
    108   struct partial_symtab *psymtabs = nullptr;
    109 
    110   /* Map addresses to the entries of PSYMTABS.  It would be more efficient to
    111      have a map per the whole process but ADDRMAP cannot selectively remove
    112      its items during FREE_OBJFILE.  This mapping is already present even for
    113      PARTIAL_SYMTABs which still have no corresponding full SYMTABs read.
    114 
    115      The DWARF parser reuses this addrmap to store things other than
    116      psymtabs in the cases where debug information is being read from, for
    117      example, the .debug-names section.  */
    118 
    119   struct addrmap *psymtabs_addrmap = nullptr;
    120 
    121   /* A byte cache where we can stash arbitrary "chunks" of bytes that
    122      will not change.  */
    123 
    124   gdb::bcache psymbol_cache;
    125 
    126   /* Vectors of all partial symbols read in from file.  The actual data
    127      is stored in the objfile_obstack.  */
    128 
    129   std::vector<partial_symbol *> global_psymbols;
    130   std::vector<partial_symbol *> static_psymbols;
    131 
    132   /* Stack of vectors of partial symbols, using during psymtab
    133      initialization.  */
    134 
    135   std::vector<std::vector<partial_symbol *>*> current_global_psymbols;
    136   std::vector<std::vector<partial_symbol *>*> current_static_psymbols;
    137 
    138 private:
    139 
    140   /* The obstack where allocations are made.  This is lazily allocated
    141      so that we don't waste memory when there are no psymtabs.  */
    142 
    143   gdb::optional<auto_obstack> m_obstack;
    144 };
    145 
    146 
    147 extern const struct quick_symbol_functions psym_functions;
    148 
    149 extern const struct quick_symbol_functions dwarf2_gdb_index_functions;
    150 extern const struct quick_symbol_functions dwarf2_debug_names_functions;
    151 
    152 /* Ensure that the partial symbols for OBJFILE have been loaded.  If
    153    VERBOSE is true, then this will print a message when symbols
    154    are loaded.  This function returns a range adapter suitable for
    155    iterating over the psymtabs of OBJFILE.  */
    156 
    157 extern psymtab_storage::partial_symtab_range require_partial_symbols
    158     (struct objfile *objfile, bool verbose);
    159 
    160 #endif /* PSYMTAB_H */
    161