GDB (API)
/home/stan/gdb/src/gdb/psympriv.h
Go to the documentation of this file.
00001 /* Private partial symbol table definitions.
00002 
00003    Copyright (C) 2009-2013 Free Software Foundation, Inc.
00004 
00005    This file is part of GDB.
00006 
00007    This program is free software; you can redistribute it and/or modify
00008    it under the terms of the GNU General Public License as published by
00009    the Free Software Foundation; either version 3 of the License, or
00010    (at your option) any later version.
00011 
00012    This program is distributed in the hope that it will be useful,
00013    but WITHOUT ANY WARRANTY; without even the implied warranty of
00014    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015    GNU General Public License for more details.
00016 
00017    You should have received a copy of the GNU General Public License
00018    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
00019 
00020 #ifndef PSYMPRIV_H
00021 #define PSYMPRIV_H
00022 
00023 #include "psymtab.h"
00024 
00025 struct psymbol_allocation_list;
00026 
00027 /* A partial_symbol records the name, domain, and address class of
00028    symbols whose types we have not parsed yet.  For functions, it also
00029    contains their memory address, so we can find them from a PC value.
00030    Each partial_symbol sits in a partial_symtab, all of which are chained
00031    on a  partial symtab list and which points to the corresponding 
00032    normal symtab once the partial_symtab has been referenced.  */
00033 
00034 /* This structure is space critical.  See space comments at the top of
00035    symtab.h.  */
00036 
00037 struct partial_symbol
00038 {
00039 
00040   /* The general symbol info required for all types of symbols.  */
00041 
00042   struct general_symbol_info ginfo;
00043 
00044   /* Name space code.  */
00045 
00046   ENUM_BITFIELD(domain_enum_tag) domain : 6;
00047 
00048   /* Address class (for info_symbols).  Note that we don't allow
00049      synthetic "aclass" values here at present, simply because there's
00050      no need.  */
00051 
00052   ENUM_BITFIELD(address_class) aclass : 6;
00053 
00054 };
00055 
00056 #define PSYMBOL_DOMAIN(psymbol) (psymbol)->domain
00057 #define PSYMBOL_CLASS(psymbol)          (psymbol)->aclass
00058 
00059 /* A convenience enum to give names to some constants used when
00060    searching psymtabs.  This is internal to psymtab and should not be
00061    used elsewhere.  */
00062 
00063 enum psymtab_search_status
00064   {
00065     PST_NOT_SEARCHED,
00066     PST_SEARCHED_AND_FOUND,
00067     PST_SEARCHED_AND_NOT_FOUND
00068   };
00069 
00070 /* Each source file that has not been fully read in is represented by
00071    a partial_symtab.  This contains the information on where in the
00072    executable the debugging symbols for a specific file are, and a
00073    list of names of global symbols which are located in this file.
00074    They are all chained on partial symtab lists.
00075 
00076    Even after the source file has been read into a symtab, the
00077    partial_symtab remains around.  They are allocated on an obstack,
00078    objfile_obstack.  */
00079 
00080 struct partial_symtab
00081 {
00082 
00083   /* Chain of all existing partial symtabs.  */
00084 
00085   struct partial_symtab *next;
00086 
00087   /* Name of the source file which this partial_symtab defines,
00088      or if the psymtab is anonymous then a descriptive name for
00089      debugging purposes, or "".  It must not be NULL.  */
00090 
00091   const char *filename;
00092 
00093   /* Full path of the source file.  NULL if not known.  */
00094 
00095   char *fullname;
00096 
00097   /* Directory in which it was compiled, or NULL if we don't know.  */
00098 
00099   const char *dirname;
00100 
00101   /* Set of relocation offsets to apply to each section.
00102      This is typically objfile->section_offsets, but in some cases
00103      it's different.  See, e.g., elfstab_offset_sections.  */
00104 
00105   struct section_offsets *section_offsets;
00106 
00107   /* Range of text addresses covered by this file; texthigh is the
00108      beginning of the next section.  Do not use if PSYMTABS_ADDRMAP_SUPPORTED
00109      is set.  */
00110 
00111   CORE_ADDR textlow;
00112   CORE_ADDR texthigh;
00113 
00114   /* Array of pointers to all of the partial_symtab's which this one
00115      depends on.  Since this array can only be set to previous or
00116      the current (?) psymtab, this dependency tree is guaranteed not
00117      to have any loops.  "depends on" means that symbols must be read
00118      for the dependencies before being read for this psymtab; this is
00119      for type references in stabs, where if foo.c includes foo.h, declarations
00120      in foo.h may use type numbers defined in foo.c.  For other debugging
00121      formats there may be no need to use dependencies.  */
00122 
00123   struct partial_symtab **dependencies;
00124 
00125   int number_of_dependencies;
00126 
00127   /* If NULL, this is an ordinary partial symbol table.
00128 
00129      If non-NULL, this holds a single includer of this partial symbol
00130      table, and this partial symbol table is a shared one.
00131 
00132      A shared psymtab is one that is referenced by multiple other
00133      psymtabs, and which conceptually has its contents directly
00134      included in those.
00135 
00136      Shared psymtabs have special semantics.  When a search finds a
00137      symbol in a shared table, we instead return one of the non-shared
00138      tables that include this one.
00139 
00140      A shared psymtabs can be referred to by other shared ones.
00141 
00142      The psymtabs that refer to a shared psymtab will list the shared
00143      psymtab in their 'dependencies' array.
00144 
00145      In DWARF terms, a shared psymtab is a DW_TAG_partial_unit; but
00146      of course using a name based on that would be too confusing, so
00147      "shared" was chosen instead.
00148      
00149      Only a single user is needed because, when expanding a shared
00150      psymtab, we only need to expand its "canonical" non-shared user.
00151      The choice of which one should be canonical is left to the
00152      debuginfo reader; it can be arbitrary.  */
00153 
00154   struct partial_symtab *user;
00155 
00156   /* Global symbol list.  This list will be sorted after readin to
00157      improve access.  Binary search will be the usual method of
00158      finding a symbol within it.  globals_offset is an integer offset
00159      within global_psymbols[].  */
00160 
00161   int globals_offset;
00162   int n_global_syms;
00163 
00164   /* Static symbol list.  This list will *not* be sorted after readin;
00165      to find a symbol in it, exhaustive search must be used.  This is
00166      reasonable because searches through this list will eventually
00167      lead to either the read in of a files symbols for real (assumed
00168      to take a *lot* of time; check) or an error (and we don't care
00169      how long errors take).  This is an offset and size within
00170      static_psymbols[].  */
00171 
00172   int statics_offset;
00173   int n_static_syms;
00174 
00175   /* Non-zero if the symtab corresponding to this psymtab has been
00176      readin.  This is located here so that this structure packs better
00177      on 64-bit systems.  */
00178 
00179   unsigned char readin;
00180 
00181   /* True iff objfile->psymtabs_addrmap is properly populated for this
00182      partial_symtab.  For discontiguous overlapping psymtabs is the only usable
00183      info in PSYMTABS_ADDRMAP.  */
00184 
00185   unsigned char psymtabs_addrmap_supported;
00186 
00187   /* True if the name of this partial symtab is not a source file name.  */
00188 
00189   unsigned char anonymous;
00190 
00191   /* A flag that is temporarily used when searching psymtabs.  */
00192 
00193   ENUM_BITFIELD (psymtab_search_status) searched_flag : 2;
00194 
00195   /* Pointer to symtab eventually allocated for this source file, 0 if
00196      !readin or if we haven't looked for the symtab after it was readin.  */
00197 
00198   struct symtab *symtab;
00199 
00200   /* Pointer to function which will read in the symtab corresponding to
00201      this psymtab.  */
00202 
00203   void (*read_symtab) (struct partial_symtab *, struct objfile *);
00204 
00205   /* Information that lets read_symtab() locate the part of the symbol table
00206      that this psymtab corresponds to.  This information is private to the
00207      format-dependent symbol reading routines.  For further detail examine
00208      the various symbol reading modules.  */
00209 
00210   void *read_symtab_private;
00211 };
00212 
00213 extern void sort_pst_symbols (struct objfile *, struct partial_symtab *);
00214 
00215 /* Add any kind of symbol to a psymbol_allocation_list.  */
00216 
00217 extern void add_psymbol_to_list (const char *, int,
00218                                  int, domain_enum,
00219                                  enum address_class,
00220                                  struct psymbol_allocation_list *,
00221                                  long, CORE_ADDR,
00222                                  enum language, struct objfile *);
00223 
00224 extern void init_psymbol_list (struct objfile *, int);
00225 
00226 extern struct partial_symtab *start_psymtab_common (struct objfile *,
00227                                                     struct section_offsets *,
00228                                                     const char *, CORE_ADDR,
00229                                                     struct partial_symbol **,
00230                                                     struct partial_symbol **);
00231 
00232 extern struct partial_symtab *allocate_psymtab (const char *,
00233                                                 struct objfile *)
00234   ATTRIBUTE_NONNULL (1);
00235 
00236 extern void discard_psymtab (struct objfile *, struct partial_symtab *);
00237 
00238 extern struct cleanup *make_cleanup_discard_psymtabs (struct objfile *);
00239 
00240 /* Traverse all psymtabs in one objfile.  */
00241 
00242 #define ALL_OBJFILE_PSYMTABS(objfile, p) \
00243     for ((p) = (objfile) -> psymtabs; (p) != NULL; (p) = (p) -> next)
00244 
00245 #endif /* PSYMPRIV_H */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines