binutils-gdb.git
3 years agoRemove objfile::psymtabs
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Remove objfile::psymtabs

The method objfile::psymtabs is no longer used and can be removed.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* objfiles.h (struct objfile) <psymtabs>: Remove method.

3 years agoChange count_psyms to be a method on psymbol_functions
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Change count_psyms to be a method on psymbol_functions

This removes a use of objfile->psymtabs by changing count_psyms to be
a method on psymbol_functions.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* psymtab.c (psymbol_functions::count_psyms): Rename.
(psymbol_functions::print_stats): Update.
* psympriv.h (struct psymbol_functions) <count_psyms>: Declare
method.

3 years agoRemove last objfile partial_symtab references from psymtab.c
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Remove last objfile partial_symtab references from psymtab.c

This removes the last references to the partial_symtab via the objfile
from psymtab.c.  require_partial_symbols is now a method on
psymbol_functions, and maintenance_print_psymbols is changed to use
dynamic_cast to verify that it is examining partial symbols.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* psymtab.c (psymbol_functions::require_partial_symbols): Rename.
(psymbol_functions::find_pc_sect_psymtab): Rename.
(psymbol_functions::find_pc_sect_compunit_symtab)
(maintenance_print_psymbols, maintenance_check_psymtabs): Update.
* psympriv.h (struct psymbol_functions) <require_partial_symbols>:
Declare new method.
<get_partial_symtabs, find_pc_sect_psymtab>: Likewise.

3 years agoAdd partial_symtabs parameter to psymtab construction functions
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Add partial_symtabs parameter to psymtab construction functions

This adds a partial_symtabs parameter to the psymtab constructors and
to add_psymbol.  This helps with the overall project of removing the
partial symtabs from the objfile.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* xcoffread.c (xcoff_start_psymtab): Add partial_symtabs parameter.
(xcoff_end_psymtab, scan_xcoff_symtab): Update.
* psymtab.c (partial_symtab::partial_symtab): Add partial_symtabs
parameter.
(add_psymbol_to_bcache): Remove.
(partial_symtab::add_psymbol): Add partial_symtabs parameter.
(partial_symtab::add_psymbol, partial_symtab::partial_symtab):
Likewise.
* psympriv.h (partial_symtab): Add partial_symtabs parameter.
<add_psymbol>: Likewise.
(standard_psymtab, legacy_psymtab): Likewise.
* mdebugread.c (parse_partial_symbols): Update.
(handle_psymbol_enumerators): Add partial_symtabs parameter.
(handle_psymbol_enumerators): Update.
(new_psymtab): Add partial_symtabs parameter.
* dwarf2/read.h (dwarf2_psymtab): Add partial_symtabs parameter.
* dwarf2/read.c (dwarf2_include_psymtab): Add partial_symtabs
parameter.
(dwarf2_create_include_psymtab): Add partial_symtabs parameter.
(create_partial_symtab, add_partial_symbol, dwarf_decode_lines):
Update.
* dbxread.c (read_dbx_symtab): Update.
(start_psymtab): Add partial_symtabs parameter.
(dbx_end_psymtab): Update.
* ctfread.c (struct ctf_context) <partial_symtabs>: New member.
(ctf_psymtab): Add partial_symtabs parameter.
(create_partial_symtab, ctf_psymtab_type_cb, ctf_psymtab_var_cb):
Update.
(scan_partial_symbols): Add partial_symtabs parameter.
(scan_partial_symbols, elfctf_build_psymtabs)
(ctf_psymtab_add_enums): Update.

3 years agoIntroduce objfile::require_partial_symbols
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Introduce objfile::require_partial_symbols

This adds a new method, objfile::require_partial_symbols.  This reuses
most of the code from the old function in psymtab.c.  That function is
now made static, and simplified.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* symfile.c (read_symbols): Use objfile method.
* symfile-debug.c (objfile::require_partial_symbols): New method.
* psymtab.h (require_partial_symbols): Don't declare.
* psymtab.c (require_partial_symbols): Use objfile method.  Now
static.
(psymbol_functions::map_symtabs_matching_filename, OBJFILE)
(psymbol_functions::lookup_symbol)
(psymbol_functions::lookup_global_symbol_language)
(psymbol_functions::find_last_source_symtab)
(psymbol_functions::forget_cached_source_info)
(psymbol_functions::print_stats)
(psymbol_functions::expand_symtabs_for_function)
(psymbol_functions::expand_all_symtabs)
(psymbol_functions::expand_symtabs_with_fullname)
(psymbol_functions::map_symbol_filenames)
(psymbol_functions::map_matching_symbols)
(psymbol_functions::expand_symtabs_matching)
(psymbol_functions::find_compunit_symtab_by_address)
(maintenance_print_psymbols, maintenance_info_psymtabs)
(maintenance_check_psymtabs): Update.
* objfiles.h (struct objfile) <require_partial_symbols>: Declare
new method.

3 years agoRemove sym_fns::sym_read_psymbols
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Remove sym_fns::sym_read_psymbols

Partial symbols are read via the sym_fns::sym_read_psymbols function
pointer.  In order to separate the partial symbols from the objfile,
this must instead be done via a virtual method on
quick_symbol_functions.  This patch implements this change.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* xcoffread.c (xcoff_sym_fns): Update.
* symfile.h (struct sym_fns) <sym_read_psymbols>: Remove.
* symfile-debug.c (objfile::has_partial_symbols): Use
can_lazily_read_symbols.
(debug_sym_read_psymbols): Remove.
(debug_sym_fns, install_symfile_debug_logging): Update.
* quick-symbol.h (struct quick_symbol_functions)
<can_lazily_read_symbols, read_partial_symbols>: New methods.
* psymtab.c (require_partial_symbols): Use new 'qf' methods.
* mipsread.c (ecoff_sym_fns): Update.
* machoread.c (macho_sym_fns): Update.
* elfread.c (struct lazy_dwarf_reader): New.
(elf_symfile_read): Update.
(read_psyms): Now a method of lazy_dwarf_reader.
(elf_sym_fns): Update.
(elf_sym_fns_lazy_psyms): Remove.
* dbxread.c (aout_sym_fns): Update.
* coffread.c (coff_sym_fns): Update.

3 years agoRearrange psymtab_storage construction
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Rearrange psymtab_storage construction

This changes objfile so that it doesn't construct a psymtab_storage
object until the psymtab functions are installed.  It also applies a
similar treatment to reread_symbols.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* symfile.c (syms_from_objfile_1): Call reset_psymtabs.
(reread_symbols): Move reset_psymtabs call later.
* objfiles.c (objfile::objfile): Don't initialize
partial_symtabs.

3 years agoAttach partial symtab storage to psymbol_functions
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Attach partial symtab storage to psymbol_functions

Currently, the storage for partial symtabs is attached to the objfile.
Ultimately, though, this direct assocation will be removed, and the
storage will be owned by the psymbol_functions object.

This patch is a step toward this goal.  The storage is already managed
as a shared_ptr, to enable cross-objfile sharing, so this adds a
reference from the psymbol_functions, and changes some code in
psymtab.c to use this reference instead.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* dwarf2/read.c (dwarf2_build_psymtabs): Call
set_partial_symtabs.
* symfile.c (syms_from_objfile_1, reread_symbols): Update.
* psymtab.h (make_psymbol_functions): Add partial_symtabs
parameter.
* psymtab.c (find_pc_sect_psymtab): Add partial_symtabs
parameter.
(psymbol_functions::find_pc_sect_compunit_symtab)
(psymbol_functions::print_stats, psymbol_functions::dump)
(psymbol_functions::has_symbols): Update.
(make_psymbol_functions, dump_psymtab_addrmap): Add
partial_symtabs parameter.
(maintenance_print_psymbols): Update.
(psymbol_functions::expand_symtabs_matching): Update.
* psympriv.h (struct psymbol_functions): Add constructor.
<m_partial_symtabs>: New member.
<set_partial_symtabs>: New method.

3 years agoReference psymtabs via per_bfd in DWARF reader
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Reference psymtabs via per_bfd in DWARF reader

This changes the DWARF reader to reference the psymtabs via the
per_bfd object, rather than via the objfile.  This helps isolate the
partial symtabs from the objfile.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* dwarf2/read.c (dwarf2_create_include_psymtab): Add per_bfd
parameter.
(process_psymtab_comp_unit_reader)
(build_type_psymtab_dependencies, dwarf2_build_psymtabs_hard)
(add_partial_subprogram, dwarf2_ranges_read, dwarf_decode_lines):
Reference psymtabs via per_bfd.

3 years agoChange how DWARF index writer finds address map
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Change how DWARF index writer finds address map

This changes the DWARF index writer to find the psymtab address map in
the per_bfd object, rather than go via the objfile.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* dwarf2/index-write.c (struct addrmap_index_data) <objfile>:
Remove.
(add_address_entry): Remove objfile parameter.
(add_address_entry_worker): Update.
(write_address_map): Replace objfile parameter with per_bfd.
(write_gdbindex, write_psymtabs_to_index): Update.

3 years agoMove psymtab statistics printing to psymtab.c
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Move psymtab statistics printing to psymtab.c

This moves all the psymtab statistics printing code form symmisc.c to
psymtab.c.  This changes the formatting of the output a little, but
considering that it is a maint command (and, I assume, a rarely used
one), this seems fine to me.

This change helps further dissociate the psymtab from the objfile.  In
the end there will be no direct connect -- only via the
quick_symbol_functions interface.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* dwarf2/read.c (dwarf2_base_index_functions::print_stats): Add
print_bcache parameter.
* symfile-debug.c (objfile::print_stats): Add print_bcache
parameter.
* quick-symbol.h (struct quick_symbol_functions)
<print_stats>: Add print_bcache parameter.
* symmisc.c (print_symbol_bcache_statistics, count_psyms): Move
code to psymtab.c.
(print_objfile_statistics): Move psymtab code to psymtab.c.
* psymtab.c (count_psyms): Move from symmisc.c.
(psymbol_functions::print_stats): Print partial symbol and bcache
statistics.  Add print_bcache parameter.
* objfiles.h (print_symbol_bcache_statistics): Don't declare.
(struct objfile) <print_stats>: Add print_bcache parameter.
* maint.c (maintenance_print_statistics): Update.

gdb/testsuite/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* gdb.base/maint.exp: Update "maint print statistics" output.

3 years agoChange how DWARF indices use addrmap
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Change how DWARF indices use addrmap

Currently the DWARF index readers reuse the objfile's partial symbol
table in order to store an addrmap.  We're going to be remove the
partial symbol object, so this patch changes the DWARF reader to store
this addrmap in the per_bfd object.  This object is chosen, rather
than the quick_symbol_functions subclass, because the addrmap can be
shared across objfiles.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* dwarf2/read.h (struct dwarf2_per_bfd) <psymtabs_addrmap>: New
member.
* dwarf2/read.c (create_addrmap_from_index)
(create_addrmap_from_aranges): Set per_bfd addrmap.
(dwarf2_read_gdb_index): Don't set partial_symtabs.
(dwarf2_base_index_functions::find_pc_sect_compunit_symtab): Use
per_bfd addrmap.
(dwarf2_read_debug_names): Don't set partial_symtabs.
(dwarf2_initialize_objfile): Likewise.

3 years agoSet per_bfd->partial_symtabs earlier
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Set per_bfd->partial_symtabs earlier

dwarf2_build_psymtabs sets per_bfd->partial_symtabs at its end, in
order to facilitate sharing.

However, in order to diassociate partial symtabs from the objfile, we
want to change the DWARF reader to reference partial symtabs via the
per_bfd.  So, we want to set this reference before reading psymtabs.
This is safe to do because the assignment is done unconditionally.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* dwarf2/read.c (dwarf2_build_psymtabs): Set partial_symtabs
earlier.

