diff options
author | Tom Tromey <tom@tromey.com> | 2020-11-12 08:47:09 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2020-11-12 08:47:09 -0700 |
commit | 1f2624a35413c31c317e5da8ce7401b59ecfbfa5 (patch) | |
tree | de75c4db6e08432ce1bf00fae7a2855593e5dab5 /gdb/symtab.c | |
parent | 9e74f0aef6a73dba185161558cebace2ed9a54e5 (diff) | |
download | gdb-1f2624a35413c31c317e5da8ce7401b59ecfbfa5.zip gdb-1f2624a35413c31c317e5da8ce7401b59ecfbfa5.tar.gz gdb-1f2624a35413c31c317e5da8ce7401b59ecfbfa5.tar.bz2 |
Fix Rust regression with -readnow
PR rust/26799 points out that a certain test case fails with -readnow.
This happens because, with -readnow, there are no partial symtabs; but
find_symbol_at_address requires these.
This patch fixes this problem by searching all of an objfile's
compunit symtabs if it does not have partial symbols.
Note that this test will still fail with .gdb_index. I don't think
that is readily fixable.
gdb/ChangeLog
2020-11-12 Tom Tromey <tom@tromey.com>
PR rust/26799:
* symtab.c (find_symbol_at_address): Search symtabs if no psymtabs
exist.
gdb/testsuite/ChangeLog
2020-11-12 Tom Tromey <tom@tromey.com>
PR rust/26799:
* gdb.rust/traits.exp: Remove kfails.
Diffstat (limited to 'gdb/symtab.c')
-rw-r--r-- | gdb/symtab.c | 59 |
1 files changed, 41 insertions, 18 deletions
diff --git a/gdb/symtab.c b/gdb/symtab.c index 5cc875f..dccc3d1 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -3024,30 +3024,53 @@ find_pc_compunit_symtab (CORE_ADDR pc) struct symbol * find_symbol_at_address (CORE_ADDR address) { - for (objfile *objfile : current_program_space->objfiles ()) + /* A helper function to search a given symtab for a symbol matching + ADDR. */ + auto search_symtab = [] (compunit_symtab *symtab, CORE_ADDR addr) -> symbol * { - if (objfile->sf == NULL - || objfile->sf->qf->find_compunit_symtab_by_address == NULL) - continue; + const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (symtab); - struct compunit_symtab *symtab - = objfile->sf->qf->find_compunit_symtab_by_address (objfile, address); - if (symtab != NULL) + for (int i = GLOBAL_BLOCK; i <= STATIC_BLOCK; ++i) { - const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (symtab); + const struct block *b = BLOCKVECTOR_BLOCK (bv, i); + struct block_iterator iter; + struct symbol *sym; - for (int i = GLOBAL_BLOCK; i <= STATIC_BLOCK; ++i) + ALL_BLOCK_SYMBOLS (b, iter, sym) { - const struct block *b = BLOCKVECTOR_BLOCK (bv, i); - struct block_iterator iter; - struct symbol *sym; + if (SYMBOL_CLASS (sym) == LOC_STATIC + && SYMBOL_VALUE_ADDRESS (sym) == addr) + return sym; + } + } + return nullptr; + }; - ALL_BLOCK_SYMBOLS (b, iter, sym) - { - if (SYMBOL_CLASS (sym) == LOC_STATIC - && SYMBOL_VALUE_ADDRESS (sym) == address) - return sym; - } + for (objfile *objfile : current_program_space->objfiles ()) + { + /* If this objfile doesn't have "quick" functions, then it may + have been read with -readnow, in which case we need to search + the symtabs directly. */ + if (objfile->sf == NULL + || objfile->sf->qf->find_compunit_symtab_by_address == NULL) + { + for (compunit_symtab *symtab : objfile->compunits ()) + { + struct symbol *sym = search_symtab (symtab, address); + if (sym != nullptr) + return sym; + } + } + else + { + struct compunit_symtab *symtab + = objfile->sf->qf->find_compunit_symtab_by_address (objfile, + address); + if (symtab != NULL) + { + struct symbol *sym = search_symtab (symtab, address); + if (sym != nullptr) + return sym; } } } |