Use an accessor function for general_symbol_info::language
[deliverable/binutils-gdb.git] / gdb / ax-gdb.c
index 8da05144426be34ae242b2862218eb1d649d4f0b..d25413ea1f2f15ac1d05353865a9425e4c088b7b 100644 (file)
@@ -1,6 +1,6 @@
 /* GDB-specific functions for operating on agent expressions.
 
-   Copyright (C) 1998-2017 Free Software Foundation, Inc.
+   Copyright (C) 1998-2019 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #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,
@@ -77,8 +77,7 @@ static struct value *const_var_ref (struct symbol *var);
 static struct value *const_expr (union exp_element **pc);
 static struct value *maybe_const_expr (union exp_element **pc);
 
-static void gen_traced_pop (struct gdbarch *, struct agent_expr *,
-                           struct axs_value *);
+static void gen_traced_pop (struct agent_expr *, struct axs_value *);
 
 static void gen_sign_extend (struct agent_expr *, struct type *);
 static void gen_extend (struct agent_expr *, struct type *);
@@ -86,12 +85,12 @@ static void gen_fetch (struct agent_expr *, struct type *);
 static void gen_left_shift (struct agent_expr *, int);
 
 
-static void gen_frame_args_address (struct gdbarch *, struct agent_expr *);
-static void gen_frame_locals_address (struct gdbarch *, struct agent_expr *);
+static void gen_frame_args_address (struct agent_expr *);
+static void gen_frame_locals_address (struct agent_expr *);
 static void gen_offset (struct agent_expr *ax, int offset);
 static void gen_sym_offset (struct agent_expr *, struct symbol *);
-static void gen_var_ref (struct gdbarch *, struct agent_expr *ax,
-                        struct axs_value *value, struct symbol *var);
+static void gen_var_ref (struct agent_expr *ax, struct axs_value *value,
+                        struct symbol *var);
 
 
 static void gen_int_literal (struct agent_expr *ax,
@@ -146,8 +145,7 @@ static void gen_struct_ref (struct agent_expr *ax,
                            const char *field,
                            const char *operator_name,
                            const char *operand_name);
-static void gen_static_field (struct gdbarch *gdbarch,
-                             struct agent_expr *ax, struct axs_value *value,
+static void gen_static_field (struct agent_expr *ax, struct axs_value *value,
                              struct type *type, int fieldno);
 static void gen_repeat (struct expression *exp, union exp_element **pc,
                        struct agent_expr *ax, struct axs_value *value);
@@ -160,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);
 \f
 
 /* Detecting constant expressions.  */
@@ -312,8 +308,7 @@ maybe_const_expr (union exp_element **pc)
    classes, and generate tracing bytecodes for each.  */
 
 static void
