diff options
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/quick-symbol.h | 228 | ||||
-rw-r--r-- | gdb/symfile.h | 206 |
3 files changed, 238 insertions, 205 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dc96da1..82a82c9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,14 @@ 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) (lookup_symbol_via_quick_fns, find_quick_global_symbol_language) (basic_lookup_transparent_type_quick) 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 */ diff --git a/gdb/symfile.h b/gdb/symfile.h index 76b6d4b..c87bbed 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -28,6 +28,7 @@ #include "gdb_bfd.h" #include "gdbsupport/function-view.h" #include "target-section.h" +#include "quick-symbol.h" /* Opaque declarations. */ struct target_section; @@ -41,11 +42,6 @@ struct agent_expr; 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_) @@ -107,206 +103,6 @@ struct symfile_segment_data 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. */ |