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 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 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 class ada_ternop_range_operation, which implements
TERNOP_IN_RANGE.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_ternop_range_operation::evaluate): New method.
* ada-exp.h (class ada_ternop_range_operation): New.
This adds class ada_qual_operation, which implements UNOP_QUAL.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_qual_operation::evaluate): New method.
* ada-exp.h (class ada_qual_operation): New.
This adds class ada_string_operation, which implements string
constants for Ada.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_string_operation::evaluate): New method.
* ada-exp.h (class ada_string_operation): New.
This adds class ada_wrapped_operation, which is used to wrap some
generic operations with a bit of Ada-specific handling. This
corresponds to the old "default" case in ada_evaluate_subexp.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_wrapped_operation::evaluate): New method.
* ada-exp.h: New file.
This splits BINOP_EXP into a new function for future use.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_binop_exp): New function.
(ada_evaluate_subexp): Use it.
This renames value_val_atr to ada_val_atr, changing its parameters to
more closely mirror other expression helpers. The
EVAL_AVOID_SIDE_EFFECTS case is moved into this function as well.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_val_atr): Rename from value_val_atr. Change
parameters.
(ada_evaluate_subexp): Use it.
This splits OP_ATR_MIN and OP_ATR_MAX into a new function for future
use.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_binop_minmax): New function.
(ada_evaluate_subexp): Use it.
This splits some Ada attribute operations into a new function for
future use.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_unop_atr): New function.
(ada_evaluate_subexp): Use it.
This splits BINOP_IN_BOUNDS into a new function for future use.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_binop_in_bounds): New function.
(ada_evaluate_subexp): Use it.
This splits TERNOP_SLICE into a new function for future use.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_ternop_slice): New function.
(ada_evaluate_subexp): Use it.
This splits BINOP_EQUAL and BINOP_NOTEQUAL into a new function for
future use.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_equal_binop): New function.
(ada_evaluate_subexp): Use it.
This splits BINOP_MUL into a new function for future use.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_mult_binop): New function.
(ada_evaluate_subexp): Use it.
This splits UNOP_ABS into a new function for future use.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_abs): New function.
(ada_evaluate_subexp): Use it.
This splits OP_ATR_SIZE into a new function for future use.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_atr_size): New function.
(ada_evaluate_subexp): Use it.
This splits OP_ATR_TAG into a new function for future use.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_atr_tag): New function.
(ada_evaluate_subexp): Use it.
This splits UNOP_IN_RANGE into a new function for future use.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_unop_in_range): New function.
(ada_evaluate_subexp): Use it.
This splits UNOP_NEG into a new function for future use.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (ada_unop_neg): New function.
(ada_evaluate_subexp): Use it.
This splits TERNOP_IN_RANGE into a new function for future use.
gdb/ChangeLog
2021-03-08 Tom Tromey <tom@tromey.com>
* ada-lang.c (eval_ternop_in_range): New function.
(ada_evaluate_subexp): Use it.
An earlier patch of mine introduced a build failure in ada-lang.c. A
couple of "to_string" calls were not namespace-qualified. In the
failing setup, the std string_view is being used, and so (apparently)
ADL doesn't find gdb::to_string.
This patch, from the bug, fixes the problem.
gdb/ChangeLog
2021-03-06 Chernov Sergey <klen_s@mail.ru>
PR gdb/27528:
* ada-lang.c (ada_fold_name): Use gdb::to_string.
Christian suggested switching an "int" in ada-lang.c to "bool"
instead. This patch makes this change. Tested on x86-64 Fedora 32.
gdb/ChangeLog
2021-03-04 Tom Tromey <tromey@adacore.com>
* ada-lang.c (struct match_data) <found_sym>: Now bool.
(aux_add_nonlocal_symbols): Update.
(ada_add_block_symbols): Change "found_sym" to bool.
This patch addresses some review comments that I forgot to deal with
in an earlier patch. See the comments here:
https://sourceware.org/pipermail/gdb-patches/2021-February/176278.html
For the most part this is fixing up comments, but it also includes
adding a constructor and initializers to "match_data".
Regression tested on x86-64 Fedora 32.
gdb/ChangeLog
2021-03-03 Tom Tromey <tromey@adacore.com>
* ada-lang.c (ada_resolve_function): Update comment.
(is_nonfunction, add_symbols_from_enclosing_procs)
(remove_extra_symbols): Likewise.
(struct match_data): Add constructor, initializers.
(add_nonlocal_symbols): Remove memset.
(aux_add_nonlocal_symbols): Update comment.
(ada_add_block_renamings, add_nonlocal_symbols)
(ada_add_all_symbols): Likewise.
* ada-exp.y (write_var_or_type): Clean up trailing whitespace.
gdb currently supports two different styles of fixed-point. The
original style, where fixed point types are "GNAT encoded", is handled
primarily in the Ada code. The newer style, encoded using DWARF, is
handled by the core of gdb.
This patch changes gdb to read the GNAT encodings in the DWARF reader
as well. This removes some code and unifies the two paths. As a
result, GNAT-encoded fixed-point now works a bit better.
One possible drawback of this change is that, if someone uses stabs,
then fixed-point might now stop working. I consider stabs to be fully
obsolete, though, so I don't intend to address this.
gdb/ChangeLog
2021-03-02 Tom Tromey <tromey@adacore.com>
* ada-lang.c (cast_from_gnat_encoded_fixed_point_type)
(cast_to_gnat_encoded_fixed_point_type): Remove.
(ada_value_cast, ada_evaluate_subexp): Update.
(gnat_encoded_fixed_point_type_info)
(ada_is_gnat_encoded_fixed_point_type)
(gnat_encoded_fixed_point_delta)
(gnat_encoded_fixed_point_scaling_factor): Remove.
* ada-lang.h (ada_is_gnat_encoded_fixed_point_type)
(gnat_encoded_fixed_point_delta)
(gnat_encoded_fixed_point_scaling_factor): Don't declare.
* ada-typeprint.c (print_gnat_encoded_fixed_point_type): Remove.
(ada_print_type): Update.
* ada-valprint.c (ada_value_print_num): Update.
* dwarf2/read.c (ada_get_gnat_encoded_number)
(ada_get_gnat_encoded_ratio): New functions.
(finish_fixed_point_type): Use them. Add parameters.
(GNAT_FIXED_POINT_SUFFIX): New define.
(gnat_encoded_fixed_point_type_info): New function.
(read_base_type): Handle gnat encodings.
gdb/testsuite/ChangeLog
2021-03-02 Tom Tromey <tromey@adacore.com>
* gdb.ada/fixed_points.exp: Remove most special cases for minimal
encodings.
This removes the "GROW_VECT" macro and helper function in favor of
simply using std::string in a few spots.
gdb/ChangeLog
2021-03-02 Tom Tromey <tromey@adacore.com>
* ada-lang.c (ada_fold_name, ada_variant_discrim_name)
(ada_enum_name, scan_discrim_bound, to_fixed_range_type): Use
std::string.
(GROW_VECT): Remove.
(grow_vect): Remove.
This changes ada_lookup_symbol_list to return a std::vector, and
changes various other helper functions to follow. This simplifies the
code, and makes it more type-safe (by using a vector where an obstack
had been used).
gdb/ChangeLog
2021-03-02 Tom Tromey <tromey@adacore.com>
* ada-lang.h (ada_lookup_symbol_list): Return a vector.
* ada-lang.c (resolve_subexp): Update.
(ada_resolve_function): Accept a vector.
(is_nonfunction, add_defn_to_vec)
(add_symbols_from_enclosing_procs): Likewise.
(num_defns_collected, defns_collected): Remove.
(remove_extra_symbols): Return a vector.
(remove_irrelevant_renamings): Return void.
(ada_add_local_symbols): Accept a vector.
(struct match_data) <obstackp>: Remove.
<resultp>: New member.
(aux_add_nonlocal_symbols): Update.
(ada_add_block_renamings, add_nonlocal_symbols)
(ada_add_all_symbols): Accept a vector.
(ada_lookup_symbol_list_worker, ada_lookup_symbol_list): Return a
vector.
(ada_lookup_symbol): Update.
(ada_add_block_symbols): Accept a vector.
(get_var_value, iterate_over_symbols): Update.
* ada-exp.y (block_lookup, write_var_or_type, write_name_assoc):
Update.
This changes resolve_subexp to use any_of and the erase-remove idiom
to simplify the code somewhat. This simplifies the next patch a bit.
gdb/ChangeLog
2021-03-02 Tom Tromey <tromey@adacore.com>
* ada-lang.c (resolve_subexp): Use any_of and erase-remove idiom.
This changes the ada_symbol_cache to be allocated with 'new' and
managed via unique_ptr. This simplifies the code somewhat. Also,
ada_clear_symbol_cache is changed so that it does not allocate a
symbol cache just to clear it.
gdb/ChangeLog
2021-03-02 Tom Tromey <tromey@adacore.com>
* ada-lang.c (struct ada_symbol_cache) <cache_space>: Now an
auto_obstack.
<root>: Initialize.
(ada_pspace_data): Remove destructor.
<sym_cache>: Now a unique_ptr.
(ada_init_symbol_cache, ada_free_symbol_cache): Remove.
(ada_get_symbol_cache): Use 'new'.
(ada_clear_symbol_cache): Rewrite.
Most places in gdb that reference objfile->sf also check that it is
not null. It is valid for it to be null, because find_sym_fns can
return null for some kinds of object file. However, it's rare to
encounter this scenario with Ada code. I only encountered it when
looking at a fork of gdb that, I believe, makes its own objfiles
without setting 'sf'.
This patch changes ada-lang.c to check this field before using it.
This avoids any potential crash here. There's no test case because
I'm not even sure this is possible to trip over with an unmodified
gdb.
There are some other unchecked uses in gdb, but at a quick glance they
all seem to be involved with symbol reading, which of course won't
happen when sf==null.
gdb/ChangeLog
2021-03-02 Tom Tromey <tromey@adacore.com>
* ada-lang.c (add_nonlocal_symbols): Handle case where objfile->sf
is null.
This commit fixes a libstdc++ assertion failure encountered when
running gdb.base/completion.exp. In order to see this problem,
GDB must be built with the follow CFLAGS and CXXFLAGS as part
of the configure line:
CFLAGS='-D_GLIBCXX_DEBUG' CXXFLAGS='-D_GLIBCXX_DEBUG'
(Also, this problem was encountered using Fedora rawhide. It might
not be reproducible in Fedora versions prior to Fedora 34.)
Using the gdb.base/completion.exp test program, the problem can be
observed as follows:
[kev@rawhide-1 gdb]$ ./gdb -q testsuite/outputs/gdb.base/completion/completion
Reading symbols from testsuite/outputs/gdb.base/completion/completion...
(gdb) start
Temporary breakpoint 1 at 0x401179: file ../../worktree-master/gdb/testsuite/gdb.base/break.c, line 43.
Starting program: testsuite/outputs/gdb.base/completion/completion
Temporary breakpoint 1, main (argc=1, argv=0x7fffffffd718, envp=0x7fffffffd728) at ../../worktree-master/gdb/testsuite/gdb.base/break.c:43
43 if (argc == 12345) { /* an unlikely value < 2^16, in case uninited */ /* set breakpoint 6 here */
(gdb) p <TAB>/usr/include/c++/11/string_view:211: constexpr const value_type& std::basic_string_view<_CharT, _Traits>::operator[](std::basic_string_view<_CharT, _Traits>::size_type) const [with _CharT = char; _Traits = std::char_traits<char>; std::basic_string_view<_CharT, _Traits>::const_reference = const char&; std::basic_string_view<_CharT, _Traits>::size_type = long unsigned int]: Assertion '__pos < this->_M_len' failed.
Aborted (core dumped)
(Note that I added "<TAB>" to make it clear where the tab key was
pressed.)
gdb/ChangeLog:
* ada-lang.c (ada_fold_name): Check for non-empty string prior
to accessing it.
(ada_lookup_name_info): Likewise.
With a certain Ada program, ada-lang.c:coerce_unspec_val_to_type can
cause a crash. This function may copy a value, and in the particular
case in the crash, the new value's type is smaller than the original
type. This causes coerce_unspec_val_to_type to create a lazy value --
but the original value is also not_lval, so later, when the value is
un-lazied, gdb asserts.
As with the previous patch, we believe there is a compiler bug here,
but it is difficult to reproduce, so we're not completely certain.
In the particular case we saw, the original value has record type, and
the record holds some variable-length arrays. This leads to the
type's length being 0. At the same time, the value is optimized out.
This patch changes coerce_unspec_val_to_type to handle an
optimized-out value correctly.
It also slightly restructures this code to avoid a crash should a
not_lval value wind up here. This is a purely defensive change.
This change also made it clear that value_contents_copy_raw can now be
made static, so that is also done.
gdb/ChangeLog
2021-02-09 Tom Tromey <tromey@adacore.com>
* ada-lang.c (coerce_unspec_val_to_type): Avoid making lazy
not_lval value.
* value.c (value_contents_copy_raw): Now static.
* value.h (value_contents_copy_raw): Don't declare.
I think this makes the names of the methods clearer, especially for the
arch. The type::arch method (which gets the arch owner, or NULL if the
type is not arch owned) is easily confused with the get_type_arch method
(which returns an arch no matter what). The name "arch_owner" will make
it intuitive that the method returns NULL if the type is not arch-owned.
Also, this frees the type::arch name, so we will be able to morph the
get_type_arch function into the type::arch method.
gdb/ChangeLog:
* gdbtypes.h (struct type) <arch>: Rename to...
<arch_owner>: ... this, update all users.
<objfile>: Rename to...
<objfile_owner>: ... this, update all users.
Change-Id: Ie7c28684c7b565adec05a7619c418c69429bd8c0
A user noticed that the Ada expression code in gdb did not
automatically disambiguate an enumerator in an array context. That
is, an expression like "print array(enumerator)" is not ambiguous,
even if "enumerator" is declared in multiple enumerations, because the
correct one can be found by examining the array's index type.
This patch changes the Ada expression resolution code to handle this
case.
gdb/ChangeLog
2021-01-25 Tom Tromey <tromey@adacore.com>
* ada-lang.c (resolve_subexp): Handle array context.
gdb/testsuite/ChangeLog
2021-01-25 Tom Tromey <tromey@adacore.com>
* gdb.ada/local-enum.exp: Add enumerator resolution test.