3 years agoDo not pass objfile to psymtab_discarder
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Do not pass objfile to psymtab_discarder

This changes the psymtab_discarder to not assume that partial symtabs
are attached to the objfile.  Instead, a psymtab_storage object is
passed directly to it.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* psympriv.h (psymtab_discarder): Take psymtab_storage parameter.
(~psymtab_discarder, keep): Update.
<m_objfile>: Remove.
<m_partial_symtabs>: New member.
* dwarf2/read.c (dwarf2_build_psymtabs): Update.

3 years agoChange how some psymbol readers access the psymtab storage
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Change how some psymbol readers access the psymtab storage

Currently, all psymbol readers access the psymtab storage via the
objfile.  This is done directly at any spot requiring the storage.

In order to move psymbols out of the objfile, the psymtab_storage must
be passed in explicitly.  This patch consolidates the access of the
storage in a single place in these readers, updating various functions
to pass the storage object around.  "Hidden" uses, like
"objfile->psymtabs ()", are also updated.

The DWARF reader is not yet touched.  That requires more complicated
changes.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* xcoffread.c (xcoff_end_psymtab): Add partial_symtabs parameter.
(xcoff_end_psymtab): Update.
(scan_xcoff_symtab): Add partial_symtabs parameter.
(xcoff_initial_scan): Update.
* stabsread.h (dbx_end_psymtab): Add partial_symtabs parameter.
* mdebugread.c (mdebug_build_psymtabs): Update.
(parse_partial_symbols): Add partial_symtabs parameter.
* dbxread.c (dbx_symfile_read): Update.
(read_dbx_symtab): Add partial_symtabs parameter.
(read_dbx_symtab): Update.
(dbx_end_psymtab): Add partial_symtabs parameter.

3 years agoMove psymbol_map out of objfile
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Move psymbol_map out of objfile

objfile::psymbol_map is used to implement a Rust feature.  It is
currently specific to partial symbols -- it isn't used by the DWARF
indices.

This patch moves it out of objfile and into psymbol_functions, adding
a new method to quick_symbol_functions to handle the clearing case.
This is needed because the map holds unrelocated addresses.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* quick-symbol.h (struct quick_symbol_functions)
<relocated>: New method.
* psymtab.h (struct psymbol_functions) <relocated>: New
method.
<fill_psymbol_map>: Declare method.
<m_psymbol_map>: New member.
* psymtab.c (psymbol_functions::fill_psymbol_map): Rename.
(psymbol_functions::find_compunit_symtab_by_address): Update.
* objfiles.h (reset_psymtabs): Don't clear psymbol_map.
(struct objfile) <psymbol_map>: Remove.
* objfiles.c (objfile_relocate1): Update.

3 years agoConvert quick_symbol_functions to use methods
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Convert quick_symbol_functions to use methods

This changes quick_symbol_functions to be a base class with pure
virtual methods, rather than a struct holding function pointers.
Then, objfile is changed to hold a unique_ptr to an instance of this
class.

struct psymbol_functions is put into psympriv.h, and not psymtab.c,
because that is convenient later in the series.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* psympriv.h (struct psymbol_functions): New.
* symfile.c (syms_from_objfile_1, reread_symbols): Update.
* symfile-debug.c (objfile::find_compunit_symtab_by_address)
(objfile::lookup_global_symbol_language): Update.
* quick-symbol.h (struct quick_symbol_functions): Convert function
pointers to methods.  Add virtual destructor.
(quick_symbol_functions_up): New typedef.
* psymtab.h (psym_functions, dwarf2_gdb_index_functions)
(dwarf2_debug_names_functions): Don't declare.
(make_psymbol_functions): Declare.
* psymtab.c (psymbol_functions::map_symtabs_matching_filename)
(psymbol_functions::find_pc_sect_compunit_symtab)
(psymbol_functions::lookup_symbol)
(psymbol_functions::lookup_global_symbol_language)
(psymbol_functions::find_last_source_symtab)
(psymbol_functions::forget_cached_source_info)
(psymbol_functions::print_stats, psymbol_functions::dump)
(psymbol_functions::expand_symtabs_for_function)
(psymbol_functions::expand_all_symtabs)
(psymbol_functions::expand_symtabs_with_fullname)
(psymbol_functions::map_symbol_filenames)
(psymbol_functions::map_matching_symbols)
(psymbol_functions::expand_symtabs_matching)
(psymbol_functions::has_symbols)
(psymbol_functions::find_compunit_symtab_by_address): Rename.
(psym_functions): Remove.
(make_psymbol_functions): New function.
* objfiles.h (struct objfile) <qf>: Change type.
* elfread.c (elf_symfile_read): Update.
* dwarf2/read.c (struct dwarf2_base_index_functions)
(struct dwarf2_gdb_index, struct dwarf2_debug_names_index): New.
(make_dwarf_gdb_index, make_dwarf_debug_names): New functions.
(dwarf2_base_index_functions::find_last_source_symtab)
(dwarf2_base_index_functions::forget_cached_source_info)
(dwarf2_base_index_functions::map_symtabs_matching_filename)
(dwarf2_gdb_index::lookup_symbol)
(dwarf2_base_index_functions::print_stats)
(dwarf2_gdb_index::dump)
(dwarf2_gdb_index::expand_symtabs_for_function)
(dwarf2_base_index_functions::expand_all_symtabs)
(dwarf2_base_index_functions::expand_symtabs_with_fullname):
Rename.
(dwarf2_gdb_index::map_matching_symbols): New method.
(dwarf2_gdb_index::expand_symtabs_matching): New method.
(dwarf2_base_index_functions::find_pc_sect_compunit_symtab)
(dwarf2_base_index_functions::map_symbol_filenames)
(dwarf2_base_index_functions::has_symbols): Rename.
(dwarf2_gdb_index_functions): Remove.
(dwarf2_debug_names_index::lookup_symbol)
(dwarf2_debug_names_index::dump)
(dwarf2_debug_names_index::expand_symtabs_for_function)
(dwarf2_debug_names_index::map_matching_symbols)
(dwarf2_debug_names_index::expand_symtabs_matching): Rename.
(dwarf2_debug_names_functions): Remove.
* dwarf2/public.h (make_dwarf_gdb_index, make_dwarf_debug_names):
Declare.

3 years agoMove sym_fns::qf to objfile
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Move sym_fns::qf to objfile

Currently the "partial" symbol reader is attached to the objfile's
symbol functions.  However, in order to allow multiple separate
partial symbol readers, this association must be changed.  This patch
moves the "qf" member out of sym_fns as a step toward that goal.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* psymtab.c (require_partial_symbols): Check that 'sf' is not
null.
* xcoffread.c (xcoff_sym_fns): Update.
* symfile.h (struct sym_fns) <qf>: Remove.
* symfile.c (syms_from_objfile_1, reread_symbols): Update.
* symfile-debug.c (objfile::has_partial_symbols)
(objfile::find_last_source_symtab)
(objfile::forget_cached_source_info)
(objfile::map_symtabs_matching_filename, objfile::lookup_symbol)
(objfile::print_stats, objfile::dump)
(objfile::expand_symtabs_for_function)
(objfile::expand_all_symtabs)
(objfile::expand_symtabs_with_fullname)
(objfile::map_matching_symbols)
(objfile::expand_symtabs_matching)
(objfile::find_pc_sect_compunit_symtab)
(objfile::map_symbol_filenames)
(objfile::find_compunit_symtab_by_address)
(objfile::lookup_global_symbol_language, debug_sym_fns)
(install_symfile_debug_logging): Update.
* objfiles.h (struct objfile) <qf>: New member.
* mipsread.c (ecoff_sym_fns): Update.
* machoread.c (macho_sym_fns): Update.
* elfread.c (elf_sym_fns_gdb_index, elf_sym_fns_debug_names):
Don't declare.
(elf_symfile_read, elf_sym_fns, elf_sym_fns_lazy_psyms): Update.
* dbxread.c (aout_sym_fns): Update.
* coffread.c (coff_sym_fns): Update.

3 years agoMove quick_symbol_functions to a new header
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Move quick_symbol_functions to a new header

This introduces a new header, quick-symbol.h, and moves
quick_symbol_functions and related typedefs into it.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* symfile.h (symbol_compare_ftype, symbol_filename_ftype)
(expand_symtabs_file_matcher_ftype)
(expand_symtabs_symbol_matcher_ftype)
(expand_symtabs_exp_notify_ftype, struct quick_symbol_functions):
Move to quick-symbol.h.
* quick-symbol.h: New file.

3 years agoIntroduce method wrappers for quick_symbol_functions
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Introduce method wrappers for quick_symbol_functions

This introduces wrappers for each function in quick_symbol_functions.
The wrappers are methods on objfile, and are defined in
symfile-debug.c, so that they can use the symfile_debug variable.
Places that call the quick functions are all updated to call these new
wrapper methods.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* symtab.c (iterate_over_symtabs, expand_symtab_containing_pc)
(lookup_symbol_via_quick_fns, find_quick_global_symbol_language)
(basic_lookup_transparent_type_quick)
(find_pc_sect_compunit_symtab, find_symbol_at_address)
(find_line_symtab, global_symbol_searcher::expand_symtabs):
Update.
* symmisc.c (print_objfile_statistics, dump_objfile)
(maintenance_expand_symtabs): Update.
* symfile.c (symbol_file_add_with_addrs)
(expand_symtabs_matching, map_symbol_filenames): Update.
* symfile-debug.c (objfile::has_partial_symbols)
(objfile::find_last_source_symtab)
(objfile::forget_cached_source_info)
(objfile::map_symtabs_matching_filename, objfile::lookup_symbol)
(objfile::print_stats, objfile::dump)
(objfile::expand_symtabs_for_function)
(objfile::expand_all_symtabs)
(objfile::expand_symtabs_with_fullname)
(objfile::map_matching_symbols)
(objfile::expand_symtabs_matching)
(objfile::find_pc_sect_compunit_symtab)
(objfile::map_symbol_filenames)
(objfile::find_compunit_symtab_by_address)
(objfile::lookup_global_symbol_language): New methods.
(debug_sym_quick_functions): Remove.
(debug_sym_fns, install_symfile_debug_logging): Update.
* source.c (forget_cached_source_info_for_objfile)
(select_source_symtab): Update.
* objfiles.h (struct objfile): Add methods corresponding to
quick_symbol_functions.
* objfiles.c (objfile::has_partial_symbols): Move to
symfile-debug.c.
* linespec.c (iterate_over_all_matching_symtabs): Update.
* cp-support.c (add_symbol_overload_list_qualified): Update.
* ada-lang.c (add_nonlocal_symbols): Update.

3 years agoChange objfile::has_partial_symbols to return bool
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Change objfile::has_partial_symbols to return bool

This changes objfile::has_partial_symbols and
quick_symbol_functions::has_symbols to return bool.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* objfiles.h (struct objfile) <has_partial_symbols>: Return bool.
* symfile.h (struct quick_symbol_functions) <has_symbols>: Return
bool.
* symfile-debug.c (debug_qf_has_symbols): Return bool.
* psymtab.c (psym_has_symbols): Return bool.
* objfiles.c (objfile::has_partial_symbols): Return bool.
* dwarf2/read.c (dw2_has_symbols): Return bool.

3 years agoChange objfile_has_partial_symbols to a method
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Change objfile_has_partial_symbols to a method

This changes objfile_has_partial_symbols to be a method on objfile.

