]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
2010-04-01 Stan Shebs <stan@codesourcery.com>
authorStan Shebs <shebs@codesourcery.com>
Thu, 1 Apr 2010 22:57:25 +0000 (22:57 +0000)
committerStan Shebs <shebs@codesourcery.com>
Thu, 1 Apr 2010 22:57:25 +0000 (22:57 +0000)
    Nathan Sidwell  <nathan@codesourcery.com>

* tracepoint.h (enum actionline_type): Remove.
(validate_actionline): Change return to void.
* tracepoint.c (report_agent_reqs_errors): New function.
(validate_actionline): Call it, change return to void, report errors
more consistently.
(collect_symbol): Call report_agent_reqs_errors.
(encode_actions_1): Ditto.
(encode_actions): Don't expect a result from validate_actionline.

* gdb.trace/actions.exp: Tweak expected output.
* gdb.trace/while-stepping.exp: Tweak expected output.

gdb/ChangeLog
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.trace/actions.exp
gdb/testsuite/gdb.trace/while-stepping.exp
gdb/tracepoint.c
gdb/tracepoint.h

index 81ec47a4568918f4fbd12e4512ec3bc1e5bf39ef..087b57d025379b8bae4b521702a461e0a62e8da8 100644 (file)
@@ -1,3 +1,15 @@
+2010-04-01  Stan Shebs  <stan@codesourcery.com>
+           Nathan Sidwell  <nathan@codesourcery.com>
+
+       * tracepoint.h (enum actionline_type): Remove.
+       (validate_actionline): Change return to void.
+       * tracepoint.c (report_agent_reqs_errors): New function.
+       (validate_actionline): Call it, change return to void, report errors
+       more consistently.
+       (collect_symbol): Call report_agent_reqs_errors.
+       (encode_actions_1): Ditto.
+       (encode_actions): Don't expect a result from validate_actionline.
+
 2010-04-01  Stan Shebs  <stan@codesourcery.com>
 
        * tracepoint.c (trace_start_command): Confirm if trace is running.
index c16e6726a8fa5ca43716186d20aa305a98092f1d..6d7844880571711acdd5de5427f2b16871b66a77 100644 (file)
@@ -1,3 +1,8 @@
+2010-04-01  Stan Shebs  <stan@codesourcery.com>
+
+       * gdb.trace/actions.exp: Tweak expected output.
+       * gdb.trace/while-stepping.exp: Tweak expected output.
+
 2010-04-01  H.J. Lu  <hongjiu.lu@intel.com>
 
        * gdb.arch/amd64-byte.exp: Check "ah", "bh", "ch", "dh".
index 4bdf3e4277eb1d0eb65b11ac1093202141847d33..b6747f078580723d84822c8386440fe084de09f8 100644 (file)
@@ -175,7 +175,7 @@ gdb_test "actions [expr $trcpt2 + $trcpt3]" \
 gdb_trace_setactions "5.7: invalid action" \
        "$trcpt1" \
        "print gdb_c_test" \
-       "'print gdb_c_test' is not a supported tracepoint action"
+       "`print gdb_c_test' is not a supported tracepoint action"
 
 # 5.8 help actions (collect, while-stepping, end)
 
index 228f66ab9cd329ca00f8be6489e439a00bae97d9..db0f91f1cfe4caddefa1fa9e81ae79af85eac85e 100644 (file)
@@ -82,7 +82,7 @@ proc while_stepping_bogus_arg { bogus msgstring } {
 
     gdb_trace_setactions "$msgstring" \
            "" \
-           "while-stepping $bogus" ".*bad step-count"
+           "while-stepping $bogus" ".*while-stepping step count"
 }
 
 # 5.14 while-stepping (no argument)
index 14fcbc58fef5b6537f3f3e8febb2a5162e9bffe9..d7c9bfde00f1719115221b6f2df7f0cf19de6027 100644 (file)
@@ -554,8 +554,35 @@ trace_actions_command (char *args, int from_tty)
   /* else just return */
 }
 
+/* Report the results of checking the agent expression, as errors or
+   internal errors.  */
+
+static void
+report_agent_reqs_errors (struct agent_expr *aexpr, struct agent_reqs *areqs)
+{
+  /* All of the "flaws" are serious bytecode generation issues that
+     should never occur.  */
+  if (areqs->flaw != agent_flaw_none)
+    internal_error (__FILE__, __LINE__, _("expression is malformed"));
+
+  /* If analysis shows a stack underflow, GDB must have done something
+     badly wrong in its bytecode generation.  */
+  if (areqs->min_height < 0)
+    internal_error (__FILE__, __LINE__,
+                   _("expression has min height < 0"));
+
+  /* Issue this error if the stack is predicted to get too deep.  The
+     limit is rather arbitrary; a better scheme might be for the
+     target to report how much stack it will have available.  The
+     depth roughly corresponds to parenthesization, so a limit of 20
+     amounts to 20 levels of expression nesting, which is actually
+     a pretty big hairy expression.  */
+  if (areqs->max_height > 20)
+    error (_("Expression is too complicated."));
+}
+
 /* worker function */
