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.