There are some other functions that could benefit from this sort of
change, but this was the only one that was relevant to this series.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* symfile.c (read_symbols): Update.
* objfiles.h (struct objfile) <has_partial_symbols>: New method.
(objfile_has_partial_symbols): Don't declare.
* objfiles.c (objfile::has_partial_symbols): Rename from
objfile_has_partial_symbols.
(objfile_has_symbols, have_partial_symbols): Update.
* elfread.c (elf_symfile_read): Update.
* dwarf2/read.c (dwarf2_has_info): Update.
* coffread.c (coff_symfile_read): Update.

3 years agoIntroduce dwarf2/public.h
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Introduce dwarf2/public.h

This moves some more DWARF code out of symfile.h and into a new
header, dwarf2/public.h.  This header is intended to describe the
public API of the DWARF reader.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* coffread.c: Include dwarf2/public.h.
* dwarf2/frame.c: Include dwarf2/public.h.
* dwarf2/index-write.h: Include dwarf2/public.h, not symfile.h.
* dwarf2/public.h: New file.
* dwarf2/read.c: Include dwarf2/public.h.
* elfread.c: Include dwarf2/public.h.
* machoread.c: Include dwarf2/public.h.
* symfile.h (dwarf2_has_info, enum dw_index_kind)
(dwarf2_initialize_objfile, dwarf2_build_psymtabs)
(dwarf2_build_frame_info): Move to dwarf2/public.h.
* xcoffread.c: Include dwarf2/public.h.

3 years agoMove some DWARF code out of symfile.h
Tom Tromey [Sat, 20 Mar 2021 23:23:40 +0000 (17:23 -0600)]
Move some DWARF code out of symfile.h

This moves a bit of the DWARF-specific code out of symfile.h and into
dwarf2/read.h.

gdb/ChangeLog
2021-03-20  Tom Tromey  <tom@tromey.com>

* symfile.h (enum dwarf2_section_enum)
(dwarf2_get_section_info): Move to dwarf2/read.h.
* dwarf2/read.h (enum dwarf2_section_enum)
(dwarf2_get_section_info): Move from symfile.h.

3 years agoUse stdout when printing object file names for -t option.
Cary Coutant [Sat, 20 Mar 2021 01:41:12 +0000 (18:41 -0700)]
Use stdout when printing object file names for -t option.

gold/
PR gold/27615
* errors.cc (Errors::trace): New method.
(gold_trace): New function.
* errors.h (Errors::trace): New method.
* gold.h (gold_trace): New function.
* object.cc (Input_objects::add_object): Use gold_trace to print
object file names.

3 years agoFix failing test for PR 23870.
Cary Coutant [Sat, 20 Mar 2021 00:57:40 +0000 (17:57 -0700)]
Fix failing test for PR 23870.

gold/
PR gold/pr23870
* testsuite/aarch64_pr23870_bar.c: Return a magic value.
* testsuite/aarch64_pr23870_foo.c: Check the magic value and return
success or failure.

3 years agox86-64: Add a testcase for PR ld/27590
H.J. Lu [Sat, 20 Mar 2021 00:13:33 +0000 (17:13 -0700)]
x86-64: Add a testcase for PR ld/27590

PR ld/27590
* testsuite/ld-x86-64/pr27590.rd: New file.
* testsuite/ld-x86-64/pr27590a.obj.bz2: Likewise.
* testsuite/ld-x86-64/pr27590b.obj.bz2: Likewise.
* testsuite/ld-x86-64/x86-64.exp: Run ld/27590 test.

3 years agoDWARF LTO debug sections vs. .stabstr
Alan Modra [Fri, 19 Mar 2021 23:52:37 +0000 (10:22 +1030)]
DWARF LTO debug sections vs. .stabstr

The exception for debug sections in clearing SEC_EXCLUDE when
relocatable was really for one specific debug section, so let's make
it do just that.

bfd/
PR 27590
* elf.c (_bfd_elf_make_section_from_shdr): Remove SHF_EXCLUDE
test for .gnu.debuglto*.
ld/
PR 27590
* ldlang.c (lang_gc_sections): Clear SEC_EXCLUDE when relocatable
for all sections except .stabstr.

3 years agoAutomatic date update in version.in
GDB Administrator [Sat, 20 Mar 2021 00:00:06 +0000 (00:00 +0000)]
Automatic date update in version.in

3 years agoFix call to system fallocate to handle errno correctly.
Holger Berger [Fri, 19 Mar 2021 22:38:54 +0000 (15:38 -0700)]
Fix call to system fallocate to handle errno correctly.

2021-03-19  Holger Berger  <holger.berger@googlemail.com>

gold/
PR gold/26541
* output.cc (gold_fallocate): Use errno when calling system fallocate.

3 years agoFix typo in previous patch: should use struct mallinfo2.
Cary Coutant [Fri, 19 Mar 2021 22:29:49 +0000 (15:29 -0700)]
Fix typo in previous patch: should use struct mallinfo2.

PR gold/26585
* main.cc (main): Fix typo in previous patch.

3 years agoRegenerate config.in, missing from previous commit.
Cary Coutant [Fri, 19 Mar 2021 22:23:49 +0000 (15:23 -0700)]
Regenerate config.in, missing from previous commit.

PR gold/26585
* config.in: Regenerate from previous commit.

3 years agoFix gold to use mallinfo2 if available instead of deprecated mallinfo.
Duncan Simpson [Fri, 19 Mar 2021 21:22:08 +0000 (14:22 -0700)]
Fix gold to use mallinfo2 if available instead of deprecated mallinfo.

gold/
PR gold/26585
* configure.ac: Add check for mallinfo2.
* configure: Regenerate.
* main.cc (main): Use mallinfo2 if available.

3 years agoAdd DWARF 5 support in gold.
Cary Coutant [Thu, 18 Mar 2021 04:31:15 +0000 (21:31 -0700)]
Add DWARF 5 support in gold.

elfcpp/
PR gold/27246
* dwarf.h (enum DW_LNCT): Add line number table content type codes.
(enum DW_LINE_OPS): Reformat.
(enum DW_LINE_EXTENDED_OPS): Reformat.
(enum DW_CHILDREN): Reformat.
(enum DW_RLE): Add range list entry types.
(enum DW_SECT): Update values for DWARF 5.

gold/
PR gold/27246
* dwarf_reader.cc (Dwarf_abbrev_table::do_get_abbrev): Handle
DW_FORM_implicit_const.
(Dwarf_ranges_table::read_ranges_table): Add version parameter;
Adjust all callers.  Look for .debug_rnglists section if DWARF 5.
(Dwarf_ranges_table::read_range_list_v5): New method.
(Dwarf_die::read_attributes): Handle new DWARF 5 DW_FORM codes.
(Dwarf_die::skip_attributes): Likewise.
(Dwarf_info_reader::do_parse): Support DWARF 5 unit header format.
(Dwarf_info_reader::read_3bytes_from_pointer): New method.
(Sized_dwarf_line_info::Sized_dwarf_line_info): Initialize
str_buffer_, str_buffer_start, reloc_map_, line_number_map_.
Look for .debug_line_str section.
(Sized_dwarf_line_info::read_header_prolog): Support DWARF 5 prolog.
(Sized_dwarf_line_info::read_header_tables): Rename to...
(Sized_dwarf_line_info::read_header_tables_v2): ... this.
(Sized_dwarf_line_info::read_header_tables_v5): New method.
(Sized_dwarf_line_info::process_one_opcode): Insert missing "this->".
Change advance_line to signed int64_t.
(Sized_dwarf_line_info::read_lines): Add endptr parameter; adjust
callers.  Insert missing "this->".
(Sized_dwarf_line_info::read_line_mappings): Support DWARF 5.
(Sized_dwarf_line_info::do_addr2line): Add debug code.
* dwarf_reader.h (Dwarf_abbrev_table::Attribute): Add implicit_const
field. Adjust constructor.
(Dwarf_abbrev_table::add_sttribute): Add implicit_const parameter.
(Dwarf_ranges_table::read_ranges_table): Add version parameter.
(Dwarf_ranges_table::read_range_list_v5): New method.
(Dwarf_die): Remove unused attr_off field.
(Dwarf_info_reader::Dwarf_info_reader): Initialize unit_type_ field.
(Dwarf_info_reader::is_type_unit): New method.
(Dwarf_info_reader::read_3bytes_from_pointer): New method.
(Dwarf_info_reader::read_range_list): Call read_range_list_v5 for
DWARF 5 range lists.
(Dwarf_info_reader::is_type_unit_): Remove.
(Dwarf_info_reader::unit_type_): New field.
(Sized_dwarf_line_info::~Sized_dwarf_line_info): Delete
str_buffer_start_.
(Sized_dwarf_line_info::read_header_tables): Rename to...
(Sized_dwarf_line_info::read_header_tables_v2): ... this.
(Sized_dwarf_line_info::read_header_tables_v5): New method.
(Sized_dwarf_line_info::read_lines): Add endptr parameter.
(Sized_dwarf_line_info::Dwarf_line_infoHeader): Add address_size field.
(Sized_dwarf_line_info::str_buffer_): New field.
(Sized_dwarf_line_info::str_buffer_end_): New field.
(Sized_dwarf_line_info::str_buffer_start_): New field.
(Sized_dwarf_line_info::end_of_header_length_): New field.
(Sized_dwarf_line_info::end_of_unit_): New field.

3 years agoFix potential hang during gdbserver testing
Kevin Buettner [Fri, 19 Mar 2021 18:07:11 +0000 (11:07 -0700)]
Fix potential hang during gdbserver testing

We're currently seeing testing of native-extended-gdbserver hang while
testing the x86_64 architecture on both Fedora 34 and Fedora Rawhide.
The test responsible for the hang is gdb.threads/fork-plus-threads.exp.

While there is clearly a problem/bug with this test on F34 and
Rawhide, it's also the case that testing should not hang.  This commit
prevents the hang by waiting with the "-nowait" flag in
close_gdbserver.

The -nowait flag is also used in the kill_wait_spawned_process proc in
gdb/testsuite/lib/gdb.exp, so there is precedent for doing this.

There are also 15 other uses of "wait -i" scattered throughout the
test suite.  While it's tempting to change these to also use the
-nowait flag, I think it might be safer to defer doing so until we
actually see a problem.

I've tested this patch on Fedora 32, 33, 34, and Rawhide.  Results are
comparable on Fedora 32 and 33.  On Fedora 34 and Rawhide, with this
commit in place, testing completes when the target_board is
native-extended-gdbserver.  On those OSes, when not using this commit,
testing usually hangs due to a problem with
gdb.threads/fork-plus-threads.exp.  I've also tested on all of the
mentioned OSes with target_board=native-gdbserver; for that testing,
I achieved comparable results over a number of runs.  (Unfortunately
results are rarely identical due to racy tests.)

gdb/testsuite/ChangeLog:

* lib/gdbserver-support.exp (gdbserver_exit): Use the
"-nowait" flag when waiting for gdbserver to exit.

3 years agoFix any_thread_of_inferior
Pedro Alves [Thu, 11 Feb 2021 20:16:40 +0000 (20:16 +0000)]
Fix any_thread_of_inferior

