[gdb/symtab] Fix language of duplicate static minimal symbol
authorTom de Vries <tdevries@suse.de>
Fri, 9 Nov 2018 10:54:04 +0000 (11:54 +0100)
committerTom de Vries <tdevries@suse.de>
Fri, 9 Nov 2018 10:54:04 +0000 (11:54 +0100)
commit9325300dc283ece6bf6305b912f53114c0895114
tree8e2ed081e8fd2d578fed61a7b527e46223c0eefc
parent13daa8e4889a971309f7d46a8d49129cb26088a5
[gdb/symtab] Fix language of duplicate static minimal symbol

Consider a test-case with source files msym.c:
...
static int foo (void) { return 1; }
...
and msym_main.c:
...
static int foo (void) { return 2; }
int main (void) { return 0; }
..
compiled as c++ with minimal symbols:
...
$ g++ msym_main.c msym.c
...

With objdump -x we find the two foo symbols prefixed with their corresponding
files in the symbol table:
...
0000000000000000 l    df *ABS*  0000000000000000              msym_main.c
00000000004004c7 l     F .text  000000000000000b              _ZL3foov
0000000000000000 l    df *ABS*  0000000000000000              msym.c
00000000004004dd l     F .text  000000000000000b              _ZL3foov
...

However, when we use gdb to print info on foo, both foos are listed, but we
get one symbol mangled and one symbol demangled:
...
$ gdb ./a.out -batch -ex "info func foo"
All functions matching regular expression "foo":

Non-debugging symbols:
0x00000000004004c7  foo()
0x00000000004004dd  _ZL3foov
...

During minimal symbol reading symbol_set_names is called for each symbol.

First, it's called with foo from msym.c, an entry is created in
per_bfd->demangled_names_hash and symbol_find_demangled_name is called, which
has the side effect of setting the language of the symbol to language_cplus.

Then, it's called with foo from msym_main.c.  Since
per_bfd->demangled_names_hash already has an entry for that name,
symbol_find_demangled_name is not called, and the language of the symbol
remains language_auto.

Fix this by doing the symbol_find_demangled_name call unconditionally.

Build and reg-tested on x86_64-linux.

gdb/ChangeLog:

2018-11-09  Tom de Vries  <tdevries@suse.de>

* symtab.c (symbol_set_names): Call symbol_find_demangled_name
unconditionally, to set the language of the symbol.  Manage freeing
returned pointer using gdb::unique_xmalloc_ptr.

gdb/testsuite/ChangeLog:

2018-11-09  Tom de Vries  <tdevries@suse.de>

* gdb.base/msym-lang.c: New test.
* gdb.base/msym-lang.exp: New file.
* gdb.base/msym-lang-main.c: New test.
gdb/ChangeLog
gdb/symtab.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/msym-lang-main.c [new file with mode: 0644]
gdb/testsuite/gdb.base/msym-lang.c [new file with mode: 0644]
gdb/testsuite/gdb.base/msym-lang.exp [new file with mode: 0644]