X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fax-gdb.c;h=34e22b289ecec951d329368cb211b853e0ff3c8e;hb=f16a9f57b50af64ccb9652d20cc934fc5e80cd20;hp=a72a4586fd3fcd708aa638e095f8fc758c3590cf;hpb=6c5b2ebeacc2538cf342cfd13c4c98ff018e6c9a;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ax-gdb.c b/gdb/ax-gdb.c index a72a4586fd..34e22b289e 100644 --- a/gdb/ax-gdb.c +++ b/gdb/ax-gdb.c @@ -1,6 +1,6 @@ /* GDB-specific functions for operating on agent expressions. - Copyright (C) 1998-2017 Free Software Foundation, Inc. + Copyright (C) 1998-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -42,11 +42,11 @@ #include "linespec.h" #include "location.h" #include "objfiles.h" - +#include "typeprint.h" #include "valprint.h" #include "c-lang.h" -#include "format.h" +#include "gdbsupport/format.h" /* To make sense of this file, you should read doc/agentexpr.texi. Then look at the types and enums in ax-gdb.h. For the code itself, @@ -158,8 +158,6 @@ static void gen_expr_binop_rest (struct expression *exp, struct axs_value *value, struct axs_value *value1, struct axs_value *value2); - -static void agent_command (char *exp, int from_tty); /* Detecting constant expressions. */ @@ -318,9 +316,9 @@ gen_trace_static_fields (struct agent_expr *ax, type = check_typedef (type); - for (i = TYPE_NFIELDS (type) - 1; i >= nbases; i--) + for (i = type->num_fields () - 1; i >= nbases; i--) { - if (field_is_static (&TYPE_FIELD (type, i))) + if (field_is_static (&type->field (i))) { gen_static_field (ax, &value, type, i); if (value.optimized_out) @@ -364,7 +362,7 @@ gen_traced_pop (struct agent_expr *ax, struct axs_value *value) { int string_trace = 0; if (ax->trace_string - && TYPE_CODE (value->type) == TYPE_CODE_PTR + && value->type->code () == TYPE_CODE_PTR && c_textual_element_type (check_typedef (TYPE_TARGET_TYPE (value->type)), 's')) string_trace = 1; @@ -431,8 +429,8 @@ gen_traced_pop (struct agent_expr *ax, struct axs_value *value) /* To trace C++ classes with static fields stored elsewhere. */ if (ax->tracing - && (TYPE_CODE (value->type) == TYPE_CODE_STRUCT - || TYPE_CODE (value->type) == TYPE_CODE_UNION)) + && (value->type->code () == TYPE_CODE_STRUCT + || value->type->code () == TYPE_CODE_UNION)) gen_trace_static_fields (ax, value->type); } @@ -476,10 +474,10 @@ gen_fetch (struct agent_expr *ax, struct type *type) ax_trace_quick (ax, TYPE_LENGTH (type)); } - if (TYPE_CODE (type) == TYPE_CODE_RANGE) + if (type->code () == TYPE_CODE_RANGE) type = TYPE_TARGET_TYPE (type); - switch (TYPE_CODE (type)) + switch (type->code ()) { case TYPE_CODE_PTR: case TYPE_CODE_REF: @@ -522,7 +520,7 @@ gen_fetch (struct agent_expr *ax, struct type *type) type. Error out and give callers a chance to handle the failure gracefully. */ error (_("gen_fetch: Unsupported type code `%s'."), - TYPE_NAME (type)); + type->name ()); } } @@ -677,11 +675,11 @@ gen_var_ref (struct agent_expr *ax, struct axs_value *value, struct symbol *var) case LOC_TYPEDEF: error (_("Cannot compute value of typedef `%s'."), - SYMBOL_PRINT_NAME (var)); + var->print_name ()); break; case LOC_BLOCK: - ax_const_l (ax, BLOCK_START (SYMBOL_BLOCK_VALUE (var))); + ax_const_l (ax, BLOCK_ENTRY_PC (SYMBOL_BLOCK_VALUE (var))); value->kind = axs_rvalue; break; @@ -707,10 +705,10 @@ gen_var_ref (struct agent_expr *ax, struct axs_value *value, struct symbol *var) case LOC_UNRESOLVED: { struct bound_minimal_symbol msym - = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (var), NULL, NULL); + = lookup_minimal_symbol (var->linkage_name (), NULL, NULL); if (!msym.minsym) - error (_("Couldn't resolve symbol `%s'."), SYMBOL_PRINT_NAME (var)); + error (_("Couldn't resolve symbol `%s'."), var->print_name ()); /* Push the address of the variable. */ ax_const_l (ax, BMSYMBOL_VALUE_ADDRESS (msym)); @@ -729,10 +727,27 @@ gen_var_ref (struct agent_expr *ax, struct axs_value *value, struct symbol *var) default: error (_("Cannot find value of botched symbol `%s'."), - SYMBOL_PRINT_NAME (var)); + var->print_name ()); break; } } + +/* Generate code for a minimal symbol variable reference to AX. The + variable is the symbol MINSYM, of OBJFILE. Set VALUE to describe + the result. */ + +static void +gen_msym_var_ref (agent_expr *ax, axs_value *value, + minimal_symbol *msymbol, objfile *objf) +{ + CORE_ADDR address; + type *t = find_minsym_type_and_address (msymbol, objf, &address); + value->type = t; + value->optimized_out = false; + ax_const_l (ax, address); + value->kind = axs_lvalue_memory; +} + @@ -760,10 +775,10 @@ require_rvalue (struct agent_expr *ax, struct axs_value *value) /* Only deal with scalars, structs and such may be too large to fit in a stack entry. */ value->type = check_typedef (value->type); - if (TYPE_CODE (value->type) == TYPE_CODE_ARRAY - || TYPE_CODE (value->type) == TYPE_CODE_STRUCT - || TYPE_CODE (value->type) == TYPE_CODE_UNION - || TYPE_CODE (value->type) == TYPE_CODE_FUNC) + if (value->type->code () == TYPE_CODE_ARRAY + || value->type->code () == TYPE_CODE_STRUCT + || value->type->code () == TYPE_CODE_UNION + || value->type->code () == TYPE_CODE_FUNC) error (_("Value not scalar: cannot be an rvalue.")); switch (value->kind) @@ -816,7 +831,7 @@ gen_usual_unary (struct agent_expr *ax, struct axs_value *value) the stack. Should we tweak the type? */ /* Some types require special handling. */ - switch (TYPE_CODE (value->type)) + switch (value->type->code ()) { /* Functions get converted to a pointer to the function. */ case TYPE_CODE_FUNC: @@ -928,8 +943,8 @@ gen_usual_arithmetic (struct agent_expr *ax, struct axs_value *value1, struct axs_value *value2) { /* Do the usual binary conversions. */ - if (TYPE_CODE (value1->type) == TYPE_CODE_INT - && TYPE_CODE (value2->type) == TYPE_CODE_INT) + if (value1->type->code () == TYPE_CODE_INT + && value2->type->code () == TYPE_CODE_INT) { /* The ANSI integral promotions seem to work this way: Order the integer types by size, and then by signedness: an n-bit @@ -988,7 +1003,7 @@ gen_cast (struct agent_expr *ax, struct axs_value *value, struct type *type) /* Dereference typedefs. */ type = check_typedef (type); - switch (TYPE_CODE (type)) + switch (type->code ()) { case TYPE_CODE_PTR: case TYPE_CODE_REF: @@ -1055,7 +1070,7 @@ gen_ptradd (struct agent_expr *ax, struct axs_value *value, struct axs_value *value1, struct axs_value *value2) { gdb_assert (pointer_type (value1->type)); - gdb_assert (TYPE_CODE (value2->type) == TYPE_CODE_INT); + gdb_assert (value2->type->code () == TYPE_CODE_INT); gen_scale (ax, aop_mul, value1->type); ax_simple (ax, aop_add); @@ -1071,7 +1086,7 @@ gen_ptrsub (struct agent_expr *ax, struct axs_value *value, struct axs_value *value1, struct axs_value *value2) { gdb_assert (pointer_type (value1->type)); - gdb_assert (TYPE_CODE (value2->type) == TYPE_CODE_INT); + gdb_assert (value2->type->code () == TYPE_CODE_INT); gen_scale (ax, aop_mul, value1->type); ax_simple (ax, aop_sub); @@ -1143,8 +1158,8 @@ gen_binop (struct agent_expr *ax, struct axs_value *value, int may_carry, const char *name) { /* We only handle INT op INT. */ - if ((TYPE_CODE (value1->type) != TYPE_CODE_INT) - || (TYPE_CODE (value2->type) != TYPE_CODE_INT)) + if ((value1->type->code () != TYPE_CODE_INT) + || (value2->type->code () != TYPE_CODE_INT)) error (_("Invalid combination of types in %s."), name); ax_simple (ax, @@ -1160,8 +1175,8 @@ static void gen_logical_not (struct agent_expr *ax, struct axs_value *value, struct type *result_type) { - if (TYPE_CODE (value->type) != TYPE_CODE_INT - && TYPE_CODE (value->type) != TYPE_CODE_PTR) + if (value->type->code () != TYPE_CODE_INT + && value->type->code () != TYPE_CODE_PTR) error (_("Invalid type of operand to `!'.")); ax_simple (ax, aop_log_not); @@ -1172,7 +1187,7 @@ gen_logical_not (struct agent_expr *ax, struct axs_value *value, static void gen_complement (struct agent_expr *ax, struct axs_value *value) { - if (TYPE_CODE (value->type) != TYPE_CODE_INT) + if (value->type->code () != TYPE_CODE_INT) error (_("Invalid type of operand to `~'.")); ax_simple (ax, aop_bit_not); @@ -1199,9 +1214,9 @@ gen_deref (struct axs_value *value) T" to "T", and mark the value as an lvalue in memory. Leave it to the consumer to actually dereference it. */ value->type = check_typedef (TYPE_TARGET_TYPE (value->type)); - if (TYPE_CODE (value->type) == TYPE_CODE_VOID) + if (value->type->code () == TYPE_CODE_VOID) error (_("Attempt to dereference a generic pointer.")); - value->kind = ((TYPE_CODE (value->type) == TYPE_CODE_FUNC) + value->kind = ((value->type->code () == TYPE_CODE_FUNC) ? axs_rvalue : axs_lvalue_memory); } @@ -1213,7 +1228,7 @@ gen_address_of (struct axs_value *value) /* Special case for taking the address of a function. The ANSI standard describes this as a special case, too, so this arrangement is not without motivation. */ - if (TYPE_CODE (value->type) == TYPE_CODE_FUNC) + if (value->type->code () == TYPE_CODE_FUNC) /* The value's already an rvalue on the stack, so we just need to change the type. */ value->type = lookup_pointer_type (value->type); @@ -1402,7 +1417,7 @@ gen_primitive_field (struct agent_expr *ax, struct axs_value *value, { /* Is this a bitfield? */ if (TYPE_FIELD_PACKED (type, fieldno)) - gen_bitfield_ref (ax, value, TYPE_FIELD_TYPE (type, fieldno), + gen_bitfield_ref (ax, value, type->field (fieldno).type (), (offset * TARGET_CHAR_BIT + TYPE_FIELD_BITPOS (type, fieldno)), (offset * TARGET_CHAR_BIT @@ -1413,7 +1428,7 @@ gen_primitive_field (struct agent_expr *ax, struct axs_value *value, gen_offset (ax, offset + TYPE_FIELD_BITPOS (type, fieldno) / TARGET_CHAR_BIT); value->kind = axs_lvalue_memory; - value->type = TYPE_FIELD_TYPE (type, fieldno); + value->type = type->field (fieldno).type (); } } @@ -1429,7 +1444,7 @@ gen_struct_ref_recursive (struct agent_expr *ax, struct axs_value *value, type = check_typedef (type); - for (i = TYPE_NFIELDS (type) - 1; i >= nbases; i--) + for (i = type->num_fields () - 1; i >= nbases; i--) { const char *this_name = TYPE_FIELD_NAME (type, i); @@ -1441,7 +1456,7 @@ gen_struct_ref_recursive (struct agent_expr *ax, struct axs_value *value, "this") will have been generated already, which will be unnecessary but not harmful if the static field is being handled as a global. */ - if (field_is_static (&TYPE_FIELD (type, i))) + if (field_is_static (&type->field (i))) { gen_static_field (ax, value, type, i); if (value->optimized_out) @@ -1503,8 +1518,8 @@ gen_struct_ref (struct agent_expr *ax, struct axs_value *value, type = check_typedef (value->type); /* This must yield a structure or a union. */ - if (TYPE_CODE (type) != TYPE_CODE_STRUCT - && TYPE_CODE (type) != TYPE_CODE_UNION) + if (type->code () != TYPE_CODE_STRUCT + && type->code () != TYPE_CODE_UNION) error (_("The left operand of `%s' is not a %s."), operator_name, operand_name); @@ -1518,7 +1533,7 @@ gen_struct_ref (struct agent_expr *ax, struct axs_value *value, if (!found) error (_("Couldn't find member named `%s' in struct/union/class `%s'"), - field, TYPE_TAG_NAME (type)); + field, type->name ()); } static int @@ -1536,7 +1551,7 @@ gen_static_field (struct agent_expr *ax, struct axs_value *value, { ax_const_l (ax, TYPE_FIELD_STATIC_PHYSADDR (type, fieldno)); value->kind = axs_lvalue_memory; - value->type = TYPE_FIELD_TYPE (type, fieldno); + value->type = type->field (fieldno).type (); value->optimized_out = 0; } else @@ -1568,18 +1583,18 @@ gen_struct_elt_for_reference (struct agent_expr *ax, struct axs_value *value, struct type *t = type; int i; - if (TYPE_CODE (t) != TYPE_CODE_STRUCT - && TYPE_CODE (t) != TYPE_CODE_UNION) + if (t->code () != TYPE_CODE_STRUCT + && t->code () != TYPE_CODE_UNION) internal_error (__FILE__, __LINE__, _("non-aggregate type to gen_struct_elt_for_reference")); - for (i = TYPE_NFIELDS (t) - 1; i >= TYPE_N_BASECLASSES (t); i--) + for (i = t->num_fields () - 1; i >= TYPE_N_BASECLASSES (t); i--) { const char *t_field_name = TYPE_FIELD_NAME (t, i); if (t_field_name && strcmp (t_field_name, fieldname) == 0) { - if (field_is_static (&TYPE_FIELD (t, i))) + if (field_is_static (&t->field (i))) { gen_static_field (ax, value, t, i); if (value->optimized_out) @@ -1614,7 +1629,7 @@ gen_namespace_elt (struct agent_expr *ax, struct axs_value *value, if (!found) error (_("No symbol \"%s\" in namespace \"%s\"."), - name, TYPE_TAG_NAME (curtype)); + name, curtype->name ()); return found; } @@ -1629,7 +1644,7 @@ static int gen_maybe_namespace_elt (struct agent_expr *ax, struct axs_value *value, const struct type *curtype, char *name) { - const char *namespace_name = TYPE_TAG_NAME (curtype); + const char *namespace_name = curtype->name (); struct block_symbol sym; sym = cp_lookup_symbol_namespace (namespace_name, name, @@ -1643,7 +1658,7 @@ gen_maybe_namespace_elt (struct agent_expr *ax, struct axs_value *value, if (value->optimized_out) error (_("`%s' has been optimized out, cannot use"), - SYMBOL_PRINT_NAME (sym.symbol)); + sym.symbol->print_name ()); return 1; } @@ -1653,7 +1668,7 @@ static int gen_aggregate_elt_ref (struct agent_expr *ax, struct axs_value *value, struct type *type, char *field) { - switch (TYPE_CODE (type)) + switch (type->code ()) { case TYPE_CODE_STRUCT: case TYPE_CODE_UNION: @@ -1701,7 +1716,7 @@ gen_repeat (struct expression *exp, union exp_element **pc, if (!v) error (_("Right operand of `@' must be a " "constant, in agent expressions.")); - if (TYPE_CODE (value_type (v)) != TYPE_CODE_INT) + if (value_type (v)->code () != TYPE_CODE_INT) error (_("Right operand of `@' must be an integer.")); length = value_as_long (v); if (length <= 0) @@ -1748,6 +1763,40 @@ gen_sizeof (struct expression *exp, union exp_element **pc, } +/* Generate bytecode for a cast to TO_TYPE. Advance *PC over the + subexpression. */ + +static void +gen_expr_for_cast (struct expression *exp, union exp_element **pc, + struct agent_expr *ax, struct axs_value *value, + struct type *to_type) +{ + enum exp_opcode op = (*pc)[0].opcode; + + /* Don't let symbols be handled with gen_expr because that throws an + "unknown type" error for no-debug data symbols. Instead, we want + the cast to reinterpret such symbols. */ + if (op == OP_VAR_MSYM_VALUE || op == OP_VAR_VALUE) + { + if (op == OP_VAR_VALUE) + { + gen_var_ref (ax, value, (*pc)[2].symbol); + + if (value->optimized_out) + error (_("`%s' has been optimized out, cannot use"), + (*pc)[2].symbol->print_name ()); + } + else + gen_msym_var_ref (ax, value, (*pc)[2].msymbol, (*pc)[1].objfile); + if (value->type->code () == TYPE_CODE_ERROR) + value->type = to_type; + (*pc) += 4; + } + else + gen_expr (exp, pc, ax, value); + gen_cast (ax, value, to_type); +} + /* Generating bytecode from GDB expressions: general recursive thingy */ /* XXX: i18n */ @@ -1862,7 +1911,7 @@ gen_expr (struct expression *exp, union exp_element **pc, gen_expr (exp, pc, ax, &value3); gen_usual_unary (ax, &value3); ax_label (ax, end, ax->len); - /* This is arbitary - what if B and C are incompatible types? */ + /* This is arbitrary - what if B and C are incompatible types? */ value->type = value2.type; value->kind = value2.kind; break; @@ -1959,7 +2008,19 @@ gen_expr (struct expression *exp, union exp_element **pc, if (value->optimized_out) error (_("`%s' has been optimized out, cannot use"), - SYMBOL_PRINT_NAME ((*pc)[2].symbol)); + (*pc)[2].symbol->print_name ()); + + if (value->type->code () == TYPE_CODE_ERROR) + error_unknown_type ((*pc)[2].symbol->print_name ()); + + (*pc) += 4; + break; + + case OP_VAR_MSYM_VALUE: + gen_msym_var_ref (ax, value, (*pc)[2].msymbol, (*pc)[1].objfile); + + if (value->type->code () == TYPE_CODE_ERROR) + error_unknown_type ((*pc)[2].msymbol->linkage_name ()); (*pc) += 4; break; @@ -1975,8 +2036,7 @@ gen_expr (struct expression *exp, union exp_element **pc, internal_error (__FILE__, __LINE__, _("Register $%s not available"), name); /* No support for tracing user registers yet. */ - if (reg >= gdbarch_num_regs (ax->gdbarch) - + gdbarch_num_pseudo_regs (ax->gdbarch)) + if (reg >= gdbarch_num_cooked_regs (ax->gdbarch)) error (_("'%s' is a user-register; " "GDB cannot yet trace user-register contents."), name); @@ -2021,8 +2081,7 @@ gen_expr (struct expression *exp, union exp_element **pc, struct type *type = (*pc)[1].type; (*pc) += 3; - gen_expr (exp, pc, ax, value); - gen_cast (ax, value, type); + gen_expr_for_cast (exp, pc, ax, value, type); } break; @@ -2037,9 +2096,7 @@ gen_expr (struct expression *exp, union exp_element **pc, val = evaluate_subexp (NULL, exp, &offset, EVAL_AVOID_SIDE_EFFECTS); type = value_type (val); *pc = &exp->elts[offset]; - - gen_expr (exp, pc, ax, value); - gen_cast (ax, value, type); + gen_expr_for_cast (exp, pc, ax, value, type); } break; @@ -2173,7 +2230,7 @@ gen_expr (struct expression *exp, union exp_element **pc, b = block_for_pc (ax->scope); func = block_linkage_function (b); - lang = language_def (SYMBOL_LANGUAGE (func)); + lang = language_def (func->language ()); sym = lookup_language_this (lang, b).symbol; if (!sym) @@ -2183,7 +2240,7 @@ gen_expr (struct expression *exp, union exp_element **pc, if (value->optimized_out) error (_("`%s' has been optimized out, cannot use"), - SYMBOL_PRINT_NAME (sym)); + sym->print_name ()); (*pc) += 2; } @@ -2232,7 +2289,7 @@ gen_expr_binop_rest (struct expression *exp, switch (op) { case BINOP_ADD: - if (TYPE_CODE (value1->type) == TYPE_CODE_INT + if (value1->type->code () == TYPE_CODE_INT && pointer_type (value2->type)) { /* Swap the values and proceed normally. */ @@ -2240,7 +2297,7 @@ gen_expr_binop_rest (struct expression *exp, gen_ptradd (ax, value, value2, value1); } else if (pointer_type (value1->type) - && TYPE_CODE (value2->type) == TYPE_CODE_INT) + && value2->type->code () == TYPE_CODE_INT) gen_ptradd (ax, value, value1, value2); else gen_binop (ax, value, value1, value2, @@ -2248,7 +2305,7 @@ gen_expr_binop_rest (struct expression *exp, break; case BINOP_SUB: if (pointer_type (value1->type) - && TYPE_CODE (value2->type) == TYPE_CODE_INT) + && value2->type->code () == TYPE_CODE_INT) gen_ptrsub (ax,value, value1, value2); else if (pointer_type (value1->type) && pointer_type (value2->type)) @@ -2294,12 +2351,12 @@ gen_expr_binop_rest (struct expression *exp, an array or pointer type (like a plain int variable for example), then report this as an error. */ type = check_typedef (value1->type); - if (TYPE_CODE (type) != TYPE_CODE_ARRAY - && TYPE_CODE (type) != TYPE_CODE_PTR) + if (type->code () != TYPE_CODE_ARRAY + && type->code () != TYPE_CODE_PTR) { - if (TYPE_NAME (type)) + if (type->name ()) error (_("cannot subscript something of type `%s'"), - TYPE_NAME (type)); + type->name ()); else error (_("cannot subscript requested type")); } @@ -2483,7 +2540,6 @@ agent_expr_up gen_printf (CORE_ADDR scope, struct gdbarch *gdbarch, CORE_ADDR function, LONGEST channel, const char *format, int fmtlen, - struct format_piece *frags, int nargs, struct expression **exprs) { agent_expr_up ax (new agent_expr (gdbarch, scope)); @@ -2562,7 +2618,7 @@ agent_eval_command_one (const char *exp, int eval, CORE_ADDR pc) } static void -agent_command_1 (char *exp, int eval) +agent_command_1 (const char *exp, int eval) { /* We don't deal with overlay debugging at the moment. We need to think more carefully about this. If you copy this code into @@ -2578,11 +2634,10 @@ agent_command_1 (char *exp, int eval) { struct linespec_result canonical; - exp = skip_spaces (exp); - - event_location_up location = new_linespec_location (&exp); + event_location_up location + = new_linespec_location (&exp, symbol_name_match_type::WILD); decode_line_full (location.get (), DECODE_LINE_FUNFIRSTLINE, NULL, - (struct symtab *) NULL, 0, &canonical, + NULL, 0, &canonical, NULL, NULL); exp = skip_spaces (exp); if (exp[0] == ',') @@ -2601,7 +2656,7 @@ agent_command_1 (char *exp, int eval) } static void -agent_command (char *exp, int from_tty) +agent_command (const char *exp, int from_tty) { agent_command_1 (exp, 0); } @@ -2611,7 +2666,7 @@ agent_command (char *exp, int from_tty) expression. */ static void -agent_eval_command (char *exp, int from_tty) +agent_eval_command (const char *exp, int from_tty) { agent_command_1 (exp, 1); } @@ -2620,15 +2675,10 @@ agent_eval_command (char *exp, int from_tty) that does a printf, and display the resulting expression. */ static void -maint_agent_printf_command (char *exp, int from_tty) +maint_agent_printf_command (const char *cmdrest, int from_tty) { - struct cleanup *old_chain = 0; - struct expression *argvec[100]; struct frame_info *fi = get_current_frame (); /* need current scope */ - const char *cmdrest; const char *format_start, *format_end; - struct format_piece *fpieces; - int nargs; /* We don't deal with overlay debugging at the moment. We need to think more carefully about this. If you copy this code into @@ -2637,45 +2687,40 @@ maint_agent_printf_command (char *exp, int from_tty) if (overlay_debugging) error (_("GDB can't do agent expression translation with overlays.")); - if (exp == 0) + if (cmdrest == 0) error_no_arg (_("expression to translate")); - cmdrest = exp; - - cmdrest = skip_spaces_const (cmdrest); + cmdrest = skip_spaces (cmdrest); if (*cmdrest++ != '"') error (_("Must start with a format string.")); format_start = cmdrest; - fpieces = parse_format_string (&cmdrest); - - old_chain = make_cleanup (free_format_pieces_cleanup, &fpieces); + format_pieces fpieces (&cmdrest); format_end = cmdrest; if (*cmdrest++ != '"') error (_("Bad format string, non-terminated '\"'.")); - cmdrest = skip_spaces_const (cmdrest); + cmdrest = skip_spaces (cmdrest); if (*cmdrest != ',' && *cmdrest != 0) error (_("Invalid argument syntax")); if (*cmdrest == ',') cmdrest++; - cmdrest = skip_spaces_const (cmdrest); + cmdrest = skip_spaces (cmdrest); - nargs = 0; + std::vector argvec; while (*cmdrest != '\0') { const char *cmd1; cmd1 = cmdrest; expression_up expr = parse_exp_1 (&cmd1, 0, (struct block *) 0, 1); - argvec[nargs] = expr.release (); - ++nargs; + argvec.push_back (expr.release ()); cmdrest = cmd1; if (*cmdrest == ',') ++cmdrest; @@ -2686,28 +2731,26 @@ maint_agent_printf_command (char *exp, int from_tty) agent_expr_up agent = gen_printf (get_frame_pc (fi), get_current_arch (), 0, 0, format_start, format_end - format_start, - fpieces, nargs, argvec); + argvec.size (), argvec.data ()); ax_reqs (agent.get ()); ax_print (gdb_stdout, agent.get ()); /* It would be nice to call ax_reqs here to gather some general info about the expression, and then print out the result. */ - do_cleanups (old_chain); dont_repeat (); } - /* Initialization code. */ -void _initialize_ax_gdb (void); +void _initialize_ax_gdb (); void -_initialize_ax_gdb (void) +_initialize_ax_gdb () { add_cmd ("agent", class_maintenance, agent_command, _("\ Translate an expression into remote agent bytecode for tracing.\n\ -Usage: maint agent [-at location,] EXPRESSION\n\ +Usage: maint agent [-at LOCATION,] EXPRESSION\n\ If -at is given, generate remote agent bytecode for this location.\n\ If not, generate remote agent bytecode for current frame pc address."), &maintenancelist); @@ -2715,7 +2758,7 @@ If not, generate remote agent bytecode for current frame pc address."), add_cmd ("agent-eval", class_maintenance, agent_eval_command, _("\ Translate an expression into remote agent bytecode for evaluation.\n\ -Usage: maint agent-eval [-at location,] EXPRESSION\n\ +Usage: maint agent-eval [-at LOCATION,] EXPRESSION\n\ If -at is given, generate remote agent bytecode for this location.\n\ If not, generate remote agent bytecode for current frame pc address."), &maintenancelist);