18
18
#define GPR_OFFSET (idx ) ((idx)*8 + 0 )
19
19
#define FPR_OFFSET (idx ) ((idx)*8 + sizeof (RegisterInfoPOSIX_riscv64::GPR))
20
20
21
- #define REG_CONTEXT_SIZE \
22
- (sizeof (RegisterInfoPOSIX_riscv64::GPR) + \
23
- sizeof (RegisterInfoPOSIX_riscv64::FPR))
24
-
25
21
#define DECLARE_REGISTER_INFOS_RISCV64_STRUCT
26
22
#include " RegisterInfos_riscv64.h"
27
23
#undef DECLARE_REGISTER_INFOS_RISCV64_STRUCT
28
24
29
- const lldb_private::RegisterInfo *RegisterInfoPOSIX_riscv64::GetRegisterInfoPtr (
30
- const lldb_private::ArchSpec &target_arch) {
31
- switch (target_arch.GetMachine ()) {
32
- case llvm::Triple::riscv64:
33
- return g_register_infos_riscv64_le;
34
- default :
35
- assert (false && " Unhandled target architecture." );
36
- return nullptr ;
37
- }
38
- }
39
-
40
- uint32_t RegisterInfoPOSIX_riscv64::GetRegisterInfoCount (
41
- const lldb_private::ArchSpec &target_arch) {
42
- switch (target_arch.GetMachine ()) {
43
- case llvm::Triple::riscv64:
44
- return static_cast <uint32_t >(sizeof (g_register_infos_riscv64_le) /
45
- sizeof (g_register_infos_riscv64_le[0 ]));
46
- default :
47
- assert (false && " Unhandled target architecture." );
48
- return 0 ;
49
- }
50
- }
51
-
52
25
// Number of register sets provided by this context.
53
26
enum {
54
27
k_num_gpr_registers = gpr_last_riscv - gpr_first_riscv + 1 ,
55
28
k_num_fpr_registers = fpr_last_riscv - fpr_first_riscv + 1 ,
56
- k_num_register_sets = 2
29
+ k_num_register_sets_default = 1
57
30
};
58
31
59
32
// RISC-V64 general purpose registers.
@@ -73,38 +46,69 @@ static_assert(((sizeof g_gpr_regnums_riscv64 /
73
46
1) == k_num_gpr_registers,
74
47
"g_gpr_regnums_riscv64 has wrong number of register infos");
75
48
76
- // RISC-V64 floating point registers.
77
- static const uint32_t g_fpr_regnums_riscv64[] = {
78
- fpr_f0_riscv, fpr_f1_riscv, fpr_f2_riscv, fpr_f3_riscv,
79
- fpr_f4_riscv, fpr_f5_riscv, fpr_f6_riscv, fpr_f7_riscv,
80
- fpr_f8_riscv, fpr_f9_riscv, fpr_f10_riscv, fpr_f11_riscv,
81
- fpr_f12_riscv, fpr_f13_riscv, fpr_f14_riscv, fpr_f15_riscv,
82
- fpr_f16_riscv, fpr_f17_riscv, fpr_f18_riscv, fpr_f19_riscv,
83
- fpr_f20_riscv, fpr_f21_riscv, fpr_f22_riscv, fpr_f23_riscv,
84
- fpr_f24_riscv, fpr_f25_riscv, fpr_f26_riscv, fpr_f27_riscv,
85
- fpr_f28_riscv, fpr_f29_riscv, fpr_f30_riscv, fpr_f31_riscv,
86
- fpr_fcsr_riscv, LLDB_INVALID_REGNUM};
87
-
88
- static_assert (((sizeof g_fpr_regnums_riscv64 /
89
- sizeof g_fpr_regnums_riscv64[0 ]) -
90
- 1) == k_num_fpr_registers,
91
- "g_fpr_regnums_riscv64 has wrong number of register infos");
92
-
93
49
// Register sets for RISC-V64.
94
- static const lldb_private::RegisterSet g_reg_sets_riscv64[k_num_register_sets] =
95
- {{ " General Purpose Registers" , " gpr" , k_num_gpr_registers,
96
- g_gpr_regnums_riscv64},
97
- { " Floating Point Registers " , " fpr " , k_num_fpr_registers,
98
- g_fpr_regnums_riscv64} };
50
+ static const lldb_private::RegisterSet g_reg_set_gpr_riscv64 = {
51
+ " General Purpose Registers" , " gpr" , k_num_gpr_registers,
52
+ g_gpr_regnums_riscv64};
53
+ static const lldb_private::RegisterSet g_reg_set_fpr_riscv64 = {
54
+ " Floating Point Registers " , " fpr " , k_num_fpr_registers, nullptr };
99
55
100
56
RegisterInfoPOSIX_riscv64::RegisterInfoPOSIX_riscv64 (
101
- const lldb_private::ArchSpec &target_arch, lldb_private::Flags flags )
57
+ const lldb_private::ArchSpec &target_arch, lldb_private::Flags opt_regsets )
102
58
: lldb_private::RegisterInfoAndSetInterface(target_arch),
103
- m_register_info_p(GetRegisterInfoPtr(target_arch)),
104
- m_register_info_count(GetRegisterInfoCount(target_arch)) {}
59
+ m_opt_regsets(opt_regsets) {
60
+ switch (target_arch.GetMachine ()) {
61
+ case llvm::Triple::riscv64: {
62
+ // By-default considering RISC-V has only GPR.
63
+ // Other register sets could be enabled optionally by opt_regsets.
64
+ AddRegSetGP ();
65
+
66
+ if (m_opt_regsets.AnySet (eRegsetMaskFP))
67
+ AddRegSetFP ();
68
+
69
+ break ;
70
+ }
71
+ default :
72
+ assert (false && " Unhandled target architecture." );
73
+ }
74
+ }
75
+
76
+ void RegisterInfoPOSIX_riscv64::AddRegSetGP () {
77
+ m_register_infos.resize (k_num_gpr_registers);
78
+ memcpy (&m_register_infos[0 ], g_register_infos_riscv64_gpr,
79
+ sizeof (g_register_infos_riscv64_gpr));
80
+ m_register_sets.push_back (g_reg_set_gpr_riscv64);
81
+
82
+ m_per_regset_regnum_range[GPRegSet] =
83
+ std::make_pair (gpr_first_riscv, m_register_infos.size ());
84
+ }
85
+
86
+ void RegisterInfoPOSIX_riscv64::AddRegSetFP () {
87
+ const uint32_t register_info_count = m_register_infos.size ();
88
+ const uint32_t register_set_count = m_register_sets.size ();
89
+
90
+ // Filling m_register_infos.
91
+ // For FPR case we do not need to correct register offsets and kinds
92
+ // while for other further cases (like VPR), register offset/kind
93
+ // should be started counting from the last one in previously added
94
+ // regset. This is needed for the case e.g. when architecture has GPR + VPR
95
+ // sets only.
96
+ m_register_infos.resize (register_info_count + k_num_fpr_registers);
97
+ memcpy (&m_register_infos[register_info_count], g_register_infos_riscv64_fpr,
98
+ sizeof (g_register_infos_riscv64_fpr));
99
+
100
+ // Filling m_register_sets with enabled register set
101
+ for (uint32_t i = 0 ; i < k_num_fpr_registers; i++)
102
+ m_fp_regnum_collection.push_back (register_info_count + i);
103
+ m_register_sets.push_back (g_reg_set_fpr_riscv64);
104
+ m_register_sets.back ().registers = m_fp_regnum_collection.data ();
105
+
106
+ m_per_regset_regnum_range[register_set_count] =
107
+ std::make_pair (register_info_count, m_register_infos.size ());
108
+ }
105
109
106
110
uint32_t RegisterInfoPOSIX_riscv64::GetRegisterCount () const {
107
- return m_register_info_count ;
111
+ return m_register_infos. size () ;
108
112
}
109
113
110
114
size_t RegisterInfoPOSIX_riscv64::GetGPRSize () const {
@@ -117,26 +121,30 @@ size_t RegisterInfoPOSIX_riscv64::GetFPRSize() const {
117
121
118
122
const lldb_private::RegisterInfo *
119
123
RegisterInfoPOSIX_riscv64::GetRegisterInfo () const {
120
- return m_register_info_p ;
124
+ return m_register_infos. data () ;
121
125
}
122
126
123
127
size_t RegisterInfoPOSIX_riscv64::GetRegisterSetCount () const {
124
- return k_num_register_sets ;
128
+ return m_register_sets. size () ;
125
129
}
126
130
127
131
size_t RegisterInfoPOSIX_riscv64::GetRegisterSetFromRegisterIndex (
128
132
uint32_t reg_index) const {
129
- // coverity[unsigned_compare]
130
- if (reg_index >= gpr_first_riscv && reg_index <= gpr_last_riscv)
131
- return GPRegSet;
132
- if (reg_index >= fpr_first_riscv && reg_index <= fpr_last_riscv)
133
- return FPRegSet;
133
+ for ( const auto ®set_range : m_per_regset_regnum_range) {
134
+ if (reg_index >= regset_range. second . first &&
135
+ reg_index < regset_range. second . second )
136
+ return regset_range. first ;
137
+ }
134
138
return LLDB_INVALID_REGNUM;
135
139
}
136
140
141
+ bool RegisterInfoPOSIX_riscv64::IsFPReg (unsigned reg) const {
142
+ return llvm::is_contained (m_fp_regnum_collection, reg);
143
+ }
144
+
137
145
const lldb_private::RegisterSet *
138
146
RegisterInfoPOSIX_riscv64::GetRegisterSet (size_t set_index) const {
139
147
if (set_index < GetRegisterSetCount ())
140
- return &g_reg_sets_riscv64 [set_index];
148
+ return &m_register_sets [set_index];
141
149
return nullptr ;
142
150
}
0 commit comments