| /* An implementation of "quick" symbol functions for already expanded |
| symbol tables. |
| |
| Copyright (C) 2026-2026 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/>. */ |
| |
| #include "objfiles.h" |
| #include "symtab.h" |
| #include "source.h" |
| #include "expanded-symbol.h" |
| |
| /* See readnow-symbols.h. */ |
| |
| struct symtab * |
| expanded_symbols_functions::find_last_source_symtab (struct objfile *objfile) |
| { |
| if (objfile->compunit_symtabs.empty ()) |
| return nullptr; |
| else |
| return objfile->compunit_symtabs.back ().primary_filetab (); |
| } |
| |
| /* See readnow-symbols.h. */ |
| |
| enum language |
| expanded_symbols_functions::lookup_global_symbol_language ( |
| struct objfile *objfile, const char *name, domain_search_flags domain, |
| bool *symbol_found_p) |
| { |
| *symbol_found_p = false; |
| return language_unknown; |
| } |
| |
| /* See readnow-symbols.h. */ |
| |
| bool |
| expanded_symbols_functions::search (struct objfile *objfile, |
| search_symtabs_file_matcher file_matcher, |
| const lookup_name_info *lookup_name, |
| search_symtabs_symbol_matcher symbol_matcher, |
| search_symtabs_expansion_listener listener, |
| block_search_flags search_flags, |
| domain_search_flags domain, |
| search_symtabs_lang_matcher lang_matcher) |
| { |
| /* This invariant is documented in quick-functions.h. */ |
| gdb_assert (lookup_name != nullptr || symbol_matcher == nullptr); |
| |
| for (compunit_symtab &cu : objfile->compunits ()) |
| { |
| if (lang_matcher != nullptr && !lang_matcher (cu.language ())) |
| continue; |
| |
| if (file_matcher != nullptr) |
| { |
| bool matched = false; |
| for (auto st : cu.filetabs ()) |
| { |
| if (file_matcher (st->filename (), false)) |
| { |
| matched = true; |
| break; |
| } |
| if ((basenames_may_differ |
| || file_matcher (lbasename (st->filename ()), true)) |
| && file_matcher (symtab_to_fullname (st), false)) |
| { |
| matched = true; |
| break; |
| } |
| } |
| if (!matched) |
| continue; |
| } |
| |
| /* Here we simply call the listener (if any) without bothering to |
| consult lookup_name and symbol_matcher (if any). This should be |
| okay since i) all symtabs are already expanded and ii) listeners |
| iterate over matching symbols themselves. */ |
| if (listener != nullptr && !listener (&cu)) |
| return false; |
| } |
| return true; |
| } |
| |
| /* See readnow-symbols.h. */ |
| |
| struct symbol * |
| expanded_symbols_functions::find_symbol_by_address (struct objfile *objfile, |
| CORE_ADDR address) |
| { |
| for (compunit_symtab &symtab : objfile->compunits ()) |
| { |
| struct symbol *sym = symtab.symbol_at_address (address); |
| if (sym != nullptr) |
| return sym; |
| } |
| |
| return nullptr; |
| } |