From 221c289d2fa3fc8f934249439bc16d30e948e038 Mon Sep 17 00:00:00 2001 From: Michael Snyder Date: Mon, 21 Mar 2005 23:23:32 +0000 Subject: [PATCH] 2005-03-21 Michael Snyder * mn10300-prologue.c (fix_frame_pointer): Delete. (set_movm_offsets) Don't return just because movm_args is zero -- still need to save pc and sp in saved_regs. (mn10300_analyze_prologue): Don't return prematurely without calling set_movm_offsets (for pc and sp at minimum). --- gdb/ChangeLog | 8 ++++ gdb/mn10300-prologue.c | 118 ++++++++++++------------------------------------- 2 files changed, 36 insertions(+), 90 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5756020456..2a81f8b9a9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2005-03-21 Michael Snyder + + * mn10300-prologue.c (fix_frame_pointer): Delete. + (set_movm_offsets) Don't return just because movm_args is + zero -- still need to save pc and sp in saved_regs. + (mn10300_analyze_prologue): Don't return prematurely without + calling set_movm_offsets (for pc and sp at minimum). + 2005-03-21 Mark Mitchell * configure.ac (stat.st_blksize): Check for it. diff --git a/gdb/mn10300-prologue.c b/gdb/mn10300-prologue.c index c5e5388c85..4875086d4a 100644 --- a/gdb/mn10300-prologue.c +++ b/gdb/mn10300-prologue.c @@ -107,28 +107,6 @@ set_my_stack_size (struct frame_info *fi, CORE_ADDR size) } -/* Fix fi->frame if it's bogus at this point. This is a helper - function for mn10300_analyze_prologue. - - MVS: This later became frame_base_hack, and probably now - could just be trad_frame_set_this_base. -*/ - -static void -fix_frame_pointer (struct frame_info *fi, int stack_size) -{ -#if 0 - if (fi && get_next_frame (fi) == NULL) - { - if (is_my_frame_in_sp (fi)) - deprecated_update_frame_base_hack (fi, read_sp () - stack_size); - else if (is_my_frame_in_fp (fi)) - deprecated_update_frame_base_hack (fi, read_register (E_A3_REGNUM)); - } -#endif -} - - /* Set offsets of registers saved by movm instruction. This is a helper function for mn10300_analyze_prologue. */ @@ -141,7 +119,7 @@ set_movm_offsets (struct frame_info *fi, int offset = 0; CORE_ADDR base; - if (cache == NULL || fi == NULL || movm_args == 0) + if (cache == NULL || fi == NULL) return; cache = mn10300_frame_unwind_cache (fi, this_cache); @@ -329,13 +307,21 @@ mn10300_analyze_prologue (struct frame_info *fi, pc = (fi ? get_frame_pc (fi) : pc); But this is (now) badly broken when called from analyze_dummy_frame(). */ - pc = (pc ? pc : get_frame_pc (fi)); + if (fi) + { + pc = (pc ? pc : get_frame_pc (fi)); + /* At the start of a function our frame is in the stack pointer. */ + my_frame_is_in_sp (fi, this_cache); + } /* Find the start of this function. */ status = find_pc_partial_function (pc, &name, &func_addr, &func_end); - /* Do nothing if we couldn't find the start of this function or if we're - stopped at the first instruction in the prologue. */ + /* Do nothing if we couldn't find the start of this function + + MVS: comment went on to say "or if we're stopped at the first + instruction in the prologue" -- but code doesn't reflect that, + and I don't want to do that anyway. */ if (status == 0) { return pc; @@ -349,10 +335,6 @@ mn10300_analyze_prologue (struct frame_info *fi, return pc; } - /* At the start of a function our frame is in the stack pointer. */ - if (fi) - my_frame_is_in_sp (fi, this_cache); - #if 0 /* Get the next two bytes into buf, we need two because rets is a two byte insn and the first isn't enough to uniquely identify it. */ @@ -384,6 +366,10 @@ mn10300_analyze_prologue (struct frame_info *fi, } #endif + /* NOTE: from here on, we don't want to return without jumping to + finish_prologue. */ + + /* Figure out where to stop scanning. */ stop = fi ? pc : func_end; @@ -396,10 +382,7 @@ mn10300_analyze_prologue (struct frame_info *fi, /* Suck in two bytes. */ if (addr + 2 >= stop || (status = deprecated_read_memory_nobpt (addr, buf, 2)) != 0) - { - fix_frame_pointer (fi, 0); - return addr; - } + goto finish_prologue; /* First see if this insn sets the stack pointer from a register; if so, it's probably the initialization of the stack pointer in _start, @@ -408,7 +391,7 @@ mn10300_analyze_prologue (struct frame_info *fi, { if (fi) my_frame_is_last (fi); - return addr; + goto finish_prologue; } /* Now look for movm [regs],sp, which saves the callee saved registers. @@ -425,28 +408,12 @@ mn10300_analyze_prologue (struct frame_info *fi, /* Quit now if we're beyond the stop point. */ if (addr >= stop) - { - /* Fix fi->frame since it's bogus at this point. */ - if (fi && get_next_frame (fi) == NULL) - deprecated_update_frame_base_hack (fi, read_sp ()); - - /* Note if/where callee saved registers were saved. */ - set_movm_offsets (fi, this_cache, movm_args); - return addr; - } + goto finish_prologue; /* Get the next two bytes so the prologue scan can continue. */ status = deprecated_read_memory_nobpt (addr, buf, 2); if (status != 0) - { - /* Fix fi->frame since it's bogus at this point. */ - if (fi && get_next_frame (fi) == NULL) - deprecated_update_frame_base_hack (fi, read_sp ()); - - /* Note if/where callee saved registers were saved. */ - set_movm_offsets (fi, this_cache, movm_args); - return addr; - } + goto finish_prologue; } /* Now see if we set up a frame pointer via "mov sp,a3" */ @@ -462,26 +429,12 @@ mn10300_analyze_prologue (struct frame_info *fi, /* Quit now if we're beyond the stop point. */ if (addr >= stop) - { - /* Fix fi->frame if it's bogus at this point. */ - fix_frame_pointer (fi, 0); - - /* Note if/where callee saved registers were saved. */ - set_movm_offsets (fi, this_cache, movm_args); - return addr; - } + goto finish_prologue; /* Get two more bytes so scanning can continue. */ status = deprecated_read_memory_nobpt (addr, buf, 2); if (status != 0) - { - /* Fix fi->frame if it's bogus at this point. */ - fix_frame_pointer (fi, 0); - - /* Note if/where callee saved registers were saved. */ - set_movm_offsets (fi, this_cache, movm_args); - return addr; - } + goto finish_prologue; } /* Next we should allocate the local frame. No more prologue insns @@ -508,14 +461,7 @@ mn10300_analyze_prologue (struct frame_info *fi, current frame. */ status = deprecated_read_memory_nobpt (addr + 2, buf, imm_size); if (status != 0) - { - /* Fix fi->frame if it's bogus at this point. */ - fix_frame_pointer (fi, 0); - - /* Note if/where callee saved registers were saved. */ - set_movm_offsets (fi, this_cache, movm_args); - return addr; - } + goto finish_prologue; /* Note the size of the stack in the frame info structure. */ stack_size = extract_signed_integer (buf, imm_size); @@ -526,21 +472,13 @@ mn10300_analyze_prologue (struct frame_info *fi, addr += 2 + imm_size; /* No more prologue insns follow, so begin preparation to return. */ - /* Fix fi->frame if it's bogus at this point. */ - fix_frame_pointer (fi, stack_size); - - /* Note if/where callee saved registers were saved. */ - set_movm_offsets (fi, this_cache, movm_args); - return addr; + goto finish_prologue; } - - /* We never found an insn which allocates local stack space, regardless - this is the end of the prologue. */ - /* Fix fi->frame if it's bogus at this point. */ - fix_frame_pointer (fi, 0); - + /* Do the essentials and get out of here. */ + finish_prologue: /* Note if/where callee saved registers were saved. */ - set_movm_offsets (fi, this_cache, movm_args); + if (fi) + set_movm_offsets (fi, this_cache, movm_args); return addr; } -- 2.11.0