* cli/cli-script.c (do_fclose_cleanup): Remove.
[deliverable/binutils-gdb.git] / gdb / tracepoint.c
index ec3c53f78eca60b962045b2359699b557bafb7e1..2d2c3bdffb45c9aa8d6e62143d09c5d79a14bd5b 100644 (file)
@@ -1,13 +1,13 @@
 /* Tracing functionality for remote targets in custom GDB protocol
 
-   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free
-   Software Foundation, Inc.
+   Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
+   2007, 2008 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -16,9 +16,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "symtab.h"
 #include "linespec.h"
 #include "regcache.h"
 #include "completer.h"
-#include "gdb-events.h"
 #include "block.h"
 #include "dictionary.h"
+#include "observer.h"
+#include "user-regs.h"
 
 #include "ax.h"
 #include "ax-gdb.h"
@@ -68,7 +67,6 @@
 extern void (*deprecated_readline_begin_hook) (char *, ...);
 extern char *(*deprecated_readline_hook) (char *);
 extern void (*deprecated_readline_end_hook) (void);
-extern void x_command (char *, int);
 extern int addressprint;       /* Print machine addresses? */
 
 /* GDB commands implemented in other modules:
@@ -150,7 +148,7 @@ static void trace_mention (struct tracepoint *);
 
 struct collection_list;
 static void add_aexpr (struct collection_list *, struct agent_expr *);
-static unsigned char *mem2hex (unsigned char *, unsigned char *, int);
+static char *mem2hex (gdb_byte *, char *, int);
 static void add_register (struct collection_list *collection,
                          unsigned int regno);
 static struct cleanup *make_cleanup_free_actions (struct tracepoint *t);
@@ -194,13 +192,15 @@ trace_error (char *buf)
 
 /* Utility: wait for reply from stub, while accepting "O" packets.  */
 static char *
-remote_get_noisy_reply (char *buf,
-                       long sizeof_buf)
+remote_get_noisy_reply (char **buf_p,
+                       long *sizeof_buf)
 {
   do                           /* Loop on reply from remote stub.  */
     {
+      char *buf;
       QUIT;                    /* allow user to bail out with ^C */
-      getpkt (buf, sizeof_buf, 0);
+      getpkt (buf_p, sizeof_buf, 0);
+      buf = *buf_p;
       if (buf[0] == 0)
        error (_("Target does not support this command."));
       else if (buf[0] == 'E')
@@ -220,7 +220,7 @@ set_tracepoint_count (int num)
 {
   tracepoint_count = num;
   set_internalvar (lookup_internalvar ("tpnum"),
-                  value_from_longest (builtin_type_int, (LONGEST) num));
+                  value_from_longest (builtin_type_int32, (LONGEST) num));
 }
 
 /* Set traceframe number to NUM.  */
@@ -229,7 +229,7 @@ set_traceframe_num (int num)
 {
   traceframe_number = num;
   set_internalvar (lookup_internalvar ("trace_frame"),
-                  value_from_longest (builtin_type_int, (LONGEST) num));
+                  value_from_longest (builtin_type_int32, (LONGEST) num));
 }
 
 /* Set tracepoint number to NUM.  */
@@ -238,8 +238,7 @@ set_tracepoint_num (int num)
 {
   tracepoint_number = num;
   set_internalvar (lookup_internalvar ("tracepoint"),
-                  value_from_longest (builtin_type_int, 
-                                      (LONGEST) num));
+                  value_from_longest (builtin_type_int32, (LONGEST) num));
 }
 
 /* Set externally visible debug variables for querying/printing
@@ -252,23 +251,19 @@ set_traceframe_context (CORE_ADDR trace_pc)
   static struct type *func_range, *file_range;
   struct value *func_val;
   struct value *file_val;
-  static struct type *charstar;
   int len;
 
-  if (charstar == (struct type *) NULL)
-    charstar = lookup_pointer_type (builtin_type_char);
-
   if (trace_pc == -1)          /* Cease debugging any trace buffers.  */
     {
       traceframe_fun = 0;
       traceframe_sal.pc = traceframe_sal.line = 0;
       traceframe_sal.symtab = NULL;
       set_internalvar (lookup_internalvar ("trace_func"),
-                      value_from_pointer (charstar, (LONGEST) 0));
+                      allocate_value (builtin_type_void));
       set_internalvar (lookup_internalvar ("trace_file"),
-                      value_from_pointer (charstar, (LONGEST) 0));
+                      allocate_value (builtin_type_void));
       set_internalvar (lookup_internalvar ("trace_line"),
-                      value_from_longest (builtin_type_int
+                      value_from_longest (builtin_type_int32,
                                           (LONGEST) - 1));
       return;
     }
