Fri Jul 24 14:41:19 1998 Michael Snyder <msnyder@cleaver.cygnus.com>

* tracepoint.c (encode_actions): Treat register names and simple
        variable names as special cases and don't convert them to byte-
        codes: these things can be collected far more efficiently
        without invoking the bytecode interpreter.
This commit is contained in:
Michael Snyder 1998-07-24 21:44:14 +00:00
parent 7210606cf0
commit 8d6476c711
2 changed files with 62 additions and 33 deletions

View File

@ -1,3 +1,10 @@
Fri Jul 24 14:41:19 1998 Michael Snyder <msnyder@cleaver.cygnus.com>
* tracepoint.c (encode_actions): Treat register names and simple
variable names as special cases and don't convert them to byte-
codes: these things can be collected far more efficiently
without invoking the bytecode interpreter.
Fri Jul 24 13:32:46 1998 Mark Alexander <marka@cygnus.com>
* config/i386/tm-i386.h (STORE_STRUCT_RETURN): Make it

View File

@ -1517,48 +1517,70 @@ encode_actions (t, tdp_actions, stepping_actions)
struct agent_reqs areqs;
exp = parse_exp_1 (&action_exp, block_for_pc (t->address), 1);
old_chain = make_cleanup (free_current_contents, &exp);
aexpr = gen_trace_for_expr (exp);
switch (exp->elts[0].opcode) {
case OP_REGISTER:
i = exp->elts[1].longconst;
if (info_verbose)
printf_filtered ("OP_REGISTER: ");
add_register (collect, i);
break;
old_chain1 = make_cleanup (free_agent_expr, aexpr);
case UNOP_MEMVAL:
/* safe because we know it's a simple expression */
tempval = evaluate_expression (exp);
addr = VALUE_ADDRESS (tempval) + VALUE_OFFSET (tempval);
len = TYPE_LENGTH (check_typedef (exp->elts[1].type));
add_memrange (collect, -1, addr, len);
break;
ax_reqs (aexpr, &areqs);
if (areqs.flaw != agent_flaw_none)
error ("malformed expression");
case OP_VAR_VALUE:
collect_symbol (collect, exp->elts[2].symbol);
break;
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");
default: /* full-fledged expression */
aexpr = gen_trace_for_expr (exp);
discard_cleanups (old_chain1);
add_aexpr (collect, aexpr);
old_chain1 = make_cleanup (free_agent_expr, aexpr);
/* take care of the registers */
if (areqs.reg_mask_len > 0)
{
int ndx1;
int ndx2;
ax_reqs (aexpr, &areqs);
if (areqs.flaw != agent_flaw_none)
error ("malformed expression");
for (ndx1 = 0; ndx1 < areqs.reg_mask_len; ndx1++)
{
QUIT; /* allow user to bail out with ^C */
if (areqs.reg_mask[ndx1] != 0)
{
/* assume chars have 8 bits */
for (ndx2 = 0; ndx2 < 8; ndx2++)
if (areqs.reg_mask[ndx1] & (1 << ndx2))
/* it's used -- record it */
add_register (collect, ndx1 * 8 + ndx2);
}
}
}
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");
discard_cleanups (old_chain1);
add_aexpr (collect, aexpr);
/* take care of the registers */
if (areqs.reg_mask_len > 0)
{
int ndx1;
int ndx2;
for (ndx1 = 0; ndx1 < areqs.reg_mask_len; ndx1++)
{
QUIT; /* allow user to bail out with ^C */
if (areqs.reg_mask[ndx1] != 0)
{
/* assume chars have 8 bits */
for (ndx2 = 0; ndx2 < 8; ndx2++)
if (areqs.reg_mask[ndx1] & (1 << ndx2))
/* it's used -- record it */
add_register (collect, ndx1 * 8 + ndx2);
}
}
}
break;
} /* switch */
do_cleanups (old_chain);
}
} /* do */
} while (action_exp && *action_exp++ == ',');
}
} /* if */
else if (cmd->function.cfunc == while_stepping_pseudocommand)
{
collect = &stepping_list;
@ -1570,7 +1592,7 @@ encode_actions (t, tdp_actions, stepping_actions)
else
break; /* end tracepoint actions */
}
}
} /* for */
memrange_sortmerge (&tracepoint_list);
memrange_sortmerge (&stepping_list);