[gdb/symtab] Fix check-psymtab failure for inline function
authorTom de Vries <tdevries@suse.de>
Tue, 7 Apr 2020 08:57:20 +0000 (10:57 +0200)
committerTom de Vries <tdevries@suse.de>
Tue, 7 Apr 2020 08:57:20 +0000 (10:57 +0200)
commit5707e24baa2f557d54e09641d69843111834cb9b
treef2e70f756659a3f4bb1f70af80a991fc72148afb
parentbb651e8b7fc7904b06031a665138e9e6ae79adf3
[gdb/symtab] Fix check-psymtab failure for inline function

Consider test-case inline.c, containing an inline function foo:
...
static inline int foo (void) { return 0; }
int main (void) { return foo (); }
...

And the test-case compiled with -O2 and debug info:
...
$ gcc -g inline.c -O2
...

This results in a DWARF entry for foo without pc info:
...
<1><114>: Abbrev Number: 4 (DW_TAG_subprogram)
   <115>   DW_AT_name        : foo
   <119>   DW_AT_decl_file   : 1
   <11a>   DW_AT_decl_line   : 2
   <11b>   DW_AT_prototyped  : 1
   <11b>   DW_AT_type        : <0x10d>
   <11f>   DW_AT_inline      : 3       (declared as inline and inlined)
...

When loading the executable in gdb, we create a partial symbol for foo, but
after expansion into a full symbol table no actual symbol is created,
resulting in a maint check-psymtab failure:
...
(gdb) maint check-psymtab
Static symbol `foo' only found in inline.c psymtab
...

Fix this by skipping this type of partial symbol during the check.

Note that we're not fixing this by not creating the partial symbol, because
this breaks setting a breakpoint on an inlined inline function in a CU for
which the partial symtab has not been expanded (test-case
gdb.dwarf2/break-inline-psymtab.exp).

Tested on x86_64-linux.

gdb/ChangeLog:

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

* psymtab.c (maintenance_check_psymtabs): Skip static LOC_BLOCK
symbols without address.

gdb/testsuite/ChangeLog:

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

* gdb.base/check-psymtab.c: New test.
* gdb.base/check-psymtab.exp: New file.
gdb/ChangeLog
gdb/psymtab.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/check-psymtab.c [new file with mode: 0644]
gdb/testsuite/gdb.base/check-psymtab.exp [new file with mode: 0644]