include/opcode/
[deliverable/binutils-gdb.git] / gdb / tracepoint.c
index 02d2e80b7678f20a5ba1acf134bab8747d0cfa0a..7cd98be516bb87e8b239ca712771d457479d3ccb 100644 (file)
@@ -1,13 +1,13 @@
 /* Tracing functionality for remote targets in custom GDB protocol
 
    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
-   2007 Free Software Foundation, Inc.
+   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., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "symtab.h"
@@ -445,7 +443,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.",
@@ -480,7 +478,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            ");
@@ -490,7 +488,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, "                   ");
@@ -502,7 +500,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
@@ -585,11 +583,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;
        }
 
+      tracepoint_delete_event (t->number);
+
       if (t->addr_string)
        xfree (t->addr_string);
       if (t->source_file)
@@ -863,7 +862,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)
@@ -1162,7 +1164,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);
@@ -1235,7 +1237,6 @@ collect_symbol (struct collection_list *collect,
       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: ", 
@@ -1277,7 +1278,6 @@ collect_symbol (struct collection_list *collect,
       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)
@@ -1289,19 +1289,6 @@ collect_symbol (struct collection_list *collect,
        }
       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));
@@ -1329,34 +1316,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))
@@ -1489,7 +1455,10 @@ stringify_collection_list (struct collection_list *list, char *string)
   (*str_list)[ndx] = NULL;
 
   if (ndx == 0)
-    return NULL;
+    {
+      free (str_list);
+      return NULL;
+    }
   else
     return *str_list;
 }
@@ -2448,16 +2417,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",
-                              gdbarch_register_name
+             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;
@@ -2469,11 +2441,6 @@ 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",
-                              gdbarch_register_name
-                                (current_gdbarch, SYMBOL_VALUE (sym)));
-             break;
            case LOC_REGPARM_ADDR:
              printf_filtered ("the address of an argument, in register $%s",
                               gdbarch_register_name
@@ -2484,25 +2451,11 @@ scope_info (char *args, int from_tty)
              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),
-                              gdbarch_register_name
-                                (current_gdbarch, SYMBOL_BASEREG (sym)));
-             break;
-           case LOC_BASEREG_ARG:
-             printf_filtered ("an argument at offset %ld from register $%s",
-                              SYMBOL_VALUE (sym),
-                              gdbarch_register_name
-                                (current_gdbarch, 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), 
@@ -2512,23 +2465,13 @@ scope_info (char *args, int from_tty)
              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;
            }
@@ -2558,6 +2501,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;
@@ -2594,8 +2539,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 () - gdbarch_decr_pc_after_break
-                                                 (current_gdbarch)));
+  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)
     {
This page took 0.027944 seconds and 4 git commands to generate.