1b725ae77Skettenis /* Target-dependent code for the Matsushita MN10300 for GDB, the GNU debugger.
2b725ae77Skettenis
3b725ae77Skettenis Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free
4b725ae77Skettenis Software 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 "inferior.h"
26b725ae77Skettenis #include "target.h"
27b725ae77Skettenis #include "value.h"
28b725ae77Skettenis #include "bfd.h"
29b725ae77Skettenis #include "gdb_string.h"
30b725ae77Skettenis #include "gdbcore.h"
31b725ae77Skettenis #include "objfiles.h"
32b725ae77Skettenis #include "regcache.h"
33b725ae77Skettenis #include "arch-utils.h"
34b725ae77Skettenis #include "gdb_assert.h"
35b725ae77Skettenis #include "dis-asm.h"
36b725ae77Skettenis
37b725ae77Skettenis #define D0_REGNUM 0
38b725ae77Skettenis #define D2_REGNUM 2
39b725ae77Skettenis #define D3_REGNUM 3
40b725ae77Skettenis #define A0_REGNUM 4
41b725ae77Skettenis #define A2_REGNUM 6
42b725ae77Skettenis #define A3_REGNUM 7
43b725ae77Skettenis #define MDR_REGNUM 10
44b725ae77Skettenis #define PSW_REGNUM 11
45b725ae77Skettenis #define LIR_REGNUM 12
46b725ae77Skettenis #define LAR_REGNUM 13
47b725ae77Skettenis #define MDRQ_REGNUM 14
48b725ae77Skettenis #define E0_REGNUM 15
49b725ae77Skettenis #define MCRH_REGNUM 26
50b725ae77Skettenis #define MCRL_REGNUM 27
51b725ae77Skettenis #define MCVF_REGNUM 28
52b725ae77Skettenis
53b725ae77Skettenis enum movm_register_bits {
54b725ae77Skettenis movm_exother_bit = 0x01,
55b725ae77Skettenis movm_exreg1_bit = 0x02,
56b725ae77Skettenis movm_exreg0_bit = 0x04,
57b725ae77Skettenis movm_other_bit = 0x08,
58b725ae77Skettenis movm_a3_bit = 0x10,
59b725ae77Skettenis movm_a2_bit = 0x20,
60b725ae77Skettenis movm_d3_bit = 0x40,
61b725ae77Skettenis movm_d2_bit = 0x80
62b725ae77Skettenis };
63b725ae77Skettenis
64b725ae77Skettenis extern void _initialize_mn10300_tdep (void);
65b725ae77Skettenis static CORE_ADDR mn10300_analyze_prologue (struct frame_info *fi,
66b725ae77Skettenis CORE_ADDR pc);
67b725ae77Skettenis
68b725ae77Skettenis /* mn10300 private data */
69b725ae77Skettenis struct gdbarch_tdep
70b725ae77Skettenis {
71b725ae77Skettenis int am33_mode;
72b725ae77Skettenis #define AM33_MODE (gdbarch_tdep (current_gdbarch)->am33_mode)
73b725ae77Skettenis };
74b725ae77Skettenis
75b725ae77Skettenis /* Additional info used by the frame */
76b725ae77Skettenis
77b725ae77Skettenis struct frame_extra_info
78b725ae77Skettenis {
79b725ae77Skettenis int status;
80b725ae77Skettenis int stack_size;
81b725ae77Skettenis };
82b725ae77Skettenis
83b725ae77Skettenis
84b725ae77Skettenis static char *
register_name(int reg,char ** regs,long sizeof_regs)85b725ae77Skettenis register_name (int reg, char **regs, long sizeof_regs)
86b725ae77Skettenis {
87b725ae77Skettenis if (reg < 0 || reg >= sizeof_regs / sizeof (regs[0]))
88b725ae77Skettenis return NULL;
89b725ae77Skettenis else
90b725ae77Skettenis return regs[reg];
91b725ae77Skettenis }
92b725ae77Skettenis
93b725ae77Skettenis static const char *
mn10300_generic_register_name(int reg)94b725ae77Skettenis mn10300_generic_register_name (int reg)
95b725ae77Skettenis {
96b725ae77Skettenis static char *regs[] =
97b725ae77Skettenis { "d0", "d1", "d2", "d3", "a0", "a1", "a2", "a3",
98b725ae77Skettenis "sp", "pc", "mdr", "psw", "lir", "lar", "", "",
99b725ae77Skettenis "", "", "", "", "", "", "", "",
100b725ae77Skettenis "", "", "", "", "", "", "", "fp"
101b725ae77Skettenis };
102b725ae77Skettenis return register_name (reg, regs, sizeof regs);
103b725ae77Skettenis }
104b725ae77Skettenis
105b725ae77Skettenis
106b725ae77Skettenis static const char *
am33_register_name(int reg)107b725ae77Skettenis am33_register_name (int reg)
108b725ae77Skettenis {
109b725ae77Skettenis static char *regs[] =
110b725ae77Skettenis { "d0", "d1", "d2", "d3", "a0", "a1", "a2", "a3",
111b725ae77Skettenis "sp", "pc", "mdr", "psw", "lir", "lar", "",
112b725ae77Skettenis "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
113b725ae77Skettenis "ssp", "msp", "usp", "mcrh", "mcrl", "mcvf", "", "", ""
114b725ae77Skettenis };
115b725ae77Skettenis return register_name (reg, regs, sizeof regs);
116b725ae77Skettenis }
117b725ae77Skettenis
118b725ae77Skettenis static CORE_ADDR
mn10300_saved_pc_after_call(struct frame_info * fi)119b725ae77Skettenis mn10300_saved_pc_after_call (struct frame_info *fi)
120b725ae77Skettenis {
121b725ae77Skettenis return read_memory_integer (read_register (SP_REGNUM), 4);
122b725ae77Skettenis }
123b725ae77Skettenis
124b725ae77Skettenis static void
mn10300_extract_return_value(struct gdbarch * gdbarch,struct type * type,struct regcache * regcache,void * valbuf)125*11efff7fSkettenis mn10300_extract_return_value (struct gdbarch *gdbarch, struct type *type,
126*11efff7fSkettenis struct regcache *regcache, void *valbuf)
127b725ae77Skettenis {
128*11efff7fSkettenis char buf[MAX_REGISTER_SIZE];
129*11efff7fSkettenis int len = TYPE_LENGTH (type);
130*11efff7fSkettenis int reg, regsz;
131*11efff7fSkettenis
132b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_PTR)
133*11efff7fSkettenis reg = 4;
134b725ae77Skettenis else
135*11efff7fSkettenis reg = 0;
136*11efff7fSkettenis
137*11efff7fSkettenis regsz = register_size (gdbarch, reg);
138*11efff7fSkettenis if (len <= regsz)
139*11efff7fSkettenis {
140*11efff7fSkettenis regcache_raw_read (regcache, reg, buf);
141*11efff7fSkettenis memcpy (valbuf, buf, len);
142*11efff7fSkettenis }
143*11efff7fSkettenis else if (len <= 2 * regsz)
144*11efff7fSkettenis {
145*11efff7fSkettenis regcache_raw_read (regcache, reg, buf);
146*11efff7fSkettenis memcpy (valbuf, buf, regsz);
147*11efff7fSkettenis gdb_assert (regsz == register_size (gdbarch, reg + 1));
148*11efff7fSkettenis regcache_raw_read (regcache, reg + 1, buf);
149*11efff7fSkettenis memcpy ((char *) valbuf + regsz, buf, len - regsz);
150*11efff7fSkettenis }
151*11efff7fSkettenis else
152*11efff7fSkettenis internal_error (__FILE__, __LINE__,
153*11efff7fSkettenis "Cannot extract return value %d bytes long.", len);
154b725ae77Skettenis }
155b725ae77Skettenis
156b725ae77Skettenis static void
mn10300_store_return_value(struct gdbarch * gdbarch,struct type * type,struct regcache * regcache,const void * valbuf)157*11efff7fSkettenis mn10300_store_return_value (struct gdbarch *gdbarch, struct type *type,
158*11efff7fSkettenis struct regcache *regcache, const void *valbuf)
159b725ae77Skettenis {
160*11efff7fSkettenis int len = TYPE_LENGTH (type);
161*11efff7fSkettenis int reg, regsz;
162*11efff7fSkettenis
163b725ae77Skettenis if (TYPE_CODE (type) == TYPE_CODE_PTR)
164*11efff7fSkettenis reg = 4;
165b725ae77Skettenis else
166*11efff7fSkettenis reg = 0;
167*11efff7fSkettenis
168*11efff7fSkettenis regsz = register_size (gdbarch, reg);
169*11efff7fSkettenis
170*11efff7fSkettenis if (len <= regsz)
171*11efff7fSkettenis regcache_raw_write_part (regcache, reg, 0, len, valbuf);
172*11efff7fSkettenis else if (len <= 2 * regsz)
173*11efff7fSkettenis {
174*11efff7fSkettenis regcache_raw_write (regcache, reg, valbuf);
175*11efff7fSkettenis gdb_assert (regsz == register_size (gdbarch, reg + 1));
176*11efff7fSkettenis regcache_raw_write_part (regcache, reg+1, 0,
177*11efff7fSkettenis len - regsz, (char *) valbuf + regsz);
178*11efff7fSkettenis }
179*11efff7fSkettenis else
180*11efff7fSkettenis internal_error (__FILE__, __LINE__,
181*11efff7fSkettenis "Cannot store return value %d bytes long.", len);
182b725ae77Skettenis }
183b725ae77Skettenis
184b725ae77Skettenis static struct frame_info *analyze_dummy_frame (CORE_ADDR, CORE_ADDR);
185b725ae77Skettenis static struct frame_info *
analyze_dummy_frame(CORE_ADDR pc,CORE_ADDR frame)186b725ae77Skettenis analyze_dummy_frame (CORE_ADDR pc, CORE_ADDR frame)
187b725ae77Skettenis {
188b725ae77Skettenis struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
189b725ae77Skettenis struct frame_info *dummy
190b725ae77Skettenis = deprecated_frame_xmalloc_with_cleanup (SIZEOF_FRAME_SAVED_REGS,
191b725ae77Skettenis sizeof (struct frame_extra_info));
192b725ae77Skettenis deprecated_update_frame_pc_hack (dummy, pc);
193b725ae77Skettenis deprecated_update_frame_base_hack (dummy, frame);
194b725ae77Skettenis get_frame_extra_info (dummy)->status = 0;
195b725ae77Skettenis get_frame_extra_info (dummy)->stack_size = 0;
196b725ae77Skettenis mn10300_analyze_prologue (dummy, pc);
197b725ae77Skettenis do_cleanups (old_chain);
198b725ae77Skettenis return dummy;
199b725ae77Skettenis }
200b725ae77Skettenis
201b725ae77Skettenis /* Values for frame_info.status */
202b725ae77Skettenis
203b725ae77Skettenis #define MY_FRAME_IN_SP 0x1
204b725ae77Skettenis #define MY_FRAME_IN_FP 0x2
205b725ae77Skettenis #define NO_MORE_FRAMES 0x4
206b725ae77Skettenis
207*11efff7fSkettenis /* Compute the alignment required by a type. */
208*11efff7fSkettenis
209*11efff7fSkettenis static int
mn10300_type_align(struct type * type)210*11efff7fSkettenis mn10300_type_align (struct type *type)
211*11efff7fSkettenis {
212*11efff7fSkettenis int i, align = 1;
213*11efff7fSkettenis
214*11efff7fSkettenis switch (TYPE_CODE (type))
215*11efff7fSkettenis {
216*11efff7fSkettenis case TYPE_CODE_INT:
217*11efff7fSkettenis case TYPE_CODE_ENUM:
218*11efff7fSkettenis case TYPE_CODE_SET:
219*11efff7fSkettenis case TYPE_CODE_RANGE:
220*11efff7fSkettenis case TYPE_CODE_CHAR:
221*11efff7fSkettenis case TYPE_CODE_BOOL:
222*11efff7fSkettenis case TYPE_CODE_FLT:
223*11efff7fSkettenis case TYPE_CODE_PTR:
224*11efff7fSkettenis case TYPE_CODE_REF:
225*11efff7fSkettenis return TYPE_LENGTH (type);
226*11efff7fSkettenis
227*11efff7fSkettenis case TYPE_CODE_COMPLEX:
228*11efff7fSkettenis return TYPE_LENGTH (type) / 2;
229*11efff7fSkettenis
230*11efff7fSkettenis case TYPE_CODE_STRUCT:
231*11efff7fSkettenis case TYPE_CODE_UNION:
232*11efff7fSkettenis for (i = 0; i < TYPE_NFIELDS (type); i++)
233*11efff7fSkettenis {
234*11efff7fSkettenis int falign = mn10300_type_align (TYPE_FIELD_TYPE (type, i));
235*11efff7fSkettenis while (align < falign)
236*11efff7fSkettenis align <<= 1;
237*11efff7fSkettenis }
238*11efff7fSkettenis return align;
239*11efff7fSkettenis
240*11efff7fSkettenis case TYPE_CODE_ARRAY:
241*11efff7fSkettenis /* HACK! Structures containing arrays, even small ones, are not
242*11efff7fSkettenis elligible for returning in registers. */
243*11efff7fSkettenis return 256;
244*11efff7fSkettenis
245*11efff7fSkettenis case TYPE_CODE_TYPEDEF:
246*11efff7fSkettenis return mn10300_type_align (check_typedef (type));
247*11efff7fSkettenis
248*11efff7fSkettenis default:
249*11efff7fSkettenis internal_error (__FILE__, __LINE__, "bad switch");
250*11efff7fSkettenis }
251*11efff7fSkettenis }
252b725ae77Skettenis
253b725ae77Skettenis /* Should call_function allocate stack space for a struct return? */
254b725ae77Skettenis static int
mn10300_use_struct_convention(struct type * type)255*11efff7fSkettenis mn10300_use_struct_convention (struct type *type)
256b725ae77Skettenis {
257*11efff7fSkettenis /* Structures bigger than a pair of words can't be returned in
258*11efff7fSkettenis registers. */
259*11efff7fSkettenis if (TYPE_LENGTH (type) > 8)
260*11efff7fSkettenis return 1;
261*11efff7fSkettenis
262*11efff7fSkettenis switch (TYPE_CODE (type))
263*11efff7fSkettenis {
264*11efff7fSkettenis case TYPE_CODE_STRUCT:
265*11efff7fSkettenis case TYPE_CODE_UNION:
266*11efff7fSkettenis /* Structures with a single field are handled as the field
267*11efff7fSkettenis itself. */
268*11efff7fSkettenis if (TYPE_NFIELDS (type) == 1)
269*11efff7fSkettenis return mn10300_use_struct_convention (TYPE_FIELD_TYPE (type, 0));
270*11efff7fSkettenis
271*11efff7fSkettenis /* Structures with word or double-word size are passed in memory, as
272*11efff7fSkettenis long as they require at least word alignment. */
273*11efff7fSkettenis if (mn10300_type_align (type) >= 4)
274*11efff7fSkettenis return 0;
275*11efff7fSkettenis
276*11efff7fSkettenis return 1;
277*11efff7fSkettenis
278*11efff7fSkettenis /* Arrays are addressable, so they're never returned in
279*11efff7fSkettenis registers. This condition can only hold when the array is
280*11efff7fSkettenis the only field of a struct or union. */
281*11efff7fSkettenis case TYPE_CODE_ARRAY:
282*11efff7fSkettenis return 1;
283*11efff7fSkettenis
284*11efff7fSkettenis case TYPE_CODE_TYPEDEF:
285*11efff7fSkettenis return mn10300_use_struct_convention (check_typedef (type));
286*11efff7fSkettenis
287*11efff7fSkettenis default:
288*11efff7fSkettenis return 0;
289*11efff7fSkettenis }
290*11efff7fSkettenis }
291*11efff7fSkettenis
292*11efff7fSkettenis /* Determine, for architecture GDBARCH, how a return value of TYPE
293*11efff7fSkettenis should be returned. If it is supposed to be returned in registers,
294*11efff7fSkettenis and READBUF is non-zero, read the appropriate value from REGCACHE,
295*11efff7fSkettenis and copy it into READBUF. If WRITEBUF is non-zero, write the value
296*11efff7fSkettenis from WRITEBUF into REGCACHE. */
297*11efff7fSkettenis
298*11efff7fSkettenis static enum return_value_convention
mn10300_return_value(struct gdbarch * gdbarch,struct type * type,struct regcache * regcache,void * readbuf,const void * writebuf)299*11efff7fSkettenis mn10300_return_value (struct gdbarch *gdbarch, struct type *type,
300*11efff7fSkettenis struct regcache *regcache, void *readbuf,
301*11efff7fSkettenis const void *writebuf)
302*11efff7fSkettenis {
303*11efff7fSkettenis if (mn10300_use_struct_convention (type))
304*11efff7fSkettenis return RETURN_VALUE_STRUCT_CONVENTION;
305*11efff7fSkettenis
306*11efff7fSkettenis if (readbuf)
307*11efff7fSkettenis mn10300_extract_return_value (gdbarch, type, regcache, readbuf);
308*11efff7fSkettenis if (writebuf)
309*11efff7fSkettenis mn10300_store_return_value (gdbarch, type, regcache, writebuf);
310*11efff7fSkettenis
311*11efff7fSkettenis return RETURN_VALUE_REGISTER_CONVENTION;
312b725ae77Skettenis }
313b725ae77Skettenis
314b725ae77Skettenis /* The breakpoint instruction must be the same size as the smallest
315b725ae77Skettenis instruction in the instruction set.
316b725ae77Skettenis
317b725ae77Skettenis The Matsushita mn10x00 processors have single byte instructions
318b725ae77Skettenis so we need a single byte breakpoint. Matsushita hasn't defined
319b725ae77Skettenis one, so we defined it ourselves. */
320b725ae77Skettenis
321b725ae77Skettenis const static unsigned char *
mn10300_breakpoint_from_pc(CORE_ADDR * bp_addr,int * bp_size)322b725ae77Skettenis mn10300_breakpoint_from_pc (CORE_ADDR *bp_addr, int *bp_size)
323b725ae77Skettenis {
324b725ae77Skettenis static char breakpoint[] =
325b725ae77Skettenis {0xff};
326b725ae77Skettenis *bp_size = 1;
327b725ae77Skettenis return breakpoint;
328b725ae77Skettenis }
329b725ae77Skettenis
330b725ae77Skettenis
331b725ae77Skettenis /* Fix fi->frame if it's bogus at this point. This is a helper
332b725ae77Skettenis function for mn10300_analyze_prologue. */
333b725ae77Skettenis
334b725ae77Skettenis static void
fix_frame_pointer(struct frame_info * fi,int stack_size)335b725ae77Skettenis fix_frame_pointer (struct frame_info *fi, int stack_size)
336b725ae77Skettenis {
337b725ae77Skettenis if (fi && get_next_frame (fi) == NULL)
338b725ae77Skettenis {
339b725ae77Skettenis if (get_frame_extra_info (fi)->status & MY_FRAME_IN_SP)
340b725ae77Skettenis deprecated_update_frame_base_hack (fi, read_sp () - stack_size);
341b725ae77Skettenis else if (get_frame_extra_info (fi)->status & MY_FRAME_IN_FP)
342b725ae77Skettenis deprecated_update_frame_base_hack (fi, read_register (A3_REGNUM));
343b725ae77Skettenis }
344b725ae77Skettenis }
345b725ae77Skettenis
346b725ae77Skettenis
347b725ae77Skettenis /* Set offsets of registers saved by movm instruction.
348b725ae77Skettenis This is a helper function for mn10300_analyze_prologue. */
349b725ae77Skettenis
350b725ae77Skettenis static void
set_movm_offsets(struct frame_info * fi,int movm_args)351b725ae77Skettenis set_movm_offsets (struct frame_info *fi, int movm_args)
352b725ae77Skettenis {
353b725ae77Skettenis int offset = 0;
354b725ae77Skettenis
355b725ae77Skettenis if (fi == NULL || movm_args == 0)
356b725ae77Skettenis return;
357b725ae77Skettenis
358b725ae77Skettenis if (movm_args & movm_other_bit)
359b725ae77Skettenis {
360b725ae77Skettenis /* The `other' bit leaves a blank area of four bytes at the
361b725ae77Skettenis beginning of its block of saved registers, making it 32 bytes
362b725ae77Skettenis long in total. */
363b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[LAR_REGNUM] = get_frame_base (fi) + offset + 4;
364b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[LIR_REGNUM] = get_frame_base (fi) + offset + 8;
365b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[MDR_REGNUM] = get_frame_base (fi) + offset + 12;
366b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[A0_REGNUM + 1] = get_frame_base (fi) + offset + 16;
367b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[A0_REGNUM] = get_frame_base (fi) + offset + 20;
368b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[D0_REGNUM + 1] = get_frame_base (fi) + offset + 24;
369b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[D0_REGNUM] = get_frame_base (fi) + offset + 28;
370b725ae77Skettenis offset += 32;
371b725ae77Skettenis }
372b725ae77Skettenis if (movm_args & movm_a3_bit)
373b725ae77Skettenis {
374b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[A3_REGNUM] = get_frame_base (fi) + offset;
375b725ae77Skettenis offset += 4;
376b725ae77Skettenis }
377b725ae77Skettenis if (movm_args & movm_a2_bit)
378b725ae77Skettenis {
379b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[A2_REGNUM] = get_frame_base (fi) + offset;
380b725ae77Skettenis offset += 4;
381b725ae77Skettenis }
382b725ae77Skettenis if (movm_args & movm_d3_bit)
383b725ae77Skettenis {
384b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[D3_REGNUM] = get_frame_base (fi) + offset;
385b725ae77Skettenis offset += 4;
386b725ae77Skettenis }
387b725ae77Skettenis if (movm_args & movm_d2_bit)
388b725ae77Skettenis {
389b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[D2_REGNUM] = get_frame_base (fi) + offset;
390b725ae77Skettenis offset += 4;
391b725ae77Skettenis }
392b725ae77Skettenis if (AM33_MODE)
393b725ae77Skettenis {
394b725ae77Skettenis if (movm_args & movm_exother_bit)
395b725ae77Skettenis {
396b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[MCVF_REGNUM] = get_frame_base (fi) + offset;
397b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[MCRL_REGNUM] = get_frame_base (fi) + offset + 4;
398b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[MCRH_REGNUM] = get_frame_base (fi) + offset + 8;
399b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[MDRQ_REGNUM] = get_frame_base (fi) + offset + 12;
400b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 1] = get_frame_base (fi) + offset + 16;
401b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 0] = get_frame_base (fi) + offset + 20;
402b725ae77Skettenis offset += 24;
403b725ae77Skettenis }
404b725ae77Skettenis if (movm_args & movm_exreg1_bit)
405b725ae77Skettenis {
406b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 7] = get_frame_base (fi) + offset;
407b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 6] = get_frame_base (fi) + offset + 4;
408b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 5] = get_frame_base (fi) + offset + 8;
409b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 4] = get_frame_base (fi) + offset + 12;
410b725ae77Skettenis offset += 16;
411b725ae77Skettenis }
412b725ae77Skettenis if (movm_args & movm_exreg0_bit)
413b725ae77Skettenis {
414b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 3] = get_frame_base (fi) + offset;
415b725ae77Skettenis deprecated_get_frame_saved_regs (fi)[E0_REGNUM + 2] = get_frame_base (fi) + offset + 4;
416b725ae77Skettenis offset += 8;
417b725ae77Skettenis }
418b725ae77Skettenis }
419b725ae77Skettenis }
420b725ae77Skettenis
421b725ae77Skettenis
422b725ae77Skettenis /* The main purpose of this file is dealing with prologues to extract
423b725ae77Skettenis information about stack frames and saved registers.
424b725ae77Skettenis
425b725ae77Skettenis In gcc/config/mn13000/mn10300.c, the expand_prologue prologue
426b725ae77Skettenis function is pretty readable, and has a nice explanation of how the
427b725ae77Skettenis prologue is generated. The prologues generated by that code will
428b725ae77Skettenis have the following form (NOTE: the current code doesn't handle all
429b725ae77Skettenis this!):
430b725ae77Skettenis
431b725ae77Skettenis + If this is an old-style varargs function, then its arguments
432b725ae77Skettenis need to be flushed back to the stack:
433b725ae77Skettenis
434b725ae77Skettenis mov d0,(4,sp)
435b725ae77Skettenis mov d1,(4,sp)
436b725ae77Skettenis
437b725ae77Skettenis + If we use any of the callee-saved registers, save them now.
438b725ae77Skettenis
439b725ae77Skettenis movm [some callee-saved registers],(sp)
440b725ae77Skettenis
441b725ae77Skettenis + If we have any floating-point registers to save:
442b725ae77Skettenis
443b725ae77Skettenis - Decrement the stack pointer to reserve space for the registers.
444b725ae77Skettenis If the function doesn't need a frame pointer, we may combine
445b725ae77Skettenis this with the adjustment that reserves space for the frame.
446b725ae77Skettenis
447b725ae77Skettenis add -SIZE, sp
448b725ae77Skettenis
449b725ae77Skettenis - Save the floating-point registers. We have two possible
450b725ae77Skettenis strategies:
451b725ae77Skettenis
452b725ae77Skettenis . Save them at fixed offset from the SP:
453b725ae77Skettenis
454b725ae77Skettenis fmov fsN,(OFFSETN,sp)
455b725ae77Skettenis fmov fsM,(OFFSETM,sp)
456b725ae77Skettenis ...
457b725ae77Skettenis
458b725ae77Skettenis Note that, if OFFSETN happens to be zero, you'll get the
459b725ae77Skettenis different opcode: fmov fsN,(sp)
460b725ae77Skettenis
461b725ae77Skettenis . Or, set a0 to the start of the save area, and then use
462b725ae77Skettenis post-increment addressing to save the FP registers.
463b725ae77Skettenis
464b725ae77Skettenis mov sp, a0
465b725ae77Skettenis add SIZE, a0
466b725ae77Skettenis fmov fsN,(a0+)
467b725ae77Skettenis fmov fsM,(a0+)
468b725ae77Skettenis ...
469b725ae77Skettenis
470b725ae77Skettenis + If the function needs a frame pointer, we set it here.
471b725ae77Skettenis
472b725ae77Skettenis mov sp, a3
473b725ae77Skettenis
474b725ae77Skettenis + Now we reserve space for the stack frame proper. This could be
475b725ae77Skettenis merged into the `add -SIZE, sp' instruction for FP saves up
476b725ae77Skettenis above, unless we needed to set the frame pointer in the previous
477b725ae77Skettenis step, or the frame is so large that allocating the whole thing at
478b725ae77Skettenis once would put the FP register save slots out of reach of the
479b725ae77Skettenis addressing mode (128 bytes).
480b725ae77Skettenis
481b725ae77Skettenis add -SIZE, sp
482b725ae77Skettenis
483b725ae77Skettenis One day we might keep the stack pointer constant, that won't
484b725ae77Skettenis change the code for prologues, but it will make the frame
485b725ae77Skettenis pointerless case much more common. */
486b725ae77Skettenis
487b725ae77Skettenis /* Analyze the prologue to determine where registers are saved,
488b725ae77Skettenis the end of the prologue, etc etc. Return the end of the prologue
489b725ae77Skettenis scanned.
490b725ae77Skettenis
491b725ae77Skettenis We store into FI (if non-null) several tidbits of information:
492b725ae77Skettenis
493b725ae77Skettenis * stack_size -- size of this stack frame. Note that if we stop in
494b725ae77Skettenis certain parts of the prologue/epilogue we may claim the size of the
495b725ae77Skettenis current frame is zero. This happens when the current frame has
496b725ae77Skettenis not been allocated yet or has already been deallocated.
497b725ae77Skettenis
498b725ae77Skettenis * fsr -- Addresses of registers saved in the stack by this frame.
499b725ae77Skettenis
500b725ae77Skettenis * status -- A (relatively) generic status indicator. It's a bitmask
501b725ae77Skettenis with the following bits:
502b725ae77Skettenis
503b725ae77Skettenis MY_FRAME_IN_SP: The base of the current frame is actually in
504b725ae77Skettenis the stack pointer. This can happen for frame pointerless
505b725ae77Skettenis functions, or cases where we're stopped in the prologue/epilogue
506b725ae77Skettenis itself. For these cases mn10300_analyze_prologue will need up
507b725ae77Skettenis update fi->frame before returning or analyzing the register
508b725ae77Skettenis save instructions.
509b725ae77Skettenis
510b725ae77Skettenis MY_FRAME_IN_FP: The base of the current frame is in the
511b725ae77Skettenis frame pointer register ($a3).
512b725ae77Skettenis
513b725ae77Skettenis NO_MORE_FRAMES: Set this if the current frame is "start" or
514b725ae77Skettenis if the first instruction looks like mov <imm>,sp. This tells
515b725ae77Skettenis frame chain to not bother trying to unwind past this frame. */
516b725ae77Skettenis
517b725ae77Skettenis static CORE_ADDR
mn10300_analyze_prologue(struct frame_info * fi,CORE_ADDR pc)518b725ae77Skettenis mn10300_analyze_prologue (struct frame_info *fi, CORE_ADDR pc)
519b725ae77Skettenis {
520b725ae77Skettenis CORE_ADDR func_addr, func_end, addr, stop;
521b725ae77Skettenis CORE_ADDR stack_size;
522b725ae77Skettenis int imm_size;
523b725ae77Skettenis unsigned char buf[4];
524b725ae77Skettenis int status, movm_args = 0;
525b725ae77Skettenis char *name;
526b725ae77Skettenis
527b725ae77Skettenis /* Use the PC in the frame if it's provided to look up the
528b725ae77Skettenis start of this function.
529b725ae77Skettenis
530b725ae77Skettenis Note: kevinb/2003-07-16: We used to do the following here:
531b725ae77Skettenis pc = (fi ? get_frame_pc (fi) : pc);
532b725ae77Skettenis But this is (now) badly broken when called from analyze_dummy_frame().
533b725ae77Skettenis */
534b725ae77Skettenis pc = (pc ? pc : get_frame_pc (fi));
535b725ae77Skettenis
536b725ae77Skettenis /* Find the start of this function. */
537b725ae77Skettenis status = find_pc_partial_function (pc, &name, &func_addr, &func_end);
538b725ae77Skettenis
539b725ae77Skettenis /* Do nothing if we couldn't find the start of this function or if we're
540b725ae77Skettenis stopped at the first instruction in the prologue. */
541b725ae77Skettenis if (status == 0)
542b725ae77Skettenis {
543b725ae77Skettenis return pc;
544b725ae77Skettenis }
545b725ae77Skettenis
546b725ae77Skettenis /* If we're in start, then give up. */
547b725ae77Skettenis if (strcmp (name, "start") == 0)
548b725ae77Skettenis {
549b725ae77Skettenis if (fi != NULL)
550b725ae77Skettenis get_frame_extra_info (fi)->status = NO_MORE_FRAMES;
551b725ae77Skettenis return pc;
552b725ae77Skettenis }
553b725ae77Skettenis
554b725ae77Skettenis /* At the start of a function our frame is in the stack pointer. */
555b725ae77Skettenis if (fi)
556b725ae77Skettenis get_frame_extra_info (fi)->status = MY_FRAME_IN_SP;
557b725ae77Skettenis
558b725ae77Skettenis /* Get the next two bytes into buf, we need two because rets is a two
559b725ae77Skettenis byte insn and the first isn't enough to uniquely identify it. */
560*11efff7fSkettenis status = deprecated_read_memory_nobpt (pc, buf, 2);
561b725ae77Skettenis if (status != 0)
562b725ae77Skettenis return pc;
563b725ae77Skettenis
564b725ae77Skettenis #if 0
565b725ae77Skettenis /* Note: kevinb/2003-07-16: We shouldn't be making these sorts of
566b725ae77Skettenis changes to the frame in prologue examination code. */
567b725ae77Skettenis /* If we're physically on an "rets" instruction, then our frame has
568b725ae77Skettenis already been deallocated. Note this can also be true for retf
569b725ae77Skettenis and ret if they specify a size of zero.
570b725ae77Skettenis
571b725ae77Skettenis In this case fi->frame is bogus, we need to fix it. */
572b725ae77Skettenis if (fi && buf[0] == 0xf0 && buf[1] == 0xfc)
573b725ae77Skettenis {
574b725ae77Skettenis if (get_next_frame (fi) == NULL)
575b725ae77Skettenis deprecated_update_frame_base_hack (fi, read_sp ());
576b725ae77Skettenis return get_frame_pc (fi);
577b725ae77Skettenis }
578b725ae77Skettenis
579b725ae77Skettenis /* Similarly if we're stopped on the first insn of a prologue as our
580b725ae77Skettenis frame hasn't been allocated yet. */
581b725ae77Skettenis if (fi && get_frame_pc (fi) == func_addr)
582b725ae77Skettenis {
583b725ae77Skettenis if (get_next_frame (fi) == NULL)
584b725ae77Skettenis deprecated_update_frame_base_hack (fi, read_sp ());
585b725ae77Skettenis return get_frame_pc (fi);
586b725ae77Skettenis }
587b725ae77Skettenis #endif
588b725ae77Skettenis
589b725ae77Skettenis /* Figure out where to stop scanning. */
590b725ae77Skettenis stop = fi ? pc : func_end;
591b725ae77Skettenis
592b725ae77Skettenis /* Don't walk off the end of the function. */
593b725ae77Skettenis stop = stop > func_end ? func_end : stop;
594b725ae77Skettenis
595b725ae77Skettenis /* Start scanning on the first instruction of this function. */
596b725ae77Skettenis addr = func_addr;
597b725ae77Skettenis
598b725ae77Skettenis /* Suck in two bytes. */
599*11efff7fSkettenis if (addr + 2 >= stop
600*11efff7fSkettenis || (status = deprecated_read_memory_nobpt (addr, buf, 2)) != 0)
601b725ae77Skettenis {
602b725ae77Skettenis fix_frame_pointer (fi, 0);
603b725ae77Skettenis return addr;
604b725ae77Skettenis }
605b725ae77Skettenis
606b725ae77Skettenis /* First see if this insn sets the stack pointer from a register; if
607b725ae77Skettenis so, it's probably the initialization of the stack pointer in _start,
608b725ae77Skettenis so mark this as the bottom-most frame. */
609b725ae77Skettenis if (buf[0] == 0xf2 && (buf[1] & 0xf3) == 0xf0)
610b725ae77Skettenis {
611b725ae77Skettenis if (fi)
612b725ae77Skettenis get_frame_extra_info (fi)->status = NO_MORE_FRAMES;
613b725ae77Skettenis return addr;
614b725ae77Skettenis }
615b725ae77Skettenis
616b725ae77Skettenis /* Now look for movm [regs],sp, which saves the callee saved registers.
617b725ae77Skettenis
618b725ae77Skettenis At this time we don't know if fi->frame is valid, so we only note
619b725ae77Skettenis that we encountered a movm instruction. Later, we'll set the entries
620b725ae77Skettenis in fsr.regs as needed. */
621b725ae77Skettenis if (buf[0] == 0xcf)
622b725ae77Skettenis {
623b725ae77Skettenis /* Extract the register list for the movm instruction. */
624*11efff7fSkettenis status = deprecated_read_memory_nobpt (addr + 1, buf, 1);
625b725ae77Skettenis movm_args = *buf;
626b725ae77Skettenis
627b725ae77Skettenis addr += 2;
628b725ae77Skettenis
629b725ae77Skettenis /* Quit now if we're beyond the stop point. */
630b725ae77Skettenis if (addr >= stop)
631b725ae77Skettenis {
632b725ae77Skettenis /* Fix fi->frame since it's bogus at this point. */
633b725ae77Skettenis if (fi && get_next_frame (fi) == NULL)
634b725ae77Skettenis deprecated_update_frame_base_hack (fi, read_sp ());
635b725ae77Skettenis
636b725ae77Skettenis /* Note if/where callee saved registers were saved. */
637b725ae77Skettenis set_movm_offsets (fi, movm_args);
638b725ae77Skettenis return addr;
639b725ae77Skettenis }
640b725ae77Skettenis
641b725ae77Skettenis /* Get the next two bytes so the prologue scan can continue. */
642*11efff7fSkettenis status = deprecated_read_memory_nobpt (addr, buf, 2);
643b725ae77Skettenis if (status != 0)
644b725ae77Skettenis {
645b725ae77Skettenis /* Fix fi->frame since it's bogus at this point. */
646b725ae77Skettenis if (fi && get_next_frame (fi) == NULL)
647b725ae77Skettenis deprecated_update_frame_base_hack (fi, read_sp ());
648b725ae77Skettenis
649b725ae77Skettenis /* Note if/where callee saved registers were saved. */
650b725ae77Skettenis set_movm_offsets (fi, movm_args);
651b725ae77Skettenis return addr;
652b725ae77Skettenis }
653b725ae77Skettenis }
654b725ae77Skettenis
655b725ae77Skettenis /* Now see if we set up a frame pointer via "mov sp,a3" */
656b725ae77Skettenis if (buf[0] == 0x3f)
657b725ae77Skettenis {
658b725ae77Skettenis addr += 1;
659b725ae77Skettenis
660b725ae77Skettenis /* The frame pointer is now valid. */
661b725ae77Skettenis if (fi)
662b725ae77Skettenis {
663b725ae77Skettenis get_frame_extra_info (fi)->status |= MY_FRAME_IN_FP;
664b725ae77Skettenis get_frame_extra_info (fi)->status &= ~MY_FRAME_IN_SP;
665b725ae77Skettenis }
666b725ae77Skettenis
667b725ae77Skettenis /* Quit now if we're beyond the stop point. */
668b725ae77Skettenis if (addr >= stop)
669b725ae77Skettenis {
670b725ae77Skettenis /* Fix fi->frame if it's bogus at this point. */
671b725ae77Skettenis fix_frame_pointer (fi, 0);
672b725ae77Skettenis
673b725ae77Skettenis /* Note if/where callee saved registers were saved. */
674b725ae77Skettenis set_movm_offsets (fi, movm_args);
675b725ae77Skettenis return addr;
676b725ae77Skettenis }
677b725ae77Skettenis
678b725ae77Skettenis /* Get two more bytes so scanning can continue. */
679*11efff7fSkettenis status = deprecated_read_memory_nobpt (addr, buf, 2);
680b725ae77Skettenis if (status != 0)
681b725ae77Skettenis {
682b725ae77Skettenis /* Fix fi->frame if it's bogus at this point. */
683b725ae77Skettenis fix_frame_pointer (fi, 0);
684b725ae77Skettenis
685b725ae77Skettenis /* Note if/where callee saved registers were saved. */
686b725ae77Skettenis set_movm_offsets (fi, movm_args);
687b725ae77Skettenis return addr;
688b725ae77Skettenis }
689b725ae77Skettenis }
690b725ae77Skettenis
691b725ae77Skettenis /* Next we should allocate the local frame. No more prologue insns
692b725ae77Skettenis are found after allocating the local frame.
693b725ae77Skettenis
694b725ae77Skettenis Search for add imm8,sp (0xf8feXX)
695b725ae77Skettenis or add imm16,sp (0xfafeXXXX)
696b725ae77Skettenis or add imm32,sp (0xfcfeXXXXXXXX).
697b725ae77Skettenis
698b725ae77Skettenis If none of the above was found, then this prologue has no
699b725ae77Skettenis additional stack. */
700b725ae77Skettenis
701*11efff7fSkettenis status = deprecated_read_memory_nobpt (addr, buf, 2);
702b725ae77Skettenis if (status != 0)
703b725ae77Skettenis {
704b725ae77Skettenis /* Fix fi->frame if it's bogus at this point. */
705b725ae77Skettenis fix_frame_pointer (fi, 0);
706b725ae77Skettenis
707b725ae77Skettenis /* Note if/where callee saved registers were saved. */
708b725ae77Skettenis set_movm_offsets (fi, movm_args);
709b725ae77Skettenis return addr;
710b725ae77Skettenis }
711b725ae77Skettenis
712b725ae77Skettenis imm_size = 0;
713b725ae77Skettenis if (buf[0] == 0xf8 && buf[1] == 0xfe)
714b725ae77Skettenis imm_size = 1;
715b725ae77Skettenis else if (buf[0] == 0xfa && buf[1] == 0xfe)
716b725ae77Skettenis imm_size = 2;
717b725ae77Skettenis else if (buf[0] == 0xfc && buf[1] == 0xfe)
718b725ae77Skettenis imm_size = 4;
719b725ae77Skettenis
720b725ae77Skettenis if (imm_size != 0)
721b725ae77Skettenis {
722b725ae77Skettenis /* Suck in imm_size more bytes, they'll hold the size of the
723b725ae77Skettenis current frame. */
724*11efff7fSkettenis status = deprecated_read_memory_nobpt (addr + 2, buf, imm_size);
725b725ae77Skettenis if (status != 0)
726b725ae77Skettenis {
727b725ae77Skettenis /* Fix fi->frame if it's bogus at this point. */
728b725ae77Skettenis fix_frame_pointer (fi, 0);
729b725ae77Skettenis
730b725ae77Skettenis /* Note if/where callee saved registers were saved. */
731b725ae77Skettenis set_movm_offsets (fi, movm_args);
732b725ae77Skettenis return addr;
733b725ae77Skettenis }
734b725ae77Skettenis
735b725ae77Skettenis /* Note the size of the stack in the frame info structure. */
736b725ae77Skettenis stack_size = extract_signed_integer (buf, imm_size);
737b725ae77Skettenis if (fi)
738b725ae77Skettenis get_frame_extra_info (fi)->stack_size = stack_size;
739b725ae77Skettenis
740b725ae77Skettenis /* We just consumed 2 + imm_size bytes. */
741b725ae77Skettenis addr += 2 + imm_size;
742b725ae77Skettenis
743b725ae77Skettenis /* No more prologue insns follow, so begin preparation to return. */
744b725ae77Skettenis /* Fix fi->frame if it's bogus at this point. */
745b725ae77Skettenis fix_frame_pointer (fi, stack_size);
746b725ae77Skettenis
747b725ae77Skettenis /* Note if/where callee saved registers were saved. */
748b725ae77Skettenis set_movm_offsets (fi, movm_args);
749b725ae77Skettenis return addr;
750b725ae77Skettenis }
751b725ae77Skettenis
752b725ae77Skettenis /* We never found an insn which allocates local stack space, regardless
753b725ae77Skettenis this is the end of the prologue. */
754b725ae77Skettenis /* Fix fi->frame if it's bogus at this point. */
755b725ae77Skettenis fix_frame_pointer (fi, 0);
756b725ae77Skettenis
757b725ae77Skettenis /* Note if/where callee saved registers were saved. */
758b725ae77Skettenis set_movm_offsets (fi, movm_args);
759b725ae77Skettenis return addr;
760b725ae77Skettenis }
761b725ae77Skettenis
762b725ae77Skettenis
763b725ae77Skettenis /* Function: saved_regs_size
764b725ae77Skettenis Return the size in bytes of the register save area, based on the
765b725ae77Skettenis saved_regs array in FI. */
766b725ae77Skettenis static int
saved_regs_size(struct frame_info * fi)767b725ae77Skettenis saved_regs_size (struct frame_info *fi)
768b725ae77Skettenis {
769b725ae77Skettenis int adjust = 0;
770b725ae77Skettenis int i;
771b725ae77Skettenis
772b725ae77Skettenis /* Reserve four bytes for every register saved. */
773b725ae77Skettenis for (i = 0; i < NUM_REGS; i++)
774b725ae77Skettenis if (deprecated_get_frame_saved_regs (fi)[i])
775b725ae77Skettenis adjust += 4;
776b725ae77Skettenis
777b725ae77Skettenis /* If we saved LIR, then it's most likely we used a `movm'
778b725ae77Skettenis instruction with the `other' bit set, in which case the SP is
779b725ae77Skettenis decremented by an extra four bytes, "to simplify calculation
780b725ae77Skettenis of the transfer area", according to the processor manual. */
781b725ae77Skettenis if (deprecated_get_frame_saved_regs (fi)[LIR_REGNUM])
782b725ae77Skettenis adjust += 4;
783b725ae77Skettenis
784b725ae77Skettenis return adjust;
785b725ae77Skettenis }
786b725ae77Skettenis
787b725ae77Skettenis
788b725ae77Skettenis /* Function: frame_chain
789b725ae77Skettenis Figure out and return the caller's frame pointer given current
790b725ae77Skettenis frame_info struct.
791b725ae77Skettenis
792b725ae77Skettenis We don't handle dummy frames yet but we would probably just return the
793b725ae77Skettenis stack pointer that was in use at the time the function call was made? */
794b725ae77Skettenis
795b725ae77Skettenis static CORE_ADDR
mn10300_frame_chain(struct frame_info * fi)796b725ae77Skettenis mn10300_frame_chain (struct frame_info *fi)
797b725ae77Skettenis {
798b725ae77Skettenis struct frame_info *dummy;
799b725ae77Skettenis /* Walk through the prologue to determine the stack size,
800b725ae77Skettenis location of saved registers, end of the prologue, etc. */
801b725ae77Skettenis if (get_frame_extra_info (fi)->status == 0)
802b725ae77Skettenis mn10300_analyze_prologue (fi, (CORE_ADDR) 0);
803b725ae77Skettenis
804b725ae77Skettenis /* Quit now if mn10300_analyze_prologue set NO_MORE_FRAMES. */
805b725ae77Skettenis if (get_frame_extra_info (fi)->status & NO_MORE_FRAMES)
806b725ae77Skettenis return 0;
807b725ae77Skettenis
808b725ae77Skettenis /* Now that we've analyzed our prologue, determine the frame
809b725ae77Skettenis pointer for our caller.
810b725ae77Skettenis
811b725ae77Skettenis If our caller has a frame pointer, then we need to
812b725ae77Skettenis find the entry value of $a3 to our function.
813b725ae77Skettenis
814b725ae77Skettenis If fsr.regs[A3_REGNUM] is nonzero, then it's at the memory
815b725ae77Skettenis location pointed to by fsr.regs[A3_REGNUM].
816b725ae77Skettenis
817b725ae77Skettenis Else it's still in $a3.
818b725ae77Skettenis
819b725ae77Skettenis If our caller does not have a frame pointer, then his
820b725ae77Skettenis frame base is fi->frame + -caller's stack size. */
821b725ae77Skettenis
822b725ae77Skettenis /* The easiest way to get that info is to analyze our caller's frame.
823b725ae77Skettenis So we set up a dummy frame and call mn10300_analyze_prologue to
824b725ae77Skettenis find stuff for us. */
825b725ae77Skettenis dummy = analyze_dummy_frame (DEPRECATED_FRAME_SAVED_PC (fi), get_frame_base (fi));
826b725ae77Skettenis
827b725ae77Skettenis if (get_frame_extra_info (dummy)->status & MY_FRAME_IN_FP)
828b725ae77Skettenis {
829b725ae77Skettenis /* Our caller has a frame pointer. So find the frame in $a3 or
830b725ae77Skettenis in the stack. */
831b725ae77Skettenis if (deprecated_get_frame_saved_regs (fi)[A3_REGNUM])
832b725ae77Skettenis return (read_memory_integer (deprecated_get_frame_saved_regs (fi)[A3_REGNUM],
833b725ae77Skettenis DEPRECATED_REGISTER_SIZE));
834b725ae77Skettenis else
835b725ae77Skettenis return read_register (A3_REGNUM);
836b725ae77Skettenis }
837b725ae77Skettenis else
838b725ae77Skettenis {
839b725ae77Skettenis int adjust = saved_regs_size (fi);
840b725ae77Skettenis
841b725ae77Skettenis /* Our caller does not have a frame pointer. So his frame starts
842b725ae77Skettenis at the base of our frame (fi->frame) + register save space
843b725ae77Skettenis + <his size>. */
844b725ae77Skettenis return get_frame_base (fi) + adjust + -get_frame_extra_info (dummy)->stack_size;
845b725ae77Skettenis }
846b725ae77Skettenis }
847b725ae77Skettenis
848b725ae77Skettenis /* Function: skip_prologue
849b725ae77Skettenis Return the address of the first inst past the prologue of the function. */
850b725ae77Skettenis
851b725ae77Skettenis static CORE_ADDR
mn10300_skip_prologue(CORE_ADDR pc)852b725ae77Skettenis mn10300_skip_prologue (CORE_ADDR pc)
853b725ae77Skettenis {
854b725ae77Skettenis /* We used to check the debug symbols, but that can lose if
855b725ae77Skettenis we have a null prologue. */
856b725ae77Skettenis return mn10300_analyze_prologue (NULL, pc);
857b725ae77Skettenis }
858b725ae77Skettenis
859b725ae77Skettenis /* generic_pop_current_frame calls this function if the current
860b725ae77Skettenis frame isn't a dummy frame. */
861b725ae77Skettenis static void
mn10300_pop_frame_regular(struct frame_info * frame)862b725ae77Skettenis mn10300_pop_frame_regular (struct frame_info *frame)
863b725ae77Skettenis {
864b725ae77Skettenis int regnum;
865b725ae77Skettenis
866b725ae77Skettenis write_register (PC_REGNUM, DEPRECATED_FRAME_SAVED_PC (frame));
867b725ae77Skettenis
868b725ae77Skettenis /* Restore any saved registers. */
869b725ae77Skettenis for (regnum = 0; regnum < NUM_REGS; regnum++)
870b725ae77Skettenis if (deprecated_get_frame_saved_regs (frame)[regnum] != 0)
871b725ae77Skettenis {
872b725ae77Skettenis ULONGEST value;
873b725ae77Skettenis
874b725ae77Skettenis value = read_memory_unsigned_integer (deprecated_get_frame_saved_regs (frame)[regnum],
875*11efff7fSkettenis register_size (current_gdbarch, regnum));
876b725ae77Skettenis write_register (regnum, value);
877b725ae77Skettenis }
878b725ae77Skettenis
879*11efff7fSkettenis /* Actually cut back the stack, adjusted by the saved registers like
880*11efff7fSkettenis ret would. */
881*11efff7fSkettenis write_register (SP_REGNUM, get_frame_base (frame) + saved_regs_size (frame));
882b725ae77Skettenis }
883b725ae77Skettenis
884b725ae77Skettenis /* Function: pop_frame
885b725ae77Skettenis This routine gets called when either the user uses the `return'
886b725ae77Skettenis command, or the call dummy breakpoint gets hit. */
887b725ae77Skettenis static void
mn10300_pop_frame(void)888b725ae77Skettenis mn10300_pop_frame (void)
889b725ae77Skettenis {
890*11efff7fSkettenis struct frame_info *frame = get_current_frame ();
891*11efff7fSkettenis if (get_frame_type (frame) == DUMMY_FRAME)
892*11efff7fSkettenis /* NOTE: cagney/2002-22-23: Does this ever occure? Surely a dummy
893*11efff7fSkettenis frame will have already been poped by the "infrun.c" code. */
894*11efff7fSkettenis deprecated_pop_dummy_frame ();
895*11efff7fSkettenis else
896*11efff7fSkettenis mn10300_pop_frame_regular (frame);
897b725ae77Skettenis /* Throw away any cached frame information. */
898b725ae77Skettenis flush_cached_frames ();
899b725ae77Skettenis }
900b725ae77Skettenis
901b725ae77Skettenis /* Function: push_arguments
902b725ae77Skettenis Setup arguments for a call to the target. Arguments go in
903b725ae77Skettenis order on the stack. */
904b725ae77Skettenis
905b725ae77Skettenis static CORE_ADDR
mn10300_push_arguments(int nargs,struct value ** args,CORE_ADDR sp,int struct_return,CORE_ADDR struct_addr)906b725ae77Skettenis mn10300_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
907b725ae77Skettenis int struct_return, CORE_ADDR struct_addr)
908b725ae77Skettenis {
909b725ae77Skettenis int argnum = 0;
910b725ae77Skettenis int len = 0;
911b725ae77Skettenis int stack_offset = 0;
912b725ae77Skettenis int regsused = struct_return ? 1 : 0;
913b725ae77Skettenis
914b725ae77Skettenis /* This should be a nop, but align the stack just in case something
915b725ae77Skettenis went wrong. Stacks are four byte aligned on the mn10300. */
916b725ae77Skettenis sp &= ~3;
917b725ae77Skettenis
918b725ae77Skettenis /* Now make space on the stack for the args.
919b725ae77Skettenis
920b725ae77Skettenis XXX This doesn't appear to handle pass-by-invisible reference
921b725ae77Skettenis arguments. */
922b725ae77Skettenis for (argnum = 0; argnum < nargs; argnum++)
923b725ae77Skettenis {
924b725ae77Skettenis int arg_length = (TYPE_LENGTH (VALUE_TYPE (args[argnum])) + 3) & ~3;
925b725ae77Skettenis
926b725ae77Skettenis while (regsused < 2 && arg_length > 0)
927b725ae77Skettenis {
928b725ae77Skettenis regsused++;
929b725ae77Skettenis arg_length -= 4;
930b725ae77Skettenis }
931b725ae77Skettenis len += arg_length;
932b725ae77Skettenis }
933b725ae77Skettenis
934b725ae77Skettenis /* Allocate stack space. */
935b725ae77Skettenis sp -= len;
936b725ae77Skettenis
937b725ae77Skettenis regsused = struct_return ? 1 : 0;
938b725ae77Skettenis /* Push all arguments onto the stack. */
939b725ae77Skettenis for (argnum = 0; argnum < nargs; argnum++)
940b725ae77Skettenis {
941b725ae77Skettenis int len;
942b725ae77Skettenis char *val;
943b725ae77Skettenis
944b725ae77Skettenis /* XXX Check this. What about UNIONS? */
945b725ae77Skettenis if (TYPE_CODE (VALUE_TYPE (*args)) == TYPE_CODE_STRUCT
946b725ae77Skettenis && TYPE_LENGTH (VALUE_TYPE (*args)) > 8)
947b725ae77Skettenis {
948b725ae77Skettenis /* XXX Wrong, we want a pointer to this argument. */
949b725ae77Skettenis len = TYPE_LENGTH (VALUE_TYPE (*args));
950b725ae77Skettenis val = (char *) VALUE_CONTENTS (*args);
951b725ae77Skettenis }
952b725ae77Skettenis else
953b725ae77Skettenis {
954b725ae77Skettenis len = TYPE_LENGTH (VALUE_TYPE (*args));
955b725ae77Skettenis val = (char *) VALUE_CONTENTS (*args);
956b725ae77Skettenis }
957b725ae77Skettenis
958b725ae77Skettenis while (regsused < 2 && len > 0)
959b725ae77Skettenis {
960b725ae77Skettenis write_register (regsused, extract_unsigned_integer (val, 4));
961b725ae77Skettenis val += 4;
962b725ae77Skettenis len -= 4;
963b725ae77Skettenis regsused++;
964b725ae77Skettenis }
965b725ae77Skettenis
966b725ae77Skettenis while (len > 0)
967b725ae77Skettenis {
968b725ae77Skettenis write_memory (sp + stack_offset, val, 4);
969b725ae77Skettenis len -= 4;
970b725ae77Skettenis val += 4;
971b725ae77Skettenis stack_offset += 4;
972b725ae77Skettenis }
973b725ae77Skettenis
974b725ae77Skettenis args++;
975b725ae77Skettenis }
976b725ae77Skettenis
977b725ae77Skettenis /* Make space for the flushback area. */
978b725ae77Skettenis sp -= 8;
979b725ae77Skettenis return sp;
980b725ae77Skettenis }
981b725ae77Skettenis
982b725ae77Skettenis /* Function: push_return_address (pc)
983b725ae77Skettenis Set up the return address for the inferior function call.
984b725ae77Skettenis Needed for targets where we don't actually execute a JSR/BSR instruction */
985b725ae77Skettenis
986b725ae77Skettenis static CORE_ADDR
mn10300_push_return_address(CORE_ADDR pc,CORE_ADDR sp)987b725ae77Skettenis mn10300_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
988b725ae77Skettenis {
989b725ae77Skettenis unsigned char buf[4];
990b725ae77Skettenis
991b725ae77Skettenis store_unsigned_integer (buf, 4, entry_point_address ());
992b725ae77Skettenis write_memory (sp - 4, buf, 4);
993b725ae77Skettenis return sp - 4;
994b725ae77Skettenis }
995b725ae77Skettenis
996b725ae77Skettenis /* Function: store_struct_return (addr,sp)
997b725ae77Skettenis Store the structure value return address for an inferior function
998b725ae77Skettenis call. */
999b725ae77Skettenis
1000b725ae77Skettenis static void
mn10300_store_struct_return(CORE_ADDR addr,CORE_ADDR sp)1001b725ae77Skettenis mn10300_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
1002b725ae77Skettenis {
1003b725ae77Skettenis /* The structure return address is passed as the first argument. */
1004b725ae77Skettenis write_register (0, addr);
1005b725ae77Skettenis }
1006b725ae77Skettenis
1007b725ae77Skettenis /* Function: frame_saved_pc
1008b725ae77Skettenis Find the caller of this frame. We do this by seeing if RP_REGNUM
1009b725ae77Skettenis is saved in the stack anywhere, otherwise we get it from the
1010b725ae77Skettenis registers. If the inner frame is a dummy frame, return its PC
1011b725ae77Skettenis instead of RP, because that's where "caller" of the dummy-frame
1012b725ae77Skettenis will be found. */
1013b725ae77Skettenis
1014b725ae77Skettenis static CORE_ADDR
mn10300_frame_saved_pc(struct frame_info * fi)1015b725ae77Skettenis mn10300_frame_saved_pc (struct frame_info *fi)
1016b725ae77Skettenis {
1017b725ae77Skettenis int adjust = saved_regs_size (fi);
1018b725ae77Skettenis
1019b725ae77Skettenis return (read_memory_integer (get_frame_base (fi) + adjust,
1020b725ae77Skettenis DEPRECATED_REGISTER_SIZE));
1021b725ae77Skettenis }
1022b725ae77Skettenis
1023b725ae77Skettenis /* Function: mn10300_init_extra_frame_info
1024b725ae77Skettenis Setup the frame's frame pointer, pc, and frame addresses for saved
1025b725ae77Skettenis registers. Most of the work is done in mn10300_analyze_prologue().
1026b725ae77Skettenis
1027b725ae77Skettenis Note that when we are called for the last frame (currently active frame),
1028b725ae77Skettenis that get_frame_pc (fi) and fi->frame will already be setup. However, fi->frame will
1029b725ae77Skettenis be valid only if this routine uses FP. For previous frames, fi-frame will
1030b725ae77Skettenis always be correct. mn10300_analyze_prologue will fix fi->frame if
1031b725ae77Skettenis it's not valid.
1032b725ae77Skettenis
1033b725ae77Skettenis We can be called with the PC in the call dummy under two
1034b725ae77Skettenis circumstances. First, during normal backtracing, second, while
1035b725ae77Skettenis figuring out the frame pointer just prior to calling the target
1036b725ae77Skettenis function (see call_function_by_hand). */
1037b725ae77Skettenis
1038b725ae77Skettenis static void
mn10300_init_extra_frame_info(int fromleaf,struct frame_info * fi)1039b725ae77Skettenis mn10300_init_extra_frame_info (int fromleaf, struct frame_info *fi)
1040b725ae77Skettenis {
1041b725ae77Skettenis if (get_next_frame (fi))
1042b725ae77Skettenis deprecated_update_frame_pc_hack (fi, DEPRECATED_FRAME_SAVED_PC (get_next_frame (fi)));
1043b725ae77Skettenis
1044b725ae77Skettenis frame_saved_regs_zalloc (fi);
1045b725ae77Skettenis frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
1046b725ae77Skettenis
1047b725ae77Skettenis get_frame_extra_info (fi)->status = 0;
1048b725ae77Skettenis get_frame_extra_info (fi)->stack_size = 0;
1049b725ae77Skettenis
1050b725ae77Skettenis mn10300_analyze_prologue (fi, 0);
1051b725ae77Skettenis }
1052b725ae77Skettenis
1053b725ae77Skettenis
1054b725ae77Skettenis /* This function's job is handled by init_extra_frame_info. */
1055b725ae77Skettenis static void
mn10300_frame_init_saved_regs(struct frame_info * frame)1056b725ae77Skettenis mn10300_frame_init_saved_regs (struct frame_info *frame)
1057b725ae77Skettenis {
1058b725ae77Skettenis }
1059b725ae77Skettenis
1060b725ae77Skettenis
1061b725ae77Skettenis /* Function: mn10300_virtual_frame_pointer
1062b725ae77Skettenis Return the register that the function uses for a frame pointer,
1063b725ae77Skettenis plus any necessary offset to be applied to the register before
1064b725ae77Skettenis any frame pointer offsets. */
1065b725ae77Skettenis
1066b725ae77Skettenis static void
mn10300_virtual_frame_pointer(CORE_ADDR pc,int * reg,LONGEST * offset)1067b725ae77Skettenis mn10300_virtual_frame_pointer (CORE_ADDR pc,
1068b725ae77Skettenis int *reg,
1069b725ae77Skettenis LONGEST *offset)
1070b725ae77Skettenis {
1071b725ae77Skettenis struct frame_info *dummy = analyze_dummy_frame (pc, 0);
1072b725ae77Skettenis /* Set up a dummy frame_info, Analyze the prolog and fill in the
1073b725ae77Skettenis extra info. */
1074b725ae77Skettenis /* Results will tell us which type of frame it uses. */
1075b725ae77Skettenis if (get_frame_extra_info (dummy)->status & MY_FRAME_IN_SP)
1076b725ae77Skettenis {
1077b725ae77Skettenis *reg = SP_REGNUM;
1078b725ae77Skettenis *offset = -(get_frame_extra_info (dummy)->stack_size);
1079b725ae77Skettenis }
1080b725ae77Skettenis else
1081b725ae77Skettenis {
1082b725ae77Skettenis *reg = A3_REGNUM;
1083b725ae77Skettenis *offset = 0;
1084b725ae77Skettenis }
1085b725ae77Skettenis }
1086b725ae77Skettenis
1087b725ae77Skettenis static int
mn10300_reg_struct_has_addr(int gcc_p,struct type * type)1088b725ae77Skettenis mn10300_reg_struct_has_addr (int gcc_p, struct type *type)
1089b725ae77Skettenis {
1090b725ae77Skettenis return (TYPE_LENGTH (type) > 8);
1091b725ae77Skettenis }
1092b725ae77Skettenis
1093b725ae77Skettenis static struct type *
mn10300_register_virtual_type(int reg)1094b725ae77Skettenis mn10300_register_virtual_type (int reg)
1095b725ae77Skettenis {
1096b725ae77Skettenis return builtin_type_int;
1097b725ae77Skettenis }
1098b725ae77Skettenis
1099b725ae77Skettenis static int
mn10300_register_byte(int reg)1100b725ae77Skettenis mn10300_register_byte (int reg)
1101b725ae77Skettenis {
1102b725ae77Skettenis return (reg * 4);
1103b725ae77Skettenis }
1104b725ae77Skettenis
1105b725ae77Skettenis static int
mn10300_register_virtual_size(int reg)1106b725ae77Skettenis mn10300_register_virtual_size (int reg)
1107b725ae77Skettenis {
1108b725ae77Skettenis return 4;
1109b725ae77Skettenis }
1110b725ae77Skettenis
1111b725ae77Skettenis static int
mn10300_register_raw_size(int reg)1112b725ae77Skettenis mn10300_register_raw_size (int reg)
1113b725ae77Skettenis {
1114b725ae77Skettenis return 4;
1115b725ae77Skettenis }
1116b725ae77Skettenis
1117b725ae77Skettenis /* If DWARF2 is a register number appearing in Dwarf2 debug info, then
1118b725ae77Skettenis mn10300_dwarf2_reg_to_regnum (DWARF2) is the corresponding GDB
1119b725ae77Skettenis register number. Why don't Dwarf2 and GDB use the same numbering?
1120b725ae77Skettenis Who knows? But since people have object files lying around with
1121b725ae77Skettenis the existing Dwarf2 numbering, and other people have written stubs
1122b725ae77Skettenis to work with the existing GDB, neither of them can change. So we
1123b725ae77Skettenis just have to cope. */
1124b725ae77Skettenis static int
mn10300_dwarf2_reg_to_regnum(int dwarf2)1125b725ae77Skettenis mn10300_dwarf2_reg_to_regnum (int dwarf2)
1126b725ae77Skettenis {
1127b725ae77Skettenis /* This table is supposed to be shaped like the REGISTER_NAMES
1128b725ae77Skettenis initializer in gcc/config/mn10300/mn10300.h. Registers which
1129b725ae77Skettenis appear in GCC's numbering, but have no counterpart in GDB's
1130b725ae77Skettenis world, are marked with a -1. */
1131b725ae77Skettenis static int dwarf2_to_gdb[] = {
1132b725ae77Skettenis 0, 1, 2, 3, 4, 5, 6, 7, -1, 8,
1133b725ae77Skettenis 15, 16, 17, 18, 19, 20, 21, 22
1134b725ae77Skettenis };
1135b725ae77Skettenis int gdb;
1136b725ae77Skettenis
1137b725ae77Skettenis if (dwarf2 < 0
1138b725ae77Skettenis || dwarf2 >= (sizeof (dwarf2_to_gdb) / sizeof (dwarf2_to_gdb[0]))
1139b725ae77Skettenis || dwarf2_to_gdb[dwarf2] == -1)
1140b725ae77Skettenis internal_error (__FILE__, __LINE__,
1141b725ae77Skettenis "bogus register number in debug info: %d", dwarf2);
1142b725ae77Skettenis
1143b725ae77Skettenis return dwarf2_to_gdb[dwarf2];
1144b725ae77Skettenis }
1145b725ae77Skettenis
1146b725ae77Skettenis static void
mn10300_print_register(const char * name,int regnum,int reg_width)1147b725ae77Skettenis mn10300_print_register (const char *name, int regnum, int reg_width)
1148b725ae77Skettenis {
1149b725ae77Skettenis char raw_buffer[MAX_REGISTER_SIZE];
1150b725ae77Skettenis
1151b725ae77Skettenis if (reg_width)
1152b725ae77Skettenis printf_filtered ("%*s: ", reg_width, name);
1153b725ae77Skettenis else
1154b725ae77Skettenis printf_filtered ("%s: ", name);
1155b725ae77Skettenis
1156b725ae77Skettenis /* Get the data */
1157b725ae77Skettenis if (!frame_register_read (deprecated_selected_frame, regnum, raw_buffer))
1158b725ae77Skettenis {
1159b725ae77Skettenis printf_filtered ("[invalid]");
1160b725ae77Skettenis return;
1161b725ae77Skettenis }
1162b725ae77Skettenis else
1163b725ae77Skettenis {
1164b725ae77Skettenis int byte;
1165b725ae77Skettenis if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
1166b725ae77Skettenis {
1167*11efff7fSkettenis for (byte = register_size (current_gdbarch, regnum) - DEPRECATED_REGISTER_VIRTUAL_SIZE (regnum);
1168*11efff7fSkettenis byte < register_size (current_gdbarch, regnum);
1169b725ae77Skettenis byte++)
1170b725ae77Skettenis printf_filtered ("%02x", (unsigned char) raw_buffer[byte]);
1171b725ae77Skettenis }
1172b725ae77Skettenis else
1173b725ae77Skettenis {
1174b725ae77Skettenis for (byte = DEPRECATED_REGISTER_VIRTUAL_SIZE (regnum) - 1;
1175b725ae77Skettenis byte >= 0;
1176b725ae77Skettenis byte--)
1177b725ae77Skettenis printf_filtered ("%02x", (unsigned char) raw_buffer[byte]);
1178b725ae77Skettenis }
1179b725ae77Skettenis }
1180b725ae77Skettenis }
1181b725ae77Skettenis
1182b725ae77Skettenis static void
mn10300_do_registers_info(int regnum,int fpregs)1183b725ae77Skettenis mn10300_do_registers_info (int regnum, int fpregs)
1184b725ae77Skettenis {
1185b725ae77Skettenis if (regnum >= 0)
1186b725ae77Skettenis {
1187b725ae77Skettenis const char *name = REGISTER_NAME (regnum);
1188b725ae77Skettenis if (name == NULL || name[0] == '\0')
1189b725ae77Skettenis error ("Not a valid register for the current processor type");
1190b725ae77Skettenis mn10300_print_register (name, regnum, 0);
1191b725ae77Skettenis printf_filtered ("\n");
1192b725ae77Skettenis }
1193b725ae77Skettenis else
1194b725ae77Skettenis {
1195b725ae77Skettenis /* print registers in an array 4x8 */
1196b725ae77Skettenis int r;
1197b725ae77Skettenis int reg;
1198b725ae77Skettenis const int nr_in_row = 4;
1199b725ae77Skettenis const int reg_width = 4;
1200b725ae77Skettenis for (r = 0; r < NUM_REGS; r += nr_in_row)
1201b725ae77Skettenis {
1202b725ae77Skettenis int c;
1203b725ae77Skettenis int printing = 0;
1204b725ae77Skettenis int padding = 0;
1205b725ae77Skettenis for (c = r; c < r + nr_in_row; c++)
1206b725ae77Skettenis {
1207b725ae77Skettenis const char *name = REGISTER_NAME (c);
1208b725ae77Skettenis if (name != NULL && *name != '\0')
1209b725ae77Skettenis {
1210b725ae77Skettenis printing = 1;
1211b725ae77Skettenis while (padding > 0)
1212b725ae77Skettenis {
1213b725ae77Skettenis printf_filtered (" ");
1214b725ae77Skettenis padding--;
1215b725ae77Skettenis }
1216b725ae77Skettenis mn10300_print_register (name, c, reg_width);
1217b725ae77Skettenis printf_filtered (" ");
1218b725ae77Skettenis }
1219b725ae77Skettenis else
1220b725ae77Skettenis {
1221b725ae77Skettenis padding += (reg_width + 2 + 8 + 1);
1222b725ae77Skettenis }
1223b725ae77Skettenis }
1224b725ae77Skettenis if (printing)
1225b725ae77Skettenis printf_filtered ("\n");
1226b725ae77Skettenis }
1227b725ae77Skettenis }
1228b725ae77Skettenis }
1229b725ae77Skettenis
1230b725ae77Skettenis static CORE_ADDR
mn10300_read_fp(void)1231b725ae77Skettenis mn10300_read_fp (void)
1232b725ae77Skettenis {
1233b725ae77Skettenis /* That's right, we're using the stack pointer as our frame pointer. */
1234b725ae77Skettenis gdb_assert (SP_REGNUM >= 0);
1235b725ae77Skettenis return read_register (SP_REGNUM);
1236b725ae77Skettenis }
1237b725ae77Skettenis
1238b725ae77Skettenis /* Dump out the mn10300 speciic architecture information. */
1239b725ae77Skettenis
1240b725ae77Skettenis static void
mn10300_dump_tdep(struct gdbarch * current_gdbarch,struct ui_file * file)1241b725ae77Skettenis mn10300_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
1242b725ae77Skettenis {
1243b725ae77Skettenis struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1244b725ae77Skettenis fprintf_unfiltered (file, "mn10300_dump_tdep: am33_mode = %d\n",
1245b725ae77Skettenis tdep->am33_mode);
1246b725ae77Skettenis }
1247b725ae77Skettenis
1248b725ae77Skettenis static struct gdbarch *
mn10300_gdbarch_init(struct gdbarch_info info,struct gdbarch_list * arches)1249b725ae77Skettenis mn10300_gdbarch_init (struct gdbarch_info info,
1250b725ae77Skettenis struct gdbarch_list *arches)
1251b725ae77Skettenis {
1252b725ae77Skettenis struct gdbarch *gdbarch;
1253b725ae77Skettenis struct gdbarch_tdep *tdep = NULL;
1254b725ae77Skettenis int am33_mode;
1255b725ae77Skettenis gdbarch_register_name_ftype *register_name;
1256b725ae77Skettenis int mach;
1257b725ae77Skettenis int num_regs;
1258b725ae77Skettenis
1259b725ae77Skettenis arches = gdbarch_list_lookup_by_info (arches, &info);
1260b725ae77Skettenis if (arches != NULL)
1261b725ae77Skettenis return arches->gdbarch;
1262b725ae77Skettenis tdep = xmalloc (sizeof (struct gdbarch_tdep));
1263b725ae77Skettenis gdbarch = gdbarch_alloc (&info, tdep);
1264b725ae77Skettenis
1265b725ae77Skettenis if (info.bfd_arch_info != NULL
1266b725ae77Skettenis && info.bfd_arch_info->arch == bfd_arch_mn10300)
1267b725ae77Skettenis mach = info.bfd_arch_info->mach;
1268b725ae77Skettenis else
1269b725ae77Skettenis mach = 0;
1270b725ae77Skettenis switch (mach)
1271b725ae77Skettenis {
1272b725ae77Skettenis case 0:
1273b725ae77Skettenis case bfd_mach_mn10300:
1274b725ae77Skettenis am33_mode = 0;
1275b725ae77Skettenis register_name = mn10300_generic_register_name;
1276b725ae77Skettenis num_regs = 32;
1277b725ae77Skettenis break;
1278b725ae77Skettenis case bfd_mach_am33:
1279b725ae77Skettenis am33_mode = 1;
1280b725ae77Skettenis register_name = am33_register_name;
1281b725ae77Skettenis num_regs = 32;
1282b725ae77Skettenis break;
1283b725ae77Skettenis default:
1284b725ae77Skettenis internal_error (__FILE__, __LINE__,
1285b725ae77Skettenis "mn10300_gdbarch_init: Unknown mn10300 variant");
1286b725ae77Skettenis return NULL; /* keep GCC happy. */
1287b725ae77Skettenis }
1288b725ae77Skettenis
1289b725ae77Skettenis /* Registers. */
1290b725ae77Skettenis set_gdbarch_num_regs (gdbarch, num_regs);
1291b725ae77Skettenis set_gdbarch_register_name (gdbarch, register_name);
1292b725ae77Skettenis set_gdbarch_deprecated_register_size (gdbarch, 4);
1293b725ae77Skettenis set_gdbarch_deprecated_register_raw_size (gdbarch, mn10300_register_raw_size);
1294b725ae77Skettenis set_gdbarch_deprecated_register_byte (gdbarch, mn10300_register_byte);
1295b725ae77Skettenis set_gdbarch_deprecated_register_virtual_size (gdbarch, mn10300_register_virtual_size);
1296b725ae77Skettenis set_gdbarch_deprecated_register_virtual_type (gdbarch, mn10300_register_virtual_type);
1297b725ae77Skettenis set_gdbarch_dwarf2_reg_to_regnum (gdbarch, mn10300_dwarf2_reg_to_regnum);
1298b725ae77Skettenis set_gdbarch_deprecated_do_registers_info (gdbarch, mn10300_do_registers_info);
1299b725ae77Skettenis set_gdbarch_sp_regnum (gdbarch, 8);
1300b725ae77Skettenis set_gdbarch_pc_regnum (gdbarch, 9);
1301b725ae77Skettenis set_gdbarch_deprecated_fp_regnum (gdbarch, 31);
1302b725ae77Skettenis set_gdbarch_virtual_frame_pointer (gdbarch, mn10300_virtual_frame_pointer);
1303b725ae77Skettenis
1304b725ae77Skettenis /* Breakpoints. */
1305b725ae77Skettenis set_gdbarch_breakpoint_from_pc (gdbarch, mn10300_breakpoint_from_pc);
1306b725ae77Skettenis
1307b725ae77Skettenis /* Stack unwinding. */
1308b725ae77Skettenis set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
1309b725ae77Skettenis set_gdbarch_deprecated_saved_pc_after_call (gdbarch, mn10300_saved_pc_after_call);
1310b725ae77Skettenis set_gdbarch_deprecated_init_extra_frame_info (gdbarch, mn10300_init_extra_frame_info);
1311b725ae77Skettenis set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, mn10300_frame_init_saved_regs);
1312b725ae77Skettenis set_gdbarch_deprecated_frame_chain (gdbarch, mn10300_frame_chain);
1313b725ae77Skettenis set_gdbarch_deprecated_frame_saved_pc (gdbarch, mn10300_frame_saved_pc);
1314*11efff7fSkettenis set_gdbarch_return_value (gdbarch, mn10300_return_value);
1315b725ae77Skettenis set_gdbarch_deprecated_store_struct_return (gdbarch, mn10300_store_struct_return);
1316b725ae77Skettenis set_gdbarch_deprecated_pop_frame (gdbarch, mn10300_pop_frame);
1317b725ae77Skettenis set_gdbarch_skip_prologue (gdbarch, mn10300_skip_prologue);
1318b725ae77Skettenis /* That's right, we're using the stack pointer as our frame pointer. */
1319b725ae77Skettenis set_gdbarch_deprecated_target_read_fp (gdbarch, mn10300_read_fp);
1320b725ae77Skettenis
1321b725ae77Skettenis /* Calling functions in the inferior from GDB. */
1322b725ae77Skettenis set_gdbarch_deprecated_push_arguments (gdbarch, mn10300_push_arguments);
1323b725ae77Skettenis set_gdbarch_deprecated_reg_struct_has_addr
1324b725ae77Skettenis (gdbarch, mn10300_reg_struct_has_addr);
1325b725ae77Skettenis set_gdbarch_deprecated_push_return_address (gdbarch, mn10300_push_return_address);
1326b725ae77Skettenis
1327b725ae77Skettenis tdep->am33_mode = am33_mode;
1328b725ae77Skettenis
1329b725ae77Skettenis /* Should be using push_dummy_call. */
1330b725ae77Skettenis set_gdbarch_deprecated_dummy_write_sp (gdbarch, deprecated_write_sp);
1331b725ae77Skettenis
1332b725ae77Skettenis set_gdbarch_print_insn (gdbarch, print_insn_mn10300);
1333b725ae77Skettenis
1334b725ae77Skettenis return gdbarch;
1335b725ae77Skettenis }
1336b725ae77Skettenis
1337b725ae77Skettenis void
_initialize_mn10300_tdep(void)1338b725ae77Skettenis _initialize_mn10300_tdep (void)
1339b725ae77Skettenis {
1340b725ae77Skettenis /* printf("_initialize_mn10300_tdep\n"); */
1341b725ae77Skettenis gdbarch_register (bfd_arch_mn10300, mn10300_gdbarch_init, mn10300_dump_tdep);
1342b725ae77Skettenis }
1343