aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjamesbowman <jamesb@excamera.com>2015-09-29 09:31:09 -0700
committerjamesbowman <jamesb@excamera.com>2015-09-29 09:31:09 -0700
commit4f714dd43efde465c7f2272ee444ccd2f1b3a1b5 (patch)
treebf9ad628748950aa74e6c9dd34277360274cc346
parent86feccb92092506f2a23a32345bc0f562ac4042b (diff)
downloadgdb-4f714dd43efde465c7f2272ee444ccd2f1b3a1b5.zip
gdb-4f714dd43efde465c7f2272ee444ccd2f1b3a1b5.tar.gz
gdb-4f714dd43efde465c7f2272ee444ccd2f1b3a1b5.tar.bz2
Rebase patch #7
-rw-r--r--gdb/ft32-tdep.c45
1 files changed, 39 insertions, 6 deletions
diff --git a/gdb/ft32-tdep.c b/gdb/ft32-tdep.c
index 00cf847..0b51af3 100644
--- a/gdb/ft32-tdep.c
+++ b/gdb/ft32-tdep.c
@@ -164,33 +164,66 @@ ft32_analyze_prologue (CORE_ADDR start_addr, CORE_ADDR end_addr,
CORE_ADDR next_addr;
ULONGEST inst, inst2;
LONGEST offset;
- int regnum;
+ int regnum, pushreg;
+ struct bound_minimal_symbol msymbol;
+ unsigned prologs[32];
cache->saved_regs[FT32_PC_REGNUM] = 0;
cache->framesize = 0;
+ for (regnum = 0; regnum < 32; regnum++)
+ {
+ char prolog_symbol[32];
+
+ snprintf (prolog_symbol, sizeof (prolog_symbol), "__prolog_$r%02d",
+ regnum);
+ msymbol = lookup_minimal_symbol (prolog_symbol, NULL, NULL);
+ if (msymbol.minsym)
+ prologs[regnum] = BMSYMBOL_VALUE_ADDRESS (msymbol);
+ else
+ prologs[regnum] = 0;
+ }
+
if (start_addr >= end_addr)
- return end_addr;
+ return end_addr;
cache->established = 0;
- for (next_addr = start_addr; next_addr < end_addr; )
+ for (next_addr = start_addr; next_addr < end_addr;)
{
inst = read_memory_unsigned_integer (next_addr, 4, byte_order);
if (FT32_IS_PUSH (inst))
{
- regnum = FT32_R0_REGNUM + FT32_PUSH_REG (inst);
+ pushreg = FT32_PUSH_REG (inst);
cache->framesize += 4;
- cache->saved_regs[regnum] = cache->framesize;
+ cache->saved_regs[FT32_R0_REGNUM + pushreg] = cache->framesize;
next_addr += 4;
}
+ else if (FT32_IS_CALL (inst))
+ {
+ for (regnum = 0; regnum < 32; regnum++)
+ {
+ if ((4 * (inst & 0x3ffff)) == prologs[regnum])
+ {
+ for (pushreg = 13; pushreg <= regnum; pushreg++)
+ {
+ cache->framesize += 4;
+ cache->saved_regs[FT32_R0_REGNUM + pushreg] =
+ cache->framesize;
+ }
+ next_addr += 4;
+ }
+ }
+ break;
+ }
else
break;
}
for (regnum = FT32_R0_REGNUM; regnum < FT32_PC_REGNUM; regnum++)
{
if (cache->saved_regs[regnum] != REG_UNAVAIL)
- cache->saved_regs[regnum] = cache->framesize - cache->saved_regs[regnum];
+ cache->saved_regs[regnum] =
+ cache->framesize - cache->saved_regs[regnum];
}
cache->saved_regs[FT32_PC_REGNUM] = cache->framesize;