This is the mail archive of the gdb-patches@sourceware.org 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]

[commit/6.7] Fix signull.exp on mips-linux


There were several things wrong with the MIPS stub unwinder.  The
call to frame_id_build had its arguments reversed; the saved return
register referenced was the wrong one, so it always ended up with
the value of $31 from the real current frame; and it didn't enable
itself for unreadable code addresses, unlike other stub unwinders.

With these fixed, signull.exp now passes.  Tested on mips-linux
and checked in; also for 6.7.

-- 
Daniel Jacobowitz
CodeSourcery

2007-09-19  Daniel Jacobowitz  <dan@codesourcery.com>

	* mips-tdep.c (mips_stub_frame_cache): Correct the saved return
	address register.  Correct the call to frame_id_build.
	(mips_stub_frame_sniffer): Use the stub unwinder when the PC
	is invalid.

Index: mips-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/mips-tdep.c,v
retrieving revision 1.444
diff -u -p -r1.444 mips-tdep.c
--- mips-tdep.c	10 Sep 2007 21:14:11 -0000	1.444
+++ mips-tdep.c	19 Sep 2007 14:40:50 -0000
@@ -2174,14 +2174,15 @@ mips_stub_frame_cache (struct frame_info
   /* The return address is in the link register.  */
   trad_frame_set_reg_realreg (this_trad_cache,
 			      gdbarch_pc_regnum (current_gdbarch),
-			      MIPS_RA_REGNUM);
+			      (gdbarch_num_regs (current_gdbarch)
+			       + MIPS_RA_REGNUM));
 
   /* Frame ID, since it's a frameless / stackless function, no stack
      space is allocated and SP on entry is the current SP.  */
   pc = frame_pc_unwind (next_frame);
   find_pc_partial_function (pc, NULL, &start_addr, NULL);
   stack_addr = frame_unwind_register_signed (next_frame, MIPS_SP_REGNUM);
-  trad_frame_set_id (this_trad_cache, frame_id_build (start_addr, stack_addr));
+  trad_frame_set_id (this_trad_cache, frame_id_build (stack_addr, start_addr));
 
   /* Assume that the frame's base is the same as the
      stack-pointer.  */
@@ -2222,9 +2223,14 @@ static const struct frame_unwind mips_st
 static const struct frame_unwind *
 mips_stub_frame_sniffer (struct frame_info *next_frame)
 {
+  gdb_byte dummy[4];
   struct obj_section *s;
   CORE_ADDR pc = frame_unwind_address_in_block (next_frame, NORMAL_FRAME);
 
+  /* Use the stub unwinder for unreadable code.  */
+  if (target_read_memory (frame_pc_unwind (next_frame), dummy, 4) != 0)
+    return &mips_stub_frame_unwind;
+
   if (in_plt_section (pc, NULL))
     return &mips_stub_frame_unwind;
 


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