From mboxrd@z Thu Jan 1 00:00:00 1970 From: Randolph Chung To: gdb-patches@sources.redhat.com Subject: [patch/rfa/hppa] Use frame pointer for unwinding Date: Sun, 16 May 2004 02:07:00 -0000 Message-id: <20040516020703.GZ566@tausq.org> X-SW-Source: 2004-05/msg00453.html One more patch -- Currently we don't use the frame pointer to unwind the stack, we rely only on unwinding records. However, this doesn't work for functions that call alloca() because the unwinding record does not account for the variable-sized stack frame. In this case, the ABI requires that the compiler always maintain a frame pointer. Fixes these two FAILs from the testsuite, no new regressions. +PASS: gdb.base/funcargs.exp: backtrace from call_after_alloca_subr +PASS: gdb.base/selftest.exp: backtrace through signal handler ok to apply? randolph 2004-05-15 Randolph Chung * hppa-tdep.c (hppa_frame_cache): If a frame pointer is available, use it for unwinding the stack. Index: hppa-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/hppa-tdep.c,v retrieving revision 1.156 diff -u -p -r1.156 hppa-tdep.c --- hppa-tdep.c 8 May 2004 03:59:34 -0000 1.156 +++ hppa-tdep.c 16 May 2004 01:42:56 -0000 @@ -1761,15 +1798,26 @@ hppa_frame_cache (struct frame_info *nex the current function (and is thus equivalent to the "saved" stack pointer. */ CORE_ADDR this_sp = frame_unwind_register_unsigned (next_frame, HPPA_SP_REGNUM); + CORE_ADDR fp; if (hppa_debug) fprintf_unfiltered (gdb_stdlog, " (this_sp=0x%s, pc=0x%s, " "prologue_end=0x%s) ", paddr_nz (this_sp), paddr_nz (frame_pc_unwind (next_frame)), paddr_nz (prologue_end)); - if (frame_pc_unwind (next_frame) >= prologue_end) + if (get_frame_type (next_frame) == NORMAL_FRAME + && u->Save_SP + && (fp = frame_unwind_register_unsigned (next_frame, HPPA_FP_REGNUM))) + { + cache->base = fp; + + if (hppa_debug) + fprintf_unfiltered (gdb_stdlog, " (base=0x%s) [frame pointer] }", + paddr_nz (cache->base)); + } + else if (frame_pc_unwind (next_frame) >= prologue_end) { if (u->Save_SP && trad_frame_addr_p (cache->saved_regs, HPPA_SP_REGNUM)) { -- Randolph Chung Debian GNU/Linux Developer, hppa/ia64 ports http://www.tausq.org/