@@ -280,26 +275,26 @@ set_traceframe_context (CORE_ADDR trace_pc)
   /* Save linenumber as "$trace_line", a debugger variable visible to
      users.  */
   set_internalvar (lookup_internalvar ("trace_line"),
-                  value_from_longest (builtin_type_int,
+                  value_from_longest (builtin_type_int32,
                                       (LONGEST) traceframe_sal.line));
 
   /* Save func name as "$trace_func", a debugger variable visible to
      users.  */
   if (traceframe_fun == NULL ||
-      DEPRECATED_SYMBOL_NAME (traceframe_fun) == NULL)
+      SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
     set_internalvar (lookup_internalvar ("trace_func"),
-                    value_from_pointer (charstar, (LONGEST) 0));
+                    allocate_value (builtin_type_void));
   else
     {
-      len = strlen (DEPRECATED_SYMBOL_NAME (traceframe_fun));
+      len = strlen (SYMBOL_LINKAGE_NAME (traceframe_fun));
       func_range = create_range_type (func_range,
-                                     builtin_type_int, 0, len - 1);
+                                     builtin_type_int32, 0, len - 1);
       func_string = create_array_type (func_string,
-                                      builtin_type_char, func_range);
+                                      builtin_type_true_char, func_range);
       func_val = allocate_value (func_string);
       deprecated_set_value_type (func_val, func_string);
       memcpy (value_contents_raw (func_val),
-             DEPRECATED_SYMBOL_NAME (traceframe_fun),
+             SYMBOL_LINKAGE_NAME (traceframe_fun),
              len);
       deprecated_set_value_modifiable (func_val, 0);
       set_internalvar (lookup_internalvar ("trace_func"), func_val);
