PR symtab/12984:
[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,
7b6bb8da 4 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2007, 2008, 2009, 2010, 2011
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);
433759f7 39
a94dd1fd
AC
40 cache->regcache = regcache;
41 return cache;
42}
43
44/* Here the register value is taken direct from the register cache. */
45
669fac23
DJ
46static struct value *
47sentinel_frame_prev_register (struct frame_info *this_frame,
6dc42492 48 void **this_prologue_cache,
669fac23 49 int regnum)
a94dd1fd 50{
669fac23 51 struct gdbarch *gdbarch = get_frame_arch (this_frame);
6dc42492 52 struct frame_unwind_cache *cache = *this_prologue_cache;
669fac23 53 struct value *value;
8fbca658 54 struct type *regtype = register_type (gdbarch, regnum);
669fac23
DJ
55
56 /* Return the actual value. */
8fbca658 57 value = allocate_value (regtype);
669fac23
DJ
58 VALUE_LVAL (value) = lval_register;
59 VALUE_REGNUM (value) = regnum;
60 VALUE_FRAME_ID (value) = get_frame_id (this_frame);
61
62 /* Use the regcache_cooked_read() method so that it, on the fly,
63 constructs either a raw or pseudo register from the raw
64 register cache. */
0fdb4f18
PA
65 if (regcache_cooked_read (cache->regcache,
66 regnum,
67 value_contents_raw (value)) == REG_UNAVAILABLE)
8fbca658 68 mark_value_bytes_unavailable (value, 0, TYPE_LENGTH (regtype));
669fac23
DJ
69
70 return value;
a94dd1fd
AC
71}
72
b9362cc7 73static void
669fac23 74sentinel_frame_this_id (struct frame_info *this_frame,
6dc42492
AC
75 void **this_prologue_cache,
76 struct frame_id *this_id)
a94dd1fd 77{
6dc42492
AC
78 /* The sentinel frame is used as a starting point for creating the
79 previous (inner most) frame. That frame's THIS_ID method will be
80 called to determine the inner most frame's ID. Not this one. */
e2e0b3e5 81 internal_error (__FILE__, __LINE__, _("sentinel_frame_this_id called"));
a94dd1fd
AC
82}
83
36f15f55
UW
84static struct gdbarch *
85sentinel_frame_prev_arch (struct frame_info *this_frame,
86 void **this_prologue_cache)
87{
88 struct frame_unwind_cache *cache = *this_prologue_cache;
433759f7 89
36f15f55
UW
90 return get_regcache_arch (cache->regcache);
91}
92
39d7b0e2 93const struct frame_unwind sentinel_frame_unwind =
a94dd1fd 94{
0e100dab 95 SENTINEL_FRAME,
8fbca658 96 default_frame_unwind_stop_reason,
6dc42492 97 sentinel_frame_this_id,
36f15f55
UW
98 sentinel_frame_prev_register,
99 NULL,
100 NULL,
101 NULL,
102 sentinel_frame_prev_arch,
a94dd1fd 103};
This page took 0.748744 seconds and 4 git commands to generate.