Running gdb-term.exp against gdbserver with "maint set target-non-stop
on", runs into this:

  [infrun] fetch_inferior_event: exit
  [infrun] fetch_inferior_event: enter
  /home/pedro/gdb/binutils-gdb/src/gdb/thread.c:72: internal-error: thread_info* inferior_thread(): Assertion `current_thread_ != nullptr' failed.
  A problem internal to GDB has been detected,
  further debugging may prove unreliable.

  This is a bug, please report it.  For instructions, see:
  <https://www.gnu.org/software/gdb/bugs/>.

  FAIL: gdb.base/gdb-sigterm.exp: expect eof #2 (GDB internal error)
  Resyncing due to internal error.
  ERROR: : spawn id exp9 not open
      while executing
  "expect {
  -i exp9 -timeout 10
      -re "Quit this debugging session\\? \\(y or n\\) $" {
  send_gdb "n\n" answer
  incr count
      }
      -re "Create ..."
      ("uplevel" body line 1)
      invoked from within
  "uplevel $body" NONE : spawn id exp9 not open
  ERROR: Could not resync from internal error (timeout)
  gdb.base/gdb-sigterm.exp: expect eof #2: stepped 0 times
  UNRESOLVED: gdb.base/gdb-sigterm.exp: 50 SIGTERM passes

The assertion fails here:

  ...
  #5  0x000055af4b4a7164 in internal_error (file=0x55af4b5e5de8 "/home/pedro/gdb/binutils-gdb/src/gdb/thread.c", line=72, fmt=0x55af4b5e5ce9 "%s: Assertion `%s' failed.") at /home/pedro/gdb/binutils-gdb/src/gdbsupport/errors.cc:55
  #6  0x000055af4b25fc43 in inferior_thread () at /home/pedro/gdb/binutils-gdb/src/gdb/thread.c:72
  #7  0x000055af4b26177e in any_thread_of_inferior (inf=0x55af4cf874f0) at /home/pedro/gdb/binutils-gdb/src/gdb/thread.c:638
  #8  0x000055af4b26eec8 in kill_or_detach (inf=0x55af4cf874f0, from_tty=0) at /home/pedro/gdb/binutils-gdb/src/gdb/top.c:1665
  #9  0x000055af4b26f37f in quit_force (exit_arg=0x0, from_tty=0) at /home/pedro/gdb/binutils-gdb/src/gdb/top.c:1767
  #10 0x000055af4b2f72a7 in quit () at /home/pedro/gdb/binutils-gdb/src/gdb/utils.c:633
  #11 0x000055af4b2f730b in maybe_quit () at /home/pedro/gdb/binutils-gdb/src/gdb/utils.c:657
  #12 0x000055af4b1adb74 in ser_base_wait_for (scb=0x55af4d02e460, timeout=0) at /home/pedro/gdb/binutils-gdb/src/gdb/ser-base.c:236
  #13 0x000055af4b1adf0f in do_ser_base_readchar (scb=0x55af4d02e460, timeout=0) at /home/pedro/gdb/binutils-gdb/src/gdb/ser-base.c:365
  #14 0x000055af4b1ae06d in generic_readchar (scb=0x55af4d02e460, timeout=0, do_readchar=0x55af4b1adeb1 <do_ser_base_readchar(serial*, int)>) at /home/pedro/gdb/binutils-gdb/src/gdb/ser-base.c:444
  ...

The bug is that any_thread_of_inferior incorrectly assumes that
there's always a selected thread.  This fixes it.

gdb/ChangeLog:

* thread.c (any_thread_of_inferior): Check if there's a selected
thread before calling inferior_thread().

Change-Id: Ica4b9ec746121a7a7c22bef09baea72103b3853d

3 years agoelf: Rename EM_INTEL205 to EM_INTELGT
H.J. Lu [Fri, 19 Mar 2021 12:58:31 +0000 (05:58 -0700)]
elf: Rename EM_INTEL205 to EM_INTELGT

Rename EM_INTEL205 to EM_INTELGT for Intel Graphics Technology.

binutils/

* readelf.c (get_machine_name): Add EM_INTELGT.

include/

* elf/common.h (EM_INTEL205): Renamed to ...
(EM_INTELGT): This.

3 years agogas/app.c don't throw away spaces before slash
Alan Modra [Fri, 19 Mar 2021 03:54:05 +0000 (14:24 +1030)]
gas/app.c don't throw away spaces before slash

I don't know really why we should lose a space before a '/'.  Possibly
it would make sense if '/' started a comment, but otherwise no.

* app.c (do_scrub_chars): Don't lose spaces before a slash.

3 years agopr27590 testcase fixes
Alan Modra [Fri, 19 Mar 2021 07:09:39 +0000 (17:39 +1030)]
pr27590 testcase fixes

PR 27590
* testsuite/ld-elf/pr27590a.d: Match relocs using label, and
R_MIPS_NONE.
* testsuite/ld-elf/pr27590b.d: Likewise.

3 years agoEnable macro test for clang compiler
Sourabh Singh Tomar [Fri, 19 Mar 2021 05:07:58 +0000 (10:37 +0530)]
Enable macro test for clang compiler

`clang` uses `-fdebug-macro` switch to enable debug-info
for macros.

gdb/testsuite/ChangeLog:

2021-03-19  Sourabh Singh Tomar  <SourabhSingh.Tomar@amd.com>

* gdb.base/info-macros.exp: Append -fdebug-macro to
  additional_flags for clang.
* gdb.base/macscp.exp: Likewise.
* gdb.base/style.exp: Likewise.
* gdb.linespec/macro-relative.exp: Likewise.

3 years agoelf: Handle .gnu.debuglto_.debug_* sections
H.J. Lu [Fri, 19 Mar 2021 03:46:28 +0000 (20:46 -0700)]
elf: Handle .gnu.debuglto_.debug_* sections

commit 994b25132814f4c2be93ce53a616a74139c4cf3c
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Sun Jan 17 20:01:16 2021 -0800

    ld/elf: Ignore section symbols when matching linkonce with comdat

ignored section symbols when comparing symbols in 2 sections.  Since all
references to debugging sections are done with section symbols, symbols
in debugging sections are ignored and we fail to match symbols in comdat
debugging sections.  Also .gnu.debuglto_.debug_* sections aren't treated
as debugging sections.

1. Treate .gnu.debuglto_.debug_ section as debugging section unless it
is marked with SHF_EXCLUDE.
2. Revert commit 994b2513281 in elf_create_symbuf.
3. Ignore section symbols only when matching non-debugging sections or
linkonce section with comdat section.

bfd/

PR ld/27590
* elf.c (_bfd_elf_make_section_from_shdr): Treate
.gnu.debuglto_.debug_ section as debugging section unless it is
marked with SHF_EXCLUDE.
* elflink.c (elf_create_symbuf): Revert commit 994b2513281.
(bfd_elf_match_symbols_in_sections): Ignore section symbols when
matching non-debugging sections or linkonce section with comdat
section.

ld/

PR ld/27590
* testsuite/ld-elf/pr27590.s: New file.
* testsuite/ld-elf/pr27590a.d: Likewise.
* testsuite/ld-elf/pr27590b.d: Likewise.
* testsuite/ld-i386/i386.exp: Also run ld/27193 test with
--reduce-memory-overheads.

3 years agoDWARF: Check version >= 3 for DW_FORM_ref_addr
H.J. Lu [Fri, 19 Mar 2021 01:34:38 +0000 (18:34 -0700)]
DWARF: Check version >= 3 for DW_FORM_ref_addr

Check version >= 3, instead of version == 3 || version == 4, for
DW_FORM_ref_addr.

bfd/

PR ld/27587
* dwarf2.c (read_attribute_value): Check version >= 3 for
DW_FORM_ref_addr.

ld/

PR ld/27587
* testsuite/ld-x86-64/pr27587.err: New file.
* testsuite/ld-x86-64/pr27587a.obj.bz2: Likewise.
* testsuite/ld-x86-64/pr27587b.obj.bz2: Likewise.
* testsuite/ld-x86-64/x86-64.exp: Run PR ld/27587 test.

3 years agoAutomatic date update in version.in
GDB Administrator [Fri, 19 Mar 2021 00:00:07 +0000 (00:00 +0000)]
Automatic date update in version.in

3 years ago2021-03-18 Christian Groessler <chris@groessler.org>
Christian Groessler [Thu, 18 Mar 2021 20:33:51 +0000 (21:33 +0100)]
2021-03-18  Christian Groessler  <chris@groessler.org>

       * config/tc-z8k.c (apply_fix): Handle 7-bit relocations correctly.
       Problem found by Tadashi G. Takaoka <tadashi.g.takaoka@gmail.com>.

3 years agoReimplement dwarf_unit_type_name
Tom Tromey [Thu, 18 Mar 2021 15:01:10 +0000 (09:01 -0600)]
Reimplement dwarf_unit_type_name

I noticed that dwarf_unit_type_name is nearly identical to
get_DW_UT_name from libiberty; but rather than simply replacing it, it
seemed better to have it work like the other DWARF constant
stringification functions -- return a string showing unrecognized
numeric forms rather than nullptr.  (The previous code did include
numeric values for the recognized constants, but this seems to be not
that useful to me.)

2021-03-18  Tom Tromey  <tromey@adacore.com>

* dwarf2/stringify.c (dwarf_unit_type_name): New function.  Use
get_DW_UT_name.
* dwarf2/stringify.h (dwarf_unit_type_name): Declare.
* dwarf2/comp-unit.c (dwarf_unit_type_name): Remove.

3 years agogdb/doc: fix the example for get_set_string in Python API docs
Andrew Burgess [Thu, 18 Mar 2021 16:44:14 +0000 (16:44 +0000)]
gdb/doc: fix the example for get_set_string in Python API docs

The small example for gdb.Parameter.get_set_string does not return a
string.  The documentation is very clear that this method must return
a string, and indeed, inspecting the code in gdb/python/py-param.c
shows that a string return value is required (if an exception is not
thrown).

While inspecting the code in gdb/python/py-param.c I noticed that the
comment for the C++ code that invokes the Python get_set_string method
is wrong, so I updated that too.

gdb/ChangeLog:

* python/py-param.c (get_set_value): Update header comment.

gdb/doc/ChangeLog:

* python.texinfo (Parameters In Python): Return empty string in
small example code.

3 years agoGCC_CET_HOST_FLAGS: Check if host supports multi-byte NOPs
H.J. Lu [Thu, 18 Mar 2021 14:54:15 +0000 (07:54 -0700)]
GCC_CET_HOST_FLAGS: Check if host supports multi-byte NOPs

Check if host supports multi-byte NOPs before enabling CET on host.

config/

PR binutils/27397
* cet.m4 (GCC_CET_HOST_FLAGS): Check if host supports multi-byte
NOPs.

libiberty/

PR binutils/27397
* configure: Regenerated.

3 years agoFix section dumping so that warnings are not issued for missed sections in separate...
Nick Clifton [Thu, 18 Mar 2021 14:01:25 +0000 (14:01 +0000)]
Fix section dumping so that warnings are not issued for missed sections in separate debuginfo files.

PR 27478
* readelf.c (dump_section_as_strings): Mention separate filename.
(dump_section_as_bytes): Likewise.
(dump_section_as_ctf): Likewise.
(initialise_dumkps_byname): Only issue a warning for missing
sections if processing the main file.
(process_section_contents): Only issue a warning for unsumped
section numbers in the main file.
(initialise_dump_sects): New function.  Contains code extracted
from ...
(process_object): ... here.  Also call initialise_dump_sects for
separate files.

3 years agolibctf: support encodings for enums
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
libctf: support encodings for enums

The previous commit started to error-check the lookup of
ctf_type_encoding for the underlying type that is internally done when
carrying out a ctf_type_encoding on a slice.

Unfortunately, enums have no encoding, so this has historically been
returning an error (which is ignored) and then populating the cte_format
with uninitialized data.  Now the error is not ignored, this is
returning an error, which breaks linking of CTF containing bitfields of
enumerated type.

CTF format v3 does not record the actual underlying type of a enum, but
we can mock up something that is not *too* wrong, and that is at any
rate better than uninitialized data.

ld/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* testsuite/ld-ctf/slice.c: Check slices of enums too.
* testsuite/ld-ctf/slice.d: Results adjusted.

libctf/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* ctf-types.c (ctf_type_encoding): Support, after a fashion, for enums.
* ctf-dump.c (ctf_dump_format_type): Do not report enums' degenerate
encoding.

