Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Michael Snyder <msnyder@specifix.com>
To: Doug Evans <dje@google.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [RFA] mixed source+assembly from cli disassemble
Date: Wed, 09 Apr 2008 22:27:00 -0000	[thread overview]
Message-ID: <1207776316.31772.410.camel@localhost.localdomain> (raw)
In-Reply-To: <20080404003857.A5A451C72B9@localhost>

Going on a week...
No other comments, pro or con?


On Thu, 2008-04-03 at 17:38 -0700, Doug Evans wrote:
> The functionality is there, it seems a shame to not provide
> access to it.
> 
> This adds a /s modifier to disassemble.
> 
> 2008-04-03  Doug Evans  <dje@google.com>
> 
> 	* cli/cli-cmds.c (print_disassembly): New fn.
> 	(disassemble_current_function): New fn.
> 	(disassemble_command): Recognize /s modifier, print mixed
> 	source+assembly.
> 	(init_cli_cmds): Update disassemble help text.
> 
> Index: cli/cli-cmds.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/cli/cli-cmds.c,v
> retrieving revision 1.73
> diff -u -p -u -p -r1.73 cli-cmds.c
> --- cli/cli-cmds.c	1 Jan 2008 22:53:14 -0000	1.73
> +++ cli/cli-cmds.c	4 Apr 2008 00:33:42 -0000
> @@ -892,10 +892,76 @@ list_command (char *arg, int from_tty)
>  			0);
>  }
>  
> +/* Subroutine of disassemble_command to simplify it.
> +   Perform the disassembly.
> +   NAME is the name of the function if known, or NULL.
> +   [LOW,HIGH) are the range of addresses to disassemble.
> +   MIXED is non-zero to print source with the assembler.  */
> +
> +static void
> +print_disassembly (const char *name, CORE_ADDR low, CORE_ADDR high, int mixed)
> +{
> +#if defined(TUI)
> +  if (!tui_is_window_visible (DISASSEM_WIN))
> +#endif
> +    {
> +      printf_filtered ("Dump of assembler code ");
> +      if (name != NULL)
> +	{
> +	  printf_filtered ("for function %s:\n", name);
> +	}
> +      else
> +	{
> +	  printf_filtered ("from ");
> +	  deprecated_print_address_numeric (low, 1, gdb_stdout);
> +	  printf_filtered (" to ");
> +	  deprecated_print_address_numeric (high, 1, gdb_stdout);
> +	  printf_filtered (":\n");
> +	}
> +
> +      /* Dump the specified range.  */
> +      gdb_disassembly (uiout, 0, 0, mixed, -1, low, high);
> +
> +      printf_filtered ("End of assembler dump.\n");
> +      gdb_flush (gdb_stdout);
> +    }
> +#if defined(TUI)
> +  else
> +    {
> +      tui_show_assembly (low);
> +    }
> +#endif
> +}
> +
> +/* Subroutine of disassemble_command to simplify it.
> +   Print a disassembly of the current function.
> +   MIXED is non-zero to print source with the assembler.  */
> +
> +static void
> +disassemble_current_function (int mixed)
> +{
> +  CORE_ADDR low, high, pc;
> +  char *name;
> +
> +  pc = get_frame_pc (get_selected_frame (_("No frame selected.")));
> +  if (find_pc_partial_function (pc, &name, &low, &high) == 0)
> +    error (_("No function contains program counter for selected frame."));
> +#if defined(TUI)
> +  /* NOTE: cagney/2003-02-13 The `tui_active' was previously
> +     `tui_version'.  */
> +  if (tui_active)
> +    /* FIXME: cagney/2004-02-07: This should be an observer.  */
> +    low = tui_get_low_disassembly_address (low, pc);
> +#endif
> +  low += gdbarch_deprecated_function_start_offset (current_gdbarch);
> +
> +  print_disassembly (name, low, high, mixed);
> +}
> +
>  /* Dump a specified section of assembly code.  With no command line
>     arguments, this command will dump the assembly code for the
>     function surrounding the pc value in the selected frame.  With one
> -   argument, it will dump the assembly code surrounding that pc value.
> +
>     Two arguments are interpeted as bounds within which to dump
>     assembly.  */
>  
> @@ -906,26 +972,44 @@ disassemble_command (char *arg, int from
>    char *name;
>    CORE_ADDR pc, pc_masked;
>    char *space_index;
> -#if 0
> -  asection *section;
> -#endif
> +  int mixed_source_and_assembly;
>  
>    name = NULL;
> -  if (!arg)
> +  mixed_source_and_assembly = 0;
> +
> +  if (arg && *arg == '/')
>      {
> -      pc = get_frame_pc (get_selected_frame (_("No frame selected.")));
> -      if (find_pc_partial_function (pc, &name, &low, &high) == 0)
> -	error (_("No function contains program counter for selected frame."));
> -#if defined(TUI)
> -      /* NOTE: cagney/2003-02-13 The `tui_active' was previously
> -	 `tui_version'.  */
> -      if (tui_active)
> -	/* FIXME: cagney/2004-02-07: This should be an observer.  */
> -	low = tui_get_low_disassembly_address (low, pc);
> -#endif
> -      low += gdbarch_deprecated_function_start_offset (current_gdbarch);
> +      ++arg;
> +
> +      if (*arg == '\0')
> +	error (_("Missing modifier."));
> +
> +      while (*arg && ! isspace (*arg))
> +	{
> +	  switch (*arg++)
> +	    {
> +	    case 's':
> +	      mixed_source_and_assembly = 1;
> +	      break;
> +	    default:
> +	      error (_("Invalid disassembly modifier."));
> +	    }
> +	}
> +
> +      while (isspace (*arg))
> +	++arg;
> +    }
> +
> +  if (! arg || ! *arg)
> +    {
> +      disassemble_current_function (mixed_source_and_assembly);
> +      return;
>      }
> -  else if (!(space_index = (char *) strchr (arg, ' ')))
> +
> +  /* FIXME: 'twould be nice to allow spaces in the expression for the first
> +     arg.  Allow comma separater too?  */
> +
> +  if (!(space_index = (char *) strchr (arg, ' ')))
>      {
>        /* One argument.  */
>        pc = parse_and_eval_address (arg);
> @@ -948,36 +1032,7 @@ disassemble_command (char *arg, int from
>        high = parse_and_eval_address (space_index + 1);
>      }
>  
> -#if defined(TUI)
> -  if (!tui_is_window_visible (DISASSEM_WIN))
> -#endif
> -    {
> -      printf_filtered ("Dump of assembler code ");
> -      if (name != NULL)
> -	{
> -	  printf_filtered ("for function %s:\n", name);
> -	}
> -      else
> -	{
> -	  printf_filtered ("from ");
> -	  deprecated_print_address_numeric (low, 1, gdb_stdout);
> -	  printf_filtered (" to ");
> -	  deprecated_print_address_numeric (high, 1, gdb_stdout);
> -	  printf_filtered (":\n");
> -	}
> -
> -      /* Dump the specified range.  */
> -      gdb_disassembly (uiout, 0, 0, 0, -1, low, high);
> -
> -      printf_filtered ("End of assembler dump.\n");
> -      gdb_flush (gdb_stdout);
> -    }
> -#if defined(TUI)
> -  else
> -    {
> -      tui_show_assembly (low);
> -    }
> -#endif
> +  print_disassembly (name, low, high, mixed_source_and_assembly);
>  }
>  
>  static void
> @@ -1383,6 +1438,7 @@ With two args if one is empty it stands 
>    c = add_com ("disassemble", class_vars, disassemble_command, _("\
>  Disassemble a specified section of memory.\n\
>  Default is the function surrounding the pc of the selected frame.\n\
> +With a leading /s modifier source lines, if available, are included.\n\
>  With a single argument, the function surrounding that address is dumped.\n\
>  Two arguments are taken as a range of memory to dump."));
>    set_cmd_completer (c, location_completer);
> Index: doc/gdb.texinfo
> ===================================================================
> RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v
> retrieving revision 1.479
> diff -u -p -u -p -r1.479 gdb.texinfo
> --- doc/gdb.texinfo	3 Apr 2008 21:51:11 -0000	1.479
> +++ doc/gdb.texinfo	4 Apr 2008 00:33:42 -0000
> @@ -5419,7 +5419,9 @@ Variables}).
>  @cindex listing machine instructions
>  @item disassemble
>  This specialized command dumps a range of memory as machine
> -instructions.  The default memory range is the function surrounding the
> +instructions.  It can also print mixed source+disassembly by specifying
> +the @code{/s} modifier.
> +The default memory range is the function surrounding the
>  program counter of the selected frame.  A single argument to this
>  command is a program counter value; @value{GDBN} dumps the function
>  surrounding this value.  Two arguments specify a range of addresses


  parent reply	other threads:[~2008-04-09 21:25 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-04-04  3:26 Doug Evans
2008-04-04  9:17 ` Michael Snyder
2008-04-04  9:26   ` Doug Evans
2008-04-04  9:58     ` Eli Zaretskii
2008-04-09 22:27 ` Michael Snyder [this message]
2008-04-10 12:35   ` Joel Brobecker
2008-04-11  8:55     ` Michael Snyder
2008-04-15 20:32       ` Michael Snyder
2008-04-16 21:16 ` Joel Brobecker
2008-04-16 21:22   ` Doug Evans
2008-04-16 22:49   ` Doug Evans
2008-04-17 21:29     ` Joel Brobecker
2008-04-17 22:01       ` Daniel Jacobowitz
2008-04-17 22:45         ` Joel Brobecker
2008-04-28 18:52     ` Fwd: " Doug Evans
2008-04-29  0:54       ` Eli Zaretskii
2008-05-06  3:15         ` Doug Evans

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=1207776316.31772.410.camel@localhost.localdomain \
    --to=msnyder@specifix.com \
    --cc=dje@google.com \
    --cc=gdb-patches@sourceware.org \
    /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