Skip to content

Commit

Permalink
[gdb/symtab] Prefer def over decl (inter-CU case, with context)
Browse files Browse the repository at this point in the history
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  <[email protected]>

	* symtab.c (lookup_global_symbol): Prefer def over decl.

gdb/testsuite/ChangeLog:

2020-04-23  Tom de Vries  <[email protected]>

	* gdb.base/decl-before-def.exp: Run to main and print a again.
  • Loading branch information
vries committed Apr 23, 2020
1 parent de82891 commit 70bc38f
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 5 deletions.
4 changes: 4 additions & 0 deletions gdb/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
2020-04-23 Tom de Vries <[email protected]>

* symtab.c (lookup_global_symbol): Prefer def over decl.

2020-04-23 Tom de Vries <[email protected]>

PR symtab/25807
Expand Down
16 changes: 11 additions & 5 deletions gdb/symtab.c
Original file line number Diff line number Diff line change
Expand Up @@ -2718,17 +2718,23 @@ lookup_global_symbol (const char *name,
global block first. This yields "more expected" behavior, and is
needed to support 'FILENAME'::VARIABLE lookups. */
const struct block *global_block = block_global_block (block);
symbol *sym = NULL;
if (global_block != nullptr)
{
symbol *sym = lookup_symbol_in_block (name,
symbol_name_match_type::FULL,
global_block, domain);
if (sym != nullptr)
sym = lookup_symbol_in_block (name,
symbol_name_match_type::FULL,
global_block, domain);
if (sym != NULL && best_symbol (sym, domain))
return { sym, global_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
Expand Down
4 changes: 4 additions & 0 deletions gdb/testsuite/ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
2020-04-23 Tom de Vries <[email protected]>

* gdb.base/decl-before-def.exp: Run to main and print a again.

2020-04-23 Tom de Vries <[email protected]>

* gdb.base/decl-before-def-decl.c: New test.
Expand Down
7 changes: 7 additions & 0 deletions gdb/testsuite/gdb.base/decl-before-def.exp
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,10 @@ if {[prepare_for_testing "failed to prepare" $testfile $sources]} {
gdb_test "maint expand-symtabs"

gdb_test "p a" { = \{1, 2\}}

if ![runto_main] then {
fail "can't run to main"
return 0
}

gdb_test "p a" { = \{1, 2\}}

0 comments on commit 70bc38f

Please sign in to comment.