Revert the following change (not approved yet):

2011-02-21  Hui Zhu  <teawater@gmail.com>
	* Makefile.in (HFILES_NO_SRCDIR): Add printcmd.h.
	* ax-gdb.c (gen_printf_expr_callback): New function.
	* ax-gdb.h (gen_printf_expr_callback): Forward declare.
	* ax-general.c (ax_memcpy): New function.
	(ax_print): Handle "printf".
	(ax_reqs): Ditto.
	* ax.h (ax_memcpy): Forward declare.
	* common/ax.def (invalid2): Removed.
	(printf): New entry.
	* printcmd.c (printcmd.h): New include.
	(string_printf): New function.
	(ui_printf): Removed.
	(printf_command): Remove static.  Call string_printf.
	(eval_command): Call string_printf.
	* printcmd.h: New file.
	* tracepoint.c (validate_actionline,
	encode_actions_1): handle printf_command.
This commit is contained in:
Joel Brobecker 2011-02-24 07:39:48 +00:00
parent 633ff500c5
commit a04b0428ab
10 changed files with 44 additions and 209 deletions

View File

@ -1,3 +1,25 @@
2011-02-24 Joel Brobecker <brobecker@adacore.com>
Revert the following patch (not approved yet):
2011-02-21 Hui Zhu <teawater@gmail.com>
* Makefile.in (HFILES_NO_SRCDIR): Add printcmd.h.
* ax-gdb.c (gen_printf_expr_callback): New function.
* ax-gdb.h (gen_printf_expr_callback): Forward declare.
* ax-general.c (ax_memcpy): New function.
(ax_print): Handle "printf".
(ax_reqs): Ditto.
* ax.h (ax_memcpy): Forward declare.
* common/ax.def (invalid2): Removed.
(printf): New entry.
* printcmd.c (printcmd.h): New include.
(string_printf): New function.
(ui_printf): Removed.
(printf_command): Remove static. Call string_printf.
(eval_command): Call string_printf.
* printcmd.h: New file.
* tracepoint.c (validate_actionline,
encode_actions_1): handle printf_command.
2011-02-23 Tom Tromey <tromey@redhat.com> 2011-02-23 Tom Tromey <tromey@redhat.com>
* ax-general.c (ax_pick): Add missing newline. * ax-general.c (ax_pick): Add missing newline.

View File

@ -808,7 +808,7 @@ annotate.h sim-regno.h dictionary.h dfp.h main.h frame-unwind.h \
remote-fileio.h i386-linux-tdep.h vax-tdep.h objc-lang.h \ remote-fileio.h i386-linux-tdep.h vax-tdep.h objc-lang.h \
sentinel-frame.h bcache.h symfile.h windows-tdep.h linux-tdep.h \ sentinel-frame.h bcache.h symfile.h windows-tdep.h linux-tdep.h \
gdb_usleep.h jit.h xml-syscall.h microblaze-tdep.h \ gdb_usleep.h jit.h xml-syscall.h microblaze-tdep.h \
psymtab.h psympriv.h progspace.h bfin-tdep.h ia64-hpux-tdep.h printcmd.h psymtab.h psympriv.h progspace.h bfin-tdep.h ia64-hpux-tdep.h
# Header files that already have srcdir in them, or which are in objdir. # Header files that already have srcdir in them, or which are in objdir.

View File

@ -2445,65 +2445,6 @@ gen_eval_for_expr (CORE_ADDR scope, struct expression *expr)
return ax; return ax;
} }
void
gen_printf_expr_callback (char *fbuf, char **expp, void *loc_v, void *aexpr_v)
{
struct bp_location *loc = loc_v;
struct agent_expr *aexpr = aexpr_v;
if (expp)
{
struct cleanup *old_chain = NULL;
struct expression *expr = NULL;
union exp_element *pc;
struct axs_value value;
expr = parse_exp_1 (expp, block_for_pc (loc->address), 1);
old_chain = make_cleanup (free_current_contents, &expr);
pc = expr->elts;
trace_kludge = 0;
value.optimized_out = 0;
gen_expr (expr, &pc, aexpr, &value);
if (value.optimized_out)
error (_("value has been optimized out"));
switch (value.kind)
{
case axs_lvalue_memory:
if (TYPE_CODE (value.type) != TYPE_CODE_ARRAY)
{
int length = TYPE_LENGTH (check_typedef (value.type));
switch (length)
{
case 4:
ax_simple (aexpr, aop_ref32);
break;
case 8:
ax_simple (aexpr, aop_ref64);
break;
default:
error (_("Size of value is not OK."));
break;
}
}
break;
case axs_lvalue_register:
ax_reg (aexpr, value.u.reg);
break;
}
do_cleanups (old_chain);
}
ax_simple (aexpr, aop_printf);
if (expp)
ax_simple (aexpr, 1);
else
ax_simple (aexpr, 0);
ax_memcpy (aexpr, fbuf, strlen (fbuf) + 1);
}
static void static void
agent_command (char *exp, int from_tty) agent_command (char *exp, int from_tty)
{ {

View File

@ -108,8 +108,6 @@ extern struct agent_expr *gen_trace_for_var (CORE_ADDR, struct gdbarch *,
extern struct agent_expr *gen_eval_for_expr (CORE_ADDR, struct expression *); extern struct agent_expr *gen_eval_for_expr (CORE_ADDR, struct expression *);
extern void gen_printf_expr_callback (char *, char **, void *, void *);
extern int trace_kludge; extern int trace_kludge;
#endif /* AX_GDB_H */ #endif /* AX_GDB_H */

View File

@ -331,14 +331,6 @@ ax_tsv (struct agent_expr *x, enum agent_op op, int num)
x->buf[x->len + 2] = (num) & 0xff; x->buf[x->len + 2] = (num) & 0xff;
x->len += 3; x->len += 3;
} }
void
ax_memcpy (struct agent_expr *x, const void *src, size_t n)
{
grow_expr (x, n);
memcpy (x->buf + x->len, src, n);
x->len += n;
}
@ -377,7 +369,6 @@ ax_print (struct ui_file *f, struct agent_expr *x)
for (i = 0; i < x->len;) for (i = 0; i < x->len;)
{ {
enum agent_op op = x->buf[i]; enum agent_op op = x->buf[i];
int op_size;
if (op >= (sizeof (aop_map) / sizeof (aop_map[0])) if (op >= (sizeof (aop_map) / sizeof (aop_map[0]))
|| !aop_map[op].name) || !aop_map[op].name)
@ -386,19 +377,7 @@ ax_print (struct ui_file *f, struct agent_expr *x)
i++; i++;
continue; continue;
} }
if (op == aop_printf) if (i + 1 + aop_map[op].op_size > x->len)
{
if (i + 2 >= x->len)
{
fprintf_filtered (f, _("%3d <bad opcode %02x>\n"), i, op);
i++;
continue;
}
op_size = 1 + strlen (x->buf + i + 2) + 1;
}
else
op_size = aop_map[op].op_size;
if (i + 1 + op_size > x->len)
{ {
fprintf_filtered (f, _("%3d <incomplete opcode %s>\n"), fprintf_filtered (f, _("%3d <incomplete opcode %s>\n"),
i, aop_map[op].name); i, aop_map[op].name);
@ -406,15 +385,15 @@ ax_print (struct ui_file *f, struct agent_expr *x)
} }
fprintf_filtered (f, "%3d %s", i, aop_map[op].name); fprintf_filtered (f, "%3d %s", i, aop_map[op].name);
if (op_size > 0) if (aop_map[op].op_size > 0)
{ {
fputs_filtered (" ", f); fputs_filtered (" ", f);
print_longest (f, 'd', 0, print_longest (f, 'd', 0,
read_const (x, i + 1, op_size)); read_const (x, i + 1, aop_map[op].op_size));
} }
fprintf_filtered (f, "\n"); fprintf_filtered (f, "\n");
i += 1 + op_size; i += 1 + aop_map[op].op_size;
is_float = (op == aop_float); is_float = (op == aop_float);
} }
@ -482,8 +461,6 @@ ax_reqs (struct agent_expr *ax)
/* Pointer to a description of the present op. */ /* Pointer to a description of the present op. */
struct aop_map *op; struct aop_map *op;
int op_size = 0, consumed = 0;
memset (targets, 0, ax->len * sizeof (targets[0])); memset (targets, 0, ax->len * sizeof (targets[0]));
memset (boundary, 0, ax->len * sizeof (boundary[0])); memset (boundary, 0, ax->len * sizeof (boundary[0]));
@ -491,7 +468,7 @@ ax_reqs (struct agent_expr *ax)
ax->flaw = agent_flaw_none; ax->flaw = agent_flaw_none;
ax->max_data_size = 0; ax->max_data_size = 0;
for (i = 0; i < ax->len; i += 1 + op_size) for (i = 0; i < ax->len; i += 1 + op->op_size)
{ {
if (ax->buf[i] > (sizeof (aop_map) / sizeof (aop_map[0]))) if (ax->buf[i] > (sizeof (aop_map) / sizeof (aop_map[0])))
{ {
@ -507,23 +484,7 @@ ax_reqs (struct agent_expr *ax)
return; return;
} }
if (ax->buf[i] == aop_printf) if (i + 1 + op->op_size > ax->len)
{
if (i + 2 >= ax->len)
{
ax->flaw = agent_flaw_incomplete_instruction;
return;
}
consumed = ax->buf[i + 1];
op_size = 1 + strlen (ax->buf + i + 2) + 1;
}
else
{
op_size = op->op_size;
consumed = op->consumed;
}
if (i + 1 + op_size > ax->len)
{ {
ax->flaw = agent_flaw_incomplete_instruction; ax->flaw = agent_flaw_incomplete_instruction;
return; return;
@ -541,7 +502,7 @@ ax_reqs (struct agent_expr *ax)
boundary[i] = 1; boundary[i] = 1;
heights[i] = height; heights[i] = height;
height -= consumed; height -= op->consumed;
if (height < ax->min_height) if (height < ax->min_height)
ax->min_height = height; ax->min_height = height;
height += op->produced; height += op->produced;

View File

@ -213,8 +213,6 @@ extern void ax_reg_mask (struct agent_expr *ax, int reg);
/* Assemble code to operate on a trace state variable. */ /* Assemble code to operate on a trace state variable. */
extern void ax_tsv (struct agent_expr *expr, enum agent_op op, int num); extern void ax_tsv (struct agent_expr *expr, enum agent_op op, int num);
extern void ax_memcpy (struct agent_expr *x, const void *src, size_t n);
/* Functions for printing out expressions, and otherwise debugging /* Functions for printing out expressions, and otherwise debugging

View File

@ -86,8 +86,12 @@ DEFOP (swap, 0, 0, 2, 2, 0x2b)
DEFOP (getv, 2, 0, 0, 1, 0x2c) DEFOP (getv, 2, 0, 0, 1, 0x2c)
DEFOP (setv, 2, 0, 0, 1, 0x2d) DEFOP (setv, 2, 0, 0, 1, 0x2d)
DEFOP (tracev, 2, 0, 0, 1, 0x2e) 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 (invalid, 0, 0, 0, 0, 0x2f)
DEFOP (trace16, 2, 0, 1, 1, 0x30) DEFOP (trace16, 2, 0, 1, 1, 0x30)
DEFOP (printf, 0, 0, 0, 0, 0x31) /* 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 (pick, 1, 0, 0, 1, 0x32)
DEFOP (rot, 0, 0, 3, 3, 0x33) DEFOP (rot, 0, 0, 3, 3, 0x33)

View File

@ -49,7 +49,6 @@
#include "parser-defs.h" #include "parser-defs.h"
#include "charset.h" #include "charset.h"
#include "arch-utils.h" #include "arch-utils.h"
#include "printcmd.h"
#include "cli/cli-utils.h" #include "cli/cli-utils.h"
#ifdef TUI #ifdef TUI
@ -1962,9 +1961,10 @@ print_variable_and_value (const char *name, struct symbol *var,
fprintf_filtered (stream, "\n"); fprintf_filtered (stream, "\n");
} }
void /* printf "printf format string" ARG to STREAM. */
string_printf (char *arg, struct ui_file *stream, printf_callback callback,
void *loc_v, void *aexpr_v) static void
ui_printf (char *arg, struct ui_file *stream)
{ {
char *f = NULL; char *f = NULL;
char *s = arg; char *s = arg;
@ -1975,8 +1975,6 @@ string_printf (char *arg, struct ui_file *stream, printf_callback callback,
int nargs = 0; int nargs = 0;
int allocated_args = 20; int allocated_args = 20;
struct cleanup *old_cleanups; struct cleanup *old_cleanups;
struct bp_location *loc = loc_v;
struct agent_expr *aexpr = aexpr_v;
val_args = xmalloc (allocated_args * sizeof (struct value *)); val_args = xmalloc (allocated_args * sizeof (struct value *));
old_cleanups = make_cleanup (free_current_contents, &val_args); old_cleanups = make_cleanup (free_current_contents, &val_args);
@ -2295,26 +2293,15 @@ string_printf (char *arg, struct ui_file *stream, printf_callback callback,
/* Now, parse all arguments and evaluate them. /* Now, parse all arguments and evaluate them.
Store the VALUEs in VAL_ARGS. */ Store the VALUEs in VAL_ARGS. */
if (callback)
current_substring = substrings;
while (*s != '\0') while (*s != '\0')
{ {
char *s1; char *s1;
s1 = s;
if (nargs == allocated_args) if (nargs == allocated_args)
val_args = (struct value **) xrealloc ((char *) val_args, val_args = (struct value **) xrealloc ((char *) val_args,
(allocated_args *= 2) (allocated_args *= 2)
* sizeof (struct value *)); * sizeof (struct value *));
if (callback) s1 = s;
{
if (nargs >= nargs_wanted)
error (_("Wrong number of arguments for specified "
"format-string"));
callback (current_substring, &s1, loc, aexpr);
current_substring += strlen (current_substring) + 1;
}
else
val_args[nargs] = parse_to_comma_and_eval (&s1); val_args[nargs] = parse_to_comma_and_eval (&s1);
nargs++; nargs++;
@ -2322,15 +2309,10 @@ string_printf (char *arg, struct ui_file *stream, printf_callback callback,
if (*s == ',') if (*s == ',')
s++; s++;
} }
if (callback)
callback (last_arg, NULL, loc, aexpr);
if (nargs != nargs_wanted) if (nargs != nargs_wanted)
error (_("Wrong number of arguments for specified format-string")); error (_("Wrong number of arguments for specified format-string"));
if (!stream)
goto after_print;
/* Now actually print them. */ /* Now actually print them. */
current_substring = substrings; current_substring = substrings;
for (i = 0; i < nargs; i++) for (i = 0; i < nargs; i++)
@ -2685,17 +2667,15 @@ string_printf (char *arg, struct ui_file *stream, printf_callback callback,
by default, which will warn here if there is no argument. */ by default, which will warn here if there is no argument. */
fprintf_filtered (stream, last_arg, 0); fprintf_filtered (stream, last_arg, 0);
} }
after_print:
do_cleanups (old_cleanups); do_cleanups (old_cleanups);
} }
/* Implement the "printf" command. */ /* Implement the "printf" command. */
void static void
printf_command (char *arg, int from_tty) printf_command (char *arg, int from_tty)
{ {
string_printf (arg, gdb_stdout, NULL, NULL, NULL); ui_printf (arg, gdb_stdout);
} }
/* Implement the "eval" command. */ /* Implement the "eval" command. */
@ -2707,7 +2687,7 @@ eval_command (char *arg, int from_tty)
struct cleanup *cleanups = make_cleanup_ui_file_delete (ui_out); struct cleanup *cleanups = make_cleanup_ui_file_delete (ui_out);
char *expanded; char *expanded;
string_printf (arg, ui_out, NULL, NULL, NULL); ui_printf (arg, ui_out);
expanded = ui_file_xstrdup (ui_out, NULL); expanded = ui_file_xstrdup (ui_out, NULL);
make_cleanup (xfree, expanded); make_cleanup (xfree, expanded);

View File

@ -1,30 +0,0 @@
/* Print values for GNU debugger GDB.
Copyright (C) 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/>. */
#ifndef _PRINTCMD_H_
#define _PRINTCMD_H_
extern void printf_command (char *arg, int from_tty);
typedef void (printf_callback) (char *fbuf, char **expp, void *loc_v,
void *aexpr_v);
extern void string_printf (char *arg, struct ui_file *stream,
printf_callback callback, void *loc_v,
void *aexpr_v);
#endif /* _PRINTCMD_H_ */

View File

@ -51,7 +51,6 @@
#include "ax.h" #include "ax.h"
#include "ax-gdb.h" #include "ax-gdb.h"
#include "memrange.h" #include "memrange.h"
#include "printcmd.h"
/* readline include files */ /* readline include files */
#include "readline/readline.h" #include "readline/readline.h"
@ -764,28 +763,6 @@ validate_actionline (char **line, struct breakpoint *t)
error (_("while-stepping step count `%s' is malformed."), *line); error (_("while-stepping step count `%s' is malformed."), *line);
} }
else if (cmd_cfunc_eq (c, printf_command))
{
char fbuf[101];
for (loc = t->loc; loc; loc = loc->next)
{
int nargs;
aexpr = new_agent_expr (loc->gdbarch, loc->address);
old_chain = make_cleanup_free_agent_expr (aexpr);
string_printf (p, NULL, gen_printf_expr_callback,
loc, aexpr);
ax_simple (aexpr, aop_end);
/* The agent expr include expr for arguments, format string, 1 byte
for aop_printf, 1 byte for the number of arguments, 1 byte for
size of format string, 1 byte for blank after format string
and 1 byte for aop_end. */
if (aexpr->len > MAX_AGENT_EXPR_LEN)
error (_("Expression is too complicated."));
do_cleanups (old_chain);
}
}
else if (cmd_cfunc_eq (c, end_actions_pseudocommand)) else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
; ;
@ -1497,22 +1474,6 @@ encode_actions_1 (struct command_line *action,
encode_actions_1 (action->body_list[0], t, tloc, frame_reg, encode_actions_1 (action->body_list[0], t, tloc, frame_reg,
frame_offset, stepping_list, NULL); frame_offset, stepping_list, NULL);
} }
else if (cmd_cfunc_eq (cmd, printf_command))
{
char fbuf[101];
struct cleanup *old_chain = NULL;
aexpr = new_agent_expr (tloc->gdbarch, tloc->address);
old_chain = make_cleanup_free_agent_expr (aexpr);
string_printf (action_exp, NULL, gen_printf_expr_callback,
tloc, aexpr);
ax_simple (aexpr, aop_end);
ax_reqs (aexpr);
report_agent_reqs_errors (aexpr);
discard_cleanups (old_chain);
add_aexpr (collect, aexpr);
}
else else
error (_("Invalid tracepoint command '%s'"), action->line); error (_("Invalid tracepoint command '%s'"), action->line);
} /* for */ } /* for */