binutils-gdb.git
3 years agogdb/fortran: add support for 'SIZE' keyword
Andrew Burgess [Thu, 25 Feb 2021 16:15:52 +0000 (16:15 +0000)]
gdb/fortran: add support for 'SIZE' keyword

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.

3 years agogdb/fortran: add support for RANK keyword
Andrew Burgess [Thu, 25 Feb 2021 11:41:57 +0000 (11:41 +0000)]
gdb/fortran: add support for RANK keyword

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.

3 years agox86: fold some prefix related attributes into a single one
Jan Beulich [Tue, 9 Mar 2021 07:54:32 +0000 (08:54 +0100)]
x86: fold some prefix related attributes into a single one

RepPrefixOk, HLEPrefixOk, and NoTrackPrefixOk can't be specified
together, so can share an enum-like field. IsLockable can be inferred
from HLE setting and hence only needs specifying when neither of them
is present.

3 years agox86-64: make SYSEXIT handling similar to SYSRET's
Jan Beulich [Tue, 9 Mar 2021 07:53:38 +0000 (08:53 +0100)]
x86-64: make SYSEXIT handling similar to SYSRET's

Despite SYSEXIT being an Intel-only insn in long mode, its behavior
there is similar to SYSRET's: Depending on REX.W execution continues in
either 64-bit or compatibility mode. Hence distinguishing by suffix is
as necessary here as it is there.

3 years agobfd: don't silently wrap or truncate PE image section RVAs
Jan Beulich [Tue, 9 Mar 2021 07:52:32 +0000 (08:52 +0100)]
bfd: don't silently wrap or truncate PE image section RVAs

In PE images section addresses get expressed as addresses relative to
the image base. Therefore the VA of a section must be no less than the
image base, and after subtraction of the image base the resulting value
should fit in 32 bits. (The issue is particularly obvious to notice when
sections, perhaps because of ELF assumptions, get placed at VA 0 by
default. Debugging info sections as well as .comment, when input files
are ELF, are a good example. All such sections need proper mentioning in
the linker script to avoid this warning.)