-gen_trace_static_fields (struct gdbarch *gdbarch,
-                        struct agent_expr *ax,
+gen_trace_static_fields (struct agent_expr *ax,
                         struct type *type)
 {
   int i, nbases = TYPE_N_BASECLASSES (type);
@@ -325,7 +320,7 @@ gen_trace_static_fields (struct gdbarch *gdbarch,
     {
       if (field_is_static (&TYPE_FIELD (type, i)))
        {
-         gen_static_field (gdbarch, ax, &value, type, i);
+         gen_static_field (ax, &value, type, i);
          if (value.optimized_out)
            continue;
          switch (value.kind)
@@ -355,7 +350,7 @@ gen_trace_static_fields (struct gdbarch *gdbarch,
     {
       struct type *basetype = check_typedef (TYPE_BASECLASS (type, i));
 
-      gen_trace_static_fields (gdbarch, ax, basetype);
+      gen_trace_static_fields (ax, basetype);
     }
 }
 
@@ -363,8 +358,7 @@ gen_trace_static_fields (struct gdbarch *gdbarch,
    the value.  Useful on the left side of a comma, and at the end of
    an expression being used for tracing.  */
 static void
-gen_traced_pop (struct gdbarch *gdbarch,
-               struct agent_expr *ax, struct axs_value *value)
+gen_traced_pop (struct agent_expr *ax, struct axs_value *value)
 {
   int string_trace = 0;
   if (ax->trace_string
@@ -437,7 +431,7 @@ gen_traced_pop (struct gdbarch *gdbarch,
   if (ax->tracing
       && (TYPE_CODE (value->type) == TYPE_CODE_STRUCT
          || TYPE_CODE (value->type) == TYPE_CODE_UNION))
-    gen_trace_static_fields (gdbarch, ax, value->type);
+    gen_trace_static_fields (ax, value->type);
 }
 \f
 
@@ -556,12 +550,12 @@ gen_left_shift (struct agent_expr *ax, int distance)
 /* Generate code to push the base address of the argument portion of
    the top stack frame.  */
 static void
-gen_frame_args_address (struct gdbarch *gdbarch, struct agent_expr *ax)
+gen_frame_args_address (struct agent_expr *ax)
 {
   int frame_reg;
   LONGEST frame_offset;
 
-  gdbarch_virtual_frame_pointer (gdbarch,
+  gdbarch_virtual_frame_pointer (ax->gdbarch,
                                 ax->scope, &frame_reg, &frame_offset);
   ax_reg (ax, frame_reg);
   gen_offset (ax, frame_offset);
@@ -571,12 +565,12 @@ gen_frame_args_address (struct gdbarch *gdbarch, struct agent_expr *ax)
 /* Generate code to push the base address of the locals portion of the
    top stack frame.  */
 static void
-gen_frame_locals_address (struct gdbarch *gdbarch, struct agent_expr *ax)
+gen_frame_locals_address (struct agent_expr *ax)
 {
   int frame_reg;
   LONGEST frame_offset;
 
-  gdbarch_virtual_frame_pointer (gdbarch,
+  gdbarch_virtual_frame_pointer (ax->gdbarch,
                                 ax->scope, &frame_reg, &frame_offset);
   ax_reg (ax, frame_reg);
   gen_offset (ax, frame_offset);
@@ -621,8 +615,7 @@ gen_sym_offset (struct agent_expr *ax, struct symbol *var)
    symbol VAR.  Set VALUE to describe the result.  */
 
 static void
-gen_var_ref (struct gdbarch *gdbarch, struct agent_expr *ax,
-            struct axs_value *value, struct symbol *var)
+gen_var_ref (struct agent_expr *ax, struct axs_value *value, struct symbol *var)
 {
   /* Dereference any typedefs.  */
   value->type = check_typedef (SYMBOL_TYPE (var));
@@ -630,7 +623,7 @@ gen_var_ref (struct gdbarch *gdbarch, struct agent_expr *ax,
 
   if (SYMBOL_COMPUTED_OPS (var) != NULL)
     {
-      SYMBOL_COMPUTED_OPS (var)->tracepoint_var_ref (var, gdbarch, ax, value);
+      SYMBOL_COMPUTED_OPS (var)->tracepoint_var_ref (var, ax, value);
       return;
     }
 
@@ -660,33 +653,33 @@ gen_var_ref (struct gdbarch *gdbarch, struct agent_expr *ax,
       break;
 
     case LOC_ARG:              /* var lives in argument area of frame */
-      gen_frame_args_address (gdbarch, ax);
+      gen_frame_args_address (ax);
       gen_sym_offset (ax, var);
       value->kind = axs_lvalue_memory;
       break;
 
     case LOC_REF_ARG:          /* As above, but the frame slot really
                                   holds the address of the variable.  */
-      gen_frame_args_address (gdbarch, ax);
+      gen_frame_args_address (ax);
       gen_sym_offset (ax, var);
       /* Don't assume any particular pointer size.  */
-      gen_fetch (ax, builtin_type (gdbarch)->builtin_data_ptr);
+      gen_fetch (ax, builtin_type (ax->gdbarch)->builtin_data_ptr);
       value->kind = axs_lvalue_memory;
       break;
 
     case LOC_LOCAL:            /* var lives in locals area of frame */
-      gen_frame_locals_address (gdbarch, ax);
+      gen_frame_locals_address (ax);
       gen_sym_offset (ax, var);
       value->kind = axs_lvalue_memory;
       break;
 
     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;
 
@@ -695,7 +688,8 @@ gen_var_ref (struct gdbarch *gdbarch, struct agent_expr *ax,
          this as an lvalue or rvalue, the caller will generate the
          right code.  */
       value->kind = axs_lvalue_register;
-      value->u.reg = SYMBOL_REGISTER_OPS (var)->register_number (var, gdbarch);
+      value->u.reg
+       = SYMBOL_REGISTER_OPS (var)->register_number (var, ax->gdbarch);
       break;
 
       /* A lot like LOC_REF_ARG, but the pointer lives directly in a
@@ -703,17 +697,18 @@ gen_var_ref (struct gdbarch *gdbarch, struct agent_expr *ax,
          because it's just like any other case where the thing
         has a real address.  */
     case LOC_REGPARM_ADDR:
-      ax_reg (ax, SYMBOL_REGISTER_OPS (var)->register_number (var, gdbarch));
+      ax_reg (ax,
+             SYMBOL_REGISTER_OPS (var)->register_number (var, ax->gdbarch));
       value->kind = axs_lvalue_memory;
       break;
 
     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));
@@ -732,10 +727,27 @@ gen_var_ref (struct gdbarch *gdbarch, struct agent_expr *ax,
 
     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;
+}
+
 \f
 
 
@@ -1446,7 +1458,7 @@ gen_struct_ref_recursive (struct agent_expr *ax, struct axs_value *value,
                 being handled as a global.  */
              if (field_is_static (&TYPE_FIELD (type, i)))
                {
-                 gen_static_field (ax->gdbarch, ax, value, type, i);
+                 gen_static_field (ax, value, type, i);
                  if (value->optimized_out)
                    error (_("static field `%s' has been "
                             "optimized out, cannot use"),
@@ -1521,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 (type));
 }
 
 static int
@@ -1532,8 +1544,7 @@ gen_maybe_namespace_elt (struct agent_expr *ax, struct axs_value *value,
                         const struct type *curtype, char *name);
 
 static void
-gen_static_field (struct gdbarch *gdbarch,
-                 struct agent_expr *ax, struct axs_value *value,
+gen_static_field (struct agent_expr *ax, struct axs_value *value,
                  struct type *type, int fieldno)
 {
   if (TYPE_FIELD_LOC_KIND (type, fieldno) == FIELD_LOC_KIND_PHYSADDR)
@@ -1550,7 +1561,7 @@ gen_static_field (struct gdbarch *gdbarch,
 
       if (sym)
        {
-         gen_var_ref (gdbarch, ax, value, sym);
+         gen_var_ref (ax, value, sym);
   
          /* Don't error if the value was optimized out, we may be
             scanning all static fields and just want to pass over this
@@ -1585,7 +1596,7 @@ gen_struct_elt_for_reference (struct agent_expr *ax, struct axs_value *value,
        {
          if (field_is_static (&TYPE_FIELD (t, i)))
            {
-             gen_static_field (ax->gdbarch, ax, value, t, i);
+             gen_static_field (ax, value, t, i);
              if (value->optimized_out)
                error (_("static field `%s' has been "
                         "optimized out, cannot use"),
@@ -1618,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, TYPE_NAME (curtype));
 
   return found;
 }
@@ -1633,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 = TYPE_NAME (curtype);
   struct block_symbol sym;
 
   sym = cp_lookup_symbol_namespace (namespace_name, name,
@@ -1643,11 +1654,11 @@ gen_maybe_namespace_elt (struct agent_expr *ax, struct axs_value *value,
   if (sym.symbol == NULL)
     return 0;
 
-  gen_var_ref (ax->gdbarch, ax, value, sym.symbol);
+  gen_var_ref (ax, value, sym.symbol);
 
   if (value->optimized_out)
     error (_("`%s' has been optimized out, cannot use"),
-          SYMBOL_PRINT_NAME (sym.symbol));
+          sym.symbol->print_name ());
 
   return 1;
 }
@@ -1655,9 +1666,7 @@ gen_maybe_namespace_elt (struct agent_expr *ax, struct axs_value *value,
 
 static int
 gen_aggregate_elt_ref (struct agent_expr *ax, struct axs_value *value,
-                      struct type *type, char *field,
-                      const char *operator_name,
-                      const char *operand_name)
+                      struct type *type, char *field)
 {
   switch (TYPE_CODE (type))
     {
@@ -1754,6 +1763,40 @@ gen_sizeof (struct expression *exp, union exp_element **pc,
 }
 \f
 
+/* 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 (TYPE_CODE (value->type) == 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 */
@@ -1868,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;
@@ -1945,7 +1988,7 @@ gen_expr (struct expression *exp, union exp_element **pc,
       /* Don't just dispose of the left operand.  We might be tracing,
          in which case we want to emit code to trace it if it's an
          lvalue.  */
-      gen_traced_pop (ax->gdbarch, ax, &value1);
+      gen_traced_pop (ax, &value1);
       gen_expr (exp, pc, ax, value);
       /* It's the consumer's responsibility to trace the right operand.  */
       break;
@@ -1961,11 +2004,23 @@ gen_expr (struct expression *exp, union exp_element **pc,
       break;
 
     case OP_VAR_VALUE:
-      gen_var_ref (ax->gdbarch, ax, value, (*pc)[2].symbol);
+      gen_var_ref (ax, value, (*pc)[2].symbol);
 
       if (value->optimized_out)
        error (_("`%s' has been optimized out, cannot use"),
-              SYMBOL_PRINT_NAME ((*pc)[2].symbol));
+              (*pc)[2].symbol->print_name ());
+
+      if (TYPE_CODE (value->type) == 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 (TYPE_CODE (value->type) == TYPE_CODE_ERROR)
+       error_unknown_type ((*pc)[2].msymbol->linkage_name ());
 
       (*pc) += 4;
       break;
@@ -1981,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);
@@ -2027,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;
 
@@ -2043,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;
 
@@ -2179,17 +2230,17 @@ 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)
          error (_("no `%s' found"), lang->la_name_of_this);
 
-       gen_var_ref (ax->gdbarch, ax, value, sym);
+       gen_var_ref (ax, value, sym);
 
        if (value->optimized_out)
          error (_("`%s' has been optimized out, cannot use"),
-                SYMBOL_PRINT_NAME (sym));
+                sym->print_name ());
 
        (*pc) += 2;
       }
@@ -2202,7 +2253,7 @@ gen_expr (struct expression *exp, union exp_element **pc,
        char *name = &(*pc)[3].string;
        int found;
 
-       found = gen_aggregate_elt_ref (ax, value, type, name, "?", "??");
+       found = gen_aggregate_elt_ref (ax, value, type, name);
        if (!found)
          error (_("There is no field named %s"), name);
        (*pc) += 5 + BYTES_TO_EXP_ELEM (length + 1);
@@ -2386,7 +2437,7 @@ gen_trace_for_var (CORE_ADDR scope, struct gdbarch *gdbarch,
 
   ax->tracing = 1;
   ax->trace_string = trace_string;
-  gen_var_ref (gdbarch, ax.get (), &value, var);
+  gen_var_ref (ax.get (), &value, var);
 
   /* If there is no actual variable to trace, flag it by returning
      an empty agent expression.  */
@@ -2394,7 +2445,7 @@ gen_trace_for_var (CORE_ADDR scope, struct gdbarch *gdbarch,
     return agent_expr_up ();
 
   /* Make sure we record the final object, and get rid of it.  */
-  gen_traced_pop (gdbarch, ax.get (), &value);
+  gen_traced_pop (ax.get (), &value);
 
   /* Oh, and terminate.  */
   ax_simple (ax.get (), aop_end);
@@ -2425,7 +2476,7 @@ gen_trace_for_expr (CORE_ADDR scope, struct expression *expr,
   gen_expr (expr, &pc, ax.get (), &value);
 
   /* Make sure we record the final object, and get rid of it.  */
-  gen_traced_pop (expr->gdbarch, ax.get (), &value);
+  gen_traced_pop (ax.get (), &value);
 
   /* Oh, and terminate.  */
   ax_simple (ax.get (), aop_end);
@@ -2473,7 +2524,7 @@ gen_trace_for_return_address (CORE_ADDR scope, struct gdbarch *gdbarch,
   gdbarch_gen_return_address (gdbarch, ax.get (), &value, scope);
 
   /* Make sure we record the final object, and get rid of it.  */
-  gen_traced_pop (gdbarch, ax.get (), &value);
+  gen_traced_pop (ax.get (), &value);
 
   /* Oh, and terminate.  */
   ax_simple (ax.get (), aop_end);
@@ -2489,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));
@@ -2568,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
@@ -2583,14 +2633,11 @@ agent_command_1 (char *exp, int eval)
   if (check_for_argument (&exp, "-at", sizeof ("-at") - 1))
     {
       struct linespec_result canonical;
-      int ix;
-      struct linespec_sals *iter;
-
-      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] == ',')
@@ -2598,13 +2645,9 @@ agent_command_1 (char *exp, int eval)
          exp++;
          exp = skip_spaces (exp);
        }
-      for (ix = 0; VEC_iterate (linespec_sals, canonical.sals, ix, iter); ++ix)
-        {
-         int i;
-
-         for (i = 0; i < iter->sals.nelts; i++)
-           agent_eval_command_one (exp, eval, iter->sals.sals[i].pc);
-        }
+      for (const auto &lsal : canonical.lsals)
+       for (const auto &sal : lsal.sals)
+         agent_eval_command_one (exp, eval, sal.pc);
     }
   else
     agent_eval_command_one (exp, eval, get_frame_pc (get_current_frame ()));
@@ -2613,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);
 }
@@ -2623,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);
 }
@@ -2632,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
@@ -2649,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<struct expression *> 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;
@@ -2698,28 +2731,25 @@ 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 ();
 }
-\f
 
 /* Initialization code.  */
 
-void _initialize_ax_gdb (void);
 void
 _initialize_ax_gdb (void)
 {
   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);
@@ -2727,7 +2757,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);
This page took 0.034608 seconds and 4 git commands to generate.