diff options
Diffstat (limited to 'gdb/tracepoint.c')
-rw-r--r-- | gdb/tracepoint.c | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 66533f7..9a2425b 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -612,10 +612,12 @@ teval_pseudocommand (char *args, int from_tty) /* Parse any collection options, such as /s for strings. */ const char * -decode_agent_options (const char *exp) +decode_agent_options (const char *exp, int *trace_string) { struct value_print_options opts; + *trace_string = 0; + if (*exp != '/') return exp; @@ -631,10 +633,10 @@ decode_agent_options (const char *exp) /* Allow an optional decimal number giving an explicit maximum string length, defaulting it to the "print elements" value; so "collect/s80 mystr" gets at most 80 bytes of string. */ - trace_string_kludge = opts.print_max; + *trace_string = opts.print_max; exp++; if (*exp >= '0' && *exp <= '9') - trace_string_kludge = atoi (exp); + *trace_string = atoi (exp); while (*exp >= '0' && *exp <= '9') exp++; } @@ -731,9 +733,10 @@ validate_actionline (const char *line, struct breakpoint *b) if (cmd_cfunc_eq (c, collect_pseudocommand)) { - trace_string_kludge = 0; + int trace_string = 0; + if (*p == '/') - p = decode_agent_options (p); + p = decode_agent_options (p, &trace_string); do { /* Repeat over a comma-separated list. */ @@ -782,7 +785,7 @@ validate_actionline (const char *line, struct breakpoint *b) /* 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 (loc->address, exp); + aexpr = gen_trace_for_expr (loc->address, exp, trace_string); make_cleanup_free_agent_expr (aexpr); if (aexpr->len > MAX_AGENT_EXPR_LEN) @@ -989,7 +992,8 @@ collect_symbol (struct collection_list *collect, struct symbol *sym, struct gdbarch *gdbarch, long frame_regno, long frame_offset, - CORE_ADDR scope) + CORE_ADDR scope, + int trace_string) { unsigned long len; unsigned int reg; @@ -1100,7 +1104,7 @@ collect_symbol (struct collection_list *collect, struct agent_expr *aexpr; struct cleanup *old_chain1 = NULL; - aexpr = gen_trace_for_var (scope, gdbarch, sym); + aexpr = gen_trace_for_var (scope, gdbarch, sym, trace_string); /* It can happen that the symbol is recorded as a computed location, but it's been optimized away and doesn't actually @@ -1153,6 +1157,7 @@ struct add_local_symbols_data long frame_regno; long frame_offset; int count; + int trace_string; }; /* The callback for the locals and args iterators. */ @@ -1165,7 +1170,7 @@ do_collect_symbol (const char *print_name, struct add_local_symbols_data *p = cb_data; collect_symbol (p->collect, sym, p->gdbarch, p->frame_regno, - p->frame_offset, p->pc); + p->frame_offset, p->pc, p->trace_string); p->count++; } @@ -1173,7 +1178,8 @@ do_collect_symbol (const char *print_name, static void add_local_symbols (struct collection_list *collect, struct gdbarch *gdbarch, CORE_ADDR pc, - long frame_regno, long frame_offset, int type) + long frame_regno, long frame_offset, int type, + int trace_string) { struct block *block; struct add_local_symbols_data cb_data; @@ -1184,6 +1190,7 @@ add_local_symbols (struct collection_list *collect, cb_data.frame_regno = frame_regno; cb_data.frame_offset = frame_offset; cb_data.count = 0; + cb_data.trace_string = trace_string; if (type == 'L') { @@ -1391,9 +1398,10 @@ encode_actions_1 (struct command_line *action, if (cmd_cfunc_eq (cmd, collect_pseudocommand)) { - trace_string_kludge = 0; + int trace_string = 0; + if (*action_exp == '/') - action_exp = decode_agent_options (action_exp); + action_exp = decode_agent_options (action_exp, &trace_string); do { /* Repeat over a comma-separated list. */ @@ -1413,7 +1421,8 @@ encode_actions_1 (struct command_line *action, tloc->address, frame_reg, frame_offset, - 'A'); + 'A', + trace_string); action_exp = strchr (action_exp, ','); /* more? */ } else if (0 == strncasecmp ("$loc", action_exp, 4)) @@ -1423,7 +1432,8 @@ encode_actions_1 (struct command_line *action, tloc->address, frame_reg, frame_offset, - 'L'); + 'L', + trace_string); action_exp = strchr (action_exp, ','); /* more? */ } else if (0 == strncasecmp ("$_ret", action_exp, 5)) @@ -1431,7 +1441,8 @@ encode_actions_1 (struct command_line *action, struct cleanup *old_chain1 = NULL; aexpr = gen_trace_for_return_address (tloc->address, - tloc->gdbarch); + tloc->gdbarch, + trace_string); old_chain1 = make_cleanup_free_agent_expr (aexpr); @@ -1512,11 +1523,13 @@ encode_actions_1 (struct command_line *action, tloc->gdbarch, frame_reg, frame_offset, - tloc->address); + tloc->address, + trace_string); break; default: /* Full-fledged expression. */ - aexpr = gen_trace_for_expr (tloc->address, exp); + aexpr = gen_trace_for_expr (tloc->address, exp, + trace_string); old_chain1 = make_cleanup_free_agent_expr (aexpr); @@ -2846,9 +2859,10 @@ trace_dump_actions (struct command_line *action, char *cmd = NULL; struct cleanup *old_chain = make_cleanup (free_current_contents, &cmd); + int trace_string = 0; if (*action_exp == '/') - action_exp = decode_agent_options (action_exp); + action_exp = decode_agent_options (action_exp, &trace_string); do { /* Repeat over a comma-separated list. */ |