From mboxrd@z Thu Jan 1 00:00:00 1970 From: Randolph Chung To: Andrew Cagney Cc: gdb-patches@sources.redhat.com Subject: Re: [patch/rfa/hppa] Use frame pointer for unwinding Date: Mon, 17 May 2004 02:34:00 -0000 Message-id: <20040517023428.GP566@tausq.org> References: <20040516020703.GZ566@tausq.org> <40A78B63.9020102@gnu.org> <20040516170257.GM566@tausq.org> <20040517001310.GO566@tausq.org> X-SW-Source: 2004-05/msg00478.html > What seems to be happening is that the signal handler is triggered > before the frame pointer is stored in func1: so, here's my 3rd try ;-) 2004-05-16 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 17 May 2004 02:29:53 -0000 @@ -1761,15 +1798,42 @@ 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) + /* Check to see if a frame pointer is available, and use it for + frame unwinding if it is. + + There are some situations where we need to rely on the frame + pointer to do stack unwinding. For example, if a function calls + alloca (), the stack pointer can get adjusted inside the body of + the function. In this case, the ABI requires that the compiler + maintain a frame pointer for the function. + + The unwind record has a flag (alloca_frame) that indicates that + a function has a variable frame; unfortunately, gcc/binutils + does not set this flag. Instead, whenever a frame pointer is used + and saved on the stack, the Save_SP flag is set. We use this to + decide whether to use the frame pointer for unwinding. */ + + fp = frame_unwind_register_unsigned (next_frame, HPPA_FP_REGNUM); + + if (frame_pc_unwind (next_frame) >= prologue_end + && u->Save_SP && fp != 0) + { + 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)) {