* ax-general.c (aop_map): Add pick and rot.
* dwarf2loc.c (compile_dwarf_to_ax) <DW_OP_over>: Reimplement.
<DW_OP_rot>: Implement.
* ax.h (enum agent_op) <aop_pick, aop_rot>: New constants.
(ax_pick): Declare.
* ax-general.c (ax_pick): New function.
doc
* agentexpr.texi (Bytecode Descriptions): Document pick and rot.
gdbserver
* tracepoint.c (enum gdb_agent_op) <gdb_agent_op_pick,
gdb_agent_op_rot>: New constants.
(gdb_agent_op_names): Add pick and roll.
(eval_agent_expr) <gdb_agent_op_pick, gdb_agent_op_rot>: New
cases.
+2011-02-18 Tom Tromey <tromey@redhat.com>
+
+ * ax-general.c (aop_map): Add pick and rot.
+ * dwarf2loc.c (compile_dwarf_to_ax) <DW_OP_over>: Reimplement.
+ <DW_OP_rot>: Implement.
+ * ax.h (enum agent_op) <aop_pick, aop_rot>: New constants.
+ (ax_pick): Declare.
+ * ax-general.c (ax_pick): New function.
+
2011-02-18 Tom Tromey <tromey@redhat.com>
* Makefile.in (HFILES_NO_SRCDIR): Don't mention ada-operator.inc.
x->buf[x->len++] = op;
}
+/* Append a pick operator to EXPR. DEPTH is the stack item to pick,
+ with 0 being top of stack. */
+void
+ax_pick (struct agent_expr *x, int depth)
+{
+ if (depth < 0 || depth > 255)
+ error (_("GDB bug: ax-general.c (ax_pick): stack depth out of range"));
+ ax_simple (x, aop_pick);
+ append_const (x, 1, depth);
+}
+
/* Append a sign-extension or zero-extension instruction to EXPR, to
extend an N-bit value. */
{"tracev", 2, 0, 0, 1}, /* 0x2e */
{0, 0, 0, 0, 0}, /* 0x2f */
{"trace16", 2, 0, 1, 1}, /* 0x30 */
+ {0, 0, 0, 0, 0}, /* 0x31 */
+ {"pick", 1, 0, 0, 1}, /* 0x32 */
+ {"rot", 0, 0, 3, 3}, /* 0x33 */
};
aop_setv = 0x2d,
aop_tracev = 0x2e,
aop_trace16 = 0x30,
+ aop_pick = 0x32,
+ aop_rot = 0x33,
aop_last
};
\f
/* Append a simple operator OP to EXPR. */
extern void ax_simple (struct agent_expr *EXPR, enum agent_op OP);
+/* Append a pick operator to EXPR. DEPTH is the stack item to pick,
+ with 0 being top of stack. */
+extern void ax_pick (struct agent_expr *EXPR, int DEPTH);
+
/* Append the floating-point prefix, for the next bytecode. */
#define ax_float(EXPR) (ax_simple ((EXPR), aop_float))
+2011-02-18 Tom Tromey <tromey@redhat.com>
+
+ * agentexpr.texi (Bytecode Descriptions): Document pick and rot.
+
2011-02-14 Michael Snyder <msnyder@vmware.com>
* gdb.texinfo (threads): Document argument for "info threads" cmd.
@item @code{pop} (0x29): @var{a} =>
Discard the top value on the stack.
+@item @code{pick} (0x32) @var{n}: @var{a} @dots{} @var{b} => @var{a} @dots{} @var{b} @var{a}
+Duplicate an item from the stack and push it on the top of the stack.
+@var{n}, a single byte, indicates the stack item to copy. If @var{n}
+is zero, this is the same as @code{dup}; if @var{n} is one, it copies
+the item under the top item, etc. If @var{n} exceeds the number of
+items on the stack, terminate with an error.
+
+@item @code{rot} (0x33): @var{a} @var{b} @var{c} => @var{c} @var{b} @var{a}
+Rotate the top three items on the stack.
+
@item @code{if_goto} (0x20) @var{offset}: @var{a} @result{}
Pop an integer off the stack; if it is non-zero, branch to the given
offset in the bytecode string. Otherwise, continue to the next
case DW_OP_pick:
offset = *op_ptr++;
- unimplemented (op);
+ ax_pick (expr, offset);
break;
case DW_OP_swap:
break;
case DW_OP_over:
- /* We can't directly support DW_OP_over, but GCC emits it as
- part of a sequence to implement signed modulus. As a
- hack, we recognize this sequence. Note that if GCC ever
- generates a branch to the middle of this sequence, then
- we will die somehow. */
- if (op_end - op_ptr >= 4
- && op_ptr[0] == DW_OP_over
- && op_ptr[1] == DW_OP_div
- && op_ptr[2] == DW_OP_mul
- && op_ptr[3] == DW_OP_minus)
- {
- /* Sign extend the operands. */
- ax_ext (expr, addr_size_bits);
- ax_simple (expr, aop_swap);
- ax_ext (expr, addr_size_bits);
- ax_simple (expr, aop_swap);
- ax_simple (expr, aop_rem_signed);
- op_ptr += 4;
- }
- else
- unimplemented (op);
+ ax_pick (expr, 1);
break;
case DW_OP_rot:
- unimplemented (op);
+ ax_simple (expr, aop_rot);
break;
case DW_OP_deref:
+2011-02-18 Tom Tromey <tromey@redhat.com>
+
+ * tracepoint.c (enum gdb_agent_op) <gdb_agent_op_pick,
+ gdb_agent_op_rot>: New constants.
+ (gdb_agent_op_names): Add pick and roll.
+ (eval_agent_expr) <gdb_agent_op_pick, gdb_agent_op_rot>: New
+ cases.
+
2011-02-15 Jan Kratochvil <jan.kratochvil@redhat.com>
* aclocal.m4: Regenerated with aclocal-1.11.1.
gdb_agent_op_setv = 0x2d,
gdb_agent_op_tracev = 0x2e,
gdb_agent_op_trace16 = 0x30,
+ gdb_agent_op_pick = 0x32,
+ gdb_agent_op_rot = 0x33,
gdb_agent_op_last
};
"tracev",
"?undef?",
"trace16",
+ "?undef?",
+ "pick",
+ "rot"
};
struct agent_expr
top = stack[sp];
break;
+ case gdb_agent_op_pick:
+ arg = aexpr->bytes[pc++];
+ stack[sp] = top;
+ top = stack[sp - arg];
+ ++sp;
+ break;
+
+ case gdb_agent_op_rot:
+ {
+ ULONGEST tem = stack[sp - 1];
+
+ stack[sp - 1] = stack[sp - 2];
+ stack[sp - 2] = top;
+ top = tem;
+ }
+ break;
+
case gdb_agent_op_zero_ext:
arg = aexpr->bytes[pc++];
if (arg < (sizeof (LONGEST) * 8))