Use ui_file_as_string in gdb/compile/
[deliverable/binutils-gdb.git] / gdb / tracepoint.c
index 2b4c13778d3847cad5999a244cbeec9d21b442b2..7ff41f9fae0d883f4e3ee14169cef55decf1cbbf 100644 (file)
@@ -1,6 +1,6 @@
 /* Tracing functionality for remote targets in custom GDB protocol
 
-   Copyright (C) 1997-2014 Free Software Foundation, Inc.
+   Copyright (C) 1997-2016 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -28,7 +28,6 @@
 #include "target.h"
 #include "target-dcache.h"
 #include "language.h"
-#include <string.h>
 #include "inferior.h"
 #include "breakpoint.h"
 #include "tracepoint.h"
 #include "ax.h"
 #include "ax-gdb.h"
 #include "memrange.h"
-#include "exceptions.h"
 #include "cli/cli-utils.h"
 #include "probe.h"
 #include "ctf.h"
 #include "filestuff.h"
 #include "rsp-low.h"
 #include "tracefile.h"
+#include "location.h"
+#include <algorithm>
 
 /* readline include files */
 #include "readline/readline.h"
 
 #include <unistd.h>
 
-#ifndef O_LARGEFILE
-#define O_LARGEFILE 0
-#endif
-
 /* Maximum length of an agent aexpression.
    This accounts for the fact that packets are limited to 400 bytes
    (which includes everything -- including the checksum), and assumes
@@ -81,8 +77,6 @@
    large.  (400 - 31)/2 == 184 */
 #define MAX_AGENT_EXPR_LEN     184
 
-#define TFILE_PID (1)
-
 /* A hook used to notify the UI of tracepoint operations.  */
 
 void (*deprecated_trace_find_hook) (char *arg, int from_tty);
@@ -187,10 +181,7 @@ static void trace_dump_command (char *, int);
 /* support routines */
 
 struct collection_list;
-static void add_aexpr (struct collection_list *, struct agent_expr *);
 static char *mem2hex (gdb_byte *, char *, int);
-static void add_register (struct collection_list *collection,
-                         unsigned int regno);
 
 static struct command_line *
   all_tracepoint_actions_and_cleanup (struct breakpoint *t);
@@ -659,7 +650,7 @@ trace_actions_command (char *args, int from_tty)
   struct tracepoint *t;
   struct command_line *l;
 
