summaryrefslogtreecommitdiff
path: root/gnu
diff options
context:
space:
mode:
authorjmc <jmc@NetBSD.org>2002-03-22 03:33:08 +0000
committerjmc <jmc@NetBSD.org>2002-03-22 03:33:08 +0000
commit371e95a59abf1c9d7bde45e645bc71e1cb40407f (patch)
treee6d20d479157899142154e1d3f2ebffdee629c07 /gnu
parent1f14081709ce11b6194bc81642a8b647f99b7442 (diff)
Fix sparc64 so locals and args can be accessed correctly.
If one doesn't subtract the stack bias back off %fp before attempting to access variables stored relative to %fp the wrong address is picked up for all locals and args. So, calls to the FRAME_LOCALS_ADDRESS or FRAME_ARGS_ADDRESS macros need a function for sparc64 specific cases. Provide a function to check for bias's addresses and fix them up.
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. */