xref: /openbsd-src/gnu/usr.bin/binutils/gdb/std-regs.c (revision deab09e09ad460c4a7824258003a445a030c6f14)
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