Fix file-name handling regression with DWARF index
authorTom Tromey <tom@tromey.com>
Sun, 4 Jul 2021 19:48:33 +0000 (13:48 -0600)
committerTom Tromey <tom@tromey.com>
Sat, 17 Jul 2021 17:08:18 +0000 (11:08 -0600)
commit1fd5fd5817dee816f30d0573b2d0ca1affb62836
tree9da8893dbc53ac39993041dc09b78841bfc1c3f0
parent15659f0a4ea0787d2c2194a4e3712a56ac3eff84
Fix file-name handling regression with DWARF index

When run with the gdb-index or debug-names target boards, dup-psym.exp
fails.  This came up for me because my new DWARF scanner reuses this
part of the existing index code, and so it registers as a regression.
This is PR symtab/25834.

Looking into this, I found that the DWARF index code here is fairly
different from the psymtab code.  I don't think there's a deep reason
for this, and in fact, it seemed to me that the index code could
simply mimic what the psymtab code already does.

That is what this patch implements.  The DW_AT_name and DW_AT_comp_dir
are now stored in the quick file names table.  This may require
allocating a quick file names table even when DW_AT_stmt_list does not
exist.  Then, the functions that work with this data are changed to
use find_source_or_rewrite, just as the psymbol code does.  Finally,
line_header::file_full_name is removed, as it is no longer needed.

Currently, the index maintains a hash table of "quick file names".
The hash table uses a deletion function to free the "real name"
components when necessary.  There's also a second such function to
implement the forget_cached_source_info method.

This bug fix patch will create a quick file name object even when
there is no DW_AT_stmt_list, meaning that the object won't be entered
in the hash table.  So, this patch changes the memory management
approach so that the entries are cleared when the per-BFD object is
destroyed.  (A dwarf2_per_cu_data destructor is not introduced,
because we have been avoiding adding a vtable to that class.)

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=25834
gdb/dwarf2/line-header.c
gdb/dwarf2/line-header.h
gdb/dwarf2/read.c
gdb/dwarf2/read.h