When handling DWARF attributes of the form DW_FORM_strp the strings
should be placed in the .debug_str section, not .debug_string as they
currently are by the DWARF assembler (in lib/dwarf.exp).
I've added a test. This is as much to test the DWARF generator as it
is to test GDB as GCC makes frequent use of DW_FORM_strp so we can be
pretty sure this part of GDB is already well tested.
gdb/testsuite/ChangeLog:
* gdb.dwarf2/dw2-using-debug-str.c: New file.
* gdb.dwarf2/dw2-using-debug-str.exp: New file.
* lib/dwarf.exp (Dwarf::DW_FORM_strp): Create .debug_str section,
not .debug_string.
This changes objfile::qf to be a forward_list, and then updates all
the uses to iterate over the list. Note that there is still only ever
a single element in the list; this is handled by clearing the list
whenever an object is added.
gdb/ChangeLog
2021-03-20 Tom Tromey <tom@tromey.com>
* dwarf2/read.c (dwarf2_build_psymtabs): Update.
* 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)
(objfile::require_partial_symbols): Update.
* psymtab.c (maintenance_print_psymbols)
(maintenance_info_psymtabs, maintenance_check_psymtabs): Update.
* objfiles.h (struct objfile) <qf>: Now a forward_list.
* objfiles.c (objfile_relocate1): Update.
* elfread.c (elf_symfile_read): Update.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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
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
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 4ef367bffd, 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.
This commit:
commit d1cab9876d
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.
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.
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.
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
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
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
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 -.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
This avoids using a thread-local extern variable, which causes link errors
on some platforms, notably Cygwin. But I think this is a better pattern
even outside of working around linker bugs because it encapsulates direct
access to the variable inside the class, instead of having a global extern
variable.
The cygwin link error is:
cp-support.o: in function `gdb_demangle(char const*, int)':
/home/Christian/binutils-gdb/obj/gdb/../../gdb/cp-support.c:1619:(.text+0x6472): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `TLS init function for thread_local_segv_handler'
/home/Christian/binutils-gdb/obj/gdb/../../gdb/cp-support.c:1619:(.text+0x648b): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `TLS init function for thread_local_segv_handler'
collect2: error: ld returned 1 exit status
2021-03-12 Christian Biesinger <cbiesinger@google.com>
PR threads/27239
* cp-support.c: Use scoped_segv_handler_restore.
* event-top.c (thread_local_segv_handler): Made static.
(scoped_segv_handler_restore::scoped_segv_handler_restore):
New function.
(scoped_segv_handler_restore::~scoped_segv_handler_restore): New
function.
* event-top.h (class scoped_segv_handler_restore): New class.
(thread_local_segv_handler): Removed.
This commit resolves the remaining duplicate test names in the
gdb.python/ directory, there's 1 duplicate per test script. In each
case I have just extended some test names to make them more
descriptive.
gdb/testsuite/ChangeLog:
* gdb.python/py-bad-printers.exp: Extend test names to make them
unique.
* gdb.python/py-events.exp: Likewise.
* gdb.python/py-finish-breakpoint2.exp: Likewise.
* gdb.python/py-frame-inline.exp: Likewise.
* gdb.python/py-frame.exp: Likewise.
* gdb.python/py-infthread.exp: Likewise.
While squashing duplicate test names I spotted an actual duplicate
test, I suspect a copy & paste error in an earlier patch. I can see
no reason why we should need to duplicate this test, so I'm removing
one copy of it.
gdb/testsuite/ChangeLog:
* gdb.python/py-value-cc.exp: Remove a duplicate test.
While squashing duplicate test names I spotted what looked like a copy
& paste error. During this test a Python variable is created, and
then we call the type method on that variable. In one case we create
a variable and then call the type method on a variable created for a
previous test. I can see no reason why this should be what we want,
it doesn't line up with the comments in the test script, so I've
updated the test. Note, the expected result doesn't change, just the
command issued (the test relates to stripping typedefs).
gdb/testsuite/ChangeLog:
* gdb.python/lib-types.exp: Update the test to check the correct
python variable.
Add additional text to some test names to make them unique. In one
case, correct the test name (copy & paste error) to make it correctly
reflect what the test is doing.
gdb/testsuite/ChangeLog:
* gdb.python/py-explore-cc.exp: Extend test names to make them
unique.
I spotted a duplicate test name in this test script. Turns out it's
an actual duplicate test. Delete one copy of this test.
gdb/testsuite/ChangeLog:
* gdb.python/py-lookup-type.exp: Remove duplicate test.
Extend the test names with additional text to make them unique.
gdb/testsuite/ChangeLog:
* gdb.python/py-pp-maint.exp: Extend test names to make them
unique.
Add a with_test_prefix to make test names unique.
gdb/testsuite/ChangeLog:
* gdb.python/py-explore.exp: Add with_test_prefix to make test
names unique.
Make test names unique by just adding additional text to the test
names. As this is a Python test that repeatedly imports the Python
script I've just numbered the test names in this case rather than
trying to come up with anything better, hence we have:
import python scripts, 1
import python scripts, 2
...
import python scripts, 6
Not great, but hopefully good enough. Everything else has a slightly
more descriptive test name.
gdb/testsuite/ChangeLog:
* gdb.python/py-finish-breakpoint.exp: Make test names unique.
Wrap some code in `with_test_prefix` to make test names unique.
gdb/testsuite/ChangeLog:
* gdb.python/py-strfns.exp: Use with_test_prefix to make test
names unique.
Make use of `proc_with_prefix` for every test_* proc in order to make
the test names unique within this test file.
gdb/testsuite/ChangeLog:
* gdb.python/py-format-string.exp: Use proc_with_prefix to make
test names unique.
Some spots in GDB already use bool for "parse_completion", but a few
were still using int. This patch updates these to bool.
I'm checking this in.
gdb/ChangeLog
2021-03-10 Tom Tromey <tromey@adacore.com>
* parser-defs.h (parser_state): Change completion to bool.
<parse_completion>: Likewise.
* ada-lang.h (ada_find_operator_symbol, ada_resolve_funcall)
(ada_resolve_variable, ada_resolve_function): Update.
* ada-lang.c (ada_find_operator_symbol): Change
parse_completion to bool.
(ada_resolve_funcall, ada_resolve_variable)
(ada_resolve_function): Likewise.
The internal AdaCore test suite revealed a bug in the new evaluator.
A hunk of evaluate_funcall was not correctly transcribed. This was
not caught in my original testing because the feature in question was
apparently not tested in gdb.
This patch fixes the oversight. The idea here is that ordinary
function calls should use the function's formal parameter types as the
expected types of subexpressions.
Regression tested on x86-64 Fedora 32.
gdb/ChangeLog
2021-03-09 Tom Tromey <tromey@adacore.com>
* eval.c (operation::evaluate_funcall): Use function formal
parameter types when evaluating.
gdb/testsuite/ChangeLog
2021-03-09 Tom Tromey <tromey@adacore.com>
* gdb.base/cast-call.exp: New file.
* gdb.base/cast-call.c: New file.
In commit:
commit 5b7d941b90
Date: Fri Jan 22 12:21:09 2021 -0500
gdb: add owner-related methods to struct type
two fields of struct maint_type were renamed. 'flag_objfile_owned'
became 'm_flag_objfile_owned' and 'owner' became 'm_owner'. Update
our python helper script to take this into account.
I've added a basic test that uses the self-test framework to load the
pretty printers, and print a type.
The test relies on stopping in GDB's `value_print` function.
gdb/ChangeLog:
* gdb-gdb.py.in (StructMainTypePrettyPrinter) <owner_to_string>:
Updated fields names flag_objfile_owned to m_flag_objfile_owned,
and owner to m_owner.
gdb/testsuite/ChangeLog:
* gdb.gdb/python-helper.exp: New file.
LOC(X) returns the address of X as an integer:
https://gcc.gnu.org/onlinedocs/gfortran/LOC.html
Before:
(gdb) p LOC(r)
No symbol "LOC" in current context.
After:
(gdb) p LOC(r)
$1 = 0xffffdf48
gdb/ChangeLog:
2021-03-09 Felix Willgerodt <felix.willgerodt@intel.com>
* f-exp.h (eval_op_f_loc): Declare.
(expr::fortran_loc_operation): New typedef.
* f-exp.y (exp): Handle UNOP_FORTRAN_LOC after parsing an
UNOP_INTRINSIC.
(f77_keywords): Add LOC keyword.
* f-lang.c (eval_op_f_loc): New function.
* std-operator.def (UNOP_FORTRAN_LOC): New operator.
gdb/testsuite/ChangeLog:
2020-03-09 Felix Willgerodt <felix.willgerodt@intel.com>
* gdb.fortran/intrinsics.exp: Add LOC tests.
Add support for the SHAPE keyword to GDB's Fortran expression parser.
gdb/ChangeLog:
* f-exp.h (eval_op_f_array_shape): Declare.
(fortran_array_shape_operation): New type.
* f-exp.y (exp): Handle UNOP_FORTRAN_SHAPE after parsing
UNOP_INTRINSIC.
(f77_keywords): Add "shape" keyword.
* f-lang.c (fortran_array_shape): New function.
(eval_op_f_array_shape): New function.
* std-operator.def (UNOP_FORTRAN_SHAPE): New operator.
gdb/testsuite/ChangeLog:
* gdb.fortran/shape.exp: New file.
* gdb.fortran/shape.f90: New file.
Add support for the 'SIZE' keyword to the Fortran expression parser.
This returns the number of elements either in an entire array (passing
a single argument to SIZE), or in a particular dimension of an
array (passing two arguments to SIZE).
At this point I have not added support for the optional third argument
to SIZE, which controls the exact integer type of the result.
gdb/ChangeLog:
* f-exp.y (eval_op_f_array_size): Declare 1 and 2 argument forms
of this function.
(expr::fortran_array_size_1arg): New type.
(expr::fortran_array_size_2arg): Likewise.
* f-exp.y (exp): Handle FORTRAN_ARRAY_SIZE after parsing
UNOP_OR_BINOP_INTRINSIC.
(f77_keywords): Add "size" keyword.
* f-lang.c (fortran_array_size): New function.
(eval_op_f_array_size): New function, has a 1 arg and 2 arg form.
* std-operator.def (FORTRAN_ARRAY_SIZE): New operator.
gdb/testsuite/ChangeLog:
* gdb.fortran/size.exp: New file.
* gdb.fortran/size.f90: New file.
gfortran supports the RANK keyword, see:
https://gcc.gnu.org/onlinedocs/gfortran/RANK.html#RANK
this commit adds support for this keyword to GDB's Fortran expression
parser.
gdb/ChangeLog:
* f-exp.h (eval_op_f_rank): Declare.
(expr::fortran_rank_operation): New typedef.
* f-exp.y (exp): Handle UNOP_FORTRAN_RANK after parsing an
UNOP_INTRINSIC.
(f77_keywords): Add "rank" keyword.
* f-lang.c (eval_op_f_rank): New function.
* std-operator.def (UNOP_FORTRAN_RANK): New operator.
gdb/testsuite/ChangeLog:
* gdb.fortran/rank.exp: New file.
* gdb.fortran/rank.f90: New file.
When not parsing for completion, parse_expression ensures that the
resulting expression has operations. This patch removes a couple of
unnecessary checks for this situation.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* printcmd.c (set_command): Remove null check.
* value.c (init_if_undefined_command): Remove null check.
This changes var_msym_value_operation to use a bound_minimal_symbol
rather than separate minsym and objfile parameters. The main benefit
of this is removing the possibly-confusing check_objfile overload for
a plain minimal symbol.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* parse.c (parser_state::push_symbol, parser_state::push_dollar):
Update.
* p-exp.y (variable): Update.
* go-exp.y (variable): Update.
* expprint.c (dump_for_expression): Use bound_minimal_symbol.
Remove overload for objfile.
* expop.h (eval_op_var_msym_value): Use bound_minimal_symbol
parameter.
(check_objfile): Likewise.
(dump_for_expression): Likewise. Remove overload for objfile.
(class var_msym_value_operation): Use bound_minimal_symbol.
* eval.c (eval_op_var_msym_value): Use bound_minimal_symbol
parameter.
(var_msym_value_operation::evaluate_for_address)
(var_msym_value_operation::evaluate_for_sizeof)
(var_msym_value_operation::evaluate_for_cast): Update.
* d-exp.y (PrimaryExpression): Update.
* c-exp.y (variable): Update.
* ax-gdb.c (var_msym_value_operation::do_generate_ax): Update.
* ada-lang.c (ada_var_msym_value_operation::evaluate_for_cast):
Update.
* ada-exp.y (write_var_or_type): Update.
The big deletion patch left some identical namespace scopes sitting
next to one another. This patch removes the redundant "namespace
expr"s.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* eval.c: Merge "namespace" scopes.
This inlines the expr_builder constructor and release method. These
are straightforward, so this seemed simpler.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* parser-defs.h (struct expr_builder) <expr_builder>: Inline.
<release>: Inline.
* parse.c (expr_builder::expr_builder, expr_builder::release):
Remove.
The struct expression constructor no longer does any real work, so
this inlines it. The default destructor can also be used now as well.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* parse.c (expression::expression, expression::~expression):
Remove.
* expression.h (struct expression): Inline constructor. Remove
destructor.
BINOP_END is used only as a "meaningless" value in various tables.
This patch changes these to use OP_NULL instead, and removes
BINOP_END.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* std-operator.def (BINOP_END): Remove.
* p-exp.y (tokentab3, tokentab2): Use OP_NULL, not BINOP_END.
* go-exp.y (tokentab2): Use OP_NULL, not BINOP_END.
* f-exp.y (dot_ops, f77_keywords): Use OP_NULL, not BINOP_END.
* d-exp.y (tokentab2, ident_tokens): Use OP_NULL, not BINOP_END.
* c-exp.y (tokentab3, tokentab2, ident_tokens): Use OP_NULL, not
BINOP_END.
OP_UNUSED_LAST is no longer needed with C++ -- the trailing comma is
fine.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* expression.h (enum exp_opcode) <OP_UNUSED_LAST>: Remove.
OP_EXTENDED0 was only used for an assertion in the code to rewrite an
expression into prefix form. That code is gone, so this patch removes
the constant.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* std-operator.def (OP_EXTENDED0): Remove.
Several Ada expression opcodes are now unused, and can be removed.
Most of these are handled in a different way by the code.
OP_ATR_IMAGE, however, was never implemented.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* std-operator.def (OP_NAME, OP_ATR_IMAGE, OP_ATR_MODULUS)
(OP_OTHERS, OP_CHOICES, OP_POSITIONAL, OP_DISCRETE_RANGE):
Remove.
As noted in an earlier patch, Modula-2 defined some opcodes but then
never implemented them. This patch removes the unnecessary constants.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* std-operator.def (UNOP_CAP, UNOP_CHR, UNOP_ORD, UNOP_FLOAT)
(UNOP_MAX, UNOP_MIN, UNOP_ODD, UNOP_TRUNC, OP_M2_STRING): Remove.
The OP_ATR_MIN and OP_ATR_MAX constants aren't truly needed.
Internally, they are converted to BINOP_MIN and BINOP_MAX. This patch
removes them in favor of simple reuse.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* std-operator.def (OP_ATR_MIN, OP_ATR_MAX): Remove.
* ada-lang.c (ada_binop_minmax): Update.
* ada-exp.h (ada_binop_min_operation, ada_binop_max_operation):
Use BINOP_MIN and BINOP_MAX.
Now that the C parser has switched to the new style, there is no need
for the old C evaluation code. This affects some other languages that
were relying on the C code.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* go-lang.c (go_language::expression_ops): Don't declare.
* go-lang.h (class go_language) <expression_ops>: Remove.
* opencl-lang.c (evaluate_subexp_opencl, exp_descriptor_opencl):
Remove.
(class opencl_language) <expression_ops>: Remove.
* d-lang.c (class d_language) <expression_ops>: Remove.
* c-lang.h (evaluate_subexp_c, exp_descriptor_c): Don't declare.
* c-lang.c (evaluate_subexp_c, exp_descriptor_c): Remove.
(class c_language, class cplus_language, class asm_language)
(class minimal_language) <expression_ops>: Remove.
Now that the Ada parser has switched to the new style, there is no
need for the old Ada evaluation code.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (resolve_subexp, replace_operator_with_call)
(evaluate_subexp_type, assign_aggregate)
(aggregate_assign_positional, aggregate_assign_from_choices)
(aggregate_assign_others, ada_evaluate_subexp_for_cast)
(ada_evaluate_subexp, ADA_OPERATORS, ada_operator_length)
(ada_operator_check, ada_forward_operator_length)
(ada_dump_subexp_body, ada_print_subexp, ada_exp_descriptor):
Remove.
(post_parser): Update.
(class ada_language) <expresssion_ops>: Remove.
Now that the Modula-2 parser has switched to the new style, there is
no need for the old Modula-2 evaluation code.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* m2-lang.h (class m2_language) <expresssion_ops,
exp_descriptor_modula2>: Remove.
* m2-lang.c (evaluate_subexp_modula2)
(m2_language::exp_descriptor_modula2): Remove.
Now that the Fortran parser has switched to the new style, there is no
need for the old Fortran evaluation code.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* f-lang.h (class f_language) <expresssion_ops>: Remove.
<exp_descriptor_tab>: Remove.
* f-lang.c (fortran_value_subarray, evaluate_subexp_f)
(operator_length_f, print_unop_subexp_f, print_binop_subexp_f)
(print_subexp_f, dump_subexp_body_f, operator_check_f)
(f_language::exp_descriptor_tab, fortran_prepare_argument):
Remove.
Now that the Rust parser has switched to the new style, there is no
need for the old Rust evaluation code.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* rust-lang.h (class rust_language) <expression_ops,
exp_descriptor_tab>: Remove.
* rust-lang.c (rust_evaluate_funcall): Remove.
(rust_range, rust_subscript, eval_op_rust_complement): Don't use
EVAL_SKIP.
(rust_evaluate_subexp): Remove.
(rust_aggregate_operation::evaluate): Don't use EVAL_SKIP.
(rust_operator_length, rust_dump_subexp_body, rust_print_subexp)
(rust_operator_check, rust_language::exp_descriptor_tab): Remove.
This converts the Ada parser to generate operations rather than
exp_elements.
This was the most difficult of the parser conversions, partly due to
the decision to integrate Ada expression resolution into the parse,
and partly due to Ada aggregregate assignment. A couple of new
per-parse globals are introduced, along with a number of helper
functions. Resolution is done in 'ada_pop', yielding the unfortunate
rule that ada-exp.y should generally not use parser_state::pop
(exceptions are marked).
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-exp.y: Create operations.
(empty_stoken): Remove.
(ada_pop, ada_wrap, ada_addrof, ada_un_wrap2, ada_wrap2)
(ada_wrap_op, ada_wrap3, ada_funcall): New functions.
(components): New global.
(push_component, choice_component, pop_component, pop_components):
New functions.
(associations): New global
(push_association, pop_association, pop_associations): New
functions.
(ada_parse): Update.
(write_var_from_sym, write_int): Create operations.
(write_exp_op_with_string): Remove.
(write_object_renaming, write_selectors, write_ambiguous_var)
(write_var_or_type, write_name_assoc): Create operations.
* ada-lang.h (ada_index_type): Declare.
* ada-lang.c (ada_index_type): No longer static.
This converts the Fortran parser to generate operations rather than
exp_elements. A couple of tests of expression debug dumping are
updated to follow the new output.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* f-exp.y: Create operations.
(f_language::parser): Update.
gdb/testsuite/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* gdb.fortran/debug-expr.exp: Update tests.
This converts the Modula-2 parser to generate operations rather than
exp_elements.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* m2-exp.y: Create operations.
(m2_language::parser): Update.
This converts the Pascal parser to generate operations rather than
exp_elements.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* p-exp.y: Create operations.
(pascal_language::parser): Update.
This converts the D parser to generate operations rather than
exp_elements.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* d-exp.y: Create operations.
(d_parse): Update.
This converts the Go parser to generate operations rather than
exp_elements.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* go-exp.y: Create operations.
(go_language::parser): Update.
This converts the C parser to generate operations rather than
exp_elements.
One test needed a tweak in order to handle the different debugging
output.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* objc-lang.c (end_msglist): Create operations.
* c-exp.y: Change parser to create operations.
(write_destructor_name): Remove.
(c_parse): Update.
gdb/testsuite/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* gdb.base/debug-expr.exp: Update expected dump output.
This converts the Rust parser to generate operations rather than
exp_elements.
The Rust parser already made its own AST, that it then lowered to GDB
expressions. Ironically, this made conversion trickier, rather than
simpler, than the other parsers, primarily due to the way that binary
operations were lowered. Perhaps in the future, converting the Rust
parser to directly create operations while parsing would be
worthwhile.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* rust-exp.y: Create operations.
(rust_parser::convert_params_to_expression): Change return type.
(binop_maker_ftype): New typedef.
(maker_map): New global.
(rust_parser::convert_ast_to_expression): Change return type.
(rust_language::parser): Update.
(_initialize_rust_exp): Initialize maker_map.
This adds several operation-related methods to parser_state. These
methods make it more convenient to change the parsers to be
operation-based.
Because byacc has poor support for C++, a stack of operations is added
to parser_state. A parser can push operations, then later pop them
for combination into new operations. This approach avoids the memory
leaks that would result if raw pointers were used in the parsers, at
the cost of parser productions not being type-safe (they can't
indicate that they return an operation).
This also introduces analogs of some write_exp functions, like
write_exp_string_vector, write_dollar_variable, and
write_exp_symbol_reference.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* parser-defs.h (struct parser_state) <push, push_new,
push_c_string, push_symbol, push_dollar, pop, pop_vector, wrap,
wrap2>: New methods.
<m_operations>: New member.
* parse.c (parser_state::push_c_string)
(parser_state::push_symbol, parser_state::push_dollar): New
methods.
This patch adds the necessary support for field name completion for
expressions using class operation.
This patch takes an approach similar to what is done today. It might
be good, in the future, to change completion to be a method on the
base class, to enable context-sensitive completion in more areas.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* parser-defs.h (struct expr_completion_state) <expout_last_op>:
New member.
(struct parser_state) <mark_struct_expression>: New method.
* parse.c (parser_state::mark_struct_expression): Update assert.
(parser_state::mark_struct_expression): New method.
(parser_state::mark_completion_tag): Update assert.
(parse_expression_for_completion): Handle expout_last_op.
This adds an expr::operation_up to struct expression, and then
modifies various parts of GDB to use this member when it is non-null.
The list of such spots was a bit surprising to me, and found only
after writing most of the code and then noticing what no longer
compiled.
In a few spots, new accessor methods are added to operation
subclasses, so that code that dissects an expression will work with
the new scheme.
After this change, code that constructs an expression can be switched
to the new form without breaking.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-exp.h (class ada_var_value_operation) <get_symbol>: Remove;
now in superclass.
* value.h (fetch_subexp_value): Add "op" parameter.
* value.c (init_if_undefined_command): Update.
* tracepoint.c (validate_actionline, encode_actions_1): Update.
* stap-probe.c (stap_probe::compile_to_ax): Update.
* printcmd.c (set_command): Update.
* ppc-linux-nat.c (ppc_linux_nat_target::check_condition):
Update.
* parser-defs.h (struct expr_builder) <set_operation>: New
method.
* parse.c (parse_exp_in_context, exp_uses_objfile): Update.
* expression.h (struct expression) <first_opcode>: Update.
<op>: New member.
* expprint.c (dump_raw_expression, dump_prefix_expression):
Update.
* expop.h (class var_value_operation) <get_symbol>: New method.
(class register_operation) <get_name>: New method.
(class equal_operation): No longer a typedef, now a subclass.
(class unop_memval_operation) <get_type>: New method.
(class assign_operation) <get_lhs>: New method.
(class unop_cast_operation) <get_type>: New method.
* eval.c (evaluate_expression, evaluate_type)
(evaluate_subexpression_type): Update.
(fetch_subexp_value): Add "op" parameter.
(parse_and_eval_type): Update.
* dtrace-probe.c (dtrace_probe::compile_to_ax): Update.
* breakpoint.c (update_watchpoint, watchpoint_check)
(watchpoint_exp_is_const, watch_command_1): Update.
* ax-gdb.c (gen_trace_for_expr, gen_eval_for_expr, gen_printf):
Update.
After switching to the new expression implementation, there will no
need for op_string. Before deleting it, the one call outside of the
expression-printing code must be removed. That is what this patch
does.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_value_binop): Do not use op_string.
Assignment is the most complicated Ada expression, because
implementing aggregate assignment involves several specialized
opcodes.
This patch does this implementation by introducing new abstract
classes that are used to represent the various parts of aggregate
assignment. This makes the code somewhat cleaner, and, by avoiding
the over-use of 'operation' subclasses, avoids the need for dissection
using dynamic_cast (though a few are still needed here).
I believe this patch fixes a latent bug in the handling of
aggregate_assign_from_choices. That code does:
if (op == OP_DISCRETE_RANGE)
{
choice_pos += 1;
lower = value_as_long (ada_evaluate_subexp (NULL, exp, pos,
EVAL_NORMAL));
upper = value_as_long (ada_evaluate_subexp (NULL, exp, pos,
EVAL_NORMAL));
}
However, I think 'choice_pos' should be used in the calls, rather than
'pos'.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* expprint.c (dump_for_expression): New overload.
* expop.h (check_objfile, dump_for_expression): Declare new
overloads.
* ada-lang.c (check_objfile): New overload.
(assign_component, ada_aggregate_component::uses_objfile)
(ada_aggregate_component::dump, ada_aggregate_component::assign)
(ada_aggregate_component::assign_aggregate)
(ada_positional_component::uses_objfile)
(ada_positional_component::dump, ada_positional_component::assign)
(ada_discrete_range_association::uses_objfile)
(ada_discrete_range_association::dump)
(ada_discrete_range_association::assign)
(ada_name_association::uses_objfile, ada_name_association::dump)
(ada_name_association::assign)
(ada_choices_component::uses_objfile, ada_choices_component::dump)
(ada_choices_component::assign)
(ada_others_component::uses_objfile, ada_others_component::dump)
(ada_others_component::assign, ada_assign_operation::evaluate):
New methods.
* ada-exp.h (ada_string_operation) <get_name>: New method.
(class ada_assign_operation): New.
(class ada_component): New.
(ada_component_up): New typedef.
(class ada_aggregate_operation, class ada_aggregate_component)
(class ada_positional_component, class ada_others_component)
(class ada_association): New.
(ada_association_up): New typedef.
(class ada_choices_component)
(class ada_discrete_range_association)
(class ada_name_association): New.
Ada has a parser post-pass that implements "resolution". This process
replaces some opcodes with function calls. For example, a "+"
operation might be replaced with a call to the appropriate overloaded
function.
This differs from the approach taken for the same problem in C++.
However, in this series I chose not to try to make changes outside of
rewrite the expression data structure. So, resolution remains.
The new approach to resolution is to introduce an interface class,
that some concrete operations implement. Then, the Ada code will use
this to resolve the expression tree. Because new-style expressions
are built as ordinary objects, and don't require rewriting the data
structure in place, in the new code this processing will be done in
the parser. By the end of the series, some special cases in this area
that exist only for Ada will be removed.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_var_value_operation::resolve)
(ada_funcall_operation::resolve)
(ada_ternop_slice_operation::resolve): New methods.
* ada-exp.h (struct ada_resolvable): New.
(class ada_var_value_operation): Derive from ada_resolvable.
<get_block, resolve>: New methods.
(class ada_funcall_operation): Derive from ada_resolvable.
<resolve>: New method.
(class ada_ternop_slice_operation): Derive from ada_resolvable.
<resolve>: New method.
This implements function calls for Ada. This takes a different
approach than that used for other languages, primarily because Ada
requires special treatment generally. The "ordinary" special case for
just the callee didn't really apply neatly here; there's only one case
in Ada needing special callee treatment.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_funcall_operation::evaluate): New method.
* ada-exp.h (class ada_var_msym_value_operation) <get_symbol>: New
method.
(class ada_funcall_operation): New.
This adds class ada_structop_operation, which implements
STRUCTOP_STRUCT for Ada.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_structop_operation::evaluate): New method.
* ada-exp.h (class ada_structop_operation): New.
This adds class ada_unop_ind_operation, which implements UNOP_IND for
Ada.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_unop_ind_operation::evaluate): New method.
* ada-exp.h (class ada_unop_ind_operation): New.
This adds class ada_binop_exp_operation, which implements BINOP_EXP
for Ada.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_binop_exp): No longer static.
* ada-exp.h (ada_binop_exp_operation): New typedef.
This adds class ada_atr_val_operation, which implements OP_ATR_VAL.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_val_atr): No longer static.
(ada_atr_val_operation::evaluate): New method.
* ada-exp.h (class ada_atr_val_operation): New.
This adds class ada_pos_operation, a new typedef that implements
OP_ATR_POS.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_pos_atr): No longer static.
* ada-exp.h (ada_pos_operation): New typedef.
This refactors value_pos_atr to be directly usable by a new operation
implementation.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_pos_atr): Rename from value_pos_atr. Change
parameters.
(ada_evaluate_subexp): Use it.
This implement the Ada min and max operations using an existing
template class.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_binop_minmax): No longer static.
* ada-exp.h (ada_binop_min_operation, ada_binop_max_operation):
New typedefs.
This adds class ada_var_msym_value_operation, which implements
OP_VAR_MSYM_VALUE for Ada.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_var_msym_value_operation::evaluate_for_cast):
New method.
* ada-exp.h (class ada_var_msym_value_operation): New.
This adds class ada_var_value_operation, which implements OP_VAR_VALUE
for Ada.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_var_value_operation::evaluate_for_cast)
(ada_var_value_operation::evaluate): New methods.
* ada-exp.h (class ada_var_value_operation): New.
This implements a few Ada OP_ATR_ operations.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_unop_atr_operation::evaluate): New method.
* ada-exp.h (class ada_unop_atr_operation): New.
This adds class ada_binop_in_bounds, which implements BINOP_IN_BOUNDS.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_binop_in_bounds): No longer static.
* ada-exp.h (class ada_binop_in_bounds_operation): New.
This adds class ada_ternop_slice, which implements TERNOP_SLICE for
Ada.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_ternop_slice): No longer static.
* ada-exp.h (class ada_ternop_slice_operation): New.
This adds class ada_bitwise_operation, which is used to implement the
Ada bitwise operators.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-exp.h (ada_bitwise_operation): New template class.
(ada_bitwise_and_operation, ada_bitwise_ior_operation)
(ada_bitwise_xor_operation): New typedefs.
This implements the Ada equal and not-equal operators.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_equal_binop): No longer static.
* ada-exp.h (class ada_binop_equal_operation): New.
This implements the Ada multiplicative operators, using an existing
template class.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_mult_binop): No longer static.
* ada-exp.h (ada_binop_mul_operation ada_binop_div_operation)
(ada_binop_rem_operation, ada_binop_mod_operation): New typedefs.
This adds class ada_binop_addsub_operation, which implements the Ada +
and - operators.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_binop_addsub_operation::evaluate): New method.
* ada-exp.h (class ada_binop_addsub_operation): New.
This splits some Ada type resolution code out of resolve_subexp into
new functions that can be reused.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.h (ada_find_operator_symbol, ada_resolve_funcall)
(ada_resolve_variable): Declare.
* ada-lang.c (ada_find_operator_symbol, ada_resolve_funcall)
(ada_resolve_variable): New functions.
(resolve_subexp): Update.
This implements the ?: ternary conditional operator for OpenCL.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* opencl-lang.c (opencl_ternop_cond_operation::evaluate): New
method.
* c-exp.h (class opencl_ternop_cond_operation): New.
This implements "&&" and "||" for OpenCL.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* opencl-lang.c (opencl_logical_binop_operation::evaluate): New
method.
* c-exp.h (class opencl_logical_binop_operation): New.
This adds class opencl_structop_operation, which implements
STRUCTOP_STRUCT for OpenCL.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* opencl-lang.c (opencl_structop_operation::evaluate): New
method.
* c-exp.h (class opencl_structop_operation): New.
This adds the opencl_notequal_operation typedef, implementing "!=" for
OpenCL.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* opencl-lang.c (opencl_logical_not): No longer static. Change
parameters.
(evaluate_subexp_opencl): Update.
* c-exp.h (opencl_notequal_operation): New typedef.
This implements various OpenCL binary operations, adding a new
template class to do so.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* opencl-lang.c (opencl_relop, eval_opencl_assign): No longer
static. Change parameters.
(eval_opencl_assign): No longer static. Add "op" parameter.
(evaluate_subexp_opencl): Update.
* c-exp.h (opencl_binop_operation): New template class.
(opencl_assign_operation, opencl_equal_operation)
(opencl_notequal_operation, opencl_less_operation)
(opencl_gtr_operation, opencl_geq_operation)
(opencl_leq_operation): New typedefs.
This adds class opencl_cast_type_operation, which implements
UNOP_CAST_TYPE for OpenCL.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* opencl-lang.c (opencl_value_cast): No longer static.
* c-exp.h (opencl_cast_type_operation): New typedef.
This implements the Fortran ALLOCATED intrinsic.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* f-exp.h (eval_op_f_allocated): Declare.
(fortran_allocated_operation): New typedef.
* f-lang.c (eval_op_f_allocated): No longer static.
This implements the Fortran 1- and 2-argument "associated" operations.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* f-lang.c (eval_op_f_associated): New functions.
* f-exp.h (fortran_associated_1arg, fortran_associated_2arg): New
typedefs.
This adds class fortran_bound_1arg and fortran_bound_2arg, to
implement the Fortran lbound and ubound intrinsics.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* f-lang.c (fortran_bound_1arg::evaluate)
(fortran_bound_2arg::evaluate): New methods.
* f-exp.h (class fortran_bound_1arg, class fortran_bound_2arg):
New.
This adds class fortran_undetermined, which implements
OP_F77_UNDETERMINED_ARGLIST. fortran_range_operation is also added
here, as it is needed by fortran_undetermined.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* expop.h (class unop_addr_operation) <get_expression>: New
method.
* f-lang.c (fortran_undetermined::value_subarray)
(fortran_undetermined::evaluate): New methods.
(fortran_prepare_argument): New overload.
* f-exp.h (class fortran_range_operation)
(class fortran_undetermined): New classes.
This adds the special code needed to handle the Rust function call
operation.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* rust-lang.c (rust_structop::evaluate_funcall): New method.
* rust-exp.h (class rust_structop) <evaluate_funcall>: Declare
method.
This implement function call operations.
The current function call code relies on some very lengthy code
(evaluate_funcall is 398 lines...) to distinguish between the
different opcodes that might appear in the callee position.
Rather than try to replicate this, and have a function that tried to
dissect many different kinds of operation subclass, this patch instead
puts the work into the callee. A new operation::evaluate_funcall
method is added, and then this is overridden in the classes that
require special treatment.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* expression.h (class operation) <evaluate_funcall>: New methods.
* expop.h (class scope_operation) <evaluate_funcall>: New method.
(class var_value_operation) <evaluate_funcall>: New method.
(class structop_base_operation) <evaluate_funcall>: New method.
(class var_msym_value_operation) <evaluate_funcall>: New method.
(class structop_member_base): New class.
(class structop_member_operation): Derive from
structop_member_base.
(class structop_mptr_operation): Derive from
structop_member_base.
(class funcall_operation): New class.
* eval.c (operation::evaluate_funcall)
(var_value_operation::evaluate_funcall)
(scope_operation::evaluate_funcall)
(structop_member_base::evaluate_funcall)
(structop_base_operation::evaluate_funcall): New methods.
This adds class array_operation, which implements OP_ARRAY.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* expop.h (class array_operation): New.
* eval.c (array_operation::evaluate_struct_tuple)
(array_operation::evaluate): New methods.
This adds class adl_func_operation, which implements
argument-dependent lookup function calls.
Other function calls will be handled in a different way. However,
because ADL calls were created in a single spot in the C++ parser, and
because they had different semantics from the other cases, it was
convenient to treat them specially.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* expop.h (class adl_func_operation): New.
* eval.c (adl_func_operation::evaluate): New method.
This adds class ada_unop_range_operation, which implements
UNOP_IN_RANGE.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_unop_in_range): No longer static.
* ada-exp.h (class ada_unop_range_operation): New.
This implements a few Ada unary operations, using the existing
unop_operation template class.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_unop_neg, ada_atr_tag, ada_atr_size, ada_abs):
No longer static.
* ada-exp.h (ada_neg_operation, ada_atr_tag_operation)
(ada_atr_size_operation, ada_abs_operation): New typedefs.
This adds a couple of simple Modula-2 operations.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* m2-lang.c (eval_op_m2_high, eval_op_m2_subscript): No longer
static.
* m2-exp.h: New file.
This adds class rust_aggregate_operation, which implements
OP_AGGREGATE for Rust.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* rust-lang.c (rust_aggregate_operation::evaluate): New method.
* rust-exp.h (class rust_aggregate_operation): New.
This implements the field operations STRUCTOP_STRUCT and
STRUCTOP_ANONYMOUS, for Rust.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* rust-lang.c (eval_op_rust_struct_anon, eval_op_rust_structop):
No longer static.
* rust-exp.h (class rust_struct_anon): New.
(class rust_structop): New.
This adds class rust_range_operation, which implements OP_RANGE.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* rust-lang.c (rust_range): No longer static.
* rust-exp.h (class rust_range_operation): New.