[gdb/symtab] Prefer def over decl (inter-CU case, with context)
This is a follow-up patch on "[PATCH][gdb/symtab] Prefer def over decl (inter-CU case)" ( https://sourceware.org/pipermail/gdb-patches/2020-April/167489.html ). Consider the test-case from that patch. It contains a decl and def of var a in different CUs, and tests whether var a can be printed using the def, even if the decl is found first. However, the test-case does this in a contextless environment, so if we add to the test-case like this to set the context to the CU containing main: ... gdb_test "p a" { = \{1, 2\}} + +if ![runto_main] then { + fail "can't run to main" + return 0 +} + +gdb_test "p a" { = \{1, 2\}} ... then the second test fails, because the decl is found in the context. Fix this by preferring defs over decls in lookup_global_symbol. Build and reg-tested on x86_64-linux. gdb/ChangeLog: 2020-04-23 Tom de Vries <tdevries@suse.de> * symtab.c (lookup_global_symbol): Prefer def over decl. gdb/testsuite/ChangeLog: 2020-04-23 Tom de Vries <tdevries@suse.de> * gdb.base/decl-before-def.exp: Run to main and print a again.
This commit is contained in:
parent
de82891ce5
commit
70bc38f513
4 changed files with 26 additions and 5 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
2020-04-23 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
|
* symtab.c (lookup_global_symbol): Prefer def over decl.
|
||||||
|
|
||||||
2020-04-23 Tom de Vries <tdevries@suse.de>
|
2020-04-23 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
PR symtab/25807
|
PR symtab/25807
|
||||||
|
|
12
gdb/symtab.c
12
gdb/symtab.c
|
@ -2718,17 +2718,23 @@ lookup_global_symbol (const char *name,
|
||||||
global block first. This yields "more expected" behavior, and is
|
global block first. This yields "more expected" behavior, and is
|
||||||
needed to support 'FILENAME'::VARIABLE lookups. */
|
needed to support 'FILENAME'::VARIABLE lookups. */
|
||||||
const struct block *global_block = block_global_block (block);
|
const struct block *global_block = block_global_block (block);
|
||||||
|
symbol *sym = NULL;
|
||||||
if (global_block != nullptr)
|
if (global_block != nullptr)
|
||||||
{
|
{
|
||||||
symbol *sym = lookup_symbol_in_block (name,
|
sym = lookup_symbol_in_block (name,
|
||||||
symbol_name_match_type::FULL,
|
symbol_name_match_type::FULL,
|
||||||
global_block, domain);
|
global_block, domain);
|
||||||
if (sym != nullptr)
|
if (sym != NULL && best_symbol (sym, domain))
|
||||||
return { sym, global_block };
|
return { sym, global_block };
|
||||||
}
|
}
|
||||||
|
|
||||||
struct objfile *objfile = lookup_objfile_from_block (block);
|
struct objfile *objfile = lookup_objfile_from_block (block);
|
||||||
return lookup_global_or_static_symbol (name, GLOBAL_BLOCK, objfile, domain);
|
block_symbol bs
|
||||||
|
= lookup_global_or_static_symbol (name, GLOBAL_BLOCK, objfile, domain);
|
||||||
|
if (better_symbol (sym, bs.symbol, domain) == sym)
|
||||||
|
return { sym, global_block };
|
||||||
|
else
|
||||||
|
return bs;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
2020-04-23 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
|
* gdb.base/decl-before-def.exp: Run to main and print a again.
|
||||||
|
|
||||||
2020-04-23 Tom de Vries <tdevries@suse.de>
|
2020-04-23 Tom de Vries <tdevries@suse.de>
|
||||||
|
|
||||||
* gdb.base/decl-before-def-decl.c: New test.
|
* gdb.base/decl-before-def-decl.c: New test.
|
||||||
|
|
|
@ -24,3 +24,10 @@ if {[prepare_for_testing "failed to prepare" $testfile $sources]} {
|
||||||
gdb_test "maint expand-symtabs"
|
gdb_test "maint expand-symtabs"
|
||||||
|
|
||||||
gdb_test "p a" { = \{1, 2\}}
|
gdb_test "p a" { = \{1, 2\}}
|
||||||
|
|
||||||
|
if ![runto_main] then {
|
||||||
|
fail "can't run to main"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
gdb_test "p a" { = \{1, 2\}}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue