This is the mail archive of the gdb-patches@sourceware.org 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]

[m68k] Correct dwarf register numbering


The m68k port was using a one-to-one mapping between dwarf register numbers and gdb register numbers. That's incorrect as the floating point registers have dwarf numbers 16..23 but gdb register numbers 18..25. Furthermore, GCC indicates the return column is register 25, which maps onto the last fp register.

This patch adds a mapping function. ok?

nathan
--
Nathan Sidwell    ::   http://www.codesourcery.com   ::         CodeSourcery
nathan@codesourcery.com    ::     http://www.planetfall.pwp.blueyonder.co.uk

2006-06-05  Nathan Sidwell  <nathan@codesourcery.com>

	* gdb/m68k-tdep.c (m68k_dwarf_reg_to_regnum): New.
	(m68k_gdbarch_init): Set it for dwarf & dwarf2 reg number
	conversion. Use M68K_NUM_REGS for number of regs.

Index: gdb/m68k-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/m68k-tdep.c,v
retrieving revision 1.105.2.3
diff -c -3 -p -r1.105.2.3 m68k-tdep.c
*** gdb/m68k-tdep.c	5 Jun 2006 14:51:35 -0000	1.105.2.3
--- gdb/m68k-tdep.c	5 Jun 2006 14:55:01 -0000
*************** m68k_push_dummy_call (struct gdbarch *gd
*** 555,560 ****
--- 557,584 ----
       frame's CFA.  */
    return sp + 8;
  }
+ 
+ /* Convert a dwarf or dwarf2 regnumber to a GDB regnum */
+ 
+ static int
+ m68k_dwarf_reg_to_regnum (int num)
+ {
+   if (num < 8)
+     /* d0..7 */
+     return (num - 0) + M68K_D0_REGNUM;
+   else if (num < 16)
+     /* a0..7 */
+     return (num - 8) + M68K_A0_REGNUM;
+   else if (num < 24)
+     /* fp0..7 */
+     return (num - 16) + M68K_FP0_REGNUM;
+   else if (num == 25)
+     /* pc */
+     return M68K_PC_REGNUM;
+   else
+     return NUM_REGS + NUM_PSEUDO_REGS;
+ }
+ 
  
  struct m68k_frame_cache
  {
*************** m68k_gdbarch_init (struct gdbarch_info i
*** 1240,1249 ****
    set_gdbarch_decr_pc_after_break (gdbarch, 2);
  
    set_gdbarch_frame_args_skip (gdbarch, 8);
  
    set_gdbarch_register_type (gdbarch, m68k_register_type);
    set_gdbarch_register_name (gdbarch, m68k_register_name);
!   set_gdbarch_num_regs (gdbarch, 29);
    set_gdbarch_register_bytes_ok (gdbarch, m68k_register_bytes_ok);
    set_gdbarch_sp_regnum (gdbarch, M68K_SP_REGNUM);
    set_gdbarch_pc_regnum (gdbarch, M68K_PC_REGNUM);
--- 1264,1275 ----
    set_gdbarch_decr_pc_after_break (gdbarch, 2);
  
    set_gdbarch_frame_args_skip (gdbarch, 8);
+   set_gdbarch_dwarf_reg_to_regnum (gdbarch, m68k_dwarf_reg_to_regnum);
+   set_gdbarch_dwarf2_reg_to_regnum (gdbarch, m68k_dwarf_reg_to_regnum);
  
    set_gdbarch_register_type (gdbarch, m68k_register_type);
    set_gdbarch_register_name (gdbarch, m68k_register_name);
!   set_gdbarch_num_regs (gdbarch, M68K_NUM_REGS);
    set_gdbarch_register_bytes_ok (gdbarch, m68k_register_bytes_ok);
    set_gdbarch_sp_regnum (gdbarch, M68K_SP_REGNUM);
    set_gdbarch_pc_regnum (gdbarch, M68K_PC_REGNUM);

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