This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[3/3 patch, nios2] clean up prologue/epilogue detection code, v2
- From: Sandra Loosemore <sandra at codesourcery dot com>
- To: Yao Qi <yao at codesourcery dot com>, <gdb-patches at sourceware dot org>
- Date: Mon, 24 Nov 2014 17:03:11 -0700
- Subject: [3/3 patch, nios2] clean up prologue/epilogue detection code, v2
- Authentication-results: sourceware.org; auth=none
- References: <545EA0C1 dot 6050104 at codesourcery dot com> <87bnoeif74 dot fsf at codesourcery dot com> <5473C4BA dot 2050903 at codesourcery dot com>
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.
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))