This is the mail archive of the gdb@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: frame_register_unwind(): "frame != NULL" assertion failure


On Feb 18,  5:55pm, Andrew Cagney wrote:

> Change this call:
> 
>    frame_register_unwind (get_next_frame (frame), regnum, optimizedp, lvalp,
>                           addrp, &realnum, raw_buffer);
> 
> to instead call:
> 
> static void
> generic_unwind_get_saved_register (char *raw_buffer,
>                                     int *optimizedp,
>                                     CORE_ADDR *addrp,
>                                     struct frame_info *frame,
>                                     int regnum,
>                                     enum lval_type *lvalp)
> 
> (note that the get_next_frame(frame) call isn't needed - that function 
> does not have a well chosen name).  The function frame_register() would 
> be better but because that knows about old style get_saved_register code 
> it would result in infinite recursion :-(

That works.  How does this look?

	* frame.c (generic_unwind_get_saved_register): Make non-static.
	* frame.h (generic_unwind_get_saved_register): Declare.
	* mips-tdep.c (read_next_frame_reg): Fetch register from
	current regcache when frame is NULL.
	(mips_init_extra_frame_info): Pass NULL explicitly for parameter
	that must be NULL.
	(mips_get_saved_register): Call generic_unwind_get_saved_register()
	instead of frame_register_unwind().

Index: frame.c
===================================================================
RCS file: /cvs/src/src/gdb/frame.c,v
retrieving revision 1.66
diff -u -p -r1.66 frame.c
--- frame.c	2 Feb 2003 20:31:43 -0000	1.66
+++ frame.c	20 Feb 2003 16:01:58 -0000
@@ -307,7 +307,7 @@ frame_read_signed_register (struct frame
   frame_unwind_signed_register (frame->next, regnum, val);
 }
 
-static void
+void
 generic_unwind_get_saved_register (char *raw_buffer,
 				   int *optimizedp,
 				   CORE_ADDR *addrp,
Index: frame.h
===================================================================
RCS file: /cvs/src/src/gdb/frame.h,v
retrieving revision 1.66
diff -u -p -r1.66 frame.h
--- frame.h	2 Feb 2003 20:31:43 -0000	1.66
+++ frame.h	20 Feb 2003 16:01:58 -0000
@@ -553,6 +553,13 @@ extern void generic_fix_call_dummy (char
 				    int nargs, struct value **args,
 				    struct type *type, int gcc_p);
 
+void generic_unwind_get_saved_register (char *raw_buffer,
+				        int *optimizedp,
+				        CORE_ADDR *addrp,
+				        struct frame_info *frame,
+				        int regnum,
+				        enum lval_type *lvalp);
+
 /* The function generic_get_saved_register() has been made obsolete.
    GET_SAVED_REGISTER now defaults to the recursive equivalent -
    generic_unwind_get_saved_register() - so there is no need to even
Index: mips-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/mips-tdep.c,v
retrieving revision 1.161
diff -u -p -r1.161 mips-tdep.c
--- mips-tdep.c	28 Jan 2003 16:31:11 -0000	1.161
+++ mips-tdep.c	20 Feb 2003 16:01:59 -0000
@@ -1589,20 +1589,28 @@ read_next_frame_reg (struct frame_info *
   int realnum;
   enum lval_type lval;
   void *raw_buffer = alloca (MAX_REGISTER_RAW_SIZE);
-  frame_register_unwind (fi, regno, &optimized, &lval, &addr, &realnum,
-			 raw_buffer);
-  /* FIXME: cagney/2002-09-13: This is just soooo bad.  The MIPS
-     should have a pseudo register range that correspons to the ABI's,
-     rather than the ISA's, view of registers.  These registers would
-     then implicitly describe their size and hence could be used
-     without the below munging.  */
-  if (lval == lval_memory)
-    {
-      if (regno < 32)
-	{
-	  /* Only MIPS_SAVED_REGSIZE bytes of GP registers are
-	     saved. */
-	  return read_memory_integer (addr, MIPS_SAVED_REGSIZE);
+
+  if (fi == NULL)
+    {
+      regcache_cooked_read (current_regcache, regno, raw_buffer);
+    }
+  else
+    {
+      frame_register_unwind (fi, regno, &optimized, &lval, &addr, &realnum,
+			     raw_buffer);
+      /* FIXME: cagney/2002-09-13: This is just soooo bad.  The MIPS
+	 should have a pseudo register range that correspons to the ABI's,
+	 rather than the ISA's, view of registers.  These registers would
+	 then implicitly describe their size and hence could be used
+	 without the below munging.  */
+      if (lval == lval_memory)
+	{
+	  if (regno < 32)
+	    {
+	      /* Only MIPS_SAVED_REGSIZE bytes of GP registers are
+		 saved. */
+	      return read_memory_integer (addr, MIPS_SAVED_REGSIZE);
+	    }
 	}
     }
 
@@ -2473,11 +2481,16 @@ mips_init_extra_frame_info (int fromleaf
   if (get_frame_type (fci) == DUMMY_FRAME)
     return;
 
-  /* Use proc_desc calculated in frame_chain */
+  /* Use proc_desc calculated in frame_chain.  When there is no
+     next frame, i.e, get_next_frame (fci) == NULL, we call
+     find_proc_desc () to calculate it, passing an explicit
+     NULL as the frame parameter.  */
   proc_desc =
     get_next_frame (fci)
     ? cached_proc_desc
-    : find_proc_desc (get_frame_pc (fci), get_next_frame (fci), 1);
+    : find_proc_desc (get_frame_pc (fci),
+                      NULL /* i.e, get_next_frame (fci) */,
+		      1);
 
   frame_extra_info_zalloc (fci, sizeof (struct frame_extra_info));
 
@@ -5481,7 +5494,6 @@ mips_get_saved_register (char *raw_buffe
   CORE_ADDR addrx;
   enum lval_type lvalx;
   int optimizedx;
-  int realnum;
 
   if (!target_has_registers)
     error ("No registers.");
@@ -5493,8 +5505,8 @@ mips_get_saved_register (char *raw_buffe
     lvalp = &lvalx;
   if (optimizedp == NULL)
     optimizedp = &optimizedx;
-  frame_register_unwind (get_next_frame (frame), regnum, optimizedp, lvalp,
-			 addrp, &realnum, raw_buffer);
+  generic_unwind_get_saved_register (raw_buffer, optimizedp, addrp, frame,
+                                     regnum, lvalp);
   /* FIXME: cagney/2002-09-13: This is just so bad.  The MIPS should
      have a pseudo register range that correspons to the ABI's, rather
      than the ISA's, view of registers.  These registers would then


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