1818#define GPR_OFFSET (idx ) ((idx)*8 + 0 )
1919#define FPR_OFFSET (idx ) ((idx)*8 + sizeof (RegisterInfoPOSIX_riscv64::GPR))
2020
21- #define REG_CONTEXT_SIZE \
22- (sizeof (RegisterInfoPOSIX_riscv64::GPR) + \
23- sizeof (RegisterInfoPOSIX_riscv64::FPR))
24-
2521#define DECLARE_REGISTER_INFOS_RISCV64_STRUCT
2622#include " RegisterInfos_riscv64.h"
2723#undef DECLARE_REGISTER_INFOS_RISCV64_STRUCT
2824
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-
5225// Number of register sets provided by this context.
5326enum {
5427 k_num_gpr_registers = gpr_last_riscv - gpr_first_riscv + 1 ,
5528 k_num_fpr_registers = fpr_last_riscv - fpr_first_riscv + 1 ,
56- k_num_register_sets = 2
29+ k_num_register_sets_default = 1
5730};
5831
5932// RISC-V64 general purpose registers.
@@ -73,38 +46,69 @@ static_assert(((sizeof g_gpr_regnums_riscv64 /
7346 1 ) == k_num_gpr_registers,
7447 " g_gpr_regnums_riscv64 has wrong number of register infos" );
7548
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-
9349// 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 };
9955
10056RegisterInfoPOSIX_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 )
10258 : 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+ }
105109
106110uint32_t RegisterInfoPOSIX_riscv64::GetRegisterCount () const {
107- return m_register_info_count ;
111+ return m_register_infos. size () ;
108112}
109113
110114size_t RegisterInfoPOSIX_riscv64::GetGPRSize () const {
@@ -117,26 +121,30 @@ size_t RegisterInfoPOSIX_riscv64::GetFPRSize() const {
117121
118122const lldb_private::RegisterInfo *
119123RegisterInfoPOSIX_riscv64::GetRegisterInfo () const {
120- return m_register_info_p ;
124+ return m_register_infos. data () ;
121125}
122126
123127size_t RegisterInfoPOSIX_riscv64::GetRegisterSetCount () const {
124- return k_num_register_sets ;
128+ return m_register_sets. size () ;
125129}
126130
127131size_t RegisterInfoPOSIX_riscv64::GetRegisterSetFromRegisterIndex (
128132 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+ }
134138 return LLDB_INVALID_REGNUM;
135139}
136140
141+ bool RegisterInfoPOSIX_riscv64::IsFPReg (unsigned reg) const {
142+ return llvm::is_contained (m_fp_regnum_collection, reg);
143+ }
144+
137145const lldb_private::RegisterSet *
138146RegisterInfoPOSIX_riscv64::GetRegisterSet (size_t set_index) const {
139147 if (set_index < GetRegisterSetCount ())
140- return &g_reg_sets_riscv64 [set_index];
148+ return &m_register_sets [set_index];
141149 return nullptr ;
142150}
0 commit comments