* completer.c (location_completer): Fix typo in comment.
[deliverable/binutils-gdb.git] / gdb / tracepoint.c
index 8060971e3163fb202780c3bf28030651f6310468..bc30150922ab2ad498f33ed09c2dd85e646f95e9 100644 (file)
@@ -1,6 +1,6 @@
 /* Tracing functionality for remote targets in custom GDB protocol
 
-   Copyright (C) 1997-2012 Free Software Foundation, Inc.
+   Copyright (C) 1997-2013 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -93,11 +93,6 @@ extern void (*deprecated_readline_begin_hook) (char *, ...);
 extern char *(*deprecated_readline_hook) (char *);
 extern void (*deprecated_readline_end_hook) (void);
 
-/* GDB commands implemented in other modules:
- */  
-
-extern void output_command (char *, int);
-
 /* 
    Tracepoint.c:
 
@@ -312,12 +307,11 @@ set_traceframe_context (struct frame_info *trace_frame)
 
   /* Save file name as "$trace_file", a debugger variable visible to
      users.  */
-  if (traceframe_sal.symtab == NULL
-      || traceframe_sal.symtab->filename == NULL)
+  if (traceframe_sal.symtab == NULL)
     clear_internalvar (lookup_internalvar ("trace_file"));
   else
     set_internalvar_string (lookup_internalvar ("trace_file"),
-                           traceframe_sal.symtab->filename);
+                       symtab_to_filename_for_display (traceframe_sal.symtab));
 }
 
 /* Create a new trace state variable with the given name.  */
@@ -359,6 +353,9 @@ delete_trace_state_variable (const char *name)
       {
        xfree ((void *)tsv->name);
        VEC_unordered_remove (tsv_s, tvariables, ix);
+
+       observer_notify_tsv_deleted (name);
+
        return;
       }
 
@@ -423,6 +420,8 @@ trace_variable_command (char *args, int from_tty)
   tsv = create_trace_state_variable (internalvar_name (intvar));
   tsv->initial_value = initval;
 
+  observer_notify_tsv_created (tsv->name, initval);
+
   printf_filtered (_("Trace state variable $%s "
                     "created, with initial value %s.\n"),
                   tsv->name, plongest (tsv->initial_value));
@@ -442,6 +441,7 @@ delete_trace_variable_command (char *args, int from_tty)
       if (query (_("Delete all trace state variables? ")))
        VEC_free (tsv_s, tvariables);
       dont_repeat ();
+      observer_notify_tsv_deleted (NULL);
       return;
     }
 
@@ -1450,7 +1450,7 @@ encode_actions_1 (struct command_line *action,
                }
              else
                {
-                 unsigned long addr, len;
+                 unsigned long addr;
                  struct cleanup *old_chain = NULL;
                  struct cleanup *old_chain1 = NULL;
 
@@ -1480,8 +1480,10 @@ encode_actions_1 (struct command_line *action,
                      /* Safe because we know it's a simple expression.  */
                      tempval = evaluate_expression (exp);
                      addr = value_address (tempval);
-                     len = TYPE_LENGTH (check_typedef (exp->elts[1].type));
-                     add_memrange (collect, memrange_absolute, addr, len);
+                     /* 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));
                      break;
 
                    case OP_VAR_VALUE:
@@ -1759,6 +1761,7 @@ start_tracing (char *notes)
     {
       struct tracepoint *t = (struct tracepoint *) b;
       struct bp_location *loc;
+      int bp_location_downloaded = 0;
 
       /* Clear `inserted' flag.  */
       for (loc = b->loc; loc; loc = loc->next)
@@ -1780,6 +1783,7 @@ start_tracing (char *notes)
          target_download_tracepoint (loc);
 
          loc->inserted = 1;
+         bp_location_downloaded = 1;
        }
 
       t->number_on_target = b->number;
@@ -1787,6 +1791,9 @@ start_tracing (char *notes)
       for (loc = b->loc; loc; loc = loc->next)
        if (loc->probe != NULL)
          loc->probe->pops->set_semaphore (loc->probe, loc->gdbarch);
+
+      if (bp_location_downloaded)
+       observer_notify_breakpoint_modified (b);
     }
   VEC_free (breakpoint_p, tp_vec);
 
@@ -2212,6 +2219,7 @@ disconnect_tracing (int from_tty)
      full tfind_1 behavior because we're in the middle of detaching,
      and there's no point to updating current stack frame etc.  */
   set_current_traceframe (-1);
+  set_tracepoint_num (-1);
   set_traceframe_context (NULL);
 }
 
