gdb: LoongArch: Define LOONGARCH_LINUX_NUM_GREGSET as 45
[binutils-gdb.git] / gdb / tracepoint.c
index f66cc686b8e0785242138083c2ac63afb1d610f6..44d16b55bca64736e9cf98d2eefe8d75e789f245 100644 (file)
@@ -1,6 +1,6 @@
 /* Tracing functionality for remote targets in custom GDB protocol
 
-   Copyright (C) 1997-2018 Free Software Foundation, Inc.
+   Copyright (C) 1997-2022 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "memrange.h"
 #include "cli/cli-utils.h"
 #include "probe.h"
-#include "ctf.h"
-#include "filestuff.h"
-#include "rsp-low.h"
+#include "gdbsupport/filestuff.h"
+#include "gdbsupport/rsp-low.h"
 #include "tracefile.h"
 #include "location.h"
 #include <algorithm>
-
-/* readline include files */
-#include "readline/readline.h"
-#include "readline/history.h"
-
-/* readline defines this.  */
-#undef savestring
+#include "cli/cli-style.h"
+#include "expop.h"
+#include "gdbsupport/buildargv.h"
 
 #include <unistd.h>
 
    large.  (400 - 31)/2 == 184 */
 #define MAX_AGENT_EXPR_LEN     184
 
-/* A hook used to notify the UI of tracepoint operations.  */
-
-void (*deprecated_trace_find_hook) (char *arg, int from_tty);
-void (*deprecated_trace_start_stop_hook) (int start, int from_tty);
-
 /* 
    Tracepoint.c:
 
@@ -114,10 +104,7 @@ void (*deprecated_trace_start_stop_hook) (int start, int from_tty);
    any of these for any reason - API is by name or number only - so it
    works to have a vector of objects.  */
 
-typedef struct trace_state_variable tsv_s;
-DEF_VEC_O(tsv_s);
-
-static VEC(tsv_s) *tvariables;
+static std::vector<trace_state_variable> tvariables;
 
 /* The next integer to assign to a variable.  */
 
@@ -139,14 +126,14 @@ static traceframe_info_up current_traceframe_info;
 static struct cmd_list_element *tfindlist;
 
 /* List of expressions to collect by default at each tracepoint hit.  */
-char *default_collect;
+std::string default_collect;
 
-static int disconnected_tracing;
+static bool disconnected_tracing;
 
 /* This variable controls whether we ask the target for a linear or
    circular trace buffer.  */
 
-static int circular_trace_buffer;
+static bool circular_trace_buffer;
 
 /* This variable is the requested trace buffer size, or -1 to indicate
    that we don't care and leave it up to the target to set a size.  */
@@ -155,23 +142,22 @@ static int trace_buffer_size = -1;
 
 /* Textual notes applying to the current and/or future trace runs.  */
 
-char *trace_user = NULL;
+static std::string trace_user;
 
 /* Textual notes applying to the current and/or future trace runs.  */
 
-char *trace_notes = NULL;
+static std::string trace_notes;
 
 /* Textual notes applying to the stopping of a trace.  */
 
-char *trace_stop_notes = NULL;
+static std::string trace_stop_notes;
 
 /* support routines */
 
 struct collection_list;
 static char *mem2hex (gdb_byte *, char *, int);
 
-static struct command_line *
-  all_tracepoint_actions_and_cleanup (struct breakpoint *t);
+static counted_command_line all_tracepoint_actions (struct breakpoint *);
 
 static struct trace_status trace_status;
 
@@ -247,11 +233,11 @@ set_traceframe_context (struct frame_info *trace_frame)
   /* Save func name as "$trace_func", a debugger variable visible to
      users.  */
   if (traceframe_fun == NULL
-      || SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
+      || traceframe_fun->linkage_name () == NULL)
     clear_internalvar (lookup_internalvar ("trace_func"));
   else
     set_internalvar_string (lookup_internalvar ("trace_func"),
-                           SYMBOL_LINKAGE_NAME (traceframe_fun));
+                           traceframe_fun->linkage_name ());
 
   /* Save file name as "$trace_file", a debugger variable visible to
      users.  */
@@ -267,12 +253,8 @@ set_traceframe_context (struct frame_info *trace_frame)
 struct trace_state_variable *
 create_trace_state_variable (const char *name)
 {
-  struct trace_state_variable tsv;
-
-  memset (&tsv, 0, sizeof (tsv));
-  tsv.name = xstrdup (name);
-  tsv.number = next_tsv_number++;
-  return VEC_safe_push (tsv_s, tvariables, &tsv);
+  tvariables.emplace_back (name, next_tsv_number++);
+  return &tvariables.back ();
 }
 
 /* Look for a trace state variable of the given name.  */
@@ -280,12 +262,9 @@ create_trace_state_variable (const char *name)
 struct trace_state_variable *
 find_trace_state_variable (const char *name)
 {
-  struct trace_state_variable *tsv;
-  int ix;
-
-  for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
-    if (strcmp (name, tsv->name) == 0)
-      return tsv;
+  for (trace_state_variable &tsv : tvariables)
+    if (tsv.name == name)
+      return &tsv;
 
   return NULL;
 }
@@ -296,12 +275,9 @@ find_trace_state_variable (const char *name)
 struct trace_state_variable *
 find_trace_state_variable_by_number (int number)
 {
-  struct trace_state_variable *tsv;
-  int ix;
-
-  for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
-    if (tsv->number == number)
-      return tsv;
+  for (trace_state_variable &tsv : tvariables)
+    if (tsv.number == number)
+      return &tsv;
 
   return NULL;
 }
@@ -309,17 +285,11 @@ find_trace_state_variable_by_number (int number)
 static void
 delete_trace_state_variable (const char *name)
 {
-  struct trace_state_variable *tsv;
-  int ix;
-
-  for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
-    if (strcmp (name, tsv->name) == 0)
+  for (auto it = tvariables.begin (); it != tvariables.end (); it++)
+    if (it->name == name)
       {
-       gdb::observers::tsv_deleted.notify (tsv);
-
-       xfree ((void *)tsv->name);
-       VEC_unordered_remove (tsv_s, tvariables, ix);
-
+       gdb::observers::tsv_deleted.notify (&*it);
+       tvariables.erase (it);
        return;
       }
 
@@ -392,9 +362,9 @@ trace_variable_command (const char *args, int from_tty)
          tsv->initial_value = initval;
          gdb::observers::tsv_modified.notify (tsv);
        }
-      printf_filtered (_("Trace state variable $%s "
-                        "now has initial value %s.\n"),
-                      tsv->name, plongest (tsv->initial_value));
+      gdb_printf (_("Trace state variable $%s "
+                   "now has initial value %s.\n"),
+                 tsv->name.c_str (), plongest (tsv->initial_value));
       return;
     }
 
@@ -404,9 +374,9 @@ trace_variable_command (const char *args, int from_tty)
 
   gdb::observers::tsv_created.notify (tsv);
 
-  printf_filtered (_("Trace state variable $%s "
-                    "created, with initial value %s.\n"),
-                  tsv->name, plongest (tsv->initial_value));
+  gdb_printf (_("Trace state variable $%s "
+               "created, with initial value %s.\n"),
+             tsv->name.c_str (), plongest (tsv->initial_value));
 }
 
 static void
@@ -415,7 +385,7 @@ delete_trace_variable_command (const char *args, int from_tty)
   if (args == NULL)
     {
       if (query (_("Delete all trace state variables? ")))
-       VEC_free (tsv_s, tvariables);
+       tvariables.clear ();
       dont_repeat ();
       gdb::observers::tsv_deleted.notify (NULL);
       return;
@@ -437,56 +407,59 @@ delete_trace_variable_command (const char *args, int from_tty)
 void
 tvariables_info_1 (void)
 {
-  struct trace_state_variable *tsv;
-  int ix;
-  int count = 0;
   struct ui_out *uiout = current_uiout;
 
-  if (VEC_length (tsv_s, tvariables) == 0 && !uiout->is_mi_like_p ())
-    {
-      printf_filtered (_("No trace state variables.\n"));
-      return;
-    }
-
   /* Try to acquire values from the target.  */
-  for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix, ++count)
-    tsv->value_known = target_get_trace_state_variable_value (tsv->number,
-                                                             &(tsv->value));
+  for (trace_state_variable &tsv : tvariables)
+    tsv.value_known
+      = target_get_trace_state_variable_value (tsv.number, &tsv.value);
 
-  ui_out_emit_table table_emitter (uiout, 3, count, "trace-variables");
-  uiout->table_header (15, ui_left, "name", "Name");
-  uiout->table_header (11, ui_left, "initial", "Initial");
-  uiout->table_header (11, ui_left, "current", "Current");
+  {
+    ui_out_emit_table table_emitter (uiout, 3, tvariables.size (),
+                                    "trace-variables");
+    uiout->table_header (15, ui_left, "name", "Name");
+    uiout->table_header (11, ui_left, "initial", "Initial");
+    uiout->table_header (11, ui_left, "current", "Current");
 
-  uiout->table_body ();
+    uiout->table_body ();
 
-  for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
-    {
-      const char *c;
-
-      ui_out_emit_tuple tuple_emitter (uiout, "variable");
-
-      std::string name = std::string ("$") + tsv->name;
-      uiout->field_string ("name", name.c_str ());
-      uiout->field_string ("initial", plongest (tsv->initial_value));
-
-      if (tsv->value_known)
-        c = plongest (tsv->value);
-      else if (uiout->is_mi_like_p ())
-        /* For MI, we prefer not to use magic string constants, but rather
-           omit the field completely.  The difference between unknown and
-           undefined does not seem important enough to represent.  */
-        c = NULL;
-      else if (current_trace_status ()->running || traceframe_number >= 0)
-       /* The value is/was defined, but we don't have it.  */
-        c = "<unknown>";
-      else
-       /* It is not meaningful to ask about the value.  */
-        c = "<undefined>";
-      if (c)
-        uiout->field_string ("current", c);
-      uiout->text ("\n");
-    }
+    for (const trace_state_variable &tsv : tvariables)
+      {
+       const char *c;
+
+       ui_out_emit_tuple tuple_emitter (uiout, "variable");
+
+       uiout->field_string ("name", std::string ("$") + tsv.name);
+       uiout->field_string ("initial", plongest (tsv.initial_value));
+
+       ui_file_style style;
+       if (tsv.value_known)
+         c = plongest (tsv.value);
+       else if (uiout->is_mi_like_p ())
+         /* For MI, we prefer not to use magic string constants, but rather
+            omit the field completely.  The difference between unknown and
+            undefined does not seem important enough to represent.  */
+         c = NULL;
+       else if (current_trace_status ()->running || traceframe_number >= 0)
+         {
+           /* The value is/was defined, but we don't have it.  */
+           c = "<unknown>";
+           style = metadata_style.style ();
+         }
+       else
+         {
+           /* It is not meaningful to ask about the value.  */
+           c = "<undefined>";
+           style = metadata_style.style ();
+         }
+       if (c)
+         uiout->field_string ("current", c, style);
+       uiout->text ("\n");
+      }
+  }
+
+  if (tvariables.empty ())
+    uiout->text (_("No trace state variables.\n"));
 }
 
 /* List all the trace state variables.  */
@@ -502,15 +475,12 @@ info_tvariables_command (const char *args, int from_tty)
 void
 save_trace_state_variables (struct ui_file *fp)
 {
-  struct trace_state_variable *tsv;
-  int ix;
-
-  for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
+  for (const trace_state_variable &tsv : tvariables)
     {
-      fprintf_unfiltered (fp, "tvariable $%s", tsv->name);
-      if (tsv->initial_value)
-       fprintf_unfiltered (fp, " = %s", plongest (tsv->initial_value));
-      fprintf_unfiltered (fp, "\n");
+      gdb_printf (fp, "tvariable $%s", tsv.name.c_str ());
+      if (tsv.initial_value)
+       gdb_printf (fp, " = %s", plongest (tsv.initial_value));
+      gdb_printf (fp, "\n");
     }
 }
 
@@ -604,8 +574,12 @@ actions_command (const char *args, int from_tty)
        string_printf ("Enter actions for tracepoint %d, one per line.",
                       t->number);
 
-      command_line_up l = read_command_lines (&tmpbuf[0], from_tty, 1,
-                                             check_tracepoint_command, t);
+      counted_command_line l = read_command_lines (tmpbuf.c_str (),
+                                                  from_tty, 1,
+                                                  [=] (const char *line)
+                                                    {
+                                                      validate_actionline (line, t);
+                                                    });
       breakpoint_set_commands (t, std::move (l));
     }
   /* else just return */
@@ -638,6 +612,19 @@ report_agent_reqs_errors (struct agent_expr *aexpr)
     error (_("Expression is too complicated."));
 }
 
+/* Call ax_reqs on AEXPR and raise an error if something is wrong.  */
+
+static void
+finalize_tracepoint_aexpr (struct agent_expr *aexpr)
+{
+  ax_reqs (aexpr);
+
+  if (aexpr->len > MAX_AGENT_EXPR_LEN)
+    error (_("Expression is too complicated."));
+
+  report_agent_reqs_errors (aexpr);
+}
+
 /* worker function */
 void
 validate_actionline (const char *line, struct breakpoint *b)
