mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-05 21:50:21 +08:00
[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.
This commit is contained in:
10
gdb/block.h
10
gdb/block.h
@ -342,6 +342,16 @@ extern struct symbol *block_iter_match_first (const struct block *block,
|
||||
extern struct symbol *block_iter_match_next
|
||||
(const lookup_name_info &name, struct block_iterator *iterator);
|
||||
|
||||
/* Return true if symbol A is the best match possible for DOMAIN. */
|
||||
|
||||
extern bool best_symbol (struct symbol *a, const domain_enum domain);
|
||||
|
||||
/* Return symbol B if it is a better match than symbol A for DOMAIN.
|
||||
Otherwise return A. */
|
||||
|
||||
extern struct symbol *better_symbol (struct symbol *a, struct symbol *b,
|
||||
const domain_enum domain);
|
||||
|
||||
/* Search BLOCK for symbol NAME in DOMAIN. */
|
||||
|
||||
extern struct symbol *block_lookup_symbol (const struct block *block,
|
||||
|
Reference in New Issue
Block a user