]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/blockframe.c
gdb-3.5
[thirdparty/binutils-gdb.git] / gdb / blockframe.c
CommitLineData
7b4ac7e1 1/* Get info from stack frames;
2 convert between frames, blocks, functions and pc values.
4187119d 3 Copyright (C) 1986, 1987, 1988, 1989 Free Software Foundation, Inc.
7b4ac7e1 4
4187119d 5This file is part of GDB.
7b4ac7e1 6
4187119d 7GDB 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 1, or (at your option)
10any later version.
7b4ac7e1 11
4187119d 12GDB 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 GDB; see the file COPYING. If not, write to
19the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
7b4ac7e1 20
21#include "defs.h"
7b4ac7e1 22#include "param.h"
23#include "symtab.h"
24#include "frame.h"
25
4187119d 26#include <obstack.h>
27
28/* Start and end of object file containing the entry point.
29 STARTUP_FILE_END is the first address of the next file.
7b4ac7e1 30 This file is assumed to be a startup file
31 and frames with pc's inside it
4187119d 32 are treated as nonexistent.
33
34 Setting these variables is necessary so that backtraces do not fly off
35 the bottom of the stack. */
36CORE_ADDR startup_file_start;
37CORE_ADDR startup_file_end;
7b4ac7e1 38
4187119d 39/* Is ADDR outside the startup file? */
40int
41outside_startup_file (addr)
42 CORE_ADDR addr;
43{
44 return !(addr >= startup_file_start && addr < startup_file_end);
45}
7b4ac7e1 46
47/* Address of innermost stack frame (contents of FP register) */
48
49static FRAME current_frame;
50
51struct block *block_for_pc ();
52CORE_ADDR get_pc_function_start ();
53
e91b87a3 54/*
55 * Cache for frame addresses already read by gdb. Valid only while
56 * inferior is stopped. Control variables for the frame cache should
57 * be local to this module.
58 */
59struct obstack frame_cache_obstack;
7b4ac7e1 60
61/* Return the innermost (currently executing) stack frame. */
62
63FRAME
64get_current_frame ()
65{
66 /* We assume its address is kept in a general register;
67 param.h says which register. */
68
69 return current_frame;
70}
71
72void
73set_current_frame (frame)
74 FRAME frame;
75{
76 current_frame = frame;
77}
78
e91b87a3 79FRAME
80create_new_frame (addr, pc)
81 FRAME_ADDR addr;
82 CORE_ADDR pc;
83{
84 struct frame_info *fci; /* Same type as FRAME */
85
86 fci = (struct frame_info *)
87 obstack_alloc (&frame_cache_obstack,
88 sizeof (struct frame_info));
89
90 /* Arbitrary frame */
91 fci->next = (struct frame_info *) 0;
92 fci->prev = (struct frame_info *) 0;
93 fci->frame = addr;
94 fci->next_frame = 0; /* Since arbitrary */
95 fci->pc = pc;
96
97#ifdef INIT_EXTRA_FRAME_INFO
98 INIT_EXTRA_FRAME_INFO (fci);
99#endif
100
101 return fci;
102}
103
7b4ac7e1 104/* Return the frame that called FRAME.
105 If FRAME is the original frame (it has no caller), return 0. */
106
107FRAME
108get_prev_frame (frame)
109 FRAME frame;
110{
e91b87a3 111 /* We're allowed to know that FRAME and "struct frame_info *" are
112 the same */
113 return get_prev_frame_info (frame);
114}
115
4187119d 116/* Return the frame that FRAME calls (0 if FRAME is the innermost
117 frame). */
118
119FRAME
120get_next_frame (frame)
121 FRAME frame;
122{
123 /* We're allowed to know that FRAME and "struct frame_info *" are
124 the same */
125 return frame->next;
126}
127
e91b87a3 128/*
129 * Flush the entire frame cache.
130 */
131void
132flush_cached_frames ()
133{
134 /* Since we can't really be sure what the first object allocated was */
135 obstack_free (&frame_cache_obstack, 0);
136 obstack_init (&frame_cache_obstack);
4187119d 137
e91b87a3 138 current_frame = (struct frame_info *) 0; /* Invalidate cache */
7b4ac7e1 139}
140
141/* Return a structure containing various interesting information
142 about a specified stack frame. */
e91b87a3 143/* How do I justify including this function? Well, the FRAME
144 identifier format has gone through several changes recently, and
145 it's not completely inconceivable that it could happen again. If
146 it does, have this routine around will help */
7b4ac7e1 147
e91b87a3 148struct frame_info *
7b4ac7e1 149get_frame_info (frame)
150 FRAME frame;
151{
e91b87a3 152 return frame;
153}
7b4ac7e1 154
4187119d 155/* If a machine allows frameless functions, it should define a macro
156 FRAMELESS_FUNCTION_INVOCATION(FI, FRAMELESS) in param.h. FI is the struct
157 frame_info for the frame, and FRAMELESS should be set to nonzero
158 if it represents a frameless function invocation. */
159
160/* Many machines which allow frameless functions can detect them using
161 this macro. Such machines should define FRAMELESS_FUNCTION_INVOCATION
162 to just call this macro. */
163#define FRAMELESS_LOOK_FOR_PROLOGUE(FI, FRAMELESS) \
164{ \
165 CORE_ADDR func_start, after_prologue; \
166 func_start = (get_pc_function_start ((FI)->pc) + \
167 FUNCTION_START_OFFSET); \
168 if (func_start) \
169 { \
170 after_prologue = func_start; \
171 SKIP_PROLOGUE (after_prologue); \
172 (FRAMELESS) = (after_prologue == func_start); \
173 } \
174 else \
175 /* If we can't find the start of the function, we don't really */ \
176 /* know whether the function is frameless, but we should be */ \
177 /* able to get a reasonable (i.e. best we can do under the */ \
178 /* circumstances) backtrace by saying that it isn't. */ \
179 (FRAMELESS) = 0; \
180}
181
e91b87a3 182/* Return a structure containing various interesting information
7a67dd45 183 about the frame that called NEXT_FRAME. Returns NULL
184 if there is no such frame. */
7b4ac7e1 185
e91b87a3 186struct frame_info *
187get_prev_frame_info (next_frame)
188 FRAME next_frame;
189{
190 FRAME_ADDR address;
191 struct frame_info *prev;
192 int fromleaf = 0;
193
e91b87a3 194 /* If the requested entry is in the cache, return it.
195 Otherwise, figure out what the address should be for the entry
196 we're about to add to the cache. */
197
198 if (!next_frame)
7b4ac7e1 199 {
e91b87a3 200 if (!current_frame)
4187119d 201 {
202 if (!have_inferior_p () && !have_core_file_p ())
203 fatal ("get_prev_frame_info: Called before cache primed. \"Shouldn't happen.\"");
204 else
205 error ("No inferior or core file.");
206 }
e91b87a3 207
208 return current_frame;
7b4ac7e1 209 }
4187119d 210
211 /* If we have the prev one, return it */
212 if (next_frame->prev)
213 return next_frame->prev;
214
215 /* On some machines it is possible to call a function without
216 setting up a stack frame for it. On these machines, we
217 define this macro to take two args; a frameinfo pointer
218 identifying a frame and a variable to set or clear if it is
219 or isn't leafless. */
220#ifdef FRAMELESS_FUNCTION_INVOCATION
221 /* Still don't want to worry about this except on the innermost
222 frame. This macro will set FROMLEAF if NEXT_FRAME is a
223 frameless function invocation. */
224 if (!(next_frame->next))
7b4ac7e1 225 {
4187119d 226 FRAMELESS_FUNCTION_INVOCATION (next_frame, fromleaf);
227 if (fromleaf)
228 address = next_frame->frame;
229 }
e91b87a3 230#endif
7b4ac7e1 231
4187119d 232 if (!fromleaf)
233 {
234 /* Two macros defined in param.h specify the machine-dependent
235 actions to be performed here.
236 First, get the frame's chain-pointer.
237 If that is zero, the frame is the outermost frame or a leaf
238 called by the outermost frame. This means that if start
239 calls main without a frame, we'll return 0 (which is fine
240 anyway).
241
242 Nope; there's a problem. This also returns when the current
243 routine is a leaf of main. This is unacceptable. We move
244 this to after the ffi test; I'd rather have backtraces from
245 start go curfluy than have an abort called from main not show
246 main. */
247 address = FRAME_CHAIN (next_frame);
248 if (!FRAME_CHAIN_VALID (address, next_frame))
249 return 0;
250 /* If this frame is a leaf, this will be superceeded by the
251 code below. */
252 address = FRAME_CHAIN_COMBINE (address, next_frame);
7b4ac7e1 253 }
254
e91b87a3 255 prev = (struct frame_info *)
256 obstack_alloc (&frame_cache_obstack,
257 sizeof (struct frame_info));
7b4ac7e1 258
e91b87a3 259 if (next_frame)
260 next_frame->prev = prev;
261 prev->next = next_frame;
262 prev->prev = (struct frame_info *) 0;
263 prev->frame = address;
264 prev->next_frame = prev->next ? prev->next->frame : 0;
7b4ac7e1 265
e91b87a3 266#ifdef INIT_EXTRA_FRAME_INFO
267 INIT_EXTRA_FRAME_INFO(prev);
268#endif
7b4ac7e1 269
e91b87a3 270 /* This entry is in the frame queue now, which is good since
271 FRAME_SAVED_PC may use that queue to figure out it's value
272 (see m-sparc.h). We want the pc saved in the inferior frame. */
273 prev->pc = (fromleaf ? SAVED_PC_AFTER_CALL (next_frame) :
274 next_frame ? FRAME_SAVED_PC (next_frame) : read_pc ());
7b4ac7e1 275
e91b87a3 276 return prev;
7b4ac7e1 277}
278
279CORE_ADDR
280get_frame_pc (frame)
281 FRAME frame;
282{
e91b87a3 283 struct frame_info *fi;
7b4ac7e1 284 fi = get_frame_info (frame);
e91b87a3 285 return fi->pc;
7b4ac7e1 286}
287
288/* Find the addresses in which registers are saved in FRAME. */
289
290void
291get_frame_saved_regs (frame_info_addr, saved_regs_addr)
292 struct frame_info *frame_info_addr;
293 struct frame_saved_regs *saved_regs_addr;
294{
e91b87a3 295 FRAME_FIND_SAVED_REGS (frame_info_addr, *saved_regs_addr);
7b4ac7e1 296}
297
298/* Return the innermost lexical block in execution
299 in a specified stack frame. The frame address is assumed valid. */
300
301struct block *
302get_frame_block (frame)
303 FRAME frame;
304{
e91b87a3 305 struct frame_info *fi;
7a67dd45 306 CORE_ADDR pc;
7b4ac7e1 307
308 fi = get_frame_info (frame);
7a67dd45 309
310 pc = fi->pc;
311 if (fi->next_frame != 0)
312 /* We are not in the innermost frame. We need to subtract one to
313 get the correct block, in case the call instruction was the
314 last instruction of the block. If there are any machines on
315 which the saved pc does not point to after the call insn, we
316 probably want to make fi->pc point after the call insn anyway. */
317 --pc;
318 return block_for_pc (pc);
7b4ac7e1 319}
320
321struct block *
322get_current_block ()
323{
324 return block_for_pc (read_pc ());
325}
326
327CORE_ADDR
328get_pc_function_start (pc)
329 CORE_ADDR pc;
330{
331 register struct block *bl = block_for_pc (pc);
332 register struct symbol *symbol;
e91b87a3 333 if (bl == 0 || (symbol = block_function (bl)) == 0)
7b4ac7e1 334 {
335 register int misc_index = find_pc_misc_function (pc);
336 if (misc_index >= 0)
337 return misc_function_vector[misc_index].address;
338 return 0;
339 }
7b4ac7e1 340 bl = SYMBOL_BLOCK_VALUE (symbol);
341 return BLOCK_START (bl);
e91b87a3 342}
7b4ac7e1 343
344/* Return the symbol for the function executing in frame FRAME. */
345
346struct symbol *
347get_frame_function (frame)
348 FRAME frame;
349{
350 register struct block *bl = get_frame_block (frame);
351 if (bl == 0)
352 return 0;
353 return block_function (bl);
354}
355\f
356/* Return the innermost lexical block containing the specified pc value,
357 or 0 if there is none. */
358
e91b87a3 359extern struct symtab *psymtab_to_symtab ();
360
7b4ac7e1 361struct block *
362block_for_pc (pc)
363 register CORE_ADDR pc;
364{
365 register struct block *b;
366 register int bot, top, half;
367 register struct symtab *s;
e91b87a3 368 register struct partial_symtab *ps;
7b4ac7e1 369 struct blockvector *bl;
370
371 /* First search all symtabs for one whose file contains our pc */
372
373 for (s = symtab_list; s; s = s->next)
374 {
375 bl = BLOCKVECTOR (s);
376 b = BLOCKVECTOR_BLOCK (bl, 0);
377 if (BLOCK_START (b) <= pc
378 && BLOCK_END (b) > pc)
379 break;
380 }
381
e91b87a3 382 if (s == 0)
383 for (ps = partial_symtab_list; ps; ps = ps->next)
384 {
385 if (ps->textlow <= pc
386 && ps->texthigh > pc)
387 {
4187119d 388 if (ps->readin)
389 fatal ("Internal error: pc found in readin psymtab and not in any symtab.");
e91b87a3 390 s = psymtab_to_symtab (ps);
391 bl = BLOCKVECTOR (s);
392 b = BLOCKVECTOR_BLOCK (bl, 0);
393 break;
394 }
395 }
396
7b4ac7e1 397 if (s == 0)
398 return 0;
399
400 /* Then search that symtab for the smallest block that wins. */
401 /* Use binary search to find the last block that starts before PC. */
402
403 bot = 0;
404 top = BLOCKVECTOR_NBLOCKS (bl);
405
406 while (top - bot > 1)
407 {
408 half = (top - bot + 1) >> 1;
409 b = BLOCKVECTOR_BLOCK (bl, bot + half);
410 if (BLOCK_START (b) <= pc)
411 bot += half;
412 else
413 top = bot + half;
414 }
415
416 /* Now search backward for a block that ends after PC. */
417
418 while (bot >= 0)
419 {
420 b = BLOCKVECTOR_BLOCK (bl, bot);
421 if (BLOCK_END (b) > pc)
422 return b;
423 bot--;
424 }
425
426 return 0;
427}
428
429/* Return the function containing pc value PC.
430 Returns 0 if function is not known. */
431
432struct symbol *
433find_pc_function (pc)
434 CORE_ADDR pc;
435{
436 register struct block *b = block_for_pc (pc);
437 if (b == 0)
438 return 0;
439 return block_function (b);
440}
441
4187119d 442/* Finds the "function" (text symbol) that is smaller than PC
443 but greatest of all of the potential text symbols. Sets
444 *NAME and/or *ADDRESS conditionally if that pointer is non-zero.
7a67dd45 445 Returns 0 if it couldn't find anything, 1 if it did. On a zero
446 return, *NAME and *ADDRESS are always set to zero. On a 1 return,
447 *NAME and *ADDRESS contain real information. */
4187119d 448
449int
450find_pc_partial_function (pc, name, address)
451 CORE_ADDR pc;
452 char **name;
453 CORE_ADDR *address;
454{
455 struct partial_symtab *pst = find_pc_psymtab (pc);
456 struct symbol *f;
457 int miscfunc;
458 struct partial_symbol *psb;
459
460 if (pst)
461 {
462 if (pst->readin)
463 {
464 /* The information we want has already been read in.
465 We can go to the already readin symbols and we'll get
466 the best possible answer. */
467 f = find_pc_function (pc);
468 if (!f)
469 {
7a67dd45 470 return_error:
4187119d 471 /* No availible symbol. */
472 if (name != 0)
473 *name = 0;
474 if (address != 0)
475 *address = 0;
476 return 0;
477 }
478
479 if (name)
480 *name = SYMBOL_NAME (f);
481 if (address)
7a67dd45 482 *address = BLOCK_START (SYMBOL_BLOCK_VALUE (f));
483 return 1;
4187119d 484 }
485
486 /* Get the information from a combination of the pst
487 (static symbols), and the misc function vector (extern
488 symbols). */
489 miscfunc = find_pc_misc_function (pc);
490 psb = find_pc_psymbol (pst, pc);
491
492 if (!psb && miscfunc == -1)
493 {
7a67dd45 494 goto return_error;
4187119d 495 }
496 if (!psb
497 || (miscfunc != -1
7a67dd45 498 && (SYMBOL_VALUE(psb)
499 < misc_function_vector[miscfunc].address)))
4187119d 500 {
501 if (address)
502 *address = misc_function_vector[miscfunc].address;
503 if (name)
504 *name = misc_function_vector[miscfunc].name;
7a67dd45 505 return 1;
4187119d 506 }
507 else
508 {
509 if (address)
510 *address = SYMBOL_VALUE (psb);
511 if (name)
512 *name = SYMBOL_NAME (psb);
7a67dd45 513 return 1;
4187119d 514 }
515 }
516 else
517 /* Must be in the misc function stuff. */
518 {
519 miscfunc = find_pc_misc_function (pc);
520 if (miscfunc == -1)
7a67dd45 521 goto return_error;
4187119d 522 if (address)
523 *address = misc_function_vector[miscfunc].address;
524 if (name)
525 *name = misc_function_vector[miscfunc].name;
7a67dd45 526 return 1;
4187119d 527 }
4187119d 528}
529
7b4ac7e1 530/* Find the misc function whose address is the largest
531 while being less than PC. Return its index in misc_function_vector.
532 Returns -1 if PC is not in suitable range. */
533
534int
535find_pc_misc_function (pc)
632ea0cc 536 register CORE_ADDR pc;
7b4ac7e1 537{
632ea0cc 538 register int lo = 0;
539 register int hi = misc_function_count-1;
540 register int new;
541 register int distance;
7b4ac7e1 542
543 /* Note that the last thing in the vector is always _etext. */
4187119d 544 /* Actually, "end", now that non-functions
545 go on the misc_function_vector. */
632ea0cc 546
3bf57d21 547 /* Above statement is not *always* true - fix for case where there are */
548 /* no misc functions at all (ie no symbol table has been read). */
549 if (hi < 0) return -1; /* no misc functions recorded */
550
632ea0cc 551 /* trivial reject range test */
e91b87a3 552 if (pc < misc_function_vector[0].address ||
632ea0cc 553 pc > misc_function_vector[hi].address)
554 return -1;
555
4187119d 556 /* Note that the following search will not return hi if
557 pc == misc_function_vector[hi].address. If "end" points to the
558 first unused location, this is correct and the above test
559 simply needs to be changed to
560 "pc >= misc_function_vector[hi].address". */
632ea0cc 561 do {
562 new = (lo + hi) >> 1;
563 distance = misc_function_vector[new].address - pc;
564 if (distance == 0)
565 return new; /* an exact match */
566 else if (distance > 0)
567 hi = new;
568 else
569 lo = new;
570 } while (hi-lo != 1);
571
572 /* if here, we had no exact match, so return the lower choice */
573 return lo;
7b4ac7e1 574}
575
576/* Return the innermost stack frame executing inside of the specified block,
577 or zero if there is no such frame. */
578
579FRAME
580block_innermost_frame (block)
581 struct block *block;
582{
e91b87a3 583 struct frame_info *fi;
7b4ac7e1 584 register FRAME frame;
585 register CORE_ADDR start = BLOCK_START (block);
586 register CORE_ADDR end = BLOCK_END (block);
587
588 frame = 0;
589 while (1)
590 {
e91b87a3 591 frame = get_prev_frame (frame);
7b4ac7e1 592 if (frame == 0)
593 return 0;
e91b87a3 594 fi = get_frame_info (frame);
595 if (fi->pc >= start && fi->pc < end)
7b4ac7e1 596 return frame;
597 }
598}
599
e91b87a3 600void
601_initialize_blockframe ()
7b4ac7e1 602{
e91b87a3 603 obstack_init (&frame_cache_obstack);
7b4ac7e1 604}