aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Snyder <msnyder@vmware.com>1997-12-02 19:36:26 +0000
committerMichael Snyder <msnyder@vmware.com>1997-12-02 19:36:26 +0000
commit728c7f37daf6e8ebef11b7c58f7aac6ae54b8c91 (patch)
tree21402360b383a6f4057e5f2e102484d81ac88648
parent09888f155fde38cc08195d4b3baa3cedb4f32afc (diff)
downloadgdb-728c7f37daf6e8ebef11b7c58f7aac6ae54b8c91.zip
gdb-728c7f37daf6e8ebef11b7c58f7aac6ae54b8c91.tar.gz
gdb-728c7f37daf6e8ebef11b7c58f7aac6ae54b8c91.tar.bz2
Tue Dec 2 11:34:48 1997 Michael Snyder (msnyder@cleaver.cygnus.com)
* tracepoint.c: use "lookup_cmd" to parse actions commands (thus allowing unambiguous prefixes and aliases).
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/tracepoint.c83
2 files changed, 59 insertions, 29 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 08e29fd..e5807ec 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+Tue Dec 2 11:34:48 1997 Michael Snyder (msnyder@cleaver.cygnus.com)
+
+ * tracepoint.c: use "lookup_cmd" to parse actions commands
+ (thus allowing unambiguous prefixes and aliases).
+
Tue Dec 2 10:15:57 1997 Nick Clifton <nickc@cygnus.com>
* configure.tgt: Add support for Thumb target.
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c
index 0518f0f..2869e9c 100644
--- a/gdb/tracepoint.c
+++ b/gdb/tracepoint.c
@@ -99,7 +99,6 @@ static struct symtab_and_line traceframe_sal;
/* Tracing command lists */
static struct cmd_list_element *tfindlist;
-static struct cmd_list_element *tracelist;
/* ======= Important command functions: ======= */
static void trace_command PARAMS ((char *, int));
@@ -723,26 +722,28 @@ static char *parse_and_eval_memrange PARAMS ((char *,
long *));
/* The three functions:
- collect_pseudocom, while_stepping_pseudocom, and end_pseudocom
+ collect_pseudocommand,
+ while_stepping_pseudocommand, and
+ end_actions_pseudocommand
are placeholders for "commands" that are actually ONLY to be used
within a tracepoint action list. If the actual function is ever called,
it means that somebody issued the "command" at the top level,
which is always an error. */
static void
-end_pseudocom (args, from_tty)
+end_actions_pseudocommand (args, from_tty)
{
error ("This command cannot be used at the top level.");
}
static void
-while_stepping_pseudocom (args, from_tty)
+while_stepping_pseudocommand (args, from_tty)
{
error ("This command can only be used in a tracepoint actions list.");
}
static void
-collect_pseudocom (args, from_tty)
+collect_pseudocommand (args, from_tty)
{
error ("This command can only be used in a tracepoint actions list.");
}
@@ -870,9 +871,10 @@ validate_actionline (line, t)
char *line;
struct tracepoint *t;
{
- char *p;
+ struct cmd_list_element *c;
struct expression *exp;
value_ptr temp, temp2;
+ char *p;
for (p = line; isspace (*p); )
p++;
@@ -880,9 +882,16 @@ validate_actionline (line, t)
/* symbol lookup etc. */
if (*p == '\0') /* empty line: just prompt for another line. */
return BADLINE;
- else if (0 == strncasecmp (p, "collect", 7))
+
+ 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;
+ }
+
+ if (c->function.cfunc == collect_pseudocommand)
{
- p += 7;
do { /* repeat over a comma-separated list */
while (isspace (*p))
p++;
@@ -910,7 +919,7 @@ validate_actionline (line, t)
/*exp->elts[0].opcode != UNOP_CAST && */
exp->elts[0].opcode != OP_REGISTER)
{
- warning ("collect: enter variable name or register.\n");
+ warning ("collect requires a variable or register name.\n");
return BADLINE;
}
if (exp->elts[0].opcode == OP_VAR_VALUE)
@@ -931,11 +940,10 @@ validate_actionline (line, t)
} while (p && *p++ == ',');
return GENERIC;
}
- else if (0 == strncasecmp (p, "while-stepping", 14))
+ else if (c->function.cfunc == while_stepping_pseudocommand)
{
char *steparg; /* in case warning is necessary */
- p += 14;
while (isspace (*p))
p++;
steparg = p;
@@ -953,11 +961,11 @@ validate_actionline (line, t)
t->step_count = -1;
return STEPPING;
}
- else if (0 == strncasecmp (p, "end", 3))
+ else if (c->function.cfunc == end_actions_pseudocommand)
return END;
else
{
- warning ("'%s' is not a supported tracepoint action.", p);
+ warning ("'%s' is not a supported tracepoint action.", line);
return BADLINE;
}
}
@@ -1374,13 +1382,14 @@ encode_actions (t, tdp_actions, step_count, stepping_actions)
unsigned long *step_count;
char **stepping_actions;
{
- struct expression *exp;
static char tdp_buff[2048], step_buff[2048];
- struct action_line *action;
char *action_exp;
+ struct expression *exp;
+ struct action_line *action;
bfd_signed_vma offset;
long i;
- struct collection_list *collect;
+ struct collection_list *collect;
+ struct cmd_list_element *cmd;
clear_collection_list (&tracepoint_list);
clear_collection_list (&stepping_list);
@@ -1395,9 +1404,12 @@ encode_actions (t, tdp_actions, step_count, stepping_actions)
while (isspace (*action_exp))
action_exp++;
- if (0 == strncasecmp (action_exp, "collect", 7))
+ cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
+ if (cmd == 0)
+ error ("Bad action list item: %s", action_exp);
+
+ if (cmd->function.cfunc == collect_pseudocommand)
{
- action_exp = action_exp + 7;
do { /* repeat over a comma-separated list */
while (isspace (*action_exp))
action_exp++;
@@ -1469,11 +1481,11 @@ encode_actions (t, tdp_actions, step_count, stepping_actions)
}
} while (action_exp && *action_exp++ == ',');
}
- else if (0 == strncasecmp (action_exp, "while-stepping", 14))
+ else if (cmd->function.cfunc == while_stepping_pseudocommand)
{
collect = &stepping_list;
}
- else if (0 == strncasecmp (action_exp, "end", 3))
+ else if (cmd->function.cfunc == end_actions_pseudocommand)
{
if (collect == &stepping_list) /* end stepping actions */
collect = &tracepoint_list;
@@ -2052,14 +2064,19 @@ tracepoint_save_command (args, from_tty)
indent = i1;
for (line = tp->actions; line; line = line->next)
{
+ struct cmd_list_element *cmd;
+
actionline = line->action;
while (isspace(*actionline))
actionline++;
fprintf (fp, "%s%s\n", indent, actionline);
- if (0 == strncasecmp (actionline, "while-stepping", 14))
+ cmd = lookup_cmd (&actionline, cmdlist, "", -1, 1);
+ if (cmd == 0)
+ error ("Bad action list item: %s", actionline);
+ if (cmd->function.cfunc == while_stepping_pseudocommand)
indent = i2;
- else if (0 == strncasecmp (actionline, "end", 3))
+ else if (cmd->function.cfunc == end_actions_pseudocommand)
indent = i1;
}
}
@@ -2255,6 +2272,8 @@ trace_dump_command (args, from_tty)
for (action = t->actions; action; action = action->next)
{
+ struct cmd_list_element *cmd;
+
action_exp = action->action;
while (isspace (*action_exp))
action_exp++;
@@ -2262,11 +2281,15 @@ trace_dump_command (args, from_tty)
/* The collection actions to be done while stepping are
bracketed by the commands "while-stepping" and "end". */
- if (0 == strncasecmp (action_exp, "while-stepping", 14))
+ cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
+ if (cmd == 0)
+ error ("Bad action list item: %s", action_exp);
+
+ if (cmd->function.cfunc == while_stepping_pseudocommand)
stepping_actions = 1;
- else if (0 == strncasecmp (action_exp, "end", 3))
+ else if (cmd->function.cfunc == end_actions_pseudocommand)
stepping_actions = 0;
- else if (0 == strncasecmp (action_exp, "collect", 7))
+ else if (cmd->function.cfunc == collect_pseudocommand)
{
/* Display the collected data.
For the trap frame, display only what was collected at the trap.
@@ -2275,7 +2298,6 @@ trace_dump_command (args, from_tty)
STEPPING_FRAME and STEPPING_ACTIONS should be equal. */
if (stepping_frame == stepping_actions)
{
- action_exp += 7;
do { /* repeat over a comma-separated list */
QUIT;
if (*action_exp == ',')
@@ -2420,14 +2442,14 @@ The trace will end when the tracepoint has been passed 'count' times.\n\
Usage: passcount COUNT TPNUM, where TPNUM may also be \"all\";\n\
if TPNUM is omitted, passcount refers to the last tracepoint defined.");
- add_com ("end", class_trace, end_pseudocom,
+ add_com ("end", class_trace, end_actions_pseudocommand,
"Ends a list of commands or actions.\n\
Several GDB commands allow you to enter a list of commands or actions.\n\
Entering \"end\" on a line by itself is the normal way to terminate\n\
such a list.\n\n\
Note: the \"end\" command cannot be used at the gdb prompt.");
- add_com ("while-stepping", class_trace, while_stepping_pseudocom,
+ add_com ("while-stepping", class_trace, while_stepping_pseudocommand,
"Specify single-stepping behavior at a tracepoint.\n\
Argument is number of instructions to trace in single-step mode\n\
following the tracepoint. This command is normally followed by\n\
@@ -2435,7 +2457,10 @@ one or more \"collect\" commands, to specify what to collect\n\
while single-stepping.\n\n\
Note: this command can only be used in a tracepoint \"actions\" list.");
- add_com ("collect", class_trace, collect_pseudocom,
+ add_com_alias ("ws", "while-stepping", class_alias, 0);
+ add_com_alias ("stepping", "while-stepping", class_alias, 0);
+
+ add_com ("collect", class_trace, collect_pseudocommand,
"Specify one or more data items to be collected at a tracepoint.\n\
Accepts a comma-separated list of (one or more) arguments.\n\
Things that may be collected include registers, variables, plus\n\