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]

[rfc]: Use trad_frame_alloc_saved_regs in alpha-tdep


Hi,

this is a follow-up from http://sourceware.org/ml/gdb-patches/2007-11/msg00301.html.

There are still some places where frame_obstack_zalloc is used instead of trad_frame_alloc_saved_regs.

This patch makes alpha-tdep use trad_frame_alloc_saved_regs. I'd appreciate it very much if someone with access to an alpha machine could run the testsuite.

Tested by building with enable-targets=all. Ok ?

ChangeLog:

* alpha-tdep.c (alpha_heuristic_unwind_cache): Replace saved_regs by
trad_frame_saved_reg. Remove return_reg.
(trad-frame.h): New include. (alpha_heuristic_frame_unwind_cache): Use trad_frame_alloc_saved_regs
instead of frame_obstack_zalloc. (alpha_heuristic_frame_prev_register): Use trad_frame_get_prev_register.


* Makefile.in (alpha-tdep.o): Add dependency to trad_frame_h.



--
 Markus Deuling
 GNU Toolchain for Linux on Cell BE
 deuling@de.ibm.com

diff -urpN src/gdb/alpha-tdep.c dev/gdb/alpha-tdep.c
--- src/gdb/alpha-tdep.c	2008-01-11 15:42:52.000000000 +0100
+++ dev/gdb/alpha-tdep.c	2008-02-13 08:36:44.000000000 +0100
@@ -40,6 +40,7 @@
 #include "osabi.h"
 #include "block.h"
 #include "infcall.h"
+#include "trad-frame.h"
 
 #include "elf-bfd.h"
 
@@ -900,16 +901,6 @@ alpha_sigtramp_frame_sniffer (struct fra
   return NULL;
 }
 
