Commit | Line | Data |
---|---|---|
ccefe4c4 TT |
1 | /* Public partial symbol table definitions. |
2 | ||
42a4f53d | 3 | Copyright (C) 2009-2019 Free Software Foundation, Inc. |
ccefe4c4 TT |
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 | ||
a9342b62 | 23 | #include "gdb_obstack.h" |
44b13c5a | 24 | #include "symfile.h" |
b22a7c6a | 25 | #include "common/next-iterator.h" |
44b13c5a | 26 | |
d320c2b5 TT |
27 | struct partial_symbol; |
28 | ||
710e1a31 SW |
29 | /* A bcache for partial symbols. */ |
30 | ||
31 | struct psymbol_bcache; | |
32 | ||
d320c2b5 | 33 | /* An instance of this class manages the partial symbol tables and |
8d7bcccb TT |
34 | partial symbols for a given objfile. |
35 | ||
36 | The core psymtab functions -- those in psymtab.c -- arrange for | |
37 | nearly all psymtab- and psymbol-related allocations to happen | |
38 | either in the psymtab_storage object (either on its obstack or in | |
39 | other memory managed by this class), or on the per-BFD object. The | |
40 | only link from the psymtab storage object back to the objfile (or | |
41 | objfile_obstack) that is made by the core psymtab code is the | |
42 | compunit_symtab member in the psymtab. | |
43 | ||
44 | However, it is up to each symbol reader to maintain this invariant | |
45 | in other ways, if it wants to reuse psymtabs across multiple | |
46 | objfiles. The main issue here is ensuring that read_symtab_private | |
47 | does not point into objfile_obstack. */ | |
cbd70537 | 48 | |
d320c2b5 TT |
49 | class psymtab_storage |
50 | { | |
51 | public: | |
ccefe4c4 | 52 | |
8d7bcccb | 53 | psymtab_storage (); |
9291a0cd | 54 | |
d320c2b5 | 55 | ~psymtab_storage (); |
b22a7c6a | 56 | |
d320c2b5 TT |
57 | DISABLE_COPY_AND_ASSIGN (psymtab_storage); |
58 | ||
59 | /* Discard all partial symbol tables starting with "psymtabs" and | |
60 | proceeding until "to" has been discarded. */ | |
b22a7c6a | 61 | |
d320c2b5 | 62 | void discard_psymtabs_to (struct partial_symtab *to) |
b22a7c6a | 63 | { |
d320c2b5 TT |
64 | while (psymtabs != to) |
65 | discard_psymtab (psymtabs); | |
b22a7c6a | 66 | } |
d320c2b5 TT |
67 | |
68 | /* Discard the partial symbol table. */ | |
69 | ||
70 | void discard_psymtab (struct partial_symtab *pst); | |
71 | ||
5923a04c TT |
72 | /* Return the obstack that is used for storage by this object. */ |
73 | ||
74 | struct obstack *obstack () | |
75 | { | |
8d7bcccb TT |
76 | if (!m_obstack.has_value ()) |
77 | m_obstack.emplace (); | |
78 | return &*m_obstack; | |
5923a04c TT |
79 | } |
80 | ||
a9342b62 TT |
81 | /* Allocate storage for the "dependencies" field of a psymtab. |
82 | NUMBER says how many dependencies there are. */ | |
83 | ||
84 | struct partial_symtab **allocate_dependencies (int number) | |
85 | { | |
86 | return OBSTACK_CALLOC (obstack (), number, struct partial_symtab *); | |
87 | } | |
88 | ||
b596a3c7 TT |
89 | /* Allocate a new psymtab on the psymtab obstack. The new psymtab |
90 | will be linked in to the "psymtabs" list, but otherwise all other | |
91 | fields will be zero. */ | |
92 | ||
93 | struct partial_symtab *allocate_psymtab (); | |
94 | ||
f252c6d5 TT |
95 | typedef next_adapter<struct partial_symtab> partial_symtab_range; |
96 | ||
97 | /* A range adapter that makes it possible to iterate over all | |
98 | psymtabs in one objfile. */ | |
99 | ||
100 | partial_symtab_range range () | |
101 | { | |
102 | return partial_symtab_range (psymtabs); | |
103 | } | |
104 | ||
d320c2b5 TT |
105 | |
106 | /* Each objfile points to a linked list of partial symtabs derived from | |
107 | this file, one partial symtab structure for each compilation unit | |
108 | (source file). */ | |
109 | ||
110 | struct partial_symtab *psymtabs = nullptr; | |
111 | ||
112 | /* Map addresses to the entries of PSYMTABS. It would be more efficient to | |
113 | have a map per the whole process but ADDRMAP cannot selectively remove | |
114 | its items during FREE_OBJFILE. This mapping is already present even for | |
115 | PARTIAL_SYMTABs which still have no corresponding full SYMTABs read. */ | |
116 | ||
117 | struct addrmap *psymtabs_addrmap = nullptr; | |
118 | ||
d320c2b5 TT |
119 | /* A byte cache where we can stash arbitrary "chunks" of bytes that |
120 | will not change. */ | |
121 | ||
122 | struct psymbol_bcache *psymbol_cache; | |
123 | ||
124 | /* Vectors of all partial symbols read in from file. The actual data | |
125 | is stored in the objfile_obstack. */ | |
126 | ||
127 | std::vector<partial_symbol *> global_psymbols; | |
128 | std::vector<partial_symbol *> static_psymbols; | |
5923a04c TT |
129 | |
130 | private: | |
131 | ||
b596a3c7 TT |
132 | /* List of freed partial symtabs, available for re-use. */ |
133 | ||
134 | struct partial_symtab *free_psymtabs = nullptr; | |
135 | ||
8d7bcccb TT |
136 | /* The obstack where allocations are made. This is lazily allocated |
137 | so that we don't waste memory when there are no psymtabs. */ | |
5923a04c | 138 | |
8d7bcccb | 139 | gdb::optional<auto_obstack> m_obstack; |
b22a7c6a TT |
140 | }; |
141 | ||
d320c2b5 TT |
142 | |
143 | extern struct psymbol_bcache *psymbol_bcache_init (void); | |
144 | extern void psymbol_bcache_free (struct psymbol_bcache *); | |
145 | extern struct bcache *psymbol_bcache_get_bcache (struct psymbol_bcache *); | |
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 | ||
b11896a5 TT |
152 | /* Ensure that the partial symbols for OBJFILE have been loaded. If |
153 | VERBOSE is non-zero, then this will print a message when symbols | |
b22a7c6a TT |
154 | are loaded. This function returns a range adapter suitable for |
155 | iterating over the psymtabs of OBJFILE. */ | |
b11896a5 | 156 | |
f252c6d5 TT |
157 | extern psymtab_storage::partial_symtab_range require_partial_symbols |
158 | (struct objfile *objfile, int verbose); | |
b11896a5 | 159 | |
ccefe4c4 | 160 | #endif /* PSYMTAB_H */ |