summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2005-03-26 15:20:42 +0000
committerMark Kettenis <kettenis@gnu.org>2005-03-26 15:20:42 +0000
commitc12de491fd3f736562607cab7f971817604aff00 (patch)
treef7529453adef678d0c3565554c1a57a09f74b795
parent081b44e7b6a97109c48402f63e1b72b4531567db (diff)
downloadgdb-c12de491fd3f736562607cab7f971817604aff00.tar.gz
* dwarf2-frame.c (execute_cfa_program): Implement
DW_CFA_GNU_window_save.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/dwarf2-frame.c25
2 files changed, 30 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 20843030743..a7b77fce82d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2005-03-26 Mark Kettenis <kettenis@gnu.org>
+
+ * dwarf2-frame.c (execute_cfa_program): Implement
+ DW_CFA_GNU_window_save.
+
2005-03-25 Mark Kettenis <kettenis@gnu.org>
* config/sparc/nbsd64.mh (NAT_FILE): Remove.
diff --git a/gdb/dwarf2-frame.c b/gdb/dwarf2-frame.c
index 7b46c78dbaa..1ac18598e64 100644
--- a/gdb/dwarf2-frame.c
+++ b/gdb/dwarf2-frame.c
@@ -445,6 +445,31 @@ bad CFI data; mismatched DW_CFA_restore_state at 0x%s"), paddr (fs->pc));
/* cfa_how deliberately not set. */
break;
+ case DW_CFA_GNU_window_save:
+ /* This is SPARC-specific code, and contains hard-coded
+ constants for the register numbering scheme used by
+ GCC. Rather than having a architecture-specific
+ operation that's only ever used by a single
+ architecture, we provide the implementation here.
+ Incidentally that's what GCC does too in its
+ unwinder. */
+ {
+ struct gdbarch *gdbarch = get_frame_arch (next_frame);
+ int size = register_size(gdbarch, 0);
+ dwarf2_frame_state_alloc_regs (&fs->regs, 32);
+ for (reg = 8; reg < 16; reg++)
+ {
+ fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_REG;
+ fs->regs.reg[reg].loc.reg = reg + 16;
+ }
+ for (reg = 16; reg < 32; reg++)
+ {
+ fs->regs.reg[reg].how = DWARF2_FRAME_REG_SAVED_OFFSET;
+ fs->regs.reg[reg].loc.offset = (reg - 16) * size;
+ }
+ }
+ break;
+
case DW_CFA_GNU_args_size:
/* Ignored. */
insn_ptr = read_uleb128 (insn_ptr, insn_end, &utmp);