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] Improve Xtensa Call0 ABI prologue analysis


Improve handling Xtensa CALL0 ABI by making prologue analysis more reliable.

2009-10-21  Maxim Grigoriev  <maxim2405@gmail.com>

        * xtensa-tdep.c (XTENSA_ISA_BADPC): New.
	(xtensa_scan_prologue): Replace read_memory with target_read_memory.
	(call0_analyze_prologue): Use XTENSA_ISA_BADPC instead of "0".
	(call0_frame_cache): Check error conditions on call0_analyze_prologue.


Index: gdb/xtensa-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/xtensa-tdep.c,v
retrieving revision 1.40
diff -u -r1.40 xtensa-tdep.c
--- gdb/xtensa-tdep.c	19 Sep 2009 03:56:31 -0000	1.40
+++ gdb/xtensa-tdep.c	21 Oct 2009 18:30:07 -0000
@@ -1046,7 +1046,8 @@
 /* Returns the best guess about which register is a frame pointer
    for the function containing CURRENT_PC.  */
 
-#define XTENSA_ISA_BSZ 32	    /* Instruction buffer size.  */
+#define XTENSA_ISA_BSZ		32		/* Instruction buffer size.  */
+#define XTENSA_ISA_BADPC	((CORE_ADDR)0)	/* Bad PC value.  */
 
 static unsigned int
 xtensa_scan_prologue (struct gdbarch *gdbarch, CORE_ADDR current_pc)
@@ -1083,7 +1084,8 @@
 	  ba = ia;
 	  bt = (ba + XTENSA_ISA_BSZ) < current_pc
 	    ? ba + XTENSA_ISA_BSZ : current_pc;
-	  read_memory (ba, ibuf, bt - ba);
+	  if (target_read_memory (ba, ibuf, bt - ba) != 0)
+	    RETURN_FP;
 	}
 
       xtensa_insnbuf_from_chars (isa, ins, &ibuf[ia-ba], 0);
@@ -2171,6 +2173,8 @@
 	  ba = ia;
 	  bt = (ba + XTENSA_ISA_BSZ) < body_pc ? ba + XTENSA_ISA_BSZ : body_pc;
 	  read_memory (ba, ibuf, bt - ba);
+	  /* If there is a memory reading error read_memory () will report it
+	     and then throw an exception, stopping command execution.  */
 	}
 
       /* Decode format information.  */
@@ -2290,7 +2294,7 @@
 	     (unsigned)ia, fail ? "failed" : "succeeded");
   xtensa_insnbuf_free(isa, slot);
   xtensa_insnbuf_free(isa, ins);
-  return fail ? 0 : ia;
+  return fail ? XTENSA_ISA_BADPC : ia;
 }
 
 /* Initialize frame cache for the current frame in CALL0 ABI.  */
@@ -2315,6 +2319,10 @@
 					C0_NREGS,
 					&cache->c0.c0_rt[0],
 					&cache->call0);
+
+      if (body_pc == XTENSA_ISA_BADPC)
+	error (_("Xtensa-specific internal error: CALL0 prologue \
+analysis failed in this frame. GDB command execution stopped."));
     }
   
   sp = get_frame_register_unsigned

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