@@ -2285,11 +2293,15 @@ tfind_1 (enum trace_find_type type, int num,
   tp = get_tracepoint_by_number_on_target (target_tracept);
 
   reinit_frame_cache ();
-  registers_changed ();
   target_dcache_invalidate ();
-  set_traceframe_num (target_frameno);
-  clear_traceframe_info ();
+
   set_tracepoint_num (tp ? tp->base.number : target_tracept);
+
+  if (target_frameno != get_traceframe_number ())
+    observer_notify_traceframe_changed (target_frameno, tracepoint_number);
+
+  set_current_traceframe (target_frameno);
+
   if (target_frameno == -1)
     set_traceframe_context (NULL);
   else
@@ -2404,13 +2416,6 @@ trace_find_end_command (char *args, int from_tty)
   trace_find_command ("-1", from_tty);
 }
 
-/* tfind none */
-static void
-trace_find_none_command (char *args, int from_tty)
-{
-  trace_find_command ("-1", from_tty);
-}
-
 /* tfind start */
 static void
 trace_find_start_command (char *args, int from_tty)
@@ -2507,7 +2512,8 @@ trace_find_line_command (char *args, int from_tty)
       if (start_pc == end_pc)
        {
          printf_filtered ("Line %d of \"%s\"",
-                          sal.line, sal.symtab->filename);
+                          sal.line,
+                          symtab_to_filename_for_display (sal.symtab));
          wrap_here ("  ");
          printf_filtered (" is at address ");
          print_address (get_current_arch (), start_pc, gdb_stdout);
@@ -2528,7 +2534,7 @@ trace_find_line_command (char *args, int from_tty)
        which the user would want to see?  If we have debugging
        symbols and no line numbers?  */
     error (_("Line number %d is out of range for \"%s\"."),
-          sal.line, sal.symtab->filename);
+          sal.line, symtab_to_filename_for_display (sal.symtab));
 
   /* Find within range of stated line.  */
   if (args && *args)
@@ -3280,7 +3286,7 @@ set_current_traceframe (int num)
   if (newnum != num)
     warning (_("could not change traceframe"));
 
-  traceframe_number = newnum;
+  set_traceframe_num (newnum);
 
   /* Changing the traceframe changes our view of registers and of the
      frame chain.  */
@@ -3464,6 +3470,10 @@ void
 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
 {
   struct uploaded_tp *utp;
+  /* A set of tracepoints which are modified.  */
+  VEC(breakpoint_p) *modified_tp = NULL;
+  int ix;
+  struct breakpoint *b;
 
   /* Look for GDB tracepoints that match up with our uploaded versions.  */
   for (utp = *uploaded_tps; utp; utp = utp->next)
@@ -3474,6 +3484,8 @@ merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
       loc = find_matching_tracepoint_location (utp);
       if (loc)
        {
+         int found = 0;
+
          /* Mark this location as already inserted.  */
          loc->inserted = 1;
          t = (struct tracepoint *) loc->owner;
@@ -3481,6 +3493,22 @@ merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
                             "as target's tracepoint %d at %s.\n"),
                           loc->owner->number, utp->number,
                           paddress (loc->gdbarch, utp->addr));
+
+         /* The tracepoint LOC->owner was modified (the location LOC
+            was marked as inserted in the target).  Save it in
+            MODIFIED_TP if not there yet.  The 'breakpoint-modified'
+            observers will be notified later once for each tracepoint
+            saved in MODIFIED_TP.  */
+         for (ix = 0;
+              VEC_iterate (breakpoint_p, modified_tp, ix, b);
+              ix++)
+           if (b == loc->owner)
+             {
+               found = 1;
+               break;
+             }
+         if (!found)
+           VEC_safe_push (breakpoint_p, modified_tp, loc->owner);
        }
       else
        {
@@ -3503,6 +3531,12 @@ merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
        t->number_on_target = utp->number;
     }
 
+  /* Notify 'breakpoint-modified' observer that at least one of B's
+     locations was changed.  */
+  for (ix = 0; VEC_iterate (breakpoint_p, modified_tp, ix, b); ix++)
+    observer_notify_breakpoint_modified (b);
+
+  VEC_free (breakpoint_p, modified_tp);
   free_uploaded_tps (uploaded_tps);
 }
 
@@ -3553,6 +3587,8 @@ create_tsv_from_upload (struct uploaded_tsv *utsv)
   tsv->initial_value = utsv->initial_value;
   tsv->builtin = utsv->builtin;
 
+  observer_notify_tsv_created (tsv->name, tsv->initial_value);
+
   do_cleanups (old_chain);
 
   return tsv;
@@ -3613,17 +3649,17 @@ merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
 
 /* target tfile command */
 
-struct target_ops tfile_ops;
+static struct target_ops tfile_ops;
 
 /* Fill in tfile_ops with its defined operations and properties.  */
 
 #define TRACE_HEADER_SIZE 8
 
