diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/config/v850/tm-v850.h | 2 | ||||
-rw-r--r-- | gdb/v850-tdep.c | 12 |
3 files changed, 15 insertions, 5 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d5ef748..71db97e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -3,10 +3,10 @@ Fri Dec 27 14:53:40 1996 Michael Meissner <meissner@tiktok.cygnus.com> * v850-tdep.c (struct pifsr): Add cur_frameoffset field. (v850_scan_prologue): Add debug code #ifdef'ed DEBUG. Support new compiler prologues using register save functions and short store - instructions. + instructions. Add support for functions with large stack frames. - * config/v850/tm-vm850.h ({R1,EP}_REGNUMS): New register number - defintiions for r1, ep. + * config/v850/tm-vm850.h ({R0,R1,R12,EP}_REGNUMS): New register + number defintiions for r0, r1, r12, ep. (SAVE{1,2,3}_{START,END}_REGNUM): Register number definitions for the 3 sets of saved registers. diff --git a/gdb/config/v850/tm-v850.h b/gdb/config/v850/tm-v850.h index b30f39c..bc37144 100644 --- a/gdb/config/v850/tm-v850.h +++ b/gdb/config/v850/tm-v850.h @@ -39,6 +39,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #define REGISTER_SIZE 4 #define MAX_REGISTER_RAW_SIZE 4 +#define R0_REGNUM 0 #define R1_REGNUM 1 #define SAVE1_START_REGNUM 2 #define SAVE1_END_REGNUM 2 @@ -47,6 +48,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #define ARGLAST_REGNUM 9 #define V0_REGNUM 10 #define V1_REGNUM 11 +#define R12_REGNUM 12 #define SAVE2_START_REGNUM 20 #define SAVE2_END_REGNUM 29 #define FP_REGNUM 29 diff --git a/gdb/v850-tdep.c b/gdb/v850-tdep.c index b79221a..1bde62c 100644 --- a/gdb/v850-tdep.c +++ b/gdb/v850-tdep.c @@ -71,6 +71,7 @@ v850_scan_prologue (pc, pi) CORE_ADDR save_pc, save_end; int regsave_func_p; int current_sp_size; + int r12_tmp; /* First, figure out the bounds of the prologue so that we can limit the search to something reasonable. */ @@ -115,6 +116,7 @@ v850_scan_prologue (pc, pi) regsave_func_p = 0; save_pc = 0; save_end = 0; + r12_tmp = 0; #ifdef DEBUG printf_filtered ("Current_pc = 0x%.8lx, prologue_end = 0x%.8lx\n", @@ -184,13 +186,19 @@ v850_scan_prologue (pc, pi) pi->framereg = FP_REGNUM; } + else if (insn == ((R12_REGNUM << 11) | 0x0640 | R0_REGNUM)) /* movhi hi(const),r0,r12 */ + r12_tmp = read_memory_integer (current_pc + 2, 2) << 16; + else if (insn == ((R12_REGNUM << 11) | 0x0620 | R12_REGNUM)) /* movea lo(const),r12,r12 */ + r12_tmp += read_memory_integer (current_pc + 2, 2); + else if (insn == ((SP_REGNUM << 11) | 0x01c0 | R12_REGNUM) && r12_tmp) /* add r12,sp */ + pi->frameoffset = r12_tmp; else if (insn == ((EP_REGNUM << 11) | 0x0000 | SP_REGNUM)) /* mov sp,ep */ ep_used = 1; else if (insn == ((EP_REGNUM << 11) | 0x0000 | R1_REGNUM)) /* mov r1,ep */ ep_used = 0; - else if (((insn & 0x07ff) == (0x0760 | SP_REGNUM) /* st.w <reg>,<offset>[sp] */ + else if (((insn & 0x07ff) == (0x0760 | SP_REGNUM) /* st.w <reg>,<offset>[sp] */ || (fp_used - && (insn & 0x07ff) == (0x0760 | FP_REGNUM))) /* st.w <reg>,<offset>[fp] */ + && (insn & 0x07ff) == (0x0760 | FP_REGNUM))) /* st.w <reg>,<offset>[fp] */ && pifsr && (((reg = (insn >> 11) & 0x1f) >= SAVE1_START_REGNUM && reg <= SAVE1_END_REGNUM) || (reg >= SAVE2_START_REGNUM && reg <= SAVE2_END_REGNUM) |