-/* Fallback alpha frame unwinder.  Uses instruction scanning and knows
-   something about the traditional layout of alpha stack frames.  */
-
-struct alpha_heuristic_unwind_cache
-{
-  CORE_ADDR *saved_regs;
-  CORE_ADDR vfp;
-  CORE_ADDR start_pc;
-  int return_reg;
-};
 
 /* Heuristic_proc_start may hunt through the text section for a long
    time across a 2400 baud serial line.  Allows the user to limit this
@@ -996,6 +987,16 @@ Otherwise, you told GDB there was a func
   return 0;
 }
 
+/* Fallback alpha frame unwinder.  Uses instruction scanning and knows
+   something about the traditional layout of alpha stack frames.  */
+
+struct alpha_heuristic_unwind_cache
+{ 
+  CORE_ADDR vfp;
+  CORE_ADDR start_pc;
+  struct trad_frame_saved_reg *saved_regs;
+};
+
 static struct alpha_heuristic_unwind_cache *
 alpha_heuristic_frame_unwind_cache (struct frame_info *next_frame,
 				    void **this_prologue_cache,
@@ -1012,7 +1013,7 @@ alpha_heuristic_frame_unwind_cache (stru
 
   info = FRAME_OBSTACK_ZALLOC (struct alpha_heuristic_unwind_cache);
   *this_prologue_cache = info;
-  info->saved_regs = frame_obstack_zalloc (SIZEOF_FRAME_SAVED_REGS);
+  info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
 
   limit_pc = frame_pc_unwind (next_frame);
   if (start_pc == 0)
@@ -1062,7 +1063,7 @@ alpha_heuristic_frame_unwind_cache (stru
                  All it says is that the function we are scanning reused
                  that register for some computation of its own, and is now
                  saving its result.  */
-              if (info->saved_regs[reg])
+              if (info->saved_regs[reg].addr)
                 continue;
 
 	      if (reg == 31)
@@ -1078,7 +1079,7 @@ alpha_heuristic_frame_unwind_cache (stru
 		 pointer or not.  */
 	      /* Hack: temporarily add one, so that the offset is non-zero
 		 and we can tell which registers have save offsets below.  */
-	      info->saved_regs[reg] = (word & 0xffff) + 1;
+	      info->saved_regs[reg].addr = (word & 0xffff) + 1;
 
 	      /* Starting with OSF/1-3.2C, the system libraries are shipped
 		 without local symbols, but they still contain procedure
@@ -1147,7 +1148,7 @@ alpha_heuristic_frame_unwind_cache (stru
   /* Failing that, do default to the customary RA.  */
   if (return_reg == -1)
     return_reg = ALPHA_RA_REGNUM;
-  info->return_reg = return_reg;
+  info->saved_regs[ALPHA_PC_REGNUM].realreg = return_reg;
 
   val = frame_unwind_register_unsigned (next_frame, frame_reg);
   info->vfp = val + frame_size;
@@ -1155,8 +1156,8 @@ alpha_heuristic_frame_unwind_cache (stru
   /* Convert offsets to absolute addresses.  See above about adding
      one to the offsets to make all detected offsets non-zero.  */
   for (reg = 0; reg < ALPHA_NUM_REGS; ++reg)
-    if (info->saved_regs[reg])
-      info->saved_regs[reg] += val - 1;
+    if (info->saved_regs[reg].addr)
+      info->saved_regs[reg].addr += val - 1;
 
   return info;
 }
@@ -1187,45 +1188,8 @@ alpha_heuristic_frame_prev_register (str
   struct alpha_heuristic_unwind_cache *info
     = alpha_heuristic_frame_unwind_cache (next_frame, this_prologue_cache, 0);
 
-  /* The PC of the previous frame is stored in the link register of
-     the current frame.  Frob regnum so that we pull the value from
-     the correct place.  */
-  if (regnum == ALPHA_PC_REGNUM)
-    regnum = info->return_reg;
-  
-  /* For all registers known to be saved in the current frame, 
-     do the obvious and pull the value out.  */
-  if (info->saved_regs[regnum])
-    {
-      *optimizedp = 0;
-      *lvalp = lval_memory;
-      *addrp = info->saved_regs[regnum];
-      *realnump = -1;
-      if (bufferp != NULL)
-	get_frame_memory (next_frame, *addrp, bufferp, ALPHA_REGISTER_SIZE);
-      return;
-    }
-
-  /* The stack pointer of the previous frame is computed by popping
-     the current stack frame.  */
-  if (regnum == ALPHA_SP_REGNUM)
-    {
-      *optimizedp = 0;
-      *lvalp = not_lval;
-      *addrp = 0;
-      *realnump = -1;
-      if (bufferp != NULL)
-	store_unsigned_integer (bufferp, ALPHA_REGISTER_SIZE, info->vfp);
-      return;
-    }
-
-  /* Otherwise assume the next frame has the same register value.  */
-  *optimizedp = 0;
-  *lvalp = lval_register;
-  *addrp = 0;
-  *realnump = regnum;
-  if (bufferp)
-    frame_unwind_register (next_frame, *realnump, bufferp);
+  trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
+				optimizedp, lvalp, addrp, realnump, bufferp);
 }
 
 static const struct frame_unwind alpha_heuristic_frame_unwind = {
diff -urpN src/gdb/Makefile.in dev/gdb/Makefile.in
--- src/gdb/Makefile.in	2008-02-13 08:15:36.000000000 +0100
+++ dev/gdb/Makefile.in	2008-02-13 08:26:50.000000000 +0100
@@ -1847,7 +1847,7 @@ alpha-tdep.o: alpha-tdep.c $(defs_h) $(d
 	$(symtab_h) $(value_h) $(gdbcmd_h) $(gdbcore_h) $(dis_asm_h) \
 	$(symfile_h) $(objfiles_h) $(gdb_string_h) $(linespec_h) \
 	$(regcache_h) $(reggroups_h) $(arch_utils_h) $(osabi_h) $(block_h) \
-	$(infcall_h) $(elf_bfd_h) $(alpha_tdep_h)
+	$(infcall_h) $(elf_bfd_h) $(alpha_tdep_h) $(trad_frame_h)
 amd64bsd-nat.o: amd64bsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) \
 	$(target_h) $(gdb_assert_h) $(amd64_tdep_h) $(amd64_nat_h) \
 	$(inf_ptrace_h)

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