* target.h (struct thread_resume): Delete leave_stopped member.
[deliverable/binutils-gdb.git] / gdb / m68k-tdep.c
CommitLineData
748894bf 1/* Target-dependent code for the Motorola 68000 series.
c6f0559b 2
6aba47ca 3 Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000, 2001,
0fb0cc75
JB
4 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
5 Free Software Foundation, Inc.
c906108c 6
c5aa993b 7 This file is part of GDB.
c906108c 8
c5aa993b
JM
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
c5aa993b 12 (at your option) any later version.
c906108c 13
c5aa993b
JM
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
c906108c 18
c5aa993b 19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
21
22#include "defs.h"
3f244638 23#include "dwarf2-frame.h"
c906108c 24#include "frame.h"
8de307e0
AS
25#include "frame-base.h"
26#include "frame-unwind.h"
e6bb342a 27#include "gdbtypes.h"
c906108c
SS
28#include "symtab.h"
29#include "gdbcore.h"
30#include "value.h"
31#include "gdb_string.h"
8de307e0 32#include "gdb_assert.h"
7a292a7a 33#include "inferior.h"
4e052eda 34#include "regcache.h"
5d3ed2e3 35#include "arch-utils.h"
55809acb 36#include "osabi.h"
a89aa300 37#include "dis-asm.h"
8ed86d01 38#include "target-descriptions.h"
32eeb91a
AS
39
40#include "m68k-tdep.h"
c906108c 41\f
c5aa993b 42
89c3b6d3
PDM
43#define P_LINKL_FP 0x480e
44#define P_LINKW_FP 0x4e56
45#define P_PEA_FP 0x4856
8de307e0
AS
46#define P_MOVEAL_SP_FP 0x2c4f
47#define P_ADDAW_SP 0xdefc
48#define P_ADDAL_SP 0xdffc
49#define P_SUBQW_SP 0x514f
50#define P_SUBQL_SP 0x518f
51#define P_LEA_SP_SP 0x4fef
52#define P_LEA_PC_A5 0x4bfb0170
53#define P_FMOVEMX_SP 0xf227
54#define P_MOVEL_SP 0x2f00
55#define P_MOVEML_SP 0x48e7
89c3b6d3 56
103a1597 57/* Offset from SP to first arg on stack at first instruction of a function */
103a1597
GS
58#define SP_ARG0 (1 * 4)
59
103a1597
GS
60#if !defined (BPT_VECTOR)
61#define BPT_VECTOR 0xf
62#endif
63
f5cf7aa1 64static const gdb_byte *
67d57894
MD
65m68k_local_breakpoint_from_pc (struct gdbarch *gdbarch,
66 CORE_ADDR *pcptr, int *lenptr)
103a1597 67{
f5cf7aa1 68 static gdb_byte break_insn[] = {0x4e, (0x40 | BPT_VECTOR)};
103a1597
GS
69 *lenptr = sizeof (break_insn);
70 return break_insn;
71}
4713453b
AS
72\f
73
74/* Type for %ps. */
75struct type *m68k_ps_type;
76
77/* Construct types for ISA-specific registers. */
78static void
79m68k_init_types (void)
80{
81 struct type *type;
82
83 type = init_flags_type ("builtin_type_m68k_ps", 4);
84 append_flags_type_flag (type, 0, "C");
85 append_flags_type_flag (type, 1, "V");
86 append_flags_type_flag (type, 2, "Z");
87 append_flags_type_flag (type, 3, "N");
88 append_flags_type_flag (type, 4, "X");
89 append_flags_type_flag (type, 8, "I0");
90 append_flags_type_flag (type, 9, "I1");
91 append_flags_type_flag (type, 10, "I2");
92 append_flags_type_flag (type, 12, "M");
93 append_flags_type_flag (type, 13, "S");
94 append_flags_type_flag (type, 14, "T0");
95 append_flags_type_flag (type, 15, "T1");
96 m68k_ps_type = type;
97}
103a1597 98
d85fe7f7
AS
99/* Return the GDB type object for the "standard" data type of data in
100 register N. This should be int for D0-D7, SR, FPCONTROL and
101 FPSTATUS, long double for FP0-FP7, and void pointer for all others
102 (A0-A7, PC, FPIADDR). Note, for registers which contain
103 addresses return pointer to void, not pointer to char, because we
104 don't want to attempt to print the string after printing the
105 address. */
5d3ed2e3
GS
106
107static struct type *
8de307e0 108m68k_register_type (struct gdbarch *gdbarch, int regnum)
5d3ed2e3 109{
c984b7ff 110 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
03dac896 111
8ed86d01
VP
112 if (tdep->fpregs_present)
113 {
c984b7ff
UW
114 if (regnum >= gdbarch_fp0_regnum (gdbarch)
115 && regnum <= gdbarch_fp0_regnum (gdbarch) + 7)
8ed86d01
VP
116 {
117 if (tdep->flavour == m68k_coldfire_flavour)
118 return builtin_type (gdbarch)->builtin_double;
119 else
120 return builtin_type_m68881_ext;
121 }
122
123 if (regnum == M68K_FPI_REGNUM)
0dfff4cb 124 return builtin_type (gdbarch)->builtin_func_ptr;
8ed86d01
VP
125
126 if (regnum == M68K_FPC_REGNUM || regnum == M68K_FPS_REGNUM)
127 return builtin_type_int32;
128 }
129 else
130 {
131 if (regnum >= M68K_FP0_REGNUM && regnum <= M68K_FPI_REGNUM)
132 return builtin_type_int0;
133 }
03dac896 134
c984b7ff 135 if (regnum == gdbarch_pc_regnum (gdbarch))
0dfff4cb 136 return builtin_type (gdbarch)->builtin_func_ptr;
03dac896 137
32eeb91a 138 if (regnum >= M68K_A0_REGNUM && regnum <= M68K_A0_REGNUM + 7)
0dfff4cb 139 return builtin_type (gdbarch)->builtin_data_ptr;
03dac896 140
4713453b
AS
141 if (regnum == M68K_PS_REGNUM)
142 return m68k_ps_type;
143
03dac896 144 return builtin_type_int32;
5d3ed2e3
GS
145}
146
8ed86d01 147static const char *m68k_register_names[] = {
5d3ed2e3
GS
148 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
149 "a0", "a1", "a2", "a3", "a4", "a5", "fp", "sp",
150 "ps", "pc",
151 "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7",
8ed86d01 152 "fpcontrol", "fpstatus", "fpiaddr"
5d3ed2e3
GS
153 };
154
8ed86d01
VP
155/* Function: m68k_register_name
156 Returns the name of the standard m68k register regnum. */
157
158static const char *
d93859e2 159m68k_register_name (struct gdbarch *gdbarch, int regnum)
8ed86d01
VP
160{
161 if (regnum < 0 || regnum >= ARRAY_SIZE (m68k_register_names))
5d3ed2e3 162 internal_error (__FILE__, __LINE__,
e2e0b3e5 163 _("m68k_register_name: illegal register number %d"), regnum);
5d3ed2e3 164 else
8ed86d01 165 return m68k_register_names[regnum];
5d3ed2e3 166}
e47577ab
MK
167\f
168/* Return nonzero if a value of type TYPE stored in register REGNUM
169 needs any special handling. */
170
171static int
0abe36f5 172m68k_convert_register_p (struct gdbarch *gdbarch, int regnum, struct type *type)
e47577ab 173{
0abe36f5 174 if (!gdbarch_tdep (gdbarch)->fpregs_present)
8ed86d01 175 return 0;
83acabca
DJ
176 return (regnum >= M68K_FP0_REGNUM && regnum <= M68K_FP0_REGNUM + 7
177 && type != builtin_type_m68881_ext);
e47577ab
MK
178}
179
180/* Read a value of type TYPE from register REGNUM in frame FRAME, and
181 return its contents in TO. */
182
183static void
184m68k_register_to_value (struct frame_info *frame, int regnum,
f5cf7aa1 185 struct type *type, gdb_byte *to)
e47577ab 186{
f5cf7aa1 187 gdb_byte from[M68K_MAX_REGISTER_SIZE];
c984b7ff
UW
188 struct type *fpreg_type = register_type (get_frame_arch (frame),
189 M68K_FP0_REGNUM);
e47577ab
MK
190
191 /* We only support floating-point values. */
192 if (TYPE_CODE (type) != TYPE_CODE_FLT)
193 {
8a3fe4f8
AC
194 warning (_("Cannot convert floating-point register value "
195 "to non-floating-point type."));
e47577ab
MK
196 return;
197 }
198
83acabca 199 /* Convert to TYPE. */
e47577ab 200 get_frame_register (frame, regnum, from);
8ed86d01 201 convert_typed_floating (from, fpreg_type, to, type);
e47577ab
MK
202}
203
204/* Write the contents FROM of a value of type TYPE into register
205 REGNUM in frame FRAME. */
206
207static void
208m68k_value_to_register (struct frame_info *frame, int regnum,
f5cf7aa1 209 struct type *type, const gdb_byte *from)
e47577ab 210{
f5cf7aa1 211 gdb_byte to[M68K_MAX_REGISTER_SIZE];
c984b7ff
UW
212 struct type *fpreg_type = register_type (get_frame_arch (frame),
213 M68K_FP0_REGNUM);
e47577ab
MK
214
215 /* We only support floating-point values. */
216 if (TYPE_CODE (type) != TYPE_CODE_FLT)
217 {
8a3fe4f8
AC
218 warning (_("Cannot convert non-floating-point type "
219 "to floating-point register value."));
e47577ab
MK
220 return;
221 }
222
83acabca 223 /* Convert from TYPE. */
8ed86d01 224 convert_typed_floating (from, type, to, fpreg_type);
e47577ab
MK
225 put_frame_register (frame, regnum, to);
226}
227
8de307e0 228\f
f595cb19
MK
229/* There is a fair number of calling conventions that are in somewhat
230 wide use. The 68000/08/10 don't support an FPU, not even as a
231 coprocessor. All function return values are stored in %d0/%d1.
232 Structures are returned in a static buffer, a pointer to which is
233 returned in %d0. This means that functions returning a structure
234 are not re-entrant. To avoid this problem some systems use a
235 convention where the caller passes a pointer to a buffer in %a1
236 where the return values is to be stored. This convention is the
237 default, and is implemented in the function m68k_return_value.
238
239 The 68020/030/040/060 do support an FPU, either as a coprocessor
240 (68881/2) or built-in (68040/68060). That's why System V release 4
241 (SVR4) instroduces a new calling convention specified by the SVR4
242 psABI. Integer values are returned in %d0/%d1, pointer return
243 values in %a0 and floating values in %fp0. When calling functions
244 returning a structure the caller should pass a pointer to a buffer
245 for the return value in %a0. This convention is implemented in the
246 function m68k_svr4_return_value, and by appropriately setting the
247 struct_value_regnum member of `struct gdbarch_tdep'.
248
249 GNU/Linux returns values in the same way as SVR4 does, but uses %a1
250 for passing the structure return value buffer.
251
252 GCC can also generate code where small structures are returned in
253 %d0/%d1 instead of in memory by using -freg-struct-return. This is
254 the default on NetBSD a.out, OpenBSD and GNU/Linux and several
255 embedded systems. This convention is implemented by setting the
256 struct_return member of `struct gdbarch_tdep' to reg_struct_return. */
257
258/* Read a function return value of TYPE from REGCACHE, and copy that
8de307e0 259 into VALBUF. */
942dc0e9
GS
260
261static void
8de307e0 262m68k_extract_return_value (struct type *type, struct regcache *regcache,
f5cf7aa1 263 gdb_byte *valbuf)
942dc0e9 264{
8de307e0 265 int len = TYPE_LENGTH (type);
f5cf7aa1 266 gdb_byte buf[M68K_MAX_REGISTER_SIZE];
942dc0e9 267
8de307e0
AS
268 if (len <= 4)
269 {
270 regcache_raw_read (regcache, M68K_D0_REGNUM, buf);
271 memcpy (valbuf, buf + (4 - len), len);
272 }
273 else if (len <= 8)
274 {
275 regcache_raw_read (regcache, M68K_D0_REGNUM, buf);
276 memcpy (valbuf, buf + (8 - len), len - 4);
f5cf7aa1 277 regcache_raw_read (regcache, M68K_D1_REGNUM, valbuf + (len - 4));
8de307e0
AS
278 }
279 else
280 internal_error (__FILE__, __LINE__,
e2e0b3e5 281 _("Cannot extract return value of %d bytes long."), len);
942dc0e9
GS
282}
283
942dc0e9 284static void
f595cb19 285m68k_svr4_extract_return_value (struct type *type, struct regcache *regcache,
f5cf7aa1 286 gdb_byte *valbuf)
942dc0e9 287{
8de307e0 288 int len = TYPE_LENGTH (type);
f5cf7aa1 289 gdb_byte buf[M68K_MAX_REGISTER_SIZE];
c984b7ff
UW
290 struct gdbarch *gdbarch = get_regcache_arch (regcache);
291 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
942dc0e9 292
8ed86d01 293 if (tdep->float_return && TYPE_CODE (type) == TYPE_CODE_FLT)
8de307e0 294 {
c984b7ff 295 struct type *fpreg_type = register_type (gdbarch, M68K_FP0_REGNUM);
f595cb19 296 regcache_raw_read (regcache, M68K_FP0_REGNUM, buf);
8ed86d01 297 convert_typed_floating (buf, fpreg_type, valbuf, type);
8de307e0 298 }
f595cb19
MK
299 else if (TYPE_CODE (type) == TYPE_CODE_PTR && len == 4)
300 regcache_raw_read (regcache, M68K_A0_REGNUM, valbuf);
301 else
302 m68k_extract_return_value (type, regcache, valbuf);
303}
304
305/* Write a function return value of TYPE from VALBUF into REGCACHE. */
306
307static void
308m68k_store_return_value (struct type *type, struct regcache *regcache,
f5cf7aa1 309 const gdb_byte *valbuf)
f595cb19
MK
310{
311 int len = TYPE_LENGTH (type);
942dc0e9 312
8de307e0
AS
313 if (len <= 4)
314 regcache_raw_write_part (regcache, M68K_D0_REGNUM, 4 - len, len, valbuf);
315 else if (len <= 8)
316 {
f595cb19 317 regcache_raw_write_part (regcache, M68K_D0_REGNUM, 8 - len,
8de307e0 318 len - 4, valbuf);
f5cf7aa1 319 regcache_raw_write (regcache, M68K_D1_REGNUM, valbuf + (len - 4));
8de307e0
AS
320 }
321 else
322 internal_error (__FILE__, __LINE__,
e2e0b3e5 323 _("Cannot store return value of %d bytes long."), len);
8de307e0 324}
942dc0e9 325
f595cb19
MK
326static void
327m68k_svr4_store_return_value (struct type *type, struct regcache *regcache,
f5cf7aa1 328 const gdb_byte *valbuf)
942dc0e9 329{
f595cb19 330 int len = TYPE_LENGTH (type);
c984b7ff
UW
331 struct gdbarch *gdbarch = get_regcache_arch (regcache);
332 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
8de307e0 333
8ed86d01 334 if (tdep->float_return && TYPE_CODE (type) == TYPE_CODE_FLT)
f595cb19 335 {
c984b7ff 336 struct type *fpreg_type = register_type (gdbarch, M68K_FP0_REGNUM);
f5cf7aa1 337 gdb_byte buf[M68K_MAX_REGISTER_SIZE];
8ed86d01 338 convert_typed_floating (valbuf, type, buf, fpreg_type);
f595cb19
MK
339 regcache_raw_write (regcache, M68K_FP0_REGNUM, buf);
340 }
341 else if (TYPE_CODE (type) == TYPE_CODE_PTR && len == 4)
342 {
343 regcache_raw_write (regcache, M68K_A0_REGNUM, valbuf);
344 regcache_raw_write (regcache, M68K_D0_REGNUM, valbuf);
345 }
346 else
347 m68k_store_return_value (type, regcache, valbuf);
942dc0e9
GS
348}
349
f595cb19
MK
350/* Return non-zero if TYPE, which is assumed to be a structure or
351 union type, should be returned in registers for architecture
352 GDBARCH. */
353
c481dac7 354static int
f595cb19 355m68k_reg_struct_return_p (struct gdbarch *gdbarch, struct type *type)
c481dac7 356{
f595cb19
MK
357 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
358 enum type_code code = TYPE_CODE (type);
359 int len = TYPE_LENGTH (type);
c481dac7 360
f595cb19
MK
361 gdb_assert (code == TYPE_CODE_STRUCT || code == TYPE_CODE_UNION);
362
363 if (tdep->struct_return == pcc_struct_return)
364 return 0;
365
366 return (len == 1 || len == 2 || len == 4 || len == 8);
c481dac7
AS
367}
368
f595cb19
MK
369/* Determine, for architecture GDBARCH, how a return value of TYPE
370 should be returned. If it is supposed to be returned in registers,
371 and READBUF is non-zero, read the appropriate value from REGCACHE,
372 and copy it into READBUF. If WRITEBUF is non-zero, write the value
373 from WRITEBUF into REGCACHE. */
374
375static enum return_value_convention
c055b101
CV
376m68k_return_value (struct gdbarch *gdbarch, struct type *func_type,
377 struct type *type, struct regcache *regcache,
378 gdb_byte *readbuf, const gdb_byte *writebuf)
f595cb19
MK
379{
380 enum type_code code = TYPE_CODE (type);
381
1c845060
MK
382 /* GCC returns a `long double' in memory too. */
383 if (((code == TYPE_CODE_STRUCT || code == TYPE_CODE_UNION)
384 && !m68k_reg_struct_return_p (gdbarch, type))
385 || (code == TYPE_CODE_FLT && TYPE_LENGTH (type) == 12))
386 {
387 /* The default on m68k is to return structures in static memory.
388 Consequently a function must return the address where we can
389 find the return value. */
f595cb19 390
1c845060
MK
391 if (readbuf)
392 {
393 ULONGEST addr;
394
395 regcache_raw_read_unsigned (regcache, M68K_D0_REGNUM, &addr);
396 read_memory (addr, readbuf, TYPE_LENGTH (type));
397 }
398
399 return RETURN_VALUE_ABI_RETURNS_ADDRESS;
400 }
f595cb19
MK
401
402 if (readbuf)
403 m68k_extract_return_value (type, regcache, readbuf);
404 if (writebuf)
405 m68k_store_return_value (type, regcache, writebuf);
406
407 return RETURN_VALUE_REGISTER_CONVENTION;
408}
409
410static enum return_value_convention
c055b101
CV
411m68k_svr4_return_value (struct gdbarch *gdbarch, struct type *func_type,
412 struct type *type, struct regcache *regcache,
413 gdb_byte *readbuf, const gdb_byte *writebuf)
f595cb19
MK
414{
415 enum type_code code = TYPE_CODE (type);
416
417 if ((code == TYPE_CODE_STRUCT || code == TYPE_CODE_UNION)
418 && !m68k_reg_struct_return_p (gdbarch, type))
51da707a
MK
419 {
420 /* The System V ABI says that:
421
422 "A function returning a structure or union also sets %a0 to
423 the value it finds in %a0. Thus when the caller receives
424 control again, the address of the returned object resides in
425 register %a0."
426
427 So the ABI guarantees that we can always find the return
428 value just after the function has returned. */
429
430 if (readbuf)
431 {
432 ULONGEST addr;
433
434 regcache_raw_read_unsigned (regcache, M68K_A0_REGNUM, &addr);
435 read_memory (addr, readbuf, TYPE_LENGTH (type));
436 }
437
438 return RETURN_VALUE_ABI_RETURNS_ADDRESS;
439 }
f595cb19
MK
440
441 /* This special case is for structures consisting of a single
442 `float' or `double' member. These structures are returned in
443 %fp0. For these structures, we call ourselves recursively,
444 changing TYPE into the type of the first member of the structure.
445 Since that should work for all structures that have only one
446 member, we don't bother to check the member's type here. */
447 if (code == TYPE_CODE_STRUCT && TYPE_NFIELDS (type) == 1)
448 {
449 type = check_typedef (TYPE_FIELD_TYPE (type, 0));
c055b101 450 return m68k_svr4_return_value (gdbarch, func_type, type, regcache,
f595cb19
MK
451 readbuf, writebuf);
452 }
453
454 if (readbuf)
455 m68k_svr4_extract_return_value (type, regcache, readbuf);
456 if (writebuf)
457 m68k_svr4_store_return_value (type, regcache, writebuf);
458
459 return RETURN_VALUE_REGISTER_CONVENTION;
460}
461\f
392a587b 462
9bb47d95
NS
463/* Always align the frame to a 4-byte boundary. This is required on
464 coldfire and harmless on the rest. */
465
466static CORE_ADDR
467m68k_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
468{
469 /* Align the stack to four bytes. */
470 return sp & ~3;
471}
472
8de307e0 473static CORE_ADDR
7d9b040b 474m68k_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
8de307e0
AS
475 struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
476 struct value **args, CORE_ADDR sp, int struct_return,
477 CORE_ADDR struct_addr)
7f8e7424 478{
f595cb19 479 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
f5cf7aa1 480 gdb_byte buf[4];
8de307e0
AS
481 int i;
482
483 /* Push arguments in reverse order. */
484 for (i = nargs - 1; i >= 0; i--)
485 {
4754a64e 486 struct type *value_type = value_enclosing_type (args[i]);
c481dac7 487 int len = TYPE_LENGTH (value_type);
8de307e0 488 int container_len = (len + 3) & ~3;
c481dac7
AS
489 int offset;
490
491 /* Non-scalars bigger than 4 bytes are left aligned, others are
492 right aligned. */
493 if ((TYPE_CODE (value_type) == TYPE_CODE_STRUCT
494 || TYPE_CODE (value_type) == TYPE_CODE_UNION
495 || TYPE_CODE (value_type) == TYPE_CODE_ARRAY)
496 && len > 4)
497 offset = 0;
498 else
499 offset = container_len - len;
8de307e0 500 sp -= container_len;
46615f07 501 write_memory (sp + offset, value_contents_all (args[i]), len);
8de307e0
AS
502 }
503
c481dac7 504 /* Store struct value address. */
8de307e0
AS
505 if (struct_return)
506 {
8de307e0 507 store_unsigned_integer (buf, 4, struct_addr);
f595cb19 508 regcache_cooked_write (regcache, tdep->struct_value_regnum, buf);
8de307e0
AS
509 }
510
511 /* Store return address. */
512 sp -= 4;
513 store_unsigned_integer (buf, 4, bp_addr);
514 write_memory (sp, buf, 4);
515
516 /* Finally, update the stack pointer... */
517 store_unsigned_integer (buf, 4, sp);
518 regcache_cooked_write (regcache, M68K_SP_REGNUM, buf);
519
520 /* ...and fake a frame pointer. */
521 regcache_cooked_write (regcache, M68K_FP_REGNUM, buf);
522
523 /* DWARF2/GCC uses the stack address *before* the function call as a
524 frame's CFA. */
525 return sp + 8;
7f8e7424 526}
6dd0fba6
NS
527
528/* Convert a dwarf or dwarf2 regnumber to a GDB regnum. */
529
530static int
d3f73121 531m68k_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int num)
6dd0fba6
NS
532{
533 if (num < 8)
534 /* d0..7 */
535 return (num - 0) + M68K_D0_REGNUM;
536 else if (num < 16)
537 /* a0..7 */
538 return (num - 8) + M68K_A0_REGNUM;
d3f73121 539 else if (num < 24 && gdbarch_tdep (gdbarch)->fpregs_present)
6dd0fba6
NS
540 /* fp0..7 */
541 return (num - 16) + M68K_FP0_REGNUM;
542 else if (num == 25)
543 /* pc */
544 return M68K_PC_REGNUM;
545 else
d3f73121 546 return gdbarch_num_regs (gdbarch) + gdbarch_num_pseudo_regs (gdbarch);
6dd0fba6
NS
547}
548
8de307e0
AS
549\f
550struct m68k_frame_cache
551{
552 /* Base address. */
553 CORE_ADDR base;
554 CORE_ADDR sp_offset;
555 CORE_ADDR pc;
7f8e7424 556
8de307e0
AS
557 /* Saved registers. */
558 CORE_ADDR saved_regs[M68K_NUM_REGS];
559 CORE_ADDR saved_sp;
7f8e7424 560
8de307e0
AS
561 /* Stack space reserved for local variables. */
562 long locals;
563};
c906108c 564
8de307e0
AS
565/* Allocate and initialize a frame cache. */
566
567static struct m68k_frame_cache *
568m68k_alloc_frame_cache (void)
c906108c 569{
8de307e0
AS
570 struct m68k_frame_cache *cache;
571 int i;
c906108c 572
8de307e0 573 cache = FRAME_OBSTACK_ZALLOC (struct m68k_frame_cache);
c906108c 574
8de307e0
AS
575 /* Base address. */
576 cache->base = 0;
577 cache->sp_offset = -4;
578 cache->pc = 0;
c906108c 579
8de307e0
AS
580 /* Saved registers. We initialize these to -1 since zero is a valid
581 offset (that's where %fp is supposed to be stored). */
582 for (i = 0; i < M68K_NUM_REGS; i++)
583 cache->saved_regs[i] = -1;
584
585 /* Frameless until proven otherwise. */
586 cache->locals = -1;
587
588 return cache;
c906108c
SS
589}
590
8de307e0
AS
591/* Check whether PC points at a code that sets up a new stack frame.
592 If so, it updates CACHE and returns the address of the first
593 instruction after the sequence that sets removes the "hidden"
594 argument from the stack or CURRENT_PC, whichever is smaller.
595 Otherwise, return PC. */
c906108c 596
8de307e0
AS
597static CORE_ADDR
598m68k_analyze_frame_setup (CORE_ADDR pc, CORE_ADDR current_pc,
599 struct m68k_frame_cache *cache)
c906108c 600{
8de307e0
AS
601 int op;
602
603 if (pc >= current_pc)
604 return current_pc;
c906108c 605
8de307e0
AS
606 op = read_memory_unsigned_integer (pc, 2);
607
608 if (op == P_LINKW_FP || op == P_LINKL_FP || op == P_PEA_FP)
c906108c 609 {
8de307e0
AS
610 cache->saved_regs[M68K_FP_REGNUM] = 0;
611 cache->sp_offset += 4;
612 if (op == P_LINKW_FP)
613 {
614 /* link.w %fp, #-N */
615 /* link.w %fp, #0; adda.l #-N, %sp */
616 cache->locals = -read_memory_integer (pc + 2, 2);
617
618 if (pc + 4 < current_pc && cache->locals == 0)
619 {
620 op = read_memory_unsigned_integer (pc + 4, 2);
621 if (op == P_ADDAL_SP)
622 {
623 cache->locals = read_memory_integer (pc + 6, 4);
624 return pc + 10;
625 }
626 }
627
628 return pc + 4;
629 }
630 else if (op == P_LINKL_FP)
c906108c 631 {
8de307e0
AS
632 /* link.l %fp, #-N */
633 cache->locals = -read_memory_integer (pc + 2, 4);
634 return pc + 6;
635 }
636 else
637 {
638 /* pea (%fp); movea.l %sp, %fp */
639 cache->locals = 0;
640
641 if (pc + 2 < current_pc)
642 {
643 op = read_memory_unsigned_integer (pc + 2, 2);
644
645 if (op == P_MOVEAL_SP_FP)
646 {
647 /* move.l %sp, %fp */
648 return pc + 4;
649 }
650 }
651
652 return pc + 2;
c906108c
SS
653 }
654 }
8de307e0 655 else if ((op & 0170777) == P_SUBQW_SP || (op & 0170777) == P_SUBQL_SP)
c906108c 656 {
8de307e0
AS
657 /* subq.[wl] #N,%sp */
658 /* subq.[wl] #8,%sp; subq.[wl] #N,%sp */
659 cache->locals = (op & 07000) == 0 ? 8 : (op & 07000) >> 9;
660 if (pc + 2 < current_pc)
c906108c 661 {
8de307e0
AS
662 op = read_memory_unsigned_integer (pc + 2, 2);
663 if ((op & 0170777) == P_SUBQW_SP || (op & 0170777) == P_SUBQL_SP)
664 {
665 cache->locals += (op & 07000) == 0 ? 8 : (op & 07000) >> 9;
666 return pc + 4;
667 }
c906108c 668 }
8de307e0
AS
669 return pc + 2;
670 }
671 else if (op == P_ADDAW_SP || op == P_LEA_SP_SP)
672 {
673 /* adda.w #-N,%sp */
674 /* lea (-N,%sp),%sp */
675 cache->locals = -read_memory_integer (pc + 2, 2);
676 return pc + 4;
c906108c 677 }
8de307e0 678 else if (op == P_ADDAL_SP)
c906108c 679 {
8de307e0
AS
680 /* adda.l #-N,%sp */
681 cache->locals = -read_memory_integer (pc + 2, 4);
682 return pc + 6;
c906108c 683 }
8de307e0
AS
684
685 return pc;
c906108c 686}
c5aa993b 687
8de307e0
AS
688/* Check whether PC points at code that saves registers on the stack.
689 If so, it updates CACHE and returns the address of the first
690 instruction after the register saves or CURRENT_PC, whichever is
691 smaller. Otherwise, return PC. */
c906108c 692
8de307e0 693static CORE_ADDR
be8626e0
MD
694m68k_analyze_register_saves (struct gdbarch *gdbarch, CORE_ADDR pc,
695 CORE_ADDR current_pc,
8de307e0
AS
696 struct m68k_frame_cache *cache)
697{
698 if (cache->locals >= 0)
699 {
700 CORE_ADDR offset;
701 int op;
702 int i, mask, regno;
c906108c 703
8de307e0
AS
704 offset = -4 - cache->locals;
705 while (pc < current_pc)
706 {
707 op = read_memory_unsigned_integer (pc, 2);
8ed86d01 708 if (op == P_FMOVEMX_SP
be8626e0 709 && gdbarch_tdep (gdbarch)->fpregs_present)
8de307e0
AS
710 {
711 /* fmovem.x REGS,-(%sp) */
712 op = read_memory_unsigned_integer (pc + 2, 2);
713 if ((op & 0xff00) == 0xe000)
714 {
715 mask = op & 0xff;
716 for (i = 0; i < 16; i++, mask >>= 1)
717 {
718 if (mask & 1)
719 {
720 cache->saved_regs[i + M68K_FP0_REGNUM] = offset;
721 offset -= 12;
722 }
723 }
724 pc += 4;
725 }
726 else
727 break;
728 }
0ba5a932 729 else if ((op & 0177760) == P_MOVEL_SP)
8de307e0
AS
730 {
731 /* move.l %R,-(%sp) */
0ba5a932 732 regno = op & 017;
8de307e0
AS
733 cache->saved_regs[regno] = offset;
734 offset -= 4;
735 pc += 2;
736 }
737 else if (op == P_MOVEML_SP)
738 {
739 /* movem.l REGS,-(%sp) */
740 mask = read_memory_unsigned_integer (pc + 2, 2);
741 for (i = 0; i < 16; i++, mask >>= 1)
742 {
743 if (mask & 1)
744 {
745 cache->saved_regs[15 - i] = offset;
746 offset -= 4;
747 }
748 }
749 pc += 4;
750 }
751 else
752 break;
753 }
754 }
755
756 return pc;
757}
c906108c 758
c906108c 759
8de307e0
AS
760/* Do a full analysis of the prologue at PC and update CACHE
761 accordingly. Bail out early if CURRENT_PC is reached. Return the
762 address where the analysis stopped.
c906108c 763
8de307e0 764 We handle all cases that can be generated by gcc.
c906108c 765
8de307e0 766 For allocating a stack frame:
c906108c 767
8de307e0
AS
768 link.w %a6,#-N
769 link.l %a6,#-N
770 pea (%fp); move.l %sp,%fp
771 link.w %a6,#0; add.l #-N,%sp
772 subq.l #N,%sp
773 subq.w #N,%sp
774 subq.w #8,%sp; subq.w #N-8,%sp
775 add.w #-N,%sp
776 lea (-N,%sp),%sp
777 add.l #-N,%sp
c906108c 778
8de307e0 779 For saving registers:
c906108c 780
8de307e0
AS
781 fmovem.x REGS,-(%sp)
782 move.l R1,-(%sp)
783 move.l R1,-(%sp); move.l R2,-(%sp)
784 movem.l REGS,-(%sp)
c906108c 785
8de307e0 786 For setting up the PIC register:
c906108c 787
8de307e0 788 lea (%pc,N),%a5
c906108c 789
8de307e0 790 */
c906108c 791
eb2e12d7 792static CORE_ADDR
be8626e0
MD
793m68k_analyze_prologue (struct gdbarch *gdbarch, CORE_ADDR pc,
794 CORE_ADDR current_pc, struct m68k_frame_cache *cache)
c906108c 795{
8de307e0 796 unsigned int op;
c906108c 797
8de307e0 798 pc = m68k_analyze_frame_setup (pc, current_pc, cache);
be8626e0 799 pc = m68k_analyze_register_saves (gdbarch, pc, current_pc, cache);
8de307e0
AS
800 if (pc >= current_pc)
801 return current_pc;
c906108c 802
8de307e0
AS
803 /* Check for GOT setup. */
804 op = read_memory_unsigned_integer (pc, 4);
805 if (op == P_LEA_PC_A5)
c906108c 806 {
8de307e0 807 /* lea (%pc,N),%a5 */
e4d8bc08 808 return pc + 8;
c906108c 809 }
8de307e0
AS
810
811 return pc;
c906108c
SS
812}
813
8de307e0 814/* Return PC of first real instruction. */
7f8e7424 815
8de307e0 816static CORE_ADDR
6093d2eb 817m68k_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
c906108c 818{
8de307e0
AS
819 struct m68k_frame_cache cache;
820 CORE_ADDR pc;
821 int op;
c906108c 822
8de307e0 823 cache.locals = -1;
be8626e0 824 pc = m68k_analyze_prologue (gdbarch, start_pc, (CORE_ADDR) -1, &cache);
8de307e0
AS
825 if (cache.locals < 0)
826 return start_pc;
827 return pc;
828}
c906108c 829
8de307e0
AS
830static CORE_ADDR
831m68k_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
832{
f5cf7aa1 833 gdb_byte buf[8];
7f8e7424 834
c984b7ff 835 frame_unwind_register (next_frame, gdbarch_pc_regnum (gdbarch), buf);
0dfff4cb 836 return extract_typed_address (buf, builtin_type (gdbarch)->builtin_func_ptr);
8de307e0
AS
837}
838\f
839/* Normal frames. */
7f8e7424 840
8de307e0 841static struct m68k_frame_cache *
f36bf22c 842m68k_frame_cache (struct frame_info *this_frame, void **this_cache)
8de307e0
AS
843{
844 struct m68k_frame_cache *cache;
f5cf7aa1 845 gdb_byte buf[4];
8de307e0
AS
846 int i;
847
848 if (*this_cache)
849 return *this_cache;
850
851 cache = m68k_alloc_frame_cache ();
852 *this_cache = cache;
853
854 /* In principle, for normal frames, %fp holds the frame pointer,
855 which holds the base address for the current stack frame.
856 However, for functions that don't need it, the frame pointer is
857 optional. For these "frameless" functions the frame pointer is
858 actually the frame pointer of the calling frame. Signal
859 trampolines are just a special case of a "frameless" function.
860 They (usually) share their frame pointer with the frame that was
861 in progress when the signal occurred. */
862
f36bf22c 863 get_frame_register (this_frame, M68K_FP_REGNUM, buf);
8de307e0
AS
864 cache->base = extract_unsigned_integer (buf, 4);
865 if (cache->base == 0)
866 return cache;
867
868 /* For normal frames, %pc is stored at 4(%fp). */
869 cache->saved_regs[M68K_PC_REGNUM] = 4;
870
f36bf22c 871 cache->pc = get_frame_func (this_frame);
8de307e0 872 if (cache->pc != 0)
f36bf22c
AS
873 m68k_analyze_prologue (get_frame_arch (this_frame), cache->pc,
874 get_frame_pc (this_frame), cache);
8de307e0
AS
875
876 if (cache->locals < 0)
877 {
878 /* We didn't find a valid frame, which means that CACHE->base
879 currently holds the frame pointer for our calling frame. If
880 we're at the start of a function, or somewhere half-way its
881 prologue, the function's frame probably hasn't been fully
882 setup yet. Try to reconstruct the base address for the stack
883 frame by looking at the stack pointer. For truly "frameless"
884 functions this might work too. */
885
f36bf22c 886 get_frame_register (this_frame, M68K_SP_REGNUM, buf);
8de307e0
AS
887 cache->base = extract_unsigned_integer (buf, 4) + cache->sp_offset;
888 }
7f8e7424 889
8de307e0
AS
890 /* Now that we have the base address for the stack frame we can
891 calculate the value of %sp in the calling frame. */
892 cache->saved_sp = cache->base + 8;
7f8e7424 893
8de307e0
AS
894 /* Adjust all the saved registers such that they contain addresses
895 instead of offsets. */
896 for (i = 0; i < M68K_NUM_REGS; i++)
897 if (cache->saved_regs[i] != -1)
898 cache->saved_regs[i] += cache->base;
c906108c 899
8de307e0
AS
900 return cache;
901}
c906108c 902
8de307e0 903static void
f36bf22c 904m68k_frame_this_id (struct frame_info *this_frame, void **this_cache,
8de307e0
AS
905 struct frame_id *this_id)
906{
f36bf22c 907 struct m68k_frame_cache *cache = m68k_frame_cache (this_frame, this_cache);
c906108c 908
8de307e0
AS
909 /* This marks the outermost frame. */
910 if (cache->base == 0)
911 return;
c5aa993b 912
8de307e0
AS
913 /* See the end of m68k_push_dummy_call. */
914 *this_id = frame_id_build (cache->base + 8, cache->pc);
915}
c5aa993b 916
f36bf22c
AS
917static struct value *
918m68k_frame_prev_register (struct frame_info *this_frame, void **this_cache,
919 int regnum)
8de307e0 920{
f36bf22c 921 struct m68k_frame_cache *cache = m68k_frame_cache (this_frame, this_cache);
8de307e0
AS
922
923 gdb_assert (regnum >= 0);
924
925 if (regnum == M68K_SP_REGNUM && cache->saved_sp)
f36bf22c 926 return frame_unwind_got_constant (this_frame, regnum, cache->saved_sp);
8de307e0
AS
927
928 if (regnum < M68K_NUM_REGS && cache->saved_regs[regnum] != -1)
f36bf22c
AS
929 return frame_unwind_got_memory (this_frame, regnum,
930 cache->saved_regs[regnum]);
8de307e0 931
f36bf22c 932 return frame_unwind_got_register (this_frame, regnum, regnum);
8de307e0
AS
933}
934
935static const struct frame_unwind m68k_frame_unwind =
936{
937 NORMAL_FRAME,
938 m68k_frame_this_id,
f36bf22c
AS
939 m68k_frame_prev_register,
940 NULL,
941 default_frame_sniffer
8de307e0 942};
8de307e0 943\f
8de307e0 944static CORE_ADDR
f36bf22c 945m68k_frame_base_address (struct frame_info *this_frame, void **this_cache)
8de307e0 946{
f36bf22c 947 struct m68k_frame_cache *cache = m68k_frame_cache (this_frame, this_cache);
8de307e0
AS
948
949 return cache->base;
950}
951
952static const struct frame_base m68k_frame_base =
953{
954 &m68k_frame_unwind,
955 m68k_frame_base_address,
956 m68k_frame_base_address,
957 m68k_frame_base_address
958};
959
960static struct frame_id
f36bf22c 961m68k_dummy_id (struct gdbarch *gdbarch, struct frame_info *this_frame)
8de307e0 962{
8de307e0 963 CORE_ADDR fp;
c906108c 964
f36bf22c 965 fp = get_frame_register_unsigned (this_frame, M68K_FP_REGNUM);
c906108c 966
8de307e0 967 /* See the end of m68k_push_dummy_call. */
f36bf22c 968 return frame_id_build (fp + 8, get_frame_pc (this_frame));
8de307e0
AS
969}
970\f
c906108c 971
c906108c
SS
972/* Figure out where the longjmp will land. Slurp the args out of the stack.
973 We expect the first arg to be a pointer to the jmp_buf structure from which
974 we extract the pc (JB_PC) that we will land at. The pc is copied into PC.
975 This routine returns true on success. */
976
c34d127c 977static int
60ade65d 978m68k_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
c906108c 979{
f5cf7aa1 980 gdb_byte *buf;
c906108c 981 CORE_ADDR sp, jb_addr;
c984b7ff 982 struct gdbarch *gdbarch = get_frame_arch (frame);
60ade65d 983 struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (frame));
eb2e12d7
AS
984
985 if (tdep->jb_pc < 0)
986 {
987 internal_error (__FILE__, __LINE__,
e2e0b3e5 988 _("m68k_get_longjmp_target: not implemented"));
eb2e12d7
AS
989 return 0;
990 }
c906108c 991
c984b7ff
UW
992 buf = alloca (gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT);
993 sp = get_frame_register_unsigned (frame, gdbarch_sp_regnum (gdbarch));
c906108c 994
b5d78d39 995 if (target_read_memory (sp + SP_ARG0, /* Offset of first arg on stack */
c984b7ff 996 buf, gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT))
c906108c
SS
997 return 0;
998
c984b7ff 999 jb_addr = extract_unsigned_integer (buf, gdbarch_ptr_bit (gdbarch)
819844ad 1000 / TARGET_CHAR_BIT);
c906108c 1001
eb2e12d7 1002 if (target_read_memory (jb_addr + tdep->jb_pc * tdep->jb_elt_size, buf,
c984b7ff 1003 gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT))
c906108c
SS
1004 return 0;
1005
c984b7ff 1006 *pc = extract_unsigned_integer (buf, gdbarch_ptr_bit (gdbarch)
819844ad 1007 / TARGET_CHAR_BIT);
c906108c
SS
1008 return 1;
1009}
f595cb19
MK
1010\f
1011
1012/* System V Release 4 (SVR4). */
1013
1014void
1015m68k_svr4_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
1016{
1017 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1018
1019 /* SVR4 uses a different calling convention. */
1020 set_gdbarch_return_value (gdbarch, m68k_svr4_return_value);
1021
1022 /* SVR4 uses %a0 instead of %a1. */
1023 tdep->struct_value_regnum = M68K_A0_REGNUM;
1024}
1025\f
c906108c 1026
152d9db6
GS
1027/* Function: m68k_gdbarch_init
1028 Initializer function for the m68k gdbarch vector.
1029 Called by gdbarch. Sets up the gdbarch vector(s) for this target. */
1030
1031static struct gdbarch *
1032m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
1033{
1034 struct gdbarch_tdep *tdep = NULL;
1035 struct gdbarch *gdbarch;
8ed86d01
VP
1036 struct gdbarch_list *best_arch;
1037 struct tdesc_arch_data *tdesc_data = NULL;
1038 int i;
1039 enum m68k_flavour flavour = m68k_no_flavour;
1040 int has_fp = 1;
1041 const struct floatformat **long_double_format = floatformats_m68881_ext;
1042
1043 /* Check any target description for validity. */
1044 if (tdesc_has_registers (info.target_desc))
1045 {
1046 const struct tdesc_feature *feature;
1047 int valid_p;
152d9db6 1048
8ed86d01
VP
1049 feature = tdesc_find_feature (info.target_desc,
1050 "org.gnu.gdb.m68k.core");
1051 if (feature != NULL)
1052 /* Do nothing. */
1053 ;
1054
1055 if (feature == NULL)
1056 {
1057 feature = tdesc_find_feature (info.target_desc,
1058 "org.gnu.gdb.coldfire.core");
1059 if (feature != NULL)
1060 flavour = m68k_coldfire_flavour;
1061 }
1062
1063 if (feature == NULL)
1064 {
1065 feature = tdesc_find_feature (info.target_desc,
1066 "org.gnu.gdb.fido.core");
1067 if (feature != NULL)
1068 flavour = m68k_fido_flavour;
1069 }
1070
1071 if (feature == NULL)
1072 return NULL;
1073
1074 tdesc_data = tdesc_data_alloc ();
1075
1076 valid_p = 1;
1077 for (i = 0; i <= M68K_PC_REGNUM; i++)
1078 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
1079 m68k_register_names[i]);
1080
1081 if (!valid_p)
1082 {
1083 tdesc_data_cleanup (tdesc_data);
1084 return NULL;
1085 }
1086
1087 feature = tdesc_find_feature (info.target_desc,
1088 "org.gnu.gdb.coldfire.fp");
1089 if (feature != NULL)
1090 {
1091 valid_p = 1;
1092 for (i = M68K_FP0_REGNUM; i <= M68K_FPI_REGNUM; i++)
1093 valid_p &= tdesc_numbered_register (feature, tdesc_data, i,
1094 m68k_register_names[i]);
1095 if (!valid_p)
1096 {
1097 tdesc_data_cleanup (tdesc_data);
1098 return NULL;
1099 }
1100 }
1101 else
1102 has_fp = 0;
1103 }
1104
1105 /* The mechanism for returning floating values from function
1106 and the type of long double depend on whether we're
1107 on ColdFire or standard m68k. */
1108
4ed77933 1109 if (info.bfd_arch_info && info.bfd_arch_info->mach != 0)
8ed86d01
VP
1110 {
1111 const bfd_arch_info_type *coldfire_arch =
1112 bfd_lookup_arch (bfd_arch_m68k, bfd_mach_mcf_isa_a_nodiv);
1113
1114 if (coldfire_arch
4ed77933
AS
1115 && ((*info.bfd_arch_info->compatible)
1116 (info.bfd_arch_info, coldfire_arch)))
8ed86d01
VP
1117 flavour = m68k_coldfire_flavour;
1118 }
1119
1120 /* If there is already a candidate, use it. */
1121 for (best_arch = gdbarch_list_lookup_by_info (arches, &info);
1122 best_arch != NULL;
1123 best_arch = gdbarch_list_lookup_by_info (best_arch->next, &info))
1124 {
1125 if (flavour != gdbarch_tdep (best_arch->gdbarch)->flavour)
1126 continue;
1127
1128 if (has_fp != gdbarch_tdep (best_arch->gdbarch)->fpregs_present)
1129 continue;
1130
1131 break;
1132 }
152d9db6 1133
eb2e12d7
AS
1134 tdep = xmalloc (sizeof (struct gdbarch_tdep));
1135 gdbarch = gdbarch_alloc (&info, tdep);
8ed86d01
VP
1136 tdep->fpregs_present = has_fp;
1137 tdep->flavour = flavour;
152d9db6 1138
8ed86d01
VP
1139 if (flavour == m68k_coldfire_flavour || flavour == m68k_fido_flavour)
1140 long_double_format = floatformats_ieee_double;
1141 set_gdbarch_long_double_format (gdbarch, long_double_format);
1142 set_gdbarch_long_double_bit (gdbarch, long_double_format[0]->totalsize);
5d3ed2e3 1143
5d3ed2e3 1144 set_gdbarch_skip_prologue (gdbarch, m68k_skip_prologue);
103a1597 1145 set_gdbarch_breakpoint_from_pc (gdbarch, m68k_local_breakpoint_from_pc);
5d3ed2e3
GS
1146
1147 /* Stack grows down. */
1148 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
9bb47d95 1149 set_gdbarch_frame_align (gdbarch, m68k_frame_align);
6300c360
GS
1150
1151 set_gdbarch_believe_pcc_promotion (gdbarch, 1);
8ed86d01
VP
1152 if (flavour == m68k_coldfire_flavour || flavour == m68k_fido_flavour)
1153 set_gdbarch_decr_pc_after_break (gdbarch, 2);
942dc0e9 1154
6300c360 1155 set_gdbarch_frame_args_skip (gdbarch, 8);
6dd0fba6 1156 set_gdbarch_dwarf2_reg_to_regnum (gdbarch, m68k_dwarf_reg_to_regnum);
942dc0e9 1157
8de307e0 1158 set_gdbarch_register_type (gdbarch, m68k_register_type);
5d3ed2e3 1159 set_gdbarch_register_name (gdbarch, m68k_register_name);
6dd0fba6 1160 set_gdbarch_num_regs (gdbarch, M68K_NUM_REGS);
32eeb91a 1161 set_gdbarch_sp_regnum (gdbarch, M68K_SP_REGNUM);
32eeb91a
AS
1162 set_gdbarch_pc_regnum (gdbarch, M68K_PC_REGNUM);
1163 set_gdbarch_ps_regnum (gdbarch, M68K_PS_REGNUM);
1164 set_gdbarch_fp0_regnum (gdbarch, M68K_FP0_REGNUM);
e47577ab
MK
1165 set_gdbarch_convert_register_p (gdbarch, m68k_convert_register_p);
1166 set_gdbarch_register_to_value (gdbarch, m68k_register_to_value);
1167 set_gdbarch_value_to_register (gdbarch, m68k_value_to_register);
a2c6a6d5 1168
8ed86d01
VP
1169 if (has_fp)
1170 set_gdbarch_fp0_regnum (gdbarch, M68K_FP0_REGNUM);
1171
1172 /* Try to figure out if the arch uses floating registers to return
1173 floating point values from functions. */
1174 if (has_fp)
1175 {
1176 /* On ColdFire, floating point values are returned in D0. */
1177 if (flavour == m68k_coldfire_flavour)
1178 tdep->float_return = 0;
1179 else
1180 tdep->float_return = 1;
1181 }
1182 else
1183 {
1184 /* No floating registers, so can't use them for returning values. */
1185 tdep->float_return = 0;
1186 }
1187
1188 /* Function call & return */
8de307e0 1189 set_gdbarch_push_dummy_call (gdbarch, m68k_push_dummy_call);
f595cb19 1190 set_gdbarch_return_value (gdbarch, m68k_return_value);
6c0e89ed 1191
8ed86d01 1192
650fcc91
AS
1193 /* Disassembler. */
1194 set_gdbarch_print_insn (gdbarch, print_insn_m68k);
1195
eb2e12d7
AS
1196#if defined JB_PC && defined JB_ELEMENT_SIZE
1197 tdep->jb_pc = JB_PC;
1198 tdep->jb_elt_size = JB_ELEMENT_SIZE;
1199#else
1200 tdep->jb_pc = -1;
1201#endif
f595cb19 1202 tdep->struct_value_regnum = M68K_A1_REGNUM;
66894781 1203 tdep->struct_return = reg_struct_return;
8de307e0
AS
1204
1205 /* Frame unwinder. */
f36bf22c 1206 set_gdbarch_dummy_id (gdbarch, m68k_dummy_id);
8de307e0 1207 set_gdbarch_unwind_pc (gdbarch, m68k_unwind_pc);
3f244638
AS
1208
1209 /* Hook in the DWARF CFI frame unwinder. */
f36bf22c 1210 dwarf2_append_unwinders (gdbarch);
3f244638 1211
8de307e0 1212 frame_base_set_default (gdbarch, &m68k_frame_base);
eb2e12d7 1213
55809acb
AS
1214 /* Hook in ABI-specific overrides, if they have been registered. */
1215 gdbarch_init_osabi (info, gdbarch);
1216
eb2e12d7
AS
1217 /* Now we have tuned the configuration, set a few final things,
1218 based on what the OS ABI has told us. */
1219
1220 if (tdep->jb_pc >= 0)
1221 set_gdbarch_get_longjmp_target (gdbarch, m68k_get_longjmp_target);
1222
f36bf22c 1223 frame_unwind_append_unwinder (gdbarch, &m68k_frame_unwind);
8de307e0 1224
8ed86d01 1225 if (tdesc_data)
7cc46491 1226 tdesc_use_registers (gdbarch, info.target_desc, tdesc_data);
8ed86d01 1227
152d9db6
GS
1228 return gdbarch;
1229}
1230
1231
1232static void
c984b7ff 1233m68k_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
152d9db6 1234{
c984b7ff 1235 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
152d9db6 1236
eb2e12d7
AS
1237 if (tdep == NULL)
1238 return;
152d9db6 1239}
2acceee2 1240
a78f21af
AC
1241extern initialize_file_ftype _initialize_m68k_tdep; /* -Wmissing-prototypes */
1242
c906108c 1243void
fba45db2 1244_initialize_m68k_tdep (void)
c906108c 1245{
152d9db6 1246 gdbarch_register (bfd_arch_m68k, m68k_gdbarch_init, m68k_dump_tdep);
4713453b
AS
1247
1248 /* Initialize the m68k-specific register types. */
1249 m68k_init_types ();
c906108c 1250}
This page took 0.777832 seconds and 4 git commands to generate.