diff options
author | Anthony Green <green@redhat.com> | 2009-09-10 21:12:24 +0000 |
---|---|---|
committer | Anthony Green <green@redhat.com> | 2009-09-10 21:12:24 +0000 |
commit | d52e92da51d563f33abfd08c21b86934a27cf479 (patch) | |
tree | 7d513a650563386bab7207456a7827c4a4637d53 /gdb/moxie-tdep.c | |
parent | f98ce7a2659448a90532594a1c263f19208327c8 (diff) | |
download | gdb-d52e92da51d563f33abfd08c21b86934a27cf479.tar.gz |
Recognize new moxie prologues
Diffstat (limited to 'gdb/moxie-tdep.c')
-rw-r--r-- | gdb/moxie-tdep.c | 40 |
1 files changed, 27 insertions, 13 deletions
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; |