From ce0bf48891e83c4aa7137bd66a6dd547d55e0ea1 Mon Sep 17 00:00:00 2001 From: Anthony Green Date: Thu, 10 Sep 2009 21:12:25 +0000 Subject: [PATCH] Recognize new moxie prologues --- gdb/ChangeLog | 5 +++++ gdb/moxie-tdep.c | 40 +++++++++++++++++++++++++++------------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3767c4807ec..a1f3d27121a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2009-09-10 Anthony Green + + * moxie-tdep.c (moxie_analyze_prologue): Recognize new prologue + sequences. + 2009-09-10 Michael Snyder * remote.c (PACKET_bc, PACKET_bs): New enums. diff --git a/gdb/moxie-tdep.c b/gdb/moxie-tdep.c index 7faa378b5a7..80fecf8661a 100644 --- a/gdb/moxie-tdep.c +++ b/gdb/moxie-tdep.c @@ -174,23 +174,37 @@ moxie_analyze_prologue (CORE_ADDR start_addr, CORE_ADDR end_addr, cache->saved_regs[regnum] = cache->framesize; next_addr += 2; } + } - /* Optional stack allocation for args and local vars <= 4 - byte. */ - else if (inst == 0x01f0) /* ldi.l $r12, X */ - { - offset = read_memory_integer (next_addr + 2, 4, byte_order); - inst2 = read_memory_unsigned_integer (next_addr + 6, 2, byte_order); + inst = read_memory_unsigned_integer (next_addr, 2, byte_order); - if (inst2 == 0x051f) /* add.l $sp, $r12 */ - { - cache->framesize += offset; - } + /* Optional stack allocation for args and local vars <= 4 + byte. */ + if (inst == 0x0170) /* ldi.l $r5, X */ + { + offset = read_memory_integer (next_addr + 2, 4, byte_order); + inst2 = read_memory_unsigned_integer (next_addr + 6, 2, byte_order); + + if (inst2 == 0x0517) /* add.l $sp, $r5 */ + { + cache->framesize += offset; + } + + return (next_addr + 8); + } + else if ((inst & 0xff00) == 0x91) /* dec $sp, X */ + { + cache->framesize += (inst & 0x00ff); + next_addr += 2; - return (next_addr + 8); + while (next_addr < end_addr) + { + inst = read_memory_unsigned_integer (next_addr, 2, byte_order); + if ((inst & 0xff00) != 0x91) /* no more dec $sp, X */ + break; + cache->framesize += (inst & 0x00ff); + next_addr += 2; } - else /* This is not a prologue instruction. */ - break; } return next_addr; -- 2.30.2