AArch64: View the pseudo V registers as vectors
[deliverable/binutils-gdb.git] / gdb / tracepoint.c
index ab80b10ea1da11512b507fd44ccb1a05d18c271d..8cdda7aeed934174f97311215dc5dbac11b547a6 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-2019 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -52,8 +52,8 @@
 #include "cli/cli-utils.h"
 #include "probe.h"
 #include "ctf.h"
-#include "filestuff.h"
-#include "rsp-low.h"
+#include "common/filestuff.h"
+#include "common/rsp-low.h"
 #include "tracefile.h"
 #include "location.h"
 #include <algorithm>
@@ -615,6 +615,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)
@@ -699,12 +712,7 @@ 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++ == ',');
@@ -731,11 +739,7 @@ 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++ == ',');
@@ -811,17 +815,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);
+
+  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.  */
@@ -829,7 +893,7 @@ 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);
@@ -840,7 +904,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.  */
@@ -882,19 +946,19 @@ collection_list::collect_symbol (struct symbol *sym,
       if (TYPE_CODE (SYMBOL_TYPE (sym)) == 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);
+      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 &&
          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");
@@ -911,7 +975,7 @@ collection_list::collect_symbol (struct symbol *sym,
                           SYMBOL_PRINT_NAME (sym), 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);
@@ -923,7 +987,7 @@ collection_list::collect_symbol (struct symbol *sym,
                           SYMBOL_PRINT_NAME (sym), 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;
@@ -935,7 +999,7 @@ collection_list::collect_symbol (struct symbol *sym,
                           SYMBOL_PRINT_NAME (sym), len,
                           paddress (gdbarch, offset), reg);
        }
-      add_memrange (gdbarch, reg, offset, len);
+      add_memrange (gdbarch, reg, offset, len, scope);
       break;
 
     case LOC_UNRESOLVED:
@@ -968,26 +1032,10 @@ collection_list::collect_symbol (struct symbol *sym,
          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));
     }
@@ -1086,9 +1134,20 @@ collection_list::add_static_trace_data ()
 }
 
 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);
 }
@@ -1098,7 +1157,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;
@@ -1108,35 +1168,45 @@ collection_list::stringify ()
     {
       if (info_verbose)
        printf_filtered ("\nCollecting static trace data\n");
-      end = temp_buf;
+      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;
+
+      /* 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;
+
+         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");
   if (!m_memranges.empty () && info_verbose)
     printf_filtered ("Collecting memranges: \n");
-  for (i = 0, count = 0, end = temp_buf; i < m_memranges.size (); i++)
+  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)
@@ -1150,9 +1220,9 @@ collection_list::stringify ()
        }
       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 ();
        }
 
       {
@@ -1172,7 +1242,7 @@ collection_list::stringify ()
       }
 
       count += strlen (end);
-      end = temp_buf + count;
+      end = temp_buf.data () + count;
     }
 
   for (i = 0; i < m_aexprs.size (); i++)
@@ -1180,9 +1250,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 + ',' */
@@ -1194,9 +1264,9 @@ 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;
@@ -1257,8 +1327,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))
@@ -1288,27 +1368,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? */
@@ -1340,7 +1403,8 @@ encode_actions_1 (struct command_line *action,
                                          name);
                        if (info_verbose)
                          printf_filtered ("OP_REGISTER: ");
-                       collect->add_register (i);
+                       collect->add_local_register (target_gdbarch (),
+                                                    i, tloc->address);
                        break;
                      }
 
@@ -1352,7 +1416,8 @@ encode_actions_1 (struct command_line *action,
                      check_typedef (exp->elts[1].type);
                      collect->add_memrange (target_gdbarch (),
                                             memrange_absolute, addr,
-                                            TYPE_LENGTH (exp->elts[1].type));
+                                            TYPE_LENGTH (exp->elts[1].type),
+                                            tloc->address);
                      collect->append_exp (exp.get ());
                      break;
 
@@ -1376,28 +1441,10 @@ 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 ());
@@ -1422,8 +1469,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.  */
@@ -1543,7 +1589,6 @@ trace_reset_local_state (void)
 void
 start_tracing (const char *notes)
 {
-  struct trace_state_variable *tsv;
   int any_enabled = 0, num_to_download = 0;
   int ret;
 
@@ -2382,7 +2427,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");
+      printf_filtered ("Usage: tfind range STARTADDR, ENDADDR\n");
       return;
     }
 
@@ -2416,7 +2461,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");
+      printf_filtered ("Usage: tfind outside STARTADDR, ENDADDR\n");
       return;
     }
 
@@ -2491,7 +2536,7 @@ info_scope_command (const char *args_in, int from_tty)
 
          if (SYMBOL_COMPUTED_OPS (sym) != NULL)
            SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
-                                                         BLOCK_START (block),
+                                                         BLOCK_ENTRY_PC (block),
                                                          gdb_stdout);
          else
            {
@@ -2568,7 +2613,7 @@ info_scope_command (const char *args_in, int from_tty)
                case LOC_BLOCK:
                  printf_filtered ("a function at address ");
                  printf_filtered ("%s",
-                                  paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
+                                  paddress (gdbarch, BLOCK_ENTRY_PC (SYMBOL_BLOCK_VALUE (sym))));
                  break;
                case LOC_UNRESOLVED:
                  msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
@@ -2752,7 +2797,6 @@ all_tracepoint_actions (struct breakpoint *t)
      the fly, and don't cache it.  */
   if (*default_collect)
     {
-      struct command_line *default_collect_action;
       gdb::unique_xmalloc_ptr<char> default_collect_line
        (xstrprintf ("collect %s", default_collect));
 
@@ -3039,7 +3083,8 @@ find_matching_tracepoint_location (struct uploaded_tp *utp)
       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,
+                                 utp->cond_string.get ())
          /* FIXME also test actions.  */
          )
        {
@@ -3179,9 +3224,7 @@ 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
@@ -3191,7 +3234,7 @@ merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
 
   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)
@@ -3420,7 +3463,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;
@@ -3433,13 +3476,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 == ':')
        {
@@ -3460,8 +3504,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;
            }
@@ -3474,17 +3518,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')
     {
@@ -3504,11 +3548,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')
     {
@@ -3642,8 +3686,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", SYMBOL_PRINT_NAME (sym),
+                          ui_out_style_kind::FUNCTION);
       uiout->wrap_hint (wrap_indent);
       uiout->text (" at ");
     }
@@ -3653,7 +3697,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),
+                          ui_out_style_kind::FILE);
       uiout->text (":");
 
       if (uiout->is_mi_like_p ())
@@ -3682,10 +3727,9 @@ print_one_static_tracepoint_marker (int count,
   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: "));
@@ -3935,6 +3979,9 @@ static const struct internalvar_funcs sdata_funcs =
   NULL
 };
 
+/* See tracepoint.h.  */
+cmd_list_element *while_stepping_cmd_element = nullptr;
+
 /* module initialization */
 void
 _initialize_tracepoint (void)
@@ -3989,12 +4036,12 @@ No argument means forward by one frame; '-' means backward by one frame."),
 
   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, _("\
@@ -4046,7 +4093,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\
This page took 0.034624 seconds and 4 git commands to generate.