1 /* Print NS 32000 instructions for GDB, the GNU debugger.
2 Copyright 1986, 1988, 1991, 1992, 1994, 1995, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
26 _initialize_ns32k_tdep (void)
28 tm_print_insn
= print_insn_ns32k
;
31 /* Advance PC across any function entry prologue instructions
32 to reach some "real" code. */
35 merlin_skip_prologue (CORE_ADDR pc
)
37 register int op
= read_memory_integer (pc
, 1);
40 op
= read_memory_integer (pc
+ 2, 1);
43 else if ((op
& 0xc0) == 0x80)
52 umax_skip_prologue (CORE_ADDR pc
)
54 register unsigned char op
= read_memory_integer (pc
, 1);
57 op
= read_memory_integer (pc
+ 2, 1);
60 else if ((op
& 0xc0) == 0x80)
68 /* Return number of args passed to a frame.
69 Can return -1, meaning no way to tell. */
72 merlin_frame_num_args (struct frame_info
*fi
)
80 pc
= FRAME_SAVED_PC (fi
);
81 insn
= read_memory_integer (pc
, 2);
82 addr_mode
= (insn
>> 11) & 0x1f;
84 if ((insn
& 0x7fc) == 0x57c
85 && addr_mode
== 0x14) /* immediate */
87 if (insn
== 0x57c) /* adjspb */
89 else if (insn
== 0x57d) /* adjspw */
91 else if (insn
== 0x57f) /* adjspd */
93 numargs
= read_memory_integer (pc
+ 2, width
);
95 flip_bytes (&numargs
, width
);
96 numargs
= -sign_extend (numargs
, width
* 8) / 4;
104 /* Return number of args passed to a frame.
105 Can return -1, meaning no way to tell.
106 Encore's C compiler often reuses same area on stack for args,
107 so this will often not work properly. If the arg names
108 are known, it's likely most of them will be printed. */
110 umax_frame_num_args (struct frame_info
*fi
)
114 CORE_ADDR enter_addr
;
116 unsigned int addr_mode
;
120 enter_addr
= ns32k_get_enter_addr ((fi
)->pc
);
123 pc
= ((enter_addr
== 1)
124 ? SAVED_PC_AFTER_CALL (fi
)
125 : FRAME_SAVED_PC (fi
));
126 insn
= read_memory_integer (pc
, 2);
127 addr_mode
= (insn
>> 11) & 0x1f;
129 if ((insn
& 0x7fc) == 0x57c
130 && addr_mode
== 0x14) /* immediate */
132 if (insn
== 0x57c) /* adjspb */
134 else if (insn
== 0x57d) /* adjspw */
136 else if (insn
== 0x57f) /* adjspd */
138 numargs
= read_memory_integer (pc
+ 2, width
);
140 flip_bytes (&numargs
, width
);
141 numargs
= -sign_extend (numargs
, width
* 8) / 4;
148 sign_extend (int value
, int bits
)
150 value
= value
& ((1 << bits
) - 1);
151 return (value
& (1 << (bits
- 1))
152 ? value
| (~((1 << bits
) - 1))
157 flip_bytes (char *ptr
, int count
)
164 ptr
[0] = ptr
[count
- 1];
165 ptr
[count
- 1] = tmp
;
171 /* Return the number of locals in the current frame given a pc
172 pointing to the enter instruction. This is used in the macro
173 FRAME_FIND_SAVED_REGS. */
176 ns32k_localcount (CORE_ADDR enter_pc
)
178 unsigned char localtype
;
181 localtype
= read_memory_integer (enter_pc
+ 2, 1);
182 if ((localtype
& 0x80) == 0)
183 localcount
= localtype
;
184 else if ((localtype
& 0xc0) == 0x80)
185 localcount
= (((localtype
& 0x3f) << 8)
186 | (read_memory_integer (enter_pc
+ 3, 1) & 0xff));
188 localcount
= (((localtype
& 0x3f) << 24)
189 | ((read_memory_integer (enter_pc
+ 3, 1) & 0xff) << 16)
190 | ((read_memory_integer (enter_pc
+ 4, 1) & 0xff) << 8)
191 | (read_memory_integer (enter_pc
+ 5, 1) & 0xff));
196 /* Nonzero if instruction at PC is a return instruction. */
199 ns32k_about_to_return (CORE_ADDR pc
)
201 return (read_memory_integer (pc
, 1) == 0x12);
206 * Get the address of the enter opcode for the function
207 * containing PC, if there is an enter for the function,
208 * and if the pc is between the enter and exit.
209 * Returns positive address if pc is between enter/exit,
210 * 1 if pc before enter or after exit, 0 otherwise.
214 ns32k_get_enter_addr (CORE_ADDR pc
)
216 CORE_ADDR enter_addr
;
222 if (ns32k_about_to_return (pc
))
223 return 1; /* after exit */
225 enter_addr
= get_pc_function_start (pc
);
227 if (pc
== enter_addr
)
228 return 1; /* before enter */
230 op
= read_memory_integer (enter_addr
, 1);
233 return 0; /* function has no enter/exit */
235 return enter_addr
; /* pc is between enter and exit */
This page took 0.053535 seconds and 4 git commands to generate.