diff options
author | Tom Tromey <tom@tromey.com> | 2021-03-08 07:27:57 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2021-03-08 07:28:41 -0700 |
commit | 1eaebe02cfe78229d78ac27f5bd6651e1c1af863 (patch) | |
tree | 870c2965ac8dada5ed4527853f829c3ddbbaf5a2 /gdb/breakpoint.c | |
parent | f2a98603a807101722f12b8d7a1aca9651deb133 (diff) | |
download | binutils-1eaebe02cfe78229d78ac27f5bd6651e1c1af863.zip binutils-1eaebe02cfe78229d78ac27f5bd6651e1c1af863.tar.gz binutils-1eaebe02cfe78229d78ac27f5bd6651e1c1af863.tar.bz2 |
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.
Diffstat (limited to 'gdb/breakpoint.c')
-rw-r--r-- | gdb/breakpoint.c | 118 |
1 files changed, 5 insertions, 113 deletions
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index aa2abce..de1e79b 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1898,12 +1898,11 @@ update_watchpoint (struct watchpoint *b, int reparse) } else if (within_current_scope && b->exp) { - int pc = 0; std::vector<value_ref_ptr> val_chain; struct value *v, *result; struct program_space *frame_pspace; - fetch_subexp_value (b->exp.get (), &pc, b->exp->op.get (), &v, &result, + fetch_subexp_value (b->exp.get (), b->exp->op.get (), &v, &result, &val_chain, false); /* Avoid setting b->val if it's already set. The meaning of @@ -5012,7 +5011,6 @@ watchpoint_check (bpstat bs) free_all_values. We can't call free_all_values because we might be in the middle of evaluating a function call. */ - int pc = 0; struct value *mark; struct value *new_val; @@ -5023,7 +5021,7 @@ watchpoint_check (bpstat bs) return WP_VALUE_CHANGED; mark = value_mark (); - fetch_subexp_value (b->exp.get (), &pc, b->exp->op.get (), &new_val, + fetch_subexp_value (b->exp.get (), b->exp->op.get (), &new_val, NULL, NULL, false); if (b->val_bitsize != 0) @@ -10124,112 +10122,7 @@ break_range_command (const char *arg, int from_tty) static bool watchpoint_exp_is_const (const struct expression *exp) { - if (exp->op != nullptr) - return exp->op->constant_p (); - - int i = exp->nelts; - - while (i > 0) - { - int oplenp, argsp; - - /* We are only interested in the descriptor of each element. */ - operator_length (exp, i, &oplenp, &argsp); - i -= oplenp; - - switch (exp->elts[i].opcode) - { - case BINOP_ADD: - case BINOP_SUB: - case BINOP_MUL: - case BINOP_DIV: - case BINOP_REM: - case BINOP_MOD: - case BINOP_LSH: - case BINOP_RSH: - case BINOP_LOGICAL_AND: - case BINOP_LOGICAL_OR: - case BINOP_BITWISE_AND: - case BINOP_BITWISE_IOR: - case BINOP_BITWISE_XOR: - case BINOP_EQUAL: - case BINOP_NOTEQUAL: - case BINOP_LESS: - case BINOP_GTR: - case BINOP_LEQ: - case BINOP_GEQ: - case BINOP_REPEAT: - case BINOP_COMMA: - case BINOP_EXP: - case BINOP_MIN: - case BINOP_MAX: - case BINOP_INTDIV: - case BINOP_CONCAT: - case TERNOP_COND: - case TERNOP_SLICE: - - case OP_LONG: - case OP_FLOAT: - case OP_LAST: - case OP_COMPLEX: - case OP_STRING: - case OP_ARRAY: - case OP_TYPE: - case OP_TYPEOF: - case OP_DECLTYPE: - case OP_TYPEID: - case OP_NAME: - case OP_OBJC_NSSTRING: - - case UNOP_NEG: - case UNOP_LOGICAL_NOT: - case UNOP_COMPLEMENT: - case UNOP_ADDR: - case UNOP_HIGH: - case UNOP_CAST: - - case UNOP_CAST_TYPE: - case UNOP_REINTERPRET_CAST: - case UNOP_DYNAMIC_CAST: - /* Unary, binary and ternary operators: We have to check - their operands. If they are constant, then so is the - result of that operation. For instance, if A and B are - determined to be constants, then so is "A + B". - - UNOP_IND is one exception to the rule above, because the - value of *ADDR is not necessarily a constant, even when - ADDR is. */ - break; - - case OP_VAR_VALUE: - /* Check whether the associated symbol is a constant. - - We use SYMBOL_CLASS rather than TYPE_CONST because it's - possible that a buggy compiler could mark a variable as - constant even when it is not, and TYPE_CONST would return - true in this case, while SYMBOL_CLASS wouldn't. - - We also have to check for function symbols because they - are always constant. */ - { - struct symbol *s = exp->elts[i + 2].symbol; - - if (SYMBOL_CLASS (s) != LOC_BLOCK - && SYMBOL_CLASS (s) != LOC_CONST - && SYMBOL_CLASS (s) != LOC_CONST_BYTES) - return false; - break; - } - - /* The default action is to return 0 because we are using - the optimistic approach here: If we don't know something, - then it is not a constant. */ - default: - return false; - } - } - - return true; + return exp->op->constant_p (); } /* Watchpoint destructor. */ @@ -10730,7 +10623,6 @@ watch_command_1 (const char *arg, int accessflag, int from_tty, const char *cond_end = NULL; enum bptype bp_type; int thread = -1; - int pc = 0; /* Flag to indicate whether we are going to use masks for the hardware watchpoint. */ bool use_mask = false; @@ -10847,8 +10739,8 @@ watch_command_1 (const char *arg, int accessflag, int from_tty, exp_valid_block = tracker.block (); struct value *mark = value_mark (); struct value *val_as_value = nullptr; - fetch_subexp_value (exp.get (), &pc, exp->op.get (), &val_as_value, &result, - NULL, just_location); + fetch_subexp_value (exp.get (), exp->op.get (), &val_as_value, &result, NULL, + just_location); if (val_as_value != NULL && just_location) { |