This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [PATCH]Add option "-at" to "maint agent" and "maint agent-eval"
- From: Hui Zhu <teawater at gmail dot com>
- To: Eli Zaretskii <eliz at gnu dot org>
- Cc: gdb-patches at sourceware dot org, stan_shebs at mentor dot com, Yao_Qi at mentor dot com
- Date: Thu, 5 Jul 2012 08:37:04 +0800
- Subject: Re: [PATCH]Add option "-at" to "maint agent" and "maint agent-eval"
- References: <CANFwon2gboB-_waNACh1jSxrsXeuDSsEq=+b2yDnQV1Q1x4e+g@mail.gmail.com> <83a9zo8x8j.fsf@gnu.org>
On Thu, Jun 28, 2012 at 1:45 AM, Eli Zaretskii <eliz@gnu.org> wrote:
>> From: Hui Zhu <teawater@gmail.com>
>> Date: Sun, 24 Jun 2012 14:59:08 +0800
>> Cc: Stan Shebs <stan_shebs@mentor.com>, Yao Qi <Yao_Qi@mentor.com>,
>> Eli Zaretskii <eliz@gnu.org>
>> According the comments form Stan in
>> http://sourceware.org/ml/gdb/2012-06/msg00060.html
>> I post these patches for add option "-at" to "maint agent" and "maint
>> agent-eval".
>
> Thanks.
>
>>
>> Thanks,
>> Hui
>>
>> 2012-06-24 Hui Zhu <hui_zhu@mentor.com>
>>
>> * breakpoint.c (check_for_argument): Move to file cli/cli-utils.c.
>> * cli/cli-utils.c (check_for_argument): New function.
>> * cli/cli-utils.h (check_for_argument): Ditto.
>>
>> 2012-06-24 Hui Zhu <hui_zhu@mentor.com>
>>
>> * ax-gdb.c (cli/cli-utils.h): New include.
>> (linespec.h): Ditto.
>> (agent_eval_command_one): New function.
>> (agent_command_1): Ditto.
>> (agent_command): Call function agent_command_1.
>> (agent_eval_command): Ditto.
>> (_initialize_ax_gdb): Change help for "maint agent"
>> and "maint agent-eval".
>>
>> 2012-06-24 Hui Zhu <hui_zhu@mentor.com>
>>
>> * gdb.texinfo (Maintenance Commands): Change help for "maint agent"
>> and "maint agent-eval".
>>
>> [2:text/plain Hide Save:check_for_argument_move_cli_utils.txt (2kB)]
>>
>> ---
>> breakpoint.c | 17 -----------------
>> cli/cli-utils.c | 14 ++++++++++++++
>> cli/cli-utils.h | 6 ++++++
>> 3 files changed, 20 insertions(+), 17 deletions(-)
>>
>> --- a/breakpoint.c
>> +++ b/breakpoint.c
>> @@ -10862,23 +10862,6 @@ watch_command_wrapper (char *arg, int fr
>> watch_command_1 (arg, hw_write, from_tty, 0, internal);
>> }
>>
>> -/* A helper function that looks for an argument at the start of a
>> - string. The argument must also either be at the end of the string,
>> - or be followed by whitespace. Returns 1 if it finds the argument,
>> - 0 otherwise. If the argument is found, it updates *STR. */
>> -
>> -static int
>> -check_for_argument (char **str, char *arg, int arg_len)
>> -{
>> - if (strncmp (*str, arg, arg_len) == 0
>> - && ((*str)[arg_len] == '\0' || isspace ((*str)[arg_len])))
>> - {
>> - *str += arg_len;
>> - return 1;
>> - }
>> - return 0;
>> -}
>> -
>> /* A helper function that looks for the "-location" argument and then
>> calls watch_command_1. */
>>
>> --- a/cli/cli-utils.c
>> +++ b/cli/cli-utils.c
>> @@ -286,3 +286,17 @@ extract_arg (char **arg)
>>
>> return copy;
>> }
>> +
>> +/* See documentation in cli-utils.h. */
>> +
>> +int
>> +check_for_argument (char **str, char *arg, int arg_len)
>> +{
>> + if (strncmp (*str, arg, arg_len) == 0
>> + && ((*str)[arg_len] == '\0' || isspace ((*str)[arg_len])))
>> + {
>> + *str += arg_len;
>> + return 1;
>> + }
>> + return 0;
>> +}
>> --- a/cli/cli-utils.h
>> +++ b/cli/cli-utils.h
>> @@ -114,4 +114,10 @@ extern char *remove_trailing_whitespace
>>
>> extern char *extract_arg (char **arg);
>>
>> +/* A helper function that looks for an argument at the start of a
>> + string. The argument must also either be at the end of the string,
>> + or be followed by whitespace. Returns 1 if it finds the argument,
>> + 0 otherwise. If the argument is found, it updates *STR. */
>> +extern int check_for_argument (char **str, char *arg, int arg_len);
>> +
>> #endif /* CLI_UTILS_H */
>>
>> [3:text/plain Hide Save:agent-at.txt (6kB)]
>>
>> ---
>> ax-gdb.c | 117 ++++++++++++++++++++++++++++++++++++++-------------------------
>> 1 file changed, 72 insertions(+), 45 deletions(-)
>>
>> --- a/ax-gdb.c
>> +++ b/ax-gdb.c
>> @@ -41,6 +41,8 @@
>> #include "tracepoint.h"
>> #include "cp-support.h"
>> #include "arch-utils.h"
>> +#include "cli/cli-utils.h"
>> +#include "linespec.h"
>>
>> #include "valprint.h"
>> #include "c-lang.h"
>> @@ -2504,40 +2506,32 @@ gen_trace_for_return_address (CORE_ADDR
>> }
>>
>> static void
>> -agent_command (char *exp, int from_tty)
>> +agent_eval_command_one (char *exp, int eval, CORE_ADDR pc)
>> {
>> struct cleanup *old_chain = 0;
>> struct expression *expr;
>> struct agent_expr *agent;
>> - struct frame_info *fi = get_current_frame (); /* need current scope */
>> -
>> - /* We don't deal with overlay debugging at the moment. We need to
>> - think more carefully about this. If you copy this code into
>> - another command, change the error message; the user shouldn't
>> - have to know anything about agent expressions. */
>> - if (overlay_debugging)
>> - error (_("GDB can't do agent expression translation with overlays."));
>> -
>> - if (exp == 0)
>> - error_no_arg (_("expression to translate"));
>>
>> - trace_string_kludge = 0;
>> - if (*exp == '/')
>> - exp = decode_agent_options (exp);
>> + if (!eval)
>> + {
>> + trace_string_kludge = 0;
>> + if (*exp == '/')
>> + exp = decode_agent_options (exp);
>> + }
>>
>> - /* Recognize the return address collection directive specially. Note
>> - that it is not really an expression of any sort. */
>> - if (strcmp (exp, "$_ret") == 0)
>> + if (!eval && strcmp (exp, "$_ret") == 0)
>> {
>> - agent = gen_trace_for_return_address (get_frame_pc (fi),
>> - get_current_arch ());
>> + agent = gen_trace_for_return_address (pc, get_current_arch ());
>> old_chain = make_cleanup_free_agent_expr (agent);
>> }
>> else
>> {
>> - expr = parse_expression (exp);
>> + expr = parse_exp_1 (&exp, block_for_pc (pc), 0);
>> old_chain = make_cleanup (free_current_contents, &expr);
>> - agent = gen_trace_for_expr (get_frame_pc (fi), expr);
>> + if (eval)
>> + agent = gen_eval_for_expr (pc, expr);
>> + else
>> + agent = gen_trace_for_expr (pc, expr);
>> make_cleanup_free_agent_expr (agent);
>> }
>>
>> @@ -2551,18 +2545,9 @@ agent_command (char *exp, int from_tty)
>> dont_repeat ();
>> }
>>
>> -/* Parse the given expression, compile it into an agent expression
>> - that does direct evaluation, and display the resulting
>> - expression. */
>> -
>> static void
>> -agent_eval_command (char *exp, int from_tty)
>> +agent_command_1 (char *exp, int eval)
>> {
>> - struct cleanup *old_chain = 0;
>> - struct expression *expr;
>> - struct agent_expr *agent;
>> - struct frame_info *fi = get_current_frame (); /* need current scope */
>> -
>> /* We don't deal with overlay debugging at the moment. We need to
>> think more carefully about this. If you copy this code into
>> another command, change the error message; the user shouldn't
>> @@ -2573,19 +2558,55 @@ agent_eval_command (char *exp, int from_
>> if (exp == 0)
>> error_no_arg (_("expression to translate"));
>>
>> - expr = parse_expression (exp);
>> - old_chain = make_cleanup (free_current_contents, &expr);
>> - agent = gen_eval_for_expr (get_frame_pc (fi), expr);
>> - make_cleanup_free_agent_expr (agent);
>> - ax_reqs (agent);
>> - ax_print (gdb_stdout, agent);
>> + if (check_for_argument (&exp, "-at", sizeof ("-at") - 1))
>> + {
>> + struct linespec_result canonical;
>> + int ix;
>> + struct linespec_sals *iter;
>> + struct cleanup *old_chain;
>>
>> - /* It would be nice to call ax_reqs here to gather some general info
>> - about the expression, and then print out the result. */
>> + exp = skip_spaces (exp);
>> + init_linespec_result (&canonical);
>> + decode_line_full (&exp, DECODE_LINE_FUNFIRSTLINE,
>> + (struct symtab *) NULL, 0, &canonical,
>> + NULL, NULL);
>> + old_chain = make_cleanup_destroy_linespec_result (&canonical);
>> + exp = skip_spaces (exp);
>> + if (exp[0] == ',')
>> + {
>> + exp++;
>> + exp = skip_spaces (exp);
>> + }
>> + for (ix = 0; VEC_iterate (linespec_sals, canonical.sals, ix, iter); ++ix)
>> + {
>> + int i;
>> +
>> + for (i = 0; i < iter->sals.nelts; i++)
>> + agent_eval_command_one (exp, eval, iter->sals.sals[i].pc);
>> + }
>> + do_cleanups (old_chain);
>> + }
>> + else
>> + agent_eval_command_one (exp, eval, get_frame_pc (get_current_frame ()));
>>
>> - do_cleanups (old_chain);
>> dont_repeat ();
>> }
>> +
>> +static void
>> +agent_command (char *exp, int from_tty)
>> +{
>> + agent_command_1 (exp, 0);
>> +}
>> +
>> +/* Parse the given expression, compile it into an agent expression
>> + that does direct evaluation, and display the resulting
>> + expression. */
>> +
>> +static void
>> +agent_eval_command (char *exp, int from_tty)
>> +{
>> + agent_command_1 (exp, 1);
>> +}
>>
>>
>> /* Initialization code. */
>> @@ -2595,12 +2616,18 @@ void
>> _initialize_ax_gdb (void)
>> {
>> add_cmd ("agent", class_maintenance, agent_command,
>> - _("Translate an expression into "
>> - "remote agent bytecode for tracing."),
>> + _("\
>> +Translate an expression into remote agent bytecode for tracing.\n\
>> +Usage: maint agent [-at location,] EXPRESSION\n\
>> +If -at is given, generate remote agent bytecode for this loation.\n\
> ^^^^^^^
> A typo.
>
>> +If -at is given, generate remote agent bytecode for this loation.\n\
>
> And here.
>
>> +@item maint agent @r{[}-at location@r{,}@r{]} @var{expression}
>> +@itemx maint agent-eval @r{[}-at location@r{,}@r{]} @var{expression}
>
> "location" should be in @var, as it is a parameter, like
> "expression".
>
>> +If @code{-at} is given, generate remote agent bytecode for this loation.
>
> Same typo as before, and please use "... for @var{location}", without
> "this".
>
> Btw, what does it mean to generate bytecode "for LOCATION"? how does
> the location come into play when bytecode is generated?
The location will come into play when generate bytecode about the local var.
>
>> +If not, generate remote agent bytecode for current frame pc address.
>
> Don't we use "PC", in caps, usually?
>
> OK with those changes.
Thanks. All of them are fixed.
Best,
Hui