@@ -310,14 +305,14 @@ set_traceframe_context (CORE_ADDR trace_pc)
   if (traceframe_sal.symtab == NULL ||
       traceframe_sal.symtab->filename == NULL)
     set_internalvar (lookup_internalvar ("trace_file"),
-                    value_from_pointer (charstar, (LONGEST) 0));
+                    allocate_value (builtin_type_void));
   else
     {
       len = strlen (traceframe_sal.symtab->filename);
       file_range = create_range_type (file_range,
-                                     builtin_type_int, 0, len - 1);
+                                     builtin_type_int32, 0, len - 1);
       file_string = create_array_type (file_string,
-                                      builtin_type_char, file_range);
+                                      builtin_type_true_char, file_range);
       file_val = allocate_value (file_string);
       deprecated_set_value_type (file_val, file_string);
       memcpy (value_contents_raw (file_val),
@@ -444,7 +439,7 @@ trace_mention (struct tracepoint *tp)
   if (addressprint || (tp->source_file == NULL))
     {
       printf_filtered (" at ");
-      deprecated_print_address_numeric (tp->address, 1, gdb_stdout);
+      printf_filtered ("%s", paddress (tp->address));
     }
   if (tp->source_file)
     printf_filtered (": file %s, line %d.",
@@ -479,7 +474,7 @@ tracepoints_info (char *tpnum_exp, int from_tty)
          printf_filtered ("Num Enb ");
          if (addressprint)
            {
-             if (TARGET_ADDR_BIT <= 32)
+             if (gdbarch_addr_bit (current_gdbarch) <= 32)
                printf_filtered ("Address    ");
              else
                printf_filtered ("Address            ");
@@ -489,7 +484,7 @@ tracepoints_info (char *tpnum_exp, int from_tty)
       strcpy (wrap_indent, "                           ");
       if (addressprint)
        {
-         if (TARGET_ADDR_BIT <= 32)
+         if (gdbarch_addr_bit (current_gdbarch) <= 32)
            strcat (wrap_indent, "           ");
          else
            strcat (wrap_indent, "                   ");
@@ -501,7 +496,7 @@ tracepoints_info (char *tpnum_exp, int from_tty)
        {
          char *tmp;
 
-         if (TARGET_ADDR_BIT <= 32)
+         if (gdbarch_addr_bit (current_gdbarch) <= 32)
            tmp = hex_string_custom (t->address & (CORE_ADDR) 0xffffffff, 
                                     8);
          else
@@ -571,11 +566,11 @@ tracepoint_operation (struct tracepoint *t, int from_tty,
     {
     case enable_op:
       t->enabled_p = 1;
-      tracepoint_modify_event (t->number);
+      observer_notify_tracepoint_modified (t->number);
       break;
     case disable_op:
       t->enabled_p = 0;
-      tracepoint_modify_event (t->number);
+      observer_notify_tracepoint_modified (t->number);
       break;
     case delete_op:
       if (tracepoint_chain == t)
@@ -584,11 +579,12 @@ tracepoint_operation (struct tracepoint *t, int from_tty,
       ALL_TRACEPOINTS (t2)
        if (t2->next == t)
        {
-         tracepoint_delete_event (t2->number);
          t2->next = t->next;
          break;
        }
 
+      observer_notify_tracepoint_deleted (t->number);
+
       if (t->addr_string)
        xfree (t->addr_string);
       if (t->source_file)
@@ -739,7 +735,7 @@ trace_pass_command (char *args, int from_tty)
            if (t1 == (struct tracepoint *) -1 || t1 == t2)
              {
                t2->pass_count = count;
-               tracepoint_modify_event (t2->number);
+               observer_notify_tracepoint_modified (t2->number);
                if (from_tty)
                  printf_filtered ("Setting tracepoint %d's passcount to %d\n",
                                   t2->number, count);
@@ -862,7 +858,10 @@ read_actions (struct tracepoint *t)
        line = gdb_readline (0);
 
       if (!line)
-       line = "end";
+        {
+          line = xstrdup ("end");
+          printf_filtered ("end\n");
+        }
       
       linetype = validate_actionline (&line, t);
       if (linetype == BADLINE)
@@ -978,14 +977,14 @@ validate_actionline (char **line, struct tracepoint *t)
              if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
                {
                  warning (_("constant %s (value %ld) will not be collected."),
-                          DEPRECATED_SYMBOL_NAME (exp->elts[2].symbol),
+                          SYMBOL_PRINT_NAME (exp->elts[2].symbol),
                           SYMBOL_VALUE (exp->elts[2].symbol));
                  return BADLINE;
                }
              else if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_OPTIMIZED_OUT)
                {
                  warning (_("%s is optimized away and cannot be collected."),
-                          DEPRECATED_SYMBOL_NAME (exp->elts[2].symbol));
+                          SYMBOL_PRINT_NAME (exp->elts[2].symbol));
                  return BADLINE;
                }
            }
@@ -1069,9 +1068,14 @@ make_cleanup_free_actions (struct tracepoint *t)
   return make_cleanup (do_free_actions_cleanup, t);
 }
 
+enum {
+  memrange_absolute = -1
+};
+
 struct memrange
 {
-  int type;            /* 0 for absolute memory range, else basereg number */
+  int type;            /* memrange_absolute for absolute memory range,
+                           else basereg number */
   bfd_signed_vma start;
   bfd_signed_vma end;
 };
@@ -1103,7 +1107,7 @@ memrange_cmp (const void *va, const void *vb)
     return -1;
   if (a->type > b->type)
     return 1;
-  if (a->type == 0)
+  if (a->type == memrange_absolute)
     {
       if ((bfd_vma) a->start < (bfd_vma) b->start)
        return -1;
@@ -1156,7 +1160,7 @@ add_register (struct collection_list *collection, unsigned int regno)
 {
   if (info_verbose)
     printf_filtered ("collect register %d\n", regno);
-  if (regno > (8 * sizeof (collection->regs_mask)))
+  if (regno >= (8 * sizeof (collection->regs_mask)))
     error (_("Internal: register number %d too large for tracepoint"),
           regno);
   collection->regs_mask[regno / 8] |= 1 << (regno % 8);
@@ -1175,7 +1179,7 @@ add_memrange (struct collection_list *memranges,
       printf_filtered (",%ld)\n", len);
     }
 
-  /* type: -1 == memory, n == basereg */
+  /* 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;
@@ -1189,7 +1193,7 @@ add_memrange (struct collection_list *memranges,
                                  memranges->listsize);
     }
 
-  if (type != -1)              /* Better collect the base register!  */
+  if (type != memrange_absolute)               /* Better collect the base register!  */
     add_register (memranges, type);
 }
 
@@ -1208,12 +1212,12 @@ collect_symbol (struct collection_list *collect,
     {
     default:
       printf_filtered ("%s: don't know symbol class %d\n",
-                      DEPRECATED_SYMBOL_NAME (sym), 
+                      SYMBOL_PRINT_NAME (sym),
                       SYMBOL_CLASS (sym));
       break;
     case LOC_CONST:
       printf_filtered ("constant %s (value %ld) will not be collected.\n",
-                      DEPRECATED_SYMBOL_NAME (sym), SYMBOL_VALUE (sym));
+                      SYMBOL_PRINT_NAME (sym), SYMBOL_VALUE (sym));
       break;
     case LOC_STATIC:
       offset = SYMBOL_VALUE_ADDRESS (sym);
@@ -1223,17 +1227,16 @@ collect_symbol (struct collection_list *collect,
 
          sprintf_vma (tmp, offset);
          printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
-                          DEPRECATED_SYMBOL_NAME (sym), len, 
+                          SYMBOL_PRINT_NAME (sym), len,
                           tmp /* address */);
        }
-      add_memrange (collect, -1, offset, len); /* 0 == memory */
+      add_memrange (collect, memrange_absolute, offset, len);
       break;
     case LOC_REGISTER:
-    case LOC_REGPARM:
       reg = SYMBOL_VALUE (sym);
       if (info_verbose)
        printf_filtered ("LOC_REG[parm] %s: ", 
-                        DEPRECATED_SYMBOL_NAME (sym));
+                        SYMBOL_PRINT_NAME (sym));
       add_register (collect, reg);
       /* Check for doubles stored in two registers.  */
       /* FIXME: how about larger types stored in 3 or more regs?  */
@@ -1244,7 +1247,7 @@ collect_symbol (struct collection_list *collect,
     case LOC_REF_ARG:
       printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
       printf_filtered ("       (will not collect %s)\n",
-                      DEPRECATED_SYMBOL_NAME (sym));
+                      SYMBOL_PRINT_NAME (sym));
       break;
     case LOC_ARG:
       reg = frame_regno;
@@ -1252,7 +1255,7 @@ collect_symbol (struct collection_list *collect,
       if (info_verbose)
        {
          printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
-                          DEPRECATED_SYMBOL_NAME (sym), len);
+                          SYMBOL_PRINT_NAME (sym), len);
          printf_vma (offset);
          printf_filtered (" from frame ptr reg %d\n", reg);
        }
@@ -1264,45 +1267,31 @@ collect_symbol (struct collection_list *collect,
       if (info_verbose)
        {
          printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset ",
-                          DEPRECATED_SYMBOL_NAME (sym), len);
+                          SYMBOL_PRINT_NAME (sym), len);
          printf_vma (offset);
          printf_filtered (" from reg %d\n", reg);
        }
       add_memrange (collect, reg, offset, len);
       break;
     case LOC_LOCAL:
-    case LOC_LOCAL_ARG:
       reg = frame_regno;
       offset = frame_offset + SYMBOL_VALUE (sym);
       if (info_verbose)
        {
          printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
-                          DEPRECATED_SYMBOL_NAME (sym), len);
+                          SYMBOL_PRINT_NAME (sym), len);
          printf_vma (offset);
          printf_filtered (" from frame ptr reg %d\n", reg);
        }
       add_memrange (collect, reg, offset, len);
       break;
-    case LOC_BASEREG:
-    case LOC_BASEREG_ARG:
-      reg = SYMBOL_BASEREG (sym);
-      offset = SYMBOL_VALUE (sym);
-      if (info_verbose)
-       {
-         printf_filtered ("LOC_BASEREG %s: collect %ld bytes at offset ",
-                          DEPRECATED_SYMBOL_NAME (sym), len);
-         printf_vma (offset);
-         printf_filtered (" from basereg %d\n", reg);
-       }
-      add_memrange (collect, reg, offset, len);
-      break;
     case LOC_UNRESOLVED:
       printf_filtered ("Don't know LOC_UNRESOLVED %s\n", 
-                      DEPRECATED_SYMBOL_NAME (sym));
+                      SYMBOL_PRINT_NAME (sym));
       break;
     case LOC_OPTIMIZED_OUT:
       printf_filtered ("%s has been optimized out of existence.\n",
-                      DEPRECATED_SYMBOL_NAME (sym));
+                      SYMBOL_PRINT_NAME (sym));
       break;
     }
 }
@@ -1323,34 +1312,13 @@ add_local_symbols (struct collection_list *collect, CORE_ADDR pc,
       QUIT;                    /* allow user to bail out with ^C */
       ALL_BLOCK_SYMBOLS (block, iter, sym)
        {
-         switch (SYMBOL_CLASS (sym))
+         if (SYMBOL_IS_ARGUMENT (sym)
+             ? type == 'A'     /* collecting Arguments */
+             : type == 'L')    /* collecting Locals */
            {
-           default:
-             warning (_("don't know how to trace local symbol %s"), 
-                      DEPRECATED_SYMBOL_NAME (sym));
-           case LOC_LOCAL:
-           case LOC_STATIC:
-           case LOC_REGISTER:
-           case LOC_BASEREG:
-             if (type == 'L')  /* collecting Locals */
-               {
-                 count++;
-                 collect_symbol (collect, sym, frame_regno, 
-                                 frame_offset);
-               }
-             break;
-           case LOC_ARG:
-           case LOC_LOCAL_ARG:
-           case LOC_REF_ARG:
-           case LOC_REGPARM:
-           case LOC_REGPARM_ADDR:
-           case LOC_BASEREG_ARG:
-             if (type == 'A')  /* collecting Arguments */
-               {
-                 count++;
-                 collect_symbol (collect, sym, frame_regno, 
-                                 frame_offset);
-               }
+             count++;
+             collect_symbol (collect, sym, frame_regno, 
+                             frame_offset);
            }
        }
       if (BLOCK_FUNCTION (block))
@@ -1437,13 +1405,21 @@ stringify_collection_list (struct collection_list *list, char *string)
          end = temp_buf;
        }
 
-      sprintf (end, "M%X,%s,%lX", 
-              list->list[i].type,
-              tmp2,
-              (long) (list->list[i].end - list->list[i].start));
+      {
+        bfd_signed_vma length = list->list[i].end - list->list[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)
+          sprintf (end, "M-1,%s,%lX", tmp2, (long) length);
+        else
+          sprintf (end, "M%X,%s,%lX", list->list[i].type, tmp2, (long) length);
+      }
 
       count += strlen (end);
-      end += count;
+      end = temp_buf + count;
     }
 
   for (i = 0; i < list->next_aexpr_elt; i++)
@@ -1475,7 +1451,10 @@ stringify_collection_list (struct collection_list *list, char *string)
   (*str_list)[ndx] = NULL;
 
   if (ndx == 0)
-    return NULL;
+    {
+      xfree (str_list);
+      return NULL;
+    }
   else
     return *str_list;
 }
@@ -1525,7 +1504,8 @@ encode_actions (struct tracepoint *t, char ***tdp_actions,
   *tdp_actions = NULL;
   *stepping_actions = NULL;
 
-  TARGET_VIRTUAL_FRAME_POINTER (t->address, &frame_reg, &frame_offset);
+  gdbarch_virtual_frame_pointer (current_gdbarch, 
+                                t->address, &frame_reg, &frame_offset);
 
   for (action = t->actions; action; action = action->next)
     {
@@ -1551,7 +1531,7 @@ encode_actions (struct tracepoint *t, char ***tdp_actions,
 
              if (0 == strncasecmp ("$reg", action_exp, 4))
                {
-                 for (i = 0; i < NUM_REGS; i++)
+                 for (i = 0; i < gdbarch_num_regs (current_gdbarch); i++)
                    add_register (collect, i);
                  action_exp = strchr (action_exp, ',');        /* more? */
                }
@@ -1587,18 +1567,27 @@ encode_actions (struct tracepoint *t, char ***tdp_actions,
                  switch (exp->elts[0].opcode)
                    {
                    case OP_REGISTER:
-                     i = exp->elts[1].longconst;
-                     if (info_verbose)
-                       printf_filtered ("OP_REGISTER: ");
-                     add_register (collect, i);
-                     break;
+                     {
+                       const char *name = &exp->elts[2].string;
+
+                       i = user_reg_map_name_to_regnum (current_gdbarch,
+                                                        name, strlen (name));
+                       if (i == -1)
+                         internal_error (__FILE__, __LINE__,
+                                         _("Register $%s not available"),
+                                         name);
+                       if (info_verbose)
+                         printf_filtered ("OP_REGISTER: ");
+                       add_register (collect, i);
+                       break;
+                     }
 
                    case UNOP_MEMVAL:
                      /* safe because we know it's a simple expression */
                      tempval = evaluate_expression (exp);
                      addr = VALUE_ADDRESS (tempval) + value_offset (tempval);
                      len = TYPE_LENGTH (check_typedef (exp->elts[1].type));
-                     add_memrange (collect, -1, addr, len);
+                     add_memrange (collect, memrange_absolute, addr, len);
                      break;
 
                    case OP_VAR_VALUE:
@@ -1687,7 +1676,8 @@ add_aexpr (struct collection_list *collect, struct agent_expr *aexpr)
   collect->next_aexpr_elt++;
 }
 
-static char target_buf[2048];
+static char *target_buf;
+static long target_buf_size;
 
 /* Set "transparent" memory ranges
 
@@ -1729,7 +1719,7 @@ remote_set_transparent_ranges (void)
   if (anysecs)
     {
       putpkt (target_buf);
-      getpkt (target_buf, sizeof (target_buf), 0);
+      getpkt (&target_buf, &target_buf_size, 0);
     }
 }
 
@@ -1755,7 +1745,7 @@ trace_start_command (char *args, int from_tty)
   if (target_is_remote ())
     {
       putpkt ("QTinit");
-      remote_get_noisy_reply (target_buf, sizeof (target_buf));
+      remote_get_noisy_reply (&target_buf, &target_buf_size);
       if (strcmp (target_buf, "OK"))
        error (_("Target does not support this command."));
 
@@ -1772,7 +1762,7 @@ trace_start_command (char *args, int from_tty)
        if (t->actions)
          strcat (buf, "-");
        putpkt (buf);
-       remote_get_noisy_reply (target_buf, sizeof (target_buf));
+       remote_get_noisy_reply (&target_buf, &target_buf_size);
        if (strcmp (target_buf, "OK"))
          error (_("Target does not support tracepoints."));
 
@@ -1796,8 +1786,8 @@ trace_start_command (char *args, int from_tty)
                             ((tdp_actions[ndx + 1] || stepping_actions)
                              ? '-' : 0));
                    putpkt (buf);
-                   remote_get_noisy_reply (target_buf, 
-                                           sizeof (target_buf));
+                   remote_get_noisy_reply (&target_buf,
+                                           &target_buf_size);
                    if (strcmp (target_buf, "OK"))
                      error (_("Error on target while setting tracepoints."));
                  }
@@ -1813,8 +1803,8 @@ trace_start_command (char *args, int from_tty)
                             stepping_actions[ndx],
                             (stepping_actions[ndx + 1] ? "-" : ""));
                    putpkt (buf);
-                   remote_get_noisy_reply (target_buf, 
-                                           sizeof (target_buf));
+                   remote_get_noisy_reply (&target_buf,
+                                           &target_buf_size);
                    if (strcmp (target_buf, "OK"))
                      error (_("Error on target while setting tracepoints."));
                  }
@@ -1827,7 +1817,7 @@ trace_start_command (char *args, int from_tty)
       remote_set_transparent_ranges ();
       /* Now insert traps and begin collecting data.  */
       putpkt ("QTStart");
-      remote_get_noisy_reply (target_buf, sizeof (target_buf));
+      remote_get_noisy_reply (&target_buf, &target_buf_size);
       if (strcmp (target_buf, "OK"))
        error (_("Bogus reply from target: %s"), target_buf);
       set_traceframe_num (-1); /* All old traceframes invalidated.  */
@@ -1849,7 +1839,7 @@ trace_stop_command (char *args, int from_tty)
   if (target_is_remote ())
     {
       putpkt ("QTStop");
-      remote_get_noisy_reply (target_buf, sizeof (target_buf));
+      remote_get_noisy_reply (&target_buf, &target_buf_size);
       if (strcmp (target_buf, "OK"))
        error (_("Bogus reply from target: %s"), target_buf);
       trace_running_p = 0;
@@ -1869,7 +1859,7 @@ trace_status_command (char *args, int from_tty)
   if (target_is_remote ())
     {
       putpkt ("qTStatus");
-      remote_get_noisy_reply (target_buf, sizeof (target_buf));
+      remote_get_noisy_reply (&target_buf, &target_buf_size);
 
       if (target_buf[0] != 'T' ||
          (target_buf[1] != '0' && target_buf[1] != '1'))
@@ -1884,8 +1874,8 @@ trace_status_command (char *args, int from_tty)
 
 /* Worker function for the various flavors of the tfind command.  */
 static void
-finish_tfind_command (char *msg,
-                     long sizeof_msg,
+finish_tfind_command (char **msg,
+                     long *sizeof_msg,
                      int from_tty)
 {
   int target_frameno = -1, target_tracept = -1;
@@ -1896,7 +1886,7 @@ finish_tfind_command (char *msg,
   old_frame_addr = get_frame_base (get_current_frame ());
   old_func = find_pc_function (read_pc ());
 
-  putpkt (msg);
+  putpkt (*msg);
   reply = remote_get_noisy_reply (msg, sizeof_msg);
 
   while (reply && *reply)
@@ -1954,9 +1944,8 @@ finish_tfind_command (char *msg,
        error (_("Bogus reply from target: %s"), reply);
       }
 
-  flush_cached_frames ();
+  reinit_frame_cache ();
   registers_changed ();
-  select_frame (get_current_frame ());
   set_traceframe_num (target_frameno);
   set_tracepoint_num (target_tracept);
   if (target_frameno == -1)
@@ -2041,7 +2030,7 @@ trace_find_command (char *args, int from_tty)
        error (_("invalid input (%d is less than zero)"), frameno);
 
       sprintf (target_buf, "QTFrame:%x", frameno);
-      finish_tfind_command (target_buf, sizeof (target_buf), from_tty);
+      finish_tfind_command (&target_buf, &target_buf_size, from_tty);
     }
   else
     error (_("Trace can only be run on remote targets."));
@@ -2084,7 +2073,7 @@ trace_find_pc_command (char *args, int from_tty)
 
       sprintf_vma (tmp, pc);
       sprintf (target_buf, "QTFrame:pc:%s", tmp);
-      finish_tfind_command (target_buf, sizeof (target_buf), from_tty);
+      finish_tfind_command (&target_buf, &target_buf_size, from_tty);
     }
   else
     error (_("Trace can only be run on remote targets."));
@@ -2109,7 +2098,7 @@ trace_find_tracepoint_command (char *args, int from_tty)
        tdp = parse_and_eval_long (args);
 
       sprintf (target_buf, "QTFrame:tdp:%x", tdp);
-      finish_tfind_command (target_buf, sizeof (target_buf), from_tty);
+      finish_tfind_command (&target_buf, &target_buf_size, from_tty);
     }
   else
     error (_("Trace can only be run on remote targets."));
@@ -2207,7 +2196,7 @@ trace_find_line_command (char *args, int from_tty)
       else
        sprintf (target_buf, "QTFrame:outside:%s:%s", 
                 startpc_str, endpc_str);
-      finish_tfind_command (target_buf, sizeof (target_buf), 
+      finish_tfind_command (&target_buf, &target_buf_size,
                            from_tty);
       do_cleanups (old_chain);
     }
@@ -2248,7 +2237,7 @@ trace_find_range_command (char *args, int from_tty)
       sprintf_vma (start_str, start);
       sprintf_vma (stop_str, stop);
       sprintf (target_buf, "QTFrame:range:%s:%s", start_str, stop_str);
-      finish_tfind_command (target_buf, sizeof (target_buf), from_tty);
+      finish_tfind_command (&target_buf, &target_buf_size, from_tty);
     }
   else
     error (_("Trace can only be run on remote targets."));
@@ -2287,7 +2276,7 @@ trace_find_outside_command (char *args, int from_tty)
       sprintf_vma (start_str, start);
       sprintf_vma (stop_str, stop);
       sprintf (target_buf, "QTFrame:outside:%s:%s", start_str, stop_str);
-      finish_tfind_command (target_buf, sizeof (target_buf), from_tty);
+      finish_tfind_command (&target_buf, &target_buf_size, from_tty);
     }
   else
     error (_("Trace can only be run on remote targets."));
@@ -2303,9 +2292,10 @@ tracepoint_save_command (char *args, int from_tty)
   char *i1 = "    ", *i2 = "      ";
   char *indent, *actionline, *pathname;
   char tmp[40];
+  struct cleanup *cleanup;
 
   if (args == 0 || *args == 0)
-    error (_("Argument required (file name in which to save tracepoints"));
+    error (_("Argument required (file name in which to save tracepoints)"));
 
   if (tracepoint_chain == 0)
     {
@@ -2314,10 +2304,11 @@ tracepoint_save_command (char *args, int from_tty)
     }
 
   pathname = tilde_expand (args);
+  cleanup = make_cleanup (xfree, pathname);
   if (!(fp = fopen (pathname, "w")))
     error (_("Unable to open file '%s' for saving tracepoints (%s)"),
           args, safe_strerror (errno));
-  xfree (pathname);
+  make_cleanup_fclose (fp);
   
   ALL_TRACEPOINTS (tp)
   {
@@ -2359,7 +2350,7 @@ tracepoint_save_command (char *args, int from_tty)
          }
       }
   }
-  fclose (fp);
+  do_cleanups (cleanup);
   if (from_tty)
     printf_filtered ("Tracepoints saved to file '%s'.\n", args);
   return;
@@ -2398,7 +2389,7 @@ scope_info (char *args, int from_tty)
            printf_filtered ("Scope for %s:\n", save_args);
          count++;
 
-         symname = DEPRECATED_SYMBOL_NAME (sym);
+         symname = SYMBOL_PRINT_NAME (sym);
          if (symname == NULL || *symname == '\0')
            continue;           /* probably botched, certainly useless */
 
@@ -2424,15 +2415,19 @@ scope_info (char *args, int from_tty)
              break;
            case LOC_STATIC:
              printf_filtered ("in static storage at address ");
-             deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (sym), 
-                                    1, gdb_stdout);
+             printf_filtered ("%s", paddress (SYMBOL_VALUE_ADDRESS (sym)));
              break;
            case LOC_REGISTER:
-             printf_filtered ("a local variable in register $%s",
-                              REGISTER_NAME (SYMBOL_VALUE (sym)));
+             if (SYMBOL_IS_ARGUMENT (sym))
+               printf_filtered ("an argument in register $%s",
+                                gdbarch_register_name
+                                (current_gdbarch, SYMBOL_VALUE (sym)));
+             else
+               printf_filtered ("a local variable in register $%s",
+                                gdbarch_register_name
+                                (current_gdbarch, SYMBOL_VALUE (sym)));
              break;
            case LOC_ARG:
-           case LOC_LOCAL_ARG:
              printf_filtered ("an argument at stack/frame offset %ld",
                               SYMBOL_VALUE (sym));
              break;
@@ -2444,62 +2439,37 @@ scope_info (char *args, int from_tty)
              printf_filtered ("a reference argument at offset %ld",
                               SYMBOL_VALUE (sym));
              break;
-           case LOC_REGPARM:
-             printf_filtered ("an argument in register $%s",
-                              REGISTER_NAME (SYMBOL_VALUE (sym)));
-             break;
            case LOC_REGPARM_ADDR:
              printf_filtered ("the address of an argument, in register $%s",
-                              REGISTER_NAME (SYMBOL_VALUE (sym)));
+                              gdbarch_register_name
+                                (current_gdbarch, SYMBOL_VALUE (sym)));
              break;
            case LOC_TYPEDEF:
              printf_filtered ("a typedef.\n");
              continue;
            case LOC_LABEL:
              printf_filtered ("a label at address ");
