2010-05-16 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / std-regs.c
CommitLineData
0406ec40
AC
1/* Builtin frame register, for GDB, the GNU debugger.
2
4c38e0a4
JB
3 Copyright (C) 2002, 2005, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
0406ec40
AC
5
6 Contributed by Red Hat.
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
0406ec40
AC
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
0406ec40
AC
22
23#include "defs.h"
eb8bc282 24#include "user-regs.h"
0406ec40
AC
25#include "frame.h"
26#include "gdbtypes.h"
27#include "value.h"
b66d6d2e 28#include "gdb_string.h"
0406ec40 29
0406ec40
AC
30
31static struct value *
123dc839 32value_of_builtin_frame_fp_reg (struct frame_info *frame, const void *baton)
0406ec40 33{
e9a4730f
UW
34 struct gdbarch *gdbarch = get_frame_arch (frame);
35 if (gdbarch_deprecated_fp_regnum (gdbarch) >= 0)
0ba6dca9
AC
36 /* NOTE: cagney/2003-04-24: Since the mere presence of "fp" in the
37 register name table overrides this built-in $fp register, there
064f5156 38 is no real reason for this gdbarch_deprecated_fp_regnum trickery here.
0ba6dca9
AC
39 An architecture wanting to implement "$fp" as alias for a raw
40 register can do so by adding "fp" to register name table (mind
41 you, doing this is probably a dangerous thing). */
e9a4730f 42 return value_of_register (gdbarch_deprecated_fp_regnum (gdbarch),
064f5156 43 frame);
0ba6dca9
AC
44 else
45 {
0dfff4cb
UW
46 struct type *data_ptr_type = builtin_type (gdbarch)->builtin_data_ptr;
47 struct value *val = allocate_value (data_ptr_type);
10c42a71 48 gdb_byte *buf = value_contents_raw (val);
0ba6dca9 49 if (frame == NULL)
170cd118 50 memset (buf, 0, TYPE_LENGTH (value_type (val)));
0ba6dca9 51 else
0dfff4cb 52 gdbarch_address_to_pointer (gdbarch, data_ptr_type,
76e71323 53 buf, get_frame_base_address (frame));
0ba6dca9
AC
54 return val;
55 }
0406ec40
AC
56}
57
58static struct value *
123dc839 59value_of_builtin_frame_pc_reg (struct frame_info *frame, const void *baton)
0406ec40 60{
e9a4730f
UW
61 struct gdbarch *gdbarch = get_frame_arch (frame);
62 if (gdbarch_pc_regnum (gdbarch) >= 0)
63 return value_of_register (gdbarch_pc_regnum (gdbarch), frame);
82de1e5b
AC
64 else
65 {
0dfff4cb
UW
66 struct type *func_ptr_type = builtin_type (gdbarch)->builtin_func_ptr;
67 struct value *val = allocate_value (func_ptr_type);
10c42a71 68 gdb_byte *buf = value_contents_raw (val);
82de1e5b 69 if (frame == NULL)
170cd118 70 memset (buf, 0, TYPE_LENGTH (value_type (val)));
82de1e5b 71 else
0dfff4cb 72 gdbarch_address_to_pointer (gdbarch, func_ptr_type,
e9a4730f 73 buf, get_frame_pc (frame));
82de1e5b
AC
74 return val;
75 }
0406ec40
AC
76}
77
78static struct value *
123dc839 79value_of_builtin_frame_sp_reg (struct frame_info *frame, const void *baton)
0406ec40 80{
e9a4730f
UW
81 struct gdbarch *gdbarch = get_frame_arch (frame);
82 if (gdbarch_sp_regnum (gdbarch) >= 0)
83 return value_of_register (gdbarch_sp_regnum (gdbarch), frame);
8a3fe4f8 84 error (_("Standard register ``$sp'' is not available for this target"));
0406ec40
AC
85}
86
87static struct value *
123dc839 88value_of_builtin_frame_ps_reg (struct frame_info *frame, const void *baton)
0406ec40 89{
e9a4730f
UW
90 struct gdbarch *gdbarch = get_frame_arch (frame);
91 if (gdbarch_ps_regnum (gdbarch) >= 0)
92 return value_of_register (gdbarch_ps_regnum (gdbarch), frame);
8a3fe4f8 93 error (_("Standard register ``$ps'' is not available for this target"));
0406ec40
AC
94}
95
b9362cc7
AC
96extern initialize_file_ftype _initialize_frame_reg; /* -Wmissing-prototypes */
97
0406ec40
AC
98void
99_initialize_frame_reg (void)
100{
0406ec40
AC
101 /* Frame based $fp, $pc, $sp and $ps. These only come into play
102 when the target does not define its own version of these
103 registers. */
123dc839
DJ
104 user_reg_add_builtin ("fp", value_of_builtin_frame_fp_reg, NULL);
105 user_reg_add_builtin ("pc", value_of_builtin_frame_pc_reg, NULL);
106 user_reg_add_builtin ("sp", value_of_builtin_frame_sp_reg, NULL);
107 user_reg_add_builtin ("ps", value_of_builtin_frame_ps_reg, NULL);
0406ec40 108}
This page took 0.853403 seconds and 4 git commands to generate.