[lldb][RISCV] Support optionally disabled FPR for riscv64 (#104547) · llvm/llvm-project@660e34f (original) (raw)
`@@ -18,42 +18,15 @@
`
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(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
``
`-
- == 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
`}
`