Commonise tdesc_feature and makes use of it in gdbserver tdesc
[deliverable/binutils-gdb.git] / gdb / common / tdesc.c
1 /* Target description support for GDB.
2
3 Copyright (C) 2018 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20 #include "common-defs.h"
21 #include "common/tdesc.h"
22
23 tdesc_reg::tdesc_reg (struct tdesc_feature *feature, const std::string &name_,
24 int regnum, int save_restore_, const char *group_,
25 int bitsize_, const char *type_)
26 : name (name_), target_regnum (regnum),
27 save_restore (save_restore_),
28 group (group_ != NULL ? group_ : ""),
29 bitsize (bitsize_),
30 type (type_ != NULL ? type_ : "<unknown>")
31 {
32 /* If the register's type is target-defined, look it up now. We may not
33 have easy access to the containing feature when we want it later. */
34 tdesc_type = tdesc_named_type (feature, type.c_str ());
35 }
36
37 void tdesc_feature::accept (tdesc_element_visitor &v) const
38 {
39 v.visit_pre (this);
40
41 for (const tdesc_type_up &type : types)
42 type->accept (v);
43
44 for (const tdesc_reg_up &reg : registers)
45 reg->accept (v);
46
47 v.visit_post (this);
48 }
49
50 bool tdesc_feature::operator== (const tdesc_feature &other) const
51 {
52 if (name != other.name)
53 return false;
54
55 if (registers.size () != other.registers.size ())
56 return false;
57
58 for (int ix = 0; ix < registers.size (); ix++)
59 {
60 const tdesc_reg_up &reg1 = registers[ix];
61 const tdesc_reg_up &reg2 = other.registers[ix];
62
63 if (reg1 != reg2 && *reg1 != *reg2)
64 return false;
65 }
66
67 if (types.size () != other.types.size ())
68 return false;
69
70 for (int ix = 0; ix < types.size (); ix++)
71 {
72 const tdesc_type_up &type1 = types[ix];
73 const tdesc_type_up &type2 = other.types[ix];
74
75 if (type1 != type2 && *type1 != *type2)
76 return false;
77 }
78
79 return true;
80 }
81
82 /* See common/tdesc.h. */
83
84 void
85 tdesc_create_reg (struct tdesc_feature *feature, const char *name,
86 int regnum, int save_restore, const char *group,
87 int bitsize, const char *type)
88 {
89 tdesc_reg *reg = new tdesc_reg (feature, name, regnum, save_restore,
90 group, bitsize, type);
91
92 feature->registers.emplace_back (reg);
93 }
This page took 0.034813 seconds and 5 git commands to generate.