2002-09-17 Andrew Cagney <cagney@redhat.com>
[deliverable/binutils-gdb.git] / gdb / frame.c
1 /* Cache and manage frames for GDB, the GNU debugger.
2
3 Copyright 1986, 1987, 1989, 1991, 1994, 1995, 1996, 1998, 2000,
4 2001, 2002 Free Software Foundation, Inc.
5
6 This file is part of GDB.
7
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.
12
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.
17
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. */
22
23 #include "defs.h"
24 #include "frame.h"
25 #include "target.h"
26 #include "value.h"
27 #include "inferior.h" /* for inferior_ptid */
28 #include "regcache.h"
29 #include "gdb_assert.h"
30
31 /* Return a frame uniq ID that can be used to, later re-find the
32 frame. */
33
34 void
35 get_frame_id (struct frame_info *fi, struct frame_id *id)
36 {
37 if (fi == NULL)
38 {
39 id->base = 0;
40 id->pc = 0;
41 }
42 else
43 {
44 id->base = FRAME_FP (fi);
45 id->pc = fi->pc;
46 }
47 }
48
49 struct frame_info *
50 frame_find_by_id (struct frame_id id)
51 {
52 struct frame_info *frame;
53
54 /* ZERO denotes the null frame, let the caller decide what to do
55 about it. Should it instead return get_current_frame()? */
56 if (id.base == 0 && id.pc == 0)
57 return NULL;
58
59 for (frame = get_current_frame ();
60 frame != NULL;
61 frame = get_prev_frame (frame))
62 {
63 if (INNER_THAN (FRAME_FP (frame), id.base))
64 /* ``inner/current < frame < id.base''. Keep looking along
65 the frame chain. */
66 continue;
67 if (INNER_THAN (id.base, FRAME_FP (frame)))
68 /* ``inner/current < id.base < frame''. Oops, gone past it.
69 Just give up. */
70 return NULL;
71 /* FIXME: cagney/2002-04-21: This isn't sufficient. It should
72 use id.pc to check that the two frames belong to the same
73 function. Otherwise we'll do things like match dummy frames
74 or mis-match frameless functions. However, until someone
75 notices, stick with the existing behavour. */
76 return frame;
77 }
78 return NULL;
79 }
80
81 void
82 frame_register_unwind (struct frame_info *frame, int regnum,
83 int *optimizedp, enum lval_type *lvalp,
84 CORE_ADDR *addrp, int *realnump, void *bufferp)
85 {
86 struct frame_unwind_cache *cache;
87
88 /* Require all but BUFFERP to be valid. A NULL BUFFERP indicates
89 that the value proper does not need to be fetched. */
90 gdb_assert (optimizedp != NULL);
91 gdb_assert (lvalp != NULL);
92 gdb_assert (addrp != NULL);
93 gdb_assert (realnump != NULL);
94 /* gdb_assert (bufferp != NULL); */
95
96 /* NOTE: cagney/2002-04-14: It would be nice if, instead of a
97 special case, there was always an inner frame dedicated to the
98 hardware registers. Unfortunatly, there is too much unwind code
99 around that looks up/down the frame chain while making the
100 assumption that each frame level is using the same unwind code. */
101
102 if (frame == NULL)
103 {
104 /* We're in the inner-most frame, get the value direct from the
105 register cache. */
106 *optimizedp = 0;
107 *lvalp = lval_register;
108 /* ULGH! Code uses the offset into the raw register byte array
109 as a way of identifying a register. */
110 *addrp = REGISTER_BYTE (regnum);
111 /* Should this code test ``register_cached (regnum) < 0'' and do
112 something like set realnum to -1 when the register isn't
113 available? */
114 *realnump = regnum;
115 if (bufferp)
116 read_register_gen (regnum, bufferp);
117 return;
118 }
119
120 /* Ask this frame to unwind its register. */
121 frame->register_unwind (frame, &frame->register_unwind_cache, regnum,
122 optimizedp, lvalp, addrp, realnump, bufferp);
123 }
124
125 void
126 frame_unwind_signed_register (struct frame_info *frame, int regnum,
127 LONGEST *val)
128 {
129 int optimized;
130 CORE_ADDR addr;
131 int realnum;
132 enum lval_type lval;
133 void *buf = alloca (MAX_REGISTER_RAW_SIZE);
134 frame_register_unwind (frame, regnum, &optimized, &lval, &addr,
135 &realnum, buf);
136 (*val) = extract_signed_integer (buf, REGISTER_VIRTUAL_SIZE (regnum));
137 }
138
139 void
140 frame_unwind_unsigned_register (struct frame_info *frame, int regnum,
141 ULONGEST *val)
142 {
143 int optimized;
144 CORE_ADDR addr;
145 int realnum;
146 enum lval_type lval;
147 void *buf = alloca (MAX_REGISTER_RAW_SIZE);
148 frame_register_unwind (frame, regnum, &optimized, &lval, &addr,
149 &realnum, buf);
150 (*val) = extract_unsigned_integer (buf, REGISTER_VIRTUAL_SIZE (regnum));
151 }
152
153 void
154 generic_unwind_get_saved_register (char *raw_buffer,
155 int *optimizedp,
156 CORE_ADDR *addrp,
157 struct frame_info *frame,
158 int regnum,
159 enum lval_type *lvalp)
160 {
161 int optimizedx;
162 CORE_ADDR addrx;
163 int realnumx;
164 enum lval_type lvalx;
165
166 if (!target_has_registers)
167 error ("No registers.");
168
169 /* Keep things simple, ensure that all the pointers (except valuep)
170 are non NULL. */
171 if (optimizedp == NULL)
172 optimizedp = &optimizedx;
173 if (lvalp == NULL)
174 lvalp = &lvalx;
175 if (addrp == NULL)
176 addrp = &addrx;
177
178 /* Reached the the bottom (youngest, inner most) of the frame chain
179 (youngest, inner most) frame, go direct to the hardware register
180 cache (do not pass go, do not try to cache the value, ...). The
181 unwound value would have been cached in frame->next but that
182 doesn't exist. This doesn't matter as the hardware register
183 cache is stopping any unnecessary accesses to the target. */
184
185 /* NOTE: cagney/2002-04-14: It would be nice if, instead of a
186 special case, there was always an inner frame dedicated to the
187 hardware registers. Unfortunatly, there is too much unwind code
188 around that looks up/down the frame chain while making the
189 assumption that each frame level is using the same unwind code. */
190
191 if (frame == NULL)
192 frame_register_unwind (NULL, regnum, optimizedp, lvalp, addrp, &realnumx,
193 raw_buffer);
194 else
195 frame_register_unwind (frame->next, regnum, optimizedp, lvalp, addrp,
196 &realnumx, raw_buffer);
197 }
198
199 void
200 get_saved_register (char *raw_buffer,
201 int *optimized,
202 CORE_ADDR *addrp,
203 struct frame_info *frame,
204 int regnum,
205 enum lval_type *lval)
206 {
207 GET_SAVED_REGISTER (raw_buffer, optimized, addrp, frame, regnum, lval);
208 }
209
210 /* frame_register_read ()
211
212 Find and return the value of REGNUM for the specified stack frame.
213 The number of bytes copied is REGISTER_RAW_SIZE (REGNUM).
214
215 Returns 0 if the register value could not be found. */
216
217 int
218 frame_register_read (struct frame_info *frame, int regnum, void *myaddr)
219 {
220 int optim;
221 get_saved_register (myaddr, &optim, (CORE_ADDR *) NULL, frame,
222 regnum, (enum lval_type *) NULL);
223
224 /* FIXME: cagney/2002-05-15: This test, is just bogus.
225
226 It indicates that the target failed to supply a value for a
227 register because it was "not available" at this time. Problem
228 is, the target still has the register and so get saved_register()
229 may be returning a value saved on the stack. */
230
231 if (register_cached (regnum) < 0)
232 return 0; /* register value not available */
233
234 return !optim;
235 }
This page took 0.034825 seconds and 5 git commands to generate.