mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-28 18:10:46 +00:00
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:
59
gdb/ax-gdb.c
59
gdb/ax-gdb.c
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user