diff options
author | Tom Tromey <tom@tromey.com> | 2021-03-20 17:23:40 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2021-03-20 17:23:41 -0600 |
commit | 9b99dcc8dbc4367b2d2af78ee896508b67f5517a (patch) | |
tree | f7594286d4adcb185600a7bbb57765a5f030f461 /gdb/quick-symbol.h | |
parent | 4d080b4687deb2441a81762f3b01fc51cd13bd97 (diff) | |
download | fsf-binutils-gdb-9b99dcc8dbc4367b2d2af78ee896508b67f5517a.zip fsf-binutils-gdb-9b99dcc8dbc4367b2d2af78ee896508b67f5517a.tar.gz fsf-binutils-gdb-9b99dcc8dbc4367b2d2af78ee896508b67f5517a.tar.bz2 |
Move quick_symbol_functions to a new header
This introduces a new header, quick-symbol.h, and moves
quick_symbol_functions and related typedefs into it.
gdb/ChangeLog
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.
Diffstat (limited to 'gdb/quick-symbol.h')
-rw-r--r-- | gdb/quick-symbol.h | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/gdb/quick-symbol.h b/gdb/quick-symbol.h new file mode 100644 index 0000000..fa5f501 --- /dev/null +++ b/gdb/quick-symbol.h @@ -0,0 +1,228 @@ +/* "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 */ |