-char *trace_filename;
-int trace_fd = -1;
-off_t trace_frames_offset;
-off_t cur_offset;
-int cur_data_size;
+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,
@@ -4198,7 +4234,7 @@ tfile_get_traceframe_address (off_t tframe_offset)
   tfile_read ((gdb_byte *) &tpnum, 2);
   tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
                                          gdbarch_byte_order
-                                             (target_gdbarch));
+                                             (target_gdbarch ()));
 
   tp = get_tracepoint_by_number_on_target (tpnum);
   /* FIXME this is a poor heuristic if multiple locations.  */
@@ -4242,14 +4278,14 @@ tfile_trace_find (enum trace_find_type type, int num,
       tfile_read ((gdb_byte *) &tpnum, 2);
       tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
                                              gdbarch_byte_order
-                                                 (target_gdbarch));
+                                                 (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));
+                                     gdbarch_byte_order (target_gdbarch ()));
       offset += 4;
       switch (type)
        {
@@ -4357,7 +4393,7 @@ traceframe_walk_blocks (walk_blocks_callback_func callback,
           mlen = (unsigned short)
                 extract_unsigned_integer ((gdb_byte *) &mlen, 2,
                                           gdbarch_byte_order
-                                              (target_gdbarch));
+                                              (target_gdbarch ()));
          lseek (trace_fd, mlen, SEEK_CUR);
          pos += (8 + 2 + mlen);
          break;
@@ -4494,7 +4530,7 @@ tfile_xfer_partial (struct target_ops *ops, enum target_object object,
        {
          ULONGEST maddr, amt;
          unsigned short mlen;
-         enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
+         enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
 
          tfile_read ((gdb_byte *) &maddr, 8);
          maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
@@ -4577,13 +4613,13 @@ tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
       tfile_read ((gdb_byte *) &vnum, 4);
       vnum = (int) extract_signed_integer ((gdb_byte *) &vnum, 4,
                                           gdbarch_byte_order
-                                          (target_gdbarch));
+                                          (target_gdbarch ()));
       if (tsvnum == vnum)
        {
          tfile_read ((gdb_byte *) val, 8);
          *val = extract_signed_integer ((gdb_byte *) val, 8,
                                         gdbarch_byte_order
-                                        (target_gdbarch));
+                                        (target_gdbarch ()));
          return 1;
        }
       pos += (4 + 8);
@@ -4731,7 +4767,7 @@ parse_static_tracepoint_marker_definition (char *line, char **pp,
   p = unpack_varlen_hex (p, &addr);
   p++;  /* skip a colon */
 
-  marker->gdbarch = target_gdbarch;
+  marker->gdbarch = target_gdbarch ();
   marker->address = (CORE_ADDR) addr;
 
   endp = strchr (p, ':');
@@ -4825,15 +4861,15 @@ print_one_static_tracepoint_marker (int count,
 
   if (sal.symtab != NULL)
     {
-      ui_out_field_string (uiout, "file", sal.symtab->filename);
+      ui_out_field_string (uiout, "file",
+                          symtab_to_filename_for_display (sal.symtab));
       ui_out_text (uiout, ":");
 
       if (ui_out_is_mi_like_p (uiout))
        {
-         char *fullname = symtab_to_fullname (sal.symtab);
+         const char *fullname = symtab_to_fullname (sal.symtab);
 
-         if (fullname)
-           ui_out_field_string (uiout, "fullname", fullname);
+         ui_out_field_string (uiout, "fullname", fullname);
        }
       else
        ui_out_field_skip (uiout, "fullname");
@@ -4908,7 +4944,7 @@ info_static_tracepoint_markers_command (char *arg, int from_tty)
   ui_out_table_header (uiout, 40, ui_left, "marker-id", "ID");
 
   ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");
-  if (gdbarch_addr_bit (target_gdbarch) <= 32)
+  if (gdbarch_addr_bit (target_gdbarch ()) <= 32)
     ui_out_table_header (uiout, 10, ui_left, "addr", "Address");
   else
     ui_out_table_header (uiout, 18, ui_left, "addr", "Address");
@@ -5243,13 +5279,10 @@ Default is the current PC, or the PC of the current trace frame."),
           &tfindlist);
 
   add_cmd ("end", class_trace, trace_find_end_command, _("\
-Synonym for 'none'.\n\
 De-select any trace frame and resume 'live' debugging."),
           &tfindlist);
 
-  add_cmd ("none", class_trace, trace_find_none_command,
-          _("De-select any trace frame and resume 'live' debugging."),
-          &tfindlist);
+  add_alias_cmd ("none", "end", class_trace, 0, &tfindlist);
 
   add_cmd ("start", class_trace, trace_find_start_command,
           _("Select the first trace frame in the trace buffer."),
This page took 0.03748 seconds and 4 git commands to generate.