diff options
author | Michael Snyder <msnyder@vmware.com> | 1998-07-24 21:44:14 +0000 |
---|---|---|
committer | Michael Snyder <msnyder@vmware.com> | 1998-07-24 21:44:14 +0000 |
commit | 8d6476c7112119b57df78b67f2de8e3d54f060b6 (patch) | |
tree | 12f19fcd1510640a8728f0a0c9dc856e6fcdffb9 /gdb/tracepoint.c | |
parent | 7210606cf05ee8fd1f4c12f20508764cd4ca5305 (diff) | |
download | gdb-8d6476c7112119b57df78b67f2de8e3d54f060b6.zip gdb-8d6476c7112119b57df78b67f2de8e3d54f060b6.tar.gz gdb-8d6476c7112119b57df78b67f2de8e3d54f060b6.tar.bz2 |
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.
Diffstat (limited to 'gdb/tracepoint.c')
-rw-r--r-- | gdb/tracepoint.c | 88 |
1 files changed, 55 insertions, 33 deletions
diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 2d13d11..42898c4 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -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); |