[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

``

`-

  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 &regset_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

`}

`