From: Mark Kettenis <mark.kettenis@xs4all.nl>
To: deuling@de.ibm.com
Cc: gdb-patches@sourceware.org, uweigand@de.ibm.com
Subject: Re: [rfc]: Use trad_frame_alloc_saved_regs in alpha-tdep
Date: Tue, 19 Feb 2008 21:18:00 -0000 [thread overview]
Message-ID: <200802192117.m1JLHqrE011372@brahms.sibelius.xs4all.nl> (raw)
In-Reply-To: <47B9E3E4.7050804@de.ibm.com> (message from Markus Deuling on Mon, 18 Feb 2008 21:00:36 +0100)
> Date: Mon, 18 Feb 2008 21:00:36 +0100
> From: Markus Deuling <deuling@de.ibm.com>
>
> Hi Mark,
>
> thank you very much for your effort. Maybe you can provide me your
> gdb.log file from this testrun?
I can do better than that. I've figured out what the problem is ;)
Looks like you removed just a little too much target-specific code
here. If you keep 'return_reg', things seem to work fine. I think
the problem is that the PC generally lives in the RA register in the
current frame (so you have to unwind it from the next frame), but that
you were looking it up in next frame instead. See the diff below.
I also changed it to use trad_frame_addr_p() where appropriate.
This diff, together with your Makefile.in changes and ChangeLog is ok
with me.
Index: alpha-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/alpha-tdep.c,v
retrieving revision 1.181
diff -u -p -r1.181 alpha-tdep.c
--- alpha-tdep.c 11 Jan 2008 14:43:14 -0000 1.181
+++ alpha-tdep.c 19 Feb 2008 21:11:37 -0000
@@ -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,17 @@ 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;
+ int return_reg;
+};
+
static struct alpha_heuristic_unwind_cache *
alpha_heuristic_frame_unwind_cache (struct frame_info *next_frame,
void **this_prologue_cache,
@@ -1012,7 +1014,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 +1064,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 (trad_frame_addr_p(info->saved_regs, reg))
continue;
if (reg == 31)
@@ -1078,7 +1080,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
@@ -1155,8 +1157,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 (trad_frame_addr_p(info->saved_regs, reg))
+ info->saved_regs[reg].addr += val - 1;
return info;
}
@@ -1193,39 +1195,8 @@ alpha_heuristic_frame_prev_register (str
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 = {
next prev parent reply other threads:[~2008-02-19 21:18 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-13 7:48 Markus Deuling
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 [this message]
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=200802192117.m1JLHqrE011372@brahms.sibelius.xs4all.nl \
--to=mark.kettenis@xs4all.nl \
--cc=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