xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/arch/riscv.h (revision b2c35e17b976cf7ccd7250c86c6f5e95090ed636)
1 /* Common target-dependent functionality for RISC-V
2 
3    Copyright (C) 2018-2020 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 #ifndef ARCH_RISCV_H
21 #define ARCH_RISCV_H
22 
23 #include "gdbsupport/tdesc.h"
24 
25 /* The set of RISC-V architectural features that we track that impact how
26    we configure the actual gdbarch instance.  We hold one of these in the
27    gdbarch_tdep structure, and use it to distinguish between different
28    RISC-V gdbarch instances.
29 
30    The information in here ideally comes from the target description,
31    however, if the target doesn't provide a target description then we will
32    create a default target description by first populating one of these
33    based on what we know about the binary being executed, and using that to
34    drive default target description creation.  */
35 
36 struct riscv_gdbarch_features
37 {
38   /* The size of the x-registers in bytes.  This is either 4 (RV32), 8
39      (RV64), or 16 (RV128).  No other value is valid.  Initialise to the
40      invalid 0 value so we can spot if one of these is used
41      uninitialised.  */
42   int xlen = 0;
43 
44   /* The size of the f-registers in bytes.  This is either 4 (RV32), 8
45      (RV64), or 16 (RV128).  This can also hold the value 0 to indicate
46      that there are no f-registers.  No other value is valid.  */
47   int flen = 0;
48 
49   /* Equality operator.  */
50   bool operator== (const struct riscv_gdbarch_features &rhs) const
51   {
52     return (xlen == rhs.xlen && flen == rhs.flen);
53   }
54 
55   /* Inequality operator.  */
56   bool operator!= (const struct riscv_gdbarch_features &rhs) const
57   {
58     return !((*this) == rhs);
59   }
60 
61   /* Used by std::unordered_map to hash feature sets.  */
62   std::size_t hash () const noexcept
63   {
64     std::size_t val = ((xlen & 0x1f) << 5 | (flen & 0x1f) << 0);
65     return val;
66   }
67 };
68 
69 #ifdef GDBSERVER
70 
71 /* Create and return a target description that is compatible with FEATURES.
72    This is only used directly from the gdbserver where the created target
73    description is modified after it is return.  */
74 
75 target_desc *riscv_create_target_description
76 	(const struct riscv_gdbarch_features features);
77 
78 #else
79 
80 /* Lookup an already existing target description matching FEATURES, or
81    create a new target description if this is the first time we have seen
82    FEATURES.  For the same FEATURES the same target_desc is always
83    returned.  This is important when trying to lookup gdbarch objects as
84    GDBARCH_LIST_LOOKUP_BY_INFO performs a pointer comparison on target
85    descriptions to find candidate gdbarch objects.  */
86 
87 const target_desc *riscv_lookup_target_description
88 	(const struct riscv_gdbarch_features features);
89 
90 #endif /* GDBSERVER */
91 
92 
93 #endif /* ARCH_RISCV_H */
94