+2021-03-20 Tom Tromey <tom@tromey.com>
+
+ * symfile.h (symbol_compare_ftype, symbol_filename_ftype)
+ (expand_symtabs_file_matcher_ftype)
+ (expand_symtabs_symbol_matcher_ftype)
+ (expand_symtabs_exp_notify_ftype, struct quick_symbol_functions):
+ Move to quick-symbol.h.
+ * quick-symbol.h: New file.
+
2021-03-20 Tom Tromey <tom@tromey.com>
* symtab.c (iterate_over_symtabs, expand_symtab_containing_pc)
--- /dev/null
+/* "Quick" symbol functions
+
+ Copyright (C) 2021 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
+
+/* 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, void *data);
+
+/* 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. */
+
+typedef void (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
+{
+ /* Return true if this objfile has any "partial" symbols
+ available. */
+ bool (*has_symbols) (struct objfile *objfile);
+
+ /* Return the symbol table for the "last" file appearing in
+ OBJFILE. */
+ struct symtab *(*find_last_source_symtab) (struct objfile *objfile);
+
+ /* Forget all cached full file names for OBJFILE. */
+ void (*forget_cached_source_info) (struct objfile *objfile);
+
+ /* 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. */
+ bool (*map_symtabs_matching_filename)
+ (struct objfile *objfile, const char *name, const char *real_path,
+ gdb::function_view<bool (symtab *)> callback);
+
+ /* 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. */
+ struct compunit_symtab *(*lookup_symbol) (struct objfile *objfile,
+ block_enum block_index,
+ const char *name,
+ domain_enum domain);
+
+ /* 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. */
+ enum language (*lookup_global_symbol_language) (struct objfile *objfile,
+ const char *name,
+ domain_enum domain,
+ bool *symbol_found_p);
+
+ /* Print statistics about any indices loaded for OBJFILE. The
+ statistics should be printed to gdb_stdout. This is used for
+ "maint print statistics". */
+ void (*print_stats) (struct objfile *objfile);
+
+ /* Dump any indices loaded for OBJFILE. The dump should go to
+ gdb_stdout. This is used for "maint print objfiles". */
+ void (*dump) (struct objfile *objfile);
+
+ /* Find all the symbols in OBJFILE named FUNC_NAME, and ensure that
+ the corresponding symbol tables are loaded. */
+ void (*expand_symtabs_for_function) (struct objfile *objfile,
+ const char *func_name);
+
+ /* Read all symbol tables associated with OBJFILE. */
+ void (*expand_all_symtabs) (struct objfile *objfile);
+
+ /* 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. */
+ void (*expand_symtabs_with_fullname) (struct objfile *objfile,
+ const char *fullname);
+
+ /* 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.
+ 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).
+ CALLBACK returns true to indicate that the scan should continue, or
+ false to indicate that the scan should be terminated. */
+
+ void (*map_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);
+
+ /* 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 KIND does not match, the symbol is skipped.
+
+ 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. */
+ void (*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,
+ enum search_domain kind);
+
+ /* 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. */
+ 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);
+
+ /* 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. This pointer may be NULL. */
+ struct compunit_symtab *(*find_compunit_symtab_by_address)
+ (struct objfile *objfile, CORE_ADDR address);
+
+ /* 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. */
+ void (*map_symbol_filenames) (struct objfile *objfile,
+ symbol_filename_ftype *fun, void *data,
+ int need_fullname);
+};
+
+#endif /* GDB_QUICK_SYMBOL_H */
#include "gdb_bfd.h"
#include "gdbsupport/function-view.h"
#include "target-section.h"
+#include "quick-symbol.h"
/* Opaque declarations. */
struct target_section;
struct axs_value;
class probe;
-/* Comparison function for symbol look ups. */
-
-typedef int (symbol_compare_ftype) (const char *string1,
- const char *string2);
-
struct other_sections
{
other_sections (CORE_ADDR addr_, std::string &&name_, int sectindex_)
using symfile_segment_data_up = std::unique_ptr<symfile_segment_data>;
-/* Callback for quick_symbol_functions->map_symbol_filenames. */
-
-typedef void (symbol_filename_ftype) (const char *filename,
- const char *fullname, void *data);
-
-/* 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. */
-
-typedef void (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
-{
- /* Return true if this objfile has any "partial" symbols
- available. */
- bool (*has_symbols) (struct objfile *objfile);
-
- /* Return the symbol table for the "last" file appearing in
- OBJFILE. */
- struct symtab *(*find_last_source_symtab) (struct objfile *objfile);
-
- /* Forget all cached full file names for OBJFILE. */
- void (*forget_cached_source_info) (struct objfile *objfile);
-
- /* 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. */
- bool (*map_symtabs_matching_filename)
- (struct objfile *objfile, const char *name, const char *real_path,
- gdb::function_view<bool (symtab *)> callback);
-
- /* 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. */
- struct compunit_symtab *(*lookup_symbol) (struct objfile *objfile,
- block_enum block_index,
- const char *name,
- domain_enum domain);
-
- /* 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. */
- enum language (*lookup_global_symbol_language) (struct objfile *objfile,
- const char *name,
- domain_enum domain,
- bool *symbol_found_p);
-
- /* Print statistics about any indices loaded for OBJFILE. The
- statistics should be printed to gdb_stdout. This is used for
- "maint print statistics". */
- void (*print_stats) (struct objfile *objfile);
-
- /* Dump any indices loaded for OBJFILE. The dump should go to
- gdb_stdout. This is used for "maint print objfiles". */
- void (*dump) (struct objfile *objfile);
-
- /* Find all the symbols in OBJFILE named FUNC_NAME, and ensure that
- the corresponding symbol tables are loaded. */
- void (*expand_symtabs_for_function) (struct objfile *objfile,
- const char *func_name);
-
- /* Read all symbol tables associated with OBJFILE. */
- void (*expand_all_symtabs) (struct objfile *objfile);
-
- /* 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. */
- void (*expand_symtabs_with_fullname) (struct objfile *objfile,
- const char *fullname);
-
- /* 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.
- 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).
- CALLBACK returns true to indicate that the scan should continue, or
- false to indicate that the scan should be terminated. */
-
- void (*map_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);
-
- /* 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 KIND does not match, the symbol is skipped.
-
- 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. */
- void (*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,
- enum search_domain kind);
-
- /* 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. */
- 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);
-
- /* 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. This pointer may be NULL. */
- struct compunit_symtab *(*find_compunit_symtab_by_address)
- (struct objfile *objfile, CORE_ADDR address);
-
- /* 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. */
- void (*map_symbol_filenames) (struct objfile *objfile,
- symbol_filename_ftype *fun, void *data,
- int need_fullname);
-};
-
/* Structure of functions used for probe support. If one of these functions
is provided, all must be. */