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