Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Vladimir Prus <ghost@cs.msu.su>
To: Nick Roberts <nickrob@snap.net.nz>, gdb-patches@sources.redhat.com
Subject: Re: variable objects and registers
Date: Tue, 19 Dec 2006 17:59:00 -0000	[thread overview]
Message-ID: <E1GwjEo-00030H-Me@zigzag.lvk.cs.msu.su> (raw)
In-Reply-To: <17782.41205.881283.845357@kahikatea.snap.net.nz>

Nick Roberts wrote:

> Vladimir Prus writes:
>> This patch adds new command -var-registers that creates and returns a
>> list of variable objects for all registers gdb knows. The command takes
>> one option -- the frame, which is specified just like for -var-create.
>> While not all registers are saved, and so gdb might not know values of
>> some registers in parent frames, for some registers it's possible, and
>> frontends might want to access those values.
> 
> 
>> Here's example output:
> 
>>      -var-registers *
>>      ^done,registers={
>        ^done,registers=[

Doh!

> 
>>{name="var1",exp="$eax",numchild="0",value="16",type="int"},
>>............
>>                {name="var10",exp="$eflags",numchild="0",value="[ SF IF ID
>>                {]",
> 
> 
> Since this command creates new variable objects, perhaps it should be
> called something like -var-create-registers.

I'm not sure, since the command does not creates registers, it creates
variable objects, and

        -var-create-for-registers

is a bit long. Maybe 

        -var-list-registers

I'm unsure about right naming.

> 
> Alternatively, taking things further, instead of reusing some code for
> each command through create_varobj_in_frame, perhaps you could have just
> one command:
> 
> "-var-create" and "-var-create -r" for registers ("-var-create -m" for
> memory-mapped registers).
> 
> I've not thought it through, I'm just brainstorming.

We also need a command to create varobj for all locals, because with
variable hiding, you can't create them using expression. Would that be

        -var-create -l

? Or maybe we should not mix easy "create one varobj from expression"
command with "create a bunch of varobj" command and add the following:

        -var-create-and-list --registers ...
        -var-create-and-list --locals ...
        -var-create-and-list --whatever-else ...

or just "-var-list"? On the other hand, on Apple branch the varobjs for
locals are created using

        -stack-list-locals --make-varobjs

I slightly prefer

        -var-list --locals

but again, not 100% sure.

> --- gdb/mi/mi-cmd-var.c       (/patches/gdb/varobj_printing/gdb_mainline)
> (revision 2338)
> +++ gdb/mi/mi-cmd-var.c       (/patches/gdb/varobj_for_registers/gdb_mainline)
> (revision 2338) @@ -68,16 +68,39 @@
>  
>  /* VAROBJ operations */
>  
> +static struct varobj *
> +create_varobj_in_frame (char *name, char *expression, char *frame)
> +{
> +  CORE_ADDR frameaddr = 0;
> +  struct cleanup *cleanup;
> +  enum varobj_type var_type;
> +
> +  if (strcmp (frame, "*") == 0)
> +    var_type = USE_CURRENT_FRAME;
> +  else if (strcmp (frame, "@") == 0)
> +    var_type = USE_SELECTED_FRAME;
> +  else
> +    {
> +      var_type = USE_SPECIFIED_FRAME;
> +      frameaddr = string_to_core_addr (frame);
> +    }
> +
> +  if (varobjdebug)
> +    fprintf_unfiltered (gdb_stdlog,
> +                 "Name=\"%s\", Frame=\"%s\" (0x%s), Expression=\"%s\"\n",
> +                     name, frame, paddr (frameaddr), expression);
> +
> +  return varobj_create (name, expression, frameaddr, var_type);
> +}
> +
> 
> I think the function above should go in varobj.c

Then, the varobj.c would have to expose magic "@" and "*" values in its
interface. I think it's better to keep this closer to parsing code and keep
varobj.c separated.

> 
> 
> ...
> +  numregs = NUM_REGS + NUM_PSEUDO_REGS;
> +
> +  make_cleanup_ui_out_tuple_begin_end (uiout, "registers");
> 
> I think this should be
> 
> make_cleanup_ui_out_list_begin_end (uiout, "registers");

Yeah, fixed.

> +  for (regnum = 0; regnum < numregs; regnum++)
> +    {
> +      if (REGISTER_NAME (regnum) != NULL
> +       && *(REGISTER_NAME (regnum)) != '\0')
> +     {
> +       char *name;
> +       char *expression;
> +       struct varobj *var;
> +       struct cleanup *cleanup_child;
> +
> +       name = varobj_gen_name ();
> +       make_cleanup (free_current_contents, &name);
> +
> +       expression = xstrprintf ("$%s", REGISTER_NAME (regnum));
> +       make_cleanup (xfree, expression);
> +
> +       var = create_varobj_in_frame (name, expression, frame);
> +
> +       cleanup_child = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
> +       print_varobj (var, PRINT_ALL_VALUES, 1 /* print expression */);
> +       do_cleanups (cleanup_child);
> +     }
> +    }
> +
> +  do_cleanups (cleanup);
> +  return MI_CMD_DONE;
> +}
> +
> +
> +enum mi_cmd_result
>  mi_cmd_var_delete (char *command, char **argv, int argc)
>  {
>    char *name;
> 
> 
> Daniel Jacobowitz writes:
> 
>> No one else had any comments, and it looks fine to me.  The patch looks
>> OK too.  It'll want a testcase, naturally.
> 
> And documentation too, hopefully!

Sure. We'd need to decide on command name, though.

Thanks,
Volodya



  reply	other threads:[~2006-12-19 17:59 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-12-06 10:57 Nick Roberts
2006-12-19 17:59 ` Vladimir Prus [this message]
2006-12-19 21:58   ` Nick Roberts
2006-12-20 18:39     ` Vladimir Prus
2006-12-20 20:34       ` Nick Roberts
2006-12-21  1:34         ` Nick Roberts
2006-12-21  6:34           ` Vladimir Prus
2006-12-21  7:57             ` Nick Roberts
2006-12-21  8:34               ` Vladimir Prus
2006-12-30 20:26           ` Daniel Jacobowitz
2006-12-30 20:41             ` Vladimir Prus
2006-12-30 20:50               ` Daniel Jacobowitz
2006-12-30 23:05                 ` Nick Roberts
2006-12-21  6:43         ` Vladimir Prus
2006-12-21  8:34           ` Nick Roberts
     [not found]             ` <0E190425-7C4F-4C6E-B8B3-9A3FA79F6FE3@apple.com>
2006-12-21 23:30               ` Nick Roberts
     [not found]                 ` <1B6B17FA-65DE-4CE2-9BE0-20DA74780EEA@apple.com>
2006-12-22  4:47                   ` Nick Roberts
2006-12-22  6:23                     ` Vladimir Prus
2006-12-22  6:51                       ` Nick Roberts
2006-12-22  7:30                         ` Vladimir Prus
2007-01-05  9:04             ` Vladimir Prus
  -- strict thread matches above, loose matches on Subject: below --
2006-11-29 17:21 Vladimir Prus
2006-12-05 21:16 ` Daniel Jacobowitz
2006-12-06  9:25   ` Vladimir Prus
2006-12-19 22:02     ` Daniel Jacobowitz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=E1GwjEo-00030H-Me@zigzag.lvk.cs.msu.su \
    --to=ghost@cs.msu.su \
    --cc=gdb-patches@sources.redhat.com \
    --cc=nickrob@snap.net.nz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox