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:
Hui Zhu
2011-02-21 08:38:14 +00:00
parent c0c8b2f268
commit d0e92d82d8
10 changed files with 229 additions and 22 deletions

View File

@@ -2445,6 +2445,65 @@ gen_eval_for_expr (CORE_ADDR scope, struct expression *expr)
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
agent_command (char *exp, int from_tty)
{