aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid S. Miller <davem@redhat.com>2006-04-05 18:35:39 +0000
committerDavid S. Miller <davem@redhat.com>2006-04-05 18:35:39 +0000
commitf5a9b87dbecc6b4d557e339603b39a6d34cd5ea4 (patch)
tree181a16f8e53a80ae46708f5d02a7975732b4356c
parentc5f8c3881a54348a45b3bb27fd3251e00177859b (diff)
downloadgdb-f5a9b87dbecc6b4d557e339603b39a6d34cd5ea4.zip
gdb-f5a9b87dbecc6b4d557e339603b39a6d34cd5ea4.tar.gz
gdb-f5a9b87dbecc6b4d557e339603b39a6d34cd5ea4.tar.bz2
* sparc-tdep.c (sparc32_dwarf2_frame_init_reg): New.
(sparc32_gdbarch_init): Pass it to dwarf2_frame_set_init_reg. * Makefile.in (sparc-tdep.o): Update dependencies.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/sparc-tdep.c32
2 files changed, 38 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 98fc04e..4f944ab 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2006-04-05 David S. Miller <davem@sunset.davemloft.net>
+
+ * sparc-tdep.c (sparc32_dwarf2_frame_init_reg): New.
+ (sparc32_gdbarch_init): Pass it to dwarf2_frame_set_init_reg.
+ * Makefile.in (sparc-tdep.o): Update dependencies.
+
2006-04-04 David S. Miller <davem@davemloft.net>
* config/linux.mh (NATDEPFILES): Remove sparc-sol2-nat.o
diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c
index dc6c534..728ebad 100644
--- a/gdb/sparc-tdep.c
+++ b/gdb/sparc-tdep.c
@@ -22,6 +22,7 @@
#include "defs.h"
#include "arch-utils.h"
#include "dis-asm.h"
+#include "dwarf2-frame.h"
#include "floatformat.h"
#include "frame.h"
#include "frame-base.h"
@@ -994,6 +995,32 @@ sparc32_stabs_argument_has_addr (struct gdbarch *gdbarch, struct type *type)
|| (sparc_floating_p (type) && TYPE_LENGTH (type) == 16));
}
+static void
+sparc32_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
+ struct dwarf2_frame_state_reg *reg)
+{
+ switch (regnum)
+ {
+ case SPARC_G0_REGNUM:
+ /* Since %g0 is always zero, there is no point in saving it, and
+ people will be inclined omit it from the CFI. Make sure we
+ don't warn about that. */
+ reg->how = DWARF2_FRAME_REG_SAME_VALUE;
+ break;
+ case SPARC_SP_REGNUM:
+ reg->how = DWARF2_FRAME_REG_CFA;
+ break;
+ case SPARC32_PC_REGNUM:
+ reg->how = DWARF2_FRAME_REG_RA_OFFSET;
+ reg->loc.offset = 8;
+ break;
+ case SPARC32_NPC_REGNUM:
+ reg->how = DWARF2_FRAME_REG_RA_OFFSET;
+ reg->loc.offset = 12;
+ break;
+ }
+}
+
/* The SPARC Architecture doesn't have hardware single-step support,
and most operating systems don't implement it either, so we provide
@@ -1248,6 +1275,11 @@ sparc32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Hook in ABI-specific overrides, if they have been registered. */
gdbarch_init_osabi (info, gdbarch);
+ /* Hook in the DWARF CFI frame unwinder. */
+ dwarf2_frame_set_init_reg (gdbarch, sparc32_dwarf2_frame_init_reg);
+ /* FIXME: kettenis/20050423: Don't enable the unwinder until the
+ StackGhost issues have been resolved. */
+
frame_unwind_append_sniffer (gdbarch, sparc32_frame_sniffer);
/* If we have register sets, enable the generic core file support. */