-             deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (sym), 
-                                    1, gdb_stdout);
+             printf_filtered ("%s", paddress (SYMBOL_VALUE_ADDRESS (sym)));
              break;
            case LOC_BLOCK:
              printf_filtered ("a function at address ");
-             deprecated_print_address_numeric (BLOCK_START (SYMBOL_BLOCK_VALUE (sym)),
-                                    1, gdb_stdout);
-             break;
-           case LOC_BASEREG:
-             printf_filtered ("a variable at offset %ld from register $%s",
-                              SYMBOL_VALUE (sym),
-                              REGISTER_NAME (SYMBOL_BASEREG (sym)));
-             break;
-           case LOC_BASEREG_ARG:
-             printf_filtered ("an argument at offset %ld from register $%s",
-                              SYMBOL_VALUE (sym),
-                              REGISTER_NAME (SYMBOL_BASEREG (sym)));
+             printf_filtered ("%s", paddress (BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
              break;
            case LOC_UNRESOLVED:
-             msym = lookup_minimal_symbol (DEPRECATED_SYMBOL_NAME (sym), 
+             msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
                                            NULL, NULL);
              if (msym == NULL)
                printf_filtered ("Unresolved Static");
              else
                {
                  printf_filtered ("static storage at address ");
-                 deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (msym), 1,
-                                        gdb_stdout);
+                 printf_filtered ("%s", paddress (SYMBOL_VALUE_ADDRESS (msym)));
                }
              break;
            case LOC_OPTIMIZED_OUT:
              printf_filtered ("optimized out.\n");
              continue;
-           case LOC_HP_THREAD_LOCAL_STATIC:
-             printf_filtered ("HP thread local static ");
-             break;
-           case LOC_INDIRECT:
-             printf_filtered ("extern (local indirect) at address ");
-             deprecated_print_address_numeric (SYMBOL_VALUE_ADDRESS (sym), 
-                                    1, gdb_stdout);
-             break;
            case LOC_COMPUTED:
-           case LOC_COMPUTED_ARG:
              SYMBOL_OPS (sym)->describe_location (sym, gdb_stdout);
              break;
            }