@@ -645,7 +632,6 @@ validate_actionline (const char *line, struct breakpoint *b)
   struct cmd_list_element *c;
   const char *tmp_p;
   const char *p;
-  struct bp_location *loc;
   struct tracepoint *t = (struct tracepoint *) b;
 
   /* If EOF is typed, *line is NULL.  */
@@ -661,11 +647,11 @@ validate_actionline (const char *line, struct breakpoint *b)
   if (*p == '#')               /* comment line */
     return;
 
-  c = lookup_cmd (&p, cmdlist, "", -1, 1);
+  c = lookup_cmd (&p, cmdlist, "", NULL, -1, 1);
   if (c == 0)
     error (_("`%s' is not a tracepoint action, or is ambiguous."), p);
 
-  if (cmd_cfunc_eq (c, collect_pseudocommand))
+  if (cmd_simple_func_eq (c, collect_pseudocommand))
     {
       int trace_string = 0;
 
@@ -691,27 +677,32 @@ validate_actionline (const char *line, struct breakpoint *b)
              /* else fall thru, treat p as an expression and parse it!  */
            }
          tmp_p = p;
-         for (loc = t->loc; loc; loc = loc->next)
+         for (bp_location *loc : t->locations ())
            {
              p = tmp_p;
              expression_up exp = parse_exp_1 (&p, loc->address,
                                               block_for_pc (loc->address), 1);
 
-             if (exp->elts[0].opcode == OP_VAR_VALUE)
+             if (exp->first_opcode () == OP_VAR_VALUE)
                {
-                 if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
+                 symbol *sym;
+                 expr::var_value_operation *vvop
+                   = (dynamic_cast<expr::var_value_operation *>
+                      (exp->op.get ()));
+                 sym = vvop->get_symbol ();
+
+                 if (sym->aclass () == LOC_CONST)
                    {
                      error (_("constant `%s' (value %s) "
                               "will not be collected."),
-                            SYMBOL_PRINT_NAME (exp->elts[2].symbol),
-                            plongest (SYMBOL_VALUE (exp->elts[2].symbol)));
+                            sym->print_name (),
+                            plongest (sym->value_longest ()));
                    }
-                 else if (SYMBOL_CLASS (exp->elts[2].symbol)
-                          == LOC_OPTIMIZED_OUT)
+                 else if (sym->aclass () == LOC_OPTIMIZED_OUT)
                    {
                      error (_("`%s' is optimized away "
                               "and cannot be collected."),
-                            SYMBOL_PRINT_NAME (exp->elts[2].symbol));
+                            sym->print_name ());
                    }
                }
 
@@ -722,18 +713,13 @@ validate_actionline (const char *line, struct breakpoint *b)
                                                        exp.get (),
                                                        trace_string);
 
-             if (aexpr->len > MAX_AGENT_EXPR_LEN)
-               error (_("Expression is too complicated."));
-
-             ax_reqs (aexpr.get ());
-
-             report_agent_reqs_errors (aexpr.get ());
+             finalize_tracepoint_aexpr (aexpr.get ());
            }
        }
       while (p && *p++ == ',');
     }
 
-  else if (cmd_cfunc_eq (c, teval_pseudocommand))
+  else if (cmd_simple_func_eq (c, teval_pseudocommand))
     {
       do
        {                       /* Repeat over a comma-separated list.  */
@@ -741,7 +727,7 @@ validate_actionline (const char *line, struct breakpoint *b)
          p = skip_spaces (p);
 
          tmp_p = p;
-         for (loc = t->loc; loc; loc = loc->next)
+         for (bp_location *loc : t->locations ())
            {
              p = tmp_p;
 
@@ -754,17 +740,13 @@ validate_actionline (const char *line, struct breakpoint *b)
                 long.  */
              agent_expr_up aexpr = gen_eval_for_expr (loc->address, exp.get ());
 
-             if (aexpr->len > MAX_AGENT_EXPR_LEN)
-               error (_("Expression is too complicated."));
-
-             ax_reqs (aexpr.get ());
-             report_agent_reqs_errors (aexpr.get ());
+             finalize_tracepoint_aexpr (aexpr.get ());
            }
        }
       while (p && *p++ == ',');
     }
 
-  else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
+  else if (cmd_simple_func_eq (c, while_stepping_pseudocommand))
     {
       char *endp;
 
@@ -775,7 +757,7 @@ validate_actionline (const char *line, struct breakpoint *b)
       p = endp;
     }
 
-  else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
+  else if (cmd_simple_func_eq (c, end_actions_pseudocommand))
     ;
 
   else
@@ -834,17 +816,77 @@ memrange_sortmerge (std::vector<memrange> &memranges)
     }
 }
 
-/* Add a register to a collection list.  */
+/* Add remote register number REGNO to the collection list mask.  */
 
 void
-collection_list::add_register (unsigned int regno)
+collection_list::add_remote_register (unsigned int regno)
 {
   if (info_verbose)
-    printf_filtered ("collect register %d\n", regno);
-  if (regno >= (8 * sizeof (m_regs_mask)))
-    error (_("Internal: register number %d too large for tracepoint"),
-          regno);
-  m_regs_mask[regno / 8] |= 1 << (regno % 8);
+    gdb_printf ("collect register %d\n", regno);
+
+  m_regs_mask.at (regno / 8) |= 1 << (regno % 8);
+}
+
+/* Add all the registers from the mask in AEXPR to the mask in the
+   collection list.  Registers in the AEXPR mask are already remote
+   register numbers.  */
+
+void
+collection_list::add_ax_registers (struct agent_expr *aexpr)
+{
+  if (aexpr->reg_mask_len > 0)
+    {
+      for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
+       {
+         QUIT; /* Allow user to bail out with ^C.  */
+         if (aexpr->reg_mask[ndx1] != 0)
+           {
+             /* Assume chars have 8 bits.  */
+             for (int ndx2 = 0; ndx2 < 8; ndx2++)
+               if (aexpr->reg_mask[ndx1] & (1 << ndx2))
+                 /* It's used -- record it.  */
+                 add_remote_register (ndx1 * 8 + ndx2);
+           }
+       }
+    }
+}
+
+/* If REGNO is raw, add its corresponding remote register number to
+   the mask.  If REGNO is a pseudo-register, figure out the necessary
+   registers using a temporary agent expression, and add it to the
+   list if it needs more than just a mask.  */
+
+void
+collection_list::add_local_register (struct gdbarch *gdbarch,
+                                    unsigned int regno,
+                                    CORE_ADDR scope)
+{
+  if (regno < gdbarch_num_regs (gdbarch))
+    {
+      int remote_regno = gdbarch_remote_register_number (gdbarch, regno);
+
+      if (remote_regno < 0)
+       error (_("Can't collect register %d"), regno);
+
+      add_remote_register (remote_regno);
+    }
+  else
+    {
+      agent_expr_up aexpr (new agent_expr (gdbarch, scope));
+
+      ax_reg_mask (aexpr.get (), regno);
+
+      finalize_tracepoint_aexpr (aexpr.get ());
+
+      add_ax_registers (aexpr.get ());
+
+      /* Usually ax_reg_mask for a pseudo-regiser only sets the
+        corresponding raw registers in the ax mask, but if this isn't
+        the case add the expression that is generated to the
+        collection list.  */
+      if (aexpr->len > 0)
+       add_aexpr (std::move (aexpr));
+    }
 }
 
 /* Add a memrange to a collection list.  */
@@ -852,10 +894,10 @@ collection_list::add_register (unsigned int regno)
 void
 collection_list::add_memrange (struct gdbarch *gdbarch,
                               int type, bfd_signed_vma base,
-                              unsigned long len)
+                              unsigned long len, CORE_ADDR scope)
 {
   if (info_verbose)
-    printf_filtered ("(%d,%s,%ld)\n", type, paddress (gdbarch, base), len);
+    gdb_printf ("(%d,%s,%ld)\n", type, paddress (gdbarch, base), len);
 
   /* type: memrange_absolute == memory, other n == basereg */
   /* base: addr if memory, offset if reg relative.  */
@@ -863,7 +905,7 @@ collection_list::add_memrange (struct gdbarch *gdbarch,
   m_memranges.emplace_back (type, base, base + len);
 
   if (type != memrange_absolute)    /* Better collect the base register!  */
-    add_register (type);
+    add_local_register (gdbarch, type, scope);
 }
 
 /* Add a symbol to a collection list.  */
@@ -880,85 +922,79 @@ collection_list::collect_symbol (struct symbol *sym,
   bfd_signed_vma offset;
   int treat_as_expr = 0;
 
-  len = TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym)));
-  switch (SYMBOL_CLASS (sym))
+  len = TYPE_LENGTH (check_typedef (sym->type ()));
+  switch (sym->aclass ())
     {
     default:
-      printf_filtered ("%s: don't know symbol class %d\n",
-                      SYMBOL_PRINT_NAME (sym),
-                      SYMBOL_CLASS (sym));
+      gdb_printf ("%s: don't know symbol class %d\n",
+                 sym->print_name (), sym->aclass ());
       break;
     case LOC_CONST:
-      printf_filtered ("constant %s (value %s) will not be collected.\n",
-                      SYMBOL_PRINT_NAME (sym), plongest (SYMBOL_VALUE (sym)));
+      gdb_printf ("constant %s (value %s) will not be collected.\n",
+                 sym->print_name (), plongest (sym->value_longest ()));
       break;
     case LOC_STATIC:
-      offset = SYMBOL_VALUE_ADDRESS (sym);
+      offset = sym->value_address ();
       if (info_verbose)
        {
-         printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
-                          SYMBOL_PRINT_NAME (sym), len,
-                          paddress (gdbarch, offset));
+         gdb_printf ("LOC_STATIC %s: collect %ld bytes at %s.\n",
+                     sym->print_name (), len,
+                     paddress (gdbarch, offset));
        }
       /* A struct may be a C++ class with static fields, go to general
         expression handling.  */
-      if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
+      if (sym->type ()->code () == TYPE_CODE_STRUCT)
        treat_as_expr = 1;
       else
-       add_memrange (gdbarch, memrange_absolute, offset, len);
+       add_memrange (gdbarch, memrange_absolute, offset, len, scope);
       break;
     case LOC_REGISTER:
       reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
       if (info_verbose)
-       printf_filtered ("LOC_REG[parm] %s: ", 
-                        SYMBOL_PRINT_NAME (sym));
-      add_register (reg);
+       gdb_printf ("LOC_REG[parm] %s: ", sym->print_name ());
+      add_local_register (gdbarch, reg, scope);
       /* Check for doubles stored in two registers.  */
       /* FIXME: how about larger types stored in 3 or more regs?  */
-      if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
+      if (sym->type ()->code () == TYPE_CODE_FLT &&
          len > register_size (gdbarch, reg))
-       add_register (reg + 1);
+       add_local_register (gdbarch, reg + 1, scope);
       break;
     case LOC_REF_ARG:
-      printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
-      printf_filtered ("       (will not collect %s)\n",
-                      SYMBOL_PRINT_NAME (sym));
+      gdb_printf ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
+      gdb_printf ("       (will not collect %s)\n", sym->print_name ());
       break;
     case LOC_ARG:
       reg = frame_regno;
-      offset = frame_offset + SYMBOL_VALUE (sym);
+      offset = frame_offset + sym->value_longest ();
       if (info_verbose)
        {
-         printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset %s"
-                          " from frame ptr reg %d\n",
-                          SYMBOL_PRINT_NAME (sym), len,
-                          paddress (gdbarch, offset), reg);
+         gdb_printf ("LOC_LOCAL %s: Collect %ld bytes at offset %s"
+                     " from frame ptr reg %d\n", sym->print_name (), len,
+                     paddress (gdbarch, offset), reg);
        }
-      add_memrange (gdbarch, reg, offset, len);
+      add_memrange (gdbarch, reg, offset, len, scope);
       break;
     case LOC_REGPARM_ADDR:
-      reg = SYMBOL_VALUE (sym);
+      reg = sym->value_longest ();
       offset = 0;
       if (info_verbose)
        {
-         printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset %s"
-                          " from reg %d\n",
-                          SYMBOL_PRINT_NAME (sym), len,
-                          paddress (gdbarch, offset), reg);
+         gdb_printf ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset %s"
+                     " from reg %d\n", sym->print_name (), len,
+                     paddress (gdbarch, offset), reg);
        }
-      add_memrange (gdbarch, reg, offset, len);
+      add_memrange (gdbarch, reg, offset, len, scope);
       break;
     case LOC_LOCAL:
       reg = frame_regno;
-      offset = frame_offset + SYMBOL_VALUE (sym);
+      offset = frame_offset + sym->value_longest ();
       if (info_verbose)
        {
-         printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset %s"
-                          " from frame ptr reg %d\n",
-                          SYMBOL_PRINT_NAME (sym), len,
-                          paddress (gdbarch, offset), reg);
+         gdb_printf ("LOC_LOCAL %s: Collect %ld bytes at offset %s"
+                     " from frame ptr reg %d\n", sym->print_name (), len,
+                     paddress (gdbarch, offset), reg);
        }
-      add_memrange (gdbarch, reg, offset, len);
+      add_memrange (gdbarch, reg, offset, len, scope);
       break;
 
     case LOC_UNRESOLVED:
