xref: /openbsd-src/gnu/usr.bin/binutils/gdb/mcore-tdep.c (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
1b725ae77Skettenis /* Target-machine dependent code for Motorola MCore for GDB, the GNU debugger
2b725ae77Skettenis 
3b725ae77Skettenis    Copyright 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, Boston, MA 02111-1307, USA.  */
21b725ae77Skettenis 
22b725ae77Skettenis #include "defs.h"
23b725ae77Skettenis #include "frame.h"
24b725ae77Skettenis #include "symtab.h"
25b725ae77Skettenis #include "value.h"
26b725ae77Skettenis #include "gdbcmd.h"
27b725ae77Skettenis #include "regcache.h"
28b725ae77Skettenis #include "objfiles.h"
29b725ae77Skettenis #include "gdbcore.h"
30b725ae77Skettenis #include "inferior.h"
31b725ae77Skettenis #include "arch-utils.h"
32b725ae77Skettenis #include "gdb_string.h"
33b725ae77Skettenis #include "disasm.h"
34b725ae77Skettenis #include "dis-asm.h"
35b725ae77Skettenis 
36b725ae77Skettenis static CORE_ADDR mcore_analyze_prologue (struct frame_info *fi, CORE_ADDR pc,
37b725ae77Skettenis 					 int skip_prologue);
38b725ae77Skettenis static int get_insn (CORE_ADDR pc);
39b725ae77Skettenis 
40b725ae77Skettenis #ifdef MCORE_DEBUG
41b725ae77Skettenis int mcore_debug = 0;
42b725ae77Skettenis #endif
43b725ae77Skettenis 
44b725ae77Skettenis 
45b725ae77Skettenis /* All registers are 4 bytes long.  */
46b725ae77Skettenis #define MCORE_REG_SIZE 4
47b725ae77Skettenis #define MCORE_NUM_REGS 65
48b725ae77Skettenis 
49b725ae77Skettenis /* Some useful register numbers.  */
50b725ae77Skettenis #define PR_REGNUM 15
51b725ae77Skettenis #define FIRST_ARGREG 2
52b725ae77Skettenis #define LAST_ARGREG 7
53b725ae77Skettenis #define RETVAL_REGNUM 2
54b725ae77Skettenis 
55b725ae77Skettenis 
56b725ae77Skettenis /* Additional info that we use for managing frames */
57b725ae77Skettenis struct frame_extra_info
58b725ae77Skettenis   {
59b725ae77Skettenis     /* A generic status word */
60b725ae77Skettenis     int status;
61b725ae77Skettenis 
62b725ae77Skettenis     /* Size of this frame */
63b725ae77Skettenis     int framesize;
64b725ae77Skettenis 
65b725ae77Skettenis     /* The register that is acting as a frame pointer, if
66b725ae77Skettenis        it is being used.  This is undefined if status
67b725ae77Skettenis        does not contain the flag MY_FRAME_IN_FP. */
68b725ae77Skettenis     int fp_regnum;
69b725ae77Skettenis   };
70b725ae77Skettenis 
71b725ae77Skettenis /* frame_extra_info status flags */
72b725ae77Skettenis 
73b725ae77Skettenis /* The base of the current frame is actually in the stack pointer.
74b725ae77Skettenis    This happens when there is no frame pointer (MCore ABI does not
75b725ae77Skettenis    require a frame pointer) or when we're stopped in the prologue or
76b725ae77Skettenis    epilogue itself.  In these cases, mcore_analyze_prologue will need
77b725ae77Skettenis    to update fi->frame before returning or analyzing the register
78b725ae77Skettenis    save instructions. */
79b725ae77Skettenis #define MY_FRAME_IN_SP 0x1
80b725ae77Skettenis 
81b725ae77Skettenis /* The base of the current frame is in a frame pointer register.
82b725ae77Skettenis    This register is noted in frame_extra_info->fp_regnum.
83b725ae77Skettenis 
84b725ae77Skettenis    Note that the existence of an FP might also indicate that the
85b725ae77Skettenis    function has called alloca. */
86b725ae77Skettenis #define MY_FRAME_IN_FP 0x2
87b725ae77Skettenis 
88b725ae77Skettenis /* This flag is set to indicate that this frame is the top-most
89b725ae77Skettenis    frame. This tells frame chain not to bother trying to unwind
90b725ae77Skettenis    beyond this frame. */
91b725ae77Skettenis #define NO_MORE_FRAMES 0x4
92b725ae77Skettenis 
93b725ae77Skettenis /* Instruction macros used for analyzing the prologue */
94b725ae77Skettenis #define IS_SUBI0(x)   (((x) & 0xfe0f) == 0x2400)	/* subi r0,oimm5    */
95b725ae77Skettenis #define IS_STM(x)     (((x) & 0xfff0) == 0x0070)	/* stm rf-r15,r0    */
96b725ae77Skettenis #define IS_STWx0(x)   (((x) & 0xf00f) == 0x9000)	/* stw rz,(r0,disp) */
97b725ae77Skettenis #define IS_STWxy(x)   (((x) & 0xf000) == 0x9000)	/* stw rx,(ry,disp) */
98b725ae77Skettenis #define IS_MOVx0(x)   (((x) & 0xfff0) == 0x1200)	/* mov rn,r0        */
99b725ae77Skettenis #define IS_LRW1(x)    (((x) & 0xff00) == 0x7100)	/* lrw r1,literal   */
100b725ae77Skettenis #define IS_MOVI1(x)   (((x) & 0xf80f) == 0x6001)	/* movi r1,imm7     */
101b725ae77Skettenis #define IS_BGENI1(x)  (((x) & 0xfe0f) == 0x3201)	/* bgeni r1,imm5    */
102b725ae77Skettenis #define IS_BMASKI1(x) (((x) & 0xfe0f) == 0x2C01)	/* bmaski r1,imm5   */
103b725ae77Skettenis #define IS_ADDI1(x)   (((x) & 0xfe0f) == 0x2001)	/* addi r1,oimm5    */
104b725ae77Skettenis #define IS_SUBI1(x)   (((x) & 0xfe0f) == 0x2401)	/* subi r1,oimm5    */
105b725ae77Skettenis #define IS_RSUBI1(x)  (((x) & 0xfe0f) == 0x2801)	/* rsubi r1,imm5    */
106b725ae77Skettenis #define IS_NOT1(x)    (((x) & 0xffff) == 0x01f1)	/* not r1           */
107b725ae77Skettenis #define IS_ROTLI1(x)  (((x) & 0xfe0f) == 0x3801)	/* rotli r1,imm5    */
108b725ae77Skettenis #define IS_BSETI1(x)  (((x) & 0xfe0f) == 0x3401)	/* bseti r1,imm5    */
109b725ae77Skettenis #define IS_BCLRI1(x)  (((x) & 0xfe0f) == 0x3001)	/* bclri r1,imm5    */
110b725ae77Skettenis #define IS_IXH1(x)    (((x) & 0xffff) == 0x1d11)	/* ixh r1,r1        */
111b725ae77Skettenis #define IS_IXW1(x)    (((x) & 0xffff) == 0x1511)	/* ixw r1,r1        */
112b725ae77Skettenis #define IS_SUB01(x)   (((x) & 0xffff) == 0x0510)	/* subu r0,r1       */
113b725ae77Skettenis #define IS_RTS(x)     (((x) & 0xffff) == 0x00cf)	/* jmp r15          */
114b725ae77Skettenis 
115b725ae77Skettenis #define IS_R1_ADJUSTER(x) \
116b725ae77Skettenis     (IS_ADDI1(x) || IS_SUBI1(x) || IS_ROTLI1(x) || IS_BSETI1(x) \
117b725ae77Skettenis      || IS_BCLRI1(x) || IS_RSUBI1(x) || IS_NOT1(x) \
118b725ae77Skettenis      || IS_IXH1(x) || IS_IXW1(x))
119b725ae77Skettenis 
120b725ae77Skettenis 
121b725ae77Skettenis #ifdef MCORE_DEBUG
122b725ae77Skettenis static void
mcore_dump_insn(char * commnt,CORE_ADDR pc,int insn)123b725ae77Skettenis mcore_dump_insn (char *commnt, CORE_ADDR pc, int insn)
124b725ae77Skettenis {
125b725ae77Skettenis   if (mcore_debug)
126b725ae77Skettenis     {
127b725ae77Skettenis       printf_filtered ("MCORE:  %s %08x %08x ",
128b725ae77Skettenis 		       commnt, (unsigned int) pc, (unsigned int) insn);
129b725ae77Skettenis       gdb_print_insn (pc, gdb_stdout);
130b725ae77Skettenis       printf_filtered ("\n");
131b725ae77Skettenis     }
132b725ae77Skettenis }
133b725ae77Skettenis #define mcore_insn_debug(args) { if (mcore_debug) printf_filtered args; }
134b725ae77Skettenis #else /* !MCORE_DEBUG */
135b725ae77Skettenis #define mcore_dump_insn(a,b,c) {}
136b725ae77Skettenis #define mcore_insn_debug(args) {}
137b725ae77Skettenis #endif
138b725ae77Skettenis 
139b725ae77Skettenis 
140b725ae77Skettenis static struct type *
mcore_register_virtual_type(int regnum)141b725ae77Skettenis mcore_register_virtual_type (int regnum)
142b725ae77Skettenis {
143b725ae77Skettenis   if (regnum < 0 || regnum >= MCORE_NUM_REGS)
144b725ae77Skettenis     internal_error (__FILE__, __LINE__,
145b725ae77Skettenis 		    "mcore_register_virtual_type: illegal register number %d",
146b725ae77Skettenis 		    regnum);
147b725ae77Skettenis   else
148b725ae77Skettenis     return builtin_type_int;
149b725ae77Skettenis }
150b725ae77Skettenis 
151b725ae77Skettenis static int
mcore_register_byte(int regnum)152b725ae77Skettenis mcore_register_byte (int regnum)
153b725ae77Skettenis {
154b725ae77Skettenis   if (regnum < 0 || regnum >= MCORE_NUM_REGS)
155b725ae77Skettenis     internal_error (__FILE__, __LINE__,
156b725ae77Skettenis 		    "mcore_register_byte: illegal register number %d",
157b725ae77Skettenis 		    regnum);
158b725ae77Skettenis   else
159b725ae77Skettenis     return (regnum * MCORE_REG_SIZE);
160b725ae77Skettenis }
161b725ae77Skettenis 
162b725ae77Skettenis static int
mcore_register_size(int regnum)163b725ae77Skettenis mcore_register_size (int regnum)
164b725ae77Skettenis {
165b725ae77Skettenis 
166b725ae77Skettenis   if (regnum < 0 || regnum >= MCORE_NUM_REGS)
167b725ae77Skettenis     internal_error (__FILE__, __LINE__,
168b725ae77Skettenis 		    "mcore_register_size: illegal register number %d",
169b725ae77Skettenis 		    regnum);
170b725ae77Skettenis   else
171b725ae77Skettenis     return MCORE_REG_SIZE;
172b725ae77Skettenis }
173b725ae77Skettenis 
174b725ae77Skettenis /* The registers of the Motorola MCore processors */
175b725ae77Skettenis 
176b725ae77Skettenis static const char *
mcore_register_name(int regnum)177b725ae77Skettenis mcore_register_name (int regnum)
178b725ae77Skettenis {
179b725ae77Skettenis 
180b725ae77Skettenis   static char *register_names[] = {
181b725ae77Skettenis     "r0",   "r1",  "r2",    "r3",   "r4",   "r5",   "r6",   "r7",
182b725ae77Skettenis     "r8",   "r9",  "r10",   "r11",  "r12",  "r13",  "r14",  "r15",
183b725ae77Skettenis     "ar0",  "ar1", "ar2",   "ar3",  "ar4",  "ar5",  "ar6",  "ar7",
184b725ae77Skettenis     "ar8",  "ar9", "ar10", "ar11",  "ar12", "ar13", "ar14", "ar15",
185b725ae77Skettenis     "psr",  "vbr", "epsr",  "fpsr", "epc",  "fpc",  "ss0",  "ss1",
186b725ae77Skettenis     "ss2",  "ss3", "ss4",   "gcr",  "gsr",  "cr13", "cr14", "cr15",
187b725ae77Skettenis     "cr16", "cr17", "cr18", "cr19", "cr20", "cr21", "cr22", "cr23",
188b725ae77Skettenis     "cr24", "cr25", "cr26", "cr27", "cr28", "cr29", "cr30", "cr31",
189b725ae77Skettenis     "pc"
190b725ae77Skettenis   };
191b725ae77Skettenis 
192b725ae77Skettenis   if (regnum < 0 ||
193b725ae77Skettenis       regnum >= sizeof (register_names) / sizeof (register_names[0]))
194b725ae77Skettenis     internal_error (__FILE__, __LINE__,
195b725ae77Skettenis 		    "mcore_register_name: illegal register number %d",
196b725ae77Skettenis 		    regnum);
197b725ae77Skettenis   else
198b725ae77Skettenis     return register_names[regnum];
199b725ae77Skettenis }
200b725ae77Skettenis 
201b725ae77Skettenis /* Given the address at which to insert a breakpoint (BP_ADDR),
202b725ae77Skettenis    what will that breakpoint be?
203b725ae77Skettenis 
204b725ae77Skettenis    For MCore, we have a breakpoint instruction. Since all MCore
205b725ae77Skettenis    instructions are 16 bits, this is all we need, regardless of
206b725ae77Skettenis    address. bpkt = 0x0000 */
207b725ae77Skettenis 
208b725ae77Skettenis static const unsigned char *
mcore_breakpoint_from_pc(CORE_ADDR * bp_addr,int * bp_size)209b725ae77Skettenis mcore_breakpoint_from_pc (CORE_ADDR * bp_addr, int *bp_size)
210b725ae77Skettenis {
211b725ae77Skettenis   static char breakpoint[] =
212b725ae77Skettenis   {0x00, 0x00};
213b725ae77Skettenis   *bp_size = 2;
214b725ae77Skettenis   return breakpoint;
215b725ae77Skettenis }
216b725ae77Skettenis 
217b725ae77Skettenis static CORE_ADDR
mcore_saved_pc_after_call(struct frame_info * frame)218b725ae77Skettenis mcore_saved_pc_after_call (struct frame_info *frame)
219b725ae77Skettenis {
220b725ae77Skettenis   return read_register (PR_REGNUM);
221b725ae77Skettenis }
222b725ae77Skettenis 
223b725ae77Skettenis /* This is currently handled by init_extra_frame_info.  */
224b725ae77Skettenis static void
mcore_frame_init_saved_regs(struct frame_info * frame)225b725ae77Skettenis mcore_frame_init_saved_regs (struct frame_info *frame)
226b725ae77Skettenis {
227b725ae77Skettenis 
228b725ae77Skettenis }
229b725ae77Skettenis 
230b725ae77Skettenis /* This is currently handled by mcore_push_arguments  */
231b725ae77Skettenis static void
mcore_store_struct_return(CORE_ADDR addr,CORE_ADDR sp)232b725ae77Skettenis mcore_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
233b725ae77Skettenis {
234b725ae77Skettenis 
235b725ae77Skettenis }
236b725ae77Skettenis 
237b725ae77Skettenis static int
mcore_reg_struct_has_addr(int gcc_p,struct type * type)238b725ae77Skettenis mcore_reg_struct_has_addr (int gcc_p, struct type *type)
239b725ae77Skettenis {
240b725ae77Skettenis   return 0;
241b725ae77Skettenis }
242b725ae77Skettenis 
243b725ae77Skettenis 
244b725ae77Skettenis /* Helper function for several routines below.  This funtion simply
245b725ae77Skettenis    sets up a fake, aka dummy, frame (not a _call_ dummy frame) that
246b725ae77Skettenis    we can analyze with mcore_analyze_prologue. */
247b725ae77Skettenis 
248b725ae77Skettenis static struct frame_info *
analyze_dummy_frame(CORE_ADDR pc,CORE_ADDR frame)249b725ae77Skettenis analyze_dummy_frame (CORE_ADDR pc, CORE_ADDR frame)
250b725ae77Skettenis {
251b725ae77Skettenis   struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
252b725ae77Skettenis   struct frame_info *dummy
253b725ae77Skettenis     = deprecated_frame_xmalloc_with_cleanup (SIZEOF_FRAME_SAVED_REGS,
254b725ae77Skettenis 					     sizeof (struct frame_extra_info));
255b725ae77Skettenis   deprecated_update_frame_pc_hack (dummy, pc);
256b725ae77Skettenis   deprecated_update_frame_base_hack (dummy, frame);
257b725ae77Skettenis   get_frame_extra_info (dummy)->status = 0;
258b725ae77Skettenis   get_frame_extra_info (dummy)->framesize = 0;
259b725ae77Skettenis   mcore_analyze_prologue (dummy, 0, 0);
260b725ae77Skettenis   do_cleanups (old_chain);
261b725ae77Skettenis   return dummy;
262b725ae77Skettenis }
263b725ae77Skettenis 
264b725ae77Skettenis /* Function prologues on the Motorola MCore processors consist of:
265b725ae77Skettenis 
266b725ae77Skettenis    - adjustments to the stack pointer (r1 used as scratch register)
267b725ae77Skettenis    - store word/multiples that use r0 as the base address
268b725ae77Skettenis    - making a copy of r0 into another register (a "frame" pointer)
269b725ae77Skettenis 
270b725ae77Skettenis    Note that the MCore really doesn't have a real frame pointer.
271b725ae77Skettenis    Instead, the compiler may copy the SP into a register (usually
272b725ae77Skettenis    r8) to act as an arg pointer.  For our target-dependent purposes,
273b725ae77Skettenis    the frame info's "frame" member will be the beginning of the
274b725ae77Skettenis    frame. The SP could, in fact, point below this.
275b725ae77Skettenis 
276b725ae77Skettenis    The prologue ends when an instruction fails to meet either of
277b725ae77Skettenis    the first two criteria or when an FP is made.  We make a special
278b725ae77Skettenis    exception for gcc. When compiling unoptimized code, gcc will
279b725ae77Skettenis    setup stack slots. We need to make sure that we skip the filling
280b725ae77Skettenis    of these stack slots as much as possible. This is only done
281b725ae77Skettenis    when SKIP_PROLOGUE is set, so that it does not mess up
282b725ae77Skettenis    backtraces. */
283b725ae77Skettenis 
284b725ae77Skettenis /* Analyze the prologue of frame FI to determine where registers are saved,
285b725ae77Skettenis    the end of the prologue, etc. Return the address of the first line
286b725ae77Skettenis    of "real" code (i.e., the end of the prologue). */
287b725ae77Skettenis 
288b725ae77Skettenis static CORE_ADDR
mcore_analyze_prologue(struct frame_info * fi,CORE_ADDR pc,int skip_prologue)289b725ae77Skettenis mcore_analyze_prologue (struct frame_info *fi, CORE_ADDR pc, int skip_prologue)
290b725ae77Skettenis {
291b725ae77Skettenis   CORE_ADDR func_addr, func_end, addr, stop;
292b725ae77Skettenis   CORE_ADDR stack_size;
293b725ae77Skettenis   int insn, rn;
294b725ae77Skettenis   int status;
295b725ae77Skettenis   int fp_regnum = 0; /* dummy, valid when (flags & MY_FRAME_IN_FP) */
296b725ae77Skettenis   int flags;
297b725ae77Skettenis   int framesize;
298b725ae77Skettenis   int register_offsets[NUM_REGS];
299b725ae77Skettenis   char *name;
300b725ae77Skettenis 
301b725ae77Skettenis   /* If provided, use the PC in the frame to look up the
302b725ae77Skettenis      start of this function. */
303b725ae77Skettenis   pc = (fi == NULL ? pc : get_frame_pc (fi));
304b725ae77Skettenis 
305b725ae77Skettenis   /* Find the start of this function. */
306b725ae77Skettenis   status = find_pc_partial_function (pc, &name, &func_addr, &func_end);
307b725ae77Skettenis 
308b725ae77Skettenis   /* If the start of this function could not be found or if the debbuger
309b725ae77Skettenis      is stopped at the first instruction of the prologue, do nothing. */
310b725ae77Skettenis   if (status == 0)
311b725ae77Skettenis     return pc;
312b725ae77Skettenis 
313b725ae77Skettenis   /* If the debugger is entry function, give up. */
314b725ae77Skettenis   if (func_addr == entry_point_address ())
315b725ae77Skettenis     {
316b725ae77Skettenis       if (fi != NULL)
317b725ae77Skettenis 	get_frame_extra_info (fi)->status |= NO_MORE_FRAMES;
318b725ae77Skettenis       return pc;
319b725ae77Skettenis     }
320b725ae77Skettenis 
321b725ae77Skettenis   /* At the start of a function, our frame is in the stack pointer. */
322b725ae77Skettenis   flags = MY_FRAME_IN_SP;
323b725ae77Skettenis 
324b725ae77Skettenis   /* Start decoding the prologue.  We start by checking two special cases:
325b725ae77Skettenis 
326b725ae77Skettenis      1. We're about to return
327b725ae77Skettenis      2. We're at the first insn of the prologue.
328b725ae77Skettenis 
329b725ae77Skettenis      If we're about to return, our frame has already been deallocated.
330b725ae77Skettenis      If we are stopped at the first instruction of a prologue,
331b725ae77Skettenis      then our frame has not yet been set up. */
332b725ae77Skettenis 
333b725ae77Skettenis   /* Get the first insn from memory (all MCore instructions are 16 bits) */
334b725ae77Skettenis   mcore_insn_debug (("MCORE: starting prologue decoding\n"));
335b725ae77Skettenis   insn = get_insn (pc);
336b725ae77Skettenis   mcore_dump_insn ("got 1: ", pc, insn);
337b725ae77Skettenis 
338b725ae77Skettenis   /* Check for return. */
339b725ae77Skettenis   if (fi != NULL && IS_RTS (insn))
340b725ae77Skettenis     {
341b725ae77Skettenis       mcore_insn_debug (("MCORE: got jmp r15"));
342b725ae77Skettenis       if (get_next_frame (fi) == NULL)
343b725ae77Skettenis 	deprecated_update_frame_base_hack (fi, read_sp ());
344b725ae77Skettenis       return get_frame_pc (fi);
345b725ae77Skettenis     }
346b725ae77Skettenis 
347b725ae77Skettenis   /* Check for first insn of prologue */
348b725ae77Skettenis   if (fi != NULL && get_frame_pc (fi) == func_addr)
349b725ae77Skettenis     {
350b725ae77Skettenis       if (get_next_frame (fi) == NULL)
351b725ae77Skettenis 	deprecated_update_frame_base_hack (fi, read_sp ());
352b725ae77Skettenis       return get_frame_pc (fi);
353b725ae77Skettenis     }
354b725ae77Skettenis 
355b725ae77Skettenis   /* Figure out where to stop scanning */
356b725ae77Skettenis   stop = (fi ? get_frame_pc (fi) : func_end);
357b725ae77Skettenis 
358b725ae77Skettenis   /* Don't walk off the end of the function */
359b725ae77Skettenis   stop = (stop > func_end ? func_end : stop);
360b725ae77Skettenis 
361b725ae77Skettenis   /* REGISTER_OFFSETS will contain offsets, from the top of the frame
362b725ae77Skettenis      (NOT the frame pointer), for the various saved registers or -1
363b725ae77Skettenis      if the register is not saved. */
364b725ae77Skettenis   for (rn = 0; rn < NUM_REGS; rn++)
365b725ae77Skettenis     register_offsets[rn] = -1;
366b725ae77Skettenis 
367b725ae77Skettenis   /* Analyze the prologue. Things we determine from analyzing the
368b725ae77Skettenis      prologue include:
369b725ae77Skettenis      * the size of the frame
370b725ae77Skettenis      * where saved registers are located (and which are saved)
371b725ae77Skettenis      * FP used? */
372b725ae77Skettenis   mcore_insn_debug (("MCORE: Scanning prologue: func_addr=0x%x, stop=0x%x\n",
373b725ae77Skettenis 		     (unsigned int) func_addr, (unsigned int) stop));
374b725ae77Skettenis 
375b725ae77Skettenis   framesize = 0;
376b725ae77Skettenis   for (addr = func_addr; addr < stop; addr += 2)
377b725ae77Skettenis     {
378b725ae77Skettenis       /* Get next insn */
379b725ae77Skettenis       insn = get_insn (addr);
380b725ae77Skettenis       mcore_dump_insn ("got 2: ", addr, insn);
381b725ae77Skettenis 
382b725ae77Skettenis       if (IS_SUBI0 (insn))
383b725ae77Skettenis 	{
384b725ae77Skettenis 	  int offset = 1 + ((insn >> 4) & 0x1f);
385b725ae77Skettenis 	  mcore_insn_debug (("MCORE: got subi r0,%d; continuing\n", offset));
386b725ae77Skettenis 	  framesize += offset;
387b725ae77Skettenis 	  continue;
388b725ae77Skettenis 	}
389b725ae77Skettenis       else if (IS_STM (insn))
390b725ae77Skettenis 	{
391b725ae77Skettenis 	  /* Spill register(s) */
392b725ae77Skettenis 	  int offset;
393b725ae77Skettenis 	  int start_register;
394b725ae77Skettenis 
395b725ae77Skettenis 	  /* BIG WARNING! The MCore ABI does not restrict functions
396b725ae77Skettenis 	     to taking only one stack allocation. Therefore, when
397b725ae77Skettenis 	     we save a register, we record the offset of where it was
398b725ae77Skettenis 	     saved relative to the current framesize. This will
399b725ae77Skettenis 	     then give an offset from the SP upon entry to our
400b725ae77Skettenis 	     function. Remember, framesize is NOT constant until
401b725ae77Skettenis 	     we're done scanning the prologue. */
402b725ae77Skettenis 	  start_register = (insn & 0xf);
403b725ae77Skettenis 	  mcore_insn_debug (("MCORE: got stm r%d-r15,(r0)\n", start_register));
404b725ae77Skettenis 
405b725ae77Skettenis 	  for (rn = start_register, offset = 0; rn <= 15; rn++, offset += 4)
406b725ae77Skettenis 	    {
407b725ae77Skettenis 	      register_offsets[rn] = framesize - offset;
408b725ae77Skettenis 	      mcore_insn_debug (("MCORE: r%d saved at 0x%x (offset %d)\n", rn,
409b725ae77Skettenis 				 register_offsets[rn], offset));
410b725ae77Skettenis 	    }
411b725ae77Skettenis 	  mcore_insn_debug (("MCORE: continuing\n"));
412b725ae77Skettenis 	  continue;
413b725ae77Skettenis 	}
414b725ae77Skettenis       else if (IS_STWx0 (insn))
415b725ae77Skettenis 	{
416b725ae77Skettenis 	  /* Spill register: see note for IS_STM above. */
417b725ae77Skettenis 	  int imm;
418b725ae77Skettenis 
419b725ae77Skettenis 	  rn = (insn >> 8) & 0xf;
420b725ae77Skettenis 	  imm = (insn >> 4) & 0xf;
421b725ae77Skettenis 	  register_offsets[rn] = framesize - (imm << 2);
422b725ae77Skettenis 	  mcore_insn_debug (("MCORE: r%d saved at offset 0x%x\n", rn, register_offsets[rn]));
423b725ae77Skettenis 	  mcore_insn_debug (("MCORE: continuing\n"));
424b725ae77Skettenis 	  continue;
425b725ae77Skettenis 	}
426b725ae77Skettenis       else if (IS_MOVx0 (insn))
427b725ae77Skettenis 	{
428b725ae77Skettenis 	  /* We have a frame pointer, so this prologue is over.  Note
429b725ae77Skettenis 	     the register which is acting as the frame pointer. */
430b725ae77Skettenis 	  flags |= MY_FRAME_IN_FP;
431b725ae77Skettenis 	  flags &= ~MY_FRAME_IN_SP;
432b725ae77Skettenis 	  fp_regnum = insn & 0xf;
433b725ae77Skettenis 	  mcore_insn_debug (("MCORE: Found a frame pointer: r%d\n", fp_regnum));
434b725ae77Skettenis 
435b725ae77Skettenis 	  /* If we found an FP, we're at the end of the prologue. */
436b725ae77Skettenis 	  mcore_insn_debug (("MCORE: end of prologue\n"));
437b725ae77Skettenis 	  if (skip_prologue)
438b725ae77Skettenis 	    continue;
439b725ae77Skettenis 
440b725ae77Skettenis 	  /* If we're decoding prologue, stop here. */
441b725ae77Skettenis 	  addr += 2;
442b725ae77Skettenis 	  break;
443b725ae77Skettenis 	}
444b725ae77Skettenis       else if (IS_STWxy (insn) && (flags & MY_FRAME_IN_FP) && ((insn & 0xf) == fp_regnum))
445b725ae77Skettenis 	{
446b725ae77Skettenis 	  /* Special case. Skip over stack slot allocs, too. */
447b725ae77Skettenis 	  mcore_insn_debug (("MCORE: push arg onto stack.\n"));
448b725ae77Skettenis 	  continue;
449b725ae77Skettenis 	}
450b725ae77Skettenis       else if (IS_LRW1 (insn) || IS_MOVI1 (insn)
451b725ae77Skettenis 	       || IS_BGENI1 (insn) || IS_BMASKI1 (insn))
452b725ae77Skettenis 	{
453b725ae77Skettenis 	  int adjust = 0;
454b725ae77Skettenis 	  int offset = 0;
455b725ae77Skettenis 	  int insn2;
456b725ae77Skettenis 
457b725ae77Skettenis 	  mcore_insn_debug (("MCORE: looking at large frame\n"));
458b725ae77Skettenis 	  if (IS_LRW1 (insn))
459b725ae77Skettenis 	    {
460b725ae77Skettenis 	      adjust =
461b725ae77Skettenis 		read_memory_integer ((addr + 2 + ((insn & 0xff) << 2)) & 0xfffffffc, 4);
462b725ae77Skettenis 	    }
463b725ae77Skettenis 	  else if (IS_MOVI1 (insn))
464b725ae77Skettenis 	    adjust = (insn >> 4) & 0x7f;
465b725ae77Skettenis 	  else if (IS_BGENI1 (insn))
466b725ae77Skettenis 	    adjust = 1 << ((insn >> 4) & 0x1f);
467b725ae77Skettenis 	  else			/* IS_BMASKI (insn) */
468b725ae77Skettenis 	    adjust = (1 << (adjust >> 4) & 0x1f) - 1;
469b725ae77Skettenis 
470b725ae77Skettenis 	  mcore_insn_debug (("MCORE: base framesize=0x%x\n", adjust));
471b725ae77Skettenis 
472b725ae77Skettenis 	  /* May have zero or more insns which modify r1 */
473b725ae77Skettenis 	  mcore_insn_debug (("MCORE: looking for r1 adjusters...\n"));
474b725ae77Skettenis 	  offset = 2;
475b725ae77Skettenis 	  insn2 = get_insn (addr + offset);
476b725ae77Skettenis 	  while (IS_R1_ADJUSTER (insn2))
477b725ae77Skettenis 	    {
478b725ae77Skettenis 	      int imm;
479b725ae77Skettenis 
480b725ae77Skettenis 	      imm = (insn2 >> 4) & 0x1f;
481b725ae77Skettenis 	      mcore_dump_insn ("got 3: ", addr + offset, insn);
482b725ae77Skettenis 	      if (IS_ADDI1 (insn2))
483b725ae77Skettenis 		{
484b725ae77Skettenis 		  adjust += (imm + 1);
485b725ae77Skettenis 		  mcore_insn_debug (("MCORE: addi r1,%d\n", imm + 1));
486b725ae77Skettenis 		}
487b725ae77Skettenis 	      else if (IS_SUBI1 (insn2))
488b725ae77Skettenis 		{
489b725ae77Skettenis 		  adjust -= (imm + 1);
490b725ae77Skettenis 		  mcore_insn_debug (("MCORE: subi r1,%d\n", imm + 1));
491b725ae77Skettenis 		}
492b725ae77Skettenis 	      else if (IS_RSUBI1 (insn2))
493b725ae77Skettenis 		{
494b725ae77Skettenis 		  adjust = imm - adjust;
495b725ae77Skettenis 		  mcore_insn_debug (("MCORE: rsubi r1,%d\n", imm + 1));
496b725ae77Skettenis 		}
497b725ae77Skettenis 	      else if (IS_NOT1 (insn2))
498b725ae77Skettenis 		{
499b725ae77Skettenis 		  adjust = ~adjust;
500b725ae77Skettenis 		  mcore_insn_debug (("MCORE: not r1\n"));
501b725ae77Skettenis 		}
502b725ae77Skettenis 	      else if (IS_ROTLI1 (insn2))
503b725ae77Skettenis 		{
504b725ae77Skettenis 		  adjust <<= imm;
505b725ae77Skettenis 		  mcore_insn_debug (("MCORE: rotli r1,%d\n", imm + 1));
506b725ae77Skettenis 		}
507b725ae77Skettenis 	      else if (IS_BSETI1 (insn2))
508b725ae77Skettenis 		{
509b725ae77Skettenis 		  adjust |= (1 << imm);
510b725ae77Skettenis 		  mcore_insn_debug (("MCORE: bseti r1,%d\n", imm));
511b725ae77Skettenis 		}
512b725ae77Skettenis 	      else if (IS_BCLRI1 (insn2))
513b725ae77Skettenis 		{
514b725ae77Skettenis 		  adjust &= ~(1 << imm);
515b725ae77Skettenis 		  mcore_insn_debug (("MCORE: bclri r1,%d\n", imm));
516b725ae77Skettenis 		}
517b725ae77Skettenis 	      else if (IS_IXH1 (insn2))
518b725ae77Skettenis 		{
519b725ae77Skettenis 		  adjust *= 3;
520b725ae77Skettenis 		  mcore_insn_debug (("MCORE: ix.h r1,r1\n"));
521b725ae77Skettenis 		}
522b725ae77Skettenis 	      else if (IS_IXW1 (insn2))
523b725ae77Skettenis 		{
524b725ae77Skettenis 		  adjust *= 5;
525b725ae77Skettenis 		  mcore_insn_debug (("MCORE: ix.w r1,r1\n"));
526b725ae77Skettenis 		}
527b725ae77Skettenis 
528b725ae77Skettenis 	      offset += 2;
529b725ae77Skettenis 	      insn2 = get_insn (addr + offset);
530b725ae77Skettenis 	    };
531b725ae77Skettenis 
532b725ae77Skettenis 	  mcore_insn_debug (("MCORE: done looking for r1 adjusters\n"));
533b725ae77Skettenis 
534b725ae77Skettenis 	  /* If the next insn adjusts the stack pointer, we keep everything;
535b725ae77Skettenis 	     if not, we scrap it and we've found the end of the prologue. */
536b725ae77Skettenis 	  if (IS_SUB01 (insn2))
537b725ae77Skettenis 	    {
538b725ae77Skettenis 	      addr += offset;
539b725ae77Skettenis 	      framesize += adjust;
540b725ae77Skettenis 	      mcore_insn_debug (("MCORE: found stack adjustment of 0x%x bytes.\n", adjust));
541b725ae77Skettenis 	      mcore_insn_debug (("MCORE: skipping to new address 0x%x\n", addr));
542b725ae77Skettenis 	      mcore_insn_debug (("MCORE: continuing\n"));
543b725ae77Skettenis 	      continue;
544b725ae77Skettenis 	    }
545b725ae77Skettenis 
546b725ae77Skettenis 	  /* None of these instructions are prologue, so don't touch
547b725ae77Skettenis 	     anything. */
548b725ae77Skettenis 	  mcore_insn_debug (("MCORE: no subu r1,r0, NOT altering framesize.\n"));
549b725ae77Skettenis 	  break;
550b725ae77Skettenis 	}
551b725ae77Skettenis 
552b725ae77Skettenis       /* This is not a prologue insn, so stop here. */
553b725ae77Skettenis       mcore_insn_debug (("MCORE: insn is not a prologue insn -- ending scan\n"));
554b725ae77Skettenis       break;
555b725ae77Skettenis     }
556b725ae77Skettenis 
557b725ae77Skettenis   mcore_insn_debug (("MCORE: done analyzing prologue\n"));
558b725ae77Skettenis   mcore_insn_debug (("MCORE: prologue end = 0x%x\n", addr));
559b725ae77Skettenis 
560b725ae77Skettenis   /* Save everything we have learned about this frame into FI. */
561b725ae77Skettenis   if (fi != NULL)
562b725ae77Skettenis     {
563b725ae77Skettenis       get_frame_extra_info (fi)->framesize = framesize;
564b725ae77Skettenis       get_frame_extra_info (fi)->fp_regnum = fp_regnum;
565b725ae77Skettenis       get_frame_extra_info (fi)->status = flags;
566b725ae77Skettenis 
567b725ae77Skettenis       /* Fix the frame pointer. When gcc uses r8 as a frame pointer,
568b725ae77Skettenis          it is really an arg ptr. We adjust fi->frame to be a "real"
569b725ae77Skettenis          frame pointer. */
570b725ae77Skettenis       if (get_next_frame (fi) == NULL)
571b725ae77Skettenis 	{
572b725ae77Skettenis 	  if (get_frame_extra_info (fi)->status & MY_FRAME_IN_SP)
573b725ae77Skettenis 	    deprecated_update_frame_base_hack (fi, read_sp () + framesize);
574b725ae77Skettenis 	  else
575b725ae77Skettenis 	    deprecated_update_frame_base_hack (fi, read_register (fp_regnum) + framesize);
576b725ae77Skettenis 	}
577b725ae77Skettenis 
578b725ae77Skettenis       /* Note where saved registers are stored. The offsets in REGISTER_OFFSETS
579b725ae77Skettenis          are computed relative to the top of the frame. */
580b725ae77Skettenis       for (rn = 0; rn < NUM_REGS; rn++)
581b725ae77Skettenis 	{
582b725ae77Skettenis 	  if (register_offsets[rn] >= 0)
583b725ae77Skettenis 	    {
584b725ae77Skettenis 	      deprecated_get_frame_saved_regs (fi)[rn] = get_frame_base (fi) - register_offsets[rn];
585b725ae77Skettenis 	      mcore_insn_debug (("Saved register %s stored at 0x%08x, value=0x%08x\n",
586b725ae77Skettenis 			       mcore_register_names[rn], fi->saved_regs[rn],
587b725ae77Skettenis 			      read_memory_integer (fi->saved_regs[rn], 4)));
588b725ae77Skettenis 	    }
589b725ae77Skettenis 	}
590b725ae77Skettenis     }
591b725ae77Skettenis 
592b725ae77Skettenis   /* Return addr of first non-prologue insn. */
593b725ae77Skettenis   return addr;
594b725ae77Skettenis }
595b725ae77Skettenis 
596b725ae77Skettenis /* Given a GDB frame, determine the address of the calling function's
597b725ae77Skettenis    frame.  This will be used to create a new GDB frame struct, and
598b725ae77Skettenis    then DEPRECATED_INIT_EXTRA_FRAME_INFO and DEPRECATED_INIT_FRAME_PC
599b725ae77Skettenis    will be called for the new frame. */
600b725ae77Skettenis 
601b725ae77Skettenis static CORE_ADDR
mcore_frame_chain(struct frame_info * fi)602b725ae77Skettenis mcore_frame_chain (struct frame_info * fi)
603b725ae77Skettenis {
604b725ae77Skettenis   struct frame_info *dummy;
605b725ae77Skettenis   CORE_ADDR callers_addr;
606b725ae77Skettenis 
607b725ae77Skettenis   /* Analyze the prologue of this function. */
608b725ae77Skettenis   if (get_frame_extra_info (fi)->status == 0)
609b725ae77Skettenis     mcore_analyze_prologue (fi, 0, 0);
610b725ae77Skettenis 
611b725ae77Skettenis   /* If mcore_analyze_prologue set NO_MORE_FRAMES, quit now. */
612b725ae77Skettenis   if (get_frame_extra_info (fi)->status & NO_MORE_FRAMES)
613b725ae77Skettenis     return 0;
614b725ae77Skettenis 
615b725ae77Skettenis   /* Now that we've analyzed our prologue, we can start to ask
616b725ae77Skettenis      for information about our caller. The easiest way to do
617b725ae77Skettenis      this is to analyze our caller's prologue.
618b725ae77Skettenis 
619b725ae77Skettenis      If our caller has a frame pointer, then we need to find
620b725ae77Skettenis      the value of that register upon entry to our frame.
621b725ae77Skettenis      This value is either in fi->saved_regs[rn] if it's saved,
622b725ae77Skettenis      or it's still in a register.
623b725ae77Skettenis 
624b725ae77Skettenis      If our caller does not have a frame pointer, then his frame base
625b725ae77Skettenis      is <our base> + -<caller's frame size>. */
626b725ae77Skettenis   dummy = analyze_dummy_frame (DEPRECATED_FRAME_SAVED_PC (fi), get_frame_base (fi));
627b725ae77Skettenis 
628b725ae77Skettenis   if (get_frame_extra_info (dummy)->status & MY_FRAME_IN_FP)
629b725ae77Skettenis     {
630b725ae77Skettenis       int fp = get_frame_extra_info (dummy)->fp_regnum;
631b725ae77Skettenis 
632b725ae77Skettenis       /* Our caller has a frame pointer. */
633b725ae77Skettenis       if (deprecated_get_frame_saved_regs (fi)[fp] != 0)
634b725ae77Skettenis 	{
635b725ae77Skettenis 	  /* The "FP" was saved on the stack.  Don't forget to adjust
636b725ae77Skettenis 	     the "FP" with the framesize to get a real FP. */
637b725ae77Skettenis 	  callers_addr = read_memory_integer (deprecated_get_frame_saved_regs (fi)[fp],
638b725ae77Skettenis 					      DEPRECATED_REGISTER_SIZE)
639b725ae77Skettenis 	    + get_frame_extra_info (dummy)->framesize;
640b725ae77Skettenis 	}
641b725ae77Skettenis       else
642b725ae77Skettenis 	{
643b725ae77Skettenis 	  /* It's still in the register.  Don't forget to adjust
644b725ae77Skettenis 	     the "FP" with the framesize to get a real FP. */
645b725ae77Skettenis 	  callers_addr = read_register (fp) + get_frame_extra_info (dummy)->framesize;
646b725ae77Skettenis 	}
647b725ae77Skettenis     }
648b725ae77Skettenis   else
649b725ae77Skettenis     {
650b725ae77Skettenis       /* Our caller does not have a frame pointer. */
651b725ae77Skettenis       callers_addr = get_frame_base (fi) + get_frame_extra_info (dummy)->framesize;
652b725ae77Skettenis     }
653b725ae77Skettenis 
654b725ae77Skettenis   return callers_addr;
655b725ae77Skettenis }
656b725ae77Skettenis 
657b725ae77Skettenis /* Skip the prologue of the function at PC. */
658b725ae77Skettenis 
659b725ae77Skettenis static CORE_ADDR
mcore_skip_prologue(CORE_ADDR pc)660b725ae77Skettenis mcore_skip_prologue (CORE_ADDR pc)
661b725ae77Skettenis {
662b725ae77Skettenis   CORE_ADDR func_addr, func_end;
663b725ae77Skettenis   struct symtab_and_line sal;
664b725ae77Skettenis 
665b725ae77Skettenis   /* If we have line debugging information, then the end of the
666b725ae77Skettenis      prologue should be the first assembly instruction of the first
667b725ae77Skettenis      source line */
668b725ae77Skettenis   if (find_pc_partial_function (pc, NULL, &func_addr, &func_end))
669b725ae77Skettenis     {
670b725ae77Skettenis       sal = find_pc_line (func_addr, 0);
671b725ae77Skettenis       if (sal.end && sal.end < func_end)
672b725ae77Skettenis 	return sal.end;
673b725ae77Skettenis     }
674b725ae77Skettenis 
675b725ae77Skettenis   return mcore_analyze_prologue (NULL, pc, 1);
676b725ae77Skettenis }
677b725ae77Skettenis 
678b725ae77Skettenis /* Return the address at which function arguments are offset. */
679b725ae77Skettenis static CORE_ADDR
mcore_frame_args_address(struct frame_info * fi)680b725ae77Skettenis mcore_frame_args_address (struct frame_info * fi)
681b725ae77Skettenis {
682b725ae77Skettenis   return get_frame_base (fi) - get_frame_extra_info (fi)->framesize;
683b725ae77Skettenis }
684b725ae77Skettenis 
685b725ae77Skettenis static CORE_ADDR
mcore_frame_locals_address(struct frame_info * fi)686b725ae77Skettenis mcore_frame_locals_address (struct frame_info * fi)
687b725ae77Skettenis {
688b725ae77Skettenis   return get_frame_base (fi) - get_frame_extra_info (fi)->framesize;
689b725ae77Skettenis }
690b725ae77Skettenis 
691b725ae77Skettenis /* Return the frame pointer in use at address PC. */
692b725ae77Skettenis 
693b725ae77Skettenis static void
mcore_virtual_frame_pointer(CORE_ADDR pc,int * reg,LONGEST * offset)694b725ae77Skettenis mcore_virtual_frame_pointer (CORE_ADDR pc, int *reg, LONGEST *offset)
695b725ae77Skettenis {
696b725ae77Skettenis   struct frame_info *dummy = analyze_dummy_frame (pc, 0);
697b725ae77Skettenis   if (get_frame_extra_info (dummy)->status & MY_FRAME_IN_SP)
698b725ae77Skettenis     {
699b725ae77Skettenis       *reg = SP_REGNUM;
700b725ae77Skettenis       *offset = 0;
701b725ae77Skettenis     }
702b725ae77Skettenis   else
703b725ae77Skettenis     {
704b725ae77Skettenis       *reg = get_frame_extra_info (dummy)->fp_regnum;
705b725ae77Skettenis       *offset = 0;
706b725ae77Skettenis     }
707b725ae77Skettenis }
708b725ae77Skettenis 
709b725ae77Skettenis /* Find the value of register REGNUM in frame FI. */
710b725ae77Skettenis 
711b725ae77Skettenis static CORE_ADDR
mcore_find_callers_reg(struct frame_info * fi,int regnum)712b725ae77Skettenis mcore_find_callers_reg (struct frame_info *fi, int regnum)
713b725ae77Skettenis {
714b725ae77Skettenis   for (; fi != NULL; fi = get_next_frame (fi))
715b725ae77Skettenis     {
716*11efff7fSkettenis       if (deprecated_pc_in_call_dummy (get_frame_pc (fi)))
717b725ae77Skettenis 	return deprecated_read_register_dummy (get_frame_pc (fi),
718b725ae77Skettenis 					       get_frame_base (fi), regnum);
719b725ae77Skettenis       else if (deprecated_get_frame_saved_regs (fi)[regnum] != 0)
720b725ae77Skettenis 	return read_memory_integer (deprecated_get_frame_saved_regs (fi)[regnum],
721b725ae77Skettenis 				    DEPRECATED_REGISTER_SIZE);
722b725ae77Skettenis     }
723b725ae77Skettenis 
724b725ae77Skettenis   return read_register (regnum);
725b725ae77Skettenis }
726b725ae77Skettenis 
727b725ae77Skettenis /* Find the saved pc in frame FI. */
728b725ae77Skettenis 
729b725ae77Skettenis static CORE_ADDR
mcore_frame_saved_pc(struct frame_info * fi)730b725ae77Skettenis mcore_frame_saved_pc (struct frame_info * fi)
731b725ae77Skettenis {
732b725ae77Skettenis 
733*11efff7fSkettenis   if (deprecated_pc_in_call_dummy (get_frame_pc (fi)))
734b725ae77Skettenis     return deprecated_read_register_dummy (get_frame_pc (fi),
735b725ae77Skettenis 					   get_frame_base (fi), PC_REGNUM);
736b725ae77Skettenis   else
737b725ae77Skettenis     return mcore_find_callers_reg (fi, PR_REGNUM);
738b725ae77Skettenis }
739b725ae77Skettenis 
740b725ae77Skettenis /* INFERIOR FUNCTION CALLS */
741b725ae77Skettenis 
742b725ae77Skettenis /* This routine gets called when either the user uses the "return"
743b725ae77Skettenis    command, or the call dummy breakpoint gets hit. */
744b725ae77Skettenis 
745b725ae77Skettenis static void
mcore_pop_frame(void)746b725ae77Skettenis mcore_pop_frame (void)
747b725ae77Skettenis {
748b725ae77Skettenis   int rn;
749b725ae77Skettenis   struct frame_info *fi = get_current_frame ();
750b725ae77Skettenis 
751*11efff7fSkettenis   if (deprecated_pc_in_call_dummy (get_frame_pc (fi)))
752*11efff7fSkettenis     deprecated_pop_dummy_frame ();
753b725ae77Skettenis   else
754b725ae77Skettenis     {
755b725ae77Skettenis       /* Write out the PC we saved. */
756b725ae77Skettenis       write_register (PC_REGNUM, DEPRECATED_FRAME_SAVED_PC (fi));
757b725ae77Skettenis 
758b725ae77Skettenis       /* Restore any saved registers. */
759b725ae77Skettenis       for (rn = 0; rn < NUM_REGS; rn++)
760b725ae77Skettenis 	{
761b725ae77Skettenis 	  if (deprecated_get_frame_saved_regs (fi)[rn] != 0)
762b725ae77Skettenis 	    {
763b725ae77Skettenis 	      ULONGEST value;
764b725ae77Skettenis 
765b725ae77Skettenis 	      value = read_memory_unsigned_integer (deprecated_get_frame_saved_regs (fi)[rn],
766b725ae77Skettenis 						    DEPRECATED_REGISTER_SIZE);
767b725ae77Skettenis 	      write_register (rn, value);
768b725ae77Skettenis 	    }
769b725ae77Skettenis 	}
770b725ae77Skettenis 
771b725ae77Skettenis       /* Actually cut back the stack. */
772b725ae77Skettenis       write_register (SP_REGNUM, get_frame_base (fi));
773b725ae77Skettenis     }
774b725ae77Skettenis 
775b725ae77Skettenis   /* Finally, throw away any cached frame information. */
776b725ae77Skettenis   flush_cached_frames ();
777b725ae77Skettenis }
778b725ae77Skettenis 
779b725ae77Skettenis /* Setup arguments and PR for a call to the target. First six arguments
780b725ae77Skettenis    go in FIRST_ARGREG -> LAST_ARGREG, subsequent args go on to the stack.
781b725ae77Skettenis 
782b725ae77Skettenis    - Types with lengths greater than DEPRECATED_REGISTER_SIZE may not
783b725ae77Skettenis    be split between registers and the stack, and they must start in an
784b725ae77Skettenis    even-numbered register. Subsequent args will go onto the stack.
785b725ae77Skettenis 
786b725ae77Skettenis    * Structs may be split between registers and stack, left-aligned.
787b725ae77Skettenis 
788b725ae77Skettenis    * If the function returns a struct which will not fit into registers (it's
789b725ae77Skettenis    more than eight bytes), we must allocate for that, too. Gdb will tell
790b725ae77Skettenis    us where this buffer is (STRUCT_ADDR), and we simply place it into
791b725ae77Skettenis    FIRST_ARGREG, since the MCORE treats struct returns (of less than eight
792b725ae77Skettenis    bytes) as hidden first arguments. */
793b725ae77Skettenis 
794b725ae77Skettenis static CORE_ADDR
mcore_push_arguments(int nargs,struct value ** args,CORE_ADDR sp,int struct_return,CORE_ADDR struct_addr)795b725ae77Skettenis mcore_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
796b725ae77Skettenis 		      int struct_return, CORE_ADDR struct_addr)
797b725ae77Skettenis {
798b725ae77Skettenis   int argreg;
799b725ae77Skettenis   int argnum;
800b725ae77Skettenis   struct stack_arg
801b725ae77Skettenis     {
802b725ae77Skettenis       int len;
803b725ae77Skettenis       char *val;
804b725ae77Skettenis     }
805b725ae77Skettenis    *stack_args;
806b725ae77Skettenis   int nstack_args = 0;
807b725ae77Skettenis 
808b725ae77Skettenis   stack_args = (struct stack_arg *) alloca (nargs * sizeof (struct stack_arg));
809b725ae77Skettenis 
810b725ae77Skettenis   argreg = FIRST_ARGREG;
811b725ae77Skettenis 
812b725ae77Skettenis   /* Align the stack. This is mostly a nop, but not always. It will be needed
813b725ae77Skettenis      if we call a function which has argument overflow. */
814b725ae77Skettenis   sp &= ~3;
815b725ae77Skettenis 
816b725ae77Skettenis   /* If this function returns a struct which does not fit in the
817b725ae77Skettenis      return registers, we must pass a buffer to the function
818b725ae77Skettenis      which it can use to save the return value. */
819b725ae77Skettenis   if (struct_return)
820b725ae77Skettenis     write_register (argreg++, struct_addr);
821b725ae77Skettenis 
822b725ae77Skettenis   /* FIXME: what about unions? */
823b725ae77Skettenis   for (argnum = 0; argnum < nargs; argnum++)
824b725ae77Skettenis     {
825b725ae77Skettenis       char *val = (char *) VALUE_CONTENTS (args[argnum]);
826b725ae77Skettenis       int len = TYPE_LENGTH (VALUE_TYPE (args[argnum]));
827b725ae77Skettenis       struct type *type = VALUE_TYPE (args[argnum]);
828b725ae77Skettenis       int olen;
829b725ae77Skettenis 
830b725ae77Skettenis       mcore_insn_debug (("MCORE PUSH: argreg=%d; len=%d; %s\n",
831b725ae77Skettenis 			 argreg, len, TYPE_CODE (type) == TYPE_CODE_STRUCT ? "struct" : "not struct"));
832b725ae77Skettenis       /* Arguments larger than a register must start in an even
833b725ae77Skettenis          numbered register. */
834b725ae77Skettenis       olen = len;
835b725ae77Skettenis 
836b725ae77Skettenis       if (TYPE_CODE (type) != TYPE_CODE_STRUCT && len > DEPRECATED_REGISTER_SIZE && argreg % 2)
837b725ae77Skettenis 	{
838b725ae77Skettenis 	  mcore_insn_debug (("MCORE PUSH: %d > DEPRECATED_REGISTER_SIZE: and %s is not even\n",
839b725ae77Skettenis 			     len, mcore_register_names[argreg]));
840b725ae77Skettenis 	  argreg++;
841b725ae77Skettenis 	}
842b725ae77Skettenis 
843b725ae77Skettenis       if ((argreg <= LAST_ARGREG && len <= (LAST_ARGREG - argreg + 1) * DEPRECATED_REGISTER_SIZE)
844b725ae77Skettenis 	  || (TYPE_CODE (type) == TYPE_CODE_STRUCT))
845b725ae77Skettenis 	{
846b725ae77Skettenis 	  /* Something that will fit entirely into registers (or a struct
847b725ae77Skettenis 	     which may be split between registers and stack). */
848b725ae77Skettenis 	  mcore_insn_debug (("MCORE PUSH: arg %d going into regs\n", argnum));
849b725ae77Skettenis 
850b725ae77Skettenis 	  if (TYPE_CODE (type) == TYPE_CODE_STRUCT && olen < DEPRECATED_REGISTER_SIZE)
851b725ae77Skettenis 	    {
852b725ae77Skettenis 	      /* Small structs must be right aligned within the register,
853b725ae77Skettenis 	         the most significant bits are undefined. */
854b725ae77Skettenis 	      write_register (argreg, extract_unsigned_integer (val, len));
855b725ae77Skettenis 	      argreg++;
856b725ae77Skettenis 	      len = 0;
857b725ae77Skettenis 	    }
858b725ae77Skettenis 
859b725ae77Skettenis 	  while (len > 0 && argreg <= LAST_ARGREG)
860b725ae77Skettenis 	    {
861b725ae77Skettenis 	      write_register (argreg, extract_unsigned_integer (val, DEPRECATED_REGISTER_SIZE));
862b725ae77Skettenis 	      argreg++;
863b725ae77Skettenis 	      val += DEPRECATED_REGISTER_SIZE;
864b725ae77Skettenis 	      len -= DEPRECATED_REGISTER_SIZE;
865b725ae77Skettenis 	    }
866b725ae77Skettenis 
867b725ae77Skettenis 	  /* Any remainder for the stack is noted below... */
868b725ae77Skettenis 	}
869b725ae77Skettenis       else if (TYPE_CODE (VALUE_TYPE (args[argnum])) != TYPE_CODE_STRUCT
870b725ae77Skettenis 	       && len > DEPRECATED_REGISTER_SIZE)
871b725ae77Skettenis 	{
872b725ae77Skettenis 	  /* All subsequent args go onto the stack. */
873b725ae77Skettenis 	  mcore_insn_debug (("MCORE PUSH: does not fit into regs, going onto stack\n"));
874b725ae77Skettenis 	  argnum = LAST_ARGREG + 1;
875b725ae77Skettenis 	}
876b725ae77Skettenis 
877b725ae77Skettenis       if (len > 0)
878b725ae77Skettenis 	{
879b725ae77Skettenis 	  /* Note that this must be saved onto the stack */
880b725ae77Skettenis 	  mcore_insn_debug (("MCORE PUSH: adding arg %d to stack\n", argnum));
881b725ae77Skettenis 	  stack_args[nstack_args].val = val;
882b725ae77Skettenis 	  stack_args[nstack_args].len = len;
883b725ae77Skettenis 	  nstack_args++;
884b725ae77Skettenis 	}
885b725ae77Skettenis 
886b725ae77Skettenis     }
887b725ae77Skettenis 
888b725ae77Skettenis   /* We're done with registers and stack allocation. Now do the actual
889b725ae77Skettenis      stack pushes. */
890b725ae77Skettenis   while (nstack_args--)
891b725ae77Skettenis     {
892b725ae77Skettenis       sp -= stack_args[nstack_args].len;
893b725ae77Skettenis       write_memory (sp, stack_args[nstack_args].val, stack_args[nstack_args].len);
894b725ae77Skettenis     }
895b725ae77Skettenis 
896b725ae77Skettenis   /* Return adjusted stack pointer.  */
897b725ae77Skettenis   return sp;
898b725ae77Skettenis }
899b725ae77Skettenis 
900b725ae77Skettenis /* Store the return address for the call dummy. For MCore, we've opted
901b725ae77Skettenis    to use generic call dummies, so we simply store the entry-point
902b725ae77Skettenis    address into the PR register (r15). */
903b725ae77Skettenis 
904b725ae77Skettenis static CORE_ADDR
mcore_push_return_address(CORE_ADDR pc,CORE_ADDR sp)905b725ae77Skettenis mcore_push_return_address (CORE_ADDR pc, CORE_ADDR sp)
906b725ae77Skettenis {
907b725ae77Skettenis   write_register (PR_REGNUM, entry_point_address ());
908b725ae77Skettenis   return sp;
909b725ae77Skettenis }
910b725ae77Skettenis 
911b725ae77Skettenis /* Setting/getting return values from functions.
912b725ae77Skettenis 
913b725ae77Skettenis    The Motorola MCore processors use r2/r3 to return anything
914b725ae77Skettenis    not larger than 32 bits. Everything else goes into a caller-
915b725ae77Skettenis    supplied buffer, which is passed in via a hidden first
916b725ae77Skettenis    argument.
917b725ae77Skettenis 
918b725ae77Skettenis    For gdb, this leaves us two routes, based on what
919*11efff7fSkettenis    DEPRECATED_USE_STRUCT_CONVENTION (mcore_use_struct_convention)
920*11efff7fSkettenis    returns.  If this macro returns 1, gdb will call
921*11efff7fSkettenis    STORE_STRUCT_RETURN to store the return value.
922b725ae77Skettenis 
923*11efff7fSkettenis    If DEPRECATED_USE_STRUCT_CONVENTION returns 0, then gdb uses
924b725ae77Skettenis    STORE_RETURN_VALUE and EXTRACT_RETURN_VALUE to store/fetch the
925b725ae77Skettenis    functions return value.  */
926b725ae77Skettenis 
927b725ae77Skettenis static int
mcore_use_struct_convention(int gcc_p,struct type * type)928b725ae77Skettenis mcore_use_struct_convention (int gcc_p, struct type *type)
929b725ae77Skettenis {
930b725ae77Skettenis   return (TYPE_LENGTH (type) > 8);
931b725ae77Skettenis }
932b725ae77Skettenis 
933b725ae77Skettenis /* Given a function which returns a value of type TYPE, extract the
934b725ae77Skettenis    the function's return value and place the result into VALBUF.
935b725ae77Skettenis    REGBUF is the register contents of the target. */
936b725ae77Skettenis 
937b725ae77Skettenis static void
mcore_extract_return_value(struct type * type,char * regbuf,char * valbuf)938b725ae77Skettenis mcore_extract_return_value (struct type *type, char *regbuf, char *valbuf)
939b725ae77Skettenis {
940b725ae77Skettenis   /* Copy the return value (starting) in RETVAL_REGNUM to VALBUF. */
941b725ae77Skettenis   /* Only getting the first byte! if len = 1, we need the last byte of
942b725ae77Skettenis      the register, not the first. */
943b725ae77Skettenis   memcpy (valbuf, regbuf + DEPRECATED_REGISTER_BYTE (RETVAL_REGNUM) +
944b725ae77Skettenis   (TYPE_LENGTH (type) < 4 ? 4 - TYPE_LENGTH (type) : 0), TYPE_LENGTH (type));
945b725ae77Skettenis }
946b725ae77Skettenis 
947b725ae77Skettenis /* Store the return value in VALBUF (of type TYPE) where the caller
948b725ae77Skettenis    expects to see it.
949b725ae77Skettenis 
950b725ae77Skettenis    Values less than 32 bits are stored in r2, right justified and
951b725ae77Skettenis    sign or zero extended.
952b725ae77Skettenis 
953b725ae77Skettenis    Values between 32 and 64 bits are stored in r2 (most
954b725ae77Skettenis    significant word) and r3 (least significant word, left justified).
955b725ae77Skettenis    Note that this includes structures of less than eight bytes, too. */
956b725ae77Skettenis 
957b725ae77Skettenis static void
mcore_store_return_value(struct type * type,char * valbuf)958b725ae77Skettenis mcore_store_return_value (struct type *type, char *valbuf)
959b725ae77Skettenis {
960b725ae77Skettenis   int value_size;
961b725ae77Skettenis   int return_size;
962b725ae77Skettenis   int offset;
963b725ae77Skettenis   char *zeros;
964b725ae77Skettenis 
965b725ae77Skettenis   value_size = TYPE_LENGTH (type);
966b725ae77Skettenis 
967b725ae77Skettenis   /* Return value fits into registers. */
968b725ae77Skettenis   return_size = (value_size + DEPRECATED_REGISTER_SIZE - 1) & ~(DEPRECATED_REGISTER_SIZE - 1);
969b725ae77Skettenis   offset = DEPRECATED_REGISTER_BYTE (RETVAL_REGNUM) + (return_size - value_size);
970b725ae77Skettenis   zeros = alloca (return_size);
971b725ae77Skettenis   memset (zeros, 0, return_size);
972b725ae77Skettenis 
973b725ae77Skettenis   deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (RETVAL_REGNUM), zeros,
974b725ae77Skettenis 				   return_size);
975b725ae77Skettenis   deprecated_write_register_bytes (offset, valbuf, value_size);
976b725ae77Skettenis }
977b725ae77Skettenis 
978b725ae77Skettenis /* Initialize our target-dependent "stuff" for this newly created frame.
979b725ae77Skettenis 
980b725ae77Skettenis    This includes allocating space for saved registers and analyzing
981b725ae77Skettenis    the prologue of this frame. */
982b725ae77Skettenis 
983b725ae77Skettenis static void
mcore_init_extra_frame_info(int fromleaf,struct frame_info * fi)984b725ae77Skettenis mcore_init_extra_frame_info (int fromleaf, struct frame_info *fi)
985b725ae77Skettenis {
986b725ae77Skettenis   if (fi && get_next_frame (fi))
987b725ae77Skettenis     deprecated_update_frame_pc_hack (fi, DEPRECATED_FRAME_SAVED_PC (get_next_frame (fi)));
988b725ae77Skettenis 
989b725ae77Skettenis   frame_saved_regs_zalloc (fi);
990b725ae77Skettenis 
991b725ae77Skettenis   frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
992b725ae77Skettenis   get_frame_extra_info (fi)->status = 0;
993b725ae77Skettenis   get_frame_extra_info (fi)->framesize = 0;
994b725ae77Skettenis 
995*11efff7fSkettenis   if (deprecated_pc_in_call_dummy (get_frame_pc (fi)))
996b725ae77Skettenis     {
997b725ae77Skettenis       /* We need to setup fi->frame here because call_function_by_hand
998b725ae77Skettenis          gets it wrong by assuming it's always FP.  */
999b725ae77Skettenis       deprecated_update_frame_base_hack (fi, deprecated_read_register_dummy (get_frame_pc (fi), get_frame_base (fi), SP_REGNUM));
1000b725ae77Skettenis     }
1001b725ae77Skettenis   else
1002b725ae77Skettenis     mcore_analyze_prologue (fi, 0, 0);
1003b725ae77Skettenis }
1004b725ae77Skettenis 
1005b725ae77Skettenis /* Get an insturction from memory. */
1006b725ae77Skettenis 
1007b725ae77Skettenis static int
get_insn(CORE_ADDR pc)1008b725ae77Skettenis get_insn (CORE_ADDR pc)
1009b725ae77Skettenis {
1010b725ae77Skettenis   char buf[4];
1011*11efff7fSkettenis   int status = deprecated_read_memory_nobpt (pc, buf, 2);
1012b725ae77Skettenis   if (status != 0)
1013b725ae77Skettenis     return 0;
1014b725ae77Skettenis 
1015b725ae77Skettenis   return extract_unsigned_integer (buf, 2);
1016b725ae77Skettenis }
1017b725ae77Skettenis 
1018b725ae77Skettenis static struct gdbarch *
mcore_gdbarch_init(struct gdbarch_info info,struct gdbarch_list * arches)1019b725ae77Skettenis mcore_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
1020b725ae77Skettenis {
1021b725ae77Skettenis   struct gdbarch_tdep *tdep = NULL;
1022b725ae77Skettenis   struct gdbarch *gdbarch;
1023b725ae77Skettenis 
1024b725ae77Skettenis   /* find a candidate among the list of pre-declared architectures. */
1025b725ae77Skettenis   arches = gdbarch_list_lookup_by_info (arches, &info);
1026b725ae77Skettenis   if (arches != NULL)
1027b725ae77Skettenis     return (arches->gdbarch);
1028b725ae77Skettenis 
1029b725ae77Skettenis   gdbarch = gdbarch_alloc (&info, 0);
1030b725ae77Skettenis 
1031b725ae77Skettenis   /* NOTE: cagney/2002-12-06: This can be deleted when this arch is
1032b725ae77Skettenis      ready to unwind the PC first (see frame.c:get_prev_frame()).  */
1033b725ae77Skettenis   set_gdbarch_deprecated_init_frame_pc (gdbarch, deprecated_init_frame_pc_default);
1034b725ae77Skettenis 
1035b725ae77Skettenis   /* Registers: */
1036b725ae77Skettenis 
1037b725ae77Skettenis   /* All registers are 32 bits */
1038b725ae77Skettenis   set_gdbarch_deprecated_register_size (gdbarch, MCORE_REG_SIZE);
1039b725ae77Skettenis   set_gdbarch_register_name (gdbarch, mcore_register_name);
1040b725ae77Skettenis   set_gdbarch_deprecated_register_virtual_type (gdbarch, mcore_register_virtual_type);
1041b725ae77Skettenis   set_gdbarch_deprecated_register_virtual_size (gdbarch, mcore_register_size);
1042b725ae77Skettenis   set_gdbarch_deprecated_register_raw_size (gdbarch, mcore_register_size);
1043b725ae77Skettenis   set_gdbarch_deprecated_register_byte (gdbarch, mcore_register_byte);
1044b725ae77Skettenis   set_gdbarch_num_regs (gdbarch, MCORE_NUM_REGS);
1045b725ae77Skettenis   set_gdbarch_pc_regnum (gdbarch, 64);
1046b725ae77Skettenis   set_gdbarch_sp_regnum (gdbarch, 0);
1047b725ae77Skettenis   set_gdbarch_deprecated_fp_regnum (gdbarch, 0);
1048b725ae77Skettenis 
1049b725ae77Skettenis   /* Call Dummies:  */
1050b725ae77Skettenis 
1051b725ae77Skettenis   set_gdbarch_deprecated_saved_pc_after_call (gdbarch, mcore_saved_pc_after_call);
1052b725ae77Skettenis   set_gdbarch_breakpoint_from_pc (gdbarch, mcore_breakpoint_from_pc);
1053b725ae77Skettenis   set_gdbarch_deprecated_push_return_address (gdbarch, mcore_push_return_address);
1054b725ae77Skettenis   set_gdbarch_deprecated_push_arguments (gdbarch, mcore_push_arguments);
1055b725ae77Skettenis 
1056b725ae77Skettenis   /* Frames:  */
1057b725ae77Skettenis 
1058b725ae77Skettenis   set_gdbarch_deprecated_init_extra_frame_info (gdbarch, mcore_init_extra_frame_info);
1059b725ae77Skettenis   set_gdbarch_deprecated_frame_chain (gdbarch, mcore_frame_chain);
1060b725ae77Skettenis   set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, mcore_frame_init_saved_regs);
1061b725ae77Skettenis   set_gdbarch_deprecated_frame_saved_pc (gdbarch, mcore_frame_saved_pc);
1062b725ae77Skettenis   set_gdbarch_deprecated_store_return_value (gdbarch, mcore_store_return_value);
1063b725ae77Skettenis   set_gdbarch_deprecated_extract_return_value (gdbarch,
1064b725ae77Skettenis 					       mcore_extract_return_value);
1065b725ae77Skettenis   set_gdbarch_deprecated_store_struct_return (gdbarch, mcore_store_struct_return);
1066b725ae77Skettenis   set_gdbarch_skip_prologue (gdbarch, mcore_skip_prologue);
1067b725ae77Skettenis   set_gdbarch_deprecated_frame_args_address (gdbarch, mcore_frame_args_address);
1068b725ae77Skettenis   set_gdbarch_deprecated_frame_locals_address (gdbarch, mcore_frame_locals_address);
1069b725ae77Skettenis   set_gdbarch_deprecated_pop_frame (gdbarch, mcore_pop_frame);
1070b725ae77Skettenis   set_gdbarch_virtual_frame_pointer (gdbarch, mcore_virtual_frame_pointer);
1071b725ae77Skettenis 
1072b725ae77Skettenis   /* Misc.:  */
1073b725ae77Skettenis 
1074b725ae77Skettenis   /* Stack grows down.  */
1075b725ae77Skettenis   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
1076*11efff7fSkettenis   set_gdbarch_deprecated_use_struct_convention (gdbarch, mcore_use_struct_convention);
1077b725ae77Skettenis   set_gdbarch_believe_pcc_promotion (gdbarch, 1);
1078b725ae77Skettenis   /* MCore will never pass a sturcture by reference. It will always be split
1079b725ae77Skettenis      between registers and stack.  */
1080b725ae77Skettenis   set_gdbarch_deprecated_reg_struct_has_addr
1081b725ae77Skettenis     (gdbarch, mcore_reg_struct_has_addr);
1082b725ae77Skettenis 
1083b725ae77Skettenis   /* Should be using push_dummy_call.  */
1084b725ae77Skettenis   set_gdbarch_deprecated_dummy_write_sp (gdbarch, deprecated_write_sp);
1085b725ae77Skettenis 
1086b725ae77Skettenis   set_gdbarch_print_insn (gdbarch, print_insn_mcore);
1087b725ae77Skettenis 
1088b725ae77Skettenis   return gdbarch;
1089b725ae77Skettenis }
1090b725ae77Skettenis 
1091b725ae77Skettenis static void
mcore_dump_tdep(struct gdbarch * current_gdbarch,struct ui_file * file)1092b725ae77Skettenis mcore_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
1093b725ae77Skettenis {
1094b725ae77Skettenis 
1095b725ae77Skettenis }
1096b725ae77Skettenis 
1097b725ae77Skettenis extern initialize_file_ftype _initialize_mcore_tdep; /* -Wmissing-prototypes */
1098b725ae77Skettenis 
1099b725ae77Skettenis void
_initialize_mcore_tdep(void)1100b725ae77Skettenis _initialize_mcore_tdep (void)
1101b725ae77Skettenis {
1102b725ae77Skettenis   gdbarch_register (bfd_arch_mcore, mcore_gdbarch_init, mcore_dump_tdep);
1103b725ae77Skettenis 
1104b725ae77Skettenis #ifdef MCORE_DEBUG
1105*11efff7fSkettenis   deprecated_add_show_from_set
1106*11efff7fSkettenis     (add_set_cmd ("mcoredebug", no_class,
1107b725ae77Skettenis 		  var_boolean, (char *) &mcore_debug,
1108b725ae77Skettenis 		  "Set mcore debugging.\n", &setlist),
1109b725ae77Skettenis      &showlist);
1110b725ae77Skettenis #endif
1111b725ae77Skettenis }
1112