[3/3,nios2] clean up prologue/epilogue detection code, v2

Message ID 5473C73F.1040800@codesourcery.com
State New, archived
Headers

Commit Message

Sandra Loosemore Nov. 25, 2014, 12:03 a.m. UTC
  This part of the revised Nios II prologue/epilogue refactoring patch 
fixes the prologue analyzer to handle the multiple stack adjustment 
instructions that GCC may now emit in some cases.  It replaces the test 
that caused analysis to terminate when a second adjustment is found with 
more specific tests that can distinguish between prologue-ish and 
epilogue-ish adjustments.

OK to commit on top of part 1?

-Sandra
  

Comments

Yao Qi Nov. 25, 2014, 3 a.m. UTC | #1
Sandra Loosemore <sandra@codesourcery.com> writes:

> This part of the revised Nios II prologue/epilogue refactoring patch
> fixes the prologue analyzer to handle the multiple stack adjustment
> instructions that GCC may now emit in some cases.  It replaces the
> test that caused analysis to terminate when a second adjustment is
> found with more specific tests that can distinguish between
> prologue-ish and epilogue-ish adjustments.
>
> OK to commit on top of part 1?
>
> -Sandra
>
> 2014-11-24  Sandra Loosemore  <sandra@codesourcery.com>
>
> 	gdb/
> 	* nios2-tdep.c (nios2_analyze_prologue): Replace restriction
> 	that there can be only one stack adjustment in the prologue
> 	with tests to detect specific disallowed stack adjustments.

This is OK.
  

Patch

diff -u b/gdb/nios2-tdep.c b/gdb/nios2-tdep.c
--- b/gdb/nios2-tdep.c
+++ b/gdb/nios2-tdep.c
@@ -842,6 +842,11 @@ 
 	      cache->reg_saved[NIOS2_SP_REGNUM].addr = -4;
 	    }
 
+	  else if (rc == NIOS2_SP_REGNUM && ra == NIOS2_FP_REGNUM)
+	    /* This is setting SP from FP.  This only happens in the
+	       function epilogue.  */
+	    break;
+
 	  else if (rc != 0)
 	    {
 	      if (value[rb].reg == 0)
@@ -853,13 +858,21 @@ 
 	      value[rc].offset = value[ra].offset + value[rb].offset;
 	    }
 
-	  prologue_end = pc;
+	  /* The add/move is only considered a prologue instruction
+	     if the destination is SP or FP.  */
+	  if (rc == NIOS2_SP_REGNUM || rc == NIOS2_FP_REGNUM)
+	    prologue_end = pc;
 	}
       
       else if (nios2_match_sub (insn, op, mach, &ra, &rb, &rc))
 	{
 	  /* SUB   rc, ra, rb */
-	  if (rc != 0)
+	  if (rc == NIOS2_SP_REGNUM && rb == NIOS2_SP_REGNUM
+	      && value[rc].reg != 0)
+	    /* If we are decrementing the SP by a non-constant amount,
+	       this is alloca, not part of the prologue.  */
+	    break;
+	  else if (rc != 0)
 	    {
 	      if (value[rb].reg == 0)
 		value[rc].reg = value[ra].reg;
@@ -873,12 +886,13 @@ 
 	{
 	  /* ADDI    rb, ra, imm */
 
-	  /* The first stack adjustment is part of the prologue.
-	     Any subsequent stack adjustments are either down to
-	     alloca or the epilogue so stop analysing when we hit
-	     them.  */
+	  /* A positive stack adjustment has to be part of the epilogue.  */
 	  if (rb == NIOS2_SP_REGNUM
-	      && (value[rb].offset != 0 || value[ra].reg != NIOS2_SP_REGNUM))
+	      && (imm > 0 || value[ra].reg != NIOS2_SP_REGNUM))
+	    break;
+
+	  /* Likewise restoring SP from FP.  */
+	  else if (rb == NIOS2_SP_REGNUM && ra == NIOS2_FP_REGNUM)
 	    break;
 
 	  if (rb != 0)
@@ -887,7 +901,10 @@ 
 	      value[rb].offset = value[ra].offset + imm;
 	    }
 
-	  prologue_end = pc;
+	  /* The add is only considered a prologue instruction
+	     if the destination is SP or FP.  */
+	  if (rb == NIOS2_SP_REGNUM || rb == NIOS2_FP_REGNUM)
+	    prologue_end = pc;
 	}
 
       else if (nios2_match_orhi (insn, op, mach, &ra, &rb, &uimm))