|  | /* "Quick" symbol functions | 
|  |  | 
|  | Copyright (C) 2021-2023 Free Software Foundation, Inc. | 
|  |  | 
|  | This file is part of GDB. | 
|  |  | 
|  | This program is free software; you can redistribute it and/or modify | 
|  | it under the terms of the GNU General Public License as published by | 
|  | the Free Software Foundation; either version 3 of the License, or | 
|  | (at your option) any later version. | 
|  |  | 
|  | This program is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | GNU General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU General Public License | 
|  | along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  | #ifndef GDB_QUICK_SYMBOL_H | 
|  | #define GDB_QUICK_SYMBOL_H | 
|  |  | 
|  | /* Like block_enum, but used as flags to pass to lookup functions.  */ | 
|  |  | 
|  | enum block_search_flag_values | 
|  | { | 
|  | SEARCH_GLOBAL_BLOCK = 1, | 
|  | SEARCH_STATIC_BLOCK = 2 | 
|  | }; | 
|  |  | 
|  | DEF_ENUM_FLAGS_TYPE (enum block_search_flag_values, block_search_flags); | 
|  |  | 
|  | /* Comparison function for symbol look ups.  */ | 
|  |  | 
|  | typedef int (symbol_compare_ftype) (const char *string1, | 
|  | const char *string2); | 
|  |  | 
|  | /* Callback for quick_symbol_functions->map_symbol_filenames.  */ | 
|  |  | 
|  | typedef void (symbol_filename_ftype) (const char *filename, | 
|  | const char *fullname); | 
|  |  | 
|  | /* Callback for quick_symbol_functions->expand_symtabs_matching | 
|  | to match a file name.  */ | 
|  |  | 
|  | typedef bool (expand_symtabs_file_matcher_ftype) (const char *filename, | 
|  | bool basenames); | 
|  |  | 
|  | /* Callback for quick_symbol_functions->expand_symtabs_matching | 
|  | to match a symbol name.  */ | 
|  |  | 
|  | typedef bool (expand_symtabs_symbol_matcher_ftype) (const char *name); | 
|  |  | 
|  | /* Callback for quick_symbol_functions->expand_symtabs_matching | 
|  | to be called after a symtab has been expanded.  If this returns | 
|  | true, more symtabs are checked; if it returns false, iteration | 
|  | stops.  */ | 
|  |  | 
|  | typedef bool (expand_symtabs_exp_notify_ftype) (compunit_symtab *symtab); | 
|  |  | 
|  | /* The "quick" symbol functions exist so that symbol readers can | 
|  | avoiding an initial read of all the symbols.  For example, symbol | 
|  | readers might choose to use the "partial symbol table" utilities, | 
|  | which is one implementation of the quick symbol functions. | 
|  |  | 
|  | The quick symbol functions are generally opaque: the underlying | 
|  | representation is hidden from the caller. | 
|  |  | 
|  | In general, these functions should only look at whatever special | 
|  | index the symbol reader creates -- looking through the symbol | 
|  | tables themselves is handled by generic code.  If a function is | 
|  | defined as returning a "symbol table", this means that the function | 
|  | should only return a newly-created symbol table; it should not | 
|  | examine pre-existing ones. | 
|  |  | 
|  | The exact list of functions here was determined in an ad hoc way | 
|  | based on gdb's history.  */ | 
|  |  | 
|  | struct quick_symbol_functions | 
|  | { | 
|  | virtual ~quick_symbol_functions () | 
|  | { | 
|  | } | 
|  |  | 
|  | /* Return true if this objfile has any "partial" symbols | 
|  | available.  */ | 
|  | virtual bool has_symbols (struct objfile *objfile) = 0; | 
|  |  | 
|  | /* Return true if OBJFILE has any unexpanded symtabs.  A return value of | 
|  | false indicates there are no unexpanded symtabs, this might mean that | 
|  | all of the symtabs have been expanded (full debug has been read in), | 
|  | or it might been that OBJFILE has no debug information.  */ | 
|  | virtual bool has_unexpanded_symtabs (struct objfile *objfile) = 0; | 
|  |  | 
|  | /* Return the symbol table for the "last" file appearing in | 
|  | OBJFILE.  */ | 
|  | virtual struct symtab *find_last_source_symtab (struct objfile *objfile) = 0; | 
|  |  | 
|  | /* Forget all cached full file names for OBJFILE.  */ | 
|  | virtual void forget_cached_source_info (struct objfile *objfile) = 0; | 
|  |  | 
|  | /* Check to see if the global symbol is defined in a "partial" symbol table | 
|  | of OBJFILE. NAME is the name of the symbol to look for.  DOMAIN | 
|  | indicates what sort of symbol to search for. | 
|  |  | 
|  | If found, sets *symbol_found_p to true and returns the symbol language. | 
|  | defined, or NULL if no such symbol table exists.  */ | 
|  | virtual enum language lookup_global_symbol_language | 
|  | (struct objfile *objfile, | 
|  | const char *name, | 
|  | domain_enum domain, | 
|  | bool *symbol_found_p) = 0; | 
|  |  | 
|  | /* Print statistics about any indices loaded for OBJFILE.  The | 
|  | statistics should be printed to gdb_stdout.  This is used for | 
|  | "maint print statistics".  Statistics are printed in two | 
|  | sections.  PRINT_BCACHE is false when printing the first section | 
|  | of general statistics, and true when printing bcache statistics.  */ | 
|  | virtual void print_stats (struct objfile *objfile, bool print_bcache) = 0; | 
|  |  | 
|  | /* Dump any indices loaded for OBJFILE.  The dump should go to | 
|  | gdb_stdout.  This is used for "maint print objfiles".  */ | 
|  | virtual void dump (struct objfile *objfile) = 0; | 
|  |  | 
|  | /* Read all symbol tables associated with OBJFILE.  */ | 
|  | virtual void expand_all_symtabs (struct objfile *objfile) = 0; | 
|  |  | 
|  | /* Find global or static symbols in all tables that are in DOMAIN | 
|  | and for which MATCH (symbol name, NAME) == 0, reading in partial | 
|  | symbol tables as needed.  Look through global symbols if GLOBAL | 
|  | and otherwise static symbols. | 
|  |  | 
|  | MATCH must be weaker than strcmp_iw_ordered in the sense that | 
|  | strcmp_iw_ordered(x,y) == 0 --> MATCH(x,y) == 0.  ORDERED_COMPARE, | 
|  | if non-null, must be an ordering relation compatible with | 
|  | strcmp_iw_ordered in the sense that | 
|  | strcmp_iw_ordered(x,y) == 0 --> ORDERED_COMPARE(x,y) == 0 | 
|  | and | 
|  | strcmp_iw_ordered(x,y) <= 0 --> ORDERED_COMPARE(x,y) <= 0 | 
|  | (allowing strcmp_iw_ordered(x,y) < 0 while ORDERED_COMPARE(x, y) == 0). | 
|  | */ | 
|  |  | 
|  | virtual void expand_matching_symbols | 
|  | (struct objfile *, | 
|  | const lookup_name_info &lookup_name, | 
|  | domain_enum domain, | 
|  | int global, | 
|  | symbol_compare_ftype *ordered_compare) = 0; | 
|  |  | 
|  | /* Expand all symbol tables in OBJFILE matching some criteria. | 
|  |  | 
|  | FILE_MATCHER is called for each file in OBJFILE.  The file name | 
|  | is passed to it.  If the matcher returns false, the file is | 
|  | skipped.  If FILE_MATCHER is NULL the file is not skipped.  If | 
|  | BASENAMES is true the matcher should consider only file base | 
|  | names (the passed file name is already only the lbasename'd | 
|  | part). | 
|  |  | 
|  | If the file is not skipped, and SYMBOL_MATCHER and LOOKUP_NAME are NULL, | 
|  | the symbol table is expanded. | 
|  |  | 
|  | Otherwise, individual symbols are considered. | 
|  |  | 
|  | If DOMAIN or KIND do not match, the symbol is skipped. | 
|  | If DOMAIN is UNDEF_DOMAIN, that is treated as a wildcard. | 
|  |  | 
|  | If the symbol name does not match LOOKUP_NAME, the symbol is skipped. | 
|  |  | 
|  | If SYMBOL_MATCHER returns false, then the symbol is skipped. | 
|  | Note that if SYMBOL_MATCHER is non-NULL, then LOOKUP_NAME must | 
|  | also be provided. | 
|  |  | 
|  | Otherwise, the symbol's symbol table is expanded and the | 
|  | notification function is called.  If the notification function | 
|  | returns false, execution stops and this method returns false. | 
|  | Otherwise, more files are considered.  This method will return | 
|  | true if all calls to the notification function return true.  */ | 
|  | virtual bool expand_symtabs_matching | 
|  | (struct objfile *objfile, | 
|  | gdb::function_view<expand_symtabs_file_matcher_ftype> file_matcher, | 
|  | const lookup_name_info *lookup_name, | 
|  | gdb::function_view<expand_symtabs_symbol_matcher_ftype> symbol_matcher, | 
|  | gdb::function_view<expand_symtabs_exp_notify_ftype> expansion_notify, | 
|  | block_search_flags search_flags, | 
|  | domain_enum domain, | 
|  | enum search_domain kind) = 0; | 
|  |  | 
|  | /* Return the comp unit from OBJFILE that contains PC and | 
|  | SECTION.  Return NULL if there is no such compunit.  This | 
|  | should return the compunit that contains a symbol whose | 
|  | address exactly matches PC, or, if there is no exact match, the | 
|  | compunit that contains a symbol whose address is closest to | 
|  | PC.  */ | 
|  | virtual struct compunit_symtab *find_pc_sect_compunit_symtab | 
|  | (struct objfile *objfile, struct bound_minimal_symbol msymbol, | 
|  | CORE_ADDR pc, struct obj_section *section, int warn_if_readin) = 0; | 
|  |  | 
|  | /* Return the comp unit from OBJFILE that contains a symbol at | 
|  | ADDRESS.  Return NULL if there is no such comp unit.  Unlike | 
|  | find_pc_sect_compunit_symtab, any sort of symbol (not just text | 
|  | symbols) can be considered, and only exact address matches are | 
|  | considered.  */ | 
|  | virtual struct compunit_symtab *find_compunit_symtab_by_address | 
|  | (struct objfile *objfile, CORE_ADDR address) = 0; | 
|  |  | 
|  | /* Call a callback for every file defined in OBJFILE whose symtab is | 
|  | not already read in.  FUN is the callback.  It is passed the | 
|  | file's FILENAME and the file's FULLNAME (if need_fullname is | 
|  | non-zero).  */ | 
|  | virtual void map_symbol_filenames | 
|  | (struct objfile *objfile, | 
|  | gdb::function_view<symbol_filename_ftype> fun, | 
|  | bool need_fullname) = 0; | 
|  |  | 
|  | /* Return true if this class can lazily read the symbols.  This may | 
|  | only return true if there are in fact symbols to be read, because | 
|  | this is used in the implementation of 'has_partial_symbols'.  */ | 
|  | virtual bool can_lazily_read_symbols () | 
|  | { | 
|  | return false; | 
|  | } | 
|  |  | 
|  | /* Read the partial symbols for OBJFILE.  This will only ever be | 
|  | called if can_lazily_read_symbols returns true.  */ | 
|  | virtual void read_partial_symbols (struct objfile *objfile) | 
|  | { | 
|  | } | 
|  | }; | 
|  |  | 
|  | typedef std::unique_ptr<quick_symbol_functions> quick_symbol_functions_up; | 
|  |  | 
|  | #endif /* GDB_QUICK_SYMBOL_H */ |