-enum actionline_type
+void
 validate_actionline (char **line, struct breakpoint *t)
 {
   struct cmd_list_element *c;
@@ -563,34 +590,29 @@ validate_actionline (char **line, struct breakpoint *t)
   struct cleanup *old_chain = NULL;
   char *p, *tmp_p;
   struct bp_location *loc;
+  struct agent_expr *aexpr;
+  struct agent_reqs areqs;
 
   /* if EOF is typed, *line is NULL */
   if (*line == NULL)
-    return END;
+    return;
 
   for (p = *line; isspace ((int) *p);)
     p++;
 
   /* Symbol lookup etc.  */
   if (*p == '\0')      /* empty line: just prompt for another line.  */
-    return BADLINE;
+    return;
 
   if (*p == '#')               /* comment line */
-    return GENERIC;
+    return;
 
   c = lookup_cmd (&p, cmdlist, "", -1, 1);
   if (c == 0)
-    {
-      warning (_("'%s' is not an action that I know, or is ambiguous."), 
-              p);
-      return BADLINE;
-    }
+    error (_("`%s' is not a tracepoint action, or is ambiguous."), p);
 
   if (cmd_cfunc_eq (c, collect_pseudocommand))
     {
-      struct agent_expr *aexpr;
-      struct agent_reqs areqs;
-
       do
        {                       /* repeat over a comma-separated list */
          QUIT;                 /* allow user to bail out with ^C */
@@ -619,16 +641,14 @@ validate_actionline (char **line, struct breakpoint *t)
                {
                  if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
                    {
-                     warning (_("constant %s (value %ld) will not be collected."),
-                              SYMBOL_PRINT_NAME (exp->elts[2].symbol),
-                              SYMBOL_VALUE (exp->elts[2].symbol));
-                     return BADLINE;
+                     error (_("constant `%s' (value %ld) will not be collected."),
+                            SYMBOL_PRINT_NAME (exp->elts[2].symbol),
+                            SYMBOL_VALUE (exp->elts[2].symbol));
                    }
                  else if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_OPTIMIZED_OUT)
                    {
-                     warning (_("%s is optimized away and cannot be collected."),
-                              SYMBOL_PRINT_NAME (exp->elts[2].symbol));
-                     return BADLINE;
+                     error (_("`%s' is optimized away and cannot be collected."),
+                            SYMBOL_PRINT_NAME (exp->elts[2].symbol));
                    }
                }
 
@@ -639,30 +659,21 @@ validate_actionline (char **line, struct breakpoint *t)
              make_cleanup_free_agent_expr (aexpr);
 
              if (aexpr->len > MAX_AGENT_EXPR_LEN)
-               error (_("expression too complicated, try simplifying"));
+               error (_("Expression is too complicated."));
 
              ax_reqs (aexpr, &areqs);
              (void) make_cleanup (xfree, areqs.reg_mask);
 
-             if (areqs.flaw != agent_flaw_none)
-               error (_("malformed expression"));
-
-             if (areqs.min_height < 0)
-               error (_("gdb: Internal error: expression has min height < 0"));
-
-             if (areqs.max_height > 20)
-               error (_("expression too complicated, try simplifying"));
+             report_agent_reqs_errors (aexpr, &areqs);
 
              do_cleanups (old_chain);
            }
        }
       while (p && *p++ == ',');
-      return GENERIC;
     }
+
   else if (cmd_cfunc_eq (c, teval_pseudocommand))
     {
-      struct agent_expr *aexpr;
-
       do
        {                       /* repeat over a comma-separated list */
          QUIT;                 /* allow user to bail out with ^C */
@@ -684,14 +695,19 @@ validate_actionline (char **line, struct breakpoint *t)
              make_cleanup_free_agent_expr (aexpr);
 
              if (aexpr->len > MAX_AGENT_EXPR_LEN)
-               error (_("expression too complicated, try simplifying"));
+               error (_("Expression is too complicated."));
+
+             ax_reqs (aexpr, &areqs);
+             (void) make_cleanup (xfree, areqs.reg_mask);
+
+             report_agent_reqs_errors (aexpr, &areqs);
 
              do_cleanups (old_chain);
            }
        }
       while (p && *p++ == ',');
-      return GENERIC;
     }
+
   else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
     {
       char *steparg;           /* in case warning is necessary */
@@ -700,19 +716,15 @@ validate_actionline (char **line, struct breakpoint *t)
        p++;
       steparg = p;
 
-      if (*p == '\0' ||
-         (t->step_count = strtol (p, &p, 0)) == 0)
-       {
-         error (_("'%s': bad step-count."), *line);
-       }
-      return STEPPING;
+      if (*p == '\0' || (t->step_count = strtol (p, &p, 0)) == 0)
+       error (_("while-stepping step count `%s' is malformed."), *line);
     }
+
   else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
-    return END;
+    ;
+
   else
-    {
-      error (_("'%s' is not a supported tracepoint action."), *line);
-    }
+    error (_("`%s' is not a supported tracepoint action."), *line);
 }
 
 enum {
@@ -977,13 +989,8 @@ collect_symbol (struct collection_list *collect,
       old_chain1 = make_cleanup_free_agent_expr (aexpr);
 
       ax_reqs (aexpr, &areqs);
-      if (areqs.flaw != agent_flaw_none)
-       error (_("malformed expression"));
-      
-      if (areqs.min_height < 0)
-       error (_("gdb: Internal error: expression has min height < 0"));
-      if (areqs.max_height > 20)
-       error (_("expression too complicated, try simplifying"));
+
+      report_agent_reqs_errors (aexpr, &areqs);
 
       discard_cleanups (old_chain1);
       add_aexpr (collect, aexpr);
@@ -1325,13 +1332,8 @@ encode_actions_1 (struct command_line *action,
                      old_chain1 = make_cleanup_free_agent_expr (aexpr);
 
                      ax_reqs (aexpr, &areqs);
-                     if (areqs.flaw != agent_flaw_none)
-                       error (_("malformed expression"));
 
-                     if (areqs.min_height < 0)
-                       error (_("gdb: Internal error: expression has min height < 0"));
-                     if (areqs.max_height > 20)
-                       error (_("expression too complicated, try simplifying"));
+                     report_agent_reqs_errors (aexpr, &areqs);
 
                      discard_cleanups (old_chain1);
                      add_aexpr (collect, aexpr);
@@ -1385,13 +1387,8 @@ encode_actions_1 (struct command_line *action,
                  old_chain1 = make_cleanup_free_agent_expr (aexpr);
 
                  ax_reqs (aexpr, &areqs);
-                 if (areqs.flaw != agent_flaw_none)
-                   error (_("malformed expression"));
 
-                 if (areqs.min_height < 0)
-                   error (_("gdb: Internal error: expression has min height < 0"));
-                 if (areqs.max_height > 20)
-                   error (_("expression too complicated, try simplifying"));
+                 report_agent_reqs_errors (aexpr, &areqs);
 
                  discard_cleanups (old_chain1);
                  /* Even though we're not officially collecting, add
@@ -1452,21 +1449,18 @@ encode_actions (struct breakpoint *t, struct bp_location *tloc,
   if (*default_collect)
     {
       char *line;
-      enum actionline_type linetype;
 
       default_collect_line =  xstrprintf ("collect %s", default_collect);
       make_cleanup (xfree, default_collect_line);
 
       line = default_collect_line;
-      linetype = validate_actionline (&line, t);
-      if (linetype != BADLINE)
-       {
-         default_collect_action = xmalloc (sizeof (struct command_line));
-         make_cleanup (xfree, default_collect_action);
-         default_collect_action->next = t->commands->commands;
-         default_collect_action->line = line;
-         actions = default_collect_action;
-       }
+      validate_actionline (&line, t);
+
+      default_collect_action = xmalloc (sizeof (struct command_line));
+      make_cleanup (xfree, default_collect_action);
+      default_collect_action->next = t->commands->commands;
+      default_collect_action->line = line;
+      actions = default_collect_action;
     }
   encode_actions_1 (actions, t, tloc, frame_reg, frame_offset,
                    &tracepoint_list, &stepping_list);
index ba9ae810fe825ed195f22c3e65c195d3a7e33c15..dd16dcf79029eb8135e4fb6334aa9e5ef4134783 100644 (file)
 #include "breakpoint.h"
 #include "target.h"
 
-enum actionline_type
-  {
-    BADLINE = -1,
-    GENERIC = 0,
-    END = 1,
-    STEPPING = 2
-  };
-
 /* A trace state variable is a value managed by a target being
    traced. A trace state variable (or tsv for short) can be accessed
    and assigned to by tracepoint actions and conditionals, but is not
@@ -176,7 +168,7 @@ void set_traceframe_number (int);
 struct cleanup *make_cleanup_restore_current_traceframe (void);
 
 void free_actions (struct breakpoint *);
-enum actionline_type validate_actionline (char **, struct breakpoint *);
+extern void validate_actionline (char **, struct breakpoint *);
 
 extern void end_actions_pseudocommand (char *args, int from_tty);
 extern void while_stepping_pseudocommand (char *args, int from_tty);