* tracepoint.h (decode_agent_options): Add 'trace_string'

argument.
	* tracepoint.c (decode_agent_options): Add 'trace_string'
	argument.
	(validate_actionline): Update.
	(collect_symbol): Add 'trace_string' argument.
	(struct add_local_symbols_data) <trace_string>: New field.
	(do_collect_symbol): Update.
	(add_local_symbols): Add 'trace_string' argument.
	(encode_actions_1): Update.
	(trace_dump_actions): Update.
	* dwarf2loc.c (access_memory): Update.
	* ax.h (struct agent_expr) <tracing, trace_string>: New fields.
	* ax-general.c (new_agent_expr): Update.
	* ax-gdb.h (gen_trace_for_expr, gen_trace_for_var)
	(gen_trace_for_return_address): Add argument.
	(trace_kludge, trace_string_kludge): Remove.
	* ax-gdb.c (trace_kludge, trace_string_kludge): Remove.
	(gen_traced_pop, gen_fetch, gen_bitfield_ref, gen_expr): Update.
	(gen_trace_for_var): Add 'trace_string' argument.
	(gen_trace_for_expr, gen_trace_for_return_address): Likewise.
	(gen_printf, agent_eval_command_one): Update.
This commit is contained in:
Tom Tromey 2013-03-21 16:09:27 +00:00
parent 81f5558e3d
commit 92bc6a2064
8 changed files with 120 additions and 82 deletions

View file

@ -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. */