* [rfc]: Use trad_frame_alloc_saved_regs in alpha-tdep
@ 2008-02-13 7:48 Markus Deuling
2008-02-15 21:43 ` Joel Brobecker
2008-02-18 19:36 ` Mark Kettenis
0 siblings, 2 replies; 9+ messages in thread
From: Markus Deuling @ 2008-02-13 7:48 UTC (permalink / raw)
To: GDB Patches; +Cc: Ulrich Weigand
[-- 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)
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [rfc]: Use trad_frame_alloc_saved_regs in alpha-tdep
2008-02-13 7:48 [rfc]: Use trad_frame_alloc_saved_regs in alpha-tdep Markus Deuling
@ 2008-02-15 21:43 ` Joel Brobecker
2008-02-15 23:22 ` Mark Kettenis
2008-02-18 19:36 ` Mark Kettenis
1 sibling, 1 reply; 9+ messages in thread
From: Joel Brobecker @ 2008-02-15 21:43 UTC (permalink / raw)
To: Markus Deuling; +Cc: GDB Patches, Ulrich Weigand
> 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.
I used to be able to test on alpha-tru64, but for some reason the
testsuite no longer runs on our machines. It looks more like a tcl/expect
problem than anything else. I don't know if there are any other people
out there would can test on an alpha machine...
Sorry :-(.
--
Joel
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [rfc]: Use trad_frame_alloc_saved_regs in alpha-tdep
2008-02-15 21:43 ` Joel Brobecker
@ 2008-02-15 23:22 ` Mark Kettenis
2008-02-18 14:15 ` Markus Deuling
0 siblings, 1 reply; 9+ messages in thread
From: Mark Kettenis @ 2008-02-15 23:22 UTC (permalink / raw)
To: brobecker; +Cc: deuling, gdb-patches, uweigand
> Date: Fri, 15 Feb 2008 13:42:42 -0800
> From: Joel Brobecker <brobecker@adacore.com>
>
> > 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.
>
> I used to be able to test on alpha-tru64, but for some reason the
> testsuite no longer runs on our machines. It looks more like a tcl/expect
> problem than anything else. I don't know if there are any other people
> out there would can test on an alpha machine...
>
> Sorry :-(.
I can test OpenBSD/alpha later this weekend.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [rfc]: Use trad_frame_alloc_saved_regs in alpha-tdep
2008-02-15 23:22 ` Mark Kettenis
@ 2008-02-18 14:15 ` Markus Deuling
2008-02-18 14:57 ` Mark Kettenis
0 siblings, 1 reply; 9+ messages in thread
From: Markus Deuling @ 2008-02-18 14:15 UTC (permalink / raw)
To: Mark Kettenis; +Cc: brobecker, gdb-patches, uweigand
Mark Kettenis schrieb:
>> Date: Fri, 15 Feb 2008 13:42:42 -0800
>> From: Joel Brobecker <brobecker@adacore.com>
>>
>>> 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.
>> I used to be able to test on alpha-tru64, but for some reason the
>> testsuite no longer runs on our machines. It looks more like a tcl/expect
>> problem than anything else. I don't know if there are any other people
>> out there would can test on an alpha machine...
>>
>> Sorry :-(.
>
> I can test OpenBSD/alpha later this weekend.
>
Thank you both for your effort. An OpenBSD/alpha test would be great :-)
Regards,
Markus
--
Markus Deuling
GNU Toolchain for Linux on Cell BE
deuling@de.ibm.com
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [rfc]: Use trad_frame_alloc_saved_regs in alpha-tdep
2008-02-18 14:15 ` Markus Deuling
@ 2008-02-18 14:57 ` Mark Kettenis
0 siblings, 0 replies; 9+ messages in thread
From: Mark Kettenis @ 2008-02-18 14:57 UTC (permalink / raw)
To: deuling; +Cc: brobecker, gdb-patches, uweigand
> Date: Mon, 18 Feb 2008 15:13:01 +0100
> From: Markus Deuling <deuling@de.ibm.com>
>
> Mark Kettenis schrieb:
> >> Date: Fri, 15 Feb 2008 13:42:42 -0800
> >> From: Joel Brobecker <brobecker@adacore.com>
> >>
> >>> 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.
> >> I used to be able to test on alpha-tru64, but for some reason the
> >> testsuite no longer runs on our machines. It looks more like a tcl/expect
> >> problem than anything else. I don't know if there are any other people
> >> out there would can test on an alpha machine...
> >>
> >> Sorry :-(.
> >
> > I can test OpenBSD/alpha later this weekend.
> >
>
> Thank you both for your effort. An OpenBSD/alpha test would be great :-)
I had a go at it last night, but got stuck with tracking down a bfd
issue. Will try again tonight.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [rfc]: Use trad_frame_alloc_saved_regs in alpha-tdep
2008-02-13 7:48 [rfc]: Use trad_frame_alloc_saved_regs in alpha-tdep Markus Deuling
2008-02-15 21:43 ` Joel Brobecker
@ 2008-02-18 19:36 ` Mark Kettenis
2008-02-18 20:03 ` Markus Deuling
1 sibling, 1 reply; 9+ messages in thread
From: Mark Kettenis @ 2008-02-18 19:36 UTC (permalink / raw)
To: deuling; +Cc: gdb-patches, uweigand
> Date: Wed, 13 Feb 2008 08:46:27 +0100
> From: Markus Deuling <deuling@de.ibm.com>
>
> 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.
This causes significant regressions on OpenBSD/alpha. I'll see if I
can figure out what's going wrong later this week.
> 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.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [rfc]: Use trad_frame_alloc_saved_regs in alpha-tdep
2008-02-18 19:36 ` Mark Kettenis
@ 2008-02-18 20:03 ` Markus Deuling
2008-02-19 21:18 ` Mark Kettenis
0 siblings, 1 reply; 9+ messages in thread
From: Markus Deuling @ 2008-02-18 20:03 UTC (permalink / raw)
To: Mark Kettenis; +Cc: gdb-patches, uweigand
Mark Kettenis schrieb:
>> Date: Wed, 13 Feb 2008 08:46:27 +0100
>> From: Markus Deuling <deuling@de.ibm.com>
>>
>> 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.
>
> This causes significant regressions on OpenBSD/alpha. I'll see if I
> can figure out what's going wrong later this week.
>
>> 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.
>
Hi Mark,
thank you very much for your effort. Maybe you can provide me your gdb.log file from this testrun?
--
Markus Deuling
GNU Toolchain for Linux on Cell BE
deuling@de.ibm.com
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [rfc]: Use trad_frame_alloc_saved_regs in alpha-tdep
2008-02-18 20:03 ` Markus Deuling
@ 2008-02-19 21:18 ` Mark Kettenis
2008-02-20 15:47 ` Markus Deuling
0 siblings, 1 reply; 9+ messages in thread
From: Mark Kettenis @ 2008-02-19 21:18 UTC (permalink / raw)
To: deuling; +Cc: gdb-patches, uweigand
> 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 = {
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [rfc]: Use trad_frame_alloc_saved_regs in alpha-tdep
2008-02-19 21:18 ` Mark Kettenis
@ 2008-02-20 15:47 ` Markus Deuling
0 siblings, 0 replies; 9+ messages in thread
From: Markus Deuling @ 2008-02-20 15:47 UTC (permalink / raw)
To: Mark Kettenis; +Cc: gdb-patches, uweigand
[-- Attachment #1: Type: text/plain, Size: 1473 bytes --]
Mark Kettenis schrieb:
>> 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.
Hi Mark,
this is great ! Thank you very much ;-) I now committed the attached patch.
ChangeLog:
2008-02-20 Markus Deuling <deuling@de.ibm.com>
Mark Kettenis <kettenis@gnu.org>
* alpha-tdep.c (alpha_heuristic_unwind_cache): Replace saved_regs by
trad_frame_saved_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.
Regards,
Markus
--
Markus Deuling
GNU Toolchain for Linux on Cell BE
deuling@de.ibm.com
[-- Attachment #2: diff-alpha-neu --]
[-- Type: text/plain, Size: 5014 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-20 15:50:57.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,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 = {
diff -urpN src/gdb/Makefile.in dev/gdb/Makefile.in
--- src/gdb/Makefile.in 2008-02-14 05:47:27.000000000 +0100
+++ dev/gdb/Makefile.in 2008-02-20 15:52:43.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)
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2008-02-20 15:47 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-02-13 7:48 [rfc]: Use trad_frame_alloc_saved_regs in alpha-tdep 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
2008-02-20 15:47 ` Markus Deuling
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox