From 22b0923df5b5ebe06941b82513f4270f0d97c669 Mon Sep 17 00:00:00 2001 From: Randolph Chung Date: Mon, 17 May 2004 16:46:06 +0000 Subject: [PATCH] 2004-05-17 Randolph Chung * hppa-tdep.c (hppa_stub_frame_unwind_cache): For HPUX stub unwinding, check to see if we are unwinding an export stub. Export stubs clobber the %rp in the call path and stores the original rp in a stack slot. --- gdb/ChangeLog | 6 ++++++ gdb/hppa-tdep.c | 21 ++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index cf1dd11fc42..de9b2fa1c05 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2004-05-17 Randolph Chung + + * hppa-tdep.c (hppa_stub_frame_unwind_cache): For HPUX stub unwinding, + check to see if we are unwinding an export stub. Export stubs clobber + the %rp in the call path and stores the original rp in a stack slot. + 2004-05-17 Jim Blandy * MAINTAINERS: Update address for J.T. Conklin. diff --git a/gdb/hppa-tdep.c b/gdb/hppa-tdep.c index 8ed50f9311c..a872e4f89a4 100644 --- a/gdb/hppa-tdep.c +++ b/gdb/hppa-tdep.c @@ -1987,6 +1987,7 @@ hppa_stub_frame_unwind_cache (struct frame_info *next_frame, { struct gdbarch *gdbarch = get_frame_arch (next_frame); struct hppa_stub_unwind_cache *info; + struct unwind_table_entry *u; if (*this_cache) return *this_cache; @@ -1995,9 +1996,27 @@ hppa_stub_frame_unwind_cache (struct frame_info *next_frame, *this_cache = info; info->saved_regs = trad_frame_alloc_saved_regs (next_frame); - info->saved_regs[HPPA_PCOQ_HEAD_REGNUM].realreg = HPPA_RP_REGNUM; info->base = frame_unwind_register_unsigned (next_frame, HPPA_SP_REGNUM); + if (gdbarch_osabi (gdbarch) == GDB_OSABI_HPUX_ELF + || gdbarch_osabi (gdbarch) == GDB_OSABI_HPUX_SOM) + { + /* HPUX uses export stubs in function calls; the export stub clobbers + the return value of the caller, and, later restores it from the + stack. */ + u = find_unwind_entry (frame_pc_unwind (next_frame)); + + if (u && u->stub_unwind.stub_type == EXPORT) + { + info->saved_regs[HPPA_PCOQ_HEAD_REGNUM].addr = info->base - 24; + + return info; + } + } + + /* By default we assume that stubs do not change the rp. */ + info->saved_regs[HPPA_PCOQ_HEAD_REGNUM].realreg = HPPA_RP_REGNUM; + return info; } -- 2.30.2