[gdb/symtab] Prefer def over decl (inter-CU case)
authorTom de Vries <tdevries@suse.de>
Thu, 23 Apr 2020 13:42:47 +0000 (15:42 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 23 Apr 2020 13:42:47 +0000 (15:42 +0200)
commitde82891ce5b6d2c8109f512cd0732325f4cd0557
treefc6456d024f830a8cd7d5303c8dd00ad3c1bbf23
parentecc6c6066b5cdd4663413e0bd6ef8deea1a8c889
[gdb/symtab] Prefer def over decl (inter-CU case)

When running test-case gdb.threads/tls.exp with target board -readnow, we
have:
...
(gdb) print a_thread_local^M
Cannot find thread-local storage for process 0, executable file tls/tls:^M
Cannot find thread-local variables on this target^M
(gdb) FAIL: gdb.threads/tls.exp: print a_thread_local
...
while with native we have:
...
(gdb) print a_thread_local^M
Cannot read `a_thread_local' without registers^M
(gdb) PASS: gdb.threads/tls.exp: print a_thread_local
...

The difference in behaviour can be explained as follows.  Without -readnow, we
have two a_thread_locals, the def and the decl, each in a different CU:
...
$ gdb -batch outputs/gdb.threads/tls/tls \
    -ex "maint expand-symtabs" \
    -ex "print a_thread_local" \
    -ex "maint print symbols" \
    | grep "a_thread_local;"
Cannot read `a_thread_local' without registers
 int a_thread_local; computed at runtime
 int a_thread_local; unresolved
...
and with -readnow, we have the opposite order:
...
$ gdb -readnow -batch outputs/gdb.threads/tls/tls  \
    -ex "maint expand-symtabs" \
    -ex "print a_thread_local" \
    -ex "maint print symbols" \
    | grep "a_thread_local;"
Cannot find thread-local storage for process 0, executable file tls/tls:
Cannot find thread-local variables on this target
 int a_thread_local; unresolved
 int a_thread_local; computed at runtime
...

Fix the FAIL by preferring the def over the decl (something we already do
intra-CU since the fix for PR24971, commit 93e55f0a03 "[gdb/symtab] Prefer var
def over decl").

Build and reg-tested on x86_64-linux.

gdb/ChangeLog:

2020-04-23  Tom de Vries  <tdevries@suse.de>

PR symtab/25807
* block.c (best_symbol, better_symbol): Promote to external.
* block.h (best_symbol, better_symbol): Declare.
* symtab.c (lookup_symbol_in_objfile_symtabs): Prefer def over
decl.

gdb/testsuite/ChangeLog:

2020-04-23  Tom de Vries  <tdevries@suse.de>

* gdb.base/decl-before-def-decl.c: New test.
* gdb.base/decl-before-def-def.c: New test.
* gdb.base/decl-before-def.exp: New file.
gdb/ChangeLog
gdb/block.c
gdb/block.h
gdb/symtab.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/decl-before-def-decl.c [new file with mode: 0644]
gdb/testsuite/gdb.base/decl-before-def-def.c [new file with mode: 0644]
gdb/testsuite/gdb.base/decl-before-def.exp [new file with mode: 0644]