Fix problems introduced with my last change.
[deliverable/binutils-gdb.git] / gdb / tracepoint.c
index 6b0be604273724e26f59dd0a6080c7ba5a2ed106..eefd556fba5b6d91b825be3c4856150c114033d9 100644 (file)
@@ -196,13 +196,13 @@ trace_error (buf)
 
 /* Utility: wait for reply from stub, while accepting "O" packets */
 static char *
-remote_get_noisy_reply (buf)
-     char *buf;
+remote_get_noisy_reply (char *buf,
+                       long sizeof_buf)
 {
   do                           /* loop on reply from remote stub */
     {
       QUIT;                    /* allow user to bail out with ^C */
-      getpkt (buf, 0);
+      getpkt (buf, sizeof_buf, 0);
       if (buf[0] == 0)
        error ("Target does not support this command.");
       else if (buf[0] == 'E')
@@ -268,11 +268,11 @@ set_traceframe_context (trace_pc)
       traceframe_sal.pc = traceframe_sal.line = 0;
       traceframe_sal.symtab = NULL;
       set_internalvar (lookup_internalvar ("trace_func"),
-                      value_from_longest (charstar, (LONGEST) 0));
+                      value_from_pointer (charstar, (LONGEST) 0));
       set_internalvar (lookup_internalvar ("trace_file"),
-                      value_from_longest (charstar, (LONGEST) 0));
+                      value_from_pointer (charstar, (LONGEST) 0));
       set_internalvar (lookup_internalvar ("trace_line"),
-                      value_from_longest (builtin_type_int, (LONGEST) - 1));
+                      value_from_pointer (builtin_type_int, (LONGEST) - 1));
       return;
     }
 
