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]

Re: [commit] update alpha-osf to new value-based unwinding


Joel Brobecker wrote:

> I just committed the following patch to update the alpha-osf port
> to the new value-based unwinding approach. I couldn't test it with
> the testsuite because, for some reason,  I can't make dejagnu/expect
> /tcl work anymore. So I used AdaCore's GDB testsuite instead.

If you have a way of testing on that platform, would you mind
testing the following patch?  This switches alpha-mdebug-tdep.c
to use trad-frame instead of relying SIZEOF_FRAME_SAVED_REGS;
if this is in, we can finally get rid of that macro ...

Thanks,
Ulrich


ChangeLog:

	* alpha-mdebug-tdep.c: Include "trad-frame.h".
	(struct alpha_mdebug_unwind_cache): Change type of SAVED_REGS to
	struct trad_frame_saved_reg *.
	(alpha_mdebug_frame_unwind_cache): Allocate SAVED_REGS using
	trad_frame_alloc_saved_regs.  Update accesses.  Record previous
	value of SP as being vfp.
	(alpha_mdebug_frame_prev_register): Use trad_frame_get_prev_register.
	* Makefile.in (alpha-mdebug-tdep.o): Update dependencies.


diff -urNp gdb-orig/gdb/alpha-mdebug-tdep.c gdb-head/gdb/alpha-mdebug-tdep.c
--- gdb-orig/gdb/alpha-mdebug-tdep.c	2008-05-16 22:36:17.000000000 +0200
+++ gdb-head/gdb/alpha-mdebug-tdep.c	2008-05-16 23:55:38.000000000 +0200
@@ -26,6 +26,7 @@
 #include "block.h"
 #include "gdb_assert.h"
 #include "gdb_string.h"
+#include "trad-frame.h"
 
 #include "alpha-tdep.h"
 #include "mdebugread.h"
@@ -170,7 +171,7 @@ struct alpha_mdebug_unwind_cache
 {
   struct mdebug_extra_func_info *proc_desc;
   CORE_ADDR vfp;
-  CORE_ADDR *saved_regs;
+  struct trad_frame_saved_reg *saved_regs;
 };
 
 /* Extract all of the information about the frame from PROC_DESC
@@ -201,7 +202,7 @@ alpha_mdebug_frame_unwind_cache (struct 
   info->proc_desc = proc_desc;
   gdb_assert (proc_desc != NULL);
 
-  info->saved_regs = frame_obstack_zalloc (SIZEOF_FRAME_SAVED_REGS);
+  info->saved_regs = trad_frame_alloc_saved_regs (this_frame);
 
   /* The VFP of the frame is at FRAME_REG+FRAME_OFFSET.  */
   vfp = get_frame_register_unsigned (this_frame, PROC_FRAME_REG (proc_desc));
@@ -221,14 +222,14 @@ alpha_mdebug_frame_unwind_cache (struct 
       /* Clear bit for RA so we don't save it again later. */
       mask &= ~(1 << returnreg);
 
-      info->saved_regs[returnreg] = reg_position;
+      info->saved_regs[returnreg].addr = reg_position;
       reg_position += 8;
     }
 
   for (ireg = 0; ireg <= 31; ++ireg)
     if (mask & (1 << ireg))
       {
-	info->saved_regs[ireg] = reg_position;
+	info->saved_regs[ireg].addr = reg_position;
 	reg_position += 8;
       }
 
@@ -238,10 +239,15 @@ alpha_mdebug_frame_unwind_cache (struct 
   for (ireg = 0; ireg <= 31; ++ireg)
     if (mask & (1 << ireg))
       {
-	info->saved_regs[ALPHA_FP0_REGNUM + ireg] = reg_position;
+	info->saved_regs[ALPHA_FP0_REGNUM + ireg].addr = reg_position;
 	reg_position += 8;
       }
 
+  /* The stack pointer of the previous frame is computed by popping
+     the current stack frame.  */
+  if (!trad_frame_addr_p (info->saved_regs, ALPHA_SP_REGNUM))
+   trad_frame_set_value (info->saved_regs, ALPHA_SP_REGNUM, vfp);
+
   return info;
 }
 
@@ -274,19 +280,7 @@ alpha_mdebug_frame_prev_register (struct
   if (regnum == ALPHA_PC_REGNUM)
     regnum = PROC_PC_REG (info->proc_desc);
   
-  /* For all registers known to be saved in the current frame, 
-     do the obvious and pull the value out.  */
-  if (info->saved_regs[regnum])
-    return frame_unwind_got_memory (this_frame, regnum,
-                                    info->saved_regs[regnum]);
-
-  /* The stack pointer of the previous frame is computed by popping
-     the current stack frame.  */
-  if (regnum == ALPHA_SP_REGNUM)
-    return frame_unwind_got_constant (this_frame, regnum, info->vfp);
-
-  /* Otherwise assume the next frame has the same register value.  */
-    return frame_unwind_got_register (this_frame, regnum, regnum);
+  return trad_frame_get_prev_register (this_frame, info->saved_regs, regnum);
 }
 
 static int
diff -urNp gdb-orig/gdb/Makefile.in gdb-head/gdb/Makefile.in
--- gdb-orig/gdb/Makefile.in	2008-05-16 22:36:17.000000000 +0200
+++ gdb-head/gdb/Makefile.in	2008-05-16 23:52:56.000000000 +0200
@@ -1862,8 +1862,8 @@ alpha-linux-tdep.o: alpha-linux-tdep.c $
 	$(regcache_h) $(alpha_tdep_h)
 alpha-mdebug-tdep.o: alpha-mdebug-tdep.c $(defs_h) $(frame_h) \
 	$(frame_unwind_h) $(frame_base_h) $(symtab_h) $(gdbcore_h) \
-	$(block_h) $(gdb_assert_h) $(gdb_string_h) $(alpha_tdep_h) \
-	$(mdebugread_h)
+	$(block_h) $(gdb_assert_h) $(gdb_string_h) $(trad_frame_h) \
+	$(alpha_tdep_h) $(mdebugread_h)
 alpha-nat.o: alpha-nat.c $(defs_h) $(gdb_string_h) $(inferior_h) \
 	$(gdbcore_h) $(target_h) $(regcache_h) $(alpha_tdep_h) $(gregset_h)
 alphanbsd-tdep.o: alphanbsd-tdep.c $(defs_h) $(frame_h) $(gdbcore_h) \
-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  Ulrich.Weigand@de.ibm.com


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