diff options
author | Andrew Cagney <cagney@redhat.com> | 2002-11-15 23:24:21 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2002-11-15 23:24:21 +0000 |
commit | f407986f1a479bb0ef4a16c1059ce08e443e9788 (patch) | |
tree | 2a837ce93d8dd44a039d958976e50d071c003f55 /gdb/ns32k-tdep.c | |
parent | b7b7461f8408b6e71021b5ae13bed0119268024c (diff) | |
download | gdb-f407986f1a479bb0ef4a16c1059ce08e443e9788.zip gdb-f407986f1a479bb0ef4a16c1059ce08e443e9788.tar.gz gdb-f407986f1a479bb0ef4a16c1059ce08e443e9788.tar.bz2 |
2002-11-15 Andrew Cagney <cagney@redhat.com>
* frame.h (sigtramp_saved_pc): Delete declaration.
* blockframe.c (sigtramp_saved_pc): Delete function.
* ns32k-tdep.c (ns32k_sigtramp_saved_pc): New function.
(ns32k_frame_saved_pc): Call ns32k_sigtramp_saved_pc.
* vax-tdep.c (vax_sigtramp_saved_pc): New function.
(vax_frame_saved_pc): Call vax_sigtramp_saved_pc.
Diffstat (limited to 'gdb/ns32k-tdep.c')
-rw-r--r-- | gdb/ns32k-tdep.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/gdb/ns32k-tdep.c b/gdb/ns32k-tdep.c index 5563cf9..89bdee9 100644 --- a/gdb/ns32k-tdep.c +++ b/gdb/ns32k-tdep.c @@ -314,11 +314,36 @@ ns32k_frame_chain (struct frame_info *frame) return (read_memory_integer (frame->frame, 4)); } + +static CORE_ADDR +ns32k_sigtramp_saved_pc (struct frame_info *frame) +{ + CORE_ADDR sigcontext_addr; + char *buf; + int ptrbytes = TYPE_LENGTH (builtin_type_void_func_ptr); + int sigcontext_offs = (2 * TARGET_INT_BIT) / TARGET_CHAR_BIT; + + buf = alloca (ptrbytes); + /* Get sigcontext address, it is the third parameter on the stack. */ + if (frame->next) + sigcontext_addr = read_memory_typed_address + (FRAME_ARGS_ADDRESS (frame->next) + FRAME_ARGS_SKIP + sigcontext_offs, + builtin_type_void_data_ptr); + else + sigcontext_addr = read_memory_typed_address + (read_register (SP_REGNUM) + sigcontext_offs, builtin_type_void_data_ptr); + + /* Don't cause a memory_error when accessing sigcontext in case the stack + layout has changed or the stack is corrupt. */ + target_read_memory (sigcontext_addr + SIGCONTEXT_PC_OFFSET, buf, ptrbytes); + return extract_typed_address (buf, builtin_type_void_func_ptr); +} + static CORE_ADDR ns32k_frame_saved_pc (struct frame_info *frame) { if (frame->signal_handler_caller) - return (sigtramp_saved_pc (frame)); /* XXXJRT */ + return (ns32k_sigtramp_saved_pc (frame)); /* XXXJRT */ return (read_memory_integer (frame->frame + 4, 4)); } |