/* Target-dependent code for Moxie.
- Copyright (C) 2009 Free Software Foundation, Inc.
+ Copyright (C) 2009, 2010 Free Software Foundation, Inc.
This file is part of GDB.
static CORE_ADDR
moxie_analyze_prologue (CORE_ADDR start_addr, CORE_ADDR end_addr,
- struct moxie_frame_cache *cache,
- struct frame_info *this_frame)
+ struct moxie_frame_cache *cache,
+ struct gdbarch *gdbarch)
{
- struct gdbarch *gdbarch = get_frame_arch (this_frame);
enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
CORE_ADDR next_addr;
ULONGEST inst, inst2;
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;
memset (&cache, 0, sizeof cache);
plg_end = moxie_analyze_prologue (func_addr,
- func_end, &cache, NULL);
+ func_end, &cache, gdbarch);
/* Found a function. */
sym = lookup_symbol (func_name, NULL, VAR_DOMAIN, NULL);
/* Don't use line number debug info for assembly source
cache->pc = get_frame_func (this_frame);
current_pc = get_frame_pc (this_frame);
if (cache->pc)
- moxie_analyze_prologue (cache->pc, current_pc, cache, this_frame);
+ {
+ struct gdbarch *gdbarch = get_frame_arch (this_frame);
+ moxie_analyze_prologue (cache->pc, current_pc, cache, gdbarch);
+ }
cache->saved_sp = cache->base - cache->framesize;