aboutsummaryrefslogtreecommitdiff
path: root/gdb/ada-exp.h
AgeCommit message (Collapse)AuthorFilesLines
2021-03-15Fix bug in Ada aggregate assignmentTom Tromey1-4/+5
The expression rewrite caused a regression in the internal AdaCore test suite. The bug was that I had dropped a bit of code from aggregate assignment -- assign_aggregate used to return the container, which I thought was redundant, but which can actually change during the call. There was no test for this case in the tree, so I've added one. gdb/ChangeLog 2021-03-15 Tom Tromey <tromey@adacore.com> * ada-lang.c (ada_aggregate_operation::assign_aggregate): Return container. (ada_assign_operation::evaluate): Update. * ada-exp.h (class ada_aggregate_operation) <assign_aggregate>: Change return type. gdb/testsuite/ChangeLog 2021-03-15 Tom Tromey <tromey@adacore.com> * gdb.ada/assign_arr/target_wrapper.ads (IArray, Put, Do_Nothing): Declare. * gdb.ada/assign_arr/target_wrapper.adb: New file. * gdb.ada/assign_arr/main_p324_051.adb (IValue): New variable. Call Put. * gdb.ada/assign_arr.exp: Update.
2021-03-08Remove two Ada opcodesTom Tromey1-2/+2
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.
2021-03-08Add an expr::operation_up to struct expressionTom Tromey1-3/+0
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.
2021-03-08Implement Ada assignmentTom Tromey1-0/+279
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.
2021-03-08Implement Ada resolutionTom Tromey1-3/+44
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.
2021-03-08Implement function calls for AdaTom Tromey1-0/+19
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.
2021-03-08Introduce ada_structop_operationTom Tromey1-0/+16
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.
2021-03-08Introduce ada_unop_ind_operationTom Tromey1-0/+13
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.
2021-03-08Introduce ada_binop_exp_operationTom Tromey1-1/+6
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.
2021-03-08Introduce ada_atr_val_operationTom Tromey1-0/+19
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.
2021-03-08Introduce ada_pos_operationTom Tromey1-0/+5
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.
2021-03-08Implement Ada min and max operationsTom Tromey1-0/+8
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.
2021-03-08Introduce ada_var_msym_value_operationTom Tromey1-0/+17
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.
2021-03-08Introduce ada_var_value_operationTom Tromey1-0/+21
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.
2021-03-08Implement some Ada OP_ATR_ operationsTom Tromey1-0/+16
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.
2021-03-08Introduce ada_binop_in_boundsTom Tromey1-0/+27
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.
2021-03-08Introduce ada_ternop_sliceTom Tromey1-0/+27
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.
2021-03-08Introduce ada_bitwise_operationTom Tromey1-0/+27
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.
2021-03-08Implement Ada equality operatorsTom Tromey1-0/+27
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.
2021-03-08Implement Ada multiplicative operatorsTom Tromey1-0/+9
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.
2021-03-08Introduce ada_binop_addsub_operationTom Tromey1-0/+16
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.
2021-03-08Introduce ada_unop_range_operationTom Tromey1-0/+25
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.
2021-03-08Implement some Ada unary operationsTom Tromey1-0/+22
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.
2021-03-08Introduce ada_ternop_range_operationTom Tromey1-0/+16
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.
2021-03-08Introduce ada_qual_operationTom Tromey1-0/+16
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.
2021-03-08Introduce ada_string_operationTom Tromey1-0/+13
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.
2021-03-08Introduce ada_wrapped_operationTom Tromey1-0/+47
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.