1b725ae77Skettenis /* Builtin frame register, for GDB, the GNU debugger.
2b725ae77Skettenis
3b725ae77Skettenis Copyright 2002 Free Software Foundation, Inc.
4b725ae77Skettenis
5b725ae77Skettenis Contributed by Red Hat.
6b725ae77Skettenis
7b725ae77Skettenis This file is part of GDB.
8b725ae77Skettenis
9b725ae77Skettenis This program is free software; you can redistribute it and/or modify
10b725ae77Skettenis it under the terms of the GNU General Public License as published by
11b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
12b725ae77Skettenis (at your option) any later version.
13b725ae77Skettenis
14b725ae77Skettenis This program is distributed in the hope that it will be useful,
15b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
16b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17b725ae77Skettenis GNU General Public License for more details.
18b725ae77Skettenis
19b725ae77Skettenis You should have received a copy of the GNU General Public License
20b725ae77Skettenis along with this program; if not, write to the Free Software
21b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
22b725ae77Skettenis Boston, MA 02111-1307, USA. */
23b725ae77Skettenis
24b725ae77Skettenis #include "defs.h"
25b725ae77Skettenis #include "user-regs.h"
26b725ae77Skettenis #include "frame.h"
27b725ae77Skettenis #include "gdbtypes.h"
28b725ae77Skettenis #include "value.h"
29b725ae77Skettenis #include "gdb_string.h"
30b725ae77Skettenis
31b725ae77Skettenis /* Types that describe the various builtin registers. */
32b725ae77Skettenis
33b725ae77Skettenis static struct type *builtin_type_frame_reg;
34b725ae77Skettenis
35b725ae77Skettenis /* Constructors for those types. */
36b725ae77Skettenis
37b725ae77Skettenis static void
build_builtin_type_frame_reg(void)38b725ae77Skettenis build_builtin_type_frame_reg (void)
39b725ae77Skettenis {
40b725ae77Skettenis /* $frame. */
41b725ae77Skettenis if (builtin_type_frame_reg == NULL)
42b725ae77Skettenis {
43b725ae77Skettenis #if 0
44b725ae77Skettenis struct frame
45b725ae77Skettenis {
46b725ae77Skettenis void *base;
47b725ae77Skettenis };
48b725ae77Skettenis #endif
49b725ae77Skettenis builtin_type_frame_reg = init_composite_type ("frame", TYPE_CODE_STRUCT);
50b725ae77Skettenis append_composite_type_field (builtin_type_frame_reg, "base",
51b725ae77Skettenis builtin_type_void_data_ptr);
52b725ae77Skettenis }
53b725ae77Skettenis }
54b725ae77Skettenis
55b725ae77Skettenis static struct value *
value_of_builtin_frame_reg(struct frame_info * frame)56b725ae77Skettenis value_of_builtin_frame_reg (struct frame_info *frame)
57b725ae77Skettenis {
58b725ae77Skettenis struct value *val;
59b725ae77Skettenis char *buf;
60b725ae77Skettenis build_builtin_type_frame_reg ();
61b725ae77Skettenis val = allocate_value (builtin_type_frame_reg);
62b725ae77Skettenis VALUE_LVAL (val) = not_lval;
63b725ae77Skettenis buf = VALUE_CONTENTS_RAW (val);
64*deab09e0Skettenis memset (buf, 0, TYPE_LENGTH (VALUE_TYPE (val)));
65b725ae77Skettenis /* frame.base. */
66b725ae77Skettenis if (frame != NULL)
67b725ae77Skettenis ADDRESS_TO_POINTER (builtin_type_void_data_ptr, buf,
68b725ae77Skettenis get_frame_base (frame));
69b725ae77Skettenis buf += TYPE_LENGTH (builtin_type_void_data_ptr);
70b725ae77Skettenis /* frame.XXX. */
71b725ae77Skettenis return val;
72b725ae77Skettenis }
73b725ae77Skettenis
74b725ae77Skettenis static struct value *
value_of_builtin_frame_fp_reg(struct frame_info * frame)75b725ae77Skettenis value_of_builtin_frame_fp_reg (struct frame_info *frame)
76b725ae77Skettenis {
77b725ae77Skettenis if (DEPRECATED_FP_REGNUM >= 0)
78b725ae77Skettenis /* NOTE: cagney/2003-04-24: Since the mere presence of "fp" in the
79b725ae77Skettenis register name table overrides this built-in $fp register, there
80b725ae77Skettenis is no real reason for this DEPRECATED_FP_REGNUM trickery here.
81b725ae77Skettenis An architecture wanting to implement "$fp" as alias for a raw
82b725ae77Skettenis register can do so by adding "fp" to register name table (mind
83b725ae77Skettenis you, doing this is probably a dangerous thing). */
84b725ae77Skettenis return value_of_register (DEPRECATED_FP_REGNUM, frame);
85b725ae77Skettenis else
86b725ae77Skettenis {
87b725ae77Skettenis struct value *val = allocate_value (builtin_type_void_data_ptr);
88b725ae77Skettenis char *buf = VALUE_CONTENTS_RAW (val);
89b725ae77Skettenis if (frame == NULL)
90*deab09e0Skettenis memset (buf, 0, TYPE_LENGTH (VALUE_TYPE (val)));
91b725ae77Skettenis else
92b725ae77Skettenis ADDRESS_TO_POINTER (builtin_type_void_data_ptr, buf,
93b725ae77Skettenis get_frame_base_address (frame));
94b725ae77Skettenis return val;
95b725ae77Skettenis }
96b725ae77Skettenis }
97b725ae77Skettenis
98b725ae77Skettenis static struct value *
value_of_builtin_frame_pc_reg(struct frame_info * frame)99b725ae77Skettenis value_of_builtin_frame_pc_reg (struct frame_info *frame)
100b725ae77Skettenis {
101b725ae77Skettenis if (PC_REGNUM >= 0)
102b725ae77Skettenis return value_of_register (PC_REGNUM, frame);
103b725ae77Skettenis else
104b725ae77Skettenis {
105b725ae77Skettenis struct value *val = allocate_value (builtin_type_void_data_ptr);
106b725ae77Skettenis char *buf = VALUE_CONTENTS_RAW (val);
107b725ae77Skettenis if (frame == NULL)
108*deab09e0Skettenis memset (buf, 0, TYPE_LENGTH (VALUE_TYPE (val)));
109b725ae77Skettenis else
110b725ae77Skettenis ADDRESS_TO_POINTER (builtin_type_void_data_ptr, buf,
111b725ae77Skettenis get_frame_pc (frame));
112b725ae77Skettenis return val;
113b725ae77Skettenis }
114b725ae77Skettenis }
115b725ae77Skettenis
116b725ae77Skettenis static struct value *
value_of_builtin_frame_sp_reg(struct frame_info * frame)117b725ae77Skettenis value_of_builtin_frame_sp_reg (struct frame_info *frame)
118b725ae77Skettenis {
119b725ae77Skettenis #ifdef SP_REGNUM
120b725ae77Skettenis if (SP_REGNUM >= 0)
121b725ae77Skettenis return value_of_register (SP_REGNUM, frame);
122b725ae77Skettenis #endif
123b725ae77Skettenis error ("Standard register ``$sp'' is not available for this target");
124b725ae77Skettenis }
125b725ae77Skettenis
126b725ae77Skettenis static struct value *
value_of_builtin_frame_ps_reg(struct frame_info * frame)127b725ae77Skettenis value_of_builtin_frame_ps_reg (struct frame_info *frame)
128b725ae77Skettenis {
129b725ae77Skettenis #ifdef PS_REGNUM
130b725ae77Skettenis if (PS_REGNUM >= 0)
131b725ae77Skettenis return value_of_register (PS_REGNUM, frame);
132b725ae77Skettenis #endif
133b725ae77Skettenis error ("Standard register ``$ps'' is not available for this target");
134b725ae77Skettenis }
135b725ae77Skettenis
136b725ae77Skettenis extern initialize_file_ftype _initialize_frame_reg; /* -Wmissing-prototypes */
137b725ae77Skettenis
138b725ae77Skettenis void
_initialize_frame_reg(void)139b725ae77Skettenis _initialize_frame_reg (void)
140b725ae77Skettenis {
141b725ae77Skettenis /* FIXME: cagney/2002-02-08: At present the local builtin types
142b725ae77Skettenis can't be initialized using _initialize*() or gdbarch. Due mainly
143b725ae77Skettenis to non-multi-arch targets, GDB initializes things piece meal and,
144b725ae77Skettenis as a consequence can leave these types NULL. */
145b725ae77Skettenis DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_frame_reg);
146b725ae77Skettenis
147b725ae77Skettenis /* Frame based $fp, $pc, $sp and $ps. These only come into play
148b725ae77Skettenis when the target does not define its own version of these
149b725ae77Skettenis registers. */
150b725ae77Skettenis user_reg_add_builtin ("fp", value_of_builtin_frame_fp_reg);
151b725ae77Skettenis user_reg_add_builtin ("pc", value_of_builtin_frame_pc_reg);
152b725ae77Skettenis user_reg_add_builtin ("sp", value_of_builtin_frame_sp_reg);
153b725ae77Skettenis user_reg_add_builtin ("ps", value_of_builtin_frame_ps_reg);
154b725ae77Skettenis
155b725ae77Skettenis /* NOTE: cagney/2002-04-05: For moment leave the $frame / $gdbframe
156b725ae77Skettenis / $gdb.frame disabled. It isn't yet clear which of the many
157b725ae77Skettenis options is the best. */
158b725ae77Skettenis if (0)
159b725ae77Skettenis user_reg_add_builtin ("frame", value_of_builtin_frame_reg);
160b725ae77Skettenis }
161