GDB (API)
|
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 */