There are a number of test cases which previously produced bogus images,
yet still declared the test a success. Like done for other tests
already, force a zero image base for these. This then also allows (and
requires) dropping again xfail-s which 39a7b38fac0e ("Fix linker tests
to work with 16-bit targets") had added to ld-scripts/default-script*.d
(originally as skip-s). This also depends on similar adjustments to
testsuite/ld-scripts/map-address.* made by an earlier patch.

For ld-scripts/print-memory-usage.* I suppose xcoff could be dropped
from the exclusion list by suppressing garbage collection, just like
already done in e.g. (as seen in the diff here) ld-scripts/data.*, but I
didn't want to make unrelated adjustments.

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

3 years agoEnable maintainer mode for sim
Tom Tromey [Mon, 8 Mar 2021 14:48:20 +0000 (07:48 -0700)]
Enable maintainer mode for sim

The sim's recently switch to using Automake caused a build failure for
me, because I didn't have the correct auto* tools in my path.
However, the rule in the tree is that this is not needed in general.
This patch adds a call to AM_MAINTAINER_MODE, to align the sim with
the way the rest of the tree works here.

sim/ChangeLog
2021-03-08  Tom Tromey  <tromey@adacore.com>

* aclocal.m4, configure, Makefile.in: Rebuild.
* configure.ac: Use AM_MAINTAINER_MODE.

3 years agoRemove some null checks
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Remove some null checks

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.

3 years agoUse bound_minimal_symbol in var_msym_value_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Use bound_minimal_symbol in var_msym_value_operation

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.

3 years agoChange exp_uses_objfile to return bool
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Change exp_uses_objfile to return bool

This change exp_uses_objfile to return bool.

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

* parser-defs.h (exp_uses_objfile): Return bool.
* parse.c (exp_uses_objfile): Return bool.

3 years agoRemove EVAL_SKIP
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Remove EVAL_SKIP

EVAL_SKIP was needed in the old expression implementation due to its
linearized tree structure.  This is not needed in the new
implementation, because it is trivial to not evaluate a subexpression.
This patch removes the last vestiges of EVAL_SKIP.

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

* value.h (eval_skip_value): Don't declare.
* opencl-lang.c (eval_opencl_assign): Update.
* m2-lang.c (eval_op_m2_high, eval_op_m2_subscript): Update.
* f-lang.c (eval_op_f_abs, eval_op_f_mod, eval_op_f_ceil)
(eval_op_f_floor, eval_op_f_modulo, eval_op_f_cmplx): Remove.
* expression.h (enum noside) <EVAL_SKIP>: Remove.
* expop.h (typeof_operation::evaluate)
(decltype_operation::evaluate, unop_addr_operation::evaluate)
(unop_sizeof_operation::evaluate, assign_operation::evaluate)
(cxx_cast_operation::evaluate): Update.
* eval.c (eval_skip_value): Remove.
(eval_op_scope, eval_op_var_entry_value)
(eval_op_func_static_var, eval_op_string, eval_op_objc_selector)
(eval_op_concat, eval_op_ternop, eval_op_structop_struct)
(eval_op_structop_ptr, eval_op_member, eval_op_add, eval_op_sub)
(eval_op_binary, eval_op_subscript, eval_op_equal)
(eval_op_notequal, eval_op_less, eval_op_gtr, eval_op_geq)
(eval_op_leq, eval_op_repeat, eval_op_plus, eval_op_neg)
(eval_op_complement, eval_op_lognot, eval_op_ind)
(eval_op_memval, eval_op_preinc, eval_op_predec)
(eval_op_postinc, eval_op_postdec, eval_op_type)
(eval_binop_assign_modify, eval_op_objc_msgcall)
(eval_multi_subscript, logical_and_operation::evaluate)
(logical_or_operation::evaluate, array_operation::evaluate)
(operation::evaluate_for_cast)
(var_msym_value_operation::evaluate_for_cast)
(var_value_operation::evaluate_for_cast): Update.
* c-lang.c (c_string_operation::evaluate): Update.
* c-exp.h (objc_nsstring_operation::evaluate)
(objc_selector_operation::evaluate): Update.
* ada-lang.c (ada_assign_operation::evaluate)
(eval_ternop_in_range, ada_unop_neg, ada_unop_in_range)
(ada_atr_size): Update.

3 years agoMerge namespace scopes in eval.c
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Merge namespace scopes in eval.c

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.

3 years agoInline expr_builder methods
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Inline expr_builder methods

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.

3 years agoInline expression constructor
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Inline expression constructor

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.

3 years agoRemove BINOP_END
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Remove BINOP_END

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.

3 years agoRemove OP_UNUSED_LAST
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Remove OP_UNUSED_LAST

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.

3 years agoRemove OP_EXTENDED0
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Remove OP_EXTENDED0

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.

3 years agoRemove unused Ada opcodes
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Remove unused Ada opcodes

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.

3 years agoRemove unused Modula-2 opcodes
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Remove unused Modula-2 opcodes

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.

3 years agoRemove two Ada opcodes
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Remove two Ada opcodes

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.

3 years agoRemove union exp_element
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Remove union exp_element

This removes union exp_element functions that either create such
elements or walk them.  struct expression no longer holds
exp_elements.  A couple of language_defn methods are also removed, as
they are obsolete.

Note that this patch also removes the print_expression code.  The only
in-tree caller of this was from dump_prefix_expression, which is only
called when expression debugging is enabled.  Implementing this would
involve a fair amount of code, and it seems to me that prefix dumping
is preferable anyway, as it is unambiguous.  So, I have not
reimplemented this feature.

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

* value.h (evaluate_subexp_with_coercion): Don't declare.
* parse.c (exp_descriptor_standard): Remove.
(expr_builder::expr_builder, expr_builder::release): Update.
(expression::expression): Remove size_t parameter.
(expression::~expression): Simplify.
(expression::resize): Remove.
(write_exp_elt, write_exp_elt_opcode, write_exp_elt_sym)
(write_exp_elt_msym, write_exp_elt_block, write_exp_elt_objfile)
(write_exp_elt_longcst, write_exp_elt_floatcst)
(write_exp_elt_type, write_exp_elt_intern, write_exp_string)
(write_exp_string_vector, write_exp_bitstring): Remove.
* p-lang.h (class pascal_language) <opcode_print_table,
op_print_tab>: Remove.
* p-lang.c (pascal_language::op_print_tab): Remove.
* opencl-lang.c (class opencl_language) <opcode_print_table>:
Remove.
* objc-lang.c (objc_op_print_tab): Remove.
(class objc_language) <opcode_print_table>: Remove.
* m2-lang.h (class m2_language) <opcode_print_table,
op_print_tab>: Remove.
* m2-lang.c (m2_language::op_print_tab): Remove.
* language.h (struct language_defn) <post_parser, expression_ops,
opcode_print_table>: Remove.
* language.c (language_defn::expression_ops)
(auto_or_unknown_language::opcode_print_table): Remove.
* go-lang.h (class go_language) <opcode_print_table,
op_print_tab>: Remove.
* go-lang.c (go_language::op_print_tab): Remove.
* f-lang.h (class f_language) <opcode_print_table>: Remove
<op_print_tab>: Remove.
* f-lang.c (f_language::op_print_tab): Remove.
* expression.h (union exp_element): Remove.
(struct expression): Remove size_t parameter from constructor.
<resize>: Remove.
<first_opcode>: Update.
<nelts, elts>: Remove.
(EXP_ELEM_TO_BYTES, BYTES_TO_EXP_ELEM): Remove.
(evaluate_subexp_standard, print_expression, op_string)
(dump_raw_expression): Don't declare.
* expprint.c (print_expression, print_subexp)
(print_subexp_funcall, print_subexp_standard, op_string)
(dump_raw_expression, dump_subexp, dump_subexp_body)
(dump_subexp_body_funcall, dump_subexp_body_standard): Remove.
(dump_prefix_expression): Update.
* eval.c (evaluate_subexp): Remove.
(evaluate_expression, evaluate_type): Update.
(evaluate_subexpression_type): Remove.
(fetch_subexp_value): Remove "pc" parameter.  Update.
(extract_field_op, evaluate_struct_tuple, evaluate_funcall)
(evaluate_subexp_standard, evaluate_subexp_for_address)
(evaluate_subexp_with_coercion, evaluate_subexp_for_sizeof)
(evaluate_subexp_for_cast): Remove.
(parse_and_eval_type): Update.
* dtrace-probe.c (dtrace_probe::compile_to_ax): Update.
* d-lang.c (d_op_print_tab): Remove.
(class d_language) <opcode_print_table>: Remove.
* c-lang.h (c_op_print_tab): Don't declare.
* c-lang.c (c_op_print_tab): Remove.
(class c_language, class cplus_language, class asm_language, class
minimal_language) <opcode_print_table>: Remove.
* breakpoint.c (update_watchpoint, watchpoint_check)
(watchpoint_exp_is_const, watch_command_1): Update.
* ax-gdb.h (union exp_element): Don't declare.
* ax-gdb.c (const_var_ref, const_expr, maybe_const_expr)
(gen_repeat, gen_sizeof, gen_expr_for_cast, gen_expr)
(gen_expr_binop_rest): Remove.
(gen_trace_for_expr, gen_eval_for_expr, gen_printf): Update.
* ada-lang.c (ada_op_print_tab): Remove.
(class ada_language) <post_parser, opcode_print_table>: Remove.

3 years agoRemove now-unused C evaluator code
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Remove now-unused C evaluator code

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.

3 years agoRemove now-unused Ada evaluator code
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Remove now-unused Ada evaluator code

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.

3 years agoRemove now-unused Modula-2 evaluator code
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Remove now-unused Modula-2 evaluator code

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.

3 years agoRemove now-unused Fortran evaluator code
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Remove now-unused Fortran evaluator code

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.

3 years agoRemove now-unused Rust evaluator code
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Remove now-unused Rust evaluator code

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.

3 years agoConvert ada-exp.y to use operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Convert ada-exp.y to use operations

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.

3 years agoConvert f-exp.y to use operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Convert f-exp.y to use operations

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.

3 years agoConvert m2-exp.y to use operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Convert m2-exp.y to use operations

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.

3 years agoConvert p-exp.y to use operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Convert p-exp.y to use operations

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.

3 years agoConvert d-exp.y to use operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Convert d-exp.y to use operations

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.

3 years agoConvert go-exp.y to use operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Convert go-exp.y to use operations

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.

3 years agoConvert c-exp.y to use operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Convert c-exp.y to use operations

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.

3 years agoConvert rust-exp.y to use operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Convert rust-exp.y to use operations

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.

3 years agoConvert stap probes to create operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Convert stap probes to create operations

This changes the stap probe code to create operations, rather than
exp_elements.

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

* stap-probe.c (binop_maker_ftype): New typedef.
(stap_maker_map): New global.
(stap_make_binop): New function.
(stap_parse_register_operand): Return operation_up.
(stap_parse_single_operand, stap_parse_argument_conditionally)
(stap_parse_argument_1): Likewise.
(stap_parse_argument): Create operations.
(stap_probe::parse_arguments): Update.
(_initialize_stap_probe): Initialize stap_maker_map.
* ppc-linux-tdep.c (ppc_stap_parse_special_token): Change return
type.
* i386-tdep.h (i386_stap_parse_special_token): Change return
type.
* i386-tdep.c (i386_stap_parse_special_token_triplet)
(i386_stap_parse_special_token_three_arg_disp)
(i386_stap_parse_special_token): Change return type.
* gdbarch.sh (stap_parse_special_token): Change return type.
* gdbarch.c: Rebuild.
* gdbarch.h: Rebuild.
* arm-linux-tdep.c (arm_stap_parse_special_token): Change return
type.
* aarch64-linux-tdep.c (aarch64_stap_parse_special_token): Change
return type.

3 years agoConvert dtrace probes to use operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Convert dtrace probes to use operations

This changes dtrace to use the new operation type.

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

* gdbarch.sh (dtrace_parse_probe_argument): Change return type.
* gdbarch.h: Rebuild.
* gdbarch.c: Rebuild.
* dtrace-probe.c (dtrace_probe::build_arg_exprs): Update.
* amd64-linux-tdep.c (amd64_dtrace_parse_probe_argument): Change
return type.
(amd64_dtrace_parse_probe_argument): Update.

3 years agoAdd operation-related methods to parser_state
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Add operation-related methods to parser_state

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.

3 years agoAdd completion for operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Add completion for operations

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.

3 years agoAdd an expr::operation_up to struct expression
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Add an expr::operation_up to struct expression

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.

3 years agoRemove use of op_string
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Remove use of op_string

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.

3 years agoImplement Ada assignment
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement Ada assignment

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.

3 years agoImplement Ada resolution
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement Ada resolution

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.

3 years agoImplement function calls for Ada
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement function calls for Ada

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.

3 years agoIntroduce ada_structop_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_structop_operation

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.

3 years agoIntroduce ada_unop_ind_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_unop_ind_operation

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.

3 years agoIntroduce ada_binop_exp_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_binop_exp_operation

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.

3 years agoIntroduce ada_atr_val_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_atr_val_operation

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.

3 years agoIntroduce ada_pos_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_pos_operation

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.

3 years agoRefactor value_pos_atr
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Refactor value_pos_atr

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.

3 years agoImplement Ada min and max operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement Ada min and max operations

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.

3 years agoIntroduce ada_var_msym_value_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_var_msym_value_operation

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.

3 years agoIntroduce ada_var_value_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_var_value_operation

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.

3 years agoImplement some Ada OP_ATR_ operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement some Ada OP_ATR_ operations

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.

3 years agoIntroduce ada_binop_in_bounds
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_binop_in_bounds

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.

3 years agoIntroduce ada_ternop_slice
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_ternop_slice

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.

3 years agoIntroduce ada_bitwise_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_bitwise_operation

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.

3 years agoImplement Ada equality operators
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement Ada equality operators

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.

3 years agoImplement Ada multiplicative operators
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement Ada multiplicative operators

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.

3 years agoIntroduce ada_binop_addsub_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_binop_addsub_operation

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.

3 years agoSplit out some Ada type resolution code
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Split out some Ada type resolution code

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.

3 years agoImplement OpenCL ternary conditional operator
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement OpenCL ternary conditional operator

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.

3 years agoImplement OpenCL logical binary operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement OpenCL logical binary operations

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.

3 years agoIntroduce opencl_structop_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce opencl_structop_operation

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.

3 years agoIntroduce opencl_notequal_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce opencl_notequal_operation

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.

3 years agoImplement OpenCL binary operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement OpenCL binary operations

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.

3 years agoIntroduce opencl_cast_type_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce opencl_cast_type_operation

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.

3 years agoImplement fortran_allocated_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement fortran_allocated_operation

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.

3 years agoImplement Fortran associated operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement Fortran associated operations

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.

3 years agoIntroduce classes for Fortran bound intrinsics
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce classes for Fortran bound intrinsics

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.

3 years agoIntroduce fortran_undetermined
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce fortran_undetermined

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.

3 years agoImplement Rust funcall operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement Rust funcall operation

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.

3 years agoImplement function call operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement function call operations

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.

3 years agoIntroduce array_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce array_operation

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.

3 years agoIntroduce class adl_func_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce class adl_func_operation

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.

3 years agoIntroduce ada_unop_range_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_unop_range_operation

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.

3 years agoImplement some Ada unary operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement some Ada unary operations

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.

3 years agoImplement the "&&" and "||" operators
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement the "&&" and "||" operators

This implements the "&&" and "||" operators.

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

* expop.h (class logical_and_operation)
(class logical_or_operation): New.
* eval.c (logical_and_operation::evaluate)
(logical_or_operation::evaluate): New methods.
* ax-gdb.c (logical_and_operation::do_generate_ax)
(logical_or_operation::do_generate_ax): New methods.

3 years agoAdd two simple Modula-2 operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Add two simple Modula-2 operations

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.

3 years agoIntroduce rust_aggregate_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce rust_aggregate_operation

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.

3 years agoImplement Rust field operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement Rust field operations

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.

3 years agoIntroduce rust_range_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce rust_range_operation

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.

3 years agoIntroduce rust_subscript_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce rust_subscript_operation

This adds class rust_subscript_operation, which implements
BINOP_SUBSCRIPT for Rust.

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

* rust-lang.c (rust_subscript): No longer static.
* rust-exp.h (class rust_subscript_operation): New.

3 years agoIntroduce rust_unop_ind_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce rust_unop_ind_operation

This adds class rust_unop_ind_operation, which implements UNOP_IND for
Rust.  Rust requires a special case here to handle trait objects.

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

* rust-lang.c (eval_op_rust_ind): No longer static.  Add "opcode"
parameter.
(rust_evaluate_subexp): Update.
* rust-exp.h (class rust_unop_ind_operation): New.

3 years agoImplement some Rust operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement some Rust operations

This implements some straightforward Rust operations, using existing
template classes.

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

* rust-lang.c (eval_op_rust_complement, eval_op_rust_array): No
longer static.  Add "opcode" parameter.
(rust_evaluate_subexp): Update.
* rust-exp.h: New file.

3 years agoImplement several Fortran operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement several Fortran operations

This implements several straightforward Fortran operations, primarily
by reusing existing template classes.

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

* f-lang.c (eval_op_f_abs, eval_op_f_mod, eval_op_f_ceil)
(eval_op_f_floor, eval_op_f_modulo, eval_op_f_cmplx)
(eval_op_f_kind): No longer static.  Add "opcode" parameter.
(evaluate_subexp_f): Update.
* f-exp.h: New file.

3 years agoIntroduce ada_ternop_range_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_ternop_range_operation

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.

3 years agoIntroduce ada_qual_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_qual_operation

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.

3 years agoIntroduce ada_string_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_string_operation

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.

3 years agoIntroduce ada_wrapped_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce ada_wrapped_operation

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.

3 years agoIntroduce multi_subscript_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce multi_subscript_operation

This adds class multi_subscript_operation, which implements
MULTI_SUBSCRIPT.

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

* expop.h (class multi_subscript_operation): New.
* eval.c (multi_subscript_operation::evaluate): New method.

3 years agoIntroduce objc_msgcall_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce objc_msgcall_operation

This adds class objc_msgcall_operation, which implements
OP_OBJC_MSGCALL.

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

* eval.c (objc_msgcall_operation::evaluate): New method.
* c-exp.h (class objc_msgcall_operation): New.

3 years agoIntroduce var_value_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce var_value_operation

This adds class var_value_operation, which implements OP_VAR_VALUE.

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

* expop.h (class var_value_operation): New.
* eval.c (var_value_operation::evaluate)
(var_value_operation::evaluate_for_address)
(var_value_operation::evaluate_with_coercion)
(var_value_operation::evaluate_for_sizeof)
(var_value_operation::evaluate_for_cast): New methods.
* ax-gdb.c (var_value_operation::do_generate_ax): New method.

3 years agoImplement C++ cast operations
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement C++ cast operations

This adds class cxx_cast_operation, which is used to implement the C++
dynamic_cast and reinterpret_cast operations.

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

* expop.h (cxx_cast_ftype): New typedef.
(cxx_cast_operation): New template.
(dynamic_cast_operation, reinterpret_cast_operation): New
typedefs.

3 years agoIntroduce unop_cast_type_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce unop_cast_type_operation

This adds class unop_cast_type_operation, which implements
UNOP_CAST_TYPE.

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

* expop.h (class unop_cast_type_operation): New.
* ax-gdb.c (unop_cast_type_operation::do_generate_ax): New
method.

3 years agoIntroduce unop_cast_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce unop_cast_operation

This adds class unop_cast_operation, which implements UNOP_CAST.

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

* expop.h (class unop_cast_operation): New.
* ax-gdb.c (unop_cast_operation::do_generate_ax): New method.

3 years agoIntroduce assign_modify_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce assign_modify_operation

This adds class assign_modify_operation, which implements
BINOP_ASSIGN_MODIFY.

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

* expop.h (class assign_modify_operation): New.
* eval.c (eval_binop_assign_modify): No longer static.
* ax-gdb.c (assign_modify_operation::do_generate_ax): New method.

3 years agoIntroduce assign_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce assign_operation

This adds class assign_operation, which implements BINOP_ASSIGN.

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

* expop.h (class assign_operation): New.
* ax-gdb.c (assign_operation::do_generate_ax): New method.

3 years agoIntroduce type_instance_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce type_instance_operation

This adds class type_instance_operation, which implements
TYPE_INSTANCE.

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

* expop.h (class type_instance_operation): New.
* eval.c (type_instance_operation::evaluate): New method.

3 years agoIntroduce op_this_operation
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Introduce op_this_operation

This adds class op_this_operation, which implements OP_THIS.

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

* expop.h (class op_this_operation): New.
* ax-gdb.c (op_this_operation::do_generate_ax): New method.

3 years agoImplement UNOP_MEMVAL and UNOP_MEMVAL_TYPE
Tom Tromey [Mon, 8 Mar 2021 14:27:57 +0000 (07:27 -0700)]
Implement UNOP_MEMVAL and UNOP_MEMVAL_TYPE

This adds class unop_memval_operation and unop_memval_type_operation,
which implement UNOP_MEMVAL and UNOP_MEMVAL_TYPE.

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

* expop.h (class unop_memval_operation)
(class unop_memval_type_operation): New.
* eval.c (eval_op_memval): No longer static.
(unop_memval_operation::evaluate_for_address)
(unop_memval_type_operation::evaluate_for_address)
(unop_memval_operation::evaluate_for_sizeof)
(unop_memval_type_operation::evaluate_for_sizeof): New methods.
* ax-gdb.c (unop_memval_operation::do_generate_ax)
(unop_memval_type_operation::do_generate_ax): New methods.