/* "Quick" symbol functions
- Copyright (C) 2021 Free Software Foundation, Inc.
+ Copyright (C) 2021-2022 Free Software Foundation, Inc.
This file is part of GDB.
#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,
/* Callback for quick_symbol_functions->map_symbol_filenames. */
typedef void (symbol_filename_ftype) (const char *filename,
- const char *fullname, void *data);
+ const char *fullname);
/* Callback for quick_symbol_functions->expand_symtabs_matching
to match a file 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. */
+ to be called after a symtab has been expanded. If this returns
+ true, more symtabs are checked; if it returns false, iteration
+ stops. */
-typedef void (expand_symtabs_exp_notify_ftype) (compunit_symtab *symtab);
+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
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;
- /* Expand and iterate over each "partial" symbol table in OBJFILE
- where the source file is named NAME.
-
- If NAME is not absolute, a match after a '/' in the symbol table's
- file name will also work, REAL_PATH is NULL then. If NAME is
- absolute then REAL_PATH is non-NULL absolute file name as resolved
- via gdb_realpath from NAME.
-
- If a match is found, the "partial" symbol table is expanded.
- Then, this calls iterate_over_some_symtabs (or equivalent) over
- all newly-created symbol tables, passing CALLBACK to it.
- The result of this call is returned. */
- virtual bool map_symtabs_matching_filename
- (struct objfile *objfile, const char *name, const char *real_path,
- gdb::function_view<bool (symtab *)> callback) = 0;
-
- /* Check to see if the symbol is defined in a "partial" symbol table
- of OBJFILE. BLOCK_INDEX should be either GLOBAL_BLOCK or STATIC_BLOCK,
- depending on whether we want to search global symbols or static
- symbols. NAME is the name of the symbol to look for. DOMAIN
- indicates what sort of symbol to search for.
-
- Returns the newly-expanded compunit in which the symbol is
- defined, or NULL if no such symbol table exists. If OBJFILE
- contains !TYPE_OPAQUE symbol prefer its compunit. If it contains
- only TYPE_OPAQUE symbol(s), return at least that compunit. */
- virtual struct compunit_symtab *lookup_symbol (struct objfile *objfile,
- block_enum block_index,
- const char *name,
- domain_enum domain) = 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.
/* Print statistics about any indices loaded for OBJFILE. The
statistics should be printed to gdb_stdout. This is used for
- "maint print statistics". */
- virtual void print_stats (struct objfile *objfile) = 0;
+ "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;
- /* Find all the symbols in OBJFILE named FUNC_NAME, and ensure that
- the corresponding symbol tables are loaded. */
- virtual void expand_symtabs_for_function (struct objfile *objfile,
- const char *func_name) = 0;
-
/* Read all symbol tables associated with OBJFILE. */
virtual void expand_all_symtabs (struct objfile *objfile) = 0;
- /* Read all symbol tables associated with OBJFILE which have
- symtab_to_fullname equal to FULLNAME.
- This is for the purposes of examining code only, e.g., expand_line_sal.
- The routine may ignore debug info that is known to not be useful with
- code, e.g., DW_TAG_type_unit for dwarf debug info. */
- virtual void expand_symtabs_with_fullname (struct objfile *objfile,
- const char *fullname) = 0;
-
/* Find global or static symbols in all tables that are in DOMAIN
- and for which MATCH (symbol name, NAME) == 0, passing each to
- CALLBACK, reading in partial symbol tables as needed. Look
- through global symbols if GLOBAL and otherwise static symbols.
- Passes NAME and NAMESPACE to CALLBACK with each symbol
- found. After each block is processed, passes NULL to CALLBACK.
+ 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
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).
- CALLBACK returns true to indicate that the scan should continue, or
- false to indicate that the scan should be terminated. */
+ */
- virtual void map_matching_symbols
+ virtual void expand_matching_symbols
(struct objfile *,
const lookup_name_info &lookup_name,
domain_enum domain,
int global,
- gdb::function_view<symbol_found_callback_ftype> callback,
symbol_compare_ftype *ordered_compare) = 0;
/* Expand all symbol tables in OBJFILE matching some criteria.
Otherwise, individual symbols are considered.
- If KIND does not match, the symbol is skipped.
+ 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.
-
- Otherwise, the symbol's symbol table is expanded. */
- virtual void expand_symtabs_matching
+ 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
(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, the file's FULLNAME (if need_fullname is non-zero), and
- the DATA passed to this function. */
- virtual void map_symbol_filenames (struct objfile *objfile,
- symbol_filename_ftype *fun, void *data,
- int need_fullname) = 0;
+ 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;
+
+ /* This is called when the objfile is relocated. It can be used to
+ clean up any internal caches. */
+ virtual void relocated ()
+ {
+ /* Do nothing. */
+ }
+
+ /* 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;