Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Markus Deuling <deuling@de.ibm.com>
To: GDB Patches <gdb-patches@sourceware.org>
Cc: Ulrich Weigand <uweigand@de.ibm.com>
Subject: [rfc]: Use trad_frame_alloc_saved_regs  in alpha-tdep
Date: Wed, 13 Feb 2008 07:48:00 -0000	[thread overview]
Message-ID: <47B2A053.30307@de.ibm.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 887 bytes --]

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


[-- Attachment #2: diff-SIZEOF_FRAME_SAVED_REGS --]
[-- Type: text/plain, Size: 5633 bytes --]

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;
 }
 \f
-/* 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)

             reply	other threads:[~2008-02-13  7:48 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-02-13  7:48 Markus Deuling [this message]
2008-02-15 21:43 ` Joel Brobecker
2008-02-15 23:22   ` Mark Kettenis
2008-02-18 14:15     ` Markus Deuling
2008-02-18 14:57       ` Mark Kettenis
2008-02-18 19:36 ` Mark Kettenis
2008-02-18 20:03   ` Markus Deuling
2008-02-19 21:18     ` Mark Kettenis
2008-02-20 15:47       ` Markus Deuling

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=47B2A053.30307@de.ibm.com \
    --to=deuling@de.ibm.com \
    --cc=gdb-patches@sourceware.org \
    --cc=uweigand@de.ibm.com \
    /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