-  t = get_tracepoint_by_number (&args, NULL, 1);
+  t = get_tracepoint_by_number (&args, NULL);
   if (t)
     {
       char *tmpbuf =
@@ -707,7 +698,6 @@ void
 validate_actionline (const char *line, struct breakpoint *b)
 {
   struct cmd_list_element *c;
-  struct expression *exp = NULL;
   struct cleanup *old_chain = NULL;
   const char *tmp_p;
   const char *p;
@@ -761,9 +751,8 @@ validate_actionline (const char *line, struct breakpoint *b)
          for (loc = t->base.loc; loc; loc = loc->next)
            {
              p = tmp_p;
-             exp = parse_exp_1 (&p, loc->address,
-                                block_for_pc (loc->address), 1);
-             old_chain = make_cleanup (free_current_contents, &exp);
+             expression_up exp = parse_exp_1 (&p, loc->address,
+                                              block_for_pc (loc->address), 1);
 
              if (exp->elts[0].opcode == OP_VAR_VALUE)
                {
@@ -786,8 +775,8 @@ validate_actionline (const char *line, struct breakpoint *b)
              /* We have something to collect, make sure that the expr to
                 bytecode translator can handle it and that it's not too
                 long.  */
-             aexpr = gen_trace_for_expr (loc->address, exp, trace_string);
-             make_cleanup_free_agent_expr (aexpr);
+             aexpr = gen_trace_for_expr (loc->address, exp.get (), trace_string);
+             old_chain = make_cleanup_free_agent_expr (aexpr);
 
              if (aexpr->len > MAX_AGENT_EXPR_LEN)
                error (_("Expression is too complicated."));
@@ -815,15 +804,14 @@ validate_actionline (const char *line, struct breakpoint *b)
              p = tmp_p;
 
              /* Only expressions are allowed for this action.  */
-             exp = parse_exp_1 (&p, loc->address,
-                                block_for_pc (loc->address), 1);
-             old_chain = make_cleanup (free_current_contents, &exp);
+             expression_up exp = parse_exp_1 (&p, loc->address,
+                                              block_for_pc (loc->address), 1);
 
              /* We have something to evaluate, make sure that the expr to
                 bytecode translator can handle it and that it's not too
                 long.  */
-             aexpr = gen_eval_for_expr (loc->address, exp);
-             make_cleanup_free_agent_expr (aexpr);
+             aexpr = gen_eval_for_expr (loc->address, exp.get ());
+             old_chain = make_cleanup_free_agent_expr (aexpr);
 
              if (aexpr->len > MAX_AGENT_EXPR_LEN)
                error (_("Expression is too complicated."));
@@ -861,82 +849,70 @@ enum {
 
 /* MEMRANGE functions: */
 
-static int memrange_cmp (const void *, const void *);
+/* Compare memranges for std::sort.  */
 
-/* Compare memranges for qsort.  */
-static int
-memrange_cmp (const void *va, const void *vb)
+static bool
+memrange_comp (const memrange &a, const memrange &b)
 {
-  const struct memrange *a = va, *b = vb;
-
-  if (a->type < b->type)
-    return -1;
-  if (a->type > b->type)
-    return 1;
-  if (a->type == memrange_absolute)
+  if (a.type == b.type)
     {
-      if ((bfd_vma) a->start < (bfd_vma) b->start)
-       return -1;
-      if ((bfd_vma) a->start > (bfd_vma) b->start)
-       return 1;
-    }
-  else
-    {
-      if (a->start < b->start)
-       return -1;
-      if (a->start > b->start)
-       return 1;
+      if (a.type == memrange_absolute)
+       return (bfd_vma) a.start < (bfd_vma) b.start;
+      else
+       return a.start < b.start;
     }
-  return 0;
+
+  return a.type < b.type;
 }
 
-/* Sort the memrange list using qsort, and merge adjacent memranges.  */
+/* Sort the memrange list using std::sort, and merge adjacent memranges.  */
+
 static void
-memrange_sortmerge (struct collection_list *memranges)
+memrange_sortmerge (std::vector<memrange> &memranges)
 {
-  int a, b;
-
-  qsort (memranges->list, memranges->next_memrange,
-        sizeof (struct memrange), memrange_cmp);
-  if (memranges->next_memrange > 0)
+  if (!memranges.empty ())
     {
-      for (a = 0, b = 1; b < memranges->next_memrange; b++)
+      int a, b;
+
+      std::sort (memranges.begin (), memranges.end (), memrange_comp);
+
+      for (a = 0, b = 1; b < memranges.size (); b++)
        {
          /* If memrange b overlaps or is adjacent to memrange a,
             merge them.  */
-         if (memranges->list[a].type == memranges->list[b].type
-             && memranges->list[b].start <= memranges->list[a].end)
+         if (memranges[a].type == memranges[b].type
+             && memranges[b].start <= memranges[a].end)
            {
-             if (memranges->list[b].end > memranges->list[a].end)
-               memranges->list[a].end = memranges->list[b].end;
+             if (memranges[b].end > memranges[a].end)
+               memranges[a].end = memranges[b].end;
              continue;         /* next b, same a */
            }
          a++;                  /* next a */
          if (a != b)
-           memcpy (&memranges->list[a], &memranges->list[b],
-                   sizeof (struct memrange));
+           memranges[a] = memranges[b];
        }
-      memranges->next_memrange = a + 1;
+      memranges.resize (a + 1);
     }
 }
 
 /* Add a register to a collection list.  */
-static void
-add_register (struct collection_list *collection, unsigned int regno)
+
+void
+collection_list::add_register (unsigned int regno)
 {
   if (info_verbose)
     printf_filtered ("collect register %d\n", regno);
-  if (regno >= (8 * sizeof (collection->regs_mask)))
+  if (regno >= (8 * sizeof (m_regs_mask)))
     error (_("Internal: register number %d too large for tracepoint"),
           regno);
-  collection->regs_mask[regno / 8] |= 1 << (regno % 8);
+  m_regs_mask[regno / 8] |= 1 << (regno % 8);
 }
 
 /* Add a memrange to a collection list.  */
-static void
-add_memrange (struct collection_list *memranges, 
-             int type, bfd_signed_vma base,
-             unsigned long len)
+
+void
+collection_list::add_memrange (int type, bfd_signed_vma base,
+                              unsigned long len)
 {
   if (info_verbose)
     {
@@ -946,31 +922,22 @@ add_memrange (struct collection_list *memranges,
     }
 
   /* type: memrange_absolute == memory, other n == basereg */
-  memranges->list[memranges->next_memrange].type = type;
   /* base: addr if memory, offset if reg relative.  */
-  memranges->list[memranges->next_memrange].start = base;
   /* len: we actually save end (base + len) for convenience */
-  memranges->list[memranges->next_memrange].end = base + len;
-  memranges->next_memrange++;
-  if (memranges->next_memrange >= memranges->listsize)
-    {
-      memranges->listsize *= 2;
-      memranges->list = xrealloc (memranges->list,
-                                 memranges->listsize);
-    }
+  m_memranges.push_back (memrange (type, base, base + len));
 
   if (type != memrange_absolute)    /* Better collect the base register!  */
-    add_register (memranges, type);
+    add_register (type);
 }
 
 /* Add a symbol to a collection list.  */
-static void
-collect_symbol (struct collection_list *collect, 
-               struct symbol *sym,
-               struct gdbarch *gdbarch,
-               long frame_regno, long frame_offset,
-               CORE_ADDR scope,
-               int trace_string)
+
+void
+collection_list::collect_symbol (struct symbol *sym,
+                                struct gdbarch *gdbarch,
+                                long frame_regno, long frame_offset,
+                                CORE_ADDR scope,
+                                int trace_string)
 {
   unsigned long len;
   unsigned int reg;
@@ -1005,19 +972,19 @@ collect_symbol (struct collection_list *collect,
       if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
        treat_as_expr = 1;
       else
-       add_memrange (collect, memrange_absolute, offset, len);
+       add_memrange (memrange_absolute, offset, len);
       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 (collect, reg);
+      add_register (reg);
       /* 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 (collect, reg + 1);
+       add_register (reg + 1);
       break;
     case LOC_REF_ARG:
       printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
@@ -1034,7 +1001,7 @@ collect_symbol (struct collection_list *collect,
          printf_vma (offset);
          printf_filtered (" from frame ptr reg %d\n", reg);
        }
-      add_memrange (collect, reg, offset, len);
+      add_memrange (reg, offset, len);
       break;
     case LOC_REGPARM_ADDR:
       reg = SYMBOL_VALUE (sym);
@@ -1046,7 +1013,7 @@ collect_symbol (struct collection_list *collect,
          printf_vma (offset);
          printf_filtered (" from reg %d\n", reg);
        }
-      add_memrange (collect, reg, offset, len);
+      add_memrange (reg, offset, len);
       break;
     case LOC_LOCAL:
       reg = frame_regno;
@@ -1058,7 +1025,7 @@ collect_symbol (struct collection_list *collect,
          printf_vma (offset);
          printf_filtered (" from frame ptr reg %d\n", reg);
        }
-      add_memrange (collect, reg, offset, len);
+      add_memrange (reg, offset, len);
       break;
 
     case LOC_UNRESOLVED:
@@ -1100,7 +1067,7 @@ collect_symbol (struct collection_list *collect,
       report_agent_reqs_errors (aexpr);
 
       discard_cleanups (old_chain1);
-      add_aexpr (collect, aexpr);
+      add_aexpr (aexpr);
 
       /* Take care of the registers.  */
       if (aexpr->reg_mask_len > 0)
@@ -1116,7 +1083,7 @@ collect_symbol (struct collection_list *collect,
                  for (ndx2 = 0; ndx2 < 8; ndx2++)
                    if (aexpr->reg_mask[ndx1] & (1 << ndx2))
                      /* It's used -- record it.  */
-                     add_register (collect, ndx1 * 8 + ndx2);
+                     add_register (ndx1 * 8 + ndx2);
                }
            }
        }
@@ -1144,27 +1111,32 @@ do_collect_symbol (const char *print_name,
                   struct symbol *sym,
                   void *cb_data)
 {
-  struct add_local_symbols_data *p = cb_data;
+  struct add_local_symbols_data *p = (struct add_local_symbols_data *) cb_data;
 
-  collect_symbol (p->collect, sym, p->gdbarch, p->frame_regno,
-                 p->frame_offset, p->pc, p->trace_string);
+  p->collect->collect_symbol (sym, p->gdbarch, p->frame_regno,
+                             p->frame_offset, p->pc, p->trace_string);
   p->count++;
 
-  VEC_safe_push (char_ptr, p->collect->wholly_collected,
-                xstrdup (print_name));
+  p->collect->add_wholly_collected (print_name);
+}
+
+void
+collection_list::add_wholly_collected (const char *print_name)
+{
+  m_wholly_collected.push_back (print_name);
 }
 
 /* Add all locals (or args) symbols to collection list.  */
-static void
-add_local_symbols (struct collection_list *collect,
-                  struct gdbarch *gdbarch, CORE_ADDR pc,
-                  long frame_regno, long frame_offset, int type,
-                  int trace_string)
+
+void
+collection_list::add_local_symbols (struct gdbarch *gdbarch, CORE_ADDR pc,
+                                   long frame_regno, long frame_offset, int type,
+                                   int trace_string)
 {
-  struct block *block;
+  const struct block *block;
   struct add_local_symbols_data cb_data;
 
-  cb_data.collect = collect;
+  cb_data.collect = this;
   cb_data.gdbarch = gdbarch;
   cb_data.pc = pc;
   cb_data.frame_regno = frame_regno;
@@ -1202,66 +1174,32 @@ add_local_symbols (struct collection_list *collect,
     }
 }
 
-static void
-add_static_trace_data (struct collection_list *collection)
+void
+collection_list::add_static_trace_data ()
 {
   if (info_verbose)
     printf_filtered ("collect static trace data\n");
-  collection->strace_data = 1;
+  m_strace_data = true;
 }
 
-/* worker function */
-static void
-clear_collection_list (struct collection_list *list)
+collection_list::collection_list ()
+  : m_regs_mask (),
+    m_strace_data (false)
 {
-  int ndx;
-
-  list->next_memrange = 0;
-  for (ndx = 0; ndx < list->next_aexpr_elt; ndx++)
-    {
-      free_agent_expr (list->aexpr_list[ndx]);
-      list->aexpr_list[ndx] = NULL;
-    }
-  list->next_aexpr_elt = 0;
-  memset (list->regs_mask, 0, sizeof (list->regs_mask));
-  list->strace_data = 0;
-
-  xfree (list->aexpr_list);
-  xfree (list->list);
-
-  VEC_free (char_ptr, list->wholly_collected);
-  VEC_free (char_ptr, list->computed);
-}
-
-/* A cleanup wrapper for function clear_collection_list.  */
-
-static void
-do_clear_collection_list (void *list)
-{
-  struct collection_list *l = list;
-
-  clear_collection_list (l);
+  m_memranges.reserve (128);
+  m_aexprs.reserve (128);
 }
 
-/* Initialize collection_list CLIST.  */
-
-static void
-init_collection_list (struct collection_list *clist)
+collection_list::~collection_list ()
 {
-  memset (clist, 0, sizeof *clist);
-
-  clist->listsize = 128;
-  clist->list = xcalloc (clist->listsize,
-                        sizeof (struct memrange));
-
-  clist->aexpr_listsize = 128;
-  clist->aexpr_list = xcalloc (clist->aexpr_listsize,
-                              sizeof (struct agent_expr *));
+  for (int ndx = 0; ndx < m_aexprs.size (); ndx++)
+    free_agent_expr (m_aexprs[ndx]);
 }
 
 /* Reduce a collection list to string form (for gdb protocol).  */
-static char **
-stringify_collection_list (struct collection_list *list)
+
+char **
+collection_list::stringify ()
 {
   char temp_buf[2048];
   char tmp2[40];
@@ -1271,10 +1209,10 @@ stringify_collection_list (struct collection_list *list)
   char *end;
   long i;
 
-  count = 1 + 1 + list->next_memrange + list->next_aexpr_elt + 1;
+  count = 1 + 1 + m_memranges.size () + m_aexprs.size () + 1;
   str_list = (char *(*)[]) xmalloc (count * sizeof (char *));
 
-  if (list->strace_data)
+  if (m_strace_data)
     {
       if (info_verbose)
        printf_filtered ("\nCollecting static trace data\n");
@@ -1284,10 +1222,10 @@ stringify_collection_list (struct collection_list *list)
       ndx++;
     }
 
-  for (i = sizeof (list->regs_mask) - 1; i > 0; i--)
-    if (list->regs_mask[i] != 0)    /* Skip leading zeroes in regs_mask.  */
+  for (i = sizeof (m_regs_mask) - 1; i > 0; i--)
+    if (m_regs_mask[i] != 0)    /* Skip leading zeroes in regs_mask.  */
       break;
-  if (list->regs_mask[i] != 0) /* Prepare to send regs_mask to the stub.  */
+  if (m_regs_mask[i] != 0)     /* Prepare to send regs_mask to the stub.  */
     {
       if (info_verbose)
        printf_filtered ("\nCollecting registers (mask): 0x");
@@ -1297,8 +1235,8 @@ stringify_collection_list (struct collection_list *list)
        {
          QUIT;                 /* Allow user to bail out with ^C.  */
          if (info_verbose)
-           printf_filtered ("%02X", list->regs_mask[i]);
-         sprintf (end, "%02X", list->regs_mask[i]);
+           printf_filtered ("%02X", m_regs_mask[i]);
+         sprintf (end, "%02X", m_regs_mask[i]);
          end += 2;
        }
       (*str_list)[ndx] = xstrdup (temp_buf);
@@ -1306,18 +1244,19 @@ stringify_collection_list (struct collection_list *list)
     }
   if (info_verbose)
     printf_filtered ("\n");
-  if (list->next_memrange > 0 && info_verbose)
+  if (!m_memranges.empty () && info_verbose)
     printf_filtered ("Collecting memranges: \n");
-  for (i = 0, count = 0, end = temp_buf; i < list->next_memrange; i++)
+  for (i = 0, count = 0, end = temp_buf; i < m_memranges.size (); i++)
     {
       QUIT;                    /* Allow user to bail out with ^C.  */
-      sprintf_vma (tmp2, list->list[i].start);
+      sprintf_vma (tmp2, m_memranges[i].start);
       if (info_verbose)
        {
          printf_filtered ("(%d, %s, %ld)\n", 
-                          list->list[i].type, 
+                          m_memranges[i].type,
                           tmp2, 
-                          (long) (list->list[i].end - list->list[i].start));
+                          (long) (m_memranges[i].end
+                                  - m_memranges[i].start));
        }
       if (count + 27 > MAX_AGENT_EXPR_LEN)
        {
@@ -1328,39 +1267,39 @@ stringify_collection_list (struct collection_list *list)
        }
 
       {
-        bfd_signed_vma length = list->list[i].end - list->list[i].start;
+        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 (list->list[i].type == memrange_absolute)
+        if (m_memranges[i].type == memrange_absolute)
           sprintf (end, "M-1,%s,%lX", tmp2, (long) length);
         else
-          sprintf (end, "M%X,%s,%lX", list->list[i].type, tmp2, (long) length);
+          sprintf (end, "M%X,%s,%lX", m_memranges[i].type, tmp2, (long) length);
       }
 
       count += strlen (end);
       end = temp_buf + count;
     }
 
-  for (i = 0; i < list->next_aexpr_elt; i++)
+  for (i = 0; i < m_aexprs.size (); i++)
     {
       QUIT;                    /* Allow user to bail out with ^C.  */
-      if ((count + 10 + 2 * list->aexpr_list[i]->len) > MAX_AGENT_EXPR_LEN)
+      if ((count + 10 + 2 * m_aexprs[i]->len) > MAX_AGENT_EXPR_LEN)
        {
          (*str_list)[ndx] = savestring (temp_buf, count);
          ndx++;
          count = 0;
          end = temp_buf;
        }
-      sprintf (end, "X%08X,", list->aexpr_list[i]->len);
+      sprintf (end, "X%08X,", m_aexprs[i]->len);
       end += 10;               /* 'X' + 8 hex digits + ',' */
       count += 10;
 
-      end = mem2hex (list->aexpr_list[i]->buf, 
-                    end, list->aexpr_list[i]->len);
-      count += 2 * list->aexpr_list[i]->len;
+      end = mem2hex (m_aexprs[i]->buf, end, m_aexprs[i]->len);
+      count += 2 * m_aexprs[i]->len;
     }
 
   if (count != 0)
@@ -1383,20 +1322,23 @@ stringify_collection_list (struct collection_list *list)
 
 /* Add the printed expression EXP to *LIST.  */
 
-static void
-append_exp (struct expression *exp, VEC(char_ptr) **list)
+void
+collection_list::append_exp (struct expression *exp)
 {
   struct ui_file *tmp_stream = mem_fileopen ();
-  char *text;
 
   print_expression (exp, tmp_stream);
 
-  text = ui_file_xstrdup (tmp_stream, NULL);
-
-  VEC_safe_push (char_ptr, *list, text);
+  m_computed.push_back (ui_file_as_string (tmp_stream));
   ui_file_delete (tmp_stream);
 }
 
+void
+collection_list::finish ()
+{
+  memrange_sortmerge (m_memranges);
+}
+
 static void
 encode_actions_1 (struct command_line *action,
                  struct bp_location *tloc,
@@ -1406,7 +1348,6 @@ encode_actions_1 (struct command_line *action,
                  struct collection_list *stepping_list)
 {
   const char *action_exp;
-  struct expression *exp = NULL;
   int i;
   struct value *tempval;
   struct cmd_list_element *cmd;
@@ -1436,30 +1377,28 @@ encode_actions_1 (struct command_line *action,
 
              if (0 == strncasecmp ("$reg", action_exp, 4))
                {
-                 for (i = 0; i < gdbarch_num_regs (tloc->gdbarch); i++)
-                   add_register (collect, i);
+                 for (i = 0; i < gdbarch_num_regs (target_gdbarch ()); i++)
+                   collect->add_register (i);
                  action_exp = strchr (action_exp, ',');        /* more? */
                }
              else if (0 == strncasecmp ("$arg", action_exp, 4))
                {
-                 add_local_symbols (collect,
-                                    tloc->gdbarch,
-                                    tloc->address,
-                                    frame_reg,
-                                    frame_offset,
-                                    'A',
-                                    trace_string);
+                 collect->add_local_symbols (target_gdbarch (),
+                                             tloc->address,
+                                             frame_reg,
+                                             frame_offset,
+                                             'A',
+                                             trace_string);
                  action_exp = strchr (action_exp, ',');        /* more? */
                }
              else if (0 == strncasecmp ("$loc", action_exp, 4))
                {
-                 add_local_symbols (collect,
-                                    tloc->gdbarch,
-                                    tloc->address,
-                                    frame_reg,
-                                    frame_offset,
-                                    'L',
-                                    trace_string);
+                 collect->add_local_symbols (target_gdbarch (),
+                                             tloc->address,
+                                             frame_reg,
+                                             frame_offset,
+                                             'L',
+                                             trace_string);
                  action_exp = strchr (action_exp, ',');        /* more? */
                }
              else if (0 == strncasecmp ("$_ret", action_exp, 5))
@@ -1467,7 +1406,7 @@ encode_actions_1 (struct command_line *action,
                  struct cleanup *old_chain1 = NULL;
 
                  aexpr = gen_trace_for_return_address (tloc->address,
-                                                       tloc->gdbarch,
+                                                       target_gdbarch (),
                                                        trace_string);
 
                  old_chain1 = make_cleanup_free_agent_expr (aexpr);
@@ -1476,7 +1415,7 @@ encode_actions_1 (struct command_line *action,
                  report_agent_reqs_errors (aexpr);
 
                  discard_cleanups (old_chain1);
-                 add_aexpr (collect, aexpr);
+                 collect->add_aexpr (aexpr);
 
                  /* take care of the registers */
                  if (aexpr->reg_mask_len > 0)
@@ -1491,9 +1430,10 @@ encode_actions_1 (struct command_line *action,
                              /* assume chars have 8 bits */
                              for (ndx2 = 0; ndx2 < 8; ndx2++)
                                if (aexpr->reg_mask[ndx1] & (1 << ndx2))
-                                 /* it's used -- record it */
-                                 add_register (collect, 
-                                               ndx1 * 8 + ndx2);
+                                 {
+                                   /* It's used -- record it.  */
+                                   collect->add_register (ndx1 * 8 + ndx2);
+                                 }
                            }
                        }
                    }
@@ -1502,18 +1442,17 @@ encode_actions_1 (struct command_line *action,
                }
              else if (0 == strncasecmp ("$_sdata", action_exp, 7))
                {
-                 add_static_trace_data (collect);
+                 collect->add_static_trace_data ();
                  action_exp = strchr (action_exp, ',');        /* more? */
                }
              else
                {
                  unsigned long addr;
-                 struct cleanup *old_chain = NULL;
                  struct cleanup *old_chain1 = NULL;
 
-                 exp = parse_exp_1 (&action_exp, tloc->address,
-                                    block_for_pc (tloc->address), 1);
-                 old_chain = make_cleanup (free_current_contents, &exp);
+                 expression_up exp = parse_exp_1 (&action_exp, tloc->address,
+                                                  block_for_pc (tloc->address),
+                                                  1);
 
                  switch (exp->elts[0].opcode)
                    {
@@ -1521,7 +1460,7 @@ encode_actions_1 (struct command_line *action,
                      {
                        const char *name = &exp->elts[2].string;
 
-                       i = user_reg_map_name_to_regnum (tloc->gdbarch,
+                       i = user_reg_map_name_to_regnum (target_gdbarch (),
                                                         name, strlen (name));
                        if (i == -1)
                          internal_error (__FILE__, __LINE__,
@@ -1529,19 +1468,19 @@ encode_actions_1 (struct command_line *action,
                                          name);
                        if (info_verbose)
                          printf_filtered ("OP_REGISTER: ");
-                       add_register (collect, i);
+                       collect->add_register (i);
                        break;
                      }
 
                    case UNOP_MEMVAL:
                      /* Safe because we know it's a simple expression.  */
-                     tempval = evaluate_expression (exp);
+                     tempval = evaluate_expression (exp.get ());
                      addr = value_address (tempval);
                      /* Initialize the TYPE_LENGTH if it is a typedef.  */
                      check_typedef (exp->elts[1].type);
-                     add_memrange (collect, memrange_absolute, addr,
-                                   TYPE_LENGTH (exp->elts[1].type));
-                     append_exp (exp, &collect->computed);
+                     collect->add_memrange (memrange_absolute, addr,
+                                            TYPE_LENGTH (exp->elts[1].type));
+                     collect->append_exp (exp.get ());
                      break;
 
                    case OP_VAR_VALUE:
@@ -1549,21 +1488,18 @@ encode_actions_1 (struct command_line *action,
                        struct symbol *sym = exp->elts[2].symbol;
                        char_ptr name = (char_ptr) SYMBOL_NATURAL_NAME (sym);
 
-                       collect_symbol (collect,
-                                       exp->elts[2].symbol,
-                                       tloc->gdbarch,
-                                       frame_reg,
-                                       frame_offset,
-                                       tloc->address,
-                                       trace_string);
-                       VEC_safe_push (char_ptr,
-                                      collect->wholly_collected,
-                                      name);
+                       collect->collect_symbol (exp->elts[2].symbol,
+                                                target_gdbarch (),
+                                                frame_reg,
+                                                frame_offset,
+                                                tloc->address,
+                                                trace_string);
+                       collect->add_wholly_collected (name);
                      }
                      break;
 
                    default:    /* Full-fledged expression.  */
-                     aexpr = gen_trace_for_expr (tloc->address, exp,
+                     aexpr = gen_trace_for_expr (tloc->address, exp.get (),
                                                  trace_string);
 
                      old_chain1 = make_cleanup_free_agent_expr (aexpr);
@@ -1573,7 +1509,7 @@ encode_actions_1 (struct command_line *action,
                      report_agent_reqs_errors (aexpr);
 
                      discard_cleanups (old_chain1);
-                     add_aexpr (collect, aexpr);
+                     collect->add_aexpr (aexpr);
 
                      /* Take care of the registers.  */
                      if (aexpr->reg_mask_len > 0)
@@ -1589,17 +1525,17 @@ encode_actions_1 (struct command_line *action,
                                  /* Assume chars have 8 bits.  */
                                  for (ndx2 = 0; ndx2 < 8; ndx2++)
                                    if (aexpr->reg_mask[ndx1] & (1 << ndx2))
-                                     /* It's used -- record it.  */
-                                     add_register (collect, 
-                                                   ndx1 * 8 + ndx2);
+                                     {
+                                       /* It's used -- record it.  */
+                                       collect->add_register (ndx1 * 8 + ndx2);
+                                     }
                                }
                            }
                        }
 
-                     append_exp (exp, &collect->computed);
+                     collect->append_exp (exp.get ());
                      break;
                    }           /* switch */
-                 do_cleanups (old_chain);
                }               /* do */
            }
          while (action_exp && *action_exp++ == ',');
@@ -1612,14 +1548,13 @@ encode_actions_1 (struct command_line *action,
              action_exp = skip_spaces_const (action_exp);
 
                {
-                 struct cleanup *old_chain = NULL;
                  struct cleanup *old_chain1 = NULL;
 
-                 exp = parse_exp_1 (&action_exp, tloc->address,
-                                    block_for_pc (tloc->address), 1);
-                 old_chain = make_cleanup (free_current_contents, &exp);
+                 expression_up exp = parse_exp_1 (&action_exp, tloc->address,
+                                                  block_for_pc (tloc->address),
+                                                  1);
 
-                 aexpr = gen_eval_for_expr (tloc->address, exp);
+                 aexpr = gen_eval_for_expr (tloc->address, exp.get ());
                  old_chain1 = make_cleanup_free_agent_expr (aexpr);
 
                  ax_reqs (aexpr);
@@ -1628,9 +1563,7 @@ encode_actions_1 (struct command_line *action,
                  discard_cleanups (old_chain1);
                  /* Even though we're not officially collecting, add
                     to the collect list anyway.  */
-                 add_aexpr (collect, aexpr);
-
-                 do_cleanups (old_chain);
+                 collect->add_aexpr (aexpr);
                }               /* do */
            }
          while (action_exp && *action_exp++ == ',');
@@ -1651,29 +1584,17 @@ encode_actions_1 (struct command_line *action,
 }
 
 /* Encode actions of tracepoint TLOC->owner and fill TRACEPOINT_LIST
-   and STEPPING_LIST.  Return a cleanup pointer to clean up both
-   TRACEPOINT_LIST and STEPPING_LIST.  */
+   and STEPPING_LIST.  */
 
-struct cleanup *
-encode_actions_and_make_cleanup (struct bp_location *tloc,
-                                struct collection_list *tracepoint_list,
-                                struct collection_list *stepping_list)
+void
+encode_actions (struct bp_location *tloc,
+               struct collection_list *tracepoint_list,
+               struct collection_list *stepping_list)
 {
-  char *default_collect_line = NULL;
   struct command_line *actions;
-  struct command_line *default_collect_action = NULL;
   int frame_reg;
   LONGEST frame_offset;
-  struct cleanup *back_to, *return_chain;
-
-  return_chain = make_cleanup (null_cleanup, NULL);
-  init_collection_list (tracepoint_list);
-  init_collection_list (stepping_list);
 
-  make_cleanup (do_clear_collection_list, tracepoint_list);
-  make_cleanup (do_clear_collection_list, stepping_list);
-
-  back_to = make_cleanup (null_cleanup, NULL);
   gdbarch_virtual_frame_pointer (tloc->gdbarch,
                                 tloc->address, &frame_reg, &frame_offset);
 
@@ -1682,11 +1603,8 @@ encode_actions_and_make_cleanup (struct bp_location *tloc,
   encode_actions_1 (actions, tloc, frame_reg, frame_offset,
                    tracepoint_list, stepping_list);
 
-  memrange_sortmerge (tracepoint_list);
-  memrange_sortmerge (stepping_list);
-
-  do_cleanups (back_to);
-  return return_chain;
+  tracepoint_list->finish ();
+  stepping_list->finish ();
 }
 
 /* Render all actions into gdb protocol.  */
@@ -1696,32 +1614,20 @@ encode_actions_rsp (struct bp_location *tloc, char ***tdp_actions,
                    char ***stepping_actions)
 {
   struct collection_list tracepoint_list, stepping_list;
-  struct cleanup *cleanup;
 
   *tdp_actions = NULL;
   *stepping_actions = NULL;
 
-  cleanup = encode_actions_and_make_cleanup (tloc, &tracepoint_list,
-                                            &stepping_list);
-
-  *tdp_actions = stringify_collection_list (&tracepoint_list);
-  *stepping_actions = stringify_collection_list (&stepping_list);
+  encode_actions (tloc, &tracepoint_list, &stepping_list);
 
-  do_cleanups (cleanup);
+  *tdp_actions = tracepoint_list.stringify ();
+  *stepping_actions = stepping_list.stringify ();
 }
 
-static void
-add_aexpr (struct collection_list *collect, struct agent_expr *aexpr)
+void
+collection_list::add_aexpr (struct agent_expr *aexpr)
 {
-  if (collect->next_aexpr_elt >= collect->aexpr_listsize)
-    {
-      collect->aexpr_list =
-       xrealloc (collect->aexpr_list,
-                 2 * collect->aexpr_listsize * sizeof (struct agent_expr *));
-      collect->aexpr_listsize *= 2;
-    }
-  collect->aexpr_list[collect->next_aexpr_elt] = aexpr;
-  collect->next_aexpr_elt++;
+  m_aexprs.push_back (aexpr);
 }
 
 static void
@@ -1798,9 +1704,6 @@ start_tracing (char *notes)
 
   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
     {
-      struct tracepoint *t = (struct tracepoint *) b;
-      struct bp_location *loc;
-
       if (b->enable_state == bp_enabled)
        any_enabled = 1;
 
@@ -1866,8 +1769,11 @@ start_tracing (char *notes)
       t->number_on_target = b->number;
 
       for (loc = b->loc; loc; loc = loc->next)
-       if (loc->probe != NULL)
-         loc->probe->pops->set_semaphore (loc->probe, loc->gdbarch);
+       if (loc->probe.probe != NULL
+           && loc->probe.probe->pops->set_semaphore != NULL)
+         loc->probe.probe->pops->set_semaphore (loc->probe.probe,
+                                                loc->probe.objfile,
+                                                loc->gdbarch);
 
       if (bp_location_downloaded)
        observer_notify_breakpoint_modified (b);
@@ -1963,8 +1869,11 @@ stop_tracing (char *note)
             but we don't really care if this semaphore goes out of sync.
             That's why we are decrementing it here, but not taking care
             in other places.  */
-         if (loc->probe != NULL)
-           loc->probe->pops->clear_semaphore (loc->probe, loc->gdbarch);
+         if (loc->probe.probe != NULL
+             && loc->probe.probe->pops->clear_semaphore != NULL)
+           loc->probe.probe->pops->clear_semaphore (loc->probe.probe,
+                                                    loc->probe.objfile,
+                                                    loc->gdbarch);
        }
     }
 
@@ -2445,6 +2354,15 @@ tfind_1 (enum trace_find_type type, int num,
     }
 }
 
+/* Error on looking at traceframes while trace is running.  */
+
+void
+check_trace_running (struct trace_status *status)
+{
+  if (status->running && status->filename == NULL)
+    error (_("May not look at trace frames while trace is running."));
+}
+
 /* trace_find_command takes a trace frame number n, 
    sends "QTFrame:<n>" to the target, 
    and accepts a reply that may contain several optional pieces
@@ -2465,9 +2383,7 @@ trace_find_command (char *args, int from_tty)
 { /* This should only be called with a numeric argument.  */
   int frameno = -1;
 
-  if (current_trace_status ()->running
-      && current_trace_status ()->filename == NULL)
-    error (_("May not look at trace frames while trace is running."));
+  check_trace_running (current_trace_status ());
   
   if (args == 0 || *args == 0)
     { /* TFIND with no args means find NEXT trace frame.  */
@@ -2517,9 +2433,7 @@ trace_find_pc_command (char *args, int from_tty)
 {
   CORE_ADDR pc;
 
-  if (current_trace_status ()->running
-      && current_trace_status ()->filename == NULL)
-    error (_("May not look at trace frames while trace is running."));
+  check_trace_running (current_trace_status ());
 
   if (args == 0 || *args == 0)
     pc = regcache_read_pc (get_current_regcache ());
@@ -2536,9 +2450,7 @@ trace_find_tracepoint_command (char *args, int from_tty)
   int tdp;
   struct tracepoint *tp;
 
-  if (current_trace_status ()->running
-      && current_trace_status ()->filename == NULL)
-    error (_("May not look at trace frames while trace is running."));
+  check_trace_running (current_trace_status ());
 
   if (args == 0 || *args == 0)
     {
@@ -2576,16 +2488,13 @@ trace_find_line_command (char *args, int from_tty)
   struct symtab_and_line sal;
   struct cleanup *old_chain;
 
-  if (current_trace_status ()->running
-      && current_trace_status ()->filename == NULL)
-    error (_("May not look at trace frames while trace is running."));
+  check_trace_running (current_trace_status ());
 
   if (args == 0 || *args == 0)
     {
       sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
       sals.nelts = 1;
-      sals.sals = (struct symtab_and_line *)
-       xmalloc (sizeof (struct symtab_and_line));
+      sals.sals = XNEW (struct symtab_and_line);
       sals.sals[0] = sal;
     }
   else
@@ -2642,9 +2551,7 @@ trace_find_range_command (char *args, int from_tty)
   static CORE_ADDR start, stop;
   char *tmp;
 
-  if (current_trace_status ()->running
-      && current_trace_status ()->filename == NULL)
-    error (_("May not look at trace frames while trace is running."));
+  check_trace_running (current_trace_status ());
 
   if (args == 0 || *args == 0)
     { /* XXX FIXME: what should default behavior be?  */
@@ -2707,22 +2614,30 @@ scope_info (char *args, int from_tty)
 {
   struct symtabs_and_lines sals;
   struct symbol *sym;
-  struct minimal_symbol *msym;
-  struct block *block;
+  struct bound_minimal_symbol msym;
+  const struct block *block;
   const char *symname;
   char *save_args = args;
   struct block_iterator iter;
   int j, count = 0;
   struct gdbarch *gdbarch;
   int regno;
+  struct event_location *location;
+  struct cleanup *back_to;
 
   if (args == 0 || *args == 0)
     error (_("requires an argument (function, "
             "line or *addr) to define a scope"));
 
-  sals = decode_line_1 (&args, DECODE_LINE_FUNFIRSTLINE, NULL, 0);
+  location = string_to_event_location (&args, current_language);
+  back_to = make_cleanup_delete_event_location (location);
+  sals = decode_line_1 (location, DECODE_LINE_FUNFIRSTLINE, NULL, NULL, 0);
   if (sals.nelts == 0)
-    return;            /* Presumably decode_line_1 has already warned.  */
+    {
+      /* Presumably decode_line_1 has already warned.  */
+      do_cleanups (back_to);
+      return;
+    }
 
   /* Resolve line numbers to PC.  */
   resolve_sal_pc (&sals.sals[0]);
@@ -2742,7 +2657,7 @@ scope_info (char *args, int from_tty)
          if (symname == NULL || *symname == '\0')
            continue;           /* Probably botched, certainly useless.  */
 
-         gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile);
+         gdbarch = symbol_arch (sym);
 
          printf_filtered ("Symbol %s is ", symname);
 
@@ -2830,14 +2745,14 @@ scope_info (char *args, int from_tty)
                case LOC_UNRESOLVED:
                  msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
                                                NULL, NULL);
-                 if (msym == NULL)
+                 if (msym.minsym == NULL)
                    printf_filtered ("Unresolved Static");
                  else
                    {
                      printf_filtered ("static storage at address ");
                      printf_filtered ("%s",
                                       paddress (gdbarch,
-                                                SYMBOL_VALUE_ADDRESS (msym)));
+                                                BMSYMBOL_VALUE_ADDRESS (msym)));
                    }
                  break;
                case LOC_OPTIMIZED_OUT:
@@ -2859,6 +2774,7 @@ scope_info (char *args, int from_tty)
   if (count <= 0)
     printf_filtered ("Scope for %s contains no locals or arguments.\n",
                     save_args);
+  do_cleanups (back_to);
 }
 
 /* Helper for trace_dump_command.  Dump the action list starting at
@@ -2941,7 +2857,7 @@ trace_dump_actions (struct command_line *action,
                        {
                          size_t len = next_comma - action_exp;
 
-                         cmd = xrealloc (cmd, len + 1);
+                         cmd = (char *) xrealloc (cmd, len + 1);
                          memcpy (cmd, action_exp, len);
                          cmd[len] = 0;
                        }
@@ -2949,7 +2865,7 @@ trace_dump_actions (struct command_line *action,
                        {
                          size_t len = strlen (action_exp);
 
-                         cmd = xrealloc (cmd, len + 1);
+                         cmd = (char *) xrealloc (cmd, len + 1);
                          memcpy (cmd, action_exp, len + 1);
                        }
 
@@ -3034,7 +2950,7 @@ all_tracepoint_actions_and_cleanup (struct breakpoint *t)
       make_cleanup (xfree, default_collect_line);
 
       validate_actionline (default_collect_line, t);
-      default_collect_action = xmalloc (sizeof (struct command_line));
+      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;
@@ -3060,11 +2976,9 @@ trace_dump_command (char *args, int from_tty)
   printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
                   tracepoint_number, traceframe_number);
 
-  old_chain = make_cleanup (null_cleanup, NULL);
-
   /* This command only makes sense for the current frame, not the
      selected frame.  */
-  make_cleanup_restore_current_thread ();
+  old_chain = make_cleanup_restore_current_thread ();
   select_frame (get_current_frame ());
 
   actions = all_tracepoint_actions_and_cleanup (loc->owner);
@@ -3081,7 +2995,7 @@ trace_dump_command (char *args, int from_tty)
 
 extern int
 encode_source_string (int tpnum, ULONGEST addr,
-                     char *srctype, char *src, char *buf, int buf_size)
+                     char *srctype, const char *src, char *buf, int buf_size)
 {
   if (80 + strlen (srctype) > buf_size)
     error (_("Buffer too small for source encoding"));
@@ -3219,15 +3133,6 @@ set_current_traceframe (int num)
   clear_traceframe_info ();
 }
 
-/* Make the traceframe NUM be the current trace frame, and do nothing
-   more.  */
-
-void
-set_traceframe_number (int num)
-{
-  traceframe_number = num;
-}
-
 /* A cleanup used when switching away and back from tfind mode.  */
 
 struct current_traceframe_cleanup
@@ -3239,7 +3144,8 @@ struct current_traceframe_cleanup
 static void
 do_restore_current_traceframe_cleanup (void *arg)
 {
-  struct current_traceframe_cleanup *old = arg;
+  struct current_traceframe_cleanup *old
+    = (struct current_traceframe_cleanup *) arg;
 
   set_current_traceframe (old->traceframe_number);
 }
@@ -3247,7 +3153,8 @@ do_restore_current_traceframe_cleanup (void *arg)
 static void
 restore_current_traceframe_cleanup_dtor (void *arg)
 {
-  struct current_traceframe_cleanup *old = arg;
+  struct current_traceframe_cleanup *old
+    = (struct current_traceframe_cleanup *) arg;
 
   xfree (old);
 }
@@ -3255,21 +3162,15 @@ restore_current_traceframe_cleanup_dtor (void *arg)
 struct cleanup *
 make_cleanup_restore_current_traceframe (void)
 {
-  struct current_traceframe_cleanup *old;
+  struct current_traceframe_cleanup *old =
+    XNEW (struct current_traceframe_cleanup);
 
-  old = xmalloc (sizeof (struct current_traceframe_cleanup));
   old->traceframe_number = traceframe_number;
 
   return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
                            restore_current_traceframe_cleanup_dtor);
 }
 
-struct cleanup *
-make_cleanup_restore_traceframe_number (void)
-{
-  return make_cleanup_restore_integer (&traceframe_number);
-}
-
 /* Given a number and address, return an uploaded tracepoint with that
    number, creating if necessary.  */
 
@@ -3281,8 +3182,8 @@ get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
   for (utp = *utpp; utp; utp = utp->next)
     if (utp->number == num && utp->addr == addr)
       return utp;
-  utp = (struct uploaded_tp *) xmalloc (sizeof (struct uploaded_tp));
-  memset (utp, 0, sizeof (struct uploaded_tp));
+
+  utp = XCNEW (struct uploaded_tp);
   utp->number = num;
   utp->addr = addr;
   utp->actions = NULL;
@@ -3290,6 +3191,7 @@ get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
   utp->cmd_strings = NULL;
   utp->next = *utpp;
   *utpp = utp;
+
   return utp;
 }
 
@@ -3317,11 +3219,12 @@ get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
   for (utsv = *utsvp; utsv; utsv = utsv->next)
     if (utsv->number == num)
       return utsv;
-  utsv = (struct uploaded_tsv *) xmalloc (sizeof (struct uploaded_tsv));
-  memset (utsv, 0, sizeof (struct uploaded_tsv));
+
+  utsv = XCNEW (struct uploaded_tsv);
   utsv->number = num;
   utsv->next = *utsvp;
   *utsvp = utsv;
+
   return utsv;
 }
 
@@ -3571,201 +3474,6 @@ merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
   free_uploaded_tsvs (uploaded_tsvs);
 }
 
-/* target tfile command */
-
-static struct target_ops tfile_ops;
-
-/* Fill in tfile_ops with its defined operations and properties.  */
-
-#define TRACE_HEADER_SIZE 8
-
-static char *trace_filename;
-static int trace_fd = -1;
-static off_t trace_frames_offset;
-static off_t cur_offset;
-static int cur_data_size;
-int trace_regblock_size;
-
-static void tfile_interp_line (char *line,
-                              struct uploaded_tp **utpp,
-                              struct uploaded_tsv **utsvp);
-
-/* Read SIZE bytes into READBUF from the trace frame, starting at
-   TRACE_FD's current position.  Note that this call `read'
-   underneath, hence it advances the file's seek position.  Throws an
-   error if the `read' syscall fails, or less than SIZE bytes are
-   read.  */
-
-static void
-tfile_read (gdb_byte *readbuf, int size)
-{
-  int gotten;
-
-  gotten = read (trace_fd, readbuf, size);
-  if (gotten < 0)
-    perror_with_name (trace_filename);
-  else if (gotten < size)
-    error (_("Premature end of file while reading trace file"));
-}
-
-static void
-tfile_open (char *filename, int from_tty)
-{
-  volatile struct gdb_exception ex;
-  char *temp;
-  struct cleanup *old_chain;
-  int flags;
-  int scratch_chan;
-  char header[TRACE_HEADER_SIZE];
-  char linebuf[1000]; /* Should be max remote packet size or so.  */
-  gdb_byte byte;
-  int bytes, i;
-  struct trace_status *ts;
-  struct uploaded_tp *uploaded_tps = NULL;
-  struct uploaded_tsv *uploaded_tsvs = NULL;
-
-  target_preopen (from_tty);
-  if (!filename)
-    error (_("No trace file specified."));
-
-  filename = tilde_expand (filename);
-  if (!IS_ABSOLUTE_PATH(filename))
-    {
-      temp = concat (current_directory, "/", filename, (char *) NULL);
-      xfree (filename);
-      filename = temp;
-    }
-
-  old_chain = make_cleanup (xfree, filename);
-
-  flags = O_BINARY | O_LARGEFILE;
-  flags |= O_RDONLY;
-  scratch_chan = gdb_open_cloexec (filename, flags, 0);
-  if (scratch_chan < 0)
-    perror_with_name (filename);
-
-  /* Looks semi-reasonable.  Toss the old trace file and work on the new.  */
-
-  discard_cleanups (old_chain);        /* Don't free filename any more.  */
-  unpush_target (&tfile_ops);
-
-  trace_filename = xstrdup (filename);
-  trace_fd = scratch_chan;
-
-  bytes = 0;
-  /* Read the file header and test for validity.  */
-  tfile_read ((gdb_byte *) &header, TRACE_HEADER_SIZE);
-
-  bytes += TRACE_HEADER_SIZE;
-  if (!(header[0] == 0x7f
-       && (strncmp (header + 1, "TRACE0\n", 7) == 0)))
-    error (_("File is not a valid trace file."));
-
-  push_target (&tfile_ops);
-
-  trace_regblock_size = 0;
-  ts = current_trace_status ();
-  /* We know we're working with a file.  Record its name.  */
-  ts->filename = trace_filename;
-  /* Set defaults in case there is no status line.  */
-  ts->running_known = 0;
-  ts->stop_reason = trace_stop_reason_unknown;
-  ts->traceframe_count = -1;
-  ts->buffer_free = 0;
-  ts->disconnected_tracing = 0;
-  ts->circular_buffer = 0;
-
-  TRY_CATCH (ex, RETURN_MASK_ALL)
-    {
-      /* Read through a section of newline-terminated lines that
-        define things like tracepoints.  */
-      i = 0;
-      while (1)
-       {
-         tfile_read (&byte, 1);
-
-         ++bytes;
-         if (byte == '\n')
-           {
-             /* Empty line marks end of the definition section.  */
-             if (i == 0)
-               break;
-             linebuf[i] = '\0';
-             i = 0;
-             tfile_interp_line (linebuf, &uploaded_tps, &uploaded_tsvs);
-           }
-         else
-           linebuf[i++] = byte;
-         if (i >= 1000)
-           error (_("Excessively long lines in trace file"));
-       }
-
-      /* Record the starting offset of the binary trace data.  */
-      trace_frames_offset = bytes;
-
-      /* If we don't have a blocksize, we can't interpret the
-        traceframes.  */
-      if (trace_regblock_size == 0)
-       error (_("No register block size recorded in trace file"));
-    }
-  if (ex.reason < 0)
-    {
-      /* Remove the partially set up target.  */
-      unpush_target (&tfile_ops);
-      throw_exception (ex);
-    }
-
-  inferior_appeared (current_inferior (), TFILE_PID);
-  inferior_ptid = pid_to_ptid (TFILE_PID);
-  add_thread_silent (inferior_ptid);
-
-  if (ts->traceframe_count <= 0)
-    warning (_("No traceframes present in this file."));
-
-  /* Add the file's tracepoints and variables into the current mix.  */
-
-  /* Get trace state variables first, they may be checked when parsing
-     uploaded commands.  */
-  merge_uploaded_trace_state_variables (&uploaded_tsvs);
-
-  merge_uploaded_tracepoints (&uploaded_tps);
-
-  post_create_inferior (&tfile_ops, from_tty);
-}
-
-/* Interpret the given line from the definitions part of the trace
-   file.  */
-
-static void
-tfile_interp_line (char *line, struct uploaded_tp **utpp,
-                  struct uploaded_tsv **utsvp)
-{
-  char *p = line;
-
-  if (strncmp (p, "R ", strlen ("R ")) == 0)
-    {
-      p += strlen ("R ");
-      trace_regblock_size = strtol (p, &p, 16);
-    }
-  else if (strncmp (p, "status ", strlen ("status ")) == 0)
-    {
-      p += strlen ("status ");
-      parse_trace_status (p, current_trace_status ());
-    }
-  else if (strncmp (p, "tp ", strlen ("tp ")) == 0)
-    {
-      p += strlen ("tp ");
-      parse_tracepoint_definition (p, utpp);
-    }
-  else if (strncmp (p, "tsv ", strlen ("tsv ")) == 0)
-    {
-      p += strlen ("tsv ");
-      parse_tsv_definition (p, utsvp);
-    }
-  else
-    warning (_("Ignoring trace file definition \"%s\""), line);
-}
-
 /* Parse the part of trace status syntax that is shared between
    the remote protocol and the trace file reader.  */
 
@@ -3829,7 +3537,7 @@ Status line: '%s'\n"), p, line);
            }
          else if (p2 != p1)
            {
-             ts->stop_desc = xmalloc (strlen (line));
+             ts->stop_desc = (char *) xmalloc (strlen (line));
              end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
              ts->stop_desc[end] = '\0';
            }
@@ -3849,7 +3557,7 @@ Status line: '%s'\n"), p, line);
          p2 = strchr (++p1, ':');
          if (p2 != p1)
            {
-             ts->stop_desc = xmalloc ((p2 - p1) / 2 + 1);
+             ts->stop_desc = (char *) xmalloc ((p2 - p1) / 2 + 1);
              end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
              ts->stop_desc[end] = '\0';
            }
@@ -3903,7 +3611,7 @@ Status line: '%s'\n"), p, line);
       else if (strncmp (p, "username", p1 - p) == 0)
        {
          ++p1;
-         ts->user_name = xmalloc (strlen (p) / 2);
+         ts->user_name = (char *) xmalloc (strlen (p) / 2);
          end = hex2bin (p1, (gdb_byte *) ts->user_name, (p3 - p1)  / 2);
          ts->user_name[end] = '\0';
          p = p3;
@@ -3911,7 +3619,7 @@ Status line: '%s'\n"), p, line);
       else if (strncmp (p, "notes", p1 - p) == 0)
        {
          ++p1;
-         ts->notes = xmalloc (strlen (p) / 2);
+         ts->notes = (char *) xmalloc (strlen (p) / 2);
          end = hex2bin (p1, (gdb_byte *) ts->notes, (p3 - p1) / 2);
          ts->notes[end] = '\0';
          p = p3;
@@ -4038,16 +3746,16 @@ parse_tracepoint_definition (char *line, struct uploaded_tp **utpp)
       p = unpack_varlen_hex (p, &xlen);
       p++;  /* skip a colon */
 
-      buf = alloca (strlen (line));
+      buf = (char *) alloca (strlen (line));
 
       end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
       buf[end] = '\0';
 
-      if (strncmp (srctype, "at:", strlen ("at:")) == 0)
+      if (startswith (srctype, "at:"))
        utp->at_string = xstrdup (buf);
-      else if (strncmp (srctype, "cond:", strlen ("cond:")) == 0)
+      else if (startswith (srctype, "cond:"))
        utp->cond_string = xstrdup (buf);
-      else if (strncmp (srctype, "cmd:", strlen ("cmd:")) == 0)
+      else if (startswith (srctype, "cmd:"))
        VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
     }
   else if (piece == 'V')
@@ -4075,7 +3783,7 @@ parse_tsv_definition (char *line, struct uploaded_tsv **utsvp)
   int end;
   struct uploaded_tsv *utsv = NULL;
 
-  buf = alloca (strlen (line));
+  buf = (char *) alloca (strlen (line));
 
   p = line;
   p = unpack_varlen_hex (p, &num);
@@ -4093,620 +3801,11 @@ parse_tsv_definition (char *line, struct uploaded_tsv **utsvp)
   utsv->name = xstrdup (buf);
 }
 
-/* Close the trace file and generally clean up.  */
-
-static void
-tfile_close (struct target_ops *self)
-{
-  int pid;
-
-  if (trace_fd < 0)
-    return;
-
-  pid = ptid_get_pid (inferior_ptid);
-  inferior_ptid = null_ptid;   /* Avoid confusion from thread stuff.  */
-  exit_inferior_silent (pid);
-
-  close (trace_fd);
-  trace_fd = -1;
-  xfree (trace_filename);
-  trace_filename = NULL;
-
-  trace_reset_local_state ();
-}
-
-static void
-tfile_files_info (struct target_ops *t)
-{
-  printf_filtered ("\t`%s'\n", trace_filename);
-}
-
-/* The trace status for a file is that tracing can never be run.  */
-
-static int
-tfile_get_trace_status (struct target_ops *self, struct trace_status *ts)
-{
-  /* Other bits of trace status were collected as part of opening the
-     trace files, so nothing to do here.  */
-
-  return -1;
-}
-
-static void
-tfile_get_tracepoint_status (struct target_ops *self,
-                            struct breakpoint *tp, struct uploaded_tp *utp)
-{
-  /* Other bits of trace status were collected as part of opening the
-     trace files, so nothing to do here.  */
-}
-
-/* Given the position of a traceframe in the file, figure out what
-   address the frame was collected at.  This would normally be the
-   value of a collected PC register, but if not available, we
-   improvise.  */
-
-static CORE_ADDR
-tfile_get_traceframe_address (off_t tframe_offset)
-{
-  CORE_ADDR addr = 0;
-  short tpnum;
-  struct tracepoint *tp;
-  off_t saved_offset = cur_offset;
-
-  /* FIXME dig pc out of collected registers.  */
-
-  /* Fall back to using tracepoint address.  */
-  lseek (trace_fd, tframe_offset, SEEK_SET);
-  tfile_read ((gdb_byte *) &tpnum, 2);
-  tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
-                                         gdbarch_byte_order
-                                             (target_gdbarch ()));
-
-  tp = get_tracepoint_by_number_on_target (tpnum);
-  /* FIXME this is a poor heuristic if multiple locations.  */
-  if (tp && tp->base.loc)
-    addr = tp->base.loc->address;
-
-  /* Restore our seek position.  */
-  cur_offset = saved_offset;
-  lseek (trace_fd, cur_offset, SEEK_SET);
-  return addr;
-}
-
-/* Given a type of search and some parameters, scan the collection of
-   traceframes in the file looking for a match.  When found, return
-   both the traceframe and tracepoint number, otherwise -1 for
-   each.  */
-
-static int
-tfile_trace_find (struct target_ops *self, enum trace_find_type type, int num,
-                 CORE_ADDR addr1, CORE_ADDR addr2, int *tpp)
-{
-  short tpnum;
-  int tfnum = 0, found = 0;
-  unsigned int data_size;
-  struct tracepoint *tp;
-  off_t offset, tframe_offset;
-  CORE_ADDR tfaddr;
-
-  if (num == -1)
-    {
-      if (tpp)
-        *tpp = -1;
-      return -1;
-    }
-
-  lseek (trace_fd, trace_frames_offset, SEEK_SET);
-  offset = trace_frames_offset;
-  while (1)
-    {
-      tframe_offset = offset;
-      tfile_read ((gdb_byte *) &tpnum, 2);
-      tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
-                                             gdbarch_byte_order
-                                                 (target_gdbarch ()));
-      offset += 2;
-      if (tpnum == 0)
-       break;
-      tfile_read ((gdb_byte *) &data_size, 4);
-      data_size = (unsigned int) extract_unsigned_integer
-                                     ((gdb_byte *) &data_size, 4,
-                                     gdbarch_byte_order (target_gdbarch ()));
-      offset += 4;
-
-      if (type == tfind_number)
-       {
-         /* Looking for a specific trace frame.  */
-         if (tfnum == num)
-           found = 1;
-       }
-      else
-       {
-         /* Start from the _next_ trace frame.  */
-         if (tfnum > traceframe_number)
-           {
-             switch (type)
-               {
-               case tfind_pc:
-                 tfaddr = tfile_get_traceframe_address (tframe_offset);
-                 if (tfaddr == addr1)
-                   found = 1;
-                 break;
-               case tfind_tp:
-                 tp = get_tracepoint (num);
-                 if (tp && tpnum == tp->number_on_target)
-                   found = 1;
-                 break;
-               case tfind_range:
-                 tfaddr = tfile_get_traceframe_address (tframe_offset);
-                 if (addr1 <= tfaddr && tfaddr <= addr2)
-                   found = 1;
-                 break;
-               case tfind_outside:
-                 tfaddr = tfile_get_traceframe_address (tframe_offset);
-                 if (!(addr1 <= tfaddr && tfaddr <= addr2))
-                   found = 1;
-                 break;
-               default:
-                 internal_error (__FILE__, __LINE__, _("unknown tfind type"));
-               }
-           }
-       }
-
-      if (found)
-       {
-         if (tpp)
-           *tpp = tpnum;
-         cur_offset = offset;
-         cur_data_size = data_size;
-
-         return tfnum;
-       }
-      /* Skip past the traceframe's data.  */
-      lseek (trace_fd, data_size, SEEK_CUR);
-      offset += data_size;
-      /* Update our own count of traceframes.  */
-      ++tfnum;
-    }
-  /* Did not find what we were looking for.  */
-  if (tpp)
-    *tpp = -1;
-  return -1;
-}
-
-/* Prototype of the callback passed to tframe_walk_blocks.  */
-typedef int (*walk_blocks_callback_func) (char blocktype, void *data);
-
-/* Callback for traceframe_walk_blocks, used to find a given block
-   type in a traceframe.  */
-
-static int
-match_blocktype (char blocktype, void *data)
-{
-  char *wantedp = data;
-
-  if (*wantedp == blocktype)
-    return 1;
-
-  return 0;
-}
-
-/* Walk over all traceframe block starting at POS offset from
-   CUR_OFFSET, and call CALLBACK for each block found, passing in DATA
-   unmodified.  If CALLBACK returns true, this returns the position in
-   the traceframe where the block is found, relative to the start of
-   the traceframe (cur_offset).  Returns -1 if no callback call
-   returned true, indicating that all blocks have been walked.  */
-
-static int
-traceframe_walk_blocks (walk_blocks_callback_func callback,
-                       int pos, void *data)
-{
-  /* Iterate through a traceframe's blocks, looking for a block of the
-     requested type.  */
-
-  lseek (trace_fd, cur_offset + pos, SEEK_SET);
-  while (pos < cur_data_size)
-    {
-      unsigned short mlen;
-      char block_type;
-
-      tfile_read ((gdb_byte *) &block_type, 1);
-
-      ++pos;
-
-      if ((*callback) (block_type, data))
-       return pos;
-
-      switch (block_type)
-       {
-       case 'R':
-         lseek (trace_fd, cur_offset + pos + trace_regblock_size, SEEK_SET);
-         pos += trace_regblock_size;
-         break;
-       case 'M':
-         lseek (trace_fd, cur_offset + pos + 8, SEEK_SET);
-         tfile_read ((gdb_byte *) &mlen, 2);
-          mlen = (unsigned short)
-                extract_unsigned_integer ((gdb_byte *) &mlen, 2,
-                                          gdbarch_byte_order
-                                              (target_gdbarch ()));
-         lseek (trace_fd, mlen, SEEK_CUR);
-         pos += (8 + 2 + mlen);
-         break;
-       case 'V':
-         lseek (trace_fd, cur_offset + pos + 4 + 8, SEEK_SET);
-         pos += (4 + 8);
-         break;
-       default:
-         error (_("Unknown block type '%c' (0x%x) in trace frame"),
-                block_type, block_type);
-         break;
-       }
-    }
-
-  return -1;
-}
-
-/* Convenience wrapper around traceframe_walk_blocks.  Looks for the
-   position offset of a block of type TYPE_WANTED in the current trace
-   frame, starting at POS.  Returns -1 if no such block was found.  */
-
-static int
-traceframe_find_block_type (char type_wanted, int pos)
-{
-  return traceframe_walk_blocks (match_blocktype, pos, &type_wanted);
-}
-
-/* Look for a block of saved registers in the traceframe, and get the
-   requested register from it.  */
-
-static void
-tfile_fetch_registers (struct target_ops *ops,
-                      struct regcache *regcache, int regno)
-{
-  struct gdbarch *gdbarch = get_regcache_arch (regcache);
-  int offset, regn, regsize, pc_regno;
-  gdb_byte *regs;
-
-  /* An uninitialized reg size says we're not going to be
-     successful at getting register blocks.  */
-  if (!trace_regblock_size)
-    return;
-
-  regs = alloca (trace_regblock_size);
-
-  if (traceframe_find_block_type ('R', 0) >= 0)
-    {
-      tfile_read (regs, trace_regblock_size);
-
-      /* Assume the block is laid out in GDB register number order,
-        each register with the size that it has in GDB.  */
-      offset = 0;
-      for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
-       {
-         regsize = register_size (gdbarch, regn);
-         /* Make sure we stay within block bounds.  */
-         if (offset + regsize >= trace_regblock_size)
-           break;
-         if (regcache_register_status (regcache, regn) == REG_UNKNOWN)
-           {
-             if (regno == regn)
-               {
-                 regcache_raw_supply (regcache, regno, regs + offset);
-                 break;
-               }
-             else if (regno == -1)
-               {
-                 regcache_raw_supply (regcache, regn, regs + offset);
-               }
-           }
-         offset += regsize;
-       }
-      return;
-    }
-
-  /* We get here if no register data has been found.  Mark registers
-     as unavailable.  */
-  for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
-    regcache_raw_supply (regcache, regn, NULL);
-
-  /* We can often usefully guess that the PC is going to be the same
-     as the address of the tracepoint.  */
-  pc_regno = gdbarch_pc_regnum (gdbarch);
-
-  /* XXX This guessing code below only works if the PC register isn't
-     a pseudo-register.  The value of a pseudo-register isn't stored
-     in the (non-readonly) regcache -- instead it's recomputed
-     (probably from some other cached raw register) whenever the
-     register is read.  This guesswork should probably move to some
-     higher layer.  */
-  if (pc_regno < 0 || pc_regno >= gdbarch_num_regs (gdbarch))
-    return;
-
-  if (regno == -1 || regno == pc_regno)
-    {
-      struct tracepoint *tp = get_tracepoint (tracepoint_number);
-
-      if (tp && tp->base.loc)
-       {
-         /* But don't try to guess if tracepoint is multi-location...  */
-         if (tp->base.loc->next)
-           {
-             warning (_("Tracepoint %d has multiple "
-                        "locations, cannot infer $pc"),
-                      tp->base.number);
-             return;
-           }
-         /* ... or does while-stepping.  */
-         if (tp->step_count > 0)
-           {
-             warning (_("Tracepoint %d does while-stepping, "
-                        "cannot infer $pc"),
-                      tp->base.number);
-             return;
-           }
-
-         store_unsigned_integer (regs, register_size (gdbarch, pc_regno),
-                                 gdbarch_byte_order (gdbarch),
-                                 tp->base.loc->address);
-         regcache_raw_supply (regcache, pc_regno, regs);
-       }
-    }
-}
-
-static enum target_xfer_status
-tfile_xfer_partial (struct target_ops *ops, enum target_object object,
-                   const char *annex, gdb_byte *readbuf,
-                   const gdb_byte *writebuf, ULONGEST offset, ULONGEST len,
-                   ULONGEST *xfered_len)
-{
-  /* We're only doing regular memory for now.  */
-  if (object != TARGET_OBJECT_MEMORY)
-    return TARGET_XFER_E_IO;
-
-  if (readbuf == NULL)
-    error (_("tfile_xfer_partial: trace file is read-only"));
-
- if (traceframe_number != -1)
-    {
-      int pos = 0;
-
-      /* Iterate through the traceframe's blocks, looking for
-        memory.  */
-      while ((pos = traceframe_find_block_type ('M', pos)) >= 0)
-       {
-         ULONGEST maddr, amt;
-         unsigned short mlen;
-         enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
-
-         tfile_read ((gdb_byte *) &maddr, 8);
-         maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
-                                           byte_order);
-         tfile_read ((gdb_byte *) &mlen, 2);
-         mlen = (unsigned short)
-           extract_unsigned_integer ((gdb_byte *) &mlen, 2, byte_order);
-
-         /* If the block includes the first part of the desired
-            range, return as much it has; GDB will re-request the
-            remainder, which might be in a different block of this
-            trace frame.  */
-         if (maddr <= offset && offset < (maddr + mlen))
-           {
-             amt = (maddr + mlen) - offset;
-             if (amt > len)
-               amt = len;
-
-             if (maddr != offset)
-               lseek (trace_fd, offset - maddr, SEEK_CUR);
-             tfile_read (readbuf, amt);
-             *xfered_len = amt;
-             return TARGET_XFER_OK;
-           }
-
-         /* Skip over this block.  */
-         pos += (8 + 2 + mlen);
-       }
-    }
-
-  /* It's unduly pedantic to refuse to look at the executable for
-     read-only pieces; so do the equivalent of readonly regions aka
-     QTro packet.  */
-  /* FIXME account for relocation at some point.  */
-  if (exec_bfd)
-    {
-      asection *s;
-      bfd_size_type size;
-      bfd_vma vma;
-
-      for (s = exec_bfd->sections; s; s = s->next)
-       {
-         if ((s->flags & SEC_LOAD) == 0
-             || (s->flags & SEC_READONLY) == 0)
-           continue;
-
-         vma = s->vma;
-         size = bfd_get_section_size (s);
-         if (vma <= offset && offset < (vma + size))
-           {
-             ULONGEST amt;
-
-             amt = (vma + size) - offset;
-             if (amt > len)
-               amt = len;
-
-             *xfered_len = bfd_get_section_contents (exec_bfd, s,
-                                                     readbuf, offset - vma, amt);
-             return TARGET_XFER_OK;
-           }
-       }
-    }
-
-  /* Indicate failure to find the requested memory block.  */
-  return TARGET_XFER_E_IO;
-}
-
-/* Iterate through the blocks of a trace frame, looking for a 'V'
-   block with a matching tsv number.  */
-
-static int
-tfile_get_trace_state_variable_value (struct target_ops *self,
-                                     int tsvnum, LONGEST *val)
-{
-  int pos;
-  int found = 0;
-
-  /* Iterate over blocks in current frame and find the last 'V'
-     block in which tsv number is TSVNUM.  In one trace frame, there
-     may be multiple 'V' blocks created for a given trace variable,
-     and the last matched 'V' block contains the updated value.  */
-  pos = 0;
-  while ((pos = traceframe_find_block_type ('V', pos)) >= 0)
-    {
-      int vnum;
-
-      tfile_read ((gdb_byte *) &vnum, 4);
-      vnum = (int) extract_signed_integer ((gdb_byte *) &vnum, 4,
-                                          gdbarch_byte_order
-                                          (target_gdbarch ()));
-      if (tsvnum == vnum)
-       {
-         tfile_read ((gdb_byte *) val, 8);
-         *val = extract_signed_integer ((gdb_byte *) val, 8,
-                                        gdbarch_byte_order
-                                        (target_gdbarch ()));
-         found = 1;
-       }
-      pos += (4 + 8);
-    }
-
-  return found;
-}
-
-static int
-tfile_has_all_memory (struct target_ops *ops)
-{
-  return 1;
-}
-
-static int
-tfile_has_memory (struct target_ops *ops)
-{
-  return 1;
-}
-
-static int
-tfile_has_stack (struct target_ops *ops)
-{
-  return traceframe_number != -1;
-}
-
-static int
-tfile_has_registers (struct target_ops *ops)
-{
-  return traceframe_number != -1;
-}
-
-static int
-tfile_thread_alive (struct target_ops *ops, ptid_t ptid)
-{
-  return 1;
-}
-
-/* Callback for traceframe_walk_blocks.  Builds a traceframe_info
-   object for the tfile target's current traceframe.  */
-
-static int
-build_traceframe_info (char blocktype, void *data)
-{
-  struct traceframe_info *info = data;
-
-  switch (blocktype)
-    {
-    case 'M':
-      {
-       struct mem_range *r;
-       ULONGEST maddr;
-       unsigned short mlen;
-
-       tfile_read ((gdb_byte *) &maddr, 8);
-       maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
-                                         gdbarch_byte_order
-                                         (target_gdbarch ()));
-       tfile_read ((gdb_byte *) &mlen, 2);
-       mlen = (unsigned short)
-               extract_unsigned_integer ((gdb_byte *) &mlen,
-                                         2, gdbarch_byte_order
-                                         (target_gdbarch ()));
-
-       r = VEC_safe_push (mem_range_s, info->memory, NULL);
-
-       r->start = maddr;
-       r->length = mlen;
-       break;
-      }
-    case 'V':
-      {
-       int vnum;
-
-       tfile_read ((gdb_byte *) &vnum, 4);
-       VEC_safe_push (int, info->tvars, vnum);
-      }
-    case 'R':
-    case 'S':
-      {
-       break;
-      }
-    default:
-      warning (_("Unhandled trace block type (%d) '%c ' "
-                "while building trace frame info."),
-              blocktype, blocktype);
-      break;
-    }
-
-  return 0;
-}
-
-static struct traceframe_info *
-tfile_traceframe_info (struct target_ops *self)
-{
-  struct traceframe_info *info = XCNEW (struct traceframe_info);
-
-  traceframe_walk_blocks (build_traceframe_info, 0, info);
-  return info;
-}
-
-static void
-init_tfile_ops (void)
-{
-  tfile_ops.to_shortname = "tfile";
-  tfile_ops.to_longname = "Local trace dump file";
-  tfile_ops.to_doc
-    = "Use a trace file as a target.  Specify the filename of the trace file.";
-  tfile_ops.to_open = tfile_open;
-  tfile_ops.to_close = tfile_close;
-  tfile_ops.to_fetch_registers = tfile_fetch_registers;
-  tfile_ops.to_xfer_partial = tfile_xfer_partial;
-  tfile_ops.to_files_info = tfile_files_info;
-  tfile_ops.to_get_trace_status = tfile_get_trace_status;
-  tfile_ops.to_get_tracepoint_status = tfile_get_tracepoint_status;
-  tfile_ops.to_trace_find = tfile_trace_find;
-  tfile_ops.to_get_trace_state_variable_value
-    = tfile_get_trace_state_variable_value;
-  tfile_ops.to_stratum = process_stratum;
-  tfile_ops.to_has_all_memory = tfile_has_all_memory;
-  tfile_ops.to_has_memory = tfile_has_memory;
-  tfile_ops.to_has_stack = tfile_has_stack;
-  tfile_ops.to_has_registers = tfile_has_registers;
-  tfile_ops.to_traceframe_info = tfile_traceframe_info;
-  tfile_ops.to_thread_alive = tfile_thread_alive;
-  tfile_ops.to_magic = OPS_MAGIC;
-}
-
 void
 free_current_marker (void *arg)
 {
-  struct static_tracepoint_marker **marker_p = arg;
+  struct static_tracepoint_marker **marker_p
+    = (struct static_tracepoint_marker **) arg;
 
   if (*marker_p != NULL)
     {
@@ -4741,14 +3840,14 @@ parse_static_tracepoint_marker_definition (char *line, char **pp,
   if (endp == NULL)
     error (_("bad marker definition: %s"), line);
 
-  marker->str_id = xmalloc (endp - p + 1);
+  marker->str_id = (char *) xmalloc (endp - p + 1);
   end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
   marker->str_id[end] = '\0';
 
   p += 2 * end;
   p++;  /* skip a colon */
 
-  marker->extra = xmalloc (strlen (p) + 1);
+  marker->extra = (char *) xmalloc (strlen (p) + 1);
   end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
   marker->extra[end] = '\0';
 
@@ -4773,7 +3872,6 @@ static void
 print_one_static_tracepoint_marker (int count,
                                    struct static_tracepoint_marker *marker)
 {
-  struct command_line *l;
   struct symbol *sym;
 
   char wrap_indent[80];
@@ -4999,12 +4097,14 @@ traceframe_info_start_memory (struct gdb_xml_parser *parser,
                              const struct gdb_xml_element *element,
                              void *user_data, VEC(gdb_xml_value_s) *attributes)
 {
-  struct traceframe_info *info = user_data;
+  struct traceframe_info *info = (struct traceframe_info *) user_data;
   struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
   ULONGEST *start_p, *length_p;
 
-  start_p = xml_find_attribute (attributes, "start")->value;
-  length_p = xml_find_attribute (attributes, "length")->value;
+  start_p
+    = (ULONGEST *) xml_find_attribute (attributes, "start")->value;
+  length_p
+    = (ULONGEST *) xml_find_attribute (attributes, "length")->value;
 
   r->start = *start_p;
   r->length = *length_p;
@@ -5018,8 +4118,9 @@ traceframe_info_start_tvar (struct gdb_xml_parser *parser,
                             void *user_data,
                             VEC(gdb_xml_value_s) *attributes)
 {
-  struct traceframe_info *info = user_data;
-  const char *id_attrib = xml_find_attribute (attributes, "id")->value;
+  struct traceframe_info *info = (struct traceframe_info *) user_data;
+  const char *id_attrib
+    = (const char *) xml_find_attribute (attributes, "id")->value;
   int id = gdb_xml_parse_ulongest (parser, id_attrib);
 
   VEC_safe_push (int, info->tvars, id);
@@ -5030,7 +4131,7 @@ traceframe_info_start_tvar (struct gdb_xml_parser *parser,
 static void
 free_result (void *p)
 {
-  struct traceframe_info *result = p;
+  struct traceframe_info *result = (struct traceframe_info *) p;
 
   free_traceframe_info (result);
 }
@@ -5137,8 +4238,8 @@ traceframe_available_memory (VEC(mem_range_s) **result,
 
            nr = VEC_safe_push (mem_range_s, *result, NULL);
 
-           nr->start = max (lo1, lo2);
-           nr->length = min (hi1, hi2) - nr->start;
+           nr->start = std::max (lo1, lo2);
+           nr->length = std::min (hi1, hi2) - nr->start;
          }
 
       normalize_mem_ranges (*result);
@@ -5364,8 +4465,4 @@ 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);
-
-  init_tfile_ops ();
-
-  add_target_with_completer (&tfile_ops, filename_completer);
 }
This page took 0.05149 seconds and 4 git commands to generate.