Make copy_token_string return unique_xmalloc_ptr
[deliverable/binutils-gdb.git] / gdb / tracefile-tfile.c
index 255bbc9ef96466abf75a5d3f4e506198bd0956ef..d7e934770a496124c445419ec96b750e0b906362 100644 (file)
@@ -1,6 +1,6 @@
 /* Trace file TFILE format support in GDB.
 
-   Copyright (C) 1997-2017 Free Software Foundation, Inc.
+   Copyright (C) 1997-2018 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -89,7 +89,7 @@ tfile_start (struct trace_file_writer *self, const char *filename)
     = (struct tfile_trace_file_writer *) self;
 
   writer->pathname = tilde_expand (filename);
-  writer->fp = gdb_fopen_cloexec (writer->pathname, "wb");
+  writer->fp = gdb_fopen_cloexec (writer->pathname, "wb").release ();
   if (writer->fp == NULL)
     error (_("Unable to open file '%s' for saving trace data (%s)"),
           writer->pathname, safe_strerror (errno));
@@ -221,8 +221,6 @@ tfile_write_uploaded_tp (struct trace_file_writer *self,
 {
   struct tfile_trace_file_writer *writer
     = (struct tfile_trace_file_writer *) self;
-  int a;
-  char *act;
   char buf[MAX_TRACE_UPLOAD];
 
   fprintf (writer->fp, "tp T%x:%s:%c:%x:%x",
@@ -235,10 +233,10 @@ tfile_write_uploaded_tp (struct trace_file_writer *self,
             ":X%x,%s", (unsigned int) strlen (utp->cond) / 2,
             utp->cond);
   fprintf (writer->fp, "\n");
-  for (a = 0; VEC_iterate (char_ptr, utp->actions, a, act); ++a)
+  for (char *act : utp->actions)
     fprintf (writer->fp, "tp A%x:%s:%s\n",
             utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
-  for (a = 0; VEC_iterate (char_ptr, utp->step_actions, a, act); ++a)
+  for (char *act : utp->step_actions)
     fprintf (writer->fp, "tp S%x:%s:%s\n",
             utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
   if (utp->at_string)
@@ -254,7 +252,7 @@ tfile_write_uploaded_tp (struct trace_file_writer *self,
                            buf, MAX_TRACE_UPLOAD);
       fprintf (writer->fp, "tp Z%s\n", buf);
     }
-  for (a = 0; VEC_iterate (char_ptr, utp->cmd_strings, a, act); ++a)
+  for (char *act : utp->cmd_strings)
     {
       encode_source_string (utp->number, utp->addr, "cmd", act,
                            buf, MAX_TRACE_UPLOAD);
@@ -422,8 +420,6 @@ tfile_read (gdb_byte *readbuf, int size)
 static void
 tfile_open (const char *arg, int from_tty)
 {
-  char *temp;
-  struct cleanup *old_chain;
   int flags;
   int scratch_chan;
   char header[TRACE_HEADER_SIZE];
@@ -433,34 +429,27 @@ tfile_open (const char *arg, int from_tty)
   struct trace_status *ts;
   struct uploaded_tp *uploaded_tps = NULL;
   struct uploaded_tsv *uploaded_tsvs = NULL;
-  char *filename;
 
   target_preopen (from_tty);
   if (!arg)
     error (_("No trace file specified."));
 
-  filename = tilde_expand (arg);
-  if (!IS_ABSOLUTE_PATH(filename))
-    {
-      temp = concat (current_directory, "/", filename, (char *) NULL);
-      xfree (filename);
-      filename = temp;
-    }
-
-  old_chain = make_cleanup (xfree, filename);
+  gdb::unique_xmalloc_ptr<char> filename (tilde_expand (arg));
+  if (!IS_ABSOLUTE_PATH (filename.get ()))
+    filename.reset (concat (current_directory, "/", filename.get (),
+                           (char *) NULL));
 
   flags = O_BINARY | O_LARGEFILE;
   flags |= O_RDONLY;
-  scratch_chan = gdb_open_cloexec (filename, flags, 0);
+  scratch_chan = gdb_open_cloexec (filename.get (), flags, 0);
   if (scratch_chan < 0)
-    perror_with_name (filename);
+    perror_with_name (filename.get ());
 
   /* 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_filename = filename.release ();
   trace_fd = scratch_chan;
 
   /* Make sure this is clear.  */
@@ -650,8 +639,8 @@ tfile_get_traceframe_address (off_t tframe_offset)
 
   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;
+  if (tp && tp->loc)
+    addr = tp->loc->address;
 
   /* Restore our seek position.  */
   cur_offset = saved_offset;
@@ -851,7 +840,7 @@ static void
 tfile_fetch_registers (struct target_ops *ops,
                       struct regcache *regcache, int regno)
 {
-  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  struct gdbarch *gdbarch = regcache->arch ();
   int offset, regn, regsize, dummy;
 
   /* An uninitialized reg size says we're not going to be
@@ -867,7 +856,7 @@ tfile_fetch_registers (struct target_ops *ops,
 
       for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
        {
-         if (!remote_register_number_and_offset (get_regcache_arch (regcache),
+         if (!remote_register_number_and_offset (regcache->arch (),
                                                  regn, &dummy, &offset))
            continue;
 
@@ -1058,7 +1047,6 @@ build_traceframe_info (char blocktype, void *data)
     {
     case 'M':
       {
-       struct mem_range *r;
        ULONGEST maddr;
        unsigned short mlen;
 
@@ -1072,10 +1060,7 @@ build_traceframe_info (char blocktype, void *data)
                                          2, gdbarch_byte_order
                                          (target_gdbarch ()));
 
-       r = VEC_safe_push (mem_range_s, info->memory, NULL);
-
-       r->start = maddr;
-       r->length = mlen;
+       info->memory.emplace_back (maddr, mlen);
        break;
       }
     case 'V':
@@ -1083,7 +1068,7 @@ build_traceframe_info (char blocktype, void *data)
        int vnum;
 
        tfile_read ((gdb_byte *) &vnum, 4);
-       VEC_safe_push (int, info->tvars, vnum);
+       info->tvars.push_back (vnum);
       }
     case 'R':
     case 'S':
@@ -1100,12 +1085,13 @@ build_traceframe_info (char blocktype, void *data)
   return 0;
 }
 
-static struct traceframe_info *
+static traceframe_info_up
 tfile_traceframe_info (struct target_ops *self)
 {
-  struct traceframe_info *info = XCNEW (struct traceframe_info);
+  traceframe_info_up info (new traceframe_info);
+
+  traceframe_walk_blocks (build_traceframe_info, 0, info.get ());
 
-  traceframe_walk_blocks (build_traceframe_info, 0, info);
   return info;
 }
 
@@ -1140,8 +1126,6 @@ init_tfile_ops (void)
   tfile_ops.to_traceframe_info = tfile_traceframe_info;
 }
 
-extern initialize_file_ftype _initialize_tracefile_tfile;
-
 void
 _initialize_tracefile_tfile (void)
 {
This page took 0.034201 seconds and 4 git commands to generate.