3 years agolibctf: a couple of small error-handling fixes
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
libctf: a couple of small error-handling fixes

Out-of-memory errors initializing the string atoms table were
disregarded (though they would have caused a segfault very shortly
afterwards).  Errors hashing types during deduplication were only
reported if they happened on the output dict, which is almost never the
case (most errors are going to be on the dict we're working over, which
is going to be one of the inputs).  (The error was detected in both
cases, but the errno was extracted from the wrong dict.)

libctf/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* ctf-dedup.c (ctf_dedup_rhash_type): Report errors on the input
dict properly.
* ctf-open.c (ctf_bufopen_internal): Report errors initializing
the atoms table.

3 years agolibctf: types: unify code dealing with small-vs-large struct members
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
libctf: types: unify code dealing with small-vs-large struct members

This completes the job of unifying what was once three separate code
paths full of duplication for every function dealing with querying the
properties of struct and union members.  The dynamic code path was
already removed: this change removes the distinction between small and
large members, by adding a helper that copies out members from the vlen,
expanding small members into large ones as it does so.

This makes it possible to have *more* representations of things like
structure members without needing to change the querying functions at
all.  It also lets us check for buffer overruns more effectively,
verifying that we don't accidentally overrun the end of the vlen in
either the dynamic or static type case.

libctf/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* ctf-impl.h (ctf_next_t) <ctn_tp>: New.
<u.ctn_mp>: Remove.
<u.ctn_lmp>: Remove.
<u.ctn_vlen>: New.
* ctf-types.c (ctf_struct_member): New.
(ctf_member_next): Use it, dropping separate large/small code paths.
(ctf_type_align): Likewise.
(ctf_member_info): Likewise.
(ctf_type_rvisit): Likewise.

3 years agolibctf: eliminate dtd_u, part 5: structs / unions
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
libctf: eliminate dtd_u, part 5: structs / unions

Eliminate the dynamic member storage for structs and unions as we have
for other dynamic types.  This is much like the previous enum
elimination, except that structs and unions are the only types for which
a full-sized ctf_type_t might be needed.  Up to now, this decision has
been made in the individual ctf_add_{struct,union}_sized functions and
duplicated in ctf_add_member_offset.  The vlen machinery lets us
simplify this, always allocating a ctf_lmember_t and setting the
dtd_data's ctt_size to CTF_LSIZE_SENT: we figure out whether this is
really justified and (almost always) repack things down into a
ctf_stype_t at ctf_serialize time.

This allows us to eliminate the dynamic member paths from the iterators and
query functions in ctf-types.c in favour of always using the large-structure
vlen stuff for dynamic types (the diff is ugly but that's just because of the
volume of reindentation this calls for).  This also means the large-structure
vlen stuff gets more heavily tested, which is nice because it was an almost
totally unused code path before now (it only kicked in for structures of size
>4GiB, and how often do you see those?)

The only extra complexity here is ctf_add_type.  Back in the days of the
nondeduplicating linker this was called a ridiculous number of times for
countless identical copies of structures: eschewing the repeated lookups of the
dtd in ctf_add_member_offset and adding the members directly saved an amazing
amount of time.  Now the nondeduplicating linker is gone, this is extreme
overoptimization: we can rip out the direct addition and use ctf_member_next and
ctf_add_member_offset, just like ctf_dedup_emit does.

We augment a ctf_add_type test to try adding a self-referential struct, the only
thing the ctf_add_type part of this change really perturbs.

This completes the elimination of dtd_u.

libctf/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* ctf-impl.h (ctf_dtdef_t) <dtu_members>: Remove.
<dtd_u>: Likewise.
(ctf_dmdef_t): Remove.
(struct ctf_next) <u.ctn_dmd>: Remove.
* ctf-create.c (INITIAL_VLEN): New, more-or-less arbitrary initial
vlen size.
(ctf_add_enum): Use it.
(ctf_dtd_delete): Do not free the (removed) dmd; remove string
refs from the vlen on struct deletion.
(ctf_add_struct_sized): Populate the vlen: do it by hand if
promoting forwards.  Always populate the full-size
lsizehi/lsizelo members.
(ctf_add_union_sized): Likewise.
(ctf_add_member_offset): Set up the vlen rather than the dmd.
Expand it as needed, repointing string refs via
ctf_str_move_pending. Add the member names as pending strings.
Always populate the full-size lsizehi/lsizelo members.
(membadd): Remove, folding back into...
(ctf_add_type_internal): ... here, adding via an ordinary
ctf_add_struct_sized and _next iteration rather than doing
everything by hand.
* ctf-serialize.c (ctf_copy_smembers): Remove this...
(ctf_copy_lmembers): ... and this...
(ctf_emit_type_sect): ... folding into here. Figure out if a
ctf_stype_t is needed here, not in ctf_add_*_sized.
(ctf_type_sect_size): Figure out the ctf_stype_t stuff the same
way here.
* ctf-types.c (ctf_member_next): Remove the dmd path and always
use the vlen.  Force large-structure usage for dynamic types.
(ctf_type_align): Likewise.
(ctf_member_info): Likewise.
(ctf_type_rvisit): Likewise.
* testsuite/libctf-regression/type-add-unnamed-struct-ctf.c: Add a
self-referential type to this test.
* testsuite/libctf-regression/type-add-unnamed-struct.c: Adjusted
accordingly.
* testsuite/libctf-regression/type-add-unnamed-struct.lk: Likewise.

3 years agolibctf: eliminate dtd_u, part 4: enums
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
libctf: eliminate dtd_u, part 4: enums

This is the first tricky one, the first complex multi-entry vlen
containing strings.  To handle this in vlen form, we have to handle
pending refs moving around on realloc.

We grow vlen regions using a new ctf_grow_vlen function, and iterate
through the existing enums every time a grow happens, telling the string
machinery the distance between the old and new vlen region and letting
it adjust the pending refs accordingly.  (This avoids traversing all
outstanding refs to find the refs that need adjusting, at the cost of
having to traverse one enum: an obvious major performance win.)

Addition of enums themselves (and also structs/unions later) is a bit
trickier than earlier forms, because the type might be being promoted
from a forward, and forwards have no vlen: so we have to spot that and
create it if needed.

Serialization of enums simplifies down to just telling the string
machinery about the string refs; all the enum type-lookup code loses all
its dynamic member lookup complexity entirely.

A new test is added that iterates over (and gets values of) an enum with
enough members to force a round of vlen growth.

libctf/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* ctf-impl.h (ctf_dtdef_t) <dtd_vlen_alloc>: New.
(ctf_str_move_pending): Declare.
* ctf-string.c (ctf_str_add_ref_internal): Fix error return.
(ctf_str_move_pending): New.
* ctf-create.c (ctf_grow_vlen): New.
(ctf_dtd_delete): Zero out the vlen_alloc after free.  Free the
vlen later: iterate over it and free enum name refs first.
(ctf_add_generic): Populate dtd_vlen_alloc from vlen.
(ctf_add_enum): populate the vlen; do it by hand if promoting
forwards.
(ctf_add_enumerator): Set up the vlen rather than the dmd.  Expand
it as needed, repointing string refs via ctf_str_move_pending. Add
the enumerand names as pending strings.
* ctf-serialize.c (ctf_copy_emembers): Remove.
(ctf_emit_type_sect): Copy the vlen into place and ref the
strings.
* ctf-types.c (ctf_enum_next): The dynamic portion now uses
the same code as the non-dynamic.
(ctf_enum_name): Likewise.
(ctf_enum_value): Likewise.
* testsuite/libctf-lookup/enum-many-ctf.c: New test.
* testsuite/libctf-lookup/enum-many.lk: New test.

3 years agolibctf: do not corrupt strings across ctf_serialize
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
libctf: do not corrupt strings across ctf_serialize

The preceding change revealed a new bug: the string table is sorted for
better compression, so repeated serialization with type (or member)
additions in the middle can move strings around.  But every
serialization flushes the set of refs (the memory locations that are
automatically updated with a final string offset when the strtab is
updated), so if we are not to have string offsets go stale, we must do
all ref additions within the serialization code (which walks the
complete set of types and symbols anyway). Unfortunately, we were adding
one ref in another place: the type name in the dynamic type definitions,
which has a ref added to it by ctf_add_generic.

So adding a type, serializing (via, say, one of the ctf_write
functions), adding another type with a name that sorts earlier, and
serializing again will corrupt the name of the first type because it no
longer had a ref pointing to its dtd entry's name when its string offset
was shifted later in the strtab to mae way for the other type.

To ensure that we don't miss strings, we also maintain a set of *pending
refs* that will be added later (during serialization), and remove
entries from that set when the ref is finally added.  We always use
ctf_str_add_pending outside ctf-serialize.c, ensure that ctf_serialize
adds all strtab offsets as refs (even those in the dtds) on every
serialization, and mandate that no refs are live on entry to
ctf_serialize and that all pending refs are gone before strtab
finalization.  (Of necessity ctf_serialize has to traverse all strtab
offsets in the dtds in order to serialize them, so adding them as refs
at the same time is easy.)

(Note that we still can't erase unused atoms when we roll back, though
we can erase unused refs: members and enums are still not removed by
rollbacks and might reference strings added after the snapshot.)

libctf/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* ctf-hash.c (ctf_dynset_elements): New.
* ctf-impl.h (ctf_dynset_elements): Declare it.
(ctf_str_add_pending): Likewise.
(ctf_dict_t) <ctf_str_pending_ref>: New, set of refs that must be
added during serialization.
* ctf-string.c (ctf_str_create_atoms): Initialize it.
(CTF_STR_ADD_REF): New flag.
(CTF_STR_MAKE_PROVISIONAL): Likewise.
(CTF_STR_PENDING_REF): Likewise.
(ctf_str_add_ref_internal): Take a flags word rather than int
params.  Populate, and clear out, ctf_str_pending_ref.
(ctf_str_add): Adjust accordingly.
(ctf_str_add_external): Likewise.
(ctf_str_add_pending): New.
(ctf_str_remove_ref): Also remove the potential ref if it is a
pending ref.
* ctf-serialize.c (ctf_serialize): Prohibit addition of strings
with ctf_str_add_ref before serialization.  Ensure that the
ctf_str_pending_ref set is empty before strtab finalization.
(ctf_emit_type_sect): Add a ref to the ctt_name.
* ctf-create.c (ctf_add_generic): Add the ctt_name as a pending
ref.
* testsuite/libctf-writable/reserialize-strtab-corruption.*: New test.

3 years agolibctf: don't lose track of all valid types upon serialization
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
libctf: don't lose track of all valid types upon serialization

One pattern which is rarely done in libctf but which is meant to work is
this:

ctf_create();
ctf_add_*(); // add stuff
ctf_type_*() // look stuff up
ctf_write_*();
ctf_add_*(); // should still work
ctf_type_*() // so should this
ctf_write_*(); // and this

i.e., writing out a dict should not break it and you should be able to
do everything you could do with it before, including writing it out
again.

Unfortunately this has been broken for a while because the field which
indicates the maximum valid type ID was not preserved across
serialization: so type additions after serialization would overwrite
types (obviously disastrous) and type lookups would just fail.

Fix trivial.

libctf/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* ctf-serialize.c (ctf_serialize): Preserve ctf_typemax across
serialization.

3 years agoAdd install dependencies for ld -> bfd and libctf -> bfd
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
Add install dependencies for ld -> bfd and libctf -> bfd

This stops problems parallel-installing if a relink of libctf is needed.

Also adds corresponding install-strip dependencies.

ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

PR libctf/27482
* Makefile.def: Add install-bfd dependencies for install-libctf and
install-ld, and install-strip-bfd dependencies for
install-strip-libctf and install-strip-ld; move the install-ld
dependency on install-libctf to join it.
* Makefile.in: Regenerated.

