2009-12-15 Tristan Gingold <gingold@adacore.com>
[deliverable/binutils-gdb.git] / gdb / std-regs.c
CommitLineData
0406ec40
AC
1/* Builtin frame register, for GDB, the GNU debugger.
2
0fb0cc75 3 Copyright (C) 2002, 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
0406ec40
AC
4
5 Contributed by Red Hat.
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
0406ec40
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/>. */
0406ec40
AC
21
22#include "defs.h"
eb8bc282 23#include "user-regs.h"
0406ec40
AC
24#include "frame.h"
25#include "gdbtypes.h"
26#include "value.h"
b66d6d2e 27#include "gdb_string.h"
0406ec40 28
0406ec40
AC
29
30static struct value *
123dc839 31value_of_builtin_frame_fp_reg (struct frame_info *frame, const void *baton)
0406ec40 32{
e9a4730f
UW
33 struct gdbarch *gdbarch = get_frame_arch (frame);
34 if (gdbarch_deprecated_fp_regnum (gdbarch) >= 0)
0ba6dca9
AC
35 /* NOTE: cagney/2003-04-24: Since the mere presence of "fp" in the
36 register name table overrides this built-in $fp register, there
064f5156 37 is no real reason for this gdbarch_deprecated_fp_regnum trickery here.
0ba6dca9
AC
38 An architecture wanting to implement "$fp" as alias for a raw
39 register can do so by adding "fp" to register name table (mind
40 you, doing this is probably a dangerous thing). */
e9a4730f 41 return value_of_register (gdbarch_deprecated_fp_regnum (gdbarch),
064f5156 42 frame);
0ba6dca9
AC
43 else
44 {
0dfff4cb
UW
45 struct type *data_ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
46 struct value *val = allocate_value (data_ptr_type);
10c42a71 47 gdb_byte *buf = value_contents_raw (val);
0ba6dca9 48 if (frame == NULL)
170cd118 49 memset (buf, 0, TYPE_LENGTH (value_type (val)));
0ba6dca9 50 else
0dfff4cb 51 gdbarch_address_to_pointer (gdbarch, data_ptr_type,
76e71323 52 buf, get_frame_base_address (frame));
0ba6dca9
AC
53 return val;
54 }
0406ec40
AC
55}
56
57static struct value *
123dc839 58value_of_builtin_frame_pc_reg (struct frame_info *frame, const void *baton)
0406ec40 59{
e9a4730f
UW
60 struct gdbarch *gdbarch = get_frame_arch (frame);
61 if (gdbarch_pc_regnum (gdbarch) >= 0)
62 return value_of_register (gdbarch_pc_regnum (gdbarch), frame);
82de1e5b
AC
63 else
64 {
0dfff4cb
UW
65 struct type *func_ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
66 struct value *val = allocate_value (func_ptr_type);
10c42a71 67 gdb_byte *buf = value_contents_raw (val);
82de1e5b 68 if (frame == NULL)
170cd118 69 memset (buf, 0, TYPE_LENGTH (value_type (val)));
82de1e5b 70 else
0dfff4cb 71 gdbarch_address_to_pointer (gdbarch, func_ptr_type,
e9a4730f 72 buf, get_frame_pc (frame));
82de1e5b
AC
73 return val;
74 }
0406ec40
AC
75}
76
77static struct value *
123dc839 78value_of_builtin_frame_sp_reg (struct frame_info *frame, const void *baton)
0406ec40 79{
e9a4730f
UW
80 struct gdbarch *gdbarch = get_frame_arch (frame);
81 if (gdbarch_sp_regnum (gdbarch) >= 0)
82 return value_of_register (gdbarch_sp_regnum (gdbarch), frame);
8a3fe4f8 83 error (_("Standard register ``$sp'' is not available for this target"));
0406ec40
AC
84}
85
86static struct value *
123dc839 87value_of_builtin_frame_ps_reg (struct frame_info *frame, const void *baton)
0406ec40 88{
e9a4730f
UW
89 struct gdbarch *gdbarch = get_frame_arch (frame);
90 if (gdbarch_ps_regnum (gdbarch) >= 0)
91 return value_of_register (gdbarch_ps_regnum (gdbarch), frame);
8a3fe4f8 92 error (_("Standard register ``$ps'' is not available for this target"));
0406ec40
AC
93}
94
b9362cc7
AC
95extern initialize_file_ftype _initialize_frame_reg; /* -Wmissing-prototypes */
96
0406ec40
AC
97void
98_initialize_frame_reg (void)
99{
0406ec40
AC
100 /* Frame based $fp, $pc, $sp and $ps. These only come into play
101 when the target does not define its own version of these
102 registers. */
123dc839
DJ
103 user_reg_add_builtin ("fp", value_of_builtin_frame_fp_reg, NULL);
104 user_reg_add_builtin ("pc", value_of_builtin_frame_pc_reg, NULL);
105 user_reg_add_builtin ("sp", value_of_builtin_frame_sp_reg, NULL);
106 user_reg_add_builtin ("ps", value_of_builtin_frame_ps_reg, NULL);
0406ec40 107}
This page took 0.94195 seconds and 4 git commands to generate.