@@ -289,7 +289,7 @@ set_traceframe_context (trace_pc)
   if (traceframe_fun == NULL ||
       SYMBOL_NAME (traceframe_fun) == NULL)
     set_internalvar (lookup_internalvar ("trace_func"),
-                    value_from_longest (charstar, (LONGEST) 0));
+                    value_from_pointer (charstar, (LONGEST) 0));
   else
     {
       len = strlen (SYMBOL_NAME (traceframe_fun));
@@ -310,7 +310,7 @@ set_traceframe_context (trace_pc)
   if (traceframe_sal.symtab == NULL ||
       traceframe_sal.symtab->filename == NULL)
     set_internalvar (lookup_internalvar ("trace_file"),
-                    value_from_longest (charstar, (LONGEST) 0));
+                    value_from_pointer (charstar, (LONGEST) 0));
   else
     {
       len = strlen (traceframe_sal.symtab->filename);
@@ -499,7 +499,7 @@ tracepoints_info (tpnum_exp, from_tty)
        printf_filtered ("%s ",
                         local_hex_string_custom ((unsigned long) t->address,
                                                  "08l"));
-      printf_filtered ("%-5d %-5d ", t->pass_count, t->step_count);
+      printf_filtered ("%-5d %-5ld ", t->pass_count, t->step_count);
 
       if (t->source_file)
        {
@@ -556,6 +556,9 @@ tracepoint_operation (t, from_tty, opcode)
 {
   struct tracepoint *t2;
 
+  if (t == NULL)       /* no tracepoint operand */
+    return;
+
   switch (opcode)
     {
     case enable_op:
@@ -595,51 +598,47 @@ tracepoint_operation (t, from_tty, opcode)
     }
 }
 
-/* Utility: parse a tracepoint number and look it up in the list.  */
+/* Utility: parse a tracepoint number and look it up in the list.
+   If MULTI_P is true, there might be a range of tracepoints in ARG.
+   if OPTIONAL_P is true, then if the argument is missing, the most
+   recent tracepoint (tracepoint_count) is returned.  */
 struct tracepoint *
-get_tracepoint_by_number (arg)
+get_tracepoint_by_number (arg, multi_p, optional_p)
      char **arg;
+     int multi_p, optional_p;
 {
   struct tracepoint *t;
-  char *end, *copy;
-  value_ptr val;
   int tpnum;
+  char *instring = arg == NULL ? NULL : *arg;
 
-  if (arg == 0)
-    error ("Bad tracepoint argument");
-
-  if (*arg == 0 || **arg == 0) /* empty arg means refer to last tp */
-    tpnum = tracepoint_count;
-  else if (**arg == '$')       /* handle convenience variable */
+  if (arg == NULL || *arg == NULL || ! **arg)
     {
-      /* Make a copy of the name, so we can null-terminate it
-         to pass to lookup_internalvar().  */
-      end = *arg + 1;
-      while (isalnum ((int) *end) || *end == '_')
-       end++;
-      copy = (char *) alloca (end - *arg);
-      strncpy (copy, *arg + 1, (end - *arg - 1));
-      copy[end - *arg - 1] = '\0';
-      *arg = end;
-
-      val = value_of_internalvar (lookup_internalvar (copy));
-      if (TYPE_CODE (VALUE_TYPE (val)) != TYPE_CODE_INT)
-       error ("Convenience variable must have integral type.");
-      tpnum = (int) value_as_long (val);
+      if (optional_p)
+       tpnum = tracepoint_count;
+      else
+       error_no_arg ("tracepoint number");
     }
   else
-    /* handle tracepoint number */
+    tpnum = multi_p ? get_number_or_range (arg) : get_number (arg);
+
+  if (tpnum <= 0)
     {
-      tpnum = strtol (*arg, arg, 0);
-      if (tpnum == 0)          /* possible strtol failure */
-       while (**arg && !isspace ((int) **arg))
-         (*arg)++;             /* advance to next white space, if any */
+      if (instring && *instring)
+       printf_filtered ("bad tracepoint number at or near '%s'\n", instring);
+      else
+       printf_filtered ("Tracepoint argument missing and no previous tracepoint\n");
+      return NULL;
     }
+
   ALL_TRACEPOINTS (t)
     if (t->number == tpnum)
     {
       return t;
     }
+
+  /* FIXME: if we are in the middle of a range we don't want to give
+     a message.  The current interface to get_number_or_range doesn't
+     allow us to discover this.  */
   printf_unfiltered ("No tracepoint number %d.\n", tpnum);
   return NULL;
 }
@@ -660,9 +659,8 @@ map_args_over_tracepoints (args, from_tty, opcode)
     while (*args)
       {
        QUIT;                   /* give user option to bail out with ^C */
-       t = get_tracepoint_by_number (&args);
-       if (t)
-         tracepoint_operation (t, from_tty, opcode);
+       t = get_tracepoint_by_number (&args, 1, 0);
+       tracepoint_operation (t, from_tty, opcode);
        while (*args == ' ' || *args == '\t')
          args++;
       }
@@ -717,9 +715,10 @@ trace_pass_command (args, from_tty)
 {
   struct tracepoint *t1 = (struct tracepoint *) -1, *t2;
   unsigned int count;
+  int all = 0;
 
   if (args == 0 || *args == 0)
-    error ("PASS command requires an argument (count + optional TP num)");
+    error ("passcount command requires an argument (count + optional TP num)");
 
   count = strtoul (args, &args, 10);   /* count comes first, then TP num */
 
@@ -727,26 +726,34 @@ trace_pass_command (args, from_tty)
     args++;
 
   if (*args && strncasecmp (args, "all", 3) == 0)
-    args += 3;                 /* skip special argument "all" */
+    {
+      args += 3;                       /* skip special argument "all" */
+      all = 1;
+      if (*args)
+       error ("Junk at end of arguments.");
+    }
   else
-    t1 = get_tracepoint_by_number (&args);
+    t1 = get_tracepoint_by_number (&args, 1, 1);
 
-  if (*args)
-    error ("Junk at end of arguments.");
-
-  if (t1 == NULL)
-    return;                    /* error, bad tracepoint number */
-
-  ALL_TRACEPOINTS (t2)
-    if (t1 == (struct tracepoint *) -1 || t1 == t2)
+  do
     {
-      t2->pass_count = count;
-      if (modify_tracepoint_hook)
-       modify_tracepoint_hook (t2);
-      if (from_tty)
-       printf_filtered ("Setting tracepoint %d's passcount to %d\n",
-                        t2->number, count);
+      if (t1)
+       {
+         ALL_TRACEPOINTS (t2)
+           if (t1 == (struct tracepoint *) -1 || t1 == t2)
+             {
+               t2->pass_count = count;
+               if (modify_tracepoint_hook)
+                 modify_tracepoint_hook (t2);
+               if (from_tty)
+                 printf_filtered ("Setting tracepoint %d's passcount to %d\n",
+                                  t2->number, count);
+             }
+         if (! all && *args)
+           t1 = get_tracepoint_by_number (&args, 1, 0);
+       }
     }
+  while (*args);
 }
 
 /* ACTIONS functions: */
@@ -797,7 +804,7 @@ trace_actions_command (args, from_tty)
   char tmpbuf[128];
   char *end_msg = "End with a line saying just \"end\".";
 
-  t = get_tracepoint_by_number (&args);
+  t = get_tracepoint_by_number (&args, 0, 1);
   if (t)
     {
       sprintf (tmpbuf, "Enter actions for tracepoint %d, one per line.",
@@ -817,10 +824,9 @@ trace_actions_command (args, from_tty)
 
       if (readline_end_hook)
        (*readline_end_hook) ();
-
       /* tracepoints_changed () */
     }
-  /* else error, just return; */
+  /* else just return */
 }
 
 /* worker function */
@@ -971,8 +977,7 @@ validate_actionline (line, t)
              /* else fall thru, treat p as an expression and parse it! */
            }
          exp = parse_exp_1 (&p, block_for_pc (t->address), 1);
-         old_chain = make_cleanup ((make_cleanup_func) free_current_contents,
-                                   &exp);
+         old_chain = make_cleanup (free_current_contents, &exp);
 
          if (exp->elts[0].opcode == OP_VAR_VALUE)
            {
@@ -994,7 +999,7 @@ validate_actionline (line, t)
          /* 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 (t->address, exp);
-         (void) make_cleanup ((make_cleanup_func) free_agent_expr, aexpr);
+         make_cleanup_free_agent_expr (aexpr);
 
          if (aexpr->len > MAX_AGENT_EXPR_LEN)
            error ("expression too complicated, try simplifying");
@@ -1612,8 +1617,7 @@ encode_actions (t, tdp_actions, stepping_actions)
                    default:    /* full-fledged expression */
                      aexpr = gen_trace_for_expr (t->address, exp);
 
-                     old_chain1 = make_cleanup ((make_cleanup_func)
-                                                free_agent_expr, aexpr);
+                     old_chain1 = make_cleanup_free_agent_expr (aexpr);
 
                      ax_reqs (aexpr, &areqs);
                      if (areqs.flaw != agent_flaw_none)
@@ -1730,7 +1734,7 @@ remote_set_transparent_ranges (void)
   if (anysecs)
     {
       putpkt (target_buf);
-      getpkt (target_buf, 0);
+      getpkt (target_buf, sizeof (target_buf), 0);
     }
 }
 
@@ -1758,7 +1762,7 @@ trace_start_command (args, from_tty)
   if (target_is_remote ())
     {
       putpkt ("QTinit");
-      remote_get_noisy_reply (target_buf);
+      remote_get_noisy_reply (target_buf, sizeof (target_buf));
       if (strcmp (target_buf, "OK"))
        error ("Target does not support this command.");
 
@@ -1767,14 +1771,14 @@ trace_start_command (args, from_tty)
        char tmp[40];
 
        sprintf_vma (tmp, t->address);
-       sprintf (buf, "QTDP:%x:%s:%c:%x:%x", t->number, tmp, /* address */
+       sprintf (buf, "QTDP:%x:%s:%c:%lx:%x", t->number, tmp, /* address */
                 t->enabled == enabled ? 'E' : 'D',
                 t->step_count, t->pass_count);
 
        if (t->actions)
          strcat (buf, "-");
        putpkt (buf);
-       remote_get_noisy_reply (target_buf);
+       remote_get_noisy_reply (target_buf, sizeof (target_buf));
        if (strcmp (target_buf, "OK"))
          error ("Target does not support tracepoints.");
 
@@ -1798,7 +1802,7 @@ trace_start_command (args, from_tty)
                             ((tdp_actions[ndx + 1] || stepping_actions)
                              ? '-' : 0));
                    putpkt (buf);
-                   remote_get_noisy_reply (target_buf);
+                   remote_get_noisy_reply (target_buf, sizeof (target_buf));
                    if (strcmp (target_buf, "OK"))
                      error ("Error on target while setting tracepoints.");
                  }
@@ -1814,7 +1818,7 @@ trace_start_command (args, from_tty)
                             stepping_actions[ndx],
                             (stepping_actions[ndx + 1] ? "-" : ""));
                    putpkt (buf);
-                   remote_get_noisy_reply (target_buf);
+                   remote_get_noisy_reply (target_buf, sizeof (target_buf));
                    if (strcmp (target_buf, "OK"))
                      error ("Error on target while setting tracepoints.");
                  }
@@ -1827,7 +1831,7 @@ trace_start_command (args, from_tty)
       remote_set_transparent_ranges ();
       /* Now insert traps and begin collecting data */
       putpkt ("QTStart");
-      remote_get_noisy_reply (target_buf);
+      remote_get_noisy_reply (target_buf, sizeof (target_buf));
       if (strcmp (target_buf, "OK"))
        error ("Bogus reply from target: %s", target_buf);
       set_traceframe_num (-1); /* all old traceframes invalidated */
@@ -1851,7 +1855,7 @@ trace_stop_command (args, from_tty)
   if (target_is_remote ())
     {
       putpkt ("QTStop");
-      remote_get_noisy_reply (target_buf);
+      remote_get_noisy_reply (target_buf, sizeof (target_buf));
       if (strcmp (target_buf, "OK"))
        error ("Bogus reply from target: %s", target_buf);
       trace_running_p = 0;
@@ -1873,7 +1877,7 @@ trace_status_command (args, from_tty)
   if (target_is_remote ())
     {
       putpkt ("qTStatus");
-      remote_get_noisy_reply (target_buf);
+      remote_get_noisy_reply (target_buf, sizeof (target_buf));
 
       if (target_buf[0] != 'T' ||
          (target_buf[1] != '0' && target_buf[1] != '1'))
@@ -1888,9 +1892,9 @@ trace_status_command (args, from_tty)
 
 /* Worker function for the various flavors of the tfind command */
 static void
-finish_tfind_command (msg, from_tty)
-     char *msg;
-     int from_tty;
+finish_tfind_command (char *msg,
+                     long sizeof_msg,
+                     int from_tty)
 {
   int target_frameno = -1, target_tracept = -1;
   CORE_ADDR old_frame_addr;
@@ -1901,7 +1905,7 @@ finish_tfind_command (msg, from_tty)
   old_func = find_pc_function (read_pc ());
 
   putpkt (msg);
-  reply = remote_get_noisy_reply (msg);
+  reply = remote_get_noisy_reply (msg, sizeof_msg);
 
   while (reply && *reply)
     switch (*reply)
@@ -2045,7 +2049,7 @@ trace_find_command (args, from_tty)
        error ("invalid input (%d is less than zero)", frameno);
 
       sprintf (target_buf, "QTFrame:%x", frameno);
-      finish_tfind_command (target_buf, from_tty);
+      finish_tfind_command (target_buf, sizeof (target_buf), from_tty);
     }
   else
     error ("Trace can only be run on remote targets.");
@@ -2096,7 +2100,7 @@ trace_find_pc_command (args, from_tty)
 
       sprintf_vma (tmp, pc);
       sprintf (target_buf, "QTFrame:pc:%s", tmp);
-      finish_tfind_command (target_buf, from_tty);
+      finish_tfind_command (target_buf, sizeof (target_buf), from_tty);
     }
   else
     error ("Trace can only be run on remote targets.");
@@ -2121,7 +2125,7 @@ trace_find_tracepoint_command (args, from_tty)
        tdp = parse_and_eval_address (args);
 
       sprintf (target_buf, "QTFrame:tdp:%x", tdp);
-      finish_tfind_command (target_buf, from_tty);
+      finish_tfind_command (target_buf, sizeof (target_buf), from_tty);
     }
   else
     error ("Trace can only be run on remote targets.");
@@ -2217,7 +2221,7 @@ trace_find_line_command (args, from_tty)
        sprintf (target_buf, "QTFrame:range:%s:%s", startpc_str, endpc_str);
       else                     /* find OUTSIDE OF range of CURRENT line */
        sprintf (target_buf, "QTFrame:outside:%s:%s", startpc_str, endpc_str);
-      finish_tfind_command (target_buf, from_tty);
+      finish_tfind_command (target_buf, sizeof (target_buf), from_tty);
       do_cleanups (old_chain);
     }
   else
@@ -2259,7 +2263,7 @@ trace_find_range_command (args, 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, from_tty);
+      finish_tfind_command (target_buf, sizeof (target_buf), from_tty);
     }
   else
     error ("Trace can only be run on remote targets.");
@@ -2300,7 +2304,7 @@ trace_find_outside_command (args, 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, from_tty);
+      finish_tfind_command (target_buf, sizeof (target_buf), from_tty);
     }
   else
     error ("Trace can only be run on remote targets.");
This page took 0.029166 seconds and 4 git commands to generate.