From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7487 invoked by alias); 3 Nov 2004 17:48:25 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 7479 invoked from network); 3 Nov 2004 17:48:23 -0000 Received: from unknown (HELO pippin.tausq.org) (64.81.244.94) by sourceware.org with SMTP; 3 Nov 2004 17:48:23 -0000 Received: by pippin.tausq.org (Postfix, from userid 1000) id 4FEA5CE245; Wed, 3 Nov 2004 09:44:49 -0800 (PST) Date: Wed, 03 Nov 2004 17:48:00 -0000 From: Randolph Chung To: gdb-patches@sources.redhat.com Subject: [patch/hppa/rfa] unwind fix for functions with no debug info Message-ID: <20041103174449.GD4249@tausq.org> Reply-To: Randolph Chung Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-GPG: for GPG key, see http://www.tausq.org/gpg.txt User-Agent: Mutt/1.5.5.1+cvs20040105i X-SW-Source: 2004-11/txt/msg00045.txt.bz2 The attached patch fixes a problem reported by Dave Anglin and others. When compiled without debug information, static functions have no symbol table entry in gdb. In this case, frame_func_unwind returns the starting address of the previously visible function. Using that to do unwinding causes all sorts of brokeness.... On hppa, each properly defined function has an unwind record which gives the starting and ending address of the function. We can use that to do unwinding more properly. Tested on hppa-linux with no regressions. Ok to apply? randolph 2004-11-03 Randolph Chung * hppa-tdep.c (hppa_frame_cache): Avoid using frame_func_unwind () to locate the beginning of the function. When objects are compiled without debug symbols, frame_func_unwind can return the wrong function. We can do better than that by using unwind records. (hppa_frame_this_id): Likewise. Index: hppa-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/hppa-tdep.c,v retrieving revision 1.175 diff -u -p -r1.175 hppa-tdep.c --- hppa-tdep.c 31 Oct 2004 21:09:28 -0000 1.175 +++ hppa-tdep.c 3 Nov 2004 16:18:40 -0000 @@ -1580,7 +1580,7 @@ hppa_frame_cache (struct frame_info *nex cache->saved_regs = trad_frame_alloc_saved_regs (next_frame); /* Yow! */ - u = find_unwind_entry (frame_func_unwind (next_frame)); + u = find_unwind_entry (frame_pc_unwind (next_frame)); if (!u) { if (hppa_debug) @@ -1630,7 +1630,7 @@ hppa_frame_cache (struct frame_info *nex symbol information. hppa_skip_prologue also bounds the returned pc by the passed in pc, so it will not return a pc in the next function. */ - prologue_end = hppa_skip_prologue (frame_func_unwind (next_frame)); + prologue_end = hppa_skip_prologue (u->region_start); end_pc = frame_pc_unwind (next_frame); if (prologue_end != 0 && end_pc > prologue_end) @@ -1638,7 +1638,7 @@ hppa_frame_cache (struct frame_info *nex frame_size = 0; - for (pc = frame_func_unwind (next_frame); + for (pc = u->region_start; ((saved_gr_mask || saved_fr_mask || looking_for_sp || looking_for_rp || frame_size < (u->Total_frame_size << 3)) @@ -1881,8 +1881,14 @@ static void hppa_frame_this_id (struct frame_info *next_frame, void **this_cache, struct frame_id *this_id) { - struct hppa_frame_cache *info = hppa_frame_cache (next_frame, this_cache); - (*this_id) = frame_id_build (info->base, frame_func_unwind (next_frame)); + struct hppa_frame_cache *info; + CORE_ADDR pc = frame_pc_unwind (next_frame); + struct unwind_table_entry *u; + + info = hppa_frame_cache (next_frame, this_cache); + u = find_unwind_entry (pc); + + (*this_id) = frame_id_build (info->base, u->region_start); } static void -- Randolph Chung Debian GNU/Linux Developer, hppa/ia64 ports http://www.tausq.org/