@@ -966,8 +1002,8 @@ collection_list::collect_symbol (struct symbol *sym,
       break;
 
     case LOC_OPTIMIZED_OUT:
-      printf_filtered ("%s has been optimized out of existence.\n",
-                      SYMBOL_PRINT_NAME (sym));
+      gdb_printf ("%s has been optimized out of existence.\n",
+                 sym->print_name ());
       break;
 
     case LOC_COMPUTED:
@@ -986,66 +1022,20 @@ collection_list::collect_symbol (struct symbol *sym,
         have a location expression.  */
       if (!aexpr)
        {
-         printf_filtered ("%s has been optimized out of existence.\n",
-                          SYMBOL_PRINT_NAME (sym));
+         gdb_printf ("%s has been optimized out of existence.\n",
+                     sym->print_name ());
          return;
        }
 
-      ax_reqs (aexpr.get ());
-
-      report_agent_reqs_errors (aexpr.get ());
+      finalize_tracepoint_aexpr (aexpr.get ());
 
       /* Take care of the registers.  */
-      if (aexpr->reg_mask_len > 0)
-       {
-         for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
-           {
-             QUIT;     /* Allow user to bail out with ^C.  */
-             if (aexpr->reg_mask[ndx1] != 0)
-               {
-                 /* Assume chars have 8 bits.  */
-                 for (int ndx2 = 0; ndx2 < 8; ndx2++)
-                   if (aexpr->reg_mask[ndx1] & (1 << ndx2))
-                     /* It's used -- record it.  */
-                     add_register (ndx1 * 8 + ndx2);
-               }
-           }
-       }
+      add_ax_registers (aexpr.get ());
 
       add_aexpr (std::move (aexpr));
     }
 }
 