3 years agolibctf: eliminate dtd_u, part 3: functions
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
libctf: eliminate dtd_u, part 3: functions

One more member vanishes from the dtd_u, leaving only the member for
struct/union/enum members.

There's not much to do here, since as of commit afd78bd6f0a30ba5 we use
the same representation (type sizes, etc) in the dtu_argv as we will
use in the final vlen, with one exception: the vlen has alignment
padding, and the dtu_argv did not.  Simplify things by adding suitable
padding in both cases.

libctf/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* ctf-impl.h (ctf_dtdef_t) <dtd_u.dtu_argv>: Remove.
* ctf-create.c (ctf_dtd_delete): No longer free it.
(ctf_add_function): Use the dtd_vlen, not dtu_argv.  Properly align.
* ctf-serialize.c (ctf_emit_type_sect): Just copy the dtd_vlen.
* ctf-types.c (ctf_func_type_info): Just use the vlen.
(ctf_func_type_args): Likewise.

3 years agolibctf: eliminate dtd_u, part 2: arrays
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
libctf: eliminate dtd_u, part 2: arrays

This is even simpler than ints, floats and slices, with the only extra
complication being the need to manually transfer the array parameter in
the rarely-used function ctf_set_array.  (Arrays are unique in libctf in
that they can be modified post facto, not just created and appended to.
I'm not sure why they got this exemption, but it's easy to maintain.)

libctf/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* ctf-impl.h (ctf_dtdef_t) <dtd_u.dtu_arr>: Remove.
* ctf-create.c (ctf_add_array): Use the dtd_vlen, not dtu_arr.
(ctf_set_array): Likewise.
* ctf-serialize.c (ctf_emit_type_sect): Just copy the dtd_vlen.
* ctf-types.c (ctf_array_info): Just use the vlen.

3 years agolibctf: eliminate dtd_u, part 1: int/float/slice
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
libctf: eliminate dtd_u, part 1: int/float/slice

This series eliminates a lot of special-case code to handle dynamic
types (types added to writable dicts and not yet serialized).

Historically, when such types have variable-length data in their final
CTF representations, libctf has always worked by adding such types to a
special union (ctf_dtdef_t.dtd_u) in the dynamic type definition
structure, then picking the members out of this structure at
serialization time and packing them into their final form.

