1 /* Parameters for execution on a Mitsubishi m32r processor.
2 Copyright 1996, 1997 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
23 /* mvs_check TARGET_BYTE_ORDER BIG_ENDIAN */
24 #define TARGET_BYTE_ORDER BIG_ENDIAN
26 /* mvs_check REGISTER_NAMES */
27 #define REGISTER_NAMES \
28 { "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", \
29 "r8", "r9", "r10", "r11", "r12", "fp", "lr", "sp", \
30 "psw", "cbr", "spi", "spu", "bpc", "pc", "accl", "acch", \
31 /* "cond", "sm", "bsm", "ie", "bie", "bcarry", */ \
33 /* mvs_check NUM_REGS */
36 /* mvs_check REGISTER_SIZE */
37 #define REGISTER_SIZE 4
38 /* mvs_check MAX_REGISTER_RAW_SIZE */
39 #define MAX_REGISTER_RAW_SIZE 4
41 /* mvs_check *_REGNUM */
43 #define STRUCT_RETURN_REGNUM 0
45 #define ARGLAST_REGNUM 3
57 #define ACCL_REGNUM 22
58 #define ACCH_REGNUM 23
60 /* mvs_check REGISTER_BYTES */
61 #define REGISTER_BYTES (NUM_REGS * 4)
63 /* mvs_check REGISTER_VIRTUAL_TYPE */
64 #define REGISTER_VIRTUAL_TYPE(REG) builtin_type_int
66 /* mvs_check REGISTER_BYTE */
67 #define REGISTER_BYTE(REG) ((REG) * 4)
68 /* mvs_check REGISTER_VIRTUAL_SIZE */
69 #define REGISTER_VIRTUAL_SIZE(REG) 4
70 /* mvs_check REGISTER_RAW_SIZE */
71 #define REGISTER_RAW_SIZE(REG) 4
73 /* mvs_check MAX_REGISTER_VIRTUAL_SIZE */
74 #define MAX_REGISTER_VIRTUAL_SIZE 4
76 /* mvs_check BREAKPOINT */
77 #define BREAKPOINT {0x10, 0xf1}
79 /* mvs_no_check FUNCTION_START_OFFSET */
80 #define FUNCTION_START_OFFSET 0
82 /* mvs_check DECR_PC_AFTER_BREAK */
83 #define DECR_PC_AFTER_BREAK 0
85 /* mvs_check INNER_THAN */
86 #define INNER_THAN(lhs,rhs) ((lhs) < (rhs))
88 /* mvs_check SAVED_PC_AFTER_CALL */
89 #define SAVED_PC_AFTER_CALL(fi) read_register (RP_REGNUM)
93 struct frame_saved_regs
;
98 /* Define other aspects of the stack frame.
99 We keep the offsets of all saved registers, 'cause we need 'em a lot!
100 We also keep the current size of the stack frame, and whether
101 the frame pointer is valid (for frameless functions, and when we're
102 still in the prologue of a function with a frame) */
104 /* mvs_check EXTRA_FRAME_INFO */
105 #define EXTRA_FRAME_INFO \
106 struct frame_saved_regs fsr; \
108 int using_frame_pointer;
111 extern void m32r_init_extra_frame_info
PARAMS ((struct frame_info
*fi
));
112 /* mvs_check INIT_EXTRA_FRAME_INFO */
113 #define INIT_EXTRA_FRAME_INFO(fromleaf, fi) m32r_init_extra_frame_info (fi)
114 /* mvs_no_check INIT_FRAME_PC */
115 #define INIT_FRAME_PC /* Not necessary */
118 m32r_frame_find_saved_regs
PARAMS ((struct frame_info
*fi
,
119 struct frame_saved_regs
*regaddr
));
121 /* Put here the code to store, into a struct frame_saved_regs,
122 the addresses of the saved registers of frame described by FRAME_INFO.
123 This includes special registers such as pc and fp saved in special
124 ways in the stack frame. sp is even more special:
125 the address we return for it IS the sp for the next frame. */
127 /* mvs_check FRAME_FIND_SAVED_REGS */
128 #define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \
129 m32r_frame_find_saved_regs(frame_info, &(frame_saved_regs))
131 extern CORE_ADDR m32r_frame_chain
PARAMS ((struct frame_info
*fi
));
132 /* mvs_check FRAME_CHAIN */
133 #define FRAME_CHAIN(fi) m32r_frame_chain (fi)
135 #define FRAME_CHAIN_VALID(fp, frame) generic_frame_chain_valid (fp, frame)
137 extern CORE_ADDR m32r_find_callers_reg
PARAMS ((struct frame_info
*fi
,
139 extern CORE_ADDR m32r_frame_saved_pc
PARAMS((struct frame_info
*));
140 /* mvs_check FRAME_SAVED_PC */
141 #define FRAME_SAVED_PC(fi) m32r_frame_saved_pc (fi)
143 /* mvs_check EXTRACT_RETURN_VALUE */
144 #define EXTRACT_RETURN_VALUE(TYPE, REGBUF, VALBUF) \
146 (char *)(REGBUF) + REGISTER_BYTE (V0_REGNUM) + \
147 ((TYPE_LENGTH (TYPE) > 4 ? 8 : 4) - TYPE_LENGTH (TYPE)), \
150 /* mvs_check STORE_RETURN_VALUE */
151 #define STORE_RETURN_VALUE(TYPE, VALBUF) \
152 write_register_bytes(REGISTER_BYTE (V0_REGNUM) + \
153 ((TYPE_LENGTH (TYPE) > 4 ? 8:4) - TYPE_LENGTH (TYPE)),\
154 (VALBUF), TYPE_LENGTH (TYPE));
156 extern CORE_ADDR m32r_skip_prologue
PARAMS ((CORE_ADDR pc
));
157 /* mvs_check SKIP_PROLOGUE */
158 #define SKIP_PROLOGUE(pc) pc = m32r_skip_prologue (pc)
160 /* mvs_no_check FRAME_ARGS_SKIP */
161 #define FRAME_ARGS_SKIP 0
163 /* mvs_no_check FRAME_ARGS_ADDRESS */
164 #define FRAME_ARGS_ADDRESS(fi) ((fi)->frame)
165 /* mvs_no_check FRAME_LOCALS_ADDRESS */
166 #define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame)
167 /* mvs_no_check FRAME_NUM_ARGS */
168 #define FRAME_NUM_ARGS(val, fi) ((val) = -1)
170 #define COERCE_FLOAT_TO_DOUBLE 1
172 #define TARGET_WRITE_SP m32r_write_sp
179 /* struct passing and returning stuff */
180 #define STORE_STRUCT_RETURN(STRUCT_ADDR, SP) \
181 write_register (0, STRUCT_ADDR)
183 extern use_struct_convention_fn m32r_use_struct_convention
;
184 #define USE_STRUCT_CONVENTION(GCC_P, TYPE) m32r_use_struct_convention (GCC_P, TYPE)
186 #define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) \
187 extract_address (REGBUF + REGISTER_BYTE (V0_REGNUM), \
188 REGISTER_RAW_SIZE (V0_REGNUM))
190 #define REG_STRUCT_HAS_ADDR(gcc_p,type) (TYPE_LENGTH (type) > 8)
193 /* generic dummy frame stuff */
195 #define PUSH_DUMMY_FRAME generic_push_dummy_frame ()
196 #define PC_IN_CALL_DUMMY(PC, SP, FP) generic_pc_in_call_dummy (PC, SP)
199 /* target-specific dummy_frame stuff */
201 extern struct frame_info
*m32r_pop_frame
PARAMS ((struct frame_info
*frame
));
202 /* mvs_check POP_FRAME */
203 #define POP_FRAME m32r_pop_frame (get_current_frame ())
205 /* mvs_no_check STACK_ALIGN */
206 /* #define STACK_ALIGN(x) ((x + 3) & ~3) */
208 extern CORE_ADDR m32r_push_return_address
PARAMS ((CORE_ADDR
, CORE_ADDR
));
209 extern CORE_ADDR m32r_push_arguments
PARAMS ((int nargs
,
212 unsigned char struct_return
,
213 CORE_ADDR struct_addr
));
217 /* mvs_no_check PUSH_ARGUMENTS */
218 #define PUSH_ARGUMENTS(NARGS, ARGS, SP, STRUCT_RETURN, STRUCT_ADDR) \
219 (SP) = m32r_push_arguments (NARGS, ARGS, SP, STRUCT_RETURN, STRUCT_ADDR)
221 #define PUSH_RETURN_ADDRESS(PC, SP) m32r_push_return_address (PC, SP)
223 /* override the standard get_saved_register function with
224 one that takes account of generic CALL_DUMMY frames */
225 #define GET_SAVED_REGISTER
227 #define USE_GENERIC_DUMMY_FRAMES
228 #define CALL_DUMMY {0}
229 #define CALL_DUMMY_LENGTH (0)
230 #define CALL_DUMMY_START_OFFSET (0)
231 #define CALL_DUMMY_BREAKPOINT_OFFSET (0)
232 #define FIX_CALL_DUMMY(DUMMY1, STARTADDR, FUNADDR, NARGS, ARGS, TYPE, GCCP)
233 #define CALL_DUMMY_LOCATION AT_ENTRY_POINT
234 #define CALL_DUMMY_ADDRESS() entry_point_address ()