This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch/hppa/rfa] unwind fix for functions with no debug info


Randolph Chung wrote:
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....

(frame_func_unwind can also return zero.)


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 <tausq@debian.org>

	* 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.

Ok for 6.3 and mainline with a comment/change log tweak:


The convention is for the ChangeLog to record what was changed while the code records why it was changed. Consequently, the ChangeLog should read something like:

hppa-tdep.c (hppa_frame_cache): Use frame_pc_unwind instead of frame_func_unwind () to locate the unwind entry.

and the the corresponding code gets the rationale for doing things the current way:

/* 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. */

(the GNU coding standard discusses this further)

Andrew


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]