This has the advantage that the ctf_add_* code doesn't need to know
anything about the final CTF representation, but the significant
disadvantage that all code that looks up types in any way needs two code
paths, one for dynamic types, one for all others.  Historically libctf
"handled" this by not supporting most type lookups on dynamic types at
all until ctf_update was called to do a complete reserialization of the
entire dict (it didn't emit an error, it just emitted wrong results).
Since commit 676c3ecbad6e9c4, which eliminated ctf_update in favour of
the internal-only ctf_serialize function, all the type-lookup paths
grew an extra branch to handle dynamic types.

We can eliminate this branch again by dropping the dtd_u stuff and
simply writing out the vlen in (close to) its final form at ctf_add_*
time: type lookup for types using this approach is then identical for
types in writable dicts and types that are in read-only ones, and
serialization is also simplified (we just need to write out the vlen
we already created).

The only complexity lies in type kinds for which multiple
vlen representations are valid depending on properties of the type,
e.g. structures.  But we can start simple, adjusting ints, floats,
and slices to work this way, and leaving everything else as is.

libctf/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* ctf-impl.h (ctf_dtdef_t) <dtd_u.dtu_enc>: Remove.
<dtd_u.dtu_slice>: Likewise.
<dtd_vlen>: New.
* ctf-create.c (ctf_add_generic): Perhaps allocate it.  All
callers adjusted.
(ctf_dtd_delete): Free it.
(ctf_add_slice): Use the dtd_vlen, not dtu_enc.
(ctf_add_encoded): Likewise.  Assert that this must be an int or
float.
* ctf-serialize.c (ctf_emit_type_sect): Just copy the dtd_vlen.
* ctf-dedup.c (ctf_dedup_rhash_type): Use the dtd_vlen, not
dtu_slice.
* ctf-types.c (ctf_type_reference): Likewise.
(ctf_type_encoding): Remove most dynamic-type-specific code: just
get the vlen from the right place.  Report failure to look up the
underlying type's encoding.

3 years agolibctf: fix GNU style for do {} while
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
libctf: fix GNU style for do {} while

It's formatted like this:

do
  {
    ...
  }
while (...);

Not like this:

do
 {
    ...
  } while (...);

or this:

do {
  ...
} while (...);

We used both in various places in libctf.  Fixing it necessitated some
light reindentation.

libctf/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* ctf-archive.c (ctf_archive_next): GNU style fix for do {} while.
* ctf-dedup.c (ctf_dedup_rhash_type): Likewise.
(ctf_dedup_rwalk_one_output_mapping): Likewise.
* ctf-dump.c (ctf_dump_format_type): Likewise.
* ctf-lookup.c (ctf_symbol_next): Likewise.
* swap.h (swap_thing): Likewise.

3 years agolibctf: split up ctf_serialize
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
libctf: split up ctf_serialize

ctf_serialize and its various pieces may be split out into a separate
file now, but ctf_serialize is still far too long and disordered, mixing
header initialization, sizing of multiple CTF sections, sorting and
emission of multiple CTF sections, strtab construction and ctf_dict_t
copying into a single ugly organically-grown mess.

Fix the worst of this by migrating all section sizing and emission into
separate functions, two per section (or class of section in the case of
the symtypetabs).  Only the variable section is now sized and emitted
directly in ctf_serialize (because it only takes about three lines to do
so).

The section sizes themselves are still maintained by ctf_serialize so
that it can work out the header offsets, but ctf_symtypetab_sect_sizes
and ctf_emit_symtypetab_sects share a lot of extra state: migrate that
into a shared structure, emit_symtypetab_state_t.

(Test results unchanged.)

libctf/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* ctf-serialize.c: General reshuffling, and...
(emit_symtypetab_state_t): New, migrated from
local variables in ctf_serialize.
(ctf_serialize): Split out most section sizing and
emission.
(ctf_symtypetab_sect_sizes): New (split out).
(ctf_emit_symtypetab_sects): Likewise.
(ctf_type_sect_size): Likewise.
(ctf_emit_type_sect): Likewise.

3 years agolibctf: fix comment above ctf_dict_t
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
libctf: fix comment above ctf_dict_t

It is perfectly possible to have dynamically allocated data owned by a
specific dict: you just have to teach ctf_serialize about it.

libctf/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* ctf-impl.h (ctf_dict_t): Fix comment.

3 years agolibctf: split serialization and file writeout into its own file
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
libctf: split serialization and file writeout into its own file

The code to serialize CTF dicts just gets bigger and bigger as the
dictionary's complexity grows: adding symtypetabs almost doubled it on
its own.  It's long past time to split this out into its own source
file, accompanied by the functions that do the actual writeout.

This leaves ctf-create.c populated exclusively by functions related to
actual writable dict creation (ctf_add_*, ctf_create etc), and leaves
both files a much more reasonable size.

libctf/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* ctf-create.c (symtypetab_delete_nonstatic_vars): Move
into ctf-serialize.c.
(ctf_symtab_skippable): Likewise.
(CTF_SYMTYPETAB_EMIT_FUNCTION): Likewise.
(CTF_SYMTYPETAB_EMIT_PAD): Likewise.
(CTF_SYMTYPETAB_FORCE_INDEXED): Likewise.
(symtypetab_density): Likewise.
(emit_symtypetab): Likewise.
(emit_symtypetab_index): Likewise.
(ctf_copy_smembers): Likewise.
(ctf_copy_lmembers): Likewise.
(ctf_copy_emembers): Likewise.
(ctf_sort_var): Likewise.
(ctf_serialize): Likewise.
(ctf_gzwrite): Likewise.
(ctf_compress_write): Likewise.
(ctf_write_mem): Likewise.
(ctf_write): Likewise.
* ctf-serialize.c: New file.
* Makefile.am (libctf_nobfd_la_SOURCES): Add it.
* Makefile.in: Regenerate.

3 years agolibctf: fix some tabdamage and move some code around
Nick Alcock [Thu, 18 Mar 2021 12:37:52 +0000 (12:37 +0000)]
libctf: fix some tabdamage and move some code around

ctf-link.c is unnecessarily confusing because ctf_link_lazy_open is
positioned near functions that have nothing to do with opening files.

Move it around, and fix some tabdamage that's crept in lately.

libctf/ChangeLog
2021-03-18  Nick Alcock  <nick.alcock@oracle.com>

* ctf-link.c (ctf_link_lazy_open): Move up in the file, to near
ctf_link_add_ctf.
* ctf-lookup.c (ctf_lookup_symbol_idx): Repair tabdamage.
(ctf_lookup_by_sym_or_name): Likewise.
* testsuite/libctf-lookup/struct-iteration.c: Likewise.
* testsuite/libctf-regression/type-add-unnamed-struct.c: Likewise.

3 years agoAutomatic date update in version.in
GDB Administrator [Thu, 18 Mar 2021 00:00:07 +0000 (00:00 +0000)]
Automatic date update in version.in

3 years agogdb: remove unneeded argument in check_multi_target_resumption
Simon Marchi [Wed, 13 Jan 2021 04:42:12 +0000 (23:42 -0500)]
gdb: remove unneeded argument in check_multi_target_resumption

If we reach the modified line, resume_target is necessarily nullptr,
because of the check at the beginning of the function.  So we'll
necessarily iterate on all non-exited inferiors (across all targets),
which is what we want.  So just remove the unnecessary argument.

gdb/ChangeLog:

* infrun.c (check_multi_target_resumption): Remove argument to
all_non_exited_inferiors.

Change-Id: If95704915dca19599d5f7f4732bbd6ccd20bf6b4

3 years agogdb/testsuite: add test for run/attach while program is running
Simon Marchi [Mon, 25 Jan 2021 04:57:28 +0000 (23:57 -0500)]
gdb/testsuite: add test for run/attach while program is running

A WIP patch series broke the use case of doing "run" or "attach" while
the program is running, but it wasn't caught by the testsuite, which
means it's not covered.  Add a test for that.

gdb/testsuite/ChangeLog:

* gdb.base/run-attach-while-running.exp: New.
* gdb.base/run-attach-while-running.c: New.

Change-Id: I77f098ec0b28dc2d4575ea80e941f6a75273e431

3 years agoAutomatic date update in version.in
GDB Administrator [Wed, 17 Mar 2021 00:00:06 +0000 (00:00 +0000)]
Automatic date update in version.in

3 years agoRetain .debug_addr sections loaded in the main file.
Nick Clifton [Tue, 16 Mar 2021 18:01:58 +0000 (18:01 +0000)]
Retain .debug_addr sections loaded in the main file.

PR 27534
* readelf.c (display_debug_section): Also retain .debug_addr
sections.

3 years agoRe-enable the dislay of debug sections in separate debuginfo files without the need...
Nick Clifton [Tue, 16 Mar 2021 16:39:46 +0000 (16:39 +0000)]
Re-enable the dislay of debug sections in separate debuginfo files without the need for -P.

PR 27533
* readelf.c (process_section_contents): Only dump debug
information for separate files unless process_links is enabled.
(process_object): Always call process_section_contents for
separate info files.

3 years agoFix cygwin build error
Christian Biesinger [Mon, 15 Mar 2021 13:31:43 +0000 (08:31 -0500)]
Fix cygwin build error

With "gcc version 10.2.0 (GCC)" on cygwin, I get this build error:
  CXX    windows-nat.o
In file included from ../../gdb/../gdbsupport/common-defs.h:129,
                 from ../../gdb/defs.h:28,
                 from ../../gdb/windows-nat.c:24:
../../gdb/windows-nat.c: In function 'void windows_init_thread_list()':
../../gdb/windows-nat.c:513:17: error: zero-length gnu_printf format string [-Werror=format-zero-length]
  513 |   DEBUG_EVENTS ("");
      |                 ^~
../../gdb/../gdbsupport/common-debug.h:65:43: note: in definition of macro 'debug_prefixed_printf_cond'
   65 |  debug_prefixed_printf (module, __func__, fmt, ##__VA_ARGS__); \
      |                                           ^~~
../../gdb/windows-nat.c:513:3: note: in expansion of macro 'DEBUG_EVENTS'
  513 |   DEBUG_EVENTS ("");
      |   ^~~~~~~~~~~~
cc1plus: all warnings being treated as errors

This was introduced in 4ef367bffd73d50002339deba40983530ccb9d15, which removed
the function name from this debug message:
-  DEBUG_EVENTS (("gdb: windows_init_thread_list\n"));
+  DEBUG_EVENTS ("");

DEBUG_EVENTS now always includes the function name, so just add a "called"
message to fix the compile error.

gdb/ChangeLog:

2021-03-16  Christian Biesinger  <cbiesinger@google.com>

* windows-nat.c (windows_init_thread_list): Add message to
debug log.

3 years agoFix potentially undefined behaviour use of strcpcy.
Nick Clifton [Tue, 16 Mar 2021 14:02:38 +0000 (14:02 +0000)]
Fix potentially undefined behaviour use of strcpcy.

* pe-dll.c (pe_find_cdecl_alias_match): Use memmove to overwrite
lname string.

3 years agoFix a potential buffer overrun qwhen writing out PE aux entries.
Nick Clifton [Tue, 16 Mar 2021 12:44:50 +0000 (12:44 +0000)]
Fix a potential buffer overrun qwhen writing out PE aux entries.

* peXXigen.c (_bfd_XXi_swap_aux_out): Avoid potential buffer
overrun by using sizeof of the destination x_fname field as the
limit for a memcpy.

* coff/internal.h (struct internal_auxent): Fix a couple of typos
in comment describing the x_fname field.

3 years agogdb/python: fix FrameDecorator regression on Python 2
Andrew Burgess [Mon, 15 Mar 2021 14:20:13 +0000 (14:20 +0000)]
gdb/python: fix FrameDecorator regression on Python 2

This commit:

  commit d1cab9876d72d867b2de82688f5f5a2a4b655edb
  Date:   Tue Sep 15 11:08:56 2020 -0600

      Don't use gdb_py_long_from_ulongest

Introduced a regression when GDB is compiled with Python 2.  The frame
filter API expects the gdb.FrameDecorator.function () method to return
either a string (the name of a function) or an address, which GDB then
uses to lookup a msymbol.

If the address returned from gdb.FrameDecorator.function () comes from
gdb.Frame.pc () then before the above commit we would always expect to
see a PyLong object.

After the above commit we might (on Python 2) get a PyInt object.

The GDB code does not expect to see a PyInt, and only checks for a
PyLong, we then see an error message like:

  RuntimeError: FrameDecorator.function: expecting a String, integer or None.

This commit just adds an additional call to PyInt_Check which handle
the missing case.

I had already written a test case to cover this issue before spotting
that the gdb.python/py-framefilter.exp test also triggers this
failure.  As the new test case is slightly different I have kept it
in.

The new test forces the behaviour of gdb.FrameDecorator.function
returning an address.  The reason the existing test case hits this is
due to the behaviour of the builtin gdb.FrameDecorator base class.  If
the base class behaviour ever changed then the return an address case
would only be tested by the new test case.

gdb/ChangeLog:

* python/py-framefilter.c (py_print_frame): Use PyInt_Check as
well as PyLong_Check for Python 2.

gdb/testsuite/ChangeLog:

* gdb.python/py-framefilter-addr.c: New file.
* gdb.python/py-framefilter-addr.exp: New file.
* gdb.python/py-framefilter-addr.py: New file.

3 years agogdb/testsuite: squash duplicate test names in gdb.threads/*.exp
Andrew Burgess [Mon, 15 Mar 2021 10:44:07 +0000 (10:44 +0000)]
gdb/testsuite: squash duplicate test names in gdb.threads/*.exp

Resolve all of the duplicate test names in the gdb.threads/*.exp set
of tests (that I see).  Nothing very exciting here, mostly either
giving tests explicit testnames, or adding with_test_prefix.

The only interesting one is gdb.threads/execl.exp, I believe the
duplicate test name was caused by an actual duplicate test.  I've
remove the simpler form of the test.  I don't believe we've lost any
test coverage with this change.

gdb/testsuite/ChangeLog:

* gdb.threads/execl.exp: Remove duplicate 'info threads' test.
Make use of $gdb_test_name instead of creating a separate $test
variable.
* gdb.threads/print-threads.exp: Add a with_test_prefix instead of
adding a '($name)' at the end of each test.  This also catches the
one place where '($name)' was missing, and so caused a duplicate
test name.
* gdb.threads/queue-signal.exp: Give tests unique names to avoid
duplicate test names based on the command being tested.
* gdb.threads/signal-command-multiple-signals-pending.exp:
Likewise.
* lib/gdb.exp (gdb_compile_shlib_pthreads): Tweak test name to
avoid duplicate testnames when a test script uses this proc and
also gdb_compile_pthreads.
* lib/prelink-support.exp (build_executable_own_libs): Use
with_test_prefix to avoid duplicate test names when we call
build_executable twice.

3 years agoRISC-V : Support bitmanip-0.93 ZBA/ZBB/ZBC instructions
Kuan-Lin Chen [Wed, 24 Feb 2021 05:26:29 +0000 (13:26 +0800)]
RISC-V : Support bitmanip-0.93 ZBA/ZBB/ZBC instructions

bfd/
* elfxx-riscv.c (riscv_std_z_ext_strtab): Add zba, zbb and zbc.

gas/
* config/tc-riscv.c (ext_version_table): Add b, zba, zbb and zbc.
(riscv_multi_subset_supports): Add INSN_CLASS_ZB*.
* testsuite/gas/riscv/b-ext-64.s: Bitmanip test case.
* testsuite/gas/riscv/b-ext-64.d: Likewise.
* testsuite/gas/riscv/b-ext.s: Likewise.
* testsuite/gas/riscv/b-ext.d: Likewise.

include/
* opcode/riscv-opc.h: Support zba, zbb and zbc extensions.
* opcode/riscv.h (riscv_insn_class): Add INSN_CLASS_ZB*.

opcodes/
* riscv-opc.c (riscv_opcodes): Add zba, zbb and zbc instructions.

3 years agoAutomatic date update in version.in
GDB Administrator [Tue, 16 Mar 2021 00:00:09 +0000 (00:00 +0000)]
Automatic date update in version.in

3 years agoFix GDB build with GCC 4.8.2
Tom Tromey [Mon, 15 Mar 2021 14:59:17 +0000 (08:59 -0600)]
Fix GDB build with GCC 4.8.2

PR build/27579 points out that the expression rewrite series
introduced a build failure with GCC 4.8.2.  The bug is that there's no
std::hash specialization for enum exp_opcode.  This patch fixes the
problem by using gdb::hash_enum.

2021-03-15  Tom Tromey  <tromey@adacore.com>

PR build/27579:
* rust-exp.y (maker_map): Use gdb::hash_enum.
* stap-probe.c (stap_maker_map): Use gdb::hash_enum.

3 years agogdb: remove spurious colon in create_debug_type_hash_table debug print
Simon Marchi [Mon, 15 Mar 2021 17:27:03 +0000 (13:27 -0400)]
gdb: remove spurious colon in create_debug_type_hash_table debug print

This printout in create_debug_type_hash_table has an unexpected colon at
the end, remove it:

    [dwarf-read] create_debug_type_hash_table: Reading .debug_info for /home/simark/build/binutils-gdb/gdb/a.out:

gdb/ChangeLog:

* dwarf2/read.c (create_debug_type_hash_table): Remove colon at
end of debug print.

Change-Id: I2d707248249daf4d8b6fa8e7064acdc56c90f2dd

3 years agogdb: add logging to dwarf2_initialize_objfile
Simon Marchi [Thu, 11 Mar 2021 03:20:39 +0000 (22:20 -0500)]
gdb: add logging to dwarf2_initialize_objfile

I added these printouts while working on 27541.  I won't have a fix for
that right now, but I thought that it would be useful to merge them
upstream, as they help understand what happens in that function.

gdb/ChangeLog:

* dwarf2/read.c (dwarf2_initialize_objfile): Add debug prints.

Change-Id: I790c0d53383327038cb5dd705f74c8c978e0a7ec

3 years agogdb: remove dw2_get_file_names_reader's info_ptr parameter
Simon Marchi [Mon, 15 Mar 2021 17:22:27 +0000 (13:22 -0400)]
gdb: remove dw2_get_file_names_reader's info_ptr parameter

I noticed that this parameter was unused, remove it.

gdb/ChangeLog:

* dwarf2/read.c (dw2_get_file_names_reader): Remove info_ptr
parameter, adjust caller.

Change-Id: I2a741766a0c658c22c512590aeffdd07391c869c

3 years agoFix unary + in Ada
Tom Tromey [Mon, 15 Mar 2021 14:20:24 +0000 (08:20 -0600)]
Fix unary + in Ada

My previous Ada patches introduced a bug that I found after checkin.
I had incorrectly implemented unary +.  There was a test for the
overloaded case, but no test for the ordinary case.

This patch adds the tests and fixes the bug.
Tested on x86-64 Fedora 32.

gdb/ChangeLog
2021-03-15  Tom Tromey  <tromey@adacore.com>

* ada-exp.y (simple_exp): Always push a result for unary '+'.

gdb/testsuite/ChangeLog
2021-03-15  Tom Tromey  <tromey@adacore.com>

* gdb.ada/fixed_points.exp: Add tests of unary + and -.

3 years agoCall ada_ensure_varsize_limit in indirection
Tom Tromey [Mon, 15 Mar 2021 12:23:12 +0000 (06:23 -0600)]
Call ada_ensure_varsize_limit in indirection

Internal testing revealed yet another Ada regression from the
expression rewrite.  In this case, indirection did not use the Ada
varsize limit.  The old code relied on the expression resolution
process to evaluate this subexpression with EVAL_AVOID_SIDE_EFFECTS in
order to get this error.  However, this isn't always done in the new
approach; so this patch introduces another call to
ada_ensure_varsize_limit in the appropriate spot.

As with the earlier patches, this path was not tested in-tree, so this
patch also updates a test.

gdb/ChangeLog
2021-03-15  Tom Tromey  <tromey@adacore.com>

* ada-lang.c (ada_unop_ind_operation::evaluate): Call
ada_ensure_varsize_limit.

gdb/testsuite/ChangeLog
2021-03-15  Tom Tromey  <tromey@adacore.com>

* gdb.ada/varsize_limit.exp: Add new test.
* gdb.ada/varsize_limit/vsizelim.adb: Update.

3 years agoImplement Ada operator overloading
Tom Tromey [Mon, 15 Mar 2021 12:23:12 +0000 (06:23 -0600)]
Implement Ada operator overloading

In the expression rewrite, I neglected to carry over support for Ada
operator overloading.  It turns out that there were no tests for this
in-tree.

This patch adds support for operator overloading, and adds the missing
test.

gdb/ChangeLog
2021-03-15  Tom Tromey  <tromey@adacore.com>

* ada-lang.c (numeric_type_p, integer_type_p): Return true for
fixed-point.
* ada-exp.y (maybe_overload): New function.
(ada_wrap_overload): New function.
(ada_un_wrap2, ada_wrap2, ada_wrap_op): Use maybe_overload.
(exp1, simple_exp, relation, and_exp, and_then_exp, or_exp)
(or_else_exp, xor_exp, primary): Update.

gdb/testsuite/ChangeLog
2021-03-15  Tom Tromey  <tromey@adacore.com>

* gdb.ada/operator_call/twovecs.ads: New file.
* gdb.ada/operator_call/twovecs.adb: New file.
* gdb.ada/operator_call/opcall.adb: New file.
* gdb.ada/operator_call.exp: New file.

3 years agoFix regression in Ada ptype
Tom Tromey [Mon, 15 Mar 2021 12:23:12 +0000 (06:23 -0600)]
Fix regression in Ada ptype

This fixes PR ada/27545, which points out that a test in
gdb.ada/tagged.exp started failing due to the expression rewrite.  I
didn't notice this failure because my system gcc-gnat debuginfo was
out of date, and so the test was already failing in the baseline.

Previously, the OP_VAR_VALUE case in ada_evaluate_subexp ended up
doing a recursive call:

    arg1 = evaluate_subexp (nullptr, exp, pos, EVAL_NORMAL);

However, during the rewrite I missed this fact and had the new code
call the superclass implementation.

This patch fixes the bug by changing this code to use a recursive call
instead.

gdb/ChangeLog
2021-03-15  Tom Tromey  <tromey@adacore.com>

PR ada/27545:
* ada-lang.c (ada_var_value_operation::evaluate): Use recursive
call for tagged type.

3 years agoFix Ada assignment resolution
Tom Tromey [Mon, 15 Mar 2021 12:23:12 +0000 (06:23 -0600)]
Fix Ada assignment resolution

The expression rewrite missed an Ada resolution case.  GDB previously
knew how to disambiguate the right hand side of an assignment, but now
it does not.

This patch fixes the problem and adds the missing test case.

gdb/ChangeLog
2021-03-15  Tom Tromey  <tromey@adacore.com>

* ada-exp.y (exp1): Handle resolution of the right hand side of an
assignment.

gdb/testsuite/ChangeLog
2021-03-15  Tom Tromey  <tromey@adacore.com>

* gdb.ada/enums_overload/enums_overload_main.adb: New file.
* gdb.ada/enums_overload/enums_overload.ads: New file.
* gdb.ada/enums_overload/enums_overload.adb: New file.
* gdb.ada/enums_overload.exp: New file.

3 years agoFix bug in Ada aggregate assignment
Tom Tromey [Mon, 15 Mar 2021 12:23:12 +0000 (06:23 -0600)]
Fix bug in Ada aggregate assignment

The expression rewrite caused a regression in the internal AdaCore
test suite.  The bug was that I had dropped a bit of code from
aggregate assignment -- assign_aggregate used to return the container,
which I thought was redundant, but which can actually change during
the call.  There was no test for this case in the tree, so I've added
one.

gdb/ChangeLog
2021-03-15  Tom Tromey  <tromey@adacore.com>

* ada-lang.c (ada_aggregate_operation::assign_aggregate): Return
container.
(ada_assign_operation::evaluate): Update.
* ada-exp.h (class ada_aggregate_operation) <assign_aggregate>:
Change return type.

gdb/testsuite/ChangeLog
2021-03-15  Tom Tromey  <tromey@adacore.com>

* gdb.ada/assign_arr/target_wrapper.ads (IArray, Put, Do_Nothing):
Declare.
* gdb.ada/assign_arr/target_wrapper.adb: New file.
* gdb.ada/assign_arr/main_p324_051.adb (IValue): New variable.
Call Put.
* gdb.ada/assign_arr.exp: Update.

3 years agoAdd a symbols-only mode to nm.
Nick Clifton [Mon, 15 Mar 2021 10:55:49 +0000 (10:55 +0000)]
Add a symbols-only mode to nm.

PR 27487
* nm.c (FORMAT_JUST_SYMBOLS): Define.
(struct optput_fns): Add entry for FORMAT_JUST_SYMBOLS.
(long_options): Add just-symbols.
(set_output_format): Add support for just-symbols.
(get_print_format): Likewise.
(do_not_print_object_filename): New function.
(do_not_print_archive_filename): New function.
(do_not_print_archive_member): New function.
(do_not_print_symbol_filename): New function.
(just_print_symbol_name): New function.
(main): Handle --just-symbols.
* NEWS: Mention the new feature.
* doc/binutils.texi: Document the new feature.

3 years agogdb/fortran: Fix quad floating-point type for Intel compilers.
Felix Willgerodt [Mon, 15 Mar 2021 10:00:28 +0000 (11:00 +0100)]
gdb/fortran: Fix quad floating-point type for Intel compilers.

Intel Fortran compilers emit the following DWARF for gdb.fortran/complex.f90:

0x00000071:   DW_TAG_base_type
                DW_AT_name ("COMPLEX*32")
                DW_AT_encoding (DW_ATE_complex_float)
                DW_AT_byte_size (0x20)

0x00000078:   DW_TAG_base_type
                DW_AT_name ("REAL*16")
                DW_AT_encoding (DW_ATE_float)
                DW_AT_byte_size (0x10)

This results in GDB not reading the right values, as it wrongly assumes the
default floatformat "floatformat_i387_ext" instead of
"floatformat_ia64_quad_little".

gdb/ChangeLog:
2021-03-15  Felix Willgerodt  <felix.willgerodt@intel.com>

* i386-tdep.c (i386_floatformat_for_type): Add COMPLEX*32 and REAL*16.

3 years agold: don't chance overrunning PE .reloc section content
Jan Beulich [Mon, 15 Mar 2021 10:00:44 +0000 (11:00 +0100)]
ld: don't chance overrunning PE .reloc section content

The allocation of reloc_d doesn't take reloc_s->size into account. There
is already padding being emitted up to the allocated size. While
reloc_s->size ought to still be zero at this point anyway (and hence the
code being deleted would have been just dead), don't risk writing past
the actual allocation.

3 years agogdb: use make_scoped_restore to restore gdbpy_current_objfile
Andrew Burgess [Fri, 12 Mar 2021 11:07:19 +0000 (11:07 +0000)]
gdb: use make_scoped_restore to restore gdbpy_current_objfile

The current mechanism by which the Python gdb.current_objfile is
maintained does not allow for nested auto-load events.  It is assumed
that once an auto-load script has finished loading then the current
objfile should be set back to NULL.  In a nested situation, we should
be restoring the previous value.

We already have an RAII class to handle save/restore type behaviour,
so lets just switch to use that.

The test is a little contrived, but is simple enough, and triggers the
bug.  The real use case might involve the auto-load script calling
functions (either in the just-loaded object file, or in the main
executable), which in turn trigger further auto-loads to occur.

gdb/ChangeLog:

* python/python.c (gdbpy_source_objfile_script): Use
make_scoped_restore to restore gdbpy_current_objfile.
(gdbpy_execute_objfile_script): Likewise.

gdb/testsuite/ChangeLog:

* gdb.python/py-auto-load-chaining-f1.c: New file.
* gdb.python/py-auto-load-chaining-f1.o-gdb.py: New file.
* gdb.python/py-auto-load-chaining-f2.c: New file.
* gdb.python/py-auto-load-chaining-f2.o-gdb.py: New file.
* gdb.python/py-auto-load-chaining.c: New file.
* gdb.python/py-auto-load-chaining.exp: New file.

3 years agoAutomatic date update in version.in
GDB Administrator [Mon, 15 Mar 2021 00:00:06 +0000 (00:00 +0000)]
Automatic date update in version.in

3 years agoUse cu_header consistently in read_attribute_value
Tom Tromey [Sun, 14 Mar 2021 17:59:37 +0000 (11:59 -0600)]
Use cu_header consistently in read_attribute_value

read_attribute_value has a local cu_header variable, but then some
spots in the function use cu->header instead.  It seems better to me
to prefer the local everywhere, so this patch makes this change.

gdb/ChangeLog
2021-03-14  Tom Tromey  <tom@tromey.com>

* dwarf2/read.c (read_attribute_value): Use cu_header
consistently.

3 years agoMinor tweak to use die_reader_specs::abfd
Tom Tromey [Sun, 14 Mar 2021 17:42:05 +0000 (11:42 -0600)]
Minor tweak to use die_reader_specs::abfd

For an experiment I'm working on, it would be convenient if
die_reader_specs::cu could be NULL.  This is fairly involved to
implement, but I did notice one spot that could conveniently be
updated.  While making this trivial change, I also noticed a small,
related formatting error.

2021-03-14  Tom Tromey  <tom@tromey.com>

* dwarf2/read.c (struct die_reader_specs) <abfd>: Fix formatting.
(peek_die_abbrev): Use reader.abfd.

3 years agoSet dwarf2_per_cu_data::m_header_read_in
Tom Tromey [Sun, 14 Mar 2021 17:41:46 +0000 (11:41 -0600)]
Set dwarf2_per_cu_data::m_header_read_in

I noticed that nothing in dwarf2/read.c sets
dwarf2_per_cu_data::m_header_read_in.  This patch adds the appropriate
assignment.

gdb/ChangeLog
2021-03-14  Tom Tromey  <tom@tromey.com>

* dwarf2/read.c (dwarf2_per_cu_data::get_header): Set
m_header_read_in.

3 years agoAutomatic date update in version.in
GDB Administrator [Sun, 14 Mar 2021 00:00:07 +0000 (00:00 +0000)]
Automatic date update in version.in

3 years agoConstify abbrev_table::lookup_abbrev
Tom Tromey [Sat, 13 Mar 2021 16:41:04 +0000 (09:41 -0700)]
Constify abbrev_table::lookup_abbrev

This changes abbrev_table::lookup_abbrev to return a pointer to const,
then fixes up the affected code.

gdb/ChangeLog
2021-03-13  Tom Tromey  <tom@tromey.com>

* dwarf2/read.c (struct partial_die_info): Update.
(peek_die_abbrev, skip_children, skip_one_die, read_full_die_1)
(load_partial_dies, partial_die_info::partial_die_info): Update.
* dwarf2/abbrev.h (lookup_abbrev): Constify.

3 years agoRemove Irix 6 workaround from DWARF abbrev reader
Tom Tromey [Sat, 13 Mar 2021 16:41:04 +0000 (09:41 -0700)]
Remove Irix 6 workaround from DWARF abbrev reader

abbrev_table::read has a workaround for Irix 6.  The last release of
Irix was in 2006, and (according to Wikipedia) hardware produced after
2007 cannot run Irix.  I think this workaround can safely be retired.

gdb/ChangeLog
2021-03-13  Tom Tromey  <tom@tromey.com>

* dwarf2/abbrev.c (abbrev_table::read): Remove Irix 6 workaround.

3 years agosim: rename BUILD_LDFLAGS to LDFLAGS_FOR_BUILD
Mike Frysinger [Mon, 8 Mar 2021 05:35:03 +0000 (00:35 -0500)]
sim: rename BUILD_LDFLAGS to LDFLAGS_FOR_BUILD

The rest of the binutils tree renamed this variable many years ago.

3 years agosim: introduce {COMPILE,LINK}_FOR_BUILD
Mike Frysinger [Mon, 8 Mar 2021 06:41:35 +0000 (01:41 -0500)]
sim: introduce {COMPILE,LINK}_FOR_BUILD

These use the same pattern as seen in the opcodes/ dir and in automake
in general (ish).  This helps simplify the boilerplate for building and
linking build-time code, and fixes some inconsistency in flag usage.

For rules that were compiling+linking in a single step, split them into
separate steps so we can apply the correct set of options.  This matches
automake behavior too.