Commit | Line | Data |
---|---|---|
9b99dcc8 TT |
1 | /* "Quick" symbol functions |
2 | ||
3 | Copyright (C) 2021 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 GDB_QUICK_SYMBOL_H | |
21 | #define GDB_QUICK_SYMBOL_H | |
22 | ||
e357e990 TT |
23 | /* Like block_enum, but used as flags to pass to lookup functions. */ |
24 | ||
25 | enum block_search_flag_values | |
26 | { | |
27 | SEARCH_GLOBAL_BLOCK = 1, | |
28 | SEARCH_STATIC_BLOCK = 2 | |
29 | }; | |
30 | ||
31 | DEF_ENUM_FLAGS_TYPE (enum block_search_flag_values, block_search_flags); | |
32 | ||
9b99dcc8 TT |
33 | /* Comparison function for symbol look ups. */ |
34 | ||
35 | typedef int (symbol_compare_ftype) (const char *string1, | |
36 | const char *string2); | |
37 | ||
38 | /* Callback for quick_symbol_functions->map_symbol_filenames. */ | |
39 | ||
40 | typedef void (symbol_filename_ftype) (const char *filename, | |
f4655dee | 41 | const char *fullname); |
9b99dcc8 TT |
42 | |
43 | /* Callback for quick_symbol_functions->expand_symtabs_matching | |
44 | to match a file name. */ | |
45 | ||
46 | typedef bool (expand_symtabs_file_matcher_ftype) (const char *filename, | |
47 | bool basenames); | |
48 | ||
49 | /* Callback for quick_symbol_functions->expand_symtabs_matching | |
50 | to match a symbol name. */ | |
51 | ||
52 | typedef bool (expand_symtabs_symbol_matcher_ftype) (const char *name); | |
53 | ||
54 | /* Callback for quick_symbol_functions->expand_symtabs_matching | |
df35e626 TT |
55 | to be called after a symtab has been expanded. If this returns |
56 | true, more symtabs are checked; if it returns false, iteration | |
57 | stops. */ | |
9b99dcc8 | 58 | |
df35e626 | 59 | typedef bool (expand_symtabs_exp_notify_ftype) (compunit_symtab *symtab); |
9b99dcc8 TT |
60 | |
61 | /* The "quick" symbol functions exist so that symbol readers can | |
62 | avoiding an initial read of all the symbols. For example, symbol | |
63 | readers might choose to use the "partial symbol table" utilities, | |
64 | which is one implementation of the quick symbol functions. | |
65 | ||
66 | The quick symbol functions are generally opaque: the underlying | |
67 | representation is hidden from the caller. | |
68 | ||
69 | In general, these functions should only look at whatever special | |
70 | index the symbol reader creates -- looking through the symbol | |
71 | tables themselves is handled by generic code. If a function is | |
72 | defined as returning a "symbol table", this means that the function | |
73 | should only return a newly-created symbol table; it should not | |
74 | examine pre-existing ones. | |
75 | ||
76 | The exact list of functions here was determined in an ad hoc way | |
77 | based on gdb's history. */ | |
78 | ||
79 | struct quick_symbol_functions | |
80 | { | |
39298a5d TT |
81 | virtual ~quick_symbol_functions () |
82 | { | |
83 | } | |
84 | ||
9b99dcc8 TT |
85 | /* Return true if this objfile has any "partial" symbols |
86 | available. */ | |
39298a5d | 87 | virtual bool has_symbols (struct objfile *objfile) = 0; |
9b99dcc8 TT |
88 | |
89 | /* Return the symbol table for the "last" file appearing in | |
90 | OBJFILE. */ | |
39298a5d | 91 | virtual struct symtab *find_last_source_symtab (struct objfile *objfile) = 0; |
9b99dcc8 TT |
92 | |
93 | /* Forget all cached full file names for OBJFILE. */ | |
39298a5d | 94 | virtual void forget_cached_source_info (struct objfile *objfile) = 0; |
9b99dcc8 | 95 | |
9b99dcc8 TT |
96 | /* Check to see if the global symbol is defined in a "partial" symbol table |
97 | of OBJFILE. NAME is the name of the symbol to look for. DOMAIN | |
98 | indicates what sort of symbol to search for. | |
99 | ||
100 | If found, sets *symbol_found_p to true and returns the symbol language. | |
101 | defined, or NULL if no such symbol table exists. */ | |
39298a5d TT |
102 | virtual enum language lookup_global_symbol_language |
103 | (struct objfile *objfile, | |
104 | const char *name, | |
105 | domain_enum domain, | |
106 | bool *symbol_found_p) = 0; | |
9b99dcc8 TT |
107 | |
108 | /* Print statistics about any indices loaded for OBJFILE. The | |
109 | statistics should be printed to gdb_stdout. This is used for | |
4829711b TT |
110 | "maint print statistics". Statistics are printed in two |
111 | sections. PRINT_BCACHE is false when printing the first section | |
112 | of general statistics, and true when printing bcache statistics. */ | |
113 | virtual void print_stats (struct objfile *objfile, bool print_bcache) = 0; | |
9b99dcc8 TT |
114 | |
115 | /* Dump any indices loaded for OBJFILE. The dump should go to | |
116 | gdb_stdout. This is used for "maint print objfiles". */ | |
39298a5d | 117 | virtual void dump (struct objfile *objfile) = 0; |
9b99dcc8 | 118 | |
9b99dcc8 | 119 | /* Read all symbol tables associated with OBJFILE. */ |
39298a5d | 120 | virtual void expand_all_symtabs (struct objfile *objfile) = 0; |
9b99dcc8 | 121 | |
9b99dcc8 | 122 | /* Find global or static symbols in all tables that are in DOMAIN |
0b7b2c2a TT |
123 | and for which MATCH (symbol name, NAME) == 0, reading in partial |
124 | symbol tables as needed. Look through global symbols if GLOBAL | |
125 | and otherwise static symbols. | |
126 | ||
9b99dcc8 TT |
127 | MATCH must be weaker than strcmp_iw_ordered in the sense that |
128 | strcmp_iw_ordered(x,y) == 0 --> MATCH(x,y) == 0. ORDERED_COMPARE, | |
129 | if non-null, must be an ordering relation compatible with | |
130 | strcmp_iw_ordered in the sense that | |
131 | strcmp_iw_ordered(x,y) == 0 --> ORDERED_COMPARE(x,y) == 0 | |
132 | and | |
133 | strcmp_iw_ordered(x,y) <= 0 --> ORDERED_COMPARE(x,y) <= 0 | |
134 | (allowing strcmp_iw_ordered(x,y) < 0 while ORDERED_COMPARE(x, y) == 0). | |
0b7b2c2a | 135 | */ |
9b99dcc8 | 136 | |
0b7b2c2a | 137 | virtual void expand_matching_symbols |
9b99dcc8 TT |
138 | (struct objfile *, |
139 | const lookup_name_info &lookup_name, | |
140 | domain_enum domain, | |
141 | int global, | |
39298a5d | 142 | symbol_compare_ftype *ordered_compare) = 0; |
9b99dcc8 TT |
143 | |
144 | /* Expand all symbol tables in OBJFILE matching some criteria. | |
145 | ||
146 | FILE_MATCHER is called for each file in OBJFILE. The file name | |
147 | is passed to it. If the matcher returns false, the file is | |
148 | skipped. If FILE_MATCHER is NULL the file is not skipped. If | |
149 | BASENAMES is true the matcher should consider only file base | |
150 | names (the passed file name is already only the lbasename'd | |
151 | part). | |
152 | ||
153 | If the file is not skipped, and SYMBOL_MATCHER and LOOKUP_NAME are NULL, | |
154 | the symbol table is expanded. | |
155 | ||
156 | Otherwise, individual symbols are considered. | |
157 | ||
3bfa51a7 TT |
158 | If DOMAIN or KIND do not match, the symbol is skipped. |
159 | If DOMAIN is UNDEF_DOMAIN, that is treated as a wildcard. | |
9b99dcc8 TT |
160 | |
161 | If the symbol name does not match LOOKUP_NAME, the symbol is skipped. | |
162 | ||
163 | If SYMBOL_MATCHER returns false, then the symbol is skipped. | |
164 | ||
df35e626 TT |
165 | Otherwise, the symbol's symbol table is expanded and the |
166 | notification function is called. If the notification function | |
167 | returns false, execution stops and this method returns false. | |
168 | Otherwise, more files are considered. This method will return | |
169 | true if all calls to the notification function return true. */ | |
170 | virtual bool expand_symtabs_matching | |
9b99dcc8 TT |
171 | (struct objfile *objfile, |
172 | gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher, | |
173 | const lookup_name_info *lookup_name, | |
174 | gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher, | |
175 | gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify, | |
03a8ea51 | 176 | block_search_flags search_flags, |
3bfa51a7 | 177 | domain_enum domain, |
39298a5d | 178 | enum search_domain kind) = 0; |
9b99dcc8 TT |
179 | |
180 | /* Return the comp unit from OBJFILE that contains PC and | |
181 | SECTION. Return NULL if there is no such compunit. This | |
182 | should return the compunit that contains a symbol whose | |
183 | address exactly matches PC, or, if there is no exact match, the | |
184 | compunit that contains a symbol whose address is closest to | |
185 | PC. */ | |
39298a5d | 186 | virtual struct compunit_symtab *find_pc_sect_compunit_symtab |
9b99dcc8 | 187 | (struct objfile *objfile, struct bound_minimal_symbol msymbol, |
39298a5d | 188 | CORE_ADDR pc, struct obj_section *section, int warn_if_readin) = 0; |
9b99dcc8 TT |
189 | |
190 | /* Return the comp unit from OBJFILE that contains a symbol at | |
191 | ADDRESS. Return NULL if there is no such comp unit. Unlike | |
192 | find_pc_sect_compunit_symtab, any sort of symbol (not just text | |
193 | symbols) can be considered, and only exact address matches are | |
39298a5d TT |
194 | considered. */ |
195 | virtual struct compunit_symtab *find_compunit_symtab_by_address | |
196 | (struct objfile *objfile, CORE_ADDR address) = 0; | |
9b99dcc8 TT |
197 | |
198 | /* Call a callback for every file defined in OBJFILE whose symtab is | |
f4655dee TT |
199 | not already read in. FUN is the callback. It is passed the |
200 | file's FILENAME and the file's FULLNAME (if need_fullname is | |
201 | non-zero). */ | |
202 | virtual void map_symbol_filenames | |
203 | (struct objfile *objfile, | |
204 | gdb::function_view<symbol_filename_ftype> fun, | |
205 | bool need_fullname) = 0; | |
75336a5a TT |
206 | |
207 | /* This is called when the objfile is relocated. It can be used to | |
208 | clean up any internal caches. */ | |
209 | virtual void relocated () | |
210 | { | |
211 | /* Do nothing. */ | |
212 | } | |
eb00e468 TT |
213 | |
214 | /* Return true if this class can lazily read the symbols. This may | |
215 | only return true if there are in fact symbols to be read, because | |
216 | this is used in the implementation of 'has_partial_symbols'. */ | |
217 | virtual bool can_lazily_read_symbols () | |
218 | { | |
219 | return false; | |
220 | } | |
221 | ||
222 | /* Read the partial symbols for OBJFILE. This will only ever be | |
223 | called if can_lazily_read_symbols returns true. */ | |
224 | virtual void read_partial_symbols (struct objfile *objfile) | |
225 | { | |
226 | } | |
9b99dcc8 TT |
227 | }; |
228 | ||
39298a5d TT |
229 | typedef std::unique_ptr<quick_symbol_functions> quick_symbol_functions_up; |
230 | ||
9b99dcc8 | 231 | #endif /* GDB_QUICK_SYMBOL_H */ |