diff options
author | Stan Shebs <shebs@codesourcery.com> | 2010-03-29 23:45:06 +0000 |
---|---|---|
committer | Stan Shebs <shebs@codesourcery.com> | 2010-03-29 23:45:06 +0000 |
commit | 409873ef5c8a7aefdf9fe2fbb83e87ade071be27 (patch) | |
tree | e888cd070ef3be76fddeeba7fa0cdf3dba847d0a /gdb/breakpoint.c | |
parent | 2aab228b95db7a8ae3864297c9596a359893f1ec (diff) | |
download | gdb-409873ef5c8a7aefdf9fe2fbb83e87ade071be27.zip gdb-409873ef5c8a7aefdf9fe2fbb83e87ade071be27.tar.gz gdb-409873ef5c8a7aefdf9fe2fbb83e87ade071be27.tar.bz2 |
2010-03-29 Stan Shebs <stan@codesourcery.com>
* tracepoint.h (struct uploaded_string): New struct.
(struct uploaded_tp): New fields for source strings.
* breakpoint.c (this_utp, next_cmd): New globals.
(read_uploaded_action): New function.
(create_tracepoint_from_upload): Fill in more parts
of a tracepoint.
* tracepoint.c (encode_source_string): New function.
(trace_save): Write out source strings, fix error checks.
(parse_tracepoint_definition): Add source string parsing.
* remote.c (PACKET_TracepointSource): New packet type.
(remote_download_command_source): New function.
(remote_download_tracepoint): Download source pieces also.
(_initialize_remote): Add packet config command.
* gdb.texinfo (Tracepoint Packets): Describe QTDPsrc.
(General Query Packets): Describe TracepointSource.
Diffstat (limited to 'gdb/breakpoint.c')
-rw-r--r-- | gdb/breakpoint.c | 75 |
1 files changed, 58 insertions, 17 deletions
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index e9fb71e..2bded96 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -10305,6 +10305,26 @@ ftrace_command (char *arg, int from_tty) set_tracepoint_count (breakpoint_count); } +/* Set up a fake reader function that gets command lines from a linked + list that was acquired during tracepoint uploading. */ + +static struct uploaded_tp *this_utp; +static struct uploaded_string *next_cmd; + +static char * +read_uploaded_action (void) +{ + char *rslt; + + if (!next_cmd) + return NULL; + + rslt = next_cmd->str; + next_cmd = next_cmd->next; + + return rslt; +} + /* Given information about a tracepoint as recorded on a target (which can be either a live system or a trace file), attempt to create an equivalent GDB tracepoint. This is not a reliable process, since @@ -10314,15 +10334,31 @@ ftrace_command (char *arg, int from_tty) struct breakpoint * create_tracepoint_from_upload (struct uploaded_tp *utp) { - char buf[100]; + char *addr_str, small_buf[100]; struct breakpoint *tp; - /* In the absence of a source location, fall back to raw address. */ - sprintf (buf, "*%s", paddress (get_current_arch(), utp->addr)); + if (utp->at_string) + addr_str = utp->at_string; + else + { + /* In the absence of a source location, fall back to raw + address. Since there is no way to confirm that the address + means the same thing as when the trace was started, warn the + user. */ + warning (_("Uploaded tracepoint %d has no source location, using raw address"), + utp->number); + sprintf (small_buf, "*%s", hex_string (utp->addr)); + addr_str = small_buf; + } + + /* There's not much we can do with a sequence of bytecodes. */ + if (utp->cond && !utp->cond_string) + warning (_("Uploaded tracepoint %d condition has no source form, ignoring it"), + utp->number); if (!create_breakpoint (get_current_arch (), - buf, - NULL, 0, 1 /* parse arg */, + addr_str, + utp->cond_string, -1, 0 /* parse cond/thread */, 0 /* tempflag */, (utp->type == bp_fast_tracepoint) /* hardwareflag */, 1 /* traceflag */, @@ -10335,30 +10371,35 @@ create_tracepoint_from_upload (struct uploaded_tp *utp) set_tracepoint_count (breakpoint_count); + /* Get the tracepoint we just created. */ tp = get_tracepoint (tracepoint_count); gdb_assert (tp != NULL); if (utp->pass > 0) { - sprintf (buf, "%d %d", utp->pass, tp->number); + sprintf (small_buf, "%d %d", utp->pass, tp->number); - trace_pass_command (buf, 0); + trace_pass_command (small_buf, 0); } - if (utp->cond) + /* If we have uploaded versions of the original commands, set up a + special-purpose "reader" function and call the usual command line + reader, then pass the result to the breakpoint command-setting + function. */ + if (utp->cmd_strings) { - printf_filtered ("Want to restore a condition\n"); - } + struct command_line *cmd_list; - if (utp->numactions > 0) - { - printf_filtered ("Want to restore action list\n"); - } + this_utp = utp; + next_cmd = utp->cmd_strings; - if (utp->num_step_actions > 0) - { - printf_filtered ("Want to restore action list\n"); + cmd_list = read_command_lines_1 (read_uploaded_action, 1, NULL, NULL); + + breakpoint_set_commands (tp, cmd_list); } + else if (utp->numactions > 0 || utp->num_step_actions > 0) + warning (_("Uploaded tracepoint %d actions have no source form, ignoring them"), + utp->number); return tp; } |