20000-05-18 H.J. Lu (hjl@gnu.org)
[binutils-gdb.git] / gdb / tracepoint.c
index 5b03a6c24a1b2f091ada1369466241a61662f7c1..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)
        {
@@ -599,23 +599,34 @@ tracepoint_operation (t, from_tty, opcode)
 }
 
 /* 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 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, multi_p)
+get_tracepoint_by_number (arg, multi_p, optional_p)
      char **arg;
-     int multi_p;
+     int multi_p, optional_p;
 {
   struct tracepoint *t;
-  char *instring = *arg;
   int tpnum;
+  char *instring = arg == NULL ? NULL : *arg;
 
-  if (arg == NULL)
-    error_no_arg ("tracepoint number");
+  if (arg == NULL || *arg == NULL || ! **arg)
+    {
+      if (optional_p)
+       tpnum = tracepoint_count;
+      else
+       error_no_arg ("tracepoint number");
+    }
+  else
+    tpnum = multi_p ? get_number_or_range (arg) : get_number (arg);
 
-  tpnum = multi_p ? get_number_or_range (arg) : get_number (arg);
   if (tpnum <= 0)
     {
-      printf_filtered ("bad tracepoint number at or near '%s'\n", instring);
+      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;
     }
 
@@ -648,7 +659,7 @@ 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, 1);
+       t = get_tracepoint_by_number (&args, 1, 0);
        tracepoint_operation (t, from_tty, opcode);
        while (*args == ' ' || *args == '\t')
          args++;
@@ -707,7 +718,7 @@ trace_pass_command (args, from_tty)
   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 */
 
@@ -722,7 +733,7 @@ trace_pass_command (args, from_tty)
        error ("Junk at end of arguments.");
     }
   else
-    t1 = get_tracepoint_by_number (&args, 1);
+    t1 = get_tracepoint_by_number (&args, 1, 1);
 
   do
     {
@@ -738,9 +749,9 @@ trace_pass_command (args, 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);
        }
-      if (! all)
-       t1 = get_tracepoint_by_number (&args, 1);
     }
   while (*args);
 }
@@ -793,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, 0);
+  t = get_tracepoint_by_number (&args, 0, 1);
   if (t)
     {
       sprintf (tmpbuf, "Enter actions for tracepoint %d, one per line.",
@@ -966,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)
            {
@@ -989,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");
@@ -1607,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)
@@ -1725,7 +1734,7 @@ remote_set_transparent_ranges (void)
   if (anysecs)
     {
       putpkt (target_buf);
-      getpkt (target_buf, 0);
+      getpkt (target_buf, sizeof (target_buf), 0);
     }
 }
 
@@ -1753,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.");
 
@@ -1762,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.");
 
@@ -1793,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.");
                  }
@@ -1809,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.");
                  }
@@ -1822,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 */
@@ -1846,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;
@@ -1868,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'))
@@ -1883,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;
@@ -1896,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)
@@ -2040,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.");
@@ -2091,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.");
@@ -2116,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.");
@@ -2212,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
@@ -2254,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.");
@@ -2295,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.");