From 67f3407ffbf8f43d93f0c9b2d7e26e767ca5fb53 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Wed, 13 Jun 2007 17:11:09 +0000 Subject: [PATCH] * expression.h (enum exp_opcode): Document a register name for OP_REGISTER. * parse.c (write_dollar_variable): Write the register name for OP_REGISTER. (operator_length_standard): Expect the register name following OP_REGISTER. * ada-lang.c (resolve_subexp): Likewise. * ax-gdb.c (gen_expr): Likewise. * eval.c (evaluate_subexp_standard): Likewise. * expprint.c (print_subexp_standard, dump_subexp_body_standard): Likewise. * tracepoint.c (encode_actions): Likewise. --- gdb/ChangeLog | 15 +++++++++++++++ gdb/ada-lang.c | 5 ++++- gdb/ax-gdb.c | 10 ++++++++-- gdb/eval.c | 13 +++++++++---- gdb/expprint.c | 11 ++++------- gdb/expression.h | 5 ++--- gdb/parse.c | 6 ++++-- gdb/tracepoint.c | 19 ++++++++++++++----- 8 files changed, 60 insertions(+), 24 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f2a365a2d2..0b9d3bf5b9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,18 @@ +2007-06-13 Daniel Jacobowitz + + * expression.h (enum exp_opcode): Document a register name for + OP_REGISTER. + * parse.c (write_dollar_variable): Write the register name for + OP_REGISTER. + (operator_length_standard): Expect the register name following + OP_REGISTER. + * ada-lang.c (resolve_subexp): Likewise. + * ax-gdb.c (gen_expr): Likewise. + * eval.c (evaluate_subexp_standard): Likewise. + * expprint.c (print_subexp_standard, dump_subexp_body_standard): + Likewise. + * tracepoint.c (encode_actions): Likewise. + 2007-06-13 Daniel Jacobowitz * utils.c (set_screen_size): Use INT_MAX for default columns. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 26eb64561a..068a6ed7fc 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -2710,7 +2710,6 @@ resolve_subexp (struct expression **expp, int *pos, int deprocedure_p, case OP_TYPE: case OP_BOOL: case OP_LAST: - case OP_REGISTER: case OP_INTERNALVAR: *pos += 3; break; @@ -2720,6 +2719,10 @@ resolve_subexp (struct expression **expp, int *pos, int deprocedure_p, nargs = 1; break; + case OP_REGISTER: + *pos += 4 + BYTES_TO_EXP_ELEM (exp->elts[pc + 1].longconst + 1); + break; + case STRUCTOP_STRUCT: *pos += 4 + BYTES_TO_EXP_ELEM (exp->elts[pc + 1].longconst + 1); nargs = 1; diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c index b00806fd0b..82e095367a 100644 --- a/gdb/ax-gdb.c +++ b/gdb/ax-gdb.c @@ -1599,8 +1599,14 @@ gen_expr (union exp_element **pc, struct agent_expr *ax, case OP_REGISTER: { - int reg = (int) (*pc)[1].longconst; - (*pc) += 3; + const char *name = &(*pc)[2].string; + int reg; + (*pc) += 4 + BYTES_TO_EXP_ELEM ((*pc)[1].longconst + 1); + reg = frame_map_name_to_regnum (deprecated_safe_get_selected_frame (), + name, strlen (name)); + if (reg == -1) + internal_error (__FILE__, __LINE__, + _("Register $%s not available"), name); value->kind = axs_lvalue_register; value->u.reg = reg; value->type = register_type (current_gdbarch, reg); diff --git a/gdb/eval.c b/gdb/eval.c index 75cea6b5bb..4222495b55 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -500,16 +500,21 @@ evaluate_subexp_standard (struct type *expect_type, case OP_REGISTER: { - int regno = longest_to_int (exp->elts[pc + 1].longconst); + const char *name = &exp->elts[pc + 2].string; + int regno; struct value *val; - (*pos) += 2; + + (*pos) += 3 + BYTES_TO_EXP_ELEM (exp->elts[pc + 1].longconst + 1); + regno = frame_map_name_to_regnum (deprecated_safe_get_selected_frame (), + name, strlen (name)); + if (regno == -1) + error (_("Register $%s not available."), name); if (noside == EVAL_AVOID_SIDE_EFFECTS) val = value_zero (register_type (current_gdbarch, regno), not_lval); else val = value_of_register (regno, get_selected_frame (NULL)); if (val == NULL) - error (_("Value of register %s not available."), - frame_map_regnum_to_name (get_selected_frame (NULL), regno)); + error (_("Value of register %s not available."), name); else return val; } diff --git a/gdb/expprint.c b/gdb/expprint.c index dc1f7f764f..09d2efe167 100644 --- a/gdb/expprint.c +++ b/gdb/expprint.c @@ -130,10 +130,8 @@ print_subexp_standard (struct expression *exp, int *pos, case OP_REGISTER: { - int regnum = longest_to_int (exp->elts[pc + 1].longconst); - const char *name = user_reg_map_regnum_to_name (current_gdbarch, - regnum); - (*pos) += 2; + const char *name = &exp->elts[pc + 2].string; + (*pos) += 3 + BYTES_TO_EXP_ELEM (exp->elts[pc + 1].longconst + 1); fprintf_filtered (stream, "$%s", name); return; } @@ -965,9 +963,8 @@ dump_subexp_body_standard (struct expression *exp, elt += 2; break; case OP_REGISTER: - fprintf_filtered (stream, "Register %ld", - (long) exp->elts[elt].longconst); - elt += 2; + fprintf_filtered (stream, "Register $%s", &exp->elts[elt + 1].string); + elt += 3 + BYTES_TO_EXP_ELEM (exp->elts[elt].longconst + 1); break; case OP_INTERNALVAR: fprintf_filtered (stream, "Internal var @"); diff --git a/gdb/expression.h b/gdb/expression.h index fecf69f587..bc1fa3b25a 100644 --- a/gdb/expression.h +++ b/gdb/expression.h @@ -166,9 +166,8 @@ enum exp_opcode With another OP_LAST at the end, this makes three exp_elements. */ OP_LAST, - /* OP_REGISTER is followed by an integer in the next exp_element. - This is the number of a register to fetch (as an int). - With another OP_REGISTER at the end, this makes three exp_elements. */ + /* OP_REGISTER is followed by a string in the next exp_element. + This is the name of a register to fetch. */ OP_REGISTER, /* OP_INTERNALVAR is followed by an internalvar ptr in the next exp_element. diff --git a/gdb/parse.c b/gdb/parse.c index 3284af3cdf..0c7dfd852e 100644 --- a/gdb/parse.c +++ b/gdb/parse.c @@ -548,7 +548,9 @@ handle_last: return; handle_register: write_exp_elt_opcode (OP_REGISTER); - write_exp_elt_longcst (i); + str.length--; + str.ptr++; + write_exp_string (str); write_exp_elt_opcode (OP_REGISTER); return; } @@ -717,7 +719,6 @@ operator_length_standard (struct expression *expr, int endpos, case OP_TYPE: case OP_BOOL: case OP_LAST: - case OP_REGISTER: case OP_INTERNALVAR: oplen = 3; break; @@ -772,6 +773,7 @@ operator_length_standard (struct expression *expr, int endpos, case STRUCTOP_PTR: args = 1; /* fall through */ + case OP_REGISTER: case OP_M2_STRING: case OP_STRING: case OP_OBJC_NSSTRING: /* Objective C Foundation Class NSString constant */ diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index ff5c6b7b45..02d2e80b76 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -1602,11 +1602,20 @@ encode_actions (struct tracepoint *t, char ***tdp_actions, switch (exp->elts[0].opcode) { case OP_REGISTER: - i = exp->elts[1].longconst; - if (info_verbose) - printf_filtered ("OP_REGISTER: "); - add_register (collect, i); - break; + { + const char *name = &exp->elts[2].string; + + i = frame_map_name_to_regnum (deprecated_safe_get_selected_frame (), + name, strlen (name)); + if (i == -1) + internal_error (__FILE__, __LINE__, + _("Register $%s not available"), + name); + if (info_verbose) + printf_filtered ("OP_REGISTER: "); + add_register (collect, i); + break; + } case UNOP_MEMVAL: /* safe because we know it's a simple expression */ -- 2.34.1