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