diff options
-rw-r--r-- | gdb/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/dwarf2/read.c | 71 | ||||
-rw-r--r-- | gdb/dwarf2/read.h | 4 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/info_sources.exp | 17 |
5 files changed, 53 insertions, 52 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7e4b0bd..5013d73 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2021-04-23 Andrew Burgess <andrew.burgess@embecosm.com> + + * dwarf2/read.c: Add 'unordered_set' include. + (dwarf2_base_index_functions::map_symbol_filenames): Replace + 'visited' hash table with 'qfn_cache' unordered_set. Remove use + of per_Bfd->filenames_cache cache, and use function local + filenames_cache instead. Reindent. + * dwarf2/read.h (struct dwarf2_per_bfd) <filenames_cache>: Delete. + 2021-04-22 Simon Marchi <simon.marchi@polymtl.ca> * breakpoint.c (iterate_over_bp_locations): Change callback to diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c index 40aeb29..306971e 100644 --- a/gdb/dwarf2/read.c +++ b/gdb/dwarf2/read.c @@ -88,6 +88,7 @@ #include "rust-lang.h" #include "gdbsupport/pathstuff.h" #include "count-one-bits.h" +#include <unordered_set> /* When == 1, print basic high level tracing messages. When > 1, be more verbose. @@ -4713,58 +4714,44 @@ dwarf2_base_index_functions::map_symbol_filenames { dwarf2_per_objfile *per_objfile = get_dwarf2_per_objfile (objfile); - if (!per_objfile->per_bfd->filenames_cache) - { - per_objfile->per_bfd->filenames_cache.emplace (); - - htab_up visited (htab_create_alloc (10, - htab_hash_pointer, htab_eq_pointer, - NULL, xcalloc, xfree)); + /* Use caches to ensure we only call FUN once for each filename. */ + filename_seen_cache filenames_cache; + std::unordered_set<quick_file_names *> qfn_cache; - /* The rule is CUs specify all the files, including those used - by any TU, so there's no need to scan TUs here. We can - ignore file names coming from already-expanded CUs. */ + /* The rule is CUs specify all the files, including those used by any TU, + so there's no need to scan TUs here. We can ignore file names coming + from already-expanded CUs. It is possible that an expanded CU might + reuse the file names data from a currently unexpanded CU, in this + case we don't want to report the files from the unexpanded CU. */ - for (dwarf2_per_cu_data *per_cu : per_objfile->per_bfd->all_comp_units) + for (dwarf2_per_cu_data *per_cu : per_objfile->per_bfd->all_comp_units) + { + if (per_objfile->symtab_set_p (per_cu)) { - if (per_objfile->symtab_set_p (per_cu)) - { - void **slot = htab_find_slot (visited.get (), - per_cu->v.quick->file_names, - INSERT); - - *slot = per_cu->v.quick->file_names; - } + if (per_cu->v.quick->file_names != nullptr) + qfn_cache.insert (per_cu->v.quick->file_names); } + } - for (dwarf2_per_cu_data *per_cu : per_objfile->per_bfd->all_comp_units) - { - /* We only need to look at symtabs not already expanded. */ - if (per_objfile->symtab_set_p (per_cu)) - continue; - - quick_file_names *file_data - = dw2_get_file_names (per_cu, per_objfile); - if (file_data == NULL) - continue; + for (dwarf2_per_cu_data *per_cu : per_objfile->per_bfd->all_comp_units) + { + /* We only need to look at symtabs not already expanded. */ + if (per_objfile->symtab_set_p (per_cu)) + continue; - void **slot = htab_find_slot (visited.get (), file_data, INSERT); - if (*slot) - { - /* Already visited. */ - continue; - } - *slot = file_data; + quick_file_names *file_data = dw2_get_file_names (per_cu, per_objfile); + if (file_data == nullptr + || qfn_cache.find (file_data) != qfn_cache.end ()) + continue; - for (int j = 0; j < file_data->num_file_names; ++j) - { - const char *filename = file_data->file_names[j]; - per_objfile->per_bfd->filenames_cache->seen (filename); - } + for (int j = 0; j < file_data->num_file_names; ++j) + { + const char *filename = file_data->file_names[j]; + filenames_cache.seen (filename); } } - per_objfile->per_bfd->filenames_cache->traverse ([&] (const char *filename) + filenames_cache.traverse ([&] (const char *filename) { gdb::unique_xmalloc_ptr<char> this_real_name; diff --git a/gdb/dwarf2/read.h b/gdb/dwarf2/read.h index 4dea86f..dc25ff1 100644 --- a/gdb/dwarf2/read.h +++ b/gdb/dwarf2/read.h @@ -235,10 +235,6 @@ public: /* The CUs we recently read. */ std::vector<dwarf2_per_cu_data *> just_read_cus; - /* Table containing all filenames. This is an optional because the - table is lazily constructed on first access. */ - gdb::optional<filename_seen_cache> filenames_cache; - /* If we loaded the index from an external file, this contains the resources associated to the open file, memory mapping, etc. */ std::unique_ptr<index_cache_resource> index_cache_res; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 1a181f3..73f95b9 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2021-04-23 Andrew Burgess <andrew.burgess@embecosm.com> + + * gdb.base/info_sources.exp: Add new tests. + 2021-04-22 Tom Tromey <tom@tromey.com> * gdb.base/ptype-offsets.cc (struct empty_member): New. diff --git a/gdb/testsuite/gdb.base/info_sources.exp b/gdb/testsuite/gdb.base/info_sources.exp index 81edb3d..a4f7d19 100644 --- a/gdb/testsuite/gdb.base/info_sources.exp +++ b/gdb/testsuite/gdb.base/info_sources.exp @@ -28,18 +28,18 @@ if {[prepare_for_testing $testfile.exp $testfile \ # in the output. Similarly, EXPECT_SEEN_INFO_SOURCES_BASE indicates that the source file # info_sources_base.c must be seen in the output. proc test_info_sources {args expect_seen_info_sources expect_seen_info_sources_base} { - global gdb_prompt + global gdb_prompt srcfile srcfile2 set seen_info_sources 0 set seen_info_sources_base 0 set cmd [concat "info sources " $args] gdb_test_multiple $cmd $cmd { - -re "^\[^,\]*info_sources.c(, |\[\r\n\]+)" { - set seen_info_sources 1 + -re "^\[^,\]*${srcfile}(, |\[\r\n\]+)" { + incr seen_info_sources exp_continue } - -re "^\[^,\]*info_sources_base.c(, |\[\r\n\]+)" { - set seen_info_sources_base 1 + -re "^\[^,\]*${srcfile2}(, |\[\r\n\]+)" { + incr seen_info_sources_base 1 exp_continue } -re ", " { @@ -60,8 +60,13 @@ if ![runto_main] { untested $testfile.exp return -1 } -gdb_test "break some_other_func" "" +# List both files with no regexp: +with_test_prefix "in main" { + test_info_sources "" 1 1 +} + +gdb_test "break some_other_func" "" gdb_test "continue" # List both files with no regexp: |