From fff87407d4ea0de87abbb3d0a5383acb6b07e6f1 Mon Sep 17 00:00:00 2001 From: Stan Shebs Date: Thu, 1 Apr 2010 22:57:25 +0000 Subject: [PATCH] 2010-04-01 Stan Shebs Nathan Sidwell * 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 | 12 ++ gdb/testsuite/ChangeLog | 5 + gdb/testsuite/gdb.trace/actions.exp | 2 +- gdb/testsuite/gdb.trace/while-stepping.exp | 2 +- gdb/tracepoint.c | 138 ++++++++++----------- gdb/tracepoint.h | 10 +- 6 files changed, 86 insertions(+), 83 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 81ec47a456..087b57d025 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2010-04-01 Stan Shebs + Nathan Sidwell + + * 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 * tracepoint.c (trace_start_command): Confirm if trace is running. diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index c16e6726a8..6d78448805 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-04-01 Stan Shebs + + * gdb.trace/actions.exp: Tweak expected output. + * gdb.trace/while-stepping.exp: Tweak expected output. + 2010-04-01 H.J. Lu * gdb.arch/amd64-byte.exp: Check "ah", "bh", "ch", "dh". diff --git a/gdb/testsuite/gdb.trace/actions.exp b/gdb/testsuite/gdb.trace/actions.exp index 4bdf3e4277..b6747f0785 100644 --- a/gdb/testsuite/gdb.trace/actions.exp +++ b/gdb/testsuite/gdb.trace/actions.exp @@ -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) diff --git a/gdb/testsuite/gdb.trace/while-stepping.exp b/gdb/testsuite/gdb.trace/while-stepping.exp index 228f66ab9c..db0f91f1cf 100644 --- a/gdb/testsuite/gdb.trace/while-stepping.exp +++ b/gdb/testsuite/gdb.trace/while-stepping.exp @@ -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) diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 14fcbc58fe..d7c9bfde00 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -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); diff --git a/gdb/tracepoint.h b/gdb/tracepoint.h index ba9ae810fe..dd16dcf790 100644 --- a/gdb/tracepoint.h +++ b/gdb/tracepoint.h @@ -23,14 +23,6 @@ #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);