@@ -2529,6 +2499,8 @@ replace_comma (void *data)
 static void
 trace_dump_command (char *args, int from_tty)
 {
+  struct regcache *regcache;
+  struct gdbarch *gdbarch;
   struct tracepoint *t;
   struct action_line *action;
   char *action_exp, *next_comma;
@@ -2565,7 +2537,11 @@ trace_dump_command (char *args, int from_tty)
      to the tracepoint PC.  If not, then the current frame was
      collected during single-stepping.  */
 
-  stepping_frame = (t->address != (read_pc () - DECR_PC_AFTER_BREAK));
+  regcache = get_current_regcache ();
+  gdbarch = get_regcache_arch (regcache);
+
+  stepping_frame = (t->address != (regcache_read_pc (regcache)
+                                  - gdbarch_decr_pc_after_break (gdbarch)));
 
   for (action = t->actions; action; action = action->next)
     {
@@ -2645,10 +2621,10 @@ trace_dump_command (char *args, int from_tty)
 
 static const char hexchars[] = "0123456789abcdef";
 
-static unsigned char *
-mem2hex (unsigned char *mem, unsigned char *buf, int count)
+static char *
+mem2hex (gdb_byte *mem, char *buf, int count)
 {
-  unsigned char ch;
+  gdb_byte ch;
 
   while (count-- > 0)
     {
@@ -2681,11 +2657,6 @@ _initialize_tracepoint (void)
   traceframe_number = -1;
   tracepoint_number = -1;
 
-  set_internalvar (lookup_internalvar ("tpnum"),
-                  value_from_longest (builtin_type_int, (LONGEST) 0));
-  set_internalvar (lookup_internalvar ("trace_frame"),
-                  value_from_longest (builtin_type_int, (LONGEST) - 1));
-
   if (tracepoint_list.list == NULL)
     {
       tracepoint_list.listsize = 128;
@@ -2859,4 +2830,7 @@ Do \"help tracepoints\" for info on other tracepoint commands."));
   add_com_alias ("tr", "trace", class_alias, 1);
   add_com_alias ("tra", "trace", class_alias, 1);
   add_com_alias ("trac", "trace", class_alias, 1);
+
+  target_buf_size = 2048;
+  target_buf = xmalloc (target_buf_size);
 }
This page took 0.080189 seconds and 4 git commands to generate.