* aoutx.h (aout_get_external_symbols): Declare 'amt' locally.
[deliverable/binutils-gdb.git] / gdb / sentinel-frame.c
CommitLineData
a94dd1fd
AC
1/* Code dealing with register stack frames, for GDB, the GNU debugger.
2
6aba47ca 3 Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
0fb0cc75 4 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2007, 2008, 2009
6aba47ca 5 Free Software Foundation, Inc.
a94dd1fd
AC
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
a94dd1fd
AC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
a94dd1fd
AC
21
22
23#include "defs.h"
24#include "regcache.h"
25#include "sentinel-frame.h"
26#include "inferior.h"
27#include "frame-unwind.h"
28
29struct frame_unwind_cache
30{
31 struct regcache *regcache;
32};
33
34void *
35sentinel_frame_cache (struct regcache *regcache)
36{
37 struct frame_unwind_cache *cache =
38 FRAME_OBSTACK_ZALLOC (struct frame_unwind_cache);
39 cache->regcache = regcache;
40 return cache;
41}
42
43/* Here the register value is taken direct from the register cache. */
44
669fac23
DJ
45static struct value *
46sentinel_frame_prev_register (struct frame_info *this_frame,
6dc42492 47 void **this_prologue_cache,
669fac23 48 int regnum)
a94dd1fd 49{
669fac23 50 struct gdbarch *gdbarch = get_frame_arch (this_frame);
6dc42492 51 struct frame_unwind_cache *cache = *this_prologue_cache;
669fac23
DJ
52 struct value *value;
53
54 /* Return the actual value. */
55 value = allocate_value (register_type (gdbarch, regnum));
56 VALUE_LVAL (value) = lval_register;
57 VALUE_REGNUM (value) = regnum;
58 VALUE_FRAME_ID (value) = get_frame_id (this_frame);
59
60 /* Use the regcache_cooked_read() method so that it, on the fly,
61 constructs either a raw or pseudo register from the raw
62 register cache. */
63 regcache_cooked_read (cache->regcache, regnum, value_contents_raw (value));
64
65 return value;
a94dd1fd
AC
66}
67
b9362cc7 68static void
669fac23 69sentinel_frame_this_id (struct frame_info *this_frame,
6dc42492
AC
70 void **this_prologue_cache,
71 struct frame_id *this_id)
a94dd1fd 72{
6dc42492
AC
73 /* The sentinel frame is used as a starting point for creating the
74 previous (inner most) frame. That frame's THIS_ID method will be
75 called to determine the inner most frame's ID. Not this one. */
e2e0b3e5 76 internal_error (__FILE__, __LINE__, _("sentinel_frame_this_id called"));
a94dd1fd
AC
77}
78
a94dd1fd
AC
79const struct frame_unwind sentinel_frame_unwinder =
80{
0e100dab 81 SENTINEL_FRAME,
6dc42492 82 sentinel_frame_this_id,
669fac23 83 sentinel_frame_prev_register
a94dd1fd
AC
84};
85
86const struct frame_unwind *const sentinel_frame_unwind = &sentinel_frame_unwinder;
This page took 0.667961 seconds and 4 git commands to generate.