diff options
| author | jmc <jmc@NetBSD.org> | 2002-03-22 03:33:08 +0000 |
|---|---|---|
| committer | jmc <jmc@NetBSD.org> | 2002-03-22 03:33:08 +0000 |
| commit | 371e95a59abf1c9d7bde45e645bc71e1cb40407f (patch) | |
| tree | e6d20d479157899142154e1d3f2ebffdee629c07 /gnu | |
| parent | 1f14081709ce11b6194bc81642a8b647f99b7442 (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.h | 6 | ||||
| -rw-r--r-- | gnu/dist/toolchain/gdb/sparc-tdep.c | 8 |
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. */ |
