1999-01-19 Fernando Nasser <fnasser@totem.to.cygnus.com>
[deliverable/binutils-gdb.git] / gdb / blockframe.c
CommitLineData
bd5635a1
RP
1/* Get info from stack frames;
2 convert between frames, blocks, functions and pc values.
ad3b8c4a 3 Copyright 1986, 87, 88, 89, 91, 94, 95, 96, 97, 1998
dc1b349d 4 Free Software Foundation, Inc.
bd5635a1
RP
5
6This file is part of GDB.
7
5259796b 8This program is free software; you can redistribute it and/or modify
bd5635a1 9it under the terms of the GNU General Public License as published by
5259796b
JG
10the Free Software Foundation; either version 2 of the License, or
11(at your option) any later version.
bd5635a1 12
5259796b 13This program is distributed in the hope that it will be useful,
bd5635a1
RP
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
5259796b 19along with this program; if not, write to the Free Software
0e2c2c1e 20Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
bd5635a1
RP
21
22#include "defs.h"
bd5635a1 23#include "symtab.h"
23a8e291
JK
24#include "bfd.h"
25#include "symfile.h"
26#include "objfiles.h"
bd5635a1
RP
27#include "frame.h"
28#include "gdbcore.h"
29#include "value.h" /* for read_register */
30#include "target.h" /* for target_has_stack */
23a8e291 31#include "inferior.h" /* for read_pc */
16726dd1 32#include "annotate.h"
bd5635a1 33
3a0c96a9
AC
34/* Prototypes for exported functions. */
35
36void _initialize_blockframe PARAMS ((void));
37
23a8e291 38/* Is ADDR inside the startup file? Note that if your machine
bd5635a1
RP
39 has a way to detect the bottom of the stack, there is no need
40 to call this function from FRAME_CHAIN_VALID; the reason for
41 doing so is that some machines have no way of detecting bottom
23a8e291
JK
42 of stack.
43
44 A PC of zero is always considered to be the bottom of the stack. */
45
bd5635a1 46int
23a8e291 47inside_entry_file (addr)
bd5635a1
RP
48 CORE_ADDR addr;
49{
23a8e291
JK
50 if (addr == 0)
51 return 1;
52 if (symfile_objfile == 0)
53 return 0;
cef4c2e7
PS
54#if CALL_DUMMY_LOCATION == AT_ENTRY_POINT
55 /* Do not stop backtracing if the pc is in the call dummy
56 at the entry point. */
dc1b349d
MS
57/* FIXME: Won't always work with zeros for the last two arguments */
58 if (PC_IN_CALL_DUMMY (addr, 0, 0))
cef4c2e7
PS
59 return 0;
60#endif
23a8e291
JK
61 return (addr >= symfile_objfile -> ei.entry_file_lowpc &&
62 addr < symfile_objfile -> ei.entry_file_highpc);
bd5635a1
RP
63}
64
e140f1da
JG
65/* Test a specified PC value to see if it is in the range of addresses
66 that correspond to the main() function. See comments above for why
67 we might want to do this.
68
23a8e291
JK
69 Typically called from FRAME_CHAIN_VALID.
70
71 A PC of zero is always considered to be the bottom of the stack. */
e140f1da
JG
72
73int
23a8e291 74inside_main_func (pc)
e140f1da
JG
75CORE_ADDR pc;
76{
23a8e291
JK
77 if (pc == 0)
78 return 1;
79 if (symfile_objfile == 0)
80 return 0;
0e2c2c1e 81
dc1b349d
MS
82 /* If the addr range is not set up at symbol reading time, set it up now.
83 This is for FRAME_CHAIN_VALID_ALTERNATE. I do this for coff, because
84 it is unable to set it up and symbol reading time. */
85
86 if (symfile_objfile -> ei.main_func_lowpc == INVALID_ENTRY_LOWPC &&
87 symfile_objfile -> ei.main_func_highpc == INVALID_ENTRY_HIGHPC)
0e2c2c1e 88 {
dc1b349d
MS
89 struct symbol *mainsym;
90
0e2c2c1e
KH
91 mainsym = lookup_symbol ("main", NULL, VAR_NAMESPACE, NULL, NULL);
92 if (mainsym && SYMBOL_CLASS(mainsym) == LOC_BLOCK)
93 {
253ceee6
RU
94 symfile_objfile->ei.main_func_lowpc =
95 BLOCK_START (SYMBOL_BLOCK_VALUE (mainsym));
96 symfile_objfile->ei.main_func_highpc =
97 BLOCK_END (SYMBOL_BLOCK_VALUE (mainsym));
0e2c2c1e 98 }
0e2c2c1e 99 }
23a8e291
JK
100 return (symfile_objfile -> ei.main_func_lowpc <= pc &&
101 symfile_objfile -> ei.main_func_highpc > pc);
e140f1da
JG
102}
103
104/* Test a specified PC value to see if it is in the range of addresses
23a8e291
JK
105 that correspond to the process entry point function. See comments
106 in objfiles.h for why we might want to do this.
107
108 Typically called from FRAME_CHAIN_VALID.
e140f1da 109
23a8e291 110 A PC of zero is always considered to be the bottom of the stack. */
e140f1da
JG
111
112int
23a8e291 113inside_entry_func (pc)
e140f1da
JG
114CORE_ADDR pc;
115{
23a8e291
JK
116 if (pc == 0)
117 return 1;
118 if (symfile_objfile == 0)
119 return 0;
cef4c2e7
PS
120#if CALL_DUMMY_LOCATION == AT_ENTRY_POINT
121 /* Do not stop backtracing if the pc is in the call dummy
122 at the entry point. */
dc1b349d 123/* FIXME: Won't always work with zeros for the last two arguments */
cef4c2e7
PS
124 if (PC_IN_CALL_DUMMY (pc, 0, 0))
125 return 0;
126#endif
23a8e291
JK
127 return (symfile_objfile -> ei.entry_func_lowpc <= pc &&
128 symfile_objfile -> ei.entry_func_highpc > pc);
e140f1da
JG
129}
130
0e2c2c1e
KH
131/* Info about the innermost stack frame (contents of FP register) */
132
133static struct frame_info *current_frame;
bd5635a1 134
0e2c2c1e
KH
135/* Cache for frame addresses already read by gdb. Valid only while
136 inferior is stopped. Control variables for the frame cache should
137 be local to this module. */
bd5635a1 138
bd5635a1
RP
139struct obstack frame_cache_obstack;
140
141/* Return the innermost (currently executing) stack frame. */
142
0e2c2c1e 143struct frame_info *
bd5635a1
RP
144get_current_frame ()
145{
16726dd1
JK
146 if (current_frame == NULL)
147 {
148 if (target_has_stack)
149 current_frame = create_new_frame (read_fp (), read_pc ());
150 else
151 error ("No stack.");
152 }
bd5635a1
RP
153 return current_frame;
154}
155
156void
157set_current_frame (frame)
0e2c2c1e 158 struct frame_info *frame;
bd5635a1
RP
159{
160 current_frame = frame;
161}
162
16726dd1
JK
163/* Create an arbitrary (i.e. address specified by user) or innermost frame.
164 Always returns a non-NULL value. */
165
0e2c2c1e 166struct frame_info *
bd5635a1 167create_new_frame (addr, pc)
0e2c2c1e 168 CORE_ADDR addr;
bd5635a1
RP
169 CORE_ADDR pc;
170{
0e2c2c1e 171 struct frame_info *fi;
d541211d 172 char *name;
bd5635a1 173
0e2c2c1e 174 fi = (struct frame_info *)
bd5635a1
RP
175 obstack_alloc (&frame_cache_obstack,
176 sizeof (struct frame_info));
177
178 /* Arbitrary frame */
0e2c2c1e
KH
179 fi->next = NULL;
180 fi->prev = NULL;
181 fi->frame = addr;
182 fi->pc = pc;
d541211d 183 find_pc_partial_function (pc, &name, (CORE_ADDR *)NULL,(CORE_ADDR *)NULL);
0e2c2c1e 184 fi->signal_handler_caller = IN_SIGTRAMP (fi->pc, name);
bd5635a1
RP
185
186#ifdef INIT_EXTRA_FRAME_INFO
0e2c2c1e 187 INIT_EXTRA_FRAME_INFO (0, fi);
bd5635a1
RP
188#endif
189
0e2c2c1e 190 return fi;
bd5635a1
RP
191}
192
0e2c2c1e
KH
193/* Return the frame that called FI.
194 If FI is the original frame (it has no caller), return 0. */
bd5635a1 195
0e2c2c1e 196struct frame_info *
bd5635a1 197get_prev_frame (frame)
0e2c2c1e 198 struct frame_info *frame;
bd5635a1 199{
bd5635a1
RP
200 return get_prev_frame_info (frame);
201}
202
0e2c2c1e 203/* Return the frame that FRAME calls (NULL if FRAME is the innermost
bd5635a1
RP
204 frame). */
205
0e2c2c1e 206struct frame_info *
bd5635a1 207get_next_frame (frame)
0e2c2c1e 208 struct frame_info *frame;
bd5635a1 209{
bd5635a1
RP
210 return frame->next;
211}
212
0e2c2c1e
KH
213/* Flush the entire frame cache. */
214
bd5635a1
RP
215void
216flush_cached_frames ()
217{
218 /* Since we can't really be sure what the first object allocated was */
219 obstack_free (&frame_cache_obstack, 0);
220 obstack_init (&frame_cache_obstack);
221
0e2c2c1e
KH
222 current_frame = NULL; /* Invalidate cache */
223 select_frame (NULL, -1);
16726dd1 224 annotate_frames_invalid ();
bd5635a1
RP
225}
226
2403f49b 227/* Flush the frame cache, and start a new one if necessary. */
16726dd1 228
2403f49b
JK
229void
230reinit_frame_cache ()
231{
2403f49b 232 flush_cached_frames ();
0e2c2c1e
KH
233
234 /* FIXME: The inferior_pid test is wrong if there is a corefile. */
16726dd1 235 if (inferior_pid != 0)
2289e1c3 236 {
2289e1c3
JK
237 select_frame (get_current_frame (), 0);
238 }
bd5635a1
RP
239}
240
241/* If a machine allows frameless functions, it should define a macro
242 FRAMELESS_FUNCTION_INVOCATION(FI, FRAMELESS) in param.h. FI is the struct
243 frame_info for the frame, and FRAMELESS should be set to nonzero
244 if it represents a frameless function invocation. */
245
23a8e291 246/* Return nonzero if the function for this frame lacks a prologue. Many
bd5635a1
RP
247 machines can define FRAMELESS_FUNCTION_INVOCATION to just call this
248 function. */
249
250int
251frameless_look_for_prologue (frame)
0e2c2c1e 252 struct frame_info *frame;
bd5635a1
RP
253{
254 CORE_ADDR func_start, after_prologue;
dc1b349d 255 func_start = get_pc_function_start (frame->pc);
bd5635a1
RP
256 if (func_start)
257 {
dc1b349d 258 func_start += FUNCTION_START_OFFSET;
bd5635a1 259 after_prologue = func_start;
5259796b
JG
260#ifdef SKIP_PROLOGUE_FRAMELESS_P
261 /* This is faster, since only care whether there *is* a prologue,
262 not how long it is. */
263 SKIP_PROLOGUE_FRAMELESS_P (after_prologue);
264#else
bd5635a1 265 SKIP_PROLOGUE (after_prologue);
5259796b 266#endif
bd5635a1
RP
267 return after_prologue == func_start;
268 }
15cb042b
PS
269 else if (frame->pc == 0)
270 /* A frame with a zero PC is usually created by dereferencing a NULL
271 function pointer, normally causing an immediate core dump of the
272 inferior. Mark function as frameless, as the inferior has no chance
273 of setting up a stack frame. */
274 return 1;
bd5635a1
RP
275 else
276 /* If we can't find the start of the function, we don't really
277 know whether the function is frameless, but we should be able
278 to get a reasonable (i.e. best we can do under the
279 circumstances) backtrace by saying that it isn't. */
280 return 0;
281}
282
e140f1da
JG
283/* Default a few macros that people seldom redefine. */
284
bd5635a1
RP
285#if !defined (INIT_FRAME_PC)
286#define INIT_FRAME_PC(fromleaf, prev) \
287 prev->pc = (fromleaf ? SAVED_PC_AFTER_CALL (prev->next) : \
288 prev->next ? FRAME_SAVED_PC (prev->next) : read_pc ());
289#endif
290
e140f1da
JG
291#ifndef FRAME_CHAIN_COMBINE
292#define FRAME_CHAIN_COMBINE(chain, thisframe) (chain)
293#endif
294
bd5635a1
RP
295/* Return a structure containing various interesting information
296 about the frame that called NEXT_FRAME. Returns NULL
297 if there is no such frame. */
298
299struct frame_info *
300get_prev_frame_info (next_frame)
0e2c2c1e 301 struct frame_info *next_frame;
bd5635a1 302{
0e2c2c1e 303 CORE_ADDR address = 0;
bd5635a1
RP
304 struct frame_info *prev;
305 int fromleaf = 0;
d541211d 306 char *name;
bd5635a1
RP
307
308 /* If the requested entry is in the cache, return it.
309 Otherwise, figure out what the address should be for the entry
310 we're about to add to the cache. */
311
312 if (!next_frame)
313 {
9e837b37
PS
314#if 0
315 /* This screws value_of_variable, which just wants a nice clean
316 NULL return from block_innermost_frame if there are no frames.
317 I don't think I've ever seen this message happen otherwise.
318 And returning NULL here is a perfectly legitimate thing to do. */
bd5635a1
RP
319 if (!current_frame)
320 {
321 error ("You haven't set up a process's stack to examine.");
322 }
9e837b37 323#endif
bd5635a1
RP
324
325 return current_frame;
326 }
327
328 /* If we have the prev one, return it */
329 if (next_frame->prev)
330 return next_frame->prev;
331
332 /* On some machines it is possible to call a function without
333 setting up a stack frame for it. On these machines, we
334 define this macro to take two args; a frameinfo pointer
335 identifying a frame and a variable to set or clear if it is
336 or isn't leafless. */
337#ifdef FRAMELESS_FUNCTION_INVOCATION
338 /* Still don't want to worry about this except on the innermost
339 frame. This macro will set FROMLEAF if NEXT_FRAME is a
340 frameless function invocation. */
341 if (!(next_frame->next))
342 {
343 FRAMELESS_FUNCTION_INVOCATION (next_frame, fromleaf);
344 if (fromleaf)
0e2c2c1e 345 address = FRAME_FP (next_frame);
bd5635a1
RP
346 }
347#endif
348
349 if (!fromleaf)
350 {
351 /* Two macros defined in tm.h specify the machine-dependent
352 actions to be performed here.
353 First, get the frame's chain-pointer.
354 If that is zero, the frame is the outermost frame or a leaf
355 called by the outermost frame. This means that if start
356 calls main without a frame, we'll return 0 (which is fine
357 anyway).
358
359 Nope; there's a problem. This also returns when the current
360 routine is a leaf of main. This is unacceptable. We move
361 this to after the ffi test; I'd rather have backtraces from
362 start go curfluy than have an abort called from main not show
363 main. */
364 address = FRAME_CHAIN (next_frame);
365 if (!FRAME_CHAIN_VALID (address, next_frame))
366 return 0;
367 address = FRAME_CHAIN_COMBINE (address, next_frame);
368 }
e140f1da
JG
369 if (address == 0)
370 return 0;
bd5635a1
RP
371
372 prev = (struct frame_info *)
373 obstack_alloc (&frame_cache_obstack,
374 sizeof (struct frame_info));
375
376 if (next_frame)
377 next_frame->prev = prev;
378 prev->next = next_frame;
379 prev->prev = (struct frame_info *) 0;
380 prev->frame = address;
23a8e291
JK
381 prev->signal_handler_caller = 0;
382
383/* This change should not be needed, FIXME! We should
384 determine whether any targets *need* INIT_FRAME_PC to happen
385 after INIT_EXTRA_FRAME_INFO and come up with a simple way to
386 express what goes on here.
387
388 INIT_EXTRA_FRAME_INFO is called from two places: create_new_frame
389 (where the PC is already set up) and here (where it isn't).
390 INIT_FRAME_PC is only called from here, always after
391 INIT_EXTRA_FRAME_INFO.
392
393 The catch is the MIPS, where INIT_EXTRA_FRAME_INFO requires the PC
394 value (which hasn't been set yet). Some other machines appear to
395 require INIT_EXTRA_FRAME_INFO before they can do INIT_FRAME_PC. Phoo.
396
397 We shouldn't need INIT_FRAME_PC_FIRST to add more complication to
398 an already overcomplicated part of GDB. gnu@cygnus.com, 15Sep92.
399
0e2c2c1e
KH
400 Assuming that some machines need INIT_FRAME_PC after
401 INIT_EXTRA_FRAME_INFO, one possible scheme:
23a8e291
JK
402
403 SETUP_INNERMOST_FRAME()
404 Default version is just create_new_frame (read_fp ()),
405 read_pc ()). Machines with extra frame info would do that (or the
406 local equivalent) and then set the extra fields.
407 SETUP_ARBITRARY_FRAME(argc, argv)
408 Only change here is that create_new_frame would no longer init extra
409 frame info; SETUP_ARBITRARY_FRAME would have to do that.
410 INIT_PREV_FRAME(fromleaf, prev)
9e837b37
PS
411 Replace INIT_EXTRA_FRAME_INFO and INIT_FRAME_PC. This should
412 also return a flag saying whether to keep the new frame, or
413 whether to discard it, because on some machines (e.g. mips) it
414 is really awkward to have FRAME_CHAIN_VALID called *before*
415 INIT_EXTRA_FRAME_INFO (there is no good way to get information
416 deduced in FRAME_CHAIN_VALID into the extra fields of the new frame).
23a8e291
JK
417 std_frame_pc(fromleaf, prev)
418 This is the default setting for INIT_PREV_FRAME. It just does what
419 the default INIT_FRAME_PC does. Some machines will call it from
420 INIT_PREV_FRAME (either at the beginning, the end, or in the middle).
421 Some machines won't use it.
0e2c2c1e 422 kingdon@cygnus.com, 13Apr93, 31Jan94, 14Dec94. */
23a8e291
JK
423
424#ifdef INIT_FRAME_PC_FIRST
425 INIT_FRAME_PC_FIRST (fromleaf, prev);
426#endif
bd5635a1
RP
427
428#ifdef INIT_EXTRA_FRAME_INFO
e140f1da 429 INIT_EXTRA_FRAME_INFO(fromleaf, prev);
bd5635a1
RP
430#endif
431
432 /* This entry is in the frame queue now, which is good since
9e837b37 433 FRAME_SAVED_PC may use that queue to figure out its value
e140f1da 434 (see tm-sparc.h). We want the pc saved in the inferior frame. */
bd5635a1
RP
435 INIT_FRAME_PC(fromleaf, prev);
436
9e837b37
PS
437 /* If ->frame and ->pc are unchanged, we are in the process of getting
438 ourselves into an infinite backtrace. Some architectures check this
439 in FRAME_CHAIN or thereabouts, but it seems like there is no reason
440 this can't be an architecture-independent check. */
441 if (next_frame != NULL)
442 {
443 if (prev->frame == next_frame->frame
444 && prev->pc == next_frame->pc)
445 {
446 next_frame->prev = NULL;
447 obstack_free (&frame_cache_obstack, prev);
448 return NULL;
449 }
450 }
451
d541211d
PS
452 find_pc_partial_function (prev->pc, &name,
453 (CORE_ADDR *)NULL,(CORE_ADDR *)NULL);
454 if (IN_SIGTRAMP (prev->pc, name))
23a8e291
JK
455 prev->signal_handler_caller = 1;
456
bd5635a1
RP
457 return prev;
458}
459
460CORE_ADDR
461get_frame_pc (frame)
0e2c2c1e 462 struct frame_info *frame;
bd5635a1 463{
0e2c2c1e 464 return frame->pc;
bd5635a1
RP
465}
466
467#if defined (FRAME_FIND_SAVED_REGS)
468/* Find the addresses in which registers are saved in FRAME. */
469
470void
0e2c2c1e
KH
471get_frame_saved_regs (frame, saved_regs_addr)
472 struct frame_info *frame;
bd5635a1
RP
473 struct frame_saved_regs *saved_regs_addr;
474{
0e2c2c1e 475 FRAME_FIND_SAVED_REGS (frame, *saved_regs_addr);
bd5635a1
RP
476}
477#endif
478
479/* Return the innermost lexical block in execution
480 in a specified stack frame. The frame address is assumed valid. */
481
482struct block *
483get_frame_block (frame)
0e2c2c1e 484 struct frame_info *frame;
bd5635a1 485{
bd5635a1
RP
486 CORE_ADDR pc;
487
0e2c2c1e
KH
488 pc = frame->pc;
489 if (frame->next != 0 && frame->next->signal_handler_caller == 0)
747a6329
PS
490 /* We are not in the innermost frame and we were not interrupted
491 by a signal. We need to subtract one to get the correct block,
492 in case the call instruction was the last instruction of the block.
493 If there are any machines on which the saved pc does not point to
0e2c2c1e 494 after the call insn, we probably want to make frame->pc point after
747a6329 495 the call insn anyway. */
bd5635a1
RP
496 --pc;
497 return block_for_pc (pc);
498}
499
500struct block *
501get_current_block ()
502{
503 return block_for_pc (read_pc ());
504}
505
506CORE_ADDR
507get_pc_function_start (pc)
508 CORE_ADDR pc;
509{
23a8e291 510 register struct block *bl;
bd5635a1 511 register struct symbol *symbol;
23a8e291
JK
512 register struct minimal_symbol *msymbol;
513 CORE_ADDR fstart;
514
515 if ((bl = block_for_pc (pc)) != NULL &&
516 (symbol = block_function (bl)) != NULL)
bd5635a1 517 {
23a8e291
JK
518 bl = SYMBOL_BLOCK_VALUE (symbol);
519 fstart = BLOCK_START (bl);
bd5635a1 520 }
23a8e291
JK
521 else if ((msymbol = lookup_minimal_symbol_by_pc (pc)) != NULL)
522 {
523 fstart = SYMBOL_VALUE_ADDRESS (msymbol);
524 }
525 else
526 {
527 fstart = 0;
528 }
529 return (fstart);
bd5635a1
RP
530}
531
532/* Return the symbol for the function executing in frame FRAME. */
533
534struct symbol *
535get_frame_function (frame)
0e2c2c1e 536 struct frame_info *frame;
bd5635a1
RP
537{
538 register struct block *bl = get_frame_block (frame);
539 if (bl == 0)
540 return 0;
541 return block_function (bl);
542}
543\f
253ceee6 544
bd5635a1 545/* Return the blockvector immediately containing the innermost lexical block
253ceee6 546 containing the specified pc value and section, or 0 if there is none.
bd5635a1
RP
547 PINDEX is a pointer to the index value of the block. If PINDEX
548 is NULL, we don't pass this information back to the caller. */
549
550struct blockvector *
253ceee6 551blockvector_for_pc_sect (pc, section, pindex, symtab)
bd5635a1 552 register CORE_ADDR pc;
253ceee6 553 struct sec *section;
bd5635a1 554 int *pindex;
253ceee6
RU
555 struct symtab *symtab;
556
bd5635a1
RP
557{
558 register struct block *b;
559 register int bot, top, half;
bd5635a1
RP
560 struct blockvector *bl;
561
253ceee6
RU
562 if (symtab == 0) /* if no symtab specified by caller */
563 {
564 /* First search all symtabs for one whose file contains our pc */
565 if ((symtab = find_pc_sect_symtab (pc, section)) == 0)
566 return 0;
567 }
bd5635a1 568
253ceee6 569 bl = BLOCKVECTOR (symtab);
bd5635a1
RP
570 b = BLOCKVECTOR_BLOCK (bl, 0);
571
572 /* Then search that symtab for the smallest block that wins. */
573 /* Use binary search to find the last block that starts before PC. */
574
575 bot = 0;
576 top = BLOCKVECTOR_NBLOCKS (bl);
577
578 while (top - bot > 1)
579 {
580 half = (top - bot + 1) >> 1;
581 b = BLOCKVECTOR_BLOCK (bl, bot + half);
582 if (BLOCK_START (b) <= pc)
583 bot += half;
584 else
585 top = bot + half;
586 }
587
588 /* Now search backward for a block that ends after PC. */
589
590 while (bot >= 0)
591 {
592 b = BLOCKVECTOR_BLOCK (bl, bot);
593 if (BLOCK_END (b) > pc)
594 {
595 if (pindex)
596 *pindex = bot;
597 return bl;
598 }
599 bot--;
600 }
bd5635a1
RP
601 return 0;
602}
603
253ceee6
RU
604/* Return the blockvector immediately containing the innermost lexical block
605 containing the specified pc value, or 0 if there is none.
606 Backward compatibility, no section. */
607
608struct blockvector *
609blockvector_for_pc (pc, pindex)
610 register CORE_ADDR pc;
611 int *pindex;
612{
613 return blockvector_for_pc_sect (pc, find_pc_mapped_section (pc),
614 pindex, NULL);
615}
616
617/* Return the innermost lexical block containing the specified pc value
618 in the specified section, or 0 if there is none. */
bd5635a1
RP
619
620struct block *
253ceee6 621block_for_pc_sect (pc, section)
bd5635a1 622 register CORE_ADDR pc;
253ceee6 623 struct sec *section;
bd5635a1
RP
624{
625 register struct blockvector *bl;
626 int index;
627
253ceee6 628 bl = blockvector_for_pc_sect (pc, section, &index, NULL);
bd5635a1
RP
629 if (bl)
630 return BLOCKVECTOR_BLOCK (bl, index);
631 return 0;
632}
633
253ceee6
RU
634/* Return the innermost lexical block containing the specified pc value,
635 or 0 if there is none. Backward compatibility, no section. */
636
637struct block *
638block_for_pc (pc)
639 register CORE_ADDR pc;
640{
641 return block_for_pc_sect (pc, find_pc_mapped_section (pc));
642}
643
644/* Return the function containing pc value PC in section SECTION.
bd5635a1
RP
645 Returns 0 if function is not known. */
646
647struct symbol *
253ceee6 648find_pc_sect_function (pc, section)
bd5635a1 649 CORE_ADDR pc;
253ceee6 650 struct sec *section;
bd5635a1 651{
253ceee6 652 register struct block *b = block_for_pc_sect (pc, section);
bd5635a1
RP
653 if (b == 0)
654 return 0;
655 return block_function (b);
656}
657
253ceee6
RU
658/* Return the function containing pc value PC.
659 Returns 0 if function is not known. Backward compatibility, no section */
660
661struct symbol *
662find_pc_function (pc)
663 CORE_ADDR pc;
664{
665 return find_pc_sect_function (pc, find_pc_mapped_section (pc));
666}
667
bd5635a1
RP
668/* These variables are used to cache the most recent result
669 * of find_pc_partial_function. */
670
253ceee6
RU
671static CORE_ADDR cache_pc_function_low = 0;
672static CORE_ADDR cache_pc_function_high = 0;
673static char *cache_pc_function_name = 0;
674static struct sec *cache_pc_function_section = NULL;
bd5635a1
RP
675
676/* Clear cache, e.g. when symbol table is discarded. */
677
678void
679clear_pc_function_cache()
680{
681 cache_pc_function_low = 0;
682 cache_pc_function_high = 0;
683 cache_pc_function_name = (char *)0;
253ceee6 684 cache_pc_function_section = NULL;
bd5635a1
RP
685}
686
d541211d 687/* Finds the "function" (text symbol) that is smaller than PC but
253ceee6
RU
688 greatest of all of the potential text symbols in SECTION. Sets
689 *NAME and/or *ADDRESS conditionally if that pointer is non-null.
690 If ENDADDR is non-null, then set *ENDADDR to be the end of the
691 function (exclusive), but passing ENDADDR as non-null means that
692 the function might cause symbols to be read. This function either
d541211d
PS
693 succeeds or fails (not halfway succeeds). If it succeeds, it sets
694 *NAME, *ADDRESS, and *ENDADDR to real information and returns 1.
253ceee6
RU
695 If it fails, it sets *NAME, *ADDRESS, and *ENDADDR to zero and
696 returns 0. */
bd5635a1
RP
697
698int
253ceee6
RU
699find_pc_sect_partial_function (pc, section, name, address, endaddr)
700 CORE_ADDR pc;
701 asection *section;
702 char **name;
bd5635a1 703 CORE_ADDR *address;
d541211d 704 CORE_ADDR *endaddr;
bd5635a1
RP
705{
706 struct partial_symtab *pst;
253ceee6 707 struct symbol *f;
23a8e291 708 struct minimal_symbol *msymbol;
bd5635a1 709 struct partial_symbol *psb;
253ceee6
RU
710 struct obj_section *osect;
711 int i;
712 CORE_ADDR mapped_pc;
713
714 mapped_pc = overlay_mapped_address (pc, section);
bd5635a1 715
253ceee6
RU
716 if (mapped_pc >= cache_pc_function_low &&
717 mapped_pc < cache_pc_function_high &&
718 section == cache_pc_function_section)
d541211d
PS
719 goto return_cached_value;
720
721 /* If sigtramp is in the u area, it counts as a function (especially
722 important for step_1). */
723#if defined SIGTRAMP_START
253ceee6 724 if (IN_SIGTRAMP (mapped_pc, (char *)NULL))
bd5635a1 725 {
253ceee6
RU
726 cache_pc_function_low = SIGTRAMP_START (mapped_pc);
727 cache_pc_function_high = SIGTRAMP_END (mapped_pc);
728 cache_pc_function_name = "<sigtramp>";
729 cache_pc_function_section = section;
d541211d 730 goto return_cached_value;
bd5635a1 731 }
d541211d 732#endif
bd5635a1 733
253ceee6
RU
734 msymbol = lookup_minimal_symbol_by_pc_section (mapped_pc, section);
735 pst = find_pc_sect_psymtab (mapped_pc, section);
bd5635a1
RP
736 if (pst)
737 {
d541211d
PS
738 /* Need to read the symbols to get a good value for the end address. */
739 if (endaddr != NULL && !pst->readin)
2f1c7c3f
JK
740 {
741 /* Need to get the terminal in case symbol-reading produces
742 output. */
743 target_terminal_ours_for_output ();
744 PSYMTAB_TO_SYMTAB (pst);
745 }
d541211d 746
bd5635a1
RP
747 if (pst->readin)
748 {
d541211d
PS
749 /* Checking whether the msymbol has a larger value is for the
750 "pathological" case mentioned in print_frame_info. */
253ceee6 751 f = find_pc_sect_function (mapped_pc, section);
d541211d
PS
752 if (f != NULL
753 && (msymbol == NULL
754 || (BLOCK_START (SYMBOL_BLOCK_VALUE (f))
755 >= SYMBOL_VALUE_ADDRESS (msymbol))))
bd5635a1 756 {
253ceee6
RU
757 cache_pc_function_low = BLOCK_START (SYMBOL_BLOCK_VALUE (f));
758 cache_pc_function_high = BLOCK_END (SYMBOL_BLOCK_VALUE (f));
759 cache_pc_function_name = SYMBOL_NAME (f);
760 cache_pc_function_section = section;
d541211d 761 goto return_cached_value;
bd5635a1 762 }
bd5635a1 763 }
cef4c2e7 764 else
bd5635a1 765 {
cef4c2e7
PS
766 /* Now that static symbols go in the minimal symbol table, perhaps
767 we could just ignore the partial symbols. But at least for now
768 we use the partial or minimal symbol, whichever is larger. */
253ceee6 769 psb = find_pc_sect_psymbol (pst, mapped_pc, section);
cef4c2e7
PS
770
771 if (psb
772 && (msymbol == NULL ||
773 (SYMBOL_VALUE_ADDRESS (psb)
774 >= SYMBOL_VALUE_ADDRESS (msymbol))))
775 {
776 /* This case isn't being cached currently. */
777 if (address)
778 *address = SYMBOL_VALUE_ADDRESS (psb);
779 if (name)
780 *name = SYMBOL_NAME (psb);
781 /* endaddr non-NULL can't happen here. */
782 return 1;
783 }
bd5635a1
RP
784 }
785 }
d541211d 786
981a3309
SG
787 /* Not in the normal symbol tables, see if the pc is in a known section.
788 If it's not, then give up. This ensures that anything beyond the end
789 of the text seg doesn't appear to be part of the last function in the
790 text segment. */
791
253ceee6 792 osect = find_pc_sect_section (mapped_pc, section);
981a3309 793
253ceee6 794 if (!osect)
981a3309
SG
795 msymbol = NULL;
796
d541211d
PS
797 /* Must be in the minimal symbol table. */
798 if (msymbol == NULL)
bd5635a1 799 {
d541211d
PS
800 /* No available symbol. */
801 if (name != NULL)
802 *name = 0;
803 if (address != NULL)
804 *address = 0;
805 if (endaddr != NULL)
806 *endaddr = 0;
807 return 0;
bd5635a1
RP
808 }
809
253ceee6
RU
810 cache_pc_function_low = SYMBOL_VALUE_ADDRESS (msymbol);
811 cache_pc_function_name = SYMBOL_NAME (msymbol);
812 cache_pc_function_section = section;
813
ad3b8c4a
JM
814 /* Use the lesser of the next minimal symbol in the same section, or
815 the end of the section, as the end of the function. */
816
817 /* Step over other symbols at this same address, and symbols in
818 other sections, to find the next symbol in this section with
819 a different address. */
d541211d 820
ad3b8c4a
JM
821 for (i=1; SYMBOL_NAME (msymbol+i) != NULL; i++)
822 {
823 if (SYMBOL_VALUE_ADDRESS (msymbol+i) != SYMBOL_VALUE_ADDRESS (msymbol)
824 && SYMBOL_BFD_SECTION (msymbol+i) == SYMBOL_BFD_SECTION (msymbol))
825 break;
826 }
981a3309 827
253ceee6
RU
828 if (SYMBOL_NAME (msymbol + i) != NULL
829 && SYMBOL_VALUE_ADDRESS (msymbol + i) < osect->endaddr)
830 cache_pc_function_high = SYMBOL_VALUE_ADDRESS (msymbol + i);
bd5635a1 831 else
981a3309
SG
832 /* We got the start address from the last msymbol in the objfile.
833 So the end address is the end of the section. */
253ceee6 834 cache_pc_function_high = osect->endaddr;
d541211d
PS
835
836 return_cached_value:
253ceee6 837
bd5635a1 838 if (address)
ad3b8c4a
JM
839 {
840 if (pc_in_unmapped_range (pc, section))
841 *address = overlay_unmapped_address (cache_pc_function_low, section);
842 else
843 *address = cache_pc_function_low;
844 }
253ceee6 845
bd5635a1
RP
846 if (name)
847 *name = cache_pc_function_name;
253ceee6 848
d541211d 849 if (endaddr)
ad3b8c4a
JM
850 {
851 if (pc_in_unmapped_range (pc, section))
852 {
853 /* Because the high address is actually beyond the end of
854 the function (and therefore possibly beyond the end of
855 the overlay), we must actually convert (high - 1)
856 and then add one to that. */
857
858 *endaddr = 1 + overlay_unmapped_address (cache_pc_function_high - 1,
859 section);
860 }
861 else
862 *endaddr = cache_pc_function_high;
863 }
253ceee6 864
bd5635a1
RP
865 return 1;
866}
867
253ceee6
RU
868/* Backward compatibility, no section argument */
869
870int
871find_pc_partial_function (pc, name, address, endaddr)
872 CORE_ADDR pc;
873 char **name;
874 CORE_ADDR *address;
875 CORE_ADDR *endaddr;
876{
877 asection *section;
878
879 section = find_pc_overlay (pc);
880 return find_pc_sect_partial_function (pc, section, name, address, endaddr);
881}
882
479fdd26 883/* Return the innermost stack frame executing inside of BLOCK,
2289e1c3 884 or NULL if there is no such frame. If BLOCK is NULL, just return NULL. */
23a8e291 885
0e2c2c1e 886struct frame_info *
bd5635a1
RP
887block_innermost_frame (block)
888 struct block *block;
889{
0e2c2c1e 890 struct frame_info *frame;
2289e1c3
JK
891 register CORE_ADDR start;
892 register CORE_ADDR end;
bd5635a1 893
479fdd26
JK
894 if (block == NULL)
895 return NULL;
896
2289e1c3
JK
897 start = BLOCK_START (block);
898 end = BLOCK_END (block);
899
0e2c2c1e 900 frame = NULL;
bd5635a1
RP
901 while (1)
902 {
903 frame = get_prev_frame (frame);
0e2c2c1e
KH
904 if (frame == NULL)
905 return NULL;
906 if (frame->pc >= start && frame->pc < end)
bd5635a1
RP
907 return frame;
908 }
909}
910
0e2c2c1e
KH
911/* Return the full FRAME which corresponds to the given CORE_ADDR
912 or NULL if no FRAME on the chain corresponds to CORE_ADDR. */
999dd04b 913
0e2c2c1e 914struct frame_info *
999dd04b 915find_frame_addr_in_frame_chain (frame_addr)
0e2c2c1e 916 CORE_ADDR frame_addr;
999dd04b 917{
0e2c2c1e 918 struct frame_info *frame = NULL;
999dd04b 919
16726dd1 920 if (frame_addr == (CORE_ADDR)0)
999dd04b
JL
921 return NULL;
922
923 while (1)
924 {
925 frame = get_prev_frame (frame);
926 if (frame == NULL)
927 return NULL;
999dd04b
JL
928 if (FRAME_FP (frame) == frame_addr)
929 return frame;
930 }
931}
932
d541211d
PS
933#ifdef SIGCONTEXT_PC_OFFSET
934/* Get saved user PC for sigtramp from sigcontext for BSD style sigtramp. */
935
936CORE_ADDR
937sigtramp_saved_pc (frame)
0e2c2c1e 938 struct frame_info *frame;
d541211d
PS
939{
940 CORE_ADDR sigcontext_addr;
941 char buf[TARGET_PTR_BIT / TARGET_CHAR_BIT];
942 int ptrbytes = TARGET_PTR_BIT / TARGET_CHAR_BIT;
943 int sigcontext_offs = (2 * TARGET_INT_BIT) / TARGET_CHAR_BIT;
944
945 /* Get sigcontext address, it is the third parameter on the stack. */
946 if (frame->next)
947 sigcontext_addr = read_memory_integer (FRAME_ARGS_ADDRESS (frame->next)
0e2c2c1e
KH
948 + FRAME_ARGS_SKIP
949 + sigcontext_offs,
d541211d
PS
950 ptrbytes);
951 else
952 sigcontext_addr = read_memory_integer (read_register (SP_REGNUM)
953 + sigcontext_offs,
954 ptrbytes);
955
956 /* Don't cause a memory_error when accessing sigcontext in case the stack
957 layout has changed or the stack is corrupt. */
958 target_read_memory (sigcontext_addr + SIGCONTEXT_PC_OFFSET, buf, ptrbytes);
959 return extract_unsigned_integer (buf, ptrbytes);
960}
961#endif /* SIGCONTEXT_PC_OFFSET */
962
15cb042b
PS
963#ifdef USE_GENERIC_DUMMY_FRAMES
964
dc1b349d 965/*
15cb042b 966 * GENERIC DUMMY FRAMES
dc1b349d
MS
967 *
968 * The following code serves to maintain the dummy stack frames for
969 * inferior function calls (ie. when gdb calls into the inferior via
970 * call_function_by_hand). This code saves the machine state before
15cb042b 971 * the call in host memory, so we must maintain an independant stack
dc1b349d
MS
972 * and keep it consistant etc. I am attempting to make this code
973 * generic enough to be used by many targets.
974 *
975 * The cheapest and most generic way to do CALL_DUMMY on a new target
976 * is probably to define CALL_DUMMY to be empty, CALL_DUMMY_LENGTH to zero,
977 * and CALL_DUMMY_LOCATION to AT_ENTRY. Then you must remember to define
15cb042b
PS
978 * PUSH_RETURN_ADDRESS, because no call instruction will be being
979 * executed by the target.
dc1b349d
MS
980 */
981
982static struct dummy_frame *dummy_frame_stack = NULL;
983
984/* Function: find_dummy_frame(pc, fp, sp)
985 Search the stack of dummy frames for one matching the given PC, FP and SP.
986 This is the work-horse for pc_in_call_dummy and read_register_dummy */
987
988char *
989generic_find_dummy_frame (pc, fp)
990 CORE_ADDR pc;
991 CORE_ADDR fp;
992{
993 struct dummy_frame * dummyframe;
dc1b349d 994
dc1b349d
MS
995 if (pc != entry_point_address ())
996 return 0;
dc1b349d
MS
997
998 for (dummyframe = dummy_frame_stack; dummyframe != NULL;
999 dummyframe = dummyframe->next)
1000 if (fp == dummyframe->fp || fp == dummyframe->sp)
15cb042b
PS
1001 /* The frame in question lies between the saved fp and sp, inclusive */
1002 return dummyframe->regs;
1003
dc1b349d
MS
1004 return 0;
1005}
1006
1007/* Function: pc_in_call_dummy (pc, fp)
1008 Return true if this is a dummy frame created by gdb for an inferior call */
1009
1010int
1011generic_pc_in_call_dummy (pc, fp)
1012 CORE_ADDR pc;
1013 CORE_ADDR fp;
1014{
1015 /* if find_dummy_frame succeeds, then PC is in a call dummy */
1016 return (generic_find_dummy_frame (pc, fp) != 0);
1017}
1018
1019/* Function: read_register_dummy
1020 Find a saved register from before GDB calls a function in the inferior */
1021
1022CORE_ADDR
1023generic_read_register_dummy (pc, fp, regno)
1024 CORE_ADDR pc;
1025 CORE_ADDR fp;
1026 int regno;
1027{
1028 char *dummy_regs = generic_find_dummy_frame (pc, fp);
1029
1030 if (dummy_regs)
1031 return extract_address (&dummy_regs[REGISTER_BYTE (regno)],
1032 REGISTER_RAW_SIZE(regno));
1033 else
1034 return 0;
1035}
1036
1037/* Save all the registers on the dummy frame stack. Most ports save the
1038 registers on the target stack. This results in lots of unnecessary memory
1039 references, which are slow when debugging via a serial line. Instead, we
1040 save all the registers internally, and never write them to the stack. The
1041 registers get restored when the called function returns to the entry point,
1042 where a breakpoint is laying in wait. */
1043
1044void
1045generic_push_dummy_frame ()
1046{
1047 struct dummy_frame *dummy_frame;
1048 CORE_ADDR fp = (get_current_frame ())->frame;
1049
1050 /* check to see if there are stale dummy frames,
1051 perhaps left over from when a longjump took us out of a
1052 function that was called by the debugger */
1053
1054 dummy_frame = dummy_frame_stack;
1055 while (dummy_frame)
3a0c96a9 1056 if (INNER_THAN (dummy_frame->fp, fp)) /* stale -- destroy! */
dc1b349d
MS
1057 {
1058 dummy_frame_stack = dummy_frame->next;
1059 free (dummy_frame);
1060 dummy_frame = dummy_frame_stack;
1061 }
1062 else
1063 dummy_frame = dummy_frame->next;
1064
1065 dummy_frame = xmalloc (sizeof (struct dummy_frame));
1066 dummy_frame->pc = read_register (PC_REGNUM);
1067 dummy_frame->sp = read_register (SP_REGNUM);
1068 dummy_frame->fp = fp;
1069 read_register_bytes (0, dummy_frame->regs, REGISTER_BYTES);
1070 dummy_frame->next = dummy_frame_stack;
1071 dummy_frame_stack = dummy_frame;
1072}
1073
253ceee6
RU
1074/* Function: pop_frame
1075 Restore the machine state from either the saved dummy stack or a
1076 real stack frame. */
1077
1078void
1079generic_pop_current_frame (pop)
1080 void (*pop) PARAMS ((struct frame_info *frame));
1081{
1082 struct frame_info *frame = get_current_frame ();
1083 if (PC_IN_CALL_DUMMY(frame->pc, frame->frame, frame->frame))
1084 generic_pop_dummy_frame ();
1085 else
1086 pop (frame);
1087}
1088
dc1b349d
MS
1089/* Function: pop_dummy_frame
1090 Restore the machine state from a saved dummy stack frame. */
1091
1092void
1093generic_pop_dummy_frame ()
1094{
1095 struct dummy_frame *dummy_frame = dummy_frame_stack;
1096
1097 /* FIXME: what if the first frame isn't the right one, eg..
1098 because one call-by-hand function has done a longjmp into another one? */
1099
1100 if (!dummy_frame)
1101 error ("Can't pop dummy frame!");
1102 dummy_frame_stack = dummy_frame->next;
1103 write_register_bytes (0, dummy_frame->regs, REGISTER_BYTES);
253ceee6 1104 flush_cached_frames ();
dc1b349d
MS
1105 free (dummy_frame);
1106}
1107
1108/* Function: frame_chain_valid
1109 Returns true for a user frame or a call_function_by_hand dummy frame,
1110 and false for the CRT0 start-up frame. Purpose is to terminate backtrace */
1111
1112int
1113generic_frame_chain_valid (fp, fi)
1114 CORE_ADDR fp;
1115 struct frame_info *fi;
1116{
dc1b349d
MS
1117 if (PC_IN_CALL_DUMMY(FRAME_SAVED_PC(fi), fp, fp))
1118 return 1; /* don't prune CALL_DUMMY frames */
1119 else /* fall back to default algorithm (see frame.h) */
c301abbd 1120 return (fp != 0
3a0c96a9 1121 && (INNER_THAN (fi->frame, fp) || fi->frame == fp)
c301abbd 1122 && !inside_entry_file (FRAME_SAVED_PC(fi)));
dc1b349d
MS
1123}
1124
1125/* Function: get_saved_register
1126 Find register number REGNUM relative to FRAME and put its (raw,
1127 target format) contents in *RAW_BUFFER.
1128
1129 Set *OPTIMIZED if the variable was optimized out (and thus can't be
1130 fetched). Note that this is never set to anything other than zero
1131 in this implementation.
1132
1133 Set *LVAL to lval_memory, lval_register, or not_lval, depending on
1134 whether the value was fetched from memory, from a register, or in a
1135 strange and non-modifiable way (e.g. a frame pointer which was
1136 calculated rather than fetched). We will use not_lval for values
1137 fetched from generic dummy frames.
1138
1139 Set *ADDRP to the address, either in memory on as a REGISTER_BYTE
1140 offset into the registers array. If the value is stored in a dummy
1141 frame, set *ADDRP to zero.
1142
1143 To use this implementation, define a function called
1144 "get_saved_register" in your target code, which simply passes all
1145 of its arguments to this function.
1146
1147 The argument RAW_BUFFER must point to aligned memory. */
1148
1149void
1150generic_get_saved_register (raw_buffer, optimized, addrp, frame, regnum, lval)
1151 char *raw_buffer;
1152 int *optimized;
1153 CORE_ADDR *addrp;
1154 struct frame_info *frame;
1155 int regnum;
1156 enum lval_type *lval;
1157{
dc1b349d
MS
1158 struct frame_saved_regs fsr;
1159
1160 if (!target_has_registers)
1161 error ("No registers.");
1162
1163 /* Normal systems don't optimize out things with register numbers. */
1164 if (optimized != NULL)
1165 *optimized = 0;
1166
1167 if (addrp) /* default assumption: not found in memory */
1168 *addrp = 0;
1169
1170 /* Note: since the current frame's registers could only have been
1171 saved by frames INTERIOR TO the current frame, we skip examining
1172 the current frame itself: otherwise, we would be getting the
1173 previous frame's registers which were saved by the current frame. */
1174
b444216f 1175 while (frame && ((frame = frame->next) != NULL))
dc1b349d
MS
1176 {
1177 if (PC_IN_CALL_DUMMY (frame->pc, frame->frame, frame->frame))
1178 {
1179 if (lval) /* found it in a CALL_DUMMY frame */
1180 *lval = not_lval;
1181 if (raw_buffer)
1182 memcpy (raw_buffer,
1183 generic_find_dummy_frame (frame->pc, frame->frame) +
1184 REGISTER_BYTE (regnum),
1185 REGISTER_RAW_SIZE (regnum));
1186 return;
1187 }
1188
1189 FRAME_FIND_SAVED_REGS(frame, fsr);
1190 if (fsr.regs[regnum] != 0)
1191 {
1192 if (lval) /* found it saved on the stack */
1193 *lval = lval_memory;
1194 if (regnum == SP_REGNUM)
1195 {
1196 if (raw_buffer) /* SP register treated specially */
1197 store_address (raw_buffer, REGISTER_RAW_SIZE (regnum),
1198 fsr.regs[regnum]);
1199 }
1200 else
1201 {
1202 if (addrp) /* any other register */
1203 *addrp = fsr.regs[regnum];
1204 if (raw_buffer)
1205 read_memory (fsr.regs[regnum], raw_buffer,
1206 REGISTER_RAW_SIZE (regnum));
1207 }
1208 return;
1209 }
1210 }
1211
1212 /* If we get thru the loop to this point, it means the register was
1213 not saved in any frame. Return the actual live-register value. */
1214
1215 if (lval) /* found it in a live register */
1216 *lval = lval_register;
1217 if (addrp)
1218 *addrp = REGISTER_BYTE (regnum);
1219 if (raw_buffer)
1220 read_register_gen (regnum, raw_buffer);
1221}
15cb042b 1222#endif /* USE_GENERIC_DUMMY_FRAMES */
dc1b349d 1223
bd5635a1
RP
1224void
1225_initialize_blockframe ()
1226{
1227 obstack_init (&frame_cache_obstack);
1228}
This page took 0.348955 seconds and 4 git commands to generate.