* common/ax.def: New file.
	* ax.h (enum agent_op): Use ax.def.
	* ax-general.c (aop_map): Use ax.def.
gdbserver
	* 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.
This commit is contained in:
Tom Tromey 2011-02-18 21:12:07 +00:00
parent c7f96d2b95
commit 94d5e490f0
7 changed files with 143 additions and 216 deletions

View File

@ -1,3 +1,9 @@
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.

View File

@ -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
};

View File

@ -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
};

97
gdb/common/ax.def Normal file
View File

@ -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)

View File

@ -1,3 +1,10 @@
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,

View File

@ -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

View File

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