summaryrefslogtreecommitdiff
path: root/gnu
diff options
context:
space:
mode:
Diffstat (limited to 'gnu')
-rw-r--r--gnu/dist/toolchain/gdb/config/sparc/tm-sp64.h6
-rw-r--r--gnu/dist/toolchain/gdb/sparc-tdep.c8
2 files changed, 14 insertions, 0 deletions
diff --git a/gnu/dist/toolchain/gdb/config/sparc/tm-sp64.h b/gnu/dist/toolchain/gdb/config/sparc/tm-sp64.h
index 7121a7f9fab..048b7c3725a 100644
--- a/gnu/dist/toolchain/gdb/config/sparc/tm-sp64.h
+++ b/gnu/dist/toolchain/gdb/config/sparc/tm-sp64.h
@@ -358,12 +358,18 @@ extern CORE_ADDR sparc64_read_sp ();
extern CORE_ADDR sparc64_read_fp ();
extern void sparc64_write_sp PARAMS ((CORE_ADDR));
extern void sparc64_write_fp PARAMS ((CORE_ADDR));
+extern CORE_ADDR sparc64_frame_address PARAMS ((struct frame_info *fi));
#define TARGET_READ_SP() (sparc64_read_sp ())
#define TARGET_READ_FP() (sparc64_read_fp ())
#define TARGET_WRITE_SP(X) (sparc64_write_sp (X))
#define TARGET_WRITE_FP(X) (sparc64_write_fp (X))
+#undef FRAME_LOCALS_ADDRESS
+#undef FRAME_ARGS_ADDRESS
+#define FRAME_LOCALS_ADDRESS(X) (sparc64_frame_address (X))
+#define FRAME_ARGS_ADDRESS(X) (sparc64_frame_address (X))
+
#undef TM_PRINT_INSN_MACH
#define TM_PRINT_INSN_MACH bfd_mach_sparc_v9a
diff --git a/gnu/dist/toolchain/gdb/sparc-tdep.c b/gnu/dist/toolchain/gdb/sparc-tdep.c
index 48da1e602d7..ae890ff676e 100644
--- a/gnu/dist/toolchain/gdb/sparc-tdep.c
+++ b/gnu/dist/toolchain/gdb/sparc-tdep.c
@@ -2029,6 +2029,14 @@ sparc64_write_fp (val)
write_register (FP_REGNUM, val);
}
+CORE_ADDR
+sparc64_frame_address (struct frame_info *fi)
+{
+ if (fi->frame & 0x1)
+ return (fi->frame - 2047);
+ return fi->frame;
+}
+
/* The SPARC 64 ABI passes floating-point arguments in FP0-31. They are
also copied onto the stack in the correct places. */