aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/ax-general.c57
-rw-r--r--gdb/ax.h63
-rw-r--r--gdb/common/ax.def97
-rw-r--r--gdb/gdbserver/ChangeLog7
-rw-r--r--gdb/gdbserver/Makefile.in4
-rw-r--r--gdb/gdbserver/tracepoint.c125
7 files changed, 143 insertions, 216 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 42c868f..9a75f00 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
2011-02-18 Tom Tromey <tromey@redhat.com>
+ * common/ax.def: New file.
+ * ax.h (enum agent_op): Use ax.def.
+ * ax-general.c (aop_map): Use ax.def.
+
+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.
diff --git a/gdb/ax-general.c b/gdb/ax-general.c
index 8d95855..edab4dc 100644
--- a/gdb/ax-general.c
+++ b/gdb/ax-general.c
@@ -338,58 +338,11 @@ ax_tsv (struct agent_expr *x, enum agent_op op, int num)
struct aop_map aop_map[] =
{
- {0, 0, 0, 0, 0},
- {"float", 0, 0, 0, 0}, /* 0x01 */
- {"add", 0, 0, 2, 1}, /* 0x02 */
- {"sub", 0, 0, 2, 1}, /* 0x03 */
- {"mul", 0, 0, 2, 1}, /* 0x04 */
- {"div_signed", 0, 0, 2, 1}, /* 0x05 */
- {"div_unsigned", 0, 0, 2, 1}, /* 0x06 */
- {"rem_signed", 0, 0, 2, 1}, /* 0x07 */
- {"rem_unsigned", 0, 0, 2, 1}, /* 0x08 */
- {"lsh", 0, 0, 2, 1}, /* 0x09 */
- {"rsh_signed", 0, 0, 2, 1}, /* 0x0a */
- {"rsh_unsigned", 0, 0, 2, 1}, /* 0x0b */
- {"trace", 0, 0, 2, 0}, /* 0x0c */
- {"trace_quick", 1, 0, 1, 1}, /* 0x0d */
- {"log_not", 0, 0, 1, 1}, /* 0x0e */
- {"bit_and", 0, 0, 2, 1}, /* 0x0f */
- {"bit_or", 0, 0, 2, 1}, /* 0x10 */
- {"bit_xor", 0, 0, 2, 1}, /* 0x11 */
- {"bit_not", 0, 0, 1, 1}, /* 0x12 */
- {"equal", 0, 0, 2, 1}, /* 0x13 */
- {"less_signed", 0, 0, 2, 1}, /* 0x14 */
- {"less_unsigned", 0, 0, 2, 1}, /* 0x15 */
- {"ext", 1, 0, 1, 1}, /* 0x16 */
- {"ref8", 0, 8, 1, 1}, /* 0x17 */
- {"ref16", 0, 16, 1, 1}, /* 0x18 */
- {"ref32", 0, 32, 1, 1}, /* 0x19 */
- {"ref64", 0, 64, 1, 1}, /* 0x1a */
- {"ref_float", 0, 0, 1, 1}, /* 0x1b */
- {"ref_double", 0, 0, 1, 1}, /* 0x1c */
- {"ref_long_double", 0, 0, 1, 1}, /* 0x1d */
- {"l_to_d", 0, 0, 1, 1}, /* 0x1e */
- {"d_to_l", 0, 0, 1, 1}, /* 0x1f */
- {"if_goto", 2, 0, 1, 0}, /* 0x20 */
- {"goto", 2, 0, 0, 0}, /* 0x21 */
- {"const8", 1, 8, 0, 1}, /* 0x22 */
- {"const16", 2, 16, 0, 1}, /* 0x23 */
- {"const32", 4, 32, 0, 1}, /* 0x24 */
- {"const64", 8, 64, 0, 1}, /* 0x25 */
- {"reg", 2, 0, 0, 1}, /* 0x26 */
- {"end", 0, 0, 0, 0}, /* 0x27 */
- {"dup", 0, 0, 1, 2}, /* 0x28 */
- {"pop", 0, 0, 1, 0}, /* 0x29 */
- {"zero_ext", 1, 0, 1, 1}, /* 0x2a */
- {"swap", 0, 0, 2, 2}, /* 0x2b */
- {"getv", 2, 0, 0, 1}, /* 0x2c */
- {"setv", 2, 0, 0, 1}, /* 0x2d */
- {"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 */
+ {0, 0, 0, 0, 0}
+#define DEFOP(NAME, SIZE, DATA_SIZE, CONSUMED, PRODUCED, VALUE) \
+ , { # NAME, SIZE, DATA_SIZE, CONSUMED, PRODUCED }
+#include "ax.def"
+#undef DEFOP
};
diff --git a/gdb/ax.h b/gdb/ax.h
index 18b19c9..a124575 100644
--- a/gdb/ax.h
+++ b/gdb/ax.h
@@ -145,67 +145,14 @@ struct agent_expr
unsigned char *reg_mask;
};
-/* The actual values of the various bytecode operations.
-
- Other independent implementations of the agent bytecode engine will
- rely on the exact values of these enums, and may not be recompiled
- when we change this table. The numeric values should remain fixed
- whenever possible. Thus, we assign them values explicitly here (to
- allow gaps to form safely), and the disassembly table in
- agentexpr.h behaves like an opcode map. If you want to see them
- grouped logically, see doc/agentexpr.texi. */
+/* The actual values of the various bytecode operations. */
enum agent_op
{
- aop_float = 0x01,
- aop_add = 0x02,
- aop_sub = 0x03,
- aop_mul = 0x04,
- aop_div_signed = 0x05,
- aop_div_unsigned = 0x06,
- aop_rem_signed = 0x07,
- aop_rem_unsigned = 0x08,
- aop_lsh = 0x09,
- aop_rsh_signed = 0x0a,
- aop_rsh_unsigned = 0x0b,
- aop_trace = 0x0c,
- aop_trace_quick = 0x0d,
- aop_log_not = 0x0e,
- aop_bit_and = 0x0f,
- aop_bit_or = 0x10,
- aop_bit_xor = 0x11,
- aop_bit_not = 0x12,
- aop_equal = 0x13,
- aop_less_signed = 0x14,
- aop_less_unsigned = 0x15,
- aop_ext = 0x16,
- aop_ref8 = 0x17,
- aop_ref16 = 0x18,
- aop_ref32 = 0x19,
- aop_ref64 = 0x1a,
- aop_ref_float = 0x1b,
- aop_ref_double = 0x1c,
- aop_ref_long_double = 0x1d,
- aop_l_to_d = 0x1e,
- aop_d_to_l = 0x1f,
- aop_if_goto = 0x20,
- aop_goto = 0x21,
- aop_const8 = 0x22,
- aop_const16 = 0x23,
- aop_const32 = 0x24,
- aop_const64 = 0x25,
- aop_reg = 0x26,
- aop_end = 0x27,
- aop_dup = 0x28,
- aop_pop = 0x29,
- aop_zero_ext = 0x2a,
- aop_swap = 0x2b,
- aop_getv = 0x2c,
- aop_setv = 0x2d,
- aop_tracev = 0x2e,
- aop_trace16 = 0x30,
- aop_pick = 0x32,
- aop_rot = 0x33,
+#define DEFOP(NAME, SIZE, DATA_SIZE, CONSUMED, PRODUCED, VALUE) \
+ aop_ ## NAME = VALUE,
+#include "ax.def"
+#undef DEFOP
aop_last
};
diff --git a/gdb/common/ax.def b/gdb/common/ax.def
new file mode 100644
index 0000000..56ddd4a
--- /dev/null
+++ b/gdb/common/ax.def
@@ -0,0 +1,97 @@
+/* Definition of agent opcode values. -*- c -*-
+ Copyright (C) 1998, 1999, 2000, 2007, 2008, 2009, 2010, 2011
+ Free Software Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* The actual values of the various bytecode operations.
+
+ Other independent implementations of the agent bytecode engine will
+ rely on the exact values of these enums, and may not be recompiled
+ when we change this table. The numeric values should remain fixed
+ whenever possible. Thus, we assign them values explicitly here (to
+ allow gaps to form safely), and the disassembly table in
+ agentexpr.h behaves like an opcode map. If you want to see them
+ grouped logically, see doc/agentexpr.texi.
+
+ Each line is of the form:
+
+ DEFOP (name, size, data_size, consumed, produced, opcode)
+
+ NAME is the name of the operation.
+ SIZE is the number of argument bytes that the operation takes from
+ the bytecode stream.
+ DATA_SIZE is the size of data operated on, in bits, for operations
+ that care (ref and const). It is zero otherwise.
+ CONSUMED is the number of stack elements consumed.
+ PRODUCED is the number of stack elements produced.
+ OPCODE is the operation's encoding. */
+
+DEFOP (float, 0, 0, 0, 0, 0x01)
+DEFOP (add, 0, 0, 2, 1, 0x02)
+DEFOP (sub, 0, 0, 2, 1, 0x03)
+DEFOP (mul, 0, 0, 2, 1, 0x04)
+DEFOP (div_signed, 0, 0, 2, 1, 0x05)
+DEFOP (div_unsigned, 0, 0, 2, 1, 0x06)
+DEFOP (rem_signed, 0, 0, 2, 1, 0x07)
+DEFOP (rem_unsigned, 0, 0, 2, 1, 0x08)
+DEFOP (lsh, 0, 0, 2, 1, 0x09)
+DEFOP (rsh_signed, 0, 0, 2, 1, 0x0a)
+DEFOP (rsh_unsigned, 0, 0, 2, 1, 0x0b)
+DEFOP (trace, 0, 0, 2, 0, 0x0c)
+DEFOP (trace_quick, 1, 0, 1, 1, 0x0d)
+DEFOP (log_not, 0, 0, 1, 1, 0x0e)
+DEFOP (bit_and, 0, 0, 2, 1, 0x0f)
+DEFOP (bit_or, 0, 0, 2, 1, 0x10)
+DEFOP (bit_xor, 0, 0, 2, 1, 0x11)
+DEFOP (bit_not, 0, 0, 1, 1, 0x12)
+DEFOP (equal, 0, 0, 2, 1, 0x13)
+DEFOP (less_signed, 0, 0, 2, 1, 0x14)
+DEFOP (less_unsigned, 0, 0, 2, 1, 0x15)
+DEFOP (ext, 1, 0, 1, 1, 0x16)
+DEFOP (ref8, 0, 8, 1, 1, 0x17)
+DEFOP (ref16, 0, 16, 1, 1, 0x18)
+DEFOP (ref32, 0, 32, 1, 1, 0x19)
+DEFOP (ref64, 0, 64, 1, 1, 0x1a)
+DEFOP (ref_float, 0, 0, 1, 1, 0x1b)
+DEFOP (ref_double, 0, 0, 1, 1, 0x1c)
+DEFOP (ref_long_double, 0, 0, 1, 1, 0x1d)
+DEFOP (l_to_d, 0, 0, 1, 1, 0x1e)
+DEFOP (d_to_l, 0, 0, 1, 1, 0x1f)
+DEFOP (if_goto, 2, 0, 1, 0, 0x20)
+DEFOP (goto, 2, 0, 0, 0, 0x21)
+DEFOP (const8, 1, 8, 0, 1, 0x22)
+DEFOP (const16, 2, 16, 0, 1, 0x23)
+DEFOP (const32, 4, 32, 0, 1, 0x24)
+DEFOP (const64, 8, 64, 0, 1, 0x25)
+DEFOP (reg, 2, 0, 0, 1, 0x26)
+DEFOP (end, 0, 0, 0, 0, 0x27)
+DEFOP (dup, 0, 0, 1, 2, 0x28)
+DEFOP (pop, 0, 0, 1, 0, 0x29)
+DEFOP (zero_ext, 1, 0, 1, 1, 0x2a)
+DEFOP (swap, 0, 0, 2, 2, 0x2b)
+DEFOP (getv, 2, 0, 0, 1, 0x2c)
+DEFOP (setv, 2, 0, 0, 1, 0x2d)
+DEFOP (tracev, 2, 0, 0, 1, 0x2e)
+/* We need something here just to make the tables come out ok. */
+DEFOP (invalid, 0, 0, 0, 0, 0x2f)
+DEFOP (trace16, 2, 0, 1, 1, 0x30)
+/* We need something here just to make the tables come out ok. */
+DEFOP (invalid2, 0, 0, 0, 0, 0x2f)
+/* The "consumed" number for pick is wrong, but there's no way to
+ express the right thing. */
+DEFOP (pick, 1, 0, 0, 1, 0x32)
+DEFOP (rot, 0, 0, 3, 3, 0x33)
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index e5caba5..4d54d97 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,5 +1,12 @@
2011-02-18 Tom Tromey <tromey@redhat.com>
+ * Makefile.in (tracepoint-ipa.o): Depend on ax.def.
+ (tracepoint.o): Likewise.
+ * tracepoint.c (enum gdb_agent_op): Use ax.def.
+ (gdb_agent_op_names): Likewise.
+
+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.
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index 07e020f..352f4f1 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -382,7 +382,7 @@ IPAGENT_CFLAGS = $(CPPFLAGS) $(INTERNAL_CFLAGS) $(UST_CFLAGS) \
-fvisibility=hidden
# In-process agent object rules
-tracepoint-ipa.o: tracepoint.c $(server_h)
+tracepoint-ipa.o: tracepoint.c $(server_h) $(srcdir)/../common/ax.def
$(CC) -c $(IPAGENT_CFLAGS) $< -o tracepoint-ipa.o
utils-ipa.o: utils.c $(server_h)
$(CC) -c $(IPAGENT_CFLAGS) $< -o utils-ipa.o
@@ -410,7 +410,7 @@ remote-utils.o: remote-utils.c terminal.h $(server_h)
server.o: server.c $(server_h)
target.o: target.c $(server_h)
thread-db.o: thread-db.c $(server_h) $(linux_low_h) $(gdb_proc_service_h)
-tracepoint.o: tracepoint.c $(server_h)
+tracepoint.o: tracepoint.c $(server_h) $(srcdir)/../common/ax.def
utils.o: utils.c $(server_h)
gdbreplay.o: gdbreplay.c config.h
diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c
index 36a92b2..8d99c94 100644
--- a/gdb/gdbserver/tracepoint.c
+++ b/gdb/gdbserver/tracepoint.c
@@ -470,112 +470,19 @@ write_inferior_uinteger (CORE_ADDR symaddr, unsigned int val)
enum gdb_agent_op
{
- gdb_agent_op_float = 0x01,
- gdb_agent_op_add = 0x02,
- gdb_agent_op_sub = 0x03,
- gdb_agent_op_mul = 0x04,
- gdb_agent_op_div_signed = 0x05,
- gdb_agent_op_div_unsigned = 0x06,
- gdb_agent_op_rem_signed = 0x07,
- gdb_agent_op_rem_unsigned = 0x08,
- gdb_agent_op_lsh = 0x09,
- gdb_agent_op_rsh_signed = 0x0a,
- gdb_agent_op_rsh_unsigned = 0x0b,
- gdb_agent_op_trace = 0x0c,
- gdb_agent_op_trace_quick = 0x0d,
- gdb_agent_op_log_not = 0x0e,
- gdb_agent_op_bit_and = 0x0f,
- gdb_agent_op_bit_or = 0x10,
- gdb_agent_op_bit_xor = 0x11,
- gdb_agent_op_bit_not = 0x12,
- gdb_agent_op_equal = 0x13,
- gdb_agent_op_less_signed = 0x14,
- gdb_agent_op_less_unsigned = 0x15,
- gdb_agent_op_ext = 0x16,
- gdb_agent_op_ref8 = 0x17,
- gdb_agent_op_ref16 = 0x18,
- gdb_agent_op_ref32 = 0x19,
- gdb_agent_op_ref64 = 0x1a,
- gdb_agent_op_ref_float = 0x1b,
- gdb_agent_op_ref_double = 0x1c,
- gdb_agent_op_ref_long_double = 0x1d,
- gdb_agent_op_l_to_d = 0x1e,
- gdb_agent_op_d_to_l = 0x1f,
- gdb_agent_op_if_goto = 0x20,
- gdb_agent_op_goto = 0x21,
- gdb_agent_op_const8 = 0x22,
- gdb_agent_op_const16 = 0x23,
- gdb_agent_op_const32 = 0x24,
- gdb_agent_op_const64 = 0x25,
- gdb_agent_op_reg = 0x26,
- gdb_agent_op_end = 0x27,
- gdb_agent_op_dup = 0x28,
- gdb_agent_op_pop = 0x29,
- gdb_agent_op_zero_ext = 0x2a,
- gdb_agent_op_swap = 0x2b,
- gdb_agent_op_getv = 0x2c,
- 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,
+#define DEFOP(NAME, SIZE, DATA_SIZE, CONSUMED, PRODUCED, VALUE) \
+ gdb_agent_op_ ## NAME = VALUE,
+#include "ax.def"
+#undef DEFOP
gdb_agent_op_last
};
static const char *gdb_agent_op_names [gdb_agent_op_last] =
{
- "?undef?",
- "float",
- "add",
- "sub",
- "mul",
- "div_signed",
- "div_unsigned",
- "rem_signed",
- "rem_unsigned",
- "lsh",
- "rsh_signed",
- "rsh_unsigned",
- "trace",
- "trace_quick",
- "log_not",
- "bit_and",
- "bit_or",
- "bit_xor",
- "bit_not",
- "equal",
- "less_signed",
- "less_unsigned",
- "ext",
- "ref8",
- "ref16",
- "ref32",
- "ref64",
- "ref_float",
- "ref_double",
- "ref_long_double",
- "l_to_d",
- "d_to_l",
- "if_goto",
- "goto",
- "const8",
- "const16",
- "const32",
- "const64",
- "reg",
- "end",
- "dup",
- "pop",
- "zero_ext",
- "swap",
- "getv",
- "setv",
- "tracev",
- "?undef?",
- "trace16",
- "?undef?",
- "pick",
- "rot"
+ "?undef?"
+#define DEFOP(NAME, SIZE, DATA_SIZE, CONSUMED, PRODUCED, VALUE) , # NAME
+#include "ax.def"
+#undef DEFOP
};
struct agent_expr
@@ -4297,6 +4204,16 @@ unparse_agent_expr (struct agent_expr *aexpr)
#endif
+/* A wrapper for gdb_agent_op_names that does some bounds-checking. */
+
+static const char *
+gdb_agent_op_name (int op)
+{
+ if (op < 0 || op >= gdb_agent_op_last || gdb_agent_op_names[op] == NULL)
+ return "?undef?";
+ return gdb_agent_op_names[op];
+}
+
/* The agent expression evaluator, as specified by the GDB docs. It
returns 0 if everything went OK, and a nonzero error code
otherwise. */
@@ -4690,7 +4607,7 @@ eval_agent_expr (struct tracepoint_hit_ctx *ctx,
}
trace_debug ("Op %s -> sp=%d, top=0x%s",
- gdb_agent_op_names[op], sp, pulongest (top));
+ gdb_agent_op_name (op), sp, pulongest (top));
}
}
@@ -6000,11 +5917,11 @@ compile_bytecodes (struct agent_expr *aexpr)
if (emit_error)
{
trace_debug ("Error %d while emitting code for %s\n",
- emit_error, gdb_agent_op_names[op]);
+ emit_error, gdb_agent_op_name (op));
return expr_eval_unhandled_opcode;
}
- trace_debug ("Op %s compiled\n", gdb_agent_op_names[op]);
+ trace_debug ("Op %s compiled\n", gdb_agent_op_name (op));
}
/* Now fill in real addresses as goto destinations. */