-/* Data to be passed around in the calls to the locals and args
-   iterators.  */
-
-struct add_local_symbols_data
-{
-  struct collection_list *collect;
-  struct gdbarch *gdbarch;
-  CORE_ADDR pc;
-  long frame_regno;
-  long frame_offset;
-  int count;
-  int trace_string;
-};
-
-/* The callback for the locals and args iterators.  */
-
-static void
-do_collect_symbol (const char *print_name,
-                  struct symbol *sym,
-                  void *cb_data)
-{
-  struct add_local_symbols_data *p = (struct add_local_symbols_data *) cb_data;
-
-  p->collect->collect_symbol (sym, p->gdbarch, p->frame_regno,
-                             p->frame_offset, p->pc, p->trace_string);
-  p->count++;
-
-  p->collect->add_wholly_collected (print_name);
-}
-
 void
 collection_list::add_wholly_collected (const char *print_name)
 {
@@ -1060,15 +1050,16 @@ collection_list::add_local_symbols (struct gdbarch *gdbarch, CORE_ADDR pc,
                                    int trace_string)
 {
   const struct block *block;
-  struct add_local_symbols_data cb_data;
+  int count = 0;
 
-  cb_data.collect = this;
-  cb_data.gdbarch = gdbarch;
-  cb_data.pc = pc;
-  cb_data.frame_regno = frame_regno;
-  cb_data.frame_offset = frame_offset;
-  cb_data.count = 0;
-  cb_data.trace_string = trace_string;
+  auto do_collect_symbol = [&] (const char *print_name,
+                               struct symbol *sym)
+    {
+      collect_symbol (sym, gdbarch, frame_regno,
+                     frame_offset, pc, trace_string);
+      count++;
+      add_wholly_collected (print_name);
+    };
 
   if (type == 'L')
     {
@@ -1080,22 +1071,22 @@ collection_list::add_local_symbols (struct gdbarch *gdbarch, CORE_ADDR pc,
          return;
        }
 
-      iterate_over_block_local_vars (block, do_collect_symbol, &cb_data);
-      if (cb_data.count == 0)
+      iterate_over_block_local_vars (block, do_collect_symbol);
+      if (count == 0)
        warning (_("No locals found in scope."));
     }
   else
     {
-      pc = get_pc_function_start (pc);
-      block = block_for_pc (pc);
+      CORE_ADDR fn_pc = get_pc_function_start (pc);
+      block = block_for_pc (fn_pc);
       if (block == NULL)
        {
          warning (_("Can't collect args; no symbol table info available."));
          return;
        }
 
-      iterate_over_block_arg_vars (block, do_collect_symbol, &cb_data);
-      if (cb_data.count == 0)
+      iterate_over_block_arg_vars (block, do_collect_symbol);
+      if (count == 0)
        warning (_("No args found in scope."));
     }
 }
@@ -1104,14 +1095,25 @@ void
 collection_list::add_static_trace_data ()
 {
   if (info_verbose)
-    printf_filtered ("collect static trace data\n");
+    gdb_printf ("collect static trace data\n");
   m_strace_data = true;
 }
 
 collection_list::collection_list ()
-  : m_regs_mask (),
-    m_strace_data (false)
+  : m_strace_data (false)
 {
+  int max_remote_regno = 0;
+  for (int i = 0; i < gdbarch_num_regs (target_gdbarch ()); i++)
+    {
+      int remote_regno = (gdbarch_remote_register_number
+                         (target_gdbarch (), i));
+
+      if (remote_regno >= 0 && remote_regno > max_remote_regno)
+       max_remote_regno = remote_regno;
+    }
+
+  m_regs_mask.resize ((max_remote_regno / 8) + 1);
+
   m_memranges.reserve (128);
   m_aexprs.reserve (128);
 }
@@ -1121,7 +1123,8 @@ collection_list::collection_list ()
 std::vector<std::string>
 collection_list::stringify ()
 {
-  char temp_buf[2048];
+  gdb::char_vector temp_buf (2048);
+
   int count;
   char *end;
   long i;
@@ -1130,72 +1133,82 @@ collection_list::stringify ()
   if (m_strace_data)
     {
       if (info_verbose)
-       printf_filtered ("\nCollecting static trace data\n");
-      end = temp_buf;
+       gdb_printf ("\nCollecting static trace data\n");
+      end = temp_buf.data ();
       *end++ = 'L';
-      str_list.emplace_back (temp_buf, end - temp_buf);
+      str_list.emplace_back (temp_buf.data (), end - temp_buf.data ());
     }
 
-  for (i = sizeof (m_regs_mask) - 1; i > 0; i--)
+  for (i = m_regs_mask.size () - 1; i > 0; i--)
     if (m_regs_mask[i] != 0)    /* Skip leading zeroes in regs_mask.  */
       break;
   if (m_regs_mask[i] != 0)     /* Prepare to send regs_mask to the stub.  */
     {
       if (info_verbose)
-       printf_filtered ("\nCollecting registers (mask): 0x");
-      end = temp_buf;
+       gdb_printf ("\nCollecting registers (mask): 0x");
+
+      /* One char for 'R', one for the null terminator and two per
+        mask byte.  */
+      std::size_t new_size = (i + 1) * 2 + 2;
+      if (new_size > temp_buf.size ())
+       temp_buf.resize (new_size);
+
+      end = temp_buf.data ();
       *end++ = 'R';
       for (; i >= 0; i--)
        {
          QUIT;                 /* Allow user to bail out with ^C.  */
          if (info_verbose)
-           printf_filtered ("%02X", m_regs_mask[i]);
-         sprintf (end, "%02X", m_regs_mask[i]);
-         end += 2;
+           gdb_printf ("%02X", m_regs_mask[i]);
+
+         end = pack_hex_byte (end, m_regs_mask[i]);
        }
-      str_list.emplace_back (temp_buf);
+      *end = '\0';
+
+      str_list.emplace_back (temp_buf.data ());
     }
   if (info_verbose)
-    printf_filtered ("\n");
+    gdb_printf ("\n");
   if (!m_memranges.empty () && info_verbose)
-    printf_filtered ("Collecting memranges: \n");
-  for (i = 0, count = 0, end = temp_buf; i < m_memranges.size (); i++)
+    gdb_printf ("Collecting memranges: \n");
+  for (i = 0, count = 0, end = temp_buf.data ();
+       i < m_memranges.size (); i++)
     {
       QUIT;                    /* Allow user to bail out with ^C.  */
       if (info_verbose)
        {
-         printf_filtered ("(%d, %s, %ld)\n", 
-                          m_memranges[i].type,
-                          paddress (target_gdbarch (),
-                                    m_memranges[i].start),
-                          (long) (m_memranges[i].end
-                                  - m_memranges[i].start));
+         gdb_printf ("(%d, %s, %ld)\n", 
+                     m_memranges[i].type,
+                     paddress (target_gdbarch (),
+                               m_memranges[i].start),
+                     (long) (m_memranges[i].end
+                             - m_memranges[i].start));
        }
       if (count + 27 > MAX_AGENT_EXPR_LEN)
        {
-         str_list.emplace_back (temp_buf, count);
+         str_list.emplace_back (temp_buf.data (), count);
          count = 0;
-         end = temp_buf;
+         end = temp_buf.data ();
        }
 
       {
-        bfd_signed_vma length
+       bfd_signed_vma length
          = m_memranges[i].end - m_memranges[i].start;
 
-        /* The "%X" conversion specifier expects an unsigned argument,
-           so passing -1 (memrange_absolute) to it directly gives you
-           "FFFFFFFF" (or more, depending on sizeof (unsigned)).
-           Special-case it.  */
-        if (m_memranges[i].type == memrange_absolute)
-          sprintf (end, "M-1,%s,%lX", phex_nz (m_memranges[i].start, 0),
+       /* The "%X" conversion specifier expects an unsigned argument,
+          so passing -1 (memrange_absolute) to it directly gives you
+          "FFFFFFFF" (or more, depending on sizeof (unsigned)).
+          Special-case it.  */
+       if (m_memranges[i].type == memrange_absolute)
+         sprintf (end, "M-1,%s,%lX", phex_nz (m_memranges[i].start, 0),
                   (long) length);
-        else
-          sprintf (end, "M%X,%s,%lX", m_memranges[i].type,
+       else
+         sprintf (end, "M%X,%s,%lX", m_memranges[i].type,
                   phex_nz (m_memranges[i].start, 0), (long) length);
       }
 
       count += strlen (end);
-      end = temp_buf + count;
+      end = temp_buf.data () + count;
     }
 
   for (i = 0; i < m_aexprs.size (); i++)
@@ -1203,9 +1216,9 @@ collection_list::stringify ()
       QUIT;                    /* Allow user to bail out with ^C.  */
       if ((count + 10 + 2 * m_aexprs[i]->len) > MAX_AGENT_EXPR_LEN)
        {
-         str_list.emplace_back (temp_buf, count);
+         str_list.emplace_back (temp_buf.data (), count);
          count = 0;
-         end = temp_buf;
+         end = temp_buf.data ();
        }
       sprintf (end, "X%08X,", m_aexprs[i]->len);
       end += 10;               /* 'X' + 8 hex digits + ',' */
@@ -1217,24 +1230,20 @@ collection_list::stringify ()
 
   if (count != 0)
     {
-      str_list.emplace_back (temp_buf, count);
+      str_list.emplace_back (temp_buf.data (), count);
       count = 0;
-      end = temp_buf;
+      end = temp_buf.data ();
     }
 
   return str_list;
 }
 
-/* Add the printed expression EXP to *LIST.  */
+/* Add the expression STR to M_COMPUTED.  */
 
 void
-collection_list::append_exp (struct expression *exp)
+collection_list::append_exp (std::string &&str)
 {
-  string_file tmp_stream;
-
-  print_expression (exp, &tmp_stream);
-
-  m_computed.push_back (std::move (tmp_stream.string ()));
+  m_computed.push_back (std::move (str));
 }
 
 void
@@ -1262,11 +1271,11 @@ encode_actions_1 (struct command_line *action,
       action_exp = action->line;
       action_exp = skip_spaces (action_exp);
 
-      cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
+      cmd = lookup_cmd (&action_exp, cmdlist, "", NULL, -1, 1);
       if (cmd == 0)
        error (_("Bad action list item: %s"), action_exp);
 
-      if (cmd_cfunc_eq (cmd, collect_pseudocommand))
+      if (cmd_simple_func_eq (cmd, collect_pseudocommand))
        {
          int trace_string = 0;
 
@@ -1280,8 +1289,18 @@ encode_actions_1 (struct command_line *action,
 
              if (0 == strncasecmp ("$reg", action_exp, 4))
                {
-                 for (i = 0; i < gdbarch_num_regs (target_gdbarch ()); i++)
-                   collect->add_register (i);
+                 for (i = 0; i < gdbarch_num_regs (target_gdbarch ());
+                      i++)
+                   {
+                     int remote_regno = (gdbarch_remote_register_number
+                                         (target_gdbarch (), i));
+
+                     /* Ignore arch regnos without a corresponding
+                        remote regno.  This can happen for regnos not
+                        in the tdesc.  */
+                     if (remote_regno >= 0)
+                       collect->add_remote_register (remote_regno);
+                   }
                  action_exp = strchr (action_exp, ',');        /* more? */
                }
              else if (0 == strncasecmp ("$arg", action_exp, 4))
@@ -1311,27 +1330,10 @@ encode_actions_1 (struct command_line *action,
                                                    target_gdbarch (),
                                                    trace_string);
 
-                 ax_reqs (aexpr.get ());
-                 report_agent_reqs_errors (aexpr.get ());
+                 finalize_tracepoint_aexpr (aexpr.get ());
 
                  /* take care of the registers */
-                 if (aexpr->reg_mask_len > 0)
-                   {
-                     for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
-                       {
-                         QUIT; /* allow user to bail out with ^C */
-                         if (aexpr->reg_mask[ndx1] != 0)
-                           {
-                             /* assume chars have 8 bits */
-                             for (int ndx2 = 0; ndx2 < 8; ndx2++)
-                               if (aexpr->reg_mask[ndx1] & (1 << ndx2))
-                                 {
-                                   /* It's used -- record it.  */
-                                   collect->add_register (ndx1 * 8 + ndx2);
-                                 }
-                           }
-                       }
-                   }
+                 collect->add_ax_registers (aexpr.get ());
 
                  collect->add_aexpr (std::move (aexpr));
                  action_exp = strchr (action_exp, ',');        /* more? */
@@ -1345,15 +1347,19 @@ encode_actions_1 (struct command_line *action,
                {
                  unsigned long addr;
 
+                 const char *exp_start = action_exp;
                  expression_up exp = parse_exp_1 (&action_exp, tloc->address,
                                                   block_for_pc (tloc->address),
                                                   1);
 
-                 switch (exp->elts[0].opcode)
+                 switch (exp->first_opcode ())
                    {
                    case OP_REGISTER:
                      {
-                       const char *name = &exp->elts[2].string;
+                       expr::register_operation *regop
+                         = (dynamic_cast<expr::register_operation *>
+                            (exp->op.get ()));
+                       const char *name = regop->get_name ();
 
                        i = user_reg_map_name_to_regnum (target_gdbarch (),
                                                         name, strlen (name));
@@ -1362,29 +1368,41 @@ encode_actions_1 (struct command_line *action,
                                          _("Register $%s not available"),
                                          name);
                        if (info_verbose)
-                         printf_filtered ("OP_REGISTER: ");
-                       collect->add_register (i);
+                         gdb_printf ("OP_REGISTER: ");
+                       collect->add_local_register (target_gdbarch (),
+                                                    i, tloc->address);
                        break;
                      }
 
                    case UNOP_MEMVAL:
-                     /* Safe because we know it's a simple expression.  */
-                     tempval = evaluate_expression (exp.get ());
-                     addr = value_address (tempval);
-                     /* Initialize the TYPE_LENGTH if it is a typedef.  */
-                     check_typedef (exp->elts[1].type);
-                     collect->add_memrange (target_gdbarch (),
-                                            memrange_absolute, addr,
-                                            TYPE_LENGTH (exp->elts[1].type));
-                     collect->append_exp (exp.get ());
+                     {
+                       /* Safe because we know it's a simple expression.  */
+                       tempval = evaluate_expression (exp.get ());
+                       addr = value_address (tempval);
+                       expr::unop_memval_operation *memop
+                         = (dynamic_cast<expr::unop_memval_operation *>
+                            (exp->op.get ()));
+                       struct type *type = memop->get_type ();
+                       /* Initialize the TYPE_LENGTH if it is a typedef.  */
+                       check_typedef (type);
+                       collect->add_memrange (target_gdbarch (),
+                                              memrange_absolute, addr,
+                                              TYPE_LENGTH (type),
+                                              tloc->address);
+                       collect->append_exp (std::string (exp_start,
+                                                         action_exp));
+                     }
                      break;
 
                    case OP_VAR_VALUE:
                      {
-                       struct symbol *sym = exp->elts[2].symbol;
-                       const char *name = SYMBOL_NATURAL_NAME (sym);
+                       expr::var_value_operation *vvo
+                         = (dynamic_cast<expr::var_value_operation *>
+                            (exp->op.get ()));
+                       struct symbol *sym = vvo->get_symbol ();
+                       const char *name = sym->natural_name ();
 
-                       collect->collect_symbol (exp->elts[2].symbol,
+                       collect->collect_symbol (sym,
                                                 target_gdbarch (),
                                                 frame_reg,
                                                 frame_offset,
@@ -1399,38 +1417,21 @@ encode_actions_1 (struct command_line *action,
                                                                exp.get (),
                                                                trace_string);
 
-                     ax_reqs (aexpr.get ());
-
-                     report_agent_reqs_errors (aexpr.get ());
+                     finalize_tracepoint_aexpr (aexpr.get ());
 
                      /* Take care of the registers.  */
-                     if (aexpr->reg_mask_len > 0)
-                       {
-                         for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
-                           {
-                             QUIT;     /* Allow user to bail out with ^C.  */
-                             if (aexpr->reg_mask[ndx1] != 0)
-                               {
-                                 /* Assume chars have 8 bits.  */
-                                 for (int ndx2 = 0; ndx2 < 8; ndx2++)
-                                   if (aexpr->reg_mask[ndx1] & (1 << ndx2))
-                                     {
-                                       /* It's used -- record it.  */
-                                       collect->add_register (ndx1 * 8 + ndx2);
-                                     }
-                               }
-                           }
-                       }
+                     collect->add_ax_registers (aexpr.get ());
 
                      collect->add_aexpr (std::move (aexpr));
-                     collect->append_exp (exp.get ());
+                     collect->append_exp (std::string (exp_start,
+                                                       action_exp));
                      break;
                    }           /* switch */
                }               /* do */
            }
          while (action_exp && *action_exp++ == ',');
        }                       /* if */
-      else if (cmd_cfunc_eq (cmd, teval_pseudocommand))
+      else if (cmd_simple_func_eq (cmd, teval_pseudocommand))
        {
          do
            {                   /* Repeat over a comma-separated list.  */
@@ -1445,8 +1446,7 @@ encode_actions_1 (struct command_line *action,
                  agent_expr_up aexpr = gen_eval_for_expr (tloc->address,
                                                           exp.get ());
 
-                 ax_reqs (aexpr.get ());
-                 report_agent_reqs_errors (aexpr.get ());
+                 finalize_tracepoint_aexpr (aexpr.get ());
 
                  /* Even though we're not officially collecting, add
                     to the collect list anyway.  */
@@ -1455,14 +1455,14 @@ encode_actions_1 (struct command_line *action,
            }
          while (action_exp && *action_exp++ == ',');
        }                       /* if */
-      else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
+      else if (cmd_simple_func_eq (cmd, while_stepping_pseudocommand))
        {
          /* We check against nested while-stepping when setting
             breakpoint action, so no way to run into nested
             here.  */
          gdb_assert (stepping_list);
 
-         encode_actions_1 (action->body_list[0], tloc, frame_reg,
+         encode_actions_1 (action->body_list_0.get (), tloc, frame_reg,
                            frame_offset, stepping_list, NULL);
        }
       else
@@ -1478,17 +1478,17 @@ encode_actions (struct bp_location *tloc,
                struct collection_list *tracepoint_list,
                struct collection_list *stepping_list)
 {
-  struct command_line *actions;
   int frame_reg;
   LONGEST frame_offset;
 
   gdbarch_virtual_frame_pointer (tloc->gdbarch,
                                 tloc->address, &frame_reg, &frame_offset);
 
-  actions = all_tracepoint_actions_and_cleanup (tloc->owner);
-
-  encode_actions_1 (actions, tloc, frame_reg, frame_offset,
+  counted_command_line actions = all_tracepoint_actions (tloc->owner);
+  encode_actions_1 (actions.get (), tloc, frame_reg, frame_offset,
                    tracepoint_list, stepping_list);
+  encode_actions_1 (breakpoint_commands (tloc->owner), tloc,
+                   frame_reg, frame_offset, tracepoint_list, stepping_list);
 
   tracepoint_list->finish ();
   stepping_list->finish ();
@@ -1518,15 +1518,11 @@ collection_list::add_aexpr (agent_expr_up aexpr)
 static void
 process_tracepoint_on_disconnect (void)
 {
-  VEC(breakpoint_p) *tp_vec = NULL;
-  int ix;
-  struct breakpoint *b;
   int has_pending_p = 0;
 
   /* Check whether we still have pending tracepoint.  If we have, warn the
      user that pending tracepoint will no longer work.  */
-  tp_vec = all_tracepoints ();
-  for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
+  for (breakpoint *b : all_tracepoints ())
     {
       if (b->loc == NULL)
        {
@@ -1535,9 +1531,7 @@ process_tracepoint_on_disconnect (void)
        }
       else
        {
-         struct bp_location *loc1;
-
-         for (loc1 = b->loc; loc1; loc1 = loc1->next)
+         for (bp_location *loc1 : b->locations ())
            {
              if (loc1->shlib_disabled)
                {
@@ -1550,7 +1544,6 @@ process_tracepoint_on_disconnect (void)
            break;
        }
     }
-  VEC_free (breakpoint_p, tp_vec);
 
   if (has_pending_p)
     warning (_("Pending tracepoints will not be resolved while"
@@ -1571,23 +1564,16 @@ trace_reset_local_state (void)
 void
 start_tracing (const char *notes)
 {
-  VEC(breakpoint_p) *tp_vec = NULL;
-  int ix;
-  struct breakpoint *b;
-  struct trace_state_variable *tsv;
   int any_enabled = 0, num_to_download = 0;
   int ret;
 
-  tp_vec = all_tracepoints ();
+  auto tracepoint_range = all_tracepoints ();
 
   /* No point in tracing without any tracepoints...  */
-  if (VEC_length (breakpoint_p, tp_vec) == 0)
-    {
-      VEC_free (breakpoint_p, tp_vec);
-      error (_("No tracepoints defined, not starting trace"));
-    }
+  if (tracepoint_range.begin () == tracepoint_range.end ())
+    error (_("No tracepoints defined, not starting trace"));
 
-  for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
+  for (breakpoint *b : tracepoint_range)
     {
       if (b->enable_state == bp_enabled)
        any_enabled = 1;
@@ -1609,27 +1595,22 @@ start_tracing (const char *notes)
        {
          /* No point in tracing with only disabled tracepoints that
             cannot be re-enabled.  */
-         VEC_free (breakpoint_p, tp_vec);
          error (_("No tracepoints enabled, not starting trace"));
        }
     }
 
   if (num_to_download <= 0)
-    {
-      VEC_free (breakpoint_p, tp_vec);
-      error (_("No tracepoints that may be downloaded, not starting trace"));
-    }
+    error (_("No tracepoints that may be downloaded, not starting trace"));
 
   target_trace_init ();
 
-  for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
+  for (breakpoint *b : tracepoint_range)
     {
       struct tracepoint *t = (struct tracepoint *) b;
-      struct bp_location *loc;
       int bp_location_downloaded = 0;
 
       /* Clear `inserted' flag.  */
-      for (loc = b->loc; loc; loc = loc->next)
+      for (bp_location *loc : b->locations ())
        loc->inserted = 0;
 
       if ((b->type == bp_fast_tracepoint
@@ -1639,7 +1620,7 @@ start_tracing (const char *notes)
 
       t->number_on_target = 0;
 
-      for (loc = b->loc; loc; loc = loc->next)
+      for (bp_location *loc : b->locations ())
        {
          /* Since tracepoint locations are never duplicated, `inserted'
             flag should be zero.  */
@@ -1653,7 +1634,7 @@ start_tracing (const char *notes)
 
       t->number_on_target = b->number;
 
-      for (loc = b->loc; loc; loc = loc->next)
+      for (bp_location *loc : b->locations ())
        if (loc->probe.prob != NULL)
          loc->probe.prob->set_semaphore (loc->probe.objfile,
                                          loc->gdbarch);
@@ -1661,13 +1642,10 @@ start_tracing (const char *notes)
       if (bp_location_downloaded)
        gdb::observers::breakpoint_modified.notify (b);
     }
-  VEC_free (breakpoint_p, tp_vec);
 
   /* Send down all the trace state variables too.  */
-  for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
-    {
-      target_download_trace_state_variable (tsv);
-    }
+  for (const trace_state_variable &tsv : tvariables)
+    target_download_trace_state_variable (tsv);
   
   /* Tell target to treat text-like sections as transparent.  */
   target_trace_set_readonly_regions ();
@@ -1677,10 +1655,11 @@ start_tracing (const char *notes)
   target_set_trace_buffer_size (trace_buffer_size);
 
   if (!notes)
-    notes = trace_notes;
-  ret = target_set_trace_notes (trace_user, notes, NULL);
+    notes = trace_notes.c_str ();
+
+  ret = target_set_trace_notes (trace_user.c_str (), notes, NULL);
 
-  if (!ret && (trace_user || notes))
+  if (!ret && (!trace_user.empty () || notes))
     warning (_("Target does not support trace user/notes, info ignored"));
 
   /* Now insert traps and begin collecting data.  */
@@ -1730,23 +1709,17 @@ void
 stop_tracing (const char *note)
 {
   int ret;
-  VEC(breakpoint_p) *tp_vec = NULL;
-  int ix;
-  struct breakpoint *t;
 
   target_trace_stop ();
 
-  tp_vec = all_tracepoints ();
-  for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
+  for (breakpoint *t : all_tracepoints ())
     {
-      struct bp_location *loc;
-
       if ((t->type == bp_fast_tracepoint
           ? !may_insert_fast_tracepoints
           : !may_insert_tracepoints))
        continue;
 
-      for (loc = t->loc; loc; loc = loc->next)
+      for (bp_location *loc : t->locations ())
        {
          /* GDB can be totally absent in some disconnected trace scenarios,
             but we don't really care if this semaphore goes out of sync.
@@ -1758,10 +1731,9 @@ stop_tracing (const char *note)
        }
     }
 
-  VEC_free (breakpoint_p, tp_vec);
-
   if (!note)
-    note = trace_stop_notes;
+    note = trace_stop_notes.c_str ();
+
   ret = target_set_trace_notes (NULL, NULL, note);
 
   if (!ret && note)
@@ -1776,70 +1748,68 @@ static void
 tstatus_command (const char *args, int from_tty)
 {
   struct trace_status *ts = current_trace_status ();
-  int status, ix;
-  VEC(breakpoint_p) *tp_vec = NULL;
-  struct breakpoint *t;
+  int status;
   
   status = target_get_trace_status (ts);
 
   if (status == -1)
     {
       if (ts->filename != NULL)
-       printf_filtered (_("Using a trace file.\n"));
+       gdb_printf (_("Using a trace file.\n"));
       else
        {
-         printf_filtered (_("Trace can not be run on this target.\n"));
+         gdb_printf (_("Trace can not be run on this target.\n"));
          return;
        }
     }
 
   if (!ts->running_known)
     {
-      printf_filtered (_("Run/stop status is unknown.\n"));
+      gdb_printf (_("Run/stop status is unknown.\n"));
     }
   else if (ts->running)
     {
-      printf_filtered (_("Trace is running on the target.\n"));
+      gdb_printf (_("Trace is running on the target.\n"));
     }
   else
     {
       switch (ts->stop_reason)
        {
        case trace_never_run:
-         printf_filtered (_("No trace has been run on the target.\n"));
+         gdb_printf (_("No trace has been run on the target.\n"));
          break;
        case trace_stop_command:
          if (ts->stop_desc)
-           printf_filtered (_("Trace stopped by a tstop command (%s).\n"),
-                            ts->stop_desc);
+           gdb_printf (_("Trace stopped by a tstop command (%s).\n"),
+                       ts->stop_desc);
          else
-           printf_filtered (_("Trace stopped by a tstop command.\n"));
+           gdb_printf (_("Trace stopped by a tstop command.\n"));
          break;
        case trace_buffer_full:
-         printf_filtered (_("Trace stopped because the buffer was full.\n"));
+         gdb_printf (_("Trace stopped because the buffer was full.\n"));
          break;
        case trace_disconnected:
-         printf_filtered (_("Trace stopped because of disconnection.\n"));
+         gdb_printf (_("Trace stopped because of disconnection.\n"));
          break;
        case tracepoint_passcount:
-         printf_filtered (_("Trace stopped by tracepoint %d.\n"),
-                          ts->stopping_tracepoint);
+         gdb_printf (_("Trace stopped by tracepoint %d.\n"),
+                     ts->stopping_tracepoint);
          break;
        case tracepoint_error:
          if (ts->stopping_tracepoint)
-           printf_filtered (_("Trace stopped by an "
-                              "error (%s, tracepoint %d).\n"),
-                            ts->stop_desc, ts->stopping_tracepoint);
+           gdb_printf (_("Trace stopped by an "
+                         "error (%s, tracepoint %d).\n"),
+                       ts->stop_desc, ts->stopping_tracepoint);
          else
-           printf_filtered (_("Trace stopped by an error (%s).\n"),
-                            ts->stop_desc);
+           gdb_printf (_("Trace stopped by an error (%s).\n"),
+                       ts->stop_desc);
          break;
        case trace_stop_reason_unknown:
-         printf_filtered (_("Trace stopped for an unknown reason.\n"));
+         gdb_printf (_("Trace stopped for an unknown reason.\n"));
          break;
        default:
-         printf_filtered (_("Trace stopped for some other reason (%d).\n"),
-                          ts->stop_reason);
+         gdb_printf (_("Trace stopped for some other reason (%d).\n"),
+                     ts->stop_reason);
          break;
        }
     }
@@ -1847,54 +1817,54 @@ tstatus_command (const char *args, int from_tty)
   if (ts->traceframes_created >= 0
       && ts->traceframe_count != ts->traceframes_created)
     {
-      printf_filtered (_("Buffer contains %d trace "
-                        "frames (of %d created total).\n"),
-                      ts->traceframe_count, ts->traceframes_created);
+      gdb_printf (_("Buffer contains %d trace "
+                   "frames (of %d created total).\n"),
+                 ts->traceframe_count, ts->traceframes_created);
     }
   else if (ts->traceframe_count >= 0)
     {
-      printf_filtered (_("Collected %d trace frames.\n"),
-                      ts->traceframe_count);
+      gdb_printf (_("Collected %d trace frames.\n"),
+                 ts->traceframe_count);
     }
 
   if (ts->buffer_free >= 0)
     {
       if (ts->buffer_size >= 0)
        {
-         printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
-                          ts->buffer_free, ts->buffer_size);
+         gdb_printf (_("Trace buffer has %d bytes of %d bytes free"),
+                     ts->buffer_free, ts->buffer_size);
          if (ts->buffer_size > 0)
-           printf_filtered (_(" (%d%% full)"),
-                            ((int) ((((long long) (ts->buffer_size
-                                                   - ts->buffer_free)) * 100)
-                                    / ts->buffer_size)));
-         printf_filtered (_(".\n"));
+           gdb_printf (_(" (%d%% full)"),
+                       ((int) ((((long long) (ts->buffer_size
+                                              - ts->buffer_free)) * 100)
+                               / ts->buffer_size)));
+         gdb_printf (_(".\n"));
        }
       else
-       printf_filtered (_("Trace buffer has %d bytes free.\n"),
-                        ts->buffer_free);
+       gdb_printf (_("Trace buffer has %d bytes free.\n"),
+                   ts->buffer_free);
     }
 
   if (ts->disconnected_tracing)
-    printf_filtered (_("Trace will continue if GDB disconnects.\n"));
+    gdb_printf (_("Trace will continue if GDB disconnects.\n"));
   else
-    printf_filtered (_("Trace will stop if GDB disconnects.\n"));
+    gdb_printf (_("Trace will stop if GDB disconnects.\n"));
 
   if (ts->circular_buffer)
-    printf_filtered (_("Trace buffer is circular.\n"));
+    gdb_printf (_("Trace buffer is circular.\n"));
 
   if (ts->user_name && strlen (ts->user_name) > 0)
-    printf_filtered (_("Trace user is %s.\n"), ts->user_name);
+    gdb_printf (_("Trace user is %s.\n"), ts->user_name);
 
   if (ts->notes && strlen (ts->notes) > 0)
-    printf_filtered (_("Trace notes: %s.\n"), ts->notes);
+    gdb_printf (_("Trace notes: %s.\n"), ts->notes);
 
   /* Now report on what we're doing with tfind.  */
   if (traceframe_number >= 0)
-    printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
-                    traceframe_number, tracepoint_number);
+    gdb_printf (_("Looking at trace frame %d, tracepoint %d.\n"),
+               traceframe_number, tracepoint_number);
   else
-    printf_filtered (_("Not looking at any trace frame.\n"));
+    gdb_printf (_("Not looking at any trace frame.\n"));
 
   /* Report start/stop times if supplied.  */
   if (ts->start_time)
@@ -1904,29 +1874,25 @@ tstatus_command (const char *args, int from_tty)
          LONGEST run_time = ts->stop_time - ts->start_time;
 
          /* Reporting a run time is more readable than two long numbers.  */
-         printf_filtered (_("Trace started at %ld.%06ld secs, stopped %ld.%06ld secs later.\n"),
-                          (long int) (ts->start_time / 1000000),
-                          (long int) (ts->start_time % 1000000),
-                          (long int) (run_time / 1000000),
-                          (long int) (run_time % 1000000));
+         gdb_printf (_("Trace started at %ld.%06ld secs, stopped %ld.%06ld secs later.\n"),
+                     (long int) (ts->start_time / 1000000),
+                     (long int) (ts->start_time % 1000000),
+                     (long int) (run_time / 1000000),
+                     (long int) (run_time % 1000000));
        }
       else
-       printf_filtered (_("Trace started at %ld.%06ld secs.\n"),
-                        (long int) (ts->start_time / 1000000),
-                        (long int) (ts->start_time % 1000000));
+       gdb_printf (_("Trace started at %ld.%06ld secs.\n"),
+                   (long int) (ts->start_time / 1000000),
+                   (long int) (ts->start_time % 1000000));
     }
   else if (ts->stop_time)
-    printf_filtered (_("Trace stopped at %ld.%06ld secs.\n"),
-                    (long int) (ts->stop_time / 1000000),
-                    (long int) (ts->stop_time % 1000000));
+    gdb_printf (_("Trace stopped at %ld.%06ld secs.\n"),
+               (long int) (ts->stop_time / 1000000),
+               (long int) (ts->stop_time % 1000000));
 
   /* Now report any per-tracepoint status available.  */
-  tp_vec = all_tracepoints ();
-
-  for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
+  for (breakpoint *t : all_tracepoints ())
     target_get_tracepoint_status (t, NULL);
-
-  VEC_free (breakpoint_p, tp_vec);
 }
 
 /* Report the trace status to uiout, in a way suitable for MI, and not
@@ -2008,8 +1974,8 @@ trace_status_mi (int on_stop)
            {
              uiout->field_string ("stop-reason", stop_reason);
              if (stopping_tracepoint != -1)
-               uiout->field_int ("stopping-tracepoint",
-                                 stopping_tracepoint);
+               uiout->field_signed ("stopping-tracepoint",
+                                    stopping_tracepoint);
              if (ts->stop_reason == tracepoint_error)
                uiout->field_string ("error-description",
                                     ts->stop_desc);
@@ -2018,16 +1984,16 @@ trace_status_mi (int on_stop)
     }
 
   if (ts->traceframe_count != -1)
-    uiout->field_int ("frames", ts->traceframe_count);
+    uiout->field_signed ("frames", ts->traceframe_count);
   if (ts->traceframes_created != -1)
-    uiout->field_int ("frames-created", ts->traceframes_created);
+    uiout->field_signed ("frames-created", ts->traceframes_created);
   if (ts->buffer_size != -1)
-    uiout->field_int ("buffer-size", ts->buffer_size);
+    uiout->field_signed ("buffer-size", ts->buffer_size);
   if (ts->buffer_free != -1)
-    uiout->field_int ("buffer-free", ts->buffer_free);
+    uiout->field_signed ("buffer-free", ts->buffer_free);
 
-  uiout->field_int ("disconnected",  ts->disconnected_tracing);
-  uiout->field_int ("circular",  ts->circular_buffer);
+  uiout->field_signed ("disconnected",  ts->disconnected_tracing);
+  uiout->field_signed ("circular",  ts->circular_buffer);
 
   uiout->field_string ("user-name", ts->user_name);
   uiout->field_string ("notes", ts->notes);
@@ -2144,7 +2110,7 @@ tfind_1 (enum trace_find_type type, int num,
         DON'T give an error, but DO change the state of
         traceframe_number etc. to invalid.
 
-        The rationalle is that if you typed the command, you
+        The rationale is that if you typed the command, you
         might just have committed a typo or something, and you'd
         like to NOT lose your current debugging state.  However
         if you're in a user-defined command or especially in a
@@ -2158,7 +2124,7 @@ tfind_1 (enum trace_find_type type, int num,
       else
        {
          if (info_verbose)
-           printf_filtered ("End of trace buffer.\n");
+           gdb_printf ("End of trace buffer.\n");
 #if 0 /* dubious now?  */
          /* The following will not recurse, since it's
             special-cased.  */
@@ -2191,13 +2157,13 @@ tfind_1 (enum trace_find_type type, int num,
       if (uiout->is_mi_like_p ())
        {
          uiout->field_string ("found", "1");
-         uiout->field_int ("tracepoint", tracepoint_number);
-         uiout->field_int ("traceframe", traceframe_number);
+         uiout->field_signed ("tracepoint", tracepoint_number);
+         uiout->field_signed ("traceframe", traceframe_number);
        }
       else
        {
-         printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
-                            traceframe_number, tracepoint_number);
+         gdb_printf (_("Found trace frame %d, tracepoint %d\n"),
+                     traceframe_number, tracepoint_number);
        }
     }
   else
@@ -2205,9 +2171,9 @@ tfind_1 (enum trace_find_type type, int num,
       if (uiout->is_mi_like_p ())
        uiout->field_string ("found", "0");
       else if (type == tfind_number && num == -1)
-       printf_unfiltered (_("No longer looking at any trace frame\n"));
+       gdb_printf (_("No longer looking at any trace frame\n"));
       else /* This case may never occur, check.  */
-       printf_unfiltered (_("No trace frame found\n"));
+       gdb_printf (_("No trace frame found\n"));
     }
 
   /* If we're in nonstop mode and getting out of looking at trace
@@ -2219,10 +2185,10 @@ tfind_1 (enum trace_find_type type, int num,
       enum print_what print_what;
 
       /* NOTE: in imitation of the step command, try to determine
-         whether we have made a transition from one function to
-         another.  If so, we'll print the "stack frame" (ie. the new
-         function and it's arguments) -- otherwise we'll just show the
-         new source line.  */
+        whether we have made a transition from one function to
+        another.  If so, we'll print the "stack frame" (ie. the new
+        function and it's arguments) -- otherwise we'll just show the
+        new source line.  */
 
       if (frame_id_eq (old_frame_id,
                       get_frame_id (get_current_frame ())))
@@ -2270,7 +2236,7 @@ tfind_command_1 (const char *args, int from_tty)
     { /* TFIND with no args means find NEXT trace frame.  */
       if (traceframe_number == -1)
        frameno = 0;    /* "next" is first one.  */
-        else
+      else
        frameno = traceframe_number + 1;
     }
   else if (0 == strcmp (args, "-"))
@@ -2391,31 +2357,33 @@ tfind_line_command (const char *args, int from_tty)
   if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
     {
       if (start_pc == end_pc)
-       {
-         printf_filtered ("Line %d of \"%s\"",
-                          sal.line,
-                          symtab_to_filename_for_display (sal.symtab));
-         wrap_here ("  ");
-         printf_filtered (" is at address ");
+       {
+         gdb_printf ("Line %d of \"%s\"",
+                     sal.line,
+                     symtab_to_filename_for_display (sal.symtab));
+         gdb_stdout->wrap_here (2);
+         gdb_printf (" is at address ");
          print_address (get_current_arch (), start_pc, gdb_stdout);
-         wrap_here ("  ");
-         printf_filtered (" but contains no code.\n");
+         gdb_stdout->wrap_here (2);
+         gdb_printf (" but contains no code.\n");
          sal = find_pc_line (start_pc, 0);
          if (sal.line > 0
              && find_line_pc_range (sal, &start_pc, &end_pc)
              && start_pc != end_pc)
-           printf_filtered ("Attempting to find line %d instead.\n",
-                            sal.line);
-         else
+           gdb_printf ("Attempting to find line %d instead.\n",
+                       sal.line);
+         else
            error (_("Cannot find a good line."));
-       }
+       }
       }
-    else
-    /* Is there any case in which we get here, and have an address
-       which the user would want to see?  If we have debugging
-       symbols and no line numbers?  */
-    error (_("Line number %d is out of range for \"%s\"."),
-          sal.line, symtab_to_filename_for_display (sal.symtab));
+  else
+    {
+      /* Is there any case in which we get here, and have an address
+        which the user would want to see?  If we have debugging
+        symbols and no line numbers?  */
+      error (_("Line number %d is out of range for \"%s\"."),
+            sal.line, symtab_to_filename_for_display (sal.symtab));
+    }
 
   /* Find within range of stated line.  */
   if (args && *args)
@@ -2435,7 +2403,7 @@ tfind_range_command (const char *args, int from_tty)
 
   if (args == 0 || *args == 0)
     { /* XXX FIXME: what should default behavior be?  */
-      printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
+      gdb_printf ("Usage: tfind range STARTADDR, ENDADDR\n");
       return;
     }
 
@@ -2469,7 +2437,7 @@ tfind_outside_command (const char *args, int from_tty)
 
   if (args == 0 || *args == 0)
     { /* XXX FIXME: what should default behavior be?  */
-      printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
+      gdb_printf ("Usage: tfind outside STARTADDR, ENDADDR\n");
       return;
     }
 
@@ -2531,47 +2499,45 @@ info_scope_command (const char *args_in, int from_tty)
        {
          QUIT;                 /* Allow user to bail out with ^C.  */
          if (count == 0)
-           printf_filtered ("Scope for %s:\n", save_args);
+           gdb_printf ("Scope for %s:\n", save_args);
          count++;
 
-         symname = SYMBOL_PRINT_NAME (sym);
+         symname = sym->print_name ();
          if (symname == NULL || *symname == '\0')
            continue;           /* Probably botched, certainly useless.  */
 
-         gdbarch = symbol_arch (sym);
+         gdbarch = sym->arch ();
 
-         printf_filtered ("Symbol %s is ", symname);
+         gdb_printf ("Symbol %s is ", symname);
 
          if (SYMBOL_COMPUTED_OPS (sym) != NULL)
            SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
-                                                         BLOCK_START (block),
+                                                         block->entry_pc (),
                                                          gdb_stdout);
          else
            {
-             switch (SYMBOL_CLASS (sym))
+             switch (sym->aclass ())
                {
                default:
                case LOC_UNDEF: /* Messed up symbol?  */
-                 printf_filtered ("a bogus symbol, class %d.\n",
-                                  SYMBOL_CLASS (sym));
+                 gdb_printf ("a bogus symbol, class %d.\n",
+                             sym->aclass ());
                  count--;              /* Don't count this one.  */
                  continue;
                case LOC_CONST:
-                 printf_filtered ("a constant with value %s (%s)",
-                                  plongest (SYMBOL_VALUE (sym)),
-                                  hex_string (SYMBOL_VALUE (sym)));
+                 gdb_printf ("a constant with value %s (%s)",
+                             plongest (sym->value_longest ()),
+                             hex_string (sym->value_longest ()));
                  break;
                case LOC_CONST_BYTES:
-                 printf_filtered ("constant bytes: ");
-                 if (SYMBOL_TYPE (sym))
-                   for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
-                     fprintf_filtered (gdb_stdout, " %02x",
-                                       (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
+                 gdb_printf ("constant bytes: ");
+                 if (sym->type ())
+                   for (j = 0; j < TYPE_LENGTH (sym->type ()); j++)
+                     gdb_printf (" %02x", (unsigned) sym->value_bytes ()[j]);
                  break;
                case LOC_STATIC:
-                 printf_filtered ("in static storage at address ");
-                 printf_filtered ("%s", paddress (gdbarch,
-                                                  SYMBOL_VALUE_ADDRESS (sym)));
+                 gdb_printf ("in static storage at address ");
+                 gdb_printf ("%s", paddress (gdbarch, sym->value_address ()));
                  break;
                case LOC_REGISTER:
                  /* GDBARCH is the architecture associated with the objfile
@@ -2584,77 +2550,79 @@ info_scope_command (const char *args_in, int from_tty)
                  regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
                                                                      gdbarch);
 
-                 if (SYMBOL_IS_ARGUMENT (sym))
-                   printf_filtered ("an argument in register $%s",
-                                    gdbarch_register_name (gdbarch, regno));
+                 if (sym->is_argument ())
+                   gdb_printf ("an argument in register $%s",
+                               gdbarch_register_name (gdbarch, regno));
                  else
-                   printf_filtered ("a local variable in register $%s",
-                                    gdbarch_register_name (gdbarch, regno));
+                   gdb_printf ("a local variable in register $%s",
+                               gdbarch_register_name (gdbarch, regno));
                  break;
                case LOC_ARG:
-                 printf_filtered ("an argument at stack/frame offset %s",
-                                  plongest (SYMBOL_VALUE (sym)));
+                 gdb_printf ("an argument at stack/frame offset %s",
+                             plongest (sym->value_longest ()));
                  break;
                case LOC_LOCAL:
-                 printf_filtered ("a local variable at frame offset %s",
-                                  plongest (SYMBOL_VALUE (sym)));
+                 gdb_printf ("a local variable at frame offset %s",
+                             plongest (sym->value_longest ()));
                  break;
                case LOC_REF_ARG:
-                 printf_filtered ("a reference argument at offset %s",
-                                  plongest (SYMBOL_VALUE (sym)));
+                 gdb_printf ("a reference argument at offset %s",
+                             plongest (sym->value_longest ()));
                  break;
                case LOC_REGPARM_ADDR:
                  /* Note comment at LOC_REGISTER.  */
                  regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
                                                                      gdbarch);
-                 printf_filtered ("the address of an argument, in register $%s",
-                                  gdbarch_register_name (gdbarch, regno));
+                 gdb_printf ("the address of an argument, in register $%s",
+                             gdbarch_register_name (gdbarch, regno));
                  break;
                case LOC_TYPEDEF:
-                 printf_filtered ("a typedef.\n");
+                 gdb_printf ("a typedef.\n");
                  continue;
                case LOC_LABEL:
-                 printf_filtered ("a label at address ");
-                 printf_filtered ("%s", paddress (gdbarch,
-                                                  SYMBOL_VALUE_ADDRESS (sym)));
+                 gdb_printf ("a label at address ");
+                 gdb_printf ("%s", paddress (gdbarch, sym->value_address ()));
                  break;
                case LOC_BLOCK:
-                 printf_filtered ("a function at address ");
-                 printf_filtered ("%s",
-                                  paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
+                 gdb_printf ("a function at address ");
+                 gdb_printf ("%s",
+                             paddress (gdbarch,
+                                       sym->value_block ()->entry_pc ()));
                  break;
                case LOC_UNRESOLVED:
-                 msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
+                 msym = lookup_minimal_symbol (sym->linkage_name (),
                                                NULL, NULL);
                  if (msym.minsym == NULL)
-                   printf_filtered ("Unresolved Static");
+                   gdb_printf ("Unresolved Static");
                  else
                    {
-                     printf_filtered ("static storage at address ");
-                     printf_filtered ("%s",
-                                      paddress (gdbarch,
-                                                BMSYMBOL_VALUE_ADDRESS (msym)));
+                     gdb_printf ("static storage at address ");
+                     gdb_printf ("%s",
+                                 paddress (gdbarch, msym.value_address ()));
                    }
                  break;
                case LOC_OPTIMIZED_OUT:
-                 printf_filtered ("optimized out.\n");
+                 gdb_printf ("optimized out.\n");
                  continue;
                case LOC_COMPUTED:
-                 gdb_assert_not_reached (_("LOC_COMPUTED variable missing a method"));
+                 gdb_assert_not_reached ("LOC_COMPUTED variable missing a method");
                }
            }
-         if (SYMBOL_TYPE (sym))
-           printf_filtered (", length %d.\n",
-                            TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
+         if (sym->type ())
+           {
+             struct type *t = check_typedef (sym->type ());
+
+             gdb_printf (", length %s.\n", pulongest (TYPE_LENGTH (t)));
+           }
        }
-      if (BLOCK_FUNCTION (block))
+      if (block->function ())
        break;
       else
-       block = BLOCK_SUPERBLOCK (block);
+       block = block->superblock ();
     }
   if (count <= 0)
-    printf_filtered ("Scope for %s contains no locals or arguments.\n",
-                    save_args);
+    gdb_printf ("Scope for %s contains no locals or arguments.\n",
+               save_args);
 }
 
 /* Helper for trace_dump_command.  Dump the action list starting at
@@ -2679,24 +2647,22 @@ trace_dump_actions (struct command_line *action,
       action_exp = skip_spaces (action_exp);
 
       /* The collection actions to be done while stepping are
-         bracketed by the commands "while-stepping" and "end".  */
+        bracketed by the commands "while-stepping" and "end".  */
 
       if (*action_exp == '#')  /* comment line */
        continue;
 
-      cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
+      cmd = lookup_cmd (&action_exp, cmdlist, "", NULL, -1, 1);
       if (cmd == 0)
        error (_("Bad action list item: %s"), action_exp);
 
-      if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
+      if (cmd_simple_func_eq (cmd, while_stepping_pseudocommand))
        {
-         int i;
-
-         for (i = 0; i < action->body_count; ++i)
-           trace_dump_actions (action->body_list[i],
-                               1, stepping_frame, from_tty);
+         gdb_assert (action->body_list_1 == nullptr);
+         trace_dump_actions (action->body_list_0.get (),
+                             1, stepping_frame, from_tty);
        }
-      else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
+      else if (cmd_simple_func_eq (cmd, collect_pseudocommand))
        {
          /* Display the collected data.
             For the trap frame, display only what was collected at
@@ -2706,9 +2672,6 @@ trace_dump_actions (struct command_line *action,
             STEPPING_ACTIONS should be equal.  */
          if (stepping_frame == stepping_actions)
            {
-             char *cmd = NULL;
-             struct cleanup *old_chain
-               = make_cleanup (free_current_contents, &cmd);
              int trace_string = 0;
 
              if (*action_exp == '/')
@@ -2733,31 +2696,22 @@ trace_dump_actions (struct command_line *action,
                    info_args_command (NULL, from_tty);
                  else
                    {           /* variable */
+                     std::string contents;
+                     const char *exp = action_exp;
                      if (next_comma != NULL)
                        {
                          size_t len = next_comma - action_exp;
-
-                         cmd = (char *) xrealloc (cmd, len + 1);
-                         memcpy (cmd, action_exp, len);
-                         cmd[len] = 0;
+                         contents = std::string (action_exp, len);
+                         exp = contents.c_str ();
                        }
-                     else
-                       {
-                         size_t len = strlen (action_exp);
 
-                         cmd = (char *) xrealloc (cmd, len + 1);
-                         memcpy (cmd, action_exp, len + 1);
-                       }
-
-                     printf_filtered ("%s = ", cmd);
-                     output_command_const (cmd, from_tty);
-                     printf_filtered ("\n");
+                     gdb_printf ("%s = ", exp);
+                     output_command (exp, from_tty);
+                     gdb_printf ("\n");
                    }
                  action_exp = next_comma;
                }
              while (action_exp && *action_exp == ',');
-
-             do_cleanups (old_chain);
            }
        }
     }
@@ -2771,7 +2725,6 @@ struct bp_location *
 get_traceframe_location (int *stepping_frame_p)
 {
   struct tracepoint *t;
-  struct bp_location *tloc;
   struct regcache *regcache;
 
   if (tracepoint_number == -1)
@@ -2792,7 +2745,7 @@ get_traceframe_location (int *stepping_frame_p)
      locations, assume it is a direct hit rather than a while-stepping
      frame.  (FIXME this is not reliable, should record each frame's
      type.)  */
-  for (tloc = t->loc; tloc; tloc = tloc->next)
+  for (bp_location *tloc : t->locations ())
     if (tloc->address == regcache_read_pc (regcache))
       {
        *stepping_frame_p = 0;
@@ -2805,36 +2758,27 @@ get_traceframe_location (int *stepping_frame_p)
   return t->loc;
 }
 
-/* Return all the actions, including default collect, of a tracepoint
-   T.  It constructs cleanups into the chain, and leaves the caller to
-   handle them (call do_cleanups).  */
+/* Return the default collect actions of a tracepoint T.  */
 
-static struct command_line *
-all_tracepoint_actions_and_cleanup (struct breakpoint *t)
+static counted_command_line
+all_tracepoint_actions (struct breakpoint *t)
 {
-  struct command_line *actions;
-
-  actions = breakpoint_commands (t);
+  counted_command_line actions (nullptr, command_lines_deleter ());
 
   /* If there are default expressions to collect, make up a collect
      action and prepend to the action list to encode.  Note that since
      validation is per-tracepoint (local var "xyz" might be valid for
      one tracepoint and not another, etc), we make up the action on
      the fly, and don't cache it.  */
-  if (*default_collect)
+  if (!default_collect.empty ())
     {
-      struct command_line *default_collect_action;
-      char *default_collect_line;
-
-      default_collect_line = xstrprintf ("collect %s", default_collect);
-      make_cleanup (xfree, default_collect_line);
-
-      validate_actionline (default_collect_line, t);
-      default_collect_action = XNEW (struct command_line);
-      make_cleanup (xfree, default_collect_action);
-      default_collect_action->next = actions;
-      default_collect_action->line = default_collect_line;
-      actions = default_collect_action;
+      gdb::unique_xmalloc_ptr<char> default_collect_line
+       = xstrprintf ("collect %s", default_collect.c_str ());
+
+      validate_actionline (default_collect_line.get (), t);
+      actions.reset (new struct command_line (simple_control,
+                                             default_collect_line.release ()),
+                    command_lines_deleter ());
     }
 
   return actions;
@@ -2847,13 +2791,12 @@ tdump_command (const char *args, int from_tty)
 {
   int stepping_frame = 0;
   struct bp_location *loc;
-  struct command_line *actions;
 
   /* This throws an error is not inspecting a trace frame.  */
   loc = get_traceframe_location (&stepping_frame);
 
-  printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
-                  tracepoint_number, traceframe_number);
+  gdb_printf ("Data collected at tracepoint %d, trace frame %d:\n",
+             tracepoint_number, traceframe_number);
 
   /* This command only makes sense for the current frame, not the
      selected frame.  */
@@ -2861,9 +2804,11 @@ tdump_command (const char *args, int from_tty)
 
   select_frame (get_current_frame ());
 
-  actions = all_tracepoint_actions_and_cleanup (loc->owner);
+  counted_command_line actions = all_tracepoint_actions (loc->owner);
 
-  trace_dump_actions (actions, 0, stepping_frame, from_tty);
+  trace_dump_actions (actions.get (), 0, stepping_frame, from_tty);
+  trace_dump_actions (breakpoint_commands (loc->owner), 0, stepping_frame,
+                     from_tty);
 }
 
 /* Encode a piece of a tracepoint's source-level definition in a form
@@ -2917,7 +2862,7 @@ set_trace_user (const char *args, int from_tty,
 {
   int ret;
 
-  ret = target_set_trace_notes (trace_user, NULL, NULL);
+  ret = target_set_trace_notes (trace_user.c_str (), NULL, NULL);
 
   if (!ret)
     warning (_("Target does not support trace notes, user ignored"));
@@ -2929,7 +2874,7 @@ set_trace_notes (const char *args, int from_tty,
 {
   int ret;
 
-  ret = target_set_trace_notes (NULL, trace_notes, NULL);
+  ret = target_set_trace_notes (NULL, trace_notes.c_str (), NULL);
 
   if (!ret)
     warning (_("Target does not support trace notes, note ignored"));
@@ -2941,7 +2886,7 @@ set_trace_stop_notes (const char *args, int from_tty,
 {
   int ret;
 
-  ret = target_set_trace_notes (NULL, NULL, trace_stop_notes);
+  ret = target_set_trace_notes (NULL, NULL, trace_stop_notes.c_str ());
 
   if (!ret)
     warning (_("Target does not support trace notes, stop note ignored"));
@@ -3012,43 +2957,9 @@ set_current_traceframe (int num)
   clear_traceframe_info ();
 }
 
-/* A cleanup used when switching away and back from tfind mode.  */
-
-struct current_traceframe_cleanup
-{
-  /* The traceframe we were inspecting.  */
-  int traceframe_number;
-};
-
-static void
-do_restore_current_traceframe_cleanup (void *arg)
-{
-  struct current_traceframe_cleanup *old
-    = (struct current_traceframe_cleanup *) arg;
-
-  set_current_traceframe (old->traceframe_number);
-}
-
-static void
-restore_current_traceframe_cleanup_dtor (void *arg)
-{
-  struct current_traceframe_cleanup *old
-    = (struct current_traceframe_cleanup *) arg;
-
-  xfree (old);
-}
-
-struct cleanup *
-make_cleanup_restore_current_traceframe (void)
-{
-  struct current_traceframe_cleanup *old =
-    XNEW (struct current_traceframe_cleanup);
-
-  old->traceframe_number = traceframe_number;
-
-  return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
-                           restore_current_traceframe_cleanup_dtor);
-}
+scoped_restore_current_traceframe::scoped_restore_current_traceframe ()
+: m_traceframe_number (traceframe_number)
+{}
 
 /* Given a number and address, return an uploaded tracepoint with that
    number, creating if necessary.  */
@@ -3138,19 +3049,17 @@ cond_string_is_same (char *str1, char *str2)
 static struct bp_location *
 find_matching_tracepoint_location (struct uploaded_tp *utp)
 {
-  VEC(breakpoint_p) *tp_vec = all_tracepoints ();
-  int ix;
-  struct breakpoint *b;
   struct bp_location *loc;
 
-  for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
+  for (breakpoint *b : all_tracepoints ())
     {
       struct tracepoint *t = (struct tracepoint *) b;
 
       if (b->type == utp->type
          && t->step_count == utp->step
          && t->pass_count == utp->pass
-         && cond_string_is_same (t->cond_string, utp->cond_string)
+         && cond_string_is_same (t->cond_string.get (),
+                                 utp->cond_string.get ())
          /* FIXME also test actions.  */
          )
        {
@@ -3174,9 +3083,7 @@ merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
 {
   struct uploaded_tp *utp;
   /* A set of tracepoints which are modified.  */
-  VEC(breakpoint_p) *modified_tp = NULL;
-  int ix;
-  struct breakpoint *b;
+  std::vector<breakpoint *> modified_tp;
 
   /* Look for GDB tracepoints that match up with our uploaded versions.  */
   for (utp = *uploaded_tps; utp; utp = utp->next)
@@ -3192,40 +3099,38 @@ merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
          /* Mark this location as already inserted.  */
          loc->inserted = 1;
          t = (struct tracepoint *) loc->owner;
-         printf_filtered (_("Assuming tracepoint %d is same "
-                            "as target's tracepoint %d at %s.\n"),
-                          loc->owner->number, utp->number,
-                          paddress (loc->gdbarch, utp->addr));
+         gdb_printf (_("Assuming tracepoint %d is same "
+                       "as target's tracepoint %d at %s.\n"),
+                     loc->owner->number, utp->number,
+                     paddress (loc->gdbarch, utp->addr));
 
          /* The tracepoint LOC->owner was modified (the location LOC
             was marked as inserted in the target).  Save it in
             MODIFIED_TP if not there yet.  The 'breakpoint-modified'
             observers will be notified later once for each tracepoint
             saved in MODIFIED_TP.  */
-         for (ix = 0;
-              VEC_iterate (breakpoint_p, modified_tp, ix, b);
-              ix++)
+         for (breakpoint *b : modified_tp)
            if (b == loc->owner)
              {
                found = 1;
                break;
              }
          if (!found)
-           VEC_safe_push (breakpoint_p, modified_tp, loc->owner);
+           modified_tp.push_back (loc->owner);
        }
       else
        {
          t = create_tracepoint_from_upload (utp);
          if (t)
-           printf_filtered (_("Created tracepoint %d for "
-                              "target's tracepoint %d at %s.\n"),
-                            t->number, utp->number,
-                            paddress (get_current_arch (), utp->addr));
+           gdb_printf (_("Created tracepoint %d for "
+                         "target's tracepoint %d at %s.\n"),
+                       t->number, utp->number,
+                       paddress (get_current_arch (), utp->addr));
          else
-           printf_filtered (_("Failed to create tracepoint for target's "
-                              "tracepoint %d at %s, skipping it.\n"),
-                            utp->number,
-                            paddress (get_current_arch (), utp->addr));
+           gdb_printf (_("Failed to create tracepoint for target's "
+                         "tracepoint %d at %s, skipping it.\n"),
+                       utp->number,
+                       paddress (get_current_arch (), utp->addr));
        }
       /* Whether found or created, record the number used by the
         target, to help with mapping target tracepoints back to their
@@ -3236,10 +3141,9 @@ merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
 
   /* Notify 'breakpoint-modified' observer that at least one of B's
      locations was changed.  */
-  for (ix = 0; VEC_iterate (breakpoint_p, modified_tp, ix, b); ix++)
+  for (breakpoint *b : modified_tp)
     gdb::observers::breakpoint_modified.notify (b);
 
-  VEC_free (breakpoint_p, modified_tp);
   free_uploaded_tps (uploaded_tps);
 }
 
@@ -3295,33 +3199,31 @@ create_tsv_from_upload (struct uploaded_tsv *utsv)
 void
 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
 {
-  int ix;
   struct uploaded_tsv *utsv;
-  struct trace_state_variable *tsv;
   int highest;
 
   /* Most likely some numbers will have to be reassigned as part of
      the merge, so clear them all in anticipation.  */
-  for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
-    tsv->number = 0;
+  for (trace_state_variable &tsv : tvariables)
+    tsv.number = 0;
 
   for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
     {
-      tsv = find_matching_tsv (utsv);
+      struct trace_state_variable *tsv = find_matching_tsv (utsv);
       if (tsv)
        {
          if (info_verbose)
-           printf_filtered (_("Assuming trace state variable $%s "
-                              "is same as target's variable %d.\n"),
-                            tsv->name, utsv->number);
+           gdb_printf (_("Assuming trace state variable $%s "
+                         "is same as target's variable %d.\n"),
+                       tsv->name.c_str (), utsv->number);
        }
       else
        {
          tsv = create_tsv_from_upload (utsv);
          if (info_verbose)
-           printf_filtered (_("Created trace state variable "
-                              "$%s for target's variable %d.\n"),
-                            tsv->name, utsv->number);
+           gdb_printf (_("Created trace state variable "
+                         "$%s for target's variable %d.\n"),
+                       tsv->name.c_str (), utsv->number);
        }
       /* Give precedence to numberings that come from the target.  */
       if (tsv)
@@ -3330,14 +3232,13 @@ merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
 
   /* Renumber everything that didn't get a target-assigned number.  */
   highest = 0;
-  for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
-    if (tsv->number > highest)
-      highest = tsv->number;
+  for (const trace_state_variable &tsv : tvariables)
+    highest = std::max (tsv.number, highest);
 
   ++highest;
-  for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
-    if (tsv->number == 0)
-      tsv->number = highest++;
+  for (trace_state_variable &tsv : tvariables)
+    if (tsv.number == 0)
+      tsv.number = highest++;
 
   free_uploaded_tsvs (uploaded_tsvs);
 }
@@ -3537,7 +3438,7 @@ parse_tracepoint_definition (const char *line, struct uploaded_tp **utpp)
   int enabled, end;
   enum bptype type;
   const char *srctype;
-  char *cond, *buf;
+  char *buf;
   struct uploaded_tp *utp = NULL;
 
   p = line;
@@ -3550,13 +3451,14 @@ parse_tracepoint_definition (const char *line, struct uploaded_tp **utpp)
   p++;  /* skip a colon */
   if (piece == 'T')
     {
+      gdb::unique_xmalloc_ptr<char[]> cond;
+
       enabled = (*p++ == 'E');
       p++;  /* skip a colon */
       p = unpack_varlen_hex (p, &step);
       p++;  /* skip a colon */
       p = unpack_varlen_hex (p, &pass);
       type = bp_tracepoint;
-      cond = NULL;
       /* Thumb through optional fields.  */
       while (*p == ':')
        {
@@ -3577,8 +3479,8 @@ parse_tracepoint_definition (const char *line, struct uploaded_tp **utpp)
              p++;
              p = unpack_varlen_hex (p, &xlen);
              p++;  /* skip a comma */
-             cond = (char *) xmalloc (2 * xlen + 1);
-             strncpy (cond, p, 2 * xlen);
+             cond.reset ((char *) xmalloc (2 * xlen + 1));
+             strncpy (&cond[0], p, 2 * xlen);
              cond[2 * xlen] = '\0';
              p += 2 * xlen;
            }
@@ -3591,17 +3493,17 @@ parse_tracepoint_definition (const char *line, struct uploaded_tp **utpp)
       utp->enabled = enabled;
       utp->step = step;
       utp->pass = pass;
-      utp->cond = cond;
+      utp->cond = std::move (cond);
     }
   else if (piece == 'A')
     {
       utp = get_uploaded_tp (num, addr, utpp);
-      utp->actions.push_back (xstrdup (p));
+      utp->actions.emplace_back (xstrdup (p));
     }
   else if (piece == 'S')
     {
       utp = get_uploaded_tp (num, addr, utpp);
-      utp->step_actions.push_back (xstrdup (p));
+      utp->step_actions.emplace_back (xstrdup (p));
     }
   else if (piece == 'Z')
     {
@@ -3621,11 +3523,11 @@ parse_tracepoint_definition (const char *line, struct uploaded_tp **utpp)
       buf[end] = '\0';
 
       if (startswith (srctype, "at:"))
-       utp->at_string = xstrdup (buf);
+       utp->at_string.reset (xstrdup (buf));
       else if (startswith (srctype, "cond:"))
-       utp->cond_string = xstrdup (buf);
+       utp->cond_string.reset (xstrdup (buf));
       else if (startswith (srctype, "cmd:"))
-       utp->cmd_strings.push_back (xstrdup (buf));
+       utp->cmd_strings.emplace_back (xstrdup (buf));
     }
   else if (piece == 'V')
     {
@@ -3721,36 +3623,33 @@ print_one_static_tracepoint_marker (int count,
 {
   struct symbol *sym;
 
-  char wrap_indent[80];
-  char extra_field_indent[80];
   struct ui_out *uiout = current_uiout;
-  VEC(breakpoint_p) *tracepoints;
 
   symtab_and_line sal;
   sal.pc = marker.address;
 
-  tracepoints = static_tracepoints_here (marker.address);
+  std::vector<breakpoint *> tracepoints
+    = static_tracepoints_here (marker.address);
 
   ui_out_emit_tuple tuple_emitter (uiout, "marker");
 
   /* A counter field to help readability.  This is not a stable
      identifier!  */
-  uiout->field_int ("count", count);
+  uiout->field_signed ("count", count);
 
-  uiout->field_string ("marker-id", marker.str_id.c_str ());
+  uiout->field_string ("marker-id", marker.str_id);
 
   uiout->field_fmt ("enabled", "%c",
-                   !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
+                   !tracepoints.empty () ? 'y' : 'n');
   uiout->spaces (2);
 
-  strcpy (wrap_indent, "                                   ");
-
+  int wrap_indent = 35;
   if (gdbarch_addr_bit (marker.gdbarch) <= 32)
-    strcat (wrap_indent, "           ");
+    wrap_indent += 11;
   else
-    strcat (wrap_indent, "                   ");
+    wrap_indent += 19;
 
-  strcpy (extra_field_indent, "         ");
+  const char *extra_field_indent = "         ";
 
   uiout->field_core_addr ("addr", marker.gdbarch, marker.address);
 
@@ -3759,8 +3658,8 @@ print_one_static_tracepoint_marker (int count,
   if (sym)
     {
       uiout->text ("in ");
-      uiout->field_string ("func",
-                          SYMBOL_PRINT_NAME (sym));
+      uiout->field_string ("func", sym->print_name (),
+                          function_name_style.style ());
       uiout->wrap_hint (wrap_indent);
       uiout->text (" at ");
     }
@@ -3770,7 +3669,8 @@ print_one_static_tracepoint_marker (int count,
   if (sal.symtab != NULL)
     {
       uiout->field_string ("file",
-                          symtab_to_filename_for_display (sal.symtab));
+                          symtab_to_filename_for_display (sal.symtab),
+                          file_name_style.style ());
       uiout->text (":");
 
       if (uiout->is_mi_like_p ())
@@ -3782,7 +3682,7 @@ print_one_static_tracepoint_marker (int count,
       else
        uiout->field_skip ("fullname");
 
-      uiout->field_int ("line", sal.line);
+      uiout->field_signed ("line", sal.line);
     }
   else
     {
@@ -3793,35 +3693,32 @@ print_one_static_tracepoint_marker (int count,
   uiout->text ("\n");
   uiout->text (extra_field_indent);
   uiout->text (_("Data: \""));
-  uiout->field_string ("extra-data", marker.extra.c_str ());
+  uiout->field_string ("extra-data", marker.extra);
   uiout->text ("\"\n");
 
-  if (!VEC_empty (breakpoint_p, tracepoints))
+  if (!tracepoints.empty ())
     {
       int ix;
-      struct breakpoint *b;
 
       {
-       ui_out_emit_tuple tuple_emitter (uiout, "tracepoints-at");
+       ui_out_emit_tuple inner_tuple_emitter (uiout, "tracepoints-at");
 
        uiout->text (extra_field_indent);
        uiout->text (_("Probed by static tracepoints: "));
-       for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
+       for (ix = 0; ix < tracepoints.size (); ix++)
          {
            if (ix > 0)
              uiout->text (", ");
            uiout->text ("#");
-           uiout->field_int ("tracepoint-id", b->number);
+           uiout->field_signed ("tracepoint-id", tracepoints[ix]->number);
          }
       }
 
       if (uiout->is_mi_like_p ())
-       uiout->field_int ("number-of-tracepoints",
-                         VEC_length(breakpoint_p, tracepoints));
+       uiout->field_signed ("number-of-tracepoints", tracepoints.size ());
       else
        uiout->text ("\n");
     }
-  VEC_free (breakpoint_p, tracepoints);
 }
 
 static void
@@ -3873,7 +3770,8 @@ sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var,
 {
   /* We need to read the whole object before we know its size.  */
   gdb::optional<gdb::byte_vector> buf
-    = target_read_alloc (&current_target, TARGET_OBJECT_STATIC_TRACE_DATA,
+    = target_read_alloc (current_inferior ()->top_target (),
+                        TARGET_OBJECT_STATIC_TRACE_DATA,
                         NULL);
   if (buf)
     {
@@ -3883,7 +3781,7 @@ sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var,
       type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
                               buf->size ());
       v = allocate_value (type);
-      memcpy (value_contents_raw (v), buf->data (), buf->size ());
+      memcpy (value_contents_raw (v).data (), buf->data (), buf->size ());
       return v;
     }
   else
@@ -4050,13 +3948,16 @@ traceframe_available_memory (std::vector<mem_range> *result,
 static const struct internalvar_funcs sdata_funcs =
 {
   sdata_make_value,
-  NULL,
   NULL
 };
 
+/* See tracepoint.h.  */
+cmd_list_element *while_stepping_cmd_element = nullptr;
+
 /* module initialization */
+void _initialize_tracepoint ();
 void
-_initialize_tracepoint (void)
+_initialize_tracepoint ()
 {
   struct cmd_list_element *c;
 
@@ -4070,7 +3971,7 @@ _initialize_tracepoint (void)
   tracepoint_number = -1;
 
   add_info ("scope", info_scope_command,
-           _("List the variables local to a scope"));
+           _("List the variables local to a scope."));
 
   add_cmd ("tracepoints", class_trace,
           _("Tracing of program execution without stopping the program."),
@@ -4093,27 +3994,25 @@ If no arguments are supplied, delete all variables."), &deletelist);
   /* FIXME add a trace variable completer.  */
 
   add_info ("tvariables", info_tvariables_command, _("\
-Status of trace state variables and their values.\n\
-"));
+Status of trace state variables and their values."));
 
   add_info ("static-tracepoint-markers",
            info_static_tracepoint_markers_command, _("\
-List target static tracepoints markers.\n\
-"));
+List target static tracepoints markers."));
 
   add_prefix_cmd ("tfind", class_trace, tfind_command, _("\
-Select a trace frame;\n\
+Select a trace frame.\n\
 No argument means forward by one frame; '-' means backward by one frame."),
-                 &tfindlist, "tfind ", 1, &cmdlist);
+                 &tfindlist, 1, &cmdlist);
 
   add_cmd ("outside", class_trace, tfind_outside_command, _("\
 Select a trace frame whose PC is outside the given range (exclusive).\n\
-Usage: tfind outside addr1, addr2"),
+Usage: tfind outside ADDR1, ADDR2"),
           &tfindlist);
 
   add_cmd ("range", class_trace, tfind_range_command, _("\
 Select a trace frame whose PC is in the given range (inclusive).\n\
-Usage: tfind range addr1,addr2"),
+Usage: tfind range ADDR1, ADDR2"),
           &tfindlist);
 
   add_cmd ("line", class_trace, tfind_line_command, _("\
@@ -4133,11 +4032,11 @@ Select a trace frame by PC.\n\
 Default is the current PC, or the PC of the current trace frame."),
           &tfindlist);
 
-  add_cmd ("end", class_trace, tfind_end_command, _("\
-De-select any trace frame and resume 'live' debugging."),
-          &tfindlist);
+  cmd_list_element *tfind_end_cmd
+    = add_cmd ("end", class_trace, tfind_end_command, _("\
+De-select any trace frame and resume 'live' debugging."), &tfindlist);
 
-  add_alias_cmd ("none", "end", class_trace, 0, &tfindlist);
+  add_alias_cmd ("none", tfind_end_cmd, class_trace, 0, &tfindlist);
 
   add_cmd ("start", class_trace, tfind_start_command,
           _("Select the first trace frame in the trace buffer."),
@@ -4148,13 +4047,13 @@ De-select any trace frame and resume 'live' debugging."),
 
   add_com ("tstop", class_trace, tstop_command, _("\
 Stop trace data collection.\n\
-Usage: tstop [ <notes> ... ]\n\
+Usage: tstop [NOTES]...\n\
 Any arguments supplied are recorded with the trace as a stop reason and\n\
 reported by tstatus (if the target supports trace notes)."));
 
   add_com ("tstart", class_trace, tstart_command, _("\
 Start trace data collection.\n\
-Usage: tstart [ <notes> ... ]\n\
+Usage: tstart [NOTES]...\n\
 Any arguments supplied are recorded with the trace as a note and\n\
 reported by tstatus (if the target supports trace notes)."));
 
@@ -4165,7 +4064,8 @@ Entering \"end\" on a line by itself is the normal way to terminate\n\
 such a list.\n\n\
 Note: the \"end\" command cannot be used at the gdb prompt."));
 
-  add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
+  while_stepping_cmd_element = add_com ("while-stepping", class_trace,
+                                       while_stepping_pseudocommand, _("\
 Specify single-stepping behavior at a tracepoint.\n\
 Argument is number of instructions to trace in single-step mode\n\
 following the tracepoint.  This command is normally followed by\n\
@@ -4173,8 +4073,8 @@ one or more \"collect\" commands, to specify what to collect\n\
 while single-stepping.\n\n\
 Note: this command can only be used in a tracepoint \"actions\" list."));
 
-  add_com_alias ("ws", "while-stepping", class_alias, 0);
-  add_com_alias ("stepping", "while-stepping", class_alias, 0);
+  add_com_alias ("ws", while_stepping_cmd_element, class_trace, 0);
+  add_com_alias ("stepping", while_stepping_cmd_element, class_trace, 0);
 
   add_com ("collect", class_trace, collect_pseudocommand, _("\
 Specify one or more data items to be collected at a tracepoint.\n\
@@ -4199,11 +4099,10 @@ Tracepoint actions may include collecting of specified data,\n\
 single-stepping, or enabling/disabling other tracepoints,\n\
 depending on target's capabilities."));
 
-  default_collect = xstrdup ("");
   add_setshow_string_cmd ("default-collect", class_trace,
                          &default_collect, _("\
-Set the list of expressions to collect by default"), _("\
-Show the list of expressions to collect by default"), NULL,
+Set the list of expressions to collect by default."), _("\
+Show the list of expressions to collect by default."), NULL,
                          NULL, NULL,
                          &setlist, &showlist);
 
@@ -4243,22 +4142,22 @@ disables any attempt to set the buffer size and lets the target choose."),
 
   add_setshow_string_cmd ("trace-user", class_trace,
                          &trace_user, _("\
-Set the user name to use for current and future trace runs"), _("\
-Show the user name to use for current and future trace runs"), NULL,
+Set the user name to use for current and future trace runs."), _("\
+Show the user name to use for current and future trace runs."), NULL,
                          set_trace_user, NULL,
                          &setlist, &showlist);
 
   add_setshow_string_cmd ("trace-notes", class_trace,
                          &trace_notes, _("\
-Set notes string to use for current and future trace runs"), _("\
-Show the notes string to use for current and future trace runs"), NULL,
+Set notes string to use for current and future trace runs."), _("\
+Show the notes string to use for current and future trace runs."), NULL,
                          set_trace_notes, NULL,
                          &setlist, &showlist);
 
   add_setshow_string_cmd ("trace-stop-notes", class_trace,
                          &trace_stop_notes, _("\
-Set notes string to use for future tstop commands"), _("\
-Show the notes string to use for future tstop commands"), NULL,
+Set notes string to use for future tstop commands."), _("\
+Show the notes string to use for future tstop commands."), NULL,
                          set_trace_stop_notes, NULL,
                          &setlist, &showlist);
 }