This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFC: Moving disassembler_command to cli land and using newer disassemblercode


As soon as I can solve the small output differences between what is printed by the old code and what the new one prints I will be doing the following code migration, removing one more cli command from the library and making it use the disassembler code in disasm.c.

This will allow us to have an option to have disassembler in mixed source and assembler mode in the CLI as well. But that is for when I come back.

The differences in the output are the "+0" in symbolic addresses (which I've mentioned in a separate message) and the leading zeros in the numeric addresses (see printouts below). The old code used print_address_numeric() and the new code uses ui_out_field_core_addr(). W.r.t. this leading zero(s), I am not sure if we should print it or not (I can just update the test file).RFC:

Output with old code:
disassem foostatic
Dump of assembler code for function foostatic:
0x8048153 <foostatic>: push %ebp
0x8048154 <foostatic+1>: mov %esp,%ebp
0x8048156 <foostatic+3>: pop %ebp
0x8048157 <foostatic+4>: ret
End of assembler dump.
(gdb) PASS: gdb.asm/asm-source.exp: look at static function

Output with new code:
disassem foostatic^M
Dump of assembler code for function foostatic:^M
0x08048153 <foostatic+0>: push %ebp^M
0x08048154 <foostatic+1>: mov %esp,%ebp^M
0x08048156 <foostatic+3>: pop %ebp^M
0x08048157 <foostatic+4>: ret ^M
End of assembler dump.^M
(gdb) FAIL: gdb.asm/asm-source.exp: look at static function




--
Fernando Nasser
Red Hat - Toronto E-Mail: fnasser@redhat.com
2323 Yonge Street, Suite #300
Toronto, Ontario M4P 2C9
Index: printcmd.c
===================================================================
RCS file: /cvs/src/src/gdb/printcmd.c,v
retrieving revision 1.43
diff -c -p -r1.43 printcmd.c
*** printcmd.c	19 Sep 2002 03:58:41 -0000	1.43
--- printcmd.c	30 Sep 2002 21:13:12 -0000
***************
*** 41,46 ****
--- 41,47 ----
  #include "completer.h"		/* for completion functions */
  #include "ui-out.h"
  #include "gdb_assert.h"
+ #include "disasm.h"
  
  extern int asm_demangle;	/* Whether to demangle syms in asm printouts */
  extern int addressprint;	/* Whether to print hex addresses in HLL " */
*************** static void enable_display (char *, int)
*** 136,143 ****
  
  static void disable_display_command (char *, int);
  
- static void disassemble_command (char *, int);
- 
  static void printf_command (char *, int);
  
  static void print_frame_nameless_args (struct frame_info *, long,
--- 137,142 ----
*************** printf_command (char *arg, int from_tty)
*** 2260,2373 ****
    }
    do_cleanups (old_cleanups);
  }
- 
- /* 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.  */
- 
- /* ARGSUSED */
- static void
- disassemble_command (char *arg, int from_tty)
- {
-   CORE_ADDR low, high;
-   char *name;
-   CORE_ADDR pc, pc_masked;
-   char *space_index;
- #if 0
-   asection *section;
- #endif
- 
-   name = NULL;
-   if (!arg)
-     {
-       if (!selected_frame)
- 	error ("No frame selected.\n");
- 
-       pc = get_frame_pc (selected_frame);
-       if (find_pc_partial_function (pc, &name, &low, &high) == 0)
- 	error ("No function contains program counter for selected frame.\n");
- #if defined(TUI)
-       else if (tui_version)
- 	low = tuiGetLowDisassemblyAddress (low, pc);
- #endif
-       low += FUNCTION_START_OFFSET;
-     }
-   else if (!(space_index = (char *) strchr (arg, ' ')))
-     {
-       /* One argument.  */
-       pc = parse_and_eval_address (arg);
-       if (find_pc_partial_function (pc, &name, &low, &high) == 0)
- 	error ("No function contains specified address.\n");
- #if defined(TUI)
-       else if (tui_version)
- 	low = tuiGetLowDisassemblyAddress (low, pc);
- #endif
-       low += FUNCTION_START_OFFSET;
-     }
-   else
-     {
-       /* Two arguments.  */
-       *space_index = '\0';
-       low = parse_and_eval_address (arg);
-       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 ");
- 	  print_address_numeric (low, 1, gdb_stdout);
- 	  printf_filtered (" to ");
- 	  print_address_numeric (high, 1, gdb_stdout);
- 	  printf_filtered (":\n");
- 	}
- 
-       /* Dump the specified range.  */
-       pc = low;
- 
- #ifdef GDB_TARGET_MASK_DISAS_PC
-       pc_masked = GDB_TARGET_MASK_DISAS_PC (pc);
- #else
-       pc_masked = pc;
- #endif
- 
-       while (pc_masked < high)
- 	{
- 	  QUIT;
- 	  print_address (pc_masked, gdb_stdout);
- 	  printf_filtered (":\t");
- 	  /* We often wrap here if there are long symbolic names.  */
- 	  wrap_here ("    ");
- 	  pc += print_insn (pc, gdb_stdout);
- 	  printf_filtered ("\n");
- 
- #ifdef GDB_TARGET_MASK_DISAS_PC
- 	  pc_masked = GDB_TARGET_MASK_DISAS_PC (pc);
- #else
- 	  pc_masked = pc;
- #endif
- 	}
-       printf_filtered ("End of assembler dump.\n");
-       gdb_flush (gdb_stdout);
-     }
- #if defined(TUI)
-   else
-     {
-       tui_show_assembly (low);
-     }
- #endif
- }
  
  /* Print the instruction at address MEMADDR in debugged memory,
     on STREAM.  Returns length of the instruction, in bytes.  */
--- 2259,2264 ----
*************** according to the format.\n\n\
*** 2416,2430 ****
  Defaults for format and size letters are those previously used.\n\
  Default count is 1.  Default address is following last thing printed\n\
  with this command or \"print\".", NULL));
- 
-   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 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);
-   if (xdb_commands)
-     add_com_alias ("va", "disassemble", class_xdb, 0);
  
  #if 0
    add_com ("whereis", class_vars, whereis_command,
--- 2307,2312 ----
Index: cli/cli-cmds.c
===================================================================
RCS file: /cvs/src/src/gdb/cli/cli-cmds.c,v
retrieving revision 1.22
diff -c -p -r1.22 cli-cmds.c
*** cli/cli-cmds.c	22 Sep 2002 22:18:41 -0000	1.22
--- cli/cli-cmds.c	30 Sep 2002 21:13:13 -0000
***************
*** 27,36 ****
--- 27,39 ----
  #include "gdb_string.h"
  #include "linespec.h"
  #include "expression.h"
+ #include "frame.h"
+ #include "value.h"
  #include "language.h"
  #include "filenames.h"		/* for DOSish file names */
  #include "objfiles.h"
  #include "source.h"
+ #include "disasm.h"
  
  #include "ui-out.h"
  
*************** list_command (char *arg, int from_tty)
*** 819,824 ****
--- 822,913 ----
  			0);
  }
  
+ /* 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.  */
+ 
+ /* ARGSUSED */
+ static void
+ disassemble_command (char *arg, int from_tty)
+ {
+   CORE_ADDR low, high;
+   char *name;
+   CORE_ADDR pc, pc_masked;
+   char *space_index;
+ #if 0
+   asection *section;
+ #endif
+ 
+   name = NULL;
+   if (!arg)
+     {
+       if (!selected_frame)
+ 	error ("No frame selected.\n");
+ 
+       pc = get_frame_pc (selected_frame);
+       if (find_pc_partial_function (pc, &name, &low, &high) == 0)
+ 	error ("No function contains program counter for selected frame.\n");
+ #if defined(TUI)
+       else if (tui_version)
+ 	low = tuiGetLowDisassemblyAddress (low, pc);
+ #endif
+       low += FUNCTION_START_OFFSET;
+     }
+   else if (!(space_index = (char *) strchr (arg, ' ')))
+     {
+       /* One argument.  */
+       pc = parse_and_eval_address (arg);
+       if (find_pc_partial_function (pc, &name, &low, &high) == 0)
+ 	error ("No function contains specified address.\n");
+ #if defined(TUI)
+       else if (tui_version)
+ 	low = tuiGetLowDisassemblyAddress (low, pc);
+ #endif
+       low += FUNCTION_START_OFFSET;
+     }
+   else
+     {
+       /* Two arguments.  */
+       *space_index = '\0';
+       low = parse_and_eval_address (arg);
+       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 ");
+ 	  print_address_numeric (low, 1, gdb_stdout);
+ 	  printf_filtered (" to ");
+ 	  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
+ }
+ 
  static void
  make_command (char *arg, int from_tty)
  {
*************** With two args if one is empty it stands 
*** 1157,1162 ****
--- 1246,1259 ----
    if (dbx_commands)
      add_com_alias ("file", "list", class_files, 1);
  
+   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 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);
+   if (xdb_commands)
+     add_com_alias ("va", "disassemble", class_xdb, 0);
  
    /* NOTE: cagney/2000-03-20: Being able to enter ``(gdb) !ls'' would
       be a really useful feature.  Unfortunately, the below wont do

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]