1 1.1 christos /* Public partial symbol table definitions. 2 1.1 christos 3 1.11 christos Copyright (C) 2009-2024 Free Software Foundation, Inc. 4 1.1 christos 5 1.1 christos This file is part of GDB. 6 1.1 christos 7 1.1 christos This program is free software; you can redistribute it and/or modify 8 1.1 christos it under the terms of the GNU General Public License as published by 9 1.1 christos the Free Software Foundation; either version 3 of the License, or 10 1.1 christos (at your option) any later version. 11 1.1 christos 12 1.1 christos This program is distributed in the hope that it will be useful, 13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 1.1 christos GNU General Public License for more details. 16 1.1 christos 17 1.1 christos You should have received a copy of the GNU General Public License 18 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 1.1 christos 20 1.12 christos #ifndef GDB_PSYMTAB_H 21 1.12 christos #define GDB_PSYMTAB_H 22 1.1 christos 23 1.11 christos #include "objfiles.h" 24 1.11 christos #include <string_view> 25 1.10 christos #include "gdbsupport/gdb_obstack.h" 26 1.1 christos #include "symfile.h" 27 1.9 christos #include "gdbsupport/next-iterator.h" 28 1.9 christos #include "bcache.h" 29 1.8 christos 30 1.10 christos /* Specialization of bcache to store partial symbols. */ 31 1.10 christos 32 1.10 christos struct psymbol_bcache : public gdb::bcache 33 1.10 christos { 34 1.10 christos /* Calculate a hash code for the given partial symbol. The hash is 35 1.10 christos calculated using the symbol's value, language, domain, class 36 1.10 christos and name. These are the values which are set by 37 1.10 christos add_psymbol_to_bcache. */ 38 1.10 christos unsigned long hash (const void *addr, int length) override; 39 1.10 christos 40 1.10 christos /* Returns true if the symbol LEFT equals the symbol RIGHT. 41 1.10 christos For the comparison this function uses a symbols value, 42 1.10 christos language, domain, class and name. */ 43 1.10 christos int compare (const void *left, const void *right, int length) override; 44 1.10 christos }; 45 1.10 christos 46 1.8 christos /* An instance of this class manages the partial symbol tables and 47 1.8 christos partial symbols for a given objfile. 48 1.8 christos 49 1.8 christos The core psymtab functions -- those in psymtab.c -- arrange for 50 1.8 christos nearly all psymtab- and psymbol-related allocations to happen 51 1.8 christos either in the psymtab_storage object (either on its obstack or in 52 1.8 christos other memory managed by this class), or on the per-BFD object. The 53 1.8 christos only link from the psymtab storage object back to the objfile (or 54 1.8 christos objfile_obstack) that is made by the core psymtab code is the 55 1.9 christos compunit_symtab member in the standard_psymtab -- and a given 56 1.9 christos symbol reader can avoid this by implementing its own subclasses of 57 1.9 christos partial_symtab. 58 1.8 christos 59 1.8 christos However, it is up to each symbol reader to maintain this invariant 60 1.8 christos in other ways, if it wants to reuse psymtabs across multiple 61 1.8 christos objfiles. The main issue here is ensuring that read_symtab_private 62 1.8 christos does not point into objfile_obstack. */ 63 1.8 christos 64 1.8 christos class psymtab_storage 65 1.8 christos { 66 1.8 christos public: 67 1.10 christos psymtab_storage () = default; 68 1.8 christos ~psymtab_storage (); 69 1.8 christos 70 1.8 christos DISABLE_COPY_AND_ASSIGN (psymtab_storage); 71 1.8 christos 72 1.8 christos /* Discard all partial symbol tables starting with "psymtabs" and 73 1.8 christos proceeding until "to" has been discarded. */ 74 1.8 christos 75 1.8 christos void discard_psymtabs_to (struct partial_symtab *to) 76 1.8 christos { 77 1.8 christos while (psymtabs != to) 78 1.8 christos discard_psymtab (psymtabs); 79 1.8 christos } 80 1.8 christos 81 1.8 christos /* Discard the partial symbol table. */ 82 1.8 christos 83 1.8 christos void discard_psymtab (struct partial_symtab *pst); 84 1.8 christos 85 1.8 christos /* Return the obstack that is used for storage by this object. */ 86 1.8 christos 87 1.8 christos struct obstack *obstack () 88 1.8 christos { 89 1.8 christos if (!m_obstack.has_value ()) 90 1.8 christos m_obstack.emplace (); 91 1.8 christos return &*m_obstack; 92 1.8 christos } 93 1.8 christos 94 1.8 christos /* Allocate storage for the "dependencies" field of a psymtab. 95 1.8 christos NUMBER says how many dependencies there are. */ 96 1.8 christos 97 1.8 christos struct partial_symtab **allocate_dependencies (int number) 98 1.8 christos { 99 1.8 christos return OBSTACK_CALLOC (obstack (), number, struct partial_symtab *); 100 1.8 christos } 101 1.8 christos 102 1.9 christos /* Install a psymtab on the psymtab list. This transfers ownership 103 1.9 christos of PST to this object. */ 104 1.8 christos 105 1.9 christos void install_psymtab (partial_symtab *pst); 106 1.8 christos 107 1.10 christos using partial_symtab_range = next_range<partial_symtab>; 108 1.8 christos 109 1.8 christos /* A range adapter that makes it possible to iterate over all 110 1.8 christos psymtabs in one objfile. */ 111 1.8 christos 112 1.8 christos partial_symtab_range range () 113 1.8 christos { 114 1.8 christos return partial_symtab_range (psymtabs); 115 1.8 christos } 116 1.8 christos 117 1.8 christos 118 1.8 christos /* Each objfile points to a linked list of partial symtabs derived from 119 1.8 christos this file, one partial symtab structure for each compilation unit 120 1.8 christos (source file). */ 121 1.8 christos 122 1.8 christos struct partial_symtab *psymtabs = nullptr; 123 1.8 christos 124 1.8 christos /* A byte cache where we can stash arbitrary "chunks" of bytes that 125 1.8 christos will not change. */ 126 1.8 christos 127 1.10 christos psymbol_bcache psymbol_cache; 128 1.8 christos 129 1.9 christos private: 130 1.8 christos 131 1.8 christos /* The obstack where allocations are made. This is lazily allocated 132 1.8 christos so that we don't waste memory when there are no psymtabs. */ 133 1.8 christos 134 1.11 christos std::optional<auto_obstack> m_obstack; 135 1.11 christos }; 136 1.11 christos 137 1.11 christos /* A partial_symbol records the name, domain, and address class of 138 1.11 christos symbols whose types we have not parsed yet. For functions, it also 139 1.11 christos contains their memory address, so we can find them from a PC value. 140 1.11 christos Each partial_symbol sits in a partial_symtab, all of which are chained 141 1.11 christos on a partial symtab list and which points to the corresponding 142 1.11 christos normal symtab once the partial_symtab has been referenced. */ 143 1.11 christos 144 1.11 christos /* This structure is space critical. See space comments at the top of 145 1.11 christos symtab.h. */ 146 1.11 christos 147 1.11 christos struct partial_symbol 148 1.11 christos { 149 1.11 christos /* Return the section for this partial symbol, or nullptr if no 150 1.11 christos section has been set. */ 151 1.11 christos struct obj_section *obj_section (struct objfile *objfile) const 152 1.11 christos { 153 1.11 christos return ginfo.obj_section (objfile); 154 1.11 christos } 155 1.11 christos 156 1.11 christos /* Return the unrelocated address of this partial symbol. */ 157 1.11 christos unrelocated_addr unrelocated_address () const 158 1.11 christos { 159 1.11 christos return ginfo.unrelocated_address (); 160 1.11 christos } 161 1.11 christos 162 1.11 christos /* Return the address of this partial symbol, relocated according to 163 1.11 christos the offsets provided in OBJFILE. */ 164 1.11 christos CORE_ADDR address (const struct objfile *objfile) const 165 1.11 christos { 166 1.11 christos return (CORE_ADDR (ginfo.unrelocated_address ()) 167 1.11 christos + objfile->section_offsets[ginfo.section_index ()]); 168 1.11 christos } 169 1.11 christos 170 1.11 christos /* Set the address of this partial symbol. The address must be 171 1.11 christos unrelocated. */ 172 1.11 christos void set_unrelocated_address (unrelocated_addr addr) 173 1.11 christos { 174 1.11 christos ginfo.set_unrelocated_address (addr); 175 1.11 christos } 176 1.11 christos 177 1.11 christos /* Note that partial_symbol does not derive from general_symbol_info 178 1.11 christos due to the bcache. See add_psymbol_to_bcache. */ 179 1.11 christos 180 1.11 christos struct general_symbol_info ginfo; 181 1.11 christos 182 1.11 christos /* Name space code. */ 183 1.11 christos 184 1.11 christos ENUM_BITFIELD(domain_enum) domain : SYMBOL_DOMAIN_BITS; 185 1.11 christos 186 1.11 christos /* Address class (for info_symbols). Note that we don't allow 187 1.11 christos synthetic "aclass" values here at present, simply because there's 188 1.11 christos no need. */ 189 1.11 christos 190 1.11 christos ENUM_BITFIELD(address_class) aclass : SYMBOL_ACLASS_BITS; 191 1.11 christos }; 192 1.11 christos 193 1.11 christos /* A convenience enum to give names to some constants used when 194 1.11 christos searching psymtabs. This is internal to psymtab and should not be 195 1.11 christos used elsewhere. */ 196 1.11 christos 197 1.11 christos enum psymtab_search_status 198 1.11 christos { 199 1.11 christos PST_NOT_SEARCHED, 200 1.11 christos PST_SEARCHED_AND_FOUND, 201 1.11 christos PST_SEARCHED_AND_NOT_FOUND 202 1.11 christos }; 203 1.11 christos 204 1.11 christos /* Specify whether a partial psymbol should be allocated on the global 205 1.11 christos list or the static list. */ 206 1.11 christos 207 1.11 christos enum class psymbol_placement 208 1.11 christos { 209 1.11 christos STATIC, 210 1.11 christos GLOBAL 211 1.11 christos }; 212 1.11 christos 213 1.11 christos /* Each source file that has not been fully read in is represented by 214 1.11 christos a partial_symtab. This contains the information on where in the 215 1.11 christos executable the debugging symbols for a specific file are, and a 216 1.11 christos list of names of global symbols which are located in this file. 217 1.11 christos They are all chained on partial symtab lists. 218 1.11 christos 219 1.11 christos Even after the source file has been read into a symtab, the 220 1.11 christos partial_symtab remains around. */ 221 1.11 christos 222 1.11 christos struct partial_symtab 223 1.11 christos { 224 1.11 christos /* Allocate a new partial symbol table. 225 1.11 christos 226 1.11 christos FILENAME (which must be non-NULL) is the filename of this partial 227 1.11 christos symbol table; it is copied into the appropriate storage. The 228 1.11 christos partial symtab will also be installed using 229 1.11 christos psymtab_storage::install. */ 230 1.11 christos 231 1.11 christos partial_symtab (const char *filename, 232 1.11 christos psymtab_storage *partial_symtabs, 233 1.11 christos objfile_per_bfd_storage *objfile_per_bfd) 234 1.11 christos ATTRIBUTE_NONNULL (2) ATTRIBUTE_NONNULL (3); 235 1.11 christos 236 1.11 christos /* Like the above, but also sets the initial text low and text high 237 1.11 christos from the ADDR argument, and sets the global- and 238 1.11 christos static-offsets. */ 239 1.11 christos 240 1.11 christos partial_symtab (const char *filename, 241 1.11 christos psymtab_storage *partial_symtabs, 242 1.11 christos objfile_per_bfd_storage *objfile_per_bfd, 243 1.11 christos unrelocated_addr addr) 244 1.11 christos ATTRIBUTE_NONNULL (2) ATTRIBUTE_NONNULL (3); 245 1.11 christos 246 1.11 christos virtual ~partial_symtab () 247 1.11 christos { 248 1.11 christos } 249 1.11 christos 250 1.11 christos /* Psymtab expansion is done in two steps: 251 1.11 christos - a call to read_symtab 252 1.11 christos - while that call is in progress, calls to expand_psymtab can be made, 253 1.11 christos both for this psymtab, and its dependencies. 254 1.11 christos This makes a distinction between a toplevel psymtab (for which both 255 1.11 christos read_symtab and expand_psymtab will be called) and a non-toplevel 256 1.11 christos psymtab (for which only expand_psymtab will be called). The 257 1.11 christos distinction can be used f.i. to do things before and after all 258 1.11 christos dependencies of a top-level psymtab have been expanded. 259 1.11 christos 260 1.11 christos Read the full symbol table corresponding to this partial symbol 261 1.11 christos table. Typically calls expand_psymtab. */ 262 1.11 christos virtual void read_symtab (struct objfile *) = 0; 263 1.11 christos 264 1.11 christos /* Expand the full symbol table for this partial symbol table. Typically 265 1.11 christos calls expand_dependencies. */ 266 1.11 christos virtual void expand_psymtab (struct objfile *) = 0; 267 1.11 christos 268 1.11 christos /* Ensure that all the dependencies are read in. Calls 269 1.11 christos expand_psymtab for each non-shared dependency. */ 270 1.11 christos void expand_dependencies (struct objfile *); 271 1.11 christos 272 1.11 christos /* Return true if the symtab corresponding to this psymtab has been 273 1.11 christos read in in the context of this objfile. */ 274 1.11 christos virtual bool readin_p (struct objfile *) const = 0; 275 1.11 christos 276 1.11 christos /* Return a pointer to the compunit allocated for this source file 277 1.11 christos in the context of this objfile. 278 1.11 christos 279 1.11 christos Return nullptr if the compunit was not read in or if there was no 280 1.11 christos symtab. */ 281 1.11 christos virtual struct compunit_symtab *get_compunit_symtab 282 1.11 christos (struct objfile *) const = 0; 283 1.11 christos 284 1.11 christos /* Return the unrelocated low text address of this 285 1.11 christos partial_symtab. */ 286 1.11 christos unrelocated_addr unrelocated_text_low () const 287 1.11 christos { 288 1.11 christos return m_text_low; 289 1.11 christos } 290 1.11 christos 291 1.11 christos /* Return the unrelocated_addr high text address of this 292 1.11 christos partial_symtab. */ 293 1.11 christos unrelocated_addr unrelocated_text_high () const 294 1.11 christos { 295 1.11 christos return m_text_high; 296 1.11 christos } 297 1.11 christos 298 1.11 christos /* Return the relocated low text address of this partial_symtab. */ 299 1.11 christos CORE_ADDR text_low (struct objfile *objfile) const 300 1.11 christos { 301 1.11 christos return CORE_ADDR (m_text_low) + objfile->text_section_offset (); 302 1.11 christos } 303 1.11 christos 304 1.11 christos /* Return the relocated high text address of this partial_symtab. */ 305 1.11 christos CORE_ADDR text_high (struct objfile *objfile) const 306 1.11 christos { 307 1.11 christos return CORE_ADDR (m_text_high) + objfile->text_section_offset (); 308 1.11 christos } 309 1.11 christos 310 1.11 christos /* Set the low text address of this partial_symtab. */ 311 1.11 christos void set_text_low (unrelocated_addr addr) 312 1.11 christos { 313 1.11 christos m_text_low = addr; 314 1.11 christos text_low_valid = 1; 315 1.11 christos } 316 1.11 christos 317 1.11 christos /* Set the high text address of this partial_symtab. */ 318 1.11 christos void set_text_high (unrelocated_addr addr) 319 1.11 christos { 320 1.11 christos m_text_high = addr; 321 1.11 christos text_high_valid = 1; 322 1.11 christos } 323 1.11 christos 324 1.11 christos /* Return true if this symtab is empty -- meaning that it contains 325 1.11 christos no symbols. It may still have dependencies. */ 326 1.11 christos bool empty () const 327 1.11 christos { 328 1.11 christos return global_psymbols.empty () && static_psymbols.empty (); 329 1.11 christos } 330 1.11 christos 331 1.11 christos /* Add a symbol to this partial symbol table of OBJFILE. 332 1.11 christos 333 1.11 christos If COPY_NAME is true, make a copy of NAME, otherwise use the passed 334 1.11 christos reference. 335 1.11 christos 336 1.11 christos THECLASS is the type of symbol. 337 1.11 christos 338 1.11 christos SECTION is the index of the section of OBJFILE in which the symbol is found. 339 1.11 christos 340 1.11 christos WHERE determines whether the symbol goes in the list of static or global 341 1.11 christos partial symbols. 342 1.11 christos 343 1.11 christos COREADDR is the address of the symbol. For partial symbols that don't have 344 1.11 christos an address, zero is passed. 345 1.11 christos 346 1.11 christos LANGUAGE is the language from which the symbol originates. This will 347 1.11 christos influence, amongst other things, how the symbol name is demangled. */ 348 1.11 christos 349 1.11 christos void add_psymbol (std::string_view name, 350 1.11 christos bool copy_name, domain_enum domain, 351 1.11 christos enum address_class theclass, 352 1.12 christos int section, 353 1.11 christos psymbol_placement where, 354 1.11 christos unrelocated_addr coreaddr, 355 1.11 christos enum language language, 356 1.11 christos psymtab_storage *partial_symtabs, 357 1.11 christos struct objfile *objfile); 358 1.11 christos 359 1.11 christos /* Add a symbol to this partial symbol table of OBJFILE. The psymbol 360 1.11 christos must be fully constructed, and the names must be set and intern'd 361 1.11 christos as appropriate. */ 362 1.11 christos 363 1.11 christos void add_psymbol (const partial_symbol &psym, 364 1.11 christos psymbol_placement where, 365 1.11 christos psymtab_storage *partial_symtabs, 366 1.11 christos struct objfile *objfile); 367 1.11 christos 368 1.11 christos 369 1.11 christos /* Indicate that this partial symtab is complete. */ 370 1.11 christos 371 1.11 christos void end (); 372 1.11 christos 373 1.11 christos /* Chain of all existing partial symtabs. */ 374 1.11 christos 375 1.11 christos struct partial_symtab *next = nullptr; 376 1.11 christos 377 1.11 christos /* Name of the source file which this partial_symtab defines, 378 1.11 christos or if the psymtab is anonymous then a descriptive name for 379 1.11 christos debugging purposes, or "". It must not be NULL. */ 380 1.11 christos 381 1.11 christos const char *filename = nullptr; 382 1.11 christos 383 1.11 christos /* Full path of the source file. NULL if not known. */ 384 1.11 christos 385 1.11 christos char *fullname = nullptr; 386 1.11 christos 387 1.11 christos /* Directory in which it was compiled, or NULL if we don't know. */ 388 1.11 christos 389 1.11 christos const char *dirname = nullptr; 390 1.11 christos 391 1.11 christos /* Range of text addresses covered by this file; texthigh is the 392 1.11 christos beginning of the next section. Do not refer directly to these 393 1.11 christos fields. Instead, use the accessors. The validity of these 394 1.11 christos fields is determined by the text_low_valid and text_high_valid 395 1.11 christos fields; these are located later in this structure for better 396 1.11 christos packing. */ 397 1.11 christos 398 1.11 christos unrelocated_addr m_text_low {}; 399 1.11 christos unrelocated_addr m_text_high {}; 400 1.11 christos 401 1.11 christos /* If NULL, this is an ordinary partial symbol table. 402 1.11 christos 403 1.11 christos If non-NULL, this holds a single includer of this partial symbol 404 1.11 christos table, and this partial symbol table is a shared one. 405 1.11 christos 406 1.11 christos A shared psymtab is one that is referenced by multiple other 407 1.11 christos psymtabs, and which conceptually has its contents directly 408 1.11 christos included in those. 409 1.11 christos 410 1.11 christos Shared psymtabs have special semantics. When a search finds a 411 1.11 christos symbol in a shared table, we instead return one of the non-shared 412 1.11 christos tables that include this one. 413 1.11 christos 414 1.11 christos A shared psymtabs can be referred to by other shared ones. 415 1.11 christos 416 1.11 christos The psymtabs that refer to a shared psymtab will list the shared 417 1.11 christos psymtab in their 'dependencies' array. 418 1.11 christos 419 1.11 christos In DWARF terms, a shared psymtab is a DW_TAG_partial_unit; but 420 1.11 christos of course using a name based on that would be too confusing, so 421 1.11 christos "shared" was chosen instead. 422 1.11 christos 423 1.11 christos Only a single user is needed because, when expanding a shared 424 1.11 christos psymtab, we only need to expand its "canonical" non-shared user. 425 1.11 christos The choice of which one should be canonical is left to the 426 1.11 christos debuginfo reader; it can be arbitrary. */ 427 1.11 christos 428 1.11 christos struct partial_symtab *user = nullptr; 429 1.11 christos 430 1.11 christos /* Array of pointers to all of the partial_symtab's which this one 431 1.11 christos depends on. Since this array can only be set to previous or 432 1.11 christos the current (?) psymtab, this dependency tree is guaranteed not 433 1.11 christos to have any loops. "depends on" means that symbols must be read 434 1.11 christos for the dependencies before being read for this psymtab; this is 435 1.11 christos for type references in stabs, where if foo.c includes foo.h, declarations 436 1.11 christos in foo.h may use type numbers defined in foo.c. For other debugging 437 1.11 christos formats there may be no need to use dependencies. */ 438 1.11 christos 439 1.11 christos struct partial_symtab **dependencies = nullptr; 440 1.11 christos 441 1.11 christos int number_of_dependencies = 0; 442 1.11 christos 443 1.11 christos /* Global symbol list. This list will be sorted after readin to 444 1.11 christos improve access. Binary search will be the usual method of 445 1.11 christos finding a symbol within it. */ 446 1.11 christos 447 1.12 christos std::vector<const partial_symbol *> global_psymbols; 448 1.11 christos 449 1.11 christos /* Static symbol list. This list will *not* be sorted after readin; 450 1.11 christos to find a symbol in it, exhaustive search must be used. This is 451 1.11 christos reasonable because searches through this list will eventually 452 1.11 christos lead to either the read in of a files symbols for real (assumed 453 1.11 christos to take a *lot* of time; check) or an error (and we don't care 454 1.11 christos how long errors take). */ 455 1.11 christos 456 1.12 christos std::vector<const partial_symbol *> static_psymbols; 457 1.11 christos 458 1.11 christos /* True if the name of this partial symtab is not a source file name. */ 459 1.11 christos 460 1.11 christos bool anonymous = false; 461 1.11 christos 462 1.11 christos /* A flag that is temporarily used when searching psymtabs. */ 463 1.11 christos 464 1.11 christos ENUM_BITFIELD (psymtab_search_status) searched_flag : 2; 465 1.11 christos 466 1.11 christos /* Validity of the m_text_low and m_text_high fields. */ 467 1.11 christos 468 1.11 christos unsigned int text_low_valid : 1; 469 1.11 christos unsigned int text_high_valid : 1; 470 1.11 christos }; 471 1.11 christos 472 1.11 christos /* A partial symtab that tracks the "readin" and "compunit_symtab" 473 1.11 christos information in the ordinary way -- by storing it directly in this 474 1.11 christos object. */ 475 1.11 christos struct standard_psymtab : public partial_symtab 476 1.11 christos { 477 1.11 christos standard_psymtab (const char *filename, 478 1.11 christos psymtab_storage *partial_symtabs, 479 1.11 christos objfile_per_bfd_storage *objfile_per_bfd) 480 1.11 christos : partial_symtab (filename, partial_symtabs, objfile_per_bfd) 481 1.11 christos { 482 1.11 christos } 483 1.11 christos 484 1.11 christos standard_psymtab (const char *filename, 485 1.11 christos psymtab_storage *partial_symtabs, 486 1.11 christos objfile_per_bfd_storage *objfile_per_bfd, 487 1.11 christos unrelocated_addr addr) 488 1.11 christos : partial_symtab (filename, partial_symtabs, objfile_per_bfd, addr) 489 1.11 christos { 490 1.11 christos } 491 1.11 christos 492 1.11 christos bool readin_p (struct objfile *) const override 493 1.11 christos { 494 1.11 christos return readin; 495 1.11 christos } 496 1.11 christos 497 1.11 christos struct compunit_symtab *get_compunit_symtab (struct objfile *) const override 498 1.11 christos { 499 1.11 christos return compunit_symtab; 500 1.11 christos } 501 1.11 christos 502 1.11 christos /* True if the symtab corresponding to this psymtab has been 503 1.11 christos readin. */ 504 1.11 christos 505 1.11 christos bool readin = false; 506 1.11 christos 507 1.11 christos /* Pointer to compunit eventually allocated for this source file, 0 if 508 1.11 christos !readin or if we haven't looked for the symtab after it was readin. */ 509 1.11 christos 510 1.11 christos struct compunit_symtab *compunit_symtab = nullptr; 511 1.11 christos }; 512 1.11 christos 513 1.11 christos /* A partial_symtab that works in the historical db way. This should 514 1.11 christos not be used in new code, but exists to transition the somewhat 515 1.11 christos unmaintained "legacy" debug formats. */ 516 1.11 christos 517 1.11 christos struct legacy_psymtab : public standard_psymtab 518 1.11 christos { 519 1.11 christos legacy_psymtab (const char *filename, 520 1.11 christos psymtab_storage *partial_symtabs, 521 1.11 christos objfile_per_bfd_storage *objfile_per_bfd) 522 1.11 christos : standard_psymtab (filename, partial_symtabs, objfile_per_bfd) 523 1.11 christos { 524 1.11 christos } 525 1.11 christos 526 1.11 christos legacy_psymtab (const char *filename, 527 1.11 christos psymtab_storage *partial_symtabs, 528 1.11 christos objfile_per_bfd_storage *objfile_per_bfd, 529 1.11 christos unrelocated_addr addr) 530 1.11 christos : standard_psymtab (filename, partial_symtabs, objfile_per_bfd, addr) 531 1.11 christos { 532 1.11 christos } 533 1.11 christos 534 1.11 christos void read_symtab (struct objfile *objf) override 535 1.11 christos { 536 1.11 christos if (legacy_read_symtab) 537 1.11 christos (*legacy_read_symtab) (this, objf); 538 1.11 christos } 539 1.11 christos 540 1.11 christos void expand_psymtab (struct objfile *objf) override 541 1.11 christos { 542 1.11 christos (*legacy_expand_psymtab) (this, objf); 543 1.11 christos } 544 1.11 christos 545 1.11 christos /* Pointer to function which will read in the symtab corresponding to 546 1.11 christos this psymtab. */ 547 1.11 christos 548 1.11 christos void (*legacy_read_symtab) (legacy_psymtab *, struct objfile *) = nullptr; 549 1.11 christos 550 1.11 christos /* Pointer to function which will actually expand this psymtab into 551 1.11 christos a full symtab. */ 552 1.11 christos 553 1.11 christos void (*legacy_expand_psymtab) (legacy_psymtab *, struct objfile *) = nullptr; 554 1.11 christos 555 1.11 christos /* Information that lets read_symtab() locate the part of the symbol table 556 1.11 christos that this psymtab corresponds to. This information is private to the 557 1.11 christos format-dependent symbol reading routines. For further detail examine 558 1.11 christos the various symbol reading modules. */ 559 1.11 christos 560 1.11 christos void *read_symtab_private = nullptr; 561 1.11 christos }; 562 1.11 christos 563 1.11 christos /* Used when recording partial symbol tables. On destruction, 564 1.11 christos discards any partial symbol tables that have been built. However, 565 1.11 christos the tables can be kept by calling the "keep" method. */ 566 1.11 christos class psymtab_discarder 567 1.11 christos { 568 1.11 christos public: 569 1.11 christos 570 1.11 christos psymtab_discarder (psymtab_storage *partial_symtabs) 571 1.11 christos : m_partial_symtabs (partial_symtabs), 572 1.11 christos m_psymtab (partial_symtabs->psymtabs) 573 1.11 christos { 574 1.11 christos } 575 1.11 christos 576 1.11 christos ~psymtab_discarder () 577 1.11 christos { 578 1.11 christos if (m_partial_symtabs != nullptr) 579 1.11 christos m_partial_symtabs->discard_psymtabs_to (m_psymtab); 580 1.11 christos } 581 1.11 christos 582 1.11 christos /* Keep any partial symbol tables that were built. */ 583 1.11 christos void keep () 584 1.11 christos { 585 1.11 christos m_partial_symtabs = nullptr; 586 1.11 christos } 587 1.11 christos 588 1.11 christos private: 589 1.11 christos 590 1.11 christos /* The partial symbol storage object. */ 591 1.11 christos psymtab_storage *m_partial_symtabs; 592 1.11 christos /* How far back to free. */ 593 1.11 christos struct partial_symtab *m_psymtab; 594 1.11 christos }; 595 1.11 christos 596 1.11 christos /* An implementation of quick_symbol_functions, specialized for 597 1.11 christos partial symbols. */ 598 1.11 christos struct psymbol_functions : public quick_symbol_functions 599 1.11 christos { 600 1.11 christos explicit psymbol_functions (const std::shared_ptr<psymtab_storage> &storage) 601 1.11 christos : m_partial_symtabs (storage) 602 1.11 christos { 603 1.11 christos } 604 1.11 christos 605 1.11 christos psymbol_functions () 606 1.11 christos : m_partial_symtabs (new psymtab_storage) 607 1.11 christos { 608 1.11 christos } 609 1.11 christos 610 1.11 christos bool has_symbols (struct objfile *objfile) override; 611 1.11 christos 612 1.11 christos bool has_unexpanded_symtabs (struct objfile *objfile) override; 613 1.11 christos 614 1.11 christos struct symtab *find_last_source_symtab (struct objfile *objfile) override; 615 1.11 christos 616 1.11 christos void forget_cached_source_info (struct objfile *objfile) override; 617 1.11 christos 618 1.11 christos enum language lookup_global_symbol_language (struct objfile *objfile, 619 1.11 christos const char *name, 620 1.11 christos domain_search_flags domain, 621 1.11 christos bool *symbol_found_p) override; 622 1.11 christos 623 1.11 christos void print_stats (struct objfile *objfile, bool print_bcache) override; 624 1.11 christos 625 1.11 christos void dump (struct objfile *objfile) override; 626 1.11 christos 627 1.11 christos void expand_all_symtabs (struct objfile *objfile) override; 628 1.11 christos 629 1.11 christos bool expand_symtabs_matching 630 1.11 christos (struct objfile *objfile, 631 1.11 christos gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher, 632 1.11 christos const lookup_name_info *lookup_name, 633 1.11 christos gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher, 634 1.11 christos gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify, 635 1.11 christos block_search_flags search_flags, 636 1.12 christos domain_search_flags kind, 637 1.12 christos gdb::function_view<expand_symtabs_lang_matcher_ftype> lang_matcher) 638 1.12 christos override; 639 1.11 christos 640 1.11 christos struct compunit_symtab *find_pc_sect_compunit_symtab 641 1.12 christos (struct objfile *objfile, bound_minimal_symbol msymbol, CORE_ADDR pc, 642 1.12 christos struct obj_section *section, int warn_if_readin) override; 643 1.11 christos 644 1.11 christos struct compunit_symtab *find_compunit_symtab_by_address 645 1.11 christos (struct objfile *objfile, CORE_ADDR address) override 646 1.11 christos { 647 1.11 christos return nullptr; 648 1.11 christos } 649 1.11 christos 650 1.11 christos void map_symbol_filenames (struct objfile *objfile, 651 1.11 christos gdb::function_view<symbol_filename_ftype> fun, 652 1.11 christos bool need_fullname) override; 653 1.11 christos 654 1.11 christos /* Return a range adapter for the psymtabs. */ 655 1.11 christos psymtab_storage::partial_symtab_range partial_symbols 656 1.11 christos (struct objfile *objfile); 657 1.11 christos 658 1.11 christos /* Return the partial symbol storage associated with this 659 1.11 christos object. */ 660 1.11 christos const std::shared_ptr<psymtab_storage> &get_partial_symtabs () const 661 1.11 christos { 662 1.11 christos return m_partial_symtabs; 663 1.11 christos } 664 1.11 christos 665 1.11 christos /* Replace the partial symbol table storage in this object with 666 1.11 christos SYMS. */ 667 1.11 christos void set_partial_symtabs (const std::shared_ptr<psymtab_storage> &syms) 668 1.11 christos { 669 1.11 christos m_partial_symtabs = syms; 670 1.11 christos } 671 1.11 christos 672 1.11 christos /* Find which partial symtab contains PC and SECTION. Return NULL if 673 1.11 christos none. We return the psymtab that contains a symbol whose address 674 1.11 christos exactly matches PC, or, if we cannot find an exact match, the 675 1.11 christos psymtab that contains a symbol whose address is closest to PC. */ 676 1.11 christos 677 1.12 christos struct partial_symtab *find_pc_sect_psymtab (struct objfile *objfile, 678 1.12 christos CORE_ADDR pc, 679 1.12 christos struct obj_section *section, 680 1.12 christos bound_minimal_symbol msymbol); 681 1.11 christos 682 1.11 christos private: 683 1.11 christos 684 1.11 christos /* Count the number of partial symbols in *THIS. */ 685 1.11 christos int count_psyms (); 686 1.11 christos 687 1.11 christos /* Storage for the partial symbols. */ 688 1.11 christos std::shared_ptr<psymtab_storage> m_partial_symtabs; 689 1.8 christos }; 690 1.8 christos 691 1.12 christos #endif /* GDB_PSYMTAB_H */ 692