2004-02-15 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / gdb / ns32k-tdep.c
CommitLineData
93d5585d 1/* Target dependent code for the NS32000, for GDB.
464e0365
AC
2
3 Copyright 1986, 1988, 1991, 1992, 1994, 1995, 1998, 1999, 2000,
4 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
c906108c 12
c5aa993b
JM
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
c906108c 17
c5aa993b
JM
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
c906108c
SS
22
23#include "defs.h"
f6427ade 24#include "frame.h"
93d5585d 25#include "gdbtypes.h"
381bab78 26#include "gdbcore.h"
93d5585d
JT
27#include "inferior.h"
28#include "regcache.h"
29#include "target.h"
93d5585d 30#include "arch-utils.h"
4be87837 31#include "osabi.h"
a89aa300 32#include "dis-asm.h"
93d5585d
JT
33
34#include "ns32k-tdep.h"
9bbe19fb 35#include "gdb_string.h"
381bab78
AC
36
37static int sign_extend (int value, int bits);
78f9d765
JT
38static CORE_ADDR ns32k_get_enter_addr (CORE_ADDR);
39static int ns32k_localcount (CORE_ADDR enter_pc);
7bcc927b 40static void flip_bytes (void *, int);
c906108c 41
fa88f677 42static const char *
af137673 43ns32k_register_name_32082 (int regno)
c906108c 44{
af137673
JT
45 static char *register_names[] =
46 {
47 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
48 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
49 "sp", "fp", "pc", "ps",
50 "l0", "l1", "l2", "l3", "xx",
51 };
52
53 if (regno < 0)
54 return NULL;
55 if (regno >= sizeof (register_names) / sizeof (*register_names))
56 return NULL;
57
58 return (register_names[regno]);
59}
60
fa88f677 61static const char *
af137673
JT
62ns32k_register_name_32382 (int regno)
63{
64 static char *register_names[] =
65 {
66 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
67 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
68 "sp", "fp", "pc", "ps",
69 "fsr",
70 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7", "xx",
71 };
72
73 if (regno < 0)
74 return NULL;
75 if (regno >= sizeof (register_names) / sizeof (*register_names))
76 return NULL;
77
78 return (register_names[regno]);
c906108c 79}
b83266a0 80
93d5585d 81static int
f2c762e0
JT
82ns32k_register_byte_32082 (int regno)
83{
93d5585d
JT
84 if (regno >= NS32K_LP0_REGNUM)
85 return (NS32K_LP0_REGNUM * 4) + ((regno - NS32K_LP0_REGNUM) * 8);
f2c762e0
JT
86
87 return (regno * 4);
88}
89
93d5585d 90static int
f2c762e0
JT
91ns32k_register_byte_32382 (int regno)
92{
93 /* This is a bit yuk. The even numbered double precision floating
94 point long registers occupy the same space as the even:odd numbered
95 single precision floating point registers, but the extra 32381 FPU
96 registers are at the end. Doing it this way is compatible for both
97 32081 and 32381 equipped machines. */
98
93d5585d
JT
99 return ((regno < NS32K_LP0_REGNUM ? regno
100 : (regno - NS32K_LP0_REGNUM) & 1 ? regno - 1
101 : (regno - NS32K_LP0_REGNUM + FP0_REGNUM)) * 4);
f2c762e0
JT
102}
103
93d5585d 104static int
f2c762e0
JT
105ns32k_register_raw_size (int regno)
106{
107 /* All registers are 4 bytes, except for the doubled floating
108 registers. */
109
93d5585d 110 return ((regno >= NS32K_LP0_REGNUM) ? 8 : 4);
f2c762e0
JT
111}
112
93d5585d 113static int
f2c762e0
JT
114ns32k_register_virtual_size (int regno)
115{
93d5585d 116 return ((regno >= NS32K_LP0_REGNUM) ? 8 : 4);
f2c762e0
JT
117}
118
93d5585d 119static struct type *
f2c762e0
JT
120ns32k_register_virtual_type (int regno)
121{
122 if (regno < FP0_REGNUM)
123 return (builtin_type_int);
124
125 if (regno < FP0_REGNUM + 8)
126 return (builtin_type_float);
127
93d5585d 128 if (regno < NS32K_LP0_REGNUM)
f2c762e0
JT
129 return (builtin_type_int);
130
131 return (builtin_type_double);
132}
133
efb2c70e
JT
134/* Immediately after a function call, return the saved PC. Can't
135 always go through the frames for this because on some systems,
136 the new frame is not set up until the new function executes some
137 instructions. */
138
93d5585d 139static CORE_ADDR
efb2c70e
JT
140ns32k_saved_pc_after_call (struct frame_info *frame)
141{
142 return (read_memory_integer (read_register (SP_REGNUM), 4));
143}
144
b83266a0
SS
145/* Advance PC across any function entry prologue instructions
146 to reach some "real" code. */
147
93d5585d 148static CORE_ADDR
fba45db2 149umax_skip_prologue (CORE_ADDR pc)
b83266a0 150{
52f0bd74 151 unsigned char op = read_memory_integer (pc, 1);
b83266a0
SS
152 if (op == 0x82)
153 {
c5aa993b 154 op = read_memory_integer (pc + 2, 1);
b83266a0
SS
155 if ((op & 0x80) == 0)
156 pc += 3;
157 else if ((op & 0xc0) == 0x80)
158 pc += 4;
159 else
160 pc += 6;
c5aa993b 161 }
b83266a0
SS
162 return pc;
163}
78f9d765 164\f
93d5585d 165static const unsigned char *
78f9d765
JT
166ns32k_breakpoint_from_pc (CORE_ADDR *pcp, int *lenp)
167{
168 static const unsigned char breakpoint_insn[] = { 0xf2 };
169
170 *lenp = sizeof (breakpoint_insn);
171 return breakpoint_insn;
172}
b83266a0 173
cce74817
JM
174/* Return number of args passed to a frame.
175 Can return -1, meaning no way to tell.
176 Encore's C compiler often reuses same area on stack for args,
177 so this will often not work properly. If the arg names
178 are known, it's likely most of them will be printed. */
bb19ff3b 179
93d5585d 180static int
fba45db2 181umax_frame_num_args (struct frame_info *fi)
392a587b
JM
182{
183 int numargs;
184 CORE_ADDR pc;
185 CORE_ADDR enter_addr;
186 unsigned int insn;
187 unsigned int addr_mode;
188 int width;
189
190 numargs = -1;
50abf9e5 191 enter_addr = ns32k_get_enter_addr (get_frame_pc (fi));
392a587b
JM
192 if (enter_addr > 0)
193 {
194 pc = ((enter_addr == 1)
6913c89a 195 ? DEPRECATED_SAVED_PC_AFTER_CALL (fi)
8bedc050 196 : DEPRECATED_FRAME_SAVED_PC (fi));
c5aa993b 197 insn = read_memory_integer (pc, 2);
392a587b
JM
198 addr_mode = (insn >> 11) & 0x1f;
199 insn = insn & 0x7ff;
200 if ((insn & 0x7fc) == 0x57c
c5aa993b 201 && addr_mode == 0x14) /* immediate */
392a587b 202 {
c5aa993b 203 if (insn == 0x57c) /* adjspb */
392a587b 204 width = 1;
c5aa993b 205 else if (insn == 0x57d) /* adjspw */
392a587b 206 width = 2;
c5aa993b 207 else if (insn == 0x57f) /* adjspd */
392a587b 208 width = 4;
381bab78
AC
209 else
210 internal_error (__FILE__, __LINE__, "bad else");
c5aa993b 211 numargs = read_memory_integer (pc + 2, width);
392a587b
JM
212 if (width > 1)
213 flip_bytes (&numargs, width);
c5aa993b 214 numargs = -sign_extend (numargs, width * 8) / 4;
392a587b
JM
215 }
216 }
217 return numargs;
218}
b83266a0 219
381bab78 220static int
fba45db2 221sign_extend (int value, int bits)
c906108c
SS
222{
223 value = value & ((1 << bits) - 1);
c5aa993b 224 return (value & (1 << (bits - 1))
c906108c
SS
225 ? value | (~((1 << bits) - 1))
226 : value);
227}
228
7bcc927b 229static void
381bab78 230flip_bytes (void *p, int count)
c906108c
SS
231{
232 char tmp;
381bab78 233 char *ptr = 0;
c906108c
SS
234
235 while (count > 0)
236 {
237 tmp = *ptr;
c5aa993b
JM
238 ptr[0] = ptr[count - 1];
239 ptr[count - 1] = tmp;
c906108c
SS
240 ptr++;
241 count -= 2;
242 }
243}
244
78f9d765
JT
245/* Return the number of locals in the current frame given a
246 pc pointing to the enter instruction. This is used by
247 ns32k_frame_init_saved_regs. */
c906108c 248
78f9d765 249static int
fba45db2 250ns32k_localcount (CORE_ADDR enter_pc)
c906108c
SS
251{
252 unsigned char localtype;
253 int localcount;
254
c5aa993b 255 localtype = read_memory_integer (enter_pc + 2, 1);
c906108c
SS
256 if ((localtype & 0x80) == 0)
257 localcount = localtype;
258 else if ((localtype & 0xc0) == 0x80)
259 localcount = (((localtype & 0x3f) << 8)
c5aa993b 260 | (read_memory_integer (enter_pc + 3, 1) & 0xff));
c906108c
SS
261 else
262 localcount = (((localtype & 0x3f) << 24)
c5aa993b
JM
263 | ((read_memory_integer (enter_pc + 3, 1) & 0xff) << 16)
264 | ((read_memory_integer (enter_pc + 4, 1) & 0xff) << 8)
265 | (read_memory_integer (enter_pc + 5, 1) & 0xff));
c906108c
SS
266 return localcount;
267}
268
269
270/* Nonzero if instruction at PC is a return instruction. */
271
272static int
fba45db2 273ns32k_about_to_return (CORE_ADDR pc)
c906108c
SS
274{
275 return (read_memory_integer (pc, 1) == 0x12);
276}
277
78f9d765
JT
278/* Get the address of the enter opcode for this function, if it is active.
279 Returns positive address > 1 if pc is between enter/exit,
280 1 if pc before enter or after exit, 0 otherwise. */
281static CORE_ADDR
fba45db2 282ns32k_get_enter_addr (CORE_ADDR pc)
c906108c
SS
283{
284 CORE_ADDR enter_addr;
285 unsigned char op;
286
287 if (pc == 0)
288 return 0;
289
290 if (ns32k_about_to_return (pc))
c5aa993b 291 return 1; /* after exit */
c906108c
SS
292
293 enter_addr = get_pc_function_start (pc);
294
c5aa993b
JM
295 if (pc == enter_addr)
296 return 1; /* before enter */
c906108c
SS
297
298 op = read_memory_integer (enter_addr, 1);
299
300 if (op != 0x82)
c5aa993b 301 return 0; /* function has no enter/exit */
c906108c 302
c5aa993b 303 return enter_addr; /* pc is between enter and exit */
c906108c 304}
af137673 305
93d5585d 306static CORE_ADDR
78f9d765
JT
307ns32k_frame_chain (struct frame_info *frame)
308{
309 /* In the case of the NS32000 series, the frame's nominal address is the
310 FP value, and that address is saved at the previous FP value as a
311 4-byte word. */
1e2330ba 312 return (read_memory_integer (get_frame_base (frame), 4));
78f9d765
JT
313}
314
f407986f
AC
315
316static CORE_ADDR
317ns32k_sigtramp_saved_pc (struct frame_info *frame)
318{
319 CORE_ADDR sigcontext_addr;
320 char *buf;
321 int ptrbytes = TYPE_LENGTH (builtin_type_void_func_ptr);
322 int sigcontext_offs = (2 * TARGET_INT_BIT) / TARGET_CHAR_BIT;
323
324 buf = alloca (ptrbytes);
325 /* Get sigcontext address, it is the third parameter on the stack. */
11c02a10 326 if (get_next_frame (frame))
f407986f 327 sigcontext_addr = read_memory_typed_address
42efa47a 328 (DEPRECATED_FRAME_ARGS_ADDRESS (get_next_frame (frame)) + FRAME_ARGS_SKIP + sigcontext_offs,
f407986f
AC
329 builtin_type_void_data_ptr);
330 else
331 sigcontext_addr = read_memory_typed_address
332 (read_register (SP_REGNUM) + sigcontext_offs, builtin_type_void_data_ptr);
333
5929a910
AC
334 /* Offset to saved PC in sigcontext, from <machine/signal.h>. Don't
335 cause a memory_error when accessing sigcontext in case the stack
f407986f 336 layout has changed or the stack is corrupt. */
5929a910 337 target_read_memory (sigcontext_addr + 20, buf, ptrbytes);
f407986f
AC
338 return extract_typed_address (buf, builtin_type_void_func_ptr);
339}
340
93d5585d 341static CORE_ADDR
78f9d765
JT
342ns32k_frame_saved_pc (struct frame_info *frame)
343{
5a203e44 344 if ((get_frame_type (frame) == SIGTRAMP_FRAME))
f407986f 345 return (ns32k_sigtramp_saved_pc (frame)); /* XXXJRT */
78f9d765 346
1e2330ba 347 return (read_memory_integer (get_frame_base (frame) + 4, 4));
78f9d765
JT
348}
349
93d5585d 350static CORE_ADDR
78f9d765
JT
351ns32k_frame_args_address (struct frame_info *frame)
352{
50abf9e5 353 if (ns32k_get_enter_addr (get_frame_pc (frame)) > 1)
1e2330ba 354 return (get_frame_base (frame));
78f9d765
JT
355
356 return (read_register (SP_REGNUM) - 4);
357}
358
78f9d765
JT
359/* Code to initialize the addresses of the saved registers of frame described
360 by FRAME_INFO. This includes special registers such as pc and fp saved in
361 special ways in the stack frame. sp is even more special: the address we
362 return for it IS the sp for the next frame. */
363
93d5585d 364static void
78f9d765
JT
365ns32k_frame_init_saved_regs (struct frame_info *frame)
366{
367 int regmask, regnum;
368 int localcount;
369 CORE_ADDR enter_addr, next_addr;
370
1b1d3794 371 if (deprecated_get_frame_saved_regs (frame))
78f9d765
JT
372 return;
373
374 frame_saved_regs_zalloc (frame);
375
50abf9e5 376 enter_addr = ns32k_get_enter_addr (get_frame_pc (frame));
78f9d765
JT
377 if (enter_addr > 1)
378 {
379 regmask = read_memory_integer (enter_addr + 1, 1) & 0xff;
380 localcount = ns32k_localcount (enter_addr);
1e2330ba 381 next_addr = get_frame_base (frame) + localcount;
78f9d765
JT
382
383 for (regnum = 0; regnum < 8; regnum++)
384 {
385 if (regmask & (1 << regnum))
1b1d3794 386 deprecated_get_frame_saved_regs (frame)[regnum] = next_addr -= 4;
78f9d765
JT
387 }
388
1b1d3794
AC
389 deprecated_get_frame_saved_regs (frame)[SP_REGNUM] = get_frame_base (frame) + 4;
390 deprecated_get_frame_saved_regs (frame)[PC_REGNUM] = get_frame_base (frame) + 4;
391 deprecated_get_frame_saved_regs (frame)[DEPRECATED_FP_REGNUM] = read_memory_integer (get_frame_base (frame), 4);
78f9d765
JT
392 }
393 else if (enter_addr == 1)
394 {
395 CORE_ADDR sp = read_register (SP_REGNUM);
1b1d3794
AC
396 deprecated_get_frame_saved_regs (frame)[PC_REGNUM] = sp;
397 deprecated_get_frame_saved_regs (frame)[SP_REGNUM] = sp + 4;
78f9d765
JT
398 }
399}
400
93d5585d 401static void
78f9d765
JT
402ns32k_push_dummy_frame (void)
403{
404 CORE_ADDR sp = read_register (SP_REGNUM);
405 int regnum;
406
407 sp = push_word (sp, read_register (PC_REGNUM));
0ba6dca9
AC
408 sp = push_word (sp, read_register (DEPRECATED_FP_REGNUM));
409 write_register (DEPRECATED_FP_REGNUM, sp);
78f9d765
JT
410
411 for (regnum = 0; regnum < 8; regnum++)
412 sp = push_word (sp, read_register (regnum));
413
414 write_register (SP_REGNUM, sp);
415}
416
93d5585d 417static void
78f9d765
JT
418ns32k_pop_frame (void)
419{
420 struct frame_info *frame = get_current_frame ();
421 CORE_ADDR fp;
422 int regnum;
423
1e2330ba 424 fp = get_frame_base (frame);
f30ee0bc 425 DEPRECATED_FRAME_INIT_SAVED_REGS (frame);
78f9d765
JT
426
427 for (regnum = 0; regnum < 8; regnum++)
1b1d3794 428 if (deprecated_get_frame_saved_regs (frame)[regnum])
78f9d765 429 write_register (regnum,
1b1d3794 430 read_memory_integer (deprecated_get_frame_saved_regs (frame)[regnum], 4));
78f9d765 431
0ba6dca9 432 write_register (DEPRECATED_FP_REGNUM, read_memory_integer (fp, 4));
78f9d765
JT
433 write_register (PC_REGNUM, read_memory_integer (fp + 4, 4));
434 write_register (SP_REGNUM, fp + 8);
435 flush_cached_frames ();
436}
7bcc927b
JT
437\f
438/* The NS32000 call dummy sequence:
439
440 enter 0xff,0 82 ff 00
441 jsr @0x00010203 7f ae c0 01 02 03
442 adjspd 0x69696969 7f a5 01 02 03 04
443 bpt f2
444
445 It is 16 bytes long. */
446
93d5585d 447static LONGEST ns32k_call_dummy_words[] =
7bcc927b
JT
448{
449 0x7f00ff82,
450 0x0201c0ae,
451 0x01a57f03,
452 0xf2040302
453};
93d5585d 454static int sizeof_ns32k_call_dummy_words = sizeof (ns32k_call_dummy_words);
7bcc927b
JT
455
456#define NS32K_CALL_DUMMY_ADDR 5
457#define NS32K_CALL_DUMMY_NARGS 11
78f9d765 458
93d5585d 459static void
7bcc927b
JT
460ns32k_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs,
461 struct value **args, struct type *type, int gcc_p)
462{
463 int flipped;
464
465 flipped = fun | 0xc0000000;
466 flip_bytes (&flipped, 4);
467 store_unsigned_integer (dummy + NS32K_CALL_DUMMY_ADDR, 4, flipped);
468
469 flipped = - nargs * 4;
470 flip_bytes (&flipped, 4);
471 store_unsigned_integer (dummy + NS32K_CALL_DUMMY_NARGS, 4, flipped);
472}
473\f
93d5585d 474static void
efb2c70e
JT
475ns32k_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
476{
477 /* On this machine, this is a no-op (Encore Umax didn't use GCC). */
478}
479
93d5585d 480static void
efb2c70e
JT
481ns32k_extract_return_value (struct type *valtype, char *regbuf, char *valbuf)
482{
483 memcpy (valbuf,
62700349 484 regbuf + DEPRECATED_REGISTER_BYTE (TYPE_CODE (valtype) == TYPE_CODE_FLT ?
efb2c70e
JT
485 FP0_REGNUM : 0), TYPE_LENGTH (valtype));
486}
487
93d5585d 488static void
efb2c70e
JT
489ns32k_store_return_value (struct type *valtype, char *valbuf)
490{
73937e03
AC
491 deprecated_write_register_bytes (TYPE_CODE (valtype) == TYPE_CODE_FLT
492 ? FP0_REGNUM : 0, valbuf,
493 TYPE_LENGTH (valtype));
efb2c70e
JT
494}
495
93d5585d
JT
496void
497ns32k_gdbarch_init_32082 (struct gdbarch *gdbarch)
498{
499 set_gdbarch_num_regs (gdbarch, NS32K_NUM_REGS_32082);
500
501 set_gdbarch_register_name (gdbarch, ns32k_register_name_32082);
b8b527c5 502 set_gdbarch_deprecated_register_bytes (gdbarch, NS32K_REGISTER_BYTES_32082);
9c04cab7 503 set_gdbarch_deprecated_register_byte (gdbarch, ns32k_register_byte_32082);
93d5585d
JT
504}
505
506void
507ns32k_gdbarch_init_32382 (struct gdbarch *gdbarch)
508{
509 set_gdbarch_num_regs (gdbarch, NS32K_NUM_REGS_32382);
510
511 set_gdbarch_register_name (gdbarch, ns32k_register_name_32382);
b8b527c5 512 set_gdbarch_deprecated_register_bytes (gdbarch, NS32K_REGISTER_BYTES_32382);
9c04cab7 513 set_gdbarch_deprecated_register_byte (gdbarch, ns32k_register_byte_32382);
93d5585d
JT
514}
515
516/* Initialize the current architecture based on INFO. If possible, re-use an
517 architecture from ARCHES, which is a list of architectures already created
518 during this debugging session.
519
520 Called e.g. at program startup, when reading a core file, and when reading
521 a binary file. */
522
523static struct gdbarch *
524ns32k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
525{
93d5585d 526 struct gdbarch *gdbarch;
93d5585d 527
4be87837
DJ
528 /* If there is already a candidate, use it. */
529 arches = gdbarch_list_lookup_by_info (arches, &info);
530 if (arches != NULL)
531 return arches->gdbarch;
93d5585d 532
4be87837 533 gdbarch = gdbarch_alloc (&info, NULL);
93d5585d 534
a5afb99f
AC
535 /* NOTE: cagney/2002-12-06: This can be deleted when this arch is
536 ready to unwind the PC first (see frame.c:get_prev_frame()). */
0968aa8c 537 set_gdbarch_deprecated_init_frame_pc (gdbarch, deprecated_init_frame_pc_default);
a5afb99f 538
93d5585d
JT
539 /* Register info */
540 ns32k_gdbarch_init_32082 (gdbarch);
541 set_gdbarch_num_regs (gdbarch, NS32K_SP_REGNUM);
542 set_gdbarch_num_regs (gdbarch, NS32K_FP_REGNUM);
543 set_gdbarch_num_regs (gdbarch, NS32K_PC_REGNUM);
544 set_gdbarch_num_regs (gdbarch, NS32K_PS_REGNUM);
545
b1e29e33 546 set_gdbarch_deprecated_register_size (gdbarch, NS32K_REGISTER_SIZE);
9c04cab7 547 set_gdbarch_deprecated_register_raw_size (gdbarch, ns32k_register_raw_size);
a0ed5532 548 set_gdbarch_deprecated_max_register_raw_size (gdbarch, NS32K_MAX_REGISTER_RAW_SIZE);
9c04cab7 549 set_gdbarch_deprecated_register_virtual_size (gdbarch, ns32k_register_virtual_size);
a0ed5532 550 set_gdbarch_deprecated_max_register_virtual_size (gdbarch,
93d5585d 551 NS32K_MAX_REGISTER_VIRTUAL_SIZE);
9c04cab7 552 set_gdbarch_deprecated_register_virtual_type (gdbarch, ns32k_register_virtual_type);
93d5585d
JT
553
554 /* Frame and stack info */
555 set_gdbarch_skip_prologue (gdbarch, umax_skip_prologue);
6913c89a 556 set_gdbarch_deprecated_saved_pc_after_call (gdbarch, ns32k_saved_pc_after_call);
93d5585d
JT
557
558 set_gdbarch_frame_num_args (gdbarch, umax_frame_num_args);
559 set_gdbarch_frameless_function_invocation (gdbarch,
560 generic_frameless_function_invocation_not);
561
618ce49f 562 set_gdbarch_deprecated_frame_chain (gdbarch, ns32k_frame_chain);
8bedc050 563 set_gdbarch_deprecated_frame_saved_pc (gdbarch, ns32k_frame_saved_pc);
93d5585d 564
42efa47a 565 set_gdbarch_deprecated_frame_args_address (gdbarch, ns32k_frame_args_address);
93d5585d 566
f30ee0bc 567 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, ns32k_frame_init_saved_regs);
93d5585d
JT
568
569 set_gdbarch_frame_args_skip (gdbarch, 8);
570
93d5585d
JT
571 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
572
573 /* Return value info */
4183d812 574 set_gdbarch_deprecated_store_struct_return (gdbarch, ns32k_store_struct_return);
26e9b323 575 set_gdbarch_deprecated_extract_return_value (gdbarch, ns32k_extract_return_value);
ebba8386 576 set_gdbarch_deprecated_store_return_value (gdbarch, ns32k_store_return_value);
93d5585d
JT
577
578 /* Call dummy info */
f3824013 579 set_gdbarch_deprecated_push_dummy_frame (gdbarch, ns32k_push_dummy_frame);
749b82f6 580 set_gdbarch_deprecated_pop_frame (gdbarch, ns32k_pop_frame);
93d5585d 581 set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
b1e29e33
AC
582 set_gdbarch_deprecated_call_dummy_words (gdbarch, ns32k_call_dummy_words);
583 set_gdbarch_deprecated_sizeof_call_dummy_words (gdbarch, sizeof_ns32k_call_dummy_words);
584 set_gdbarch_deprecated_fix_call_dummy (gdbarch, ns32k_fix_call_dummy);
585 set_gdbarch_deprecated_call_dummy_start_offset (gdbarch, 3);
586 set_gdbarch_deprecated_call_dummy_breakpoint_offset (gdbarch, 15);
07555a72 587 set_gdbarch_deprecated_use_generic_dummy_frames (gdbarch, 0);
ae45cd16 588 set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_on_stack);
93d5585d
JT
589
590 /* Breakpoint info */
93d5585d
JT
591 set_gdbarch_breakpoint_from_pc (gdbarch, ns32k_breakpoint_from_pc);
592
6c0e89ed 593 /* Should be using push_dummy_call. */
b46e02f6 594 set_gdbarch_deprecated_dummy_write_sp (gdbarch, deprecated_write_sp);
6c0e89ed 595
36482093
AC
596 set_gdbarch_print_insn (gdbarch, print_insn_ns32k);
597
93d5585d 598 /* Hook in OS ABI-specific overrides, if they have been registered. */
4be87837 599 gdbarch_init_osabi (info, gdbarch);
93d5585d
JT
600
601 return (gdbarch);
602}
603
a78f21af
AC
604extern initialize_file_ftype _initialize_ns32k_tdep; /* -Wmissing-prototypes */
605
efb2c70e 606void
af137673
JT
607_initialize_ns32k_tdep (void)
608{
4be87837 609 gdbarch_register (bfd_arch_ns32k, ns32k_gdbarch_init, NULL);
93d5585d 610
af137673 611}
This page took 0.519867 seconds and 4 git commands to generate.