diff options
author | Hui Zhu <teawater@gmail.com> | 2011-02-21 08:39:14 +0000 |
---|---|---|
committer | Hui Zhu <teawater@gmail.com> | 2011-02-21 08:39:14 +0000 |
commit | f9c6ff7236667717e278b079ead15e09434791fc (patch) | |
tree | 10fdd97698f3b019131651c369b75434cee8c058 /gdb/gdbserver | |
parent | d0e92d82d87a287847fcd66da278836f7136a3ef (diff) | |
download | gdb-f9c6ff7236667717e278b079ead15e09434791fc.zip gdb-f9c6ff7236667717e278b079ead15e09434791fc.tar.gz gdb-f9c6ff7236667717e278b079ead15e09434791fc.tar.bz2 |
2011-02-21 Hui Zhu <teawater@gmail.com>
* tracepoint.c (tp_printf): New function.
(eval_agent_expr): Handle gdb_agent_op_printf.
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r-- | gdb/gdbserver/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/gdbserver/tracepoint.c | 44 |
2 files changed, 49 insertions, 0 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 4d54d97..0f7655f 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,8 @@ +2011-02-21 Hui Zhu <teawater@gmail.com> + + * tracepoint.c (tp_printf): New function. + (eval_agent_expr): Handle gdb_agent_op_printf. + 2011-02-18 Tom Tromey <tromey@redhat.com> * Makefile.in (tracepoint-ipa.o): Depend on ax.def. diff --git a/gdb/gdbserver/tracepoint.c b/gdb/gdbserver/tracepoint.c index 8d99c94..d897728 100644 --- a/gdb/gdbserver/tracepoint.c +++ b/gdb/gdbserver/tracepoint.c @@ -4214,6 +4214,16 @@ gdb_agent_op_name (int op) return gdb_agent_op_names[op]; } +int +tp_printf (const char *format, ...) +{ + va_list ap; + va_start (ap, format); + vprintf (format, ap); + va_end (ap); + return 0; +} + /* The agent expression evaluator, as specified by the GDB docs. It returns 0 if everything went OK, and a nonzero error code otherwise. */ @@ -4573,6 +4583,40 @@ eval_agent_expr (struct tracepoint_hit_ctx *ctx, agent_tsv_read (tframe, arg); break; + case gdb_agent_op_printf: + { + void *argv; + arg = aexpr->bytes[pc++]; + argv = (void *) (unsigned long) top; + if (--sp >= 0) + top = stack[sp]; + + if (arg) + { + if (strstr ((char *) (aexpr->bytes + pc), "%s")) + { + int i; + unsigned char buf[100]; + + for (i = 0; i < 100; i++) + { + agent_mem_read (tframe, buf + i, + (CORE_ADDR) ((unsigned long)argv + i), + 1); + if (!buf[i]) + break; + } + tp_printf ((char *) (aexpr->bytes + pc), buf); + } + else + tp_printf ((char *) (aexpr->bytes + pc), argv); + } + else + tp_printf ((char *) (aexpr->bytes + pc)); + pc += strlen ((char *) aexpr->bytes + pc) + 1; + } + break; + /* GDB never (currently) generates any of these ops. */ case gdb_agent_op_float: case gdb_agent_op_ref_float: |