Fri Sep 4 13:57:43 1998 Jakub Jelinek <jj@sunsite.ms.mff.cuni.cz>
[deliverable/binutils-gdb.git] / gdb / ns32k-tdep.c
CommitLineData
6d8dfa64 1/* Print NS 32000 instructions for GDB, the GNU debugger.
18b46e7c
SS
2 Copyright 1986, 1988, 1991, 1992, 1994, 1995
3 Free Software Foundation, Inc.
dd3b648e 4
609756e2
JG
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
6c9638b4 19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
dd3b648e 20
dd3b648e 21#include "defs.h"
dd3b648e 22
18b46e7c
SS
23void
24_initialize_ns32k_tdep ()
dd3b648e 25{
18b46e7c 26 tm_print_insn = print_insn_ns32k;
dd3b648e 27}
3dcac15f
JM
28
29sign_extend (value, bits)
30{
31 value = value & ((1 << bits) - 1);
32 return (value & (1 << (bits-1))
33 ? value | (~((1 << bits) - 1))
34 : value);
35}
36
37void
38flip_bytes (ptr, count)
39 char *ptr;
40 int count;
41{
42 char tmp;
43
44 while (count > 0)
45 {
46 tmp = *ptr;
47 ptr[0] = ptr[count-1];
48 ptr[count-1] = tmp;
49 ptr++;
50 count -= 2;
51 }
52}
53
54/* Return the number of locals in the current frame given a pc
55 pointing to the enter instruction. This is used in the macro
56 FRAME_FIND_SAVED_REGS. */
57
58int
59ns32k_localcount (enter_pc)
60 CORE_ADDR enter_pc;
61{
62 unsigned char localtype;
63 int localcount;
64
65 localtype = read_memory_integer (enter_pc+2, 1);
66 if ((localtype & 0x80) == 0)
67 localcount = localtype;
68 else if ((localtype & 0xc0) == 0x80)
69 localcount = (((localtype & 0x3f) << 8)
70 | (read_memory_integer (enter_pc+3, 1) & 0xff));
71 else
72 localcount = (((localtype & 0x3f) << 24)
73 | ((read_memory_integer (enter_pc+3, 1) & 0xff) << 16)
74 | ((read_memory_integer (enter_pc+4, 1) & 0xff) << 8 )
75 | (read_memory_integer (enter_pc+5, 1) & 0xff));
76 return localcount;
77}
78
79/*
80 * Get the address of the enter opcode for the function
81 * containing PC, if there is an enter for the function,
82 * and if the pc is between the enter and exit.
83 * Returns positive address if pc is between enter/exit,
84 * 1 if pc before enter or after exit, 0 otherwise.
85 */
86
87CORE_ADDR
88ns32k_get_enter_addr (pc)
89 CORE_ADDR pc;
90{
91 CORE_ADDR enter_addr;
92 unsigned char op;
93
94 if (pc == 0)
95 return 0;
96
97 if (ABOUT_TO_RETURN (pc))
98 return 1; /* after exit */
99
100 enter_addr = get_pc_function_start (pc);
101
102 if (pc == enter_addr)
103 return 1; /* before enter */
104
105 op = read_memory_integer (enter_addr, 1);
106
107 if (op != 0x82)
108 return 0; /* function has no enter/exit */
109
110 return enter_addr; /* pc is between enter and exit */
111}
This page took 0.340523 seconds and 4 git commands to generate.