xref: /openbsd-src/gnu/usr.bin/binutils/gdb/m32r-tdep.c (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
1b725ae77Skettenis /* Target-dependent code for Renesas M32R, for GDB.
2b725ae77Skettenis 
3*11efff7fSkettenis    Copyright 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
4b725ae77Skettenis    Foundation, Inc.
5b725ae77Skettenis 
6b725ae77Skettenis    This file is part of GDB.
7b725ae77Skettenis 
8b725ae77Skettenis    This program is free software; you can redistribute it and/or modify
9b725ae77Skettenis    it under the terms of the GNU General Public License as published by
10b725ae77Skettenis    the Free Software Foundation; either version 2 of the License, or
11b725ae77Skettenis    (at your option) any later version.
12b725ae77Skettenis 
13b725ae77Skettenis    This program is distributed in the hope that it will be useful,
14b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
15b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16b725ae77Skettenis    GNU General Public License for more details.
17b725ae77Skettenis 
18b725ae77Skettenis    You should have received a copy of the GNU General Public License
19b725ae77Skettenis    along with this program; if not, write to the Free Software
20b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
21b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
22b725ae77Skettenis 
23b725ae77Skettenis #include "defs.h"
24b725ae77Skettenis #include "frame.h"
25b725ae77Skettenis #include "frame-unwind.h"
26b725ae77Skettenis #include "frame-base.h"
27b725ae77Skettenis #include "symtab.h"
28b725ae77Skettenis #include "gdbtypes.h"
29b725ae77Skettenis #include "gdbcmd.h"
30b725ae77Skettenis #include "gdbcore.h"
31b725ae77Skettenis #include "gdb_string.h"
32b725ae77Skettenis #include "value.h"
33b725ae77Skettenis #include "inferior.h"
34b725ae77Skettenis #include "symfile.h"
35b725ae77Skettenis #include "objfiles.h"
36*11efff7fSkettenis #include "osabi.h"
37b725ae77Skettenis #include "language.h"
38b725ae77Skettenis #include "arch-utils.h"
39b725ae77Skettenis #include "regcache.h"
40b725ae77Skettenis #include "trad-frame.h"
41b725ae77Skettenis #include "dis-asm.h"
42b725ae77Skettenis 
43b725ae77Skettenis #include "gdb_assert.h"
44b725ae77Skettenis 
45*11efff7fSkettenis #include "m32r-tdep.h"
46b725ae77Skettenis 
47b725ae77Skettenis /* Local functions */
48b725ae77Skettenis 
49b725ae77Skettenis extern void _initialize_m32r_tdep (void);
50b725ae77Skettenis 
51b725ae77Skettenis static CORE_ADDR
m32r_frame_align(struct gdbarch * gdbarch,CORE_ADDR sp)52b725ae77Skettenis m32r_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
53b725ae77Skettenis {
54b725ae77Skettenis   /* Align to the size of an instruction (so that they can safely be
55b725ae77Skettenis      pushed onto the stack.  */
56b725ae77Skettenis   return sp & ~3;
57b725ae77Skettenis }
58b725ae77Skettenis 
59b725ae77Skettenis 
60*11efff7fSkettenis /* Breakpoints
61b725ae77Skettenis 
62*11efff7fSkettenis    The little endian mode of M32R is unique. In most of architectures,
63*11efff7fSkettenis    two 16-bit instructions, A and B, are placed as the following:
64b725ae77Skettenis 
65*11efff7fSkettenis    Big endian:
66*11efff7fSkettenis    A0 A1 B0 B1
67b725ae77Skettenis 
68*11efff7fSkettenis    Little endian:
69*11efff7fSkettenis    A1 A0 B1 B0
70*11efff7fSkettenis 
71*11efff7fSkettenis    In M32R, they are placed like this:
72*11efff7fSkettenis 
73*11efff7fSkettenis    Big endian:
74*11efff7fSkettenis    A0 A1 B0 B1
75*11efff7fSkettenis 
76*11efff7fSkettenis    Little endian:
77*11efff7fSkettenis    B1 B0 A1 A0
78*11efff7fSkettenis 
79*11efff7fSkettenis    This is because M32R always fetches instructions in 32-bit.
80*11efff7fSkettenis 
81*11efff7fSkettenis    The following functions take care of this behavior. */
82b725ae77Skettenis 
83b725ae77Skettenis static int
m32r_memory_insert_breakpoint(CORE_ADDR addr,char * contents_cache)84b725ae77Skettenis m32r_memory_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
85b725ae77Skettenis {
86b725ae77Skettenis   int val;
87*11efff7fSkettenis   char buf[4];
88*11efff7fSkettenis   char bp_entry[] = { 0x10, 0xf1 };	/* dpt */
89b725ae77Skettenis 
90b725ae77Skettenis   /* Save the memory contents.  */
91*11efff7fSkettenis   val = target_read_memory (addr & 0xfffffffc, contents_cache, 4);
92b725ae77Skettenis   if (val != 0)
93b725ae77Skettenis     return val;			/* return error */
94b725ae77Skettenis 
95b725ae77Skettenis   /* Determine appropriate breakpoint contents and size for this address.  */
96b725ae77Skettenis   if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
97b725ae77Skettenis     {
98*11efff7fSkettenis       if ((addr & 3) == 0)
99b725ae77Skettenis 	{
100*11efff7fSkettenis 	  buf[0] = bp_entry[0];
101*11efff7fSkettenis 	  buf[1] = bp_entry[1];
102*11efff7fSkettenis 	  buf[2] = contents_cache[2] & 0x7f;
103*11efff7fSkettenis 	  buf[3] = contents_cache[3];
104b725ae77Skettenis 	}
105b725ae77Skettenis       else
106b725ae77Skettenis 	{
107*11efff7fSkettenis 	  buf[0] = contents_cache[0];
108*11efff7fSkettenis 	  buf[1] = contents_cache[1];
109*11efff7fSkettenis 	  buf[2] = bp_entry[0];
110*11efff7fSkettenis 	  buf[3] = bp_entry[1];
111b725ae77Skettenis 	}
112b725ae77Skettenis     }
113*11efff7fSkettenis   else				/* little-endian */
114b725ae77Skettenis     {
115*11efff7fSkettenis       if ((addr & 3) == 0)
116*11efff7fSkettenis 	{
117*11efff7fSkettenis 	  buf[0] = contents_cache[0];
118*11efff7fSkettenis 	  buf[1] = contents_cache[1] & 0x7f;
119*11efff7fSkettenis 	  buf[2] = bp_entry[1];
120*11efff7fSkettenis 	  buf[3] = bp_entry[0];
121b725ae77Skettenis 	}
122b725ae77Skettenis       else
123b725ae77Skettenis 	{
124*11efff7fSkettenis 	  buf[0] = bp_entry[1];
125*11efff7fSkettenis 	  buf[1] = bp_entry[0];
126*11efff7fSkettenis 	  buf[2] = contents_cache[2];
127*11efff7fSkettenis 	  buf[3] = contents_cache[3];
128b725ae77Skettenis 	}
129b725ae77Skettenis     }
130b725ae77Skettenis 
131b725ae77Skettenis   /* Write the breakpoint.  */
132*11efff7fSkettenis   val = target_write_memory (addr & 0xfffffffc, buf, 4);
133b725ae77Skettenis   return val;
134b725ae77Skettenis }
135b725ae77Skettenis 
136b725ae77Skettenis static int
m32r_memory_remove_breakpoint(CORE_ADDR addr,char * contents_cache)137b725ae77Skettenis m32r_memory_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
138b725ae77Skettenis {
139b725ae77Skettenis   int val;
140*11efff7fSkettenis   char buf[4];
141b725ae77Skettenis 
142*11efff7fSkettenis   buf[0] = contents_cache[0];
143*11efff7fSkettenis   buf[1] = contents_cache[1];
144*11efff7fSkettenis   buf[2] = contents_cache[2];
145*11efff7fSkettenis   buf[3] = contents_cache[3];
146*11efff7fSkettenis 
147*11efff7fSkettenis   /* Remove parallel bit.  */
148b725ae77Skettenis   if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
149b725ae77Skettenis     {
150*11efff7fSkettenis       if ((buf[0] & 0x80) == 0 && (buf[2] & 0x80) != 0)
151*11efff7fSkettenis 	buf[2] &= 0x7f;
152b725ae77Skettenis     }
153*11efff7fSkettenis   else				/* little-endian */
154b725ae77Skettenis     {
155*11efff7fSkettenis       if ((buf[3] & 0x80) == 0 && (buf[1] & 0x80) != 0)
156*11efff7fSkettenis 	buf[1] &= 0x7f;
157b725ae77Skettenis     }
158b725ae77Skettenis 
159b725ae77Skettenis   /* Write contents.  */
160*11efff7fSkettenis   val = target_write_memory (addr & 0xfffffffc, buf, 4);
161b725ae77Skettenis   return val;
162b725ae77Skettenis }
163b725ae77Skettenis 
164b725ae77Skettenis static const unsigned char *
m32r_breakpoint_from_pc(CORE_ADDR * pcptr,int * lenptr)165b725ae77Skettenis m32r_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
166b725ae77Skettenis {
167*11efff7fSkettenis   static char be_bp_entry[] = { 0x10, 0xf1, 0x70, 0x00 };	/* dpt -> nop */
168*11efff7fSkettenis   static char le_bp_entry[] = { 0x00, 0x70, 0xf1, 0x10 };	/* dpt -> nop */
169b725ae77Skettenis   unsigned char *bp;
170b725ae77Skettenis 
171b725ae77Skettenis   /* Determine appropriate breakpoint.  */
172b725ae77Skettenis   if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
173b725ae77Skettenis     {
174b725ae77Skettenis       if ((*pcptr & 3) == 0)
175b725ae77Skettenis 	{
176*11efff7fSkettenis 	  bp = be_bp_entry;
177*11efff7fSkettenis 	  *lenptr = 4;
178b725ae77Skettenis 	}
179b725ae77Skettenis       else
180b725ae77Skettenis 	{
181*11efff7fSkettenis 	  bp = be_bp_entry;
182*11efff7fSkettenis 	  *lenptr = 2;
183b725ae77Skettenis 	}
184b725ae77Skettenis     }
185b725ae77Skettenis   else
186b725ae77Skettenis     {
187b725ae77Skettenis       if ((*pcptr & 3) == 0)
188b725ae77Skettenis 	{
189*11efff7fSkettenis 	  bp = le_bp_entry;
190*11efff7fSkettenis 	  *lenptr = 4;
191b725ae77Skettenis 	}
192b725ae77Skettenis       else
193b725ae77Skettenis 	{
194*11efff7fSkettenis 	  bp = le_bp_entry + 2;
195*11efff7fSkettenis 	  *lenptr = 2;
196b725ae77Skettenis 	}
197b725ae77Skettenis     }
198b725ae77Skettenis 
199b725ae77Skettenis   return bp;
200b725ae77Skettenis }
201b725ae77Skettenis 
202b725ae77Skettenis 
203b725ae77Skettenis char *m32r_register_names[] = {
204b725ae77Skettenis   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
205b725ae77Skettenis   "r8", "r9", "r10", "r11", "r12", "fp", "lr", "sp",
206b725ae77Skettenis   "psw", "cbr", "spi", "spu", "bpc", "pc", "accl", "acch",
207b725ae77Skettenis   "evb"
208b725ae77Skettenis };
209b725ae77Skettenis 
210b725ae77Skettenis static const char *
m32r_register_name(int reg_nr)211b725ae77Skettenis m32r_register_name (int reg_nr)
212b725ae77Skettenis {
213b725ae77Skettenis   if (reg_nr < 0)
214b725ae77Skettenis     return NULL;
215*11efff7fSkettenis   if (reg_nr >= M32R_NUM_REGS)
216b725ae77Skettenis     return NULL;
217b725ae77Skettenis   return m32r_register_names[reg_nr];
218b725ae77Skettenis }
219b725ae77Skettenis 
220b725ae77Skettenis 
221b725ae77Skettenis /* Return the GDB type object for the "standard" data type
222b725ae77Skettenis    of data in register N.  */
223b725ae77Skettenis 
224b725ae77Skettenis static struct type *
m32r_register_type(struct gdbarch * gdbarch,int reg_nr)225b725ae77Skettenis m32r_register_type (struct gdbarch *gdbarch, int reg_nr)
226b725ae77Skettenis {
227b725ae77Skettenis   if (reg_nr == M32R_PC_REGNUM)
228b725ae77Skettenis     return builtin_type_void_func_ptr;
229b725ae77Skettenis   else if (reg_nr == M32R_SP_REGNUM || reg_nr == M32R_FP_REGNUM)
230b725ae77Skettenis     return builtin_type_void_data_ptr;
231b725ae77Skettenis   else
232b725ae77Skettenis     return builtin_type_int32;
233b725ae77Skettenis }
234b725ae77Skettenis 
235b725ae77Skettenis 
236b725ae77Skettenis /* Write into appropriate registers a function return value
237b725ae77Skettenis    of type TYPE, given in virtual format.
238b725ae77Skettenis 
239b725ae77Skettenis    Things always get returned in RET1_REGNUM, RET2_REGNUM. */
240b725ae77Skettenis 
241b725ae77Skettenis static void
m32r_store_return_value(struct type * type,struct regcache * regcache,const void * valbuf)242b725ae77Skettenis m32r_store_return_value (struct type *type, struct regcache *regcache,
243b725ae77Skettenis 			 const void *valbuf)
244b725ae77Skettenis {
245b725ae77Skettenis   CORE_ADDR regval;
246b725ae77Skettenis   int len = TYPE_LENGTH (type);
247b725ae77Skettenis 
248b725ae77Skettenis   regval = extract_unsigned_integer (valbuf, len > 4 ? 4 : len);
249b725ae77Skettenis   regcache_cooked_write_unsigned (regcache, RET1_REGNUM, regval);
250b725ae77Skettenis 
251b725ae77Skettenis   if (len > 4)
252b725ae77Skettenis     {
253b725ae77Skettenis       regval = extract_unsigned_integer ((char *) valbuf + 4, len - 4);
254b725ae77Skettenis       regcache_cooked_write_unsigned (regcache, RET1_REGNUM + 1, regval);
255b725ae77Skettenis     }
256b725ae77Skettenis }
257b725ae77Skettenis 
258b725ae77Skettenis /* This is required by skip_prologue. The results of decoding a prologue
259b725ae77Skettenis    should be cached because this thrashing is getting nuts.  */
260b725ae77Skettenis 
261*11efff7fSkettenis static int
decode_prologue(CORE_ADDR start_pc,CORE_ADDR scan_limit,CORE_ADDR * pl_endptr,unsigned long * framelength)262b725ae77Skettenis decode_prologue (CORE_ADDR start_pc, CORE_ADDR scan_limit,
263*11efff7fSkettenis 		 CORE_ADDR *pl_endptr, unsigned long *framelength)
264b725ae77Skettenis {
265b725ae77Skettenis   unsigned long framesize;
266b725ae77Skettenis   int insn;
267b725ae77Skettenis   int op1;
268b725ae77Skettenis   CORE_ADDR after_prologue = 0;
269*11efff7fSkettenis   CORE_ADDR after_push = 0;
270b725ae77Skettenis   CORE_ADDR after_stack_adjust = 0;
271b725ae77Skettenis   CORE_ADDR current_pc;
272*11efff7fSkettenis   LONGEST return_value;
273b725ae77Skettenis 
274b725ae77Skettenis   framesize = 0;
275b725ae77Skettenis   after_prologue = 0;
276b725ae77Skettenis 
277b725ae77Skettenis   for (current_pc = start_pc; current_pc < scan_limit; current_pc += 2)
278b725ae77Skettenis     {
279*11efff7fSkettenis       /* Check if current pc's location is readable. */
280*11efff7fSkettenis       if (!safe_read_memory_integer (current_pc, 2, &return_value))
281*11efff7fSkettenis 	return -1;
282*11efff7fSkettenis 
283b725ae77Skettenis       insn = read_memory_unsigned_integer (current_pc, 2);
284b725ae77Skettenis 
285*11efff7fSkettenis       if (insn == 0x0000)
286*11efff7fSkettenis 	break;
287*11efff7fSkettenis 
288b725ae77Skettenis       /* If this is a 32 bit instruction, we dont want to examine its
289b725ae77Skettenis          immediate data as though it were an instruction */
290b725ae77Skettenis       if (current_pc & 0x02)
291b725ae77Skettenis 	{
292b725ae77Skettenis 	  /* decode this instruction further */
293b725ae77Skettenis 	  insn &= 0x7fff;
294b725ae77Skettenis 	}
295b725ae77Skettenis       else
296b725ae77Skettenis 	{
297b725ae77Skettenis 	  if (insn & 0x8000)
298b725ae77Skettenis 	    {
299b725ae77Skettenis 	      if (current_pc == scan_limit)
300b725ae77Skettenis 		scan_limit += 2;	/* extend the search */
301*11efff7fSkettenis 
302b725ae77Skettenis 	      current_pc += 2;	/* skip the immediate data */
303*11efff7fSkettenis 
304*11efff7fSkettenis 	      /* Check if current pc's location is readable. */
305*11efff7fSkettenis 	      if (!safe_read_memory_integer (current_pc, 2, &return_value))
306*11efff7fSkettenis 		return -1;
307*11efff7fSkettenis 
308b725ae77Skettenis 	      if (insn == 0x8faf)	/* add3 sp, sp, xxxx */
309b725ae77Skettenis 		/* add 16 bit sign-extended offset */
310b725ae77Skettenis 		{
311b725ae77Skettenis 		  framesize +=
312b725ae77Skettenis 		    -((short) read_memory_unsigned_integer (current_pc, 2));
313b725ae77Skettenis 		}
314b725ae77Skettenis 	      else
315b725ae77Skettenis 		{
316b725ae77Skettenis 		  if (((insn >> 8) == 0xe4)	/* ld24 r4, xxxxxx; sub sp, r4 */
317*11efff7fSkettenis 		      && safe_read_memory_integer (current_pc + 2, 2,
318*11efff7fSkettenis 						   &return_value)
319b725ae77Skettenis 		      && read_memory_unsigned_integer (current_pc + 2,
320b725ae77Skettenis 						       2) == 0x0f24)
321b725ae77Skettenis 		    /* subtract 24 bit sign-extended negative-offset */
322b725ae77Skettenis 		    {
323b725ae77Skettenis 		      insn = read_memory_unsigned_integer (current_pc - 2, 4);
324b725ae77Skettenis 		      if (insn & 0x00800000)	/* sign extend */
325b725ae77Skettenis 			insn |= 0xff000000;	/* negative */
326b725ae77Skettenis 		      else
327b725ae77Skettenis 			insn &= 0x00ffffff;	/* positive */
328b725ae77Skettenis 		      framesize += insn;
329b725ae77Skettenis 		    }
330b725ae77Skettenis 		}
331*11efff7fSkettenis 	      after_push = current_pc + 2;
332b725ae77Skettenis 	      continue;
333b725ae77Skettenis 	    }
334b725ae77Skettenis 	}
335b725ae77Skettenis       op1 = insn & 0xf000;	/* isolate just the first nibble */
336b725ae77Skettenis 
337b725ae77Skettenis       if ((insn & 0xf0ff) == 0x207f)
338b725ae77Skettenis 	{			/* st reg, @-sp */
339b725ae77Skettenis 	  int regno;
340b725ae77Skettenis 	  framesize += 4;
341b725ae77Skettenis 	  regno = ((insn >> 8) & 0xf);
342b725ae77Skettenis 	  after_prologue = 0;
343b725ae77Skettenis 	  continue;
344b725ae77Skettenis 	}
345b725ae77Skettenis       if ((insn >> 8) == 0x4f)	/* addi sp, xx */
346b725ae77Skettenis 	/* add 8 bit sign-extended offset */
347b725ae77Skettenis 	{
348b725ae77Skettenis 	  int stack_adjust = (char) (insn & 0xff);
349b725ae77Skettenis 
350b725ae77Skettenis 	  /* there are probably two of these stack adjustments:
351b725ae77Skettenis 	     1) A negative one in the prologue, and
352b725ae77Skettenis 	     2) A positive one in the epilogue.
353b725ae77Skettenis 	     We are only interested in the first one.  */
354b725ae77Skettenis 
355b725ae77Skettenis 	  if (stack_adjust < 0)
356b725ae77Skettenis 	    {
357b725ae77Skettenis 	      framesize -= stack_adjust;
358b725ae77Skettenis 	      after_prologue = 0;
359b725ae77Skettenis 	      /* A frameless function may have no "mv fp, sp".
360b725ae77Skettenis 	         In that case, this is the end of the prologue.  */
361b725ae77Skettenis 	      after_stack_adjust = current_pc + 2;
362b725ae77Skettenis 	    }
363b725ae77Skettenis 	  continue;
364b725ae77Skettenis 	}
365b725ae77Skettenis       if (insn == 0x1d8f)
366b725ae77Skettenis 	{			/* mv fp, sp */
367b725ae77Skettenis 	  after_prologue = current_pc + 2;
368b725ae77Skettenis 	  break;		/* end of stack adjustments */
369b725ae77Skettenis 	}
370*11efff7fSkettenis 
371b725ae77Skettenis       /* Nop looks like a branch, continue explicitly */
372b725ae77Skettenis       if (insn == 0x7000)
373b725ae77Skettenis 	{
374b725ae77Skettenis 	  after_prologue = current_pc + 2;
375b725ae77Skettenis 	  continue;		/* nop occurs between pushes */
376b725ae77Skettenis 	}
377*11efff7fSkettenis       /* End of prolog if any of these are trap instructions */
378*11efff7fSkettenis       if ((insn & 0xfff0) == 0x10f0)
379*11efff7fSkettenis 	{
380*11efff7fSkettenis 	  after_prologue = current_pc;
381*11efff7fSkettenis 	  break;
382*11efff7fSkettenis 	}
383b725ae77Skettenis       /* End of prolog if any of these are branch instructions */
384b725ae77Skettenis       if ((op1 == 0x7000) || (op1 == 0xb000) || (op1 == 0xf000))
385b725ae77Skettenis 	{
386b725ae77Skettenis 	  after_prologue = current_pc;
387b725ae77Skettenis 	  continue;
388b725ae77Skettenis 	}
389b725ae77Skettenis       /* Some of the branch instructions are mixed with other types */
390b725ae77Skettenis       if (op1 == 0x1000)
391b725ae77Skettenis 	{
392b725ae77Skettenis 	  int subop = insn & 0x0ff0;
393b725ae77Skettenis 	  if ((subop == 0x0ec0) || (subop == 0x0fc0))
394b725ae77Skettenis 	    {
395b725ae77Skettenis 	      after_prologue = current_pc;
396b725ae77Skettenis 	      continue;		/* jmp , jl */
397b725ae77Skettenis 	    }
398b725ae77Skettenis 	}
399b725ae77Skettenis     }
400b725ae77Skettenis 
401*11efff7fSkettenis   if (framelength)
402*11efff7fSkettenis     *framelength = framesize;
403*11efff7fSkettenis 
404b725ae77Skettenis   if (current_pc >= scan_limit)
405b725ae77Skettenis     {
406b725ae77Skettenis       if (pl_endptr)
407b725ae77Skettenis 	{
408b725ae77Skettenis 	  if (after_stack_adjust != 0)
409b725ae77Skettenis 	    /* We did not find a "mv fp,sp", but we DID find
410b725ae77Skettenis 	       a stack_adjust.  Is it safe to use that as the
411b725ae77Skettenis 	       end of the prologue?  I just don't know. */
412b725ae77Skettenis 	    {
413b725ae77Skettenis 	      *pl_endptr = after_stack_adjust;
414b725ae77Skettenis 	    }
415*11efff7fSkettenis 	  else if (after_push != 0)
416*11efff7fSkettenis 	    /* We did not find a "mv fp,sp", but we DID find
417*11efff7fSkettenis 	       a push.  Is it safe to use that as the
418*11efff7fSkettenis 	       end of the prologue?  I just don't know. */
419*11efff7fSkettenis 	    {
420*11efff7fSkettenis 	      *pl_endptr = after_push;
421*11efff7fSkettenis 	    }
422b725ae77Skettenis 	  else
423b725ae77Skettenis 	    /* We reached the end of the loop without finding the end
424b725ae77Skettenis 	       of the prologue.  No way to win -- we should report failure.
425b725ae77Skettenis 	       The way we do that is to return the original start_pc.
426b725ae77Skettenis 	       GDB will set a breakpoint at the start of the function (etc.) */
427b725ae77Skettenis 	    *pl_endptr = start_pc;
428b725ae77Skettenis 	}
429*11efff7fSkettenis       return 0;
430b725ae77Skettenis     }
431*11efff7fSkettenis 
432b725ae77Skettenis   if (after_prologue == 0)
433b725ae77Skettenis     after_prologue = current_pc;
434b725ae77Skettenis 
435b725ae77Skettenis   if (pl_endptr)
436b725ae77Skettenis     *pl_endptr = after_prologue;
437*11efff7fSkettenis 
438*11efff7fSkettenis   return 0;
439b725ae77Skettenis }				/*  decode_prologue */
440b725ae77Skettenis 
441b725ae77Skettenis /* Function: skip_prologue
442b725ae77Skettenis    Find end of function prologue */
443b725ae77Skettenis 
444*11efff7fSkettenis #define DEFAULT_SEARCH_LIMIT 128
445b725ae77Skettenis 
446b725ae77Skettenis CORE_ADDR
m32r_skip_prologue(CORE_ADDR pc)447b725ae77Skettenis m32r_skip_prologue (CORE_ADDR pc)
448b725ae77Skettenis {
449b725ae77Skettenis   CORE_ADDR func_addr, func_end;
450b725ae77Skettenis   struct symtab_and_line sal;
451*11efff7fSkettenis   LONGEST return_value;
452b725ae77Skettenis 
453b725ae77Skettenis   /* See what the symbol table says */
454b725ae77Skettenis 
455b725ae77Skettenis   if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
456b725ae77Skettenis     {
457b725ae77Skettenis       sal = find_pc_line (func_addr, 0);
458b725ae77Skettenis 
459b725ae77Skettenis       if (sal.line != 0 && sal.end <= func_end)
460b725ae77Skettenis 	{
461b725ae77Skettenis 	  func_end = sal.end;
462b725ae77Skettenis 	}
463b725ae77Skettenis       else
464b725ae77Skettenis 	/* Either there's no line info, or the line after the prologue is after
465b725ae77Skettenis 	   the end of the function.  In this case, there probably isn't a
466b725ae77Skettenis 	   prologue.  */
467b725ae77Skettenis 	{
468b725ae77Skettenis 	  func_end = min (func_end, func_addr + DEFAULT_SEARCH_LIMIT);
469b725ae77Skettenis 	}
470b725ae77Skettenis     }
471b725ae77Skettenis   else
472b725ae77Skettenis     func_end = pc + DEFAULT_SEARCH_LIMIT;
473*11efff7fSkettenis 
474*11efff7fSkettenis   /* If pc's location is not readable, just quit. */
475*11efff7fSkettenis   if (!safe_read_memory_integer (pc, 4, &return_value))
476*11efff7fSkettenis     return pc;
477*11efff7fSkettenis 
478*11efff7fSkettenis   /* Find the end of prologue.  */
479*11efff7fSkettenis   if (decode_prologue (pc, func_end, &sal.end, NULL) < 0)
480*11efff7fSkettenis     return pc;
481*11efff7fSkettenis 
482b725ae77Skettenis   return sal.end;
483b725ae77Skettenis }
484b725ae77Skettenis 
485b725ae77Skettenis struct m32r_unwind_cache
486b725ae77Skettenis {
487b725ae77Skettenis   /* The previous frame's inner most stack address.  Used as this
488b725ae77Skettenis      frame ID's stack_addr.  */
489b725ae77Skettenis   CORE_ADDR prev_sp;
490b725ae77Skettenis   /* The frame's base, optionally used by the high-level debug info.  */
491b725ae77Skettenis   CORE_ADDR base;
492b725ae77Skettenis   int size;
493b725ae77Skettenis   /* How far the SP and r13 (FP) have been offset from the start of
494b725ae77Skettenis      the stack frame (as defined by the previous frame's stack
495b725ae77Skettenis      pointer).  */
496b725ae77Skettenis   LONGEST sp_offset;
497b725ae77Skettenis   LONGEST r13_offset;
498b725ae77Skettenis   int uses_frame;
499b725ae77Skettenis   /* Table indicating the location of each and every register.  */
500b725ae77Skettenis   struct trad_frame_saved_reg *saved_regs;
501b725ae77Skettenis };
502b725ae77Skettenis 
503b725ae77Skettenis /* Put here the code to store, into fi->saved_regs, the addresses of
504b725ae77Skettenis    the saved registers of frame described by FRAME_INFO.  This
505b725ae77Skettenis    includes special registers such as pc and fp saved in special ways
506b725ae77Skettenis    in the stack frame.  sp is even more special: the address we return
507b725ae77Skettenis    for it IS the sp for the next frame. */
508b725ae77Skettenis 
509b725ae77Skettenis static struct m32r_unwind_cache *
m32r_frame_unwind_cache(struct frame_info * next_frame,void ** this_prologue_cache)510b725ae77Skettenis m32r_frame_unwind_cache (struct frame_info *next_frame,
511b725ae77Skettenis 			 void **this_prologue_cache)
512b725ae77Skettenis {
513*11efff7fSkettenis   CORE_ADDR pc, scan_limit;
514b725ae77Skettenis   ULONGEST prev_sp;
515b725ae77Skettenis   ULONGEST this_base;
516*11efff7fSkettenis   unsigned long op, op2;
517b725ae77Skettenis   int i;
518b725ae77Skettenis   struct m32r_unwind_cache *info;
519b725ae77Skettenis 
520*11efff7fSkettenis 
521b725ae77Skettenis   if ((*this_prologue_cache))
522b725ae77Skettenis     return (*this_prologue_cache);
523b725ae77Skettenis 
524b725ae77Skettenis   info = FRAME_OBSTACK_ZALLOC (struct m32r_unwind_cache);
525b725ae77Skettenis   (*this_prologue_cache) = info;
526b725ae77Skettenis   info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
527b725ae77Skettenis 
528b725ae77Skettenis   info->size = 0;
529b725ae77Skettenis   info->sp_offset = 0;
530b725ae77Skettenis   info->uses_frame = 0;
531*11efff7fSkettenis 
532*11efff7fSkettenis   scan_limit = frame_pc_unwind (next_frame);
533b725ae77Skettenis   for (pc = frame_func_unwind (next_frame);
534*11efff7fSkettenis        pc > 0 && pc < scan_limit; pc += 2)
535b725ae77Skettenis     {
536b725ae77Skettenis       if ((pc & 2) == 0)
537b725ae77Skettenis 	{
538b725ae77Skettenis 	  op = get_frame_memory_unsigned (next_frame, pc, 4);
539b725ae77Skettenis 	  if ((op & 0x80000000) == 0x80000000)
540b725ae77Skettenis 	    {
541b725ae77Skettenis 	      /* 32-bit instruction */
542b725ae77Skettenis 	      if ((op & 0xffff0000) == 0x8faf0000)
543b725ae77Skettenis 		{
544b725ae77Skettenis 		  /* add3 sp,sp,xxxx */
545b725ae77Skettenis 		  short n = op & 0xffff;
546b725ae77Skettenis 		  info->sp_offset += n;
547b725ae77Skettenis 		}
548*11efff7fSkettenis 	      else if (((op >> 8) == 0xe4)
549*11efff7fSkettenis 		       && get_frame_memory_unsigned (next_frame, pc + 2,
550b725ae77Skettenis 						     2) == 0x0f24)
551b725ae77Skettenis 		{
552*11efff7fSkettenis 		  /* ld24 r4, xxxxxx; sub sp, r4 */
553b725ae77Skettenis 		  unsigned long n = op & 0xffffff;
554b725ae77Skettenis 		  info->sp_offset += n;
555*11efff7fSkettenis 		  pc += 2;	/* skip sub instruction */
556b725ae77Skettenis 		}
557b725ae77Skettenis 
558*11efff7fSkettenis 	      if (pc == scan_limit)
559*11efff7fSkettenis 		scan_limit += 2;	/* extend the search */
560*11efff7fSkettenis 	      pc += 2;		/* skip the immediate data */
561b725ae77Skettenis 	      continue;
562b725ae77Skettenis 	    }
563b725ae77Skettenis 	}
564b725ae77Skettenis 
565b725ae77Skettenis       /* 16-bit instructions */
566b725ae77Skettenis       op = get_frame_memory_unsigned (next_frame, pc, 2) & 0x7fff;
567b725ae77Skettenis       if ((op & 0xf0ff) == 0x207f)
568b725ae77Skettenis 	{
569b725ae77Skettenis 	  /* st rn, @-sp */
570b725ae77Skettenis 	  int regno = ((op >> 8) & 0xf);
571b725ae77Skettenis 	  info->sp_offset -= 4;
572b725ae77Skettenis 	  info->saved_regs[regno].addr = info->sp_offset;
573b725ae77Skettenis 	}
574b725ae77Skettenis       else if ((op & 0xff00) == 0x4f00)
575b725ae77Skettenis 	{
576b725ae77Skettenis 	  /* addi sp, xx */
577b725ae77Skettenis 	  int n = (char) (op & 0xff);
578b725ae77Skettenis 	  info->sp_offset += n;
579b725ae77Skettenis 	}
580b725ae77Skettenis       else if (op == 0x1d8f)
581b725ae77Skettenis 	{
582b725ae77Skettenis 	  /* mv fp, sp */
583b725ae77Skettenis 	  info->uses_frame = 1;
584b725ae77Skettenis 	  info->r13_offset = info->sp_offset;
585*11efff7fSkettenis 	  break;		/* end of stack adjustments */
586b725ae77Skettenis 	}
587*11efff7fSkettenis       else if ((op & 0xfff0) == 0x10f0)
588*11efff7fSkettenis 	{
589*11efff7fSkettenis 	  /* end of prologue if this is a trap instruction */
590*11efff7fSkettenis 	  break;		/* end of stack adjustments */
591*11efff7fSkettenis 	}
592b725ae77Skettenis     }
593b725ae77Skettenis 
594b725ae77Skettenis   info->size = -info->sp_offset;
595b725ae77Skettenis 
596b725ae77Skettenis   /* Compute the previous frame's stack pointer (which is also the
597b725ae77Skettenis      frame's ID's stack address), and this frame's base pointer.  */
598b725ae77Skettenis   if (info->uses_frame)
599b725ae77Skettenis     {
600b725ae77Skettenis       /* The SP was moved to the FP.  This indicates that a new frame
601b725ae77Skettenis          was created.  Get THIS frame's FP value by unwinding it from
602b725ae77Skettenis          the next frame.  */
603b725ae77Skettenis       this_base = frame_unwind_register_unsigned (next_frame, M32R_FP_REGNUM);
604b725ae77Skettenis       /* The FP points at the last saved register.  Adjust the FP back
605b725ae77Skettenis          to before the first saved register giving the SP.  */
606b725ae77Skettenis       prev_sp = this_base + info->size;
607b725ae77Skettenis     }
608b725ae77Skettenis   else
609b725ae77Skettenis     {
610b725ae77Skettenis       /* Assume that the FP is this frame's SP but with that pushed
611b725ae77Skettenis          stack space added back.  */
612b725ae77Skettenis       this_base = frame_unwind_register_unsigned (next_frame, M32R_SP_REGNUM);
613b725ae77Skettenis       prev_sp = this_base + info->size;
614b725ae77Skettenis     }
615b725ae77Skettenis 
616b725ae77Skettenis   /* Convert that SP/BASE into real addresses.  */
617b725ae77Skettenis   info->prev_sp = prev_sp;
618b725ae77Skettenis   info->base = this_base;
619b725ae77Skettenis 
620b725ae77Skettenis   /* Adjust all the saved registers so that they contain addresses and
621b725ae77Skettenis      not offsets.  */
622b725ae77Skettenis   for (i = 0; i < NUM_REGS - 1; i++)
623b725ae77Skettenis     if (trad_frame_addr_p (info->saved_regs, i))
624b725ae77Skettenis       info->saved_regs[i].addr = (info->prev_sp + info->saved_regs[i].addr);
625b725ae77Skettenis 
626b725ae77Skettenis   /* The call instruction moves the caller's PC in the callee's LR.
627b725ae77Skettenis      Since this is an unwind, do the reverse.  Copy the location of LR
628b725ae77Skettenis      into PC (the address / regnum) so that a request for PC will be
629b725ae77Skettenis      converted into a request for the LR.  */
630b725ae77Skettenis   info->saved_regs[M32R_PC_REGNUM] = info->saved_regs[LR_REGNUM];
631b725ae77Skettenis 
632b725ae77Skettenis   /* The previous frame's SP needed to be computed.  Save the computed
633b725ae77Skettenis      value.  */
634b725ae77Skettenis   trad_frame_set_value (info->saved_regs, M32R_SP_REGNUM, prev_sp);
635b725ae77Skettenis 
636b725ae77Skettenis   return info;
637b725ae77Skettenis }
638b725ae77Skettenis 
639b725ae77Skettenis static CORE_ADDR
m32r_read_pc(ptid_t ptid)640b725ae77Skettenis m32r_read_pc (ptid_t ptid)
641b725ae77Skettenis {
642b725ae77Skettenis   ptid_t save_ptid;
643b725ae77Skettenis   ULONGEST pc;
644b725ae77Skettenis 
645b725ae77Skettenis   save_ptid = inferior_ptid;
646b725ae77Skettenis   inferior_ptid = ptid;
647b725ae77Skettenis   regcache_cooked_read_unsigned (current_regcache, M32R_PC_REGNUM, &pc);
648b725ae77Skettenis   inferior_ptid = save_ptid;
649b725ae77Skettenis   return pc;
650b725ae77Skettenis }
651b725ae77Skettenis 
652b725ae77Skettenis static void
m32r_write_pc(CORE_ADDR val,ptid_t ptid)653b725ae77Skettenis m32r_write_pc (CORE_ADDR val, ptid_t ptid)
654b725ae77Skettenis {
655b725ae77Skettenis   ptid_t save_ptid;
656b725ae77Skettenis 
657b725ae77Skettenis   save_ptid = inferior_ptid;
658b725ae77Skettenis   inferior_ptid = ptid;
659b725ae77Skettenis   write_register (M32R_PC_REGNUM, val);
660b725ae77Skettenis   inferior_ptid = save_ptid;
661b725ae77Skettenis }
662b725ae77Skettenis 
663b725ae77Skettenis static CORE_ADDR
m32r_unwind_sp(struct gdbarch * gdbarch,struct frame_info * next_frame)664b725ae77Skettenis m32r_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
665b725ae77Skettenis {
666b725ae77Skettenis   return frame_unwind_register_unsigned (next_frame, M32R_SP_REGNUM);
667b725ae77Skettenis }
668b725ae77Skettenis 
669b725ae77Skettenis 
670b725ae77Skettenis static CORE_ADDR
m32r_push_dummy_call(struct gdbarch * gdbarch,struct value * function,struct regcache * regcache,CORE_ADDR bp_addr,int nargs,struct value ** args,CORE_ADDR sp,int struct_return,CORE_ADDR struct_addr)671*11efff7fSkettenis m32r_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
672b725ae77Skettenis 		      struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
673b725ae77Skettenis 		      struct value **args, CORE_ADDR sp, int struct_return,
674b725ae77Skettenis 		      CORE_ADDR struct_addr)
675b725ae77Skettenis {
676b725ae77Skettenis   int stack_offset, stack_alloc;
677b725ae77Skettenis   int argreg = ARG1_REGNUM;
678b725ae77Skettenis   int argnum;
679b725ae77Skettenis   struct type *type;
680b725ae77Skettenis   enum type_code typecode;
681b725ae77Skettenis   CORE_ADDR regval;
682b725ae77Skettenis   char *val;
683b725ae77Skettenis   char valbuf[MAX_REGISTER_SIZE];
684b725ae77Skettenis   int len;
685b725ae77Skettenis   int odd_sized_struct;
686b725ae77Skettenis 
687b725ae77Skettenis   /* first force sp to a 4-byte alignment */
688b725ae77Skettenis   sp = sp & ~3;
689b725ae77Skettenis 
690b725ae77Skettenis   /* Set the return address.  For the m32r, the return breakpoint is
691b725ae77Skettenis      always at BP_ADDR.  */
692b725ae77Skettenis   regcache_cooked_write_unsigned (regcache, LR_REGNUM, bp_addr);
693b725ae77Skettenis 
694b725ae77Skettenis   /* If STRUCT_RETURN is true, then the struct return address (in
695b725ae77Skettenis      STRUCT_ADDR) will consume the first argument-passing register.
696b725ae77Skettenis      Both adjust the register count and store that value.  */
697b725ae77Skettenis   if (struct_return)
698b725ae77Skettenis     {
699b725ae77Skettenis       regcache_cooked_write_unsigned (regcache, argreg, struct_addr);
700b725ae77Skettenis       argreg++;
701b725ae77Skettenis     }
702b725ae77Skettenis 
703b725ae77Skettenis   /* Now make sure there's space on the stack */
704b725ae77Skettenis   for (argnum = 0, stack_alloc = 0; argnum < nargs; argnum++)
705b725ae77Skettenis     stack_alloc += ((TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 3) & ~3);
706b725ae77Skettenis   sp -= stack_alloc;		/* make room on stack for args */
707b725ae77Skettenis 
708b725ae77Skettenis   for (argnum = 0, stack_offset = 0; argnum < nargs; argnum++)
709b725ae77Skettenis     {
710b725ae77Skettenis       type = VALUE_TYPE (args[argnum]);
711b725ae77Skettenis       typecode = TYPE_CODE (type);
712b725ae77Skettenis       len = TYPE_LENGTH (type);
713b725ae77Skettenis 
714b725ae77Skettenis       memset (valbuf, 0, sizeof (valbuf));
715b725ae77Skettenis 
716b725ae77Skettenis       /* Passes structures that do not fit in 2 registers by reference.  */
717b725ae77Skettenis       if (len > 8
718b725ae77Skettenis 	  && (typecode == TYPE_CODE_STRUCT || typecode == TYPE_CODE_UNION))
719b725ae77Skettenis 	{
720b725ae77Skettenis 	  store_unsigned_integer (valbuf, 4, VALUE_ADDRESS (args[argnum]));
721b725ae77Skettenis 	  typecode = TYPE_CODE_PTR;
722b725ae77Skettenis 	  len = 4;
723b725ae77Skettenis 	  val = valbuf;
724b725ae77Skettenis 	}
725b725ae77Skettenis       else if (len < 4)
726b725ae77Skettenis 	{
727b725ae77Skettenis 	  /* value gets right-justified in the register or stack word */
728b725ae77Skettenis 	  memcpy (valbuf + (register_size (gdbarch, argreg) - len),
729b725ae77Skettenis 		  (char *) VALUE_CONTENTS (args[argnum]), len);
730b725ae77Skettenis 	  val = valbuf;
731b725ae77Skettenis 	}
732b725ae77Skettenis       else
733b725ae77Skettenis 	val = (char *) VALUE_CONTENTS (args[argnum]);
734b725ae77Skettenis 
735b725ae77Skettenis       while (len > 0)
736b725ae77Skettenis 	{
737b725ae77Skettenis 	  if (argreg > ARGN_REGNUM)
738b725ae77Skettenis 	    {
739b725ae77Skettenis 	      /* must go on the stack */
740b725ae77Skettenis 	      write_memory (sp + stack_offset, val, 4);
741b725ae77Skettenis 	      stack_offset += 4;
742b725ae77Skettenis 	    }
743b725ae77Skettenis 	  else if (argreg <= ARGN_REGNUM)
744b725ae77Skettenis 	    {
745b725ae77Skettenis 	      /* there's room in a register */
746b725ae77Skettenis 	      regval =
747b725ae77Skettenis 		extract_unsigned_integer (val,
748b725ae77Skettenis 					  register_size (gdbarch, argreg));
749b725ae77Skettenis 	      regcache_cooked_write_unsigned (regcache, argreg++, regval);
750b725ae77Skettenis 	    }
751b725ae77Skettenis 
752b725ae77Skettenis 	  /* Store the value 4 bytes at a time.  This means that things
753b725ae77Skettenis 	     larger than 4 bytes may go partly in registers and partly
754b725ae77Skettenis 	     on the stack.  */
755b725ae77Skettenis 	  len -= register_size (gdbarch, argreg);
756b725ae77Skettenis 	  val += register_size (gdbarch, argreg);
757b725ae77Skettenis 	}
758b725ae77Skettenis     }
759b725ae77Skettenis 
760b725ae77Skettenis   /* Finally, update the SP register.  */
761b725ae77Skettenis   regcache_cooked_write_unsigned (regcache, M32R_SP_REGNUM, sp);
762b725ae77Skettenis 
763b725ae77Skettenis   return sp;
764b725ae77Skettenis }
765b725ae77Skettenis 
766b725ae77Skettenis 
767b725ae77Skettenis /* Given a return value in `regbuf' with a type `valtype',
768b725ae77Skettenis    extract and copy its value into `valbuf'.  */
769b725ae77Skettenis 
770b725ae77Skettenis static void
m32r_extract_return_value(struct type * type,struct regcache * regcache,void * dst)771b725ae77Skettenis m32r_extract_return_value (struct type *type, struct regcache *regcache,
772b725ae77Skettenis 			   void *dst)
773b725ae77Skettenis {
774b725ae77Skettenis   bfd_byte *valbuf = dst;
775b725ae77Skettenis   int len = TYPE_LENGTH (type);
776b725ae77Skettenis   ULONGEST tmp;
777b725ae77Skettenis 
778b725ae77Skettenis   /* By using store_unsigned_integer we avoid having to do
779b725ae77Skettenis      anything special for small big-endian values.  */
780b725ae77Skettenis   regcache_cooked_read_unsigned (regcache, RET1_REGNUM, &tmp);
781b725ae77Skettenis   store_unsigned_integer (valbuf, (len > 4 ? len - 4 : len), tmp);
782b725ae77Skettenis 
783b725ae77Skettenis   /* Ignore return values more than 8 bytes in size because the m32r
784b725ae77Skettenis      returns anything more than 8 bytes in the stack. */
785b725ae77Skettenis   if (len > 4)
786b725ae77Skettenis     {
787b725ae77Skettenis       regcache_cooked_read_unsigned (regcache, RET1_REGNUM + 1, &tmp);
788b725ae77Skettenis       store_unsigned_integer (valbuf + len - 4, 4, tmp);
789b725ae77Skettenis     }
790b725ae77Skettenis }
791b725ae77Skettenis 
792*11efff7fSkettenis enum return_value_convention
m32r_return_value(struct gdbarch * gdbarch,struct type * valtype,struct regcache * regcache,void * readbuf,const void * writebuf)793*11efff7fSkettenis m32r_return_value (struct gdbarch *gdbarch, struct type *valtype,
794*11efff7fSkettenis 		   struct regcache *regcache, void *readbuf,
795*11efff7fSkettenis 		   const void *writebuf)
796*11efff7fSkettenis {
797*11efff7fSkettenis   if (TYPE_LENGTH (valtype) > 8)
798*11efff7fSkettenis     return RETURN_VALUE_STRUCT_CONVENTION;
799*11efff7fSkettenis   else
800*11efff7fSkettenis     {
801*11efff7fSkettenis       if (readbuf != NULL)
802*11efff7fSkettenis 	m32r_extract_return_value (valtype, regcache, readbuf);
803*11efff7fSkettenis       if (writebuf != NULL)
804*11efff7fSkettenis 	m32r_store_return_value (valtype, regcache, writebuf);
805*11efff7fSkettenis       return RETURN_VALUE_REGISTER_CONVENTION;
806*11efff7fSkettenis     }
807*11efff7fSkettenis }
808*11efff7fSkettenis 
809*11efff7fSkettenis 
810b725ae77Skettenis 
811b725ae77Skettenis static CORE_ADDR
m32r_unwind_pc(struct gdbarch * gdbarch,struct frame_info * next_frame)812b725ae77Skettenis m32r_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
813b725ae77Skettenis {
814b725ae77Skettenis   return frame_unwind_register_unsigned (next_frame, M32R_PC_REGNUM);
815b725ae77Skettenis }
816b725ae77Skettenis 
817b725ae77Skettenis /* Given a GDB frame, determine the address of the calling function's
818b725ae77Skettenis    frame.  This will be used to create a new GDB frame struct.  */
819b725ae77Skettenis 
820b725ae77Skettenis static void
m32r_frame_this_id(struct frame_info * next_frame,void ** this_prologue_cache,struct frame_id * this_id)821b725ae77Skettenis m32r_frame_this_id (struct frame_info *next_frame,
822b725ae77Skettenis 		    void **this_prologue_cache, struct frame_id *this_id)
823b725ae77Skettenis {
824b725ae77Skettenis   struct m32r_unwind_cache *info
825b725ae77Skettenis     = m32r_frame_unwind_cache (next_frame, this_prologue_cache);
826b725ae77Skettenis   CORE_ADDR base;
827b725ae77Skettenis   CORE_ADDR func;
828b725ae77Skettenis   struct minimal_symbol *msym_stack;
829b725ae77Skettenis   struct frame_id id;
830b725ae77Skettenis 
831b725ae77Skettenis   /* The FUNC is easy.  */
832b725ae77Skettenis   func = frame_func_unwind (next_frame);
833b725ae77Skettenis 
834b725ae77Skettenis   /* Check if the stack is empty.  */
835b725ae77Skettenis   msym_stack = lookup_minimal_symbol ("_stack", NULL, NULL);
836b725ae77Skettenis   if (msym_stack && info->base == SYMBOL_VALUE_ADDRESS (msym_stack))
837b725ae77Skettenis     return;
838b725ae77Skettenis 
839b725ae77Skettenis   /* Hopefully the prologue analysis either correctly determined the
840b725ae77Skettenis      frame's base (which is the SP from the previous frame), or set
841b725ae77Skettenis      that base to "NULL".  */
842b725ae77Skettenis   base = info->prev_sp;
843b725ae77Skettenis   if (base == 0)
844b725ae77Skettenis     return;
845b725ae77Skettenis 
846b725ae77Skettenis   id = frame_id_build (base, func);
847b725ae77Skettenis   (*this_id) = id;
848b725ae77Skettenis }
849b725ae77Skettenis 
850b725ae77Skettenis static void
m32r_frame_prev_register(struct frame_info * next_frame,void ** this_prologue_cache,int regnum,int * optimizedp,enum lval_type * lvalp,CORE_ADDR * addrp,int * realnump,void * bufferp)851b725ae77Skettenis m32r_frame_prev_register (struct frame_info *next_frame,
852b725ae77Skettenis 			  void **this_prologue_cache,
853b725ae77Skettenis 			  int regnum, int *optimizedp,
854b725ae77Skettenis 			  enum lval_type *lvalp, CORE_ADDR *addrp,
855b725ae77Skettenis 			  int *realnump, void *bufferp)
856b725ae77Skettenis {
857b725ae77Skettenis   struct m32r_unwind_cache *info
858b725ae77Skettenis     = m32r_frame_unwind_cache (next_frame, this_prologue_cache);
859*11efff7fSkettenis   trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
860b725ae77Skettenis 				optimizedp, lvalp, addrp, realnump, bufferp);
861b725ae77Skettenis }
862b725ae77Skettenis 
863b725ae77Skettenis static const struct frame_unwind m32r_frame_unwind = {
864b725ae77Skettenis   NORMAL_FRAME,
865b725ae77Skettenis   m32r_frame_this_id,
866b725ae77Skettenis   m32r_frame_prev_register
867b725ae77Skettenis };
868b725ae77Skettenis 
869b725ae77Skettenis static const struct frame_unwind *
m32r_frame_sniffer(struct frame_info * next_frame)870b725ae77Skettenis m32r_frame_sniffer (struct frame_info *next_frame)
871b725ae77Skettenis {
872b725ae77Skettenis   return &m32r_frame_unwind;
873b725ae77Skettenis }
874b725ae77Skettenis 
875b725ae77Skettenis static CORE_ADDR
m32r_frame_base_address(struct frame_info * next_frame,void ** this_cache)876b725ae77Skettenis m32r_frame_base_address (struct frame_info *next_frame, void **this_cache)
877b725ae77Skettenis {
878b725ae77Skettenis   struct m32r_unwind_cache *info
879b725ae77Skettenis     = m32r_frame_unwind_cache (next_frame, this_cache);
880b725ae77Skettenis   return info->base;
881b725ae77Skettenis }
882b725ae77Skettenis 
883b725ae77Skettenis static const struct frame_base m32r_frame_base = {
884b725ae77Skettenis   &m32r_frame_unwind,
885b725ae77Skettenis   m32r_frame_base_address,
886b725ae77Skettenis   m32r_frame_base_address,
887b725ae77Skettenis   m32r_frame_base_address
888b725ae77Skettenis };
889b725ae77Skettenis 
890b725ae77Skettenis /* Assuming NEXT_FRAME->prev is a dummy, return the frame ID of that
891b725ae77Skettenis    dummy frame.  The frame ID's base needs to match the TOS value
892b725ae77Skettenis    saved by save_dummy_frame_tos(), and the PC match the dummy frame's
893b725ae77Skettenis    breakpoint.  */
894b725ae77Skettenis 
895b725ae77Skettenis static struct frame_id
m32r_unwind_dummy_id(struct gdbarch * gdbarch,struct frame_info * next_frame)896b725ae77Skettenis m32r_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
897b725ae77Skettenis {
898b725ae77Skettenis   return frame_id_build (m32r_unwind_sp (gdbarch, next_frame),
899b725ae77Skettenis 			 frame_pc_unwind (next_frame));
900b725ae77Skettenis }
901b725ae77Skettenis 
902b725ae77Skettenis 
903b725ae77Skettenis static gdbarch_init_ftype m32r_gdbarch_init;
904b725ae77Skettenis 
905b725ae77Skettenis static struct gdbarch *
m32r_gdbarch_init(struct gdbarch_info info,struct gdbarch_list * arches)906b725ae77Skettenis m32r_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
907b725ae77Skettenis {
908b725ae77Skettenis   struct gdbarch *gdbarch;
909b725ae77Skettenis   struct gdbarch_tdep *tdep;
910b725ae77Skettenis 
911b725ae77Skettenis   /* If there is already a candidate, use it.  */
912b725ae77Skettenis   arches = gdbarch_list_lookup_by_info (arches, &info);
913b725ae77Skettenis   if (arches != NULL)
914b725ae77Skettenis     return arches->gdbarch;
915b725ae77Skettenis 
916b725ae77Skettenis   /* Allocate space for the new architecture.  */
917b725ae77Skettenis   tdep = XMALLOC (struct gdbarch_tdep);
918b725ae77Skettenis   gdbarch = gdbarch_alloc (&info, tdep);
919b725ae77Skettenis 
920b725ae77Skettenis   set_gdbarch_read_pc (gdbarch, m32r_read_pc);
921b725ae77Skettenis   set_gdbarch_write_pc (gdbarch, m32r_write_pc);
922b725ae77Skettenis   set_gdbarch_unwind_sp (gdbarch, m32r_unwind_sp);
923b725ae77Skettenis 
924*11efff7fSkettenis   set_gdbarch_num_regs (gdbarch, M32R_NUM_REGS);
925b725ae77Skettenis   set_gdbarch_sp_regnum (gdbarch, M32R_SP_REGNUM);
926b725ae77Skettenis   set_gdbarch_register_name (gdbarch, m32r_register_name);
927b725ae77Skettenis   set_gdbarch_register_type (gdbarch, m32r_register_type);
928b725ae77Skettenis 
929b725ae77Skettenis   set_gdbarch_push_dummy_call (gdbarch, m32r_push_dummy_call);
930*11efff7fSkettenis   set_gdbarch_return_value (gdbarch, m32r_return_value);
931b725ae77Skettenis 
932b725ae77Skettenis   set_gdbarch_skip_prologue (gdbarch, m32r_skip_prologue);
933b725ae77Skettenis   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
934b725ae77Skettenis   set_gdbarch_breakpoint_from_pc (gdbarch, m32r_breakpoint_from_pc);
935b725ae77Skettenis   set_gdbarch_memory_insert_breakpoint (gdbarch,
936b725ae77Skettenis 					m32r_memory_insert_breakpoint);
937b725ae77Skettenis   set_gdbarch_memory_remove_breakpoint (gdbarch,
938b725ae77Skettenis 					m32r_memory_remove_breakpoint);
939b725ae77Skettenis 
940b725ae77Skettenis   set_gdbarch_frame_align (gdbarch, m32r_frame_align);
941b725ae77Skettenis 
942b725ae77Skettenis   frame_base_set_default (gdbarch, &m32r_frame_base);
943b725ae77Skettenis 
944b725ae77Skettenis   /* Methods for saving / extracting a dummy frame's ID.  The ID's
945b725ae77Skettenis      stack address must match the SP value returned by
946b725ae77Skettenis      PUSH_DUMMY_CALL, and saved by generic_save_dummy_frame_tos.  */
947b725ae77Skettenis   set_gdbarch_unwind_dummy_id (gdbarch, m32r_unwind_dummy_id);
948b725ae77Skettenis 
949b725ae77Skettenis   /* Return the unwound PC value.  */
950b725ae77Skettenis   set_gdbarch_unwind_pc (gdbarch, m32r_unwind_pc);
951b725ae77Skettenis 
952b725ae77Skettenis   set_gdbarch_print_insn (gdbarch, print_insn_m32r);
953b725ae77Skettenis 
954*11efff7fSkettenis   /* Hook in ABI-specific overrides, if they have been registered.  */
955*11efff7fSkettenis   gdbarch_init_osabi (info, gdbarch);
956*11efff7fSkettenis 
957*11efff7fSkettenis   /* Hook in the default unwinders.  */
958*11efff7fSkettenis   frame_unwind_append_sniffer (gdbarch, m32r_frame_sniffer);
959*11efff7fSkettenis 
960b725ae77Skettenis   return gdbarch;
961b725ae77Skettenis }
962b725ae77Skettenis 
963b725ae77Skettenis void
_initialize_m32r_tdep(void)964b725ae77Skettenis _initialize_m32r_tdep (void)
965b725ae77Skettenis {
966b725ae77Skettenis   register_gdbarch_init (bfd_arch_m32r, m32r_gdbarch_init);
967b725ae77Skettenis }
968