14#define GPR_OFFSET(idx) ((idx) * sizeof(uint32_t))
15#define FPR_OFFSET(idx) ((idx) * sizeof(uint32_t))
17#define DECLARE_REGISTER_INFOS_RISCV32_STRUCT
19#undef DECLARE_REGISTER_INFOS_RISCV32_STRUCT
27 const uint32_t *end = regs;
31 return std::vector<uint32_t>(regs, end);
34std::unique_ptr<RegisterContextCorePOSIX_riscv32>
37 llvm::ArrayRef<CoreNote> notes) {
38 return std::unique_ptr<RegisterContextCorePOSIX_riscv32>(
40 thread, std::make_unique<RegisterInfoPOSIXDynamic_riscv32>(arch),
46 std::unique_ptr<RegisterInfoPOSIXDynamic_riscv32> register_info,
47 const DataExtractor &gpregset, llvm::ArrayRef<CoreNote> notes)
51 std::size(g_register_infos_riscv32_gpr);
53 std::size(g_register_infos_riscv32_fpr);
55 std::size(g_register_infos_riscv32_csr);
57 const llvm::Triple triple = target_arch.
GetTriple();
60 std::vector<DynamicRegisterInfo::Register> registers;
61 uint32_t byte_offset = 0;
67 if (
m_gpregset.GetByteSize() >= g_register_infos_riscv32_gpr[0].byte_size) {
71 "GPR has the wrong number of registers!");
73 for (
const auto &gpr : g_register_infos_riscv32_gpr) {
75 byte_offset += gpr.byte_size;
82 if (
m_fpregset.GetByteSize() >= g_register_infos_riscv32_fpr[0].byte_size) {
86 "FPR has the wrong number of registers!");
88 for (
const auto &fpr : g_register_infos_riscv32_fpr) {
90 byte_offset += fpr.byte_size;
102 std::vector<uint32_t> csregset_regnums = {};
104 uint32_t csr_addr =
m_csregset.GetU32(&offset);
107 llvm::formatv(
"parsed the permissible number of CSRs {0:x} but "
108 "NT_CSREGMAP has more; skipping the remaining CSRs",
112 if (llvm::is_contained(csregset_regnums, csr_addr)) {
114 llvm::formatv(
"encountered a duplicate CSR while parsing "
115 "NT_CSREGMAP: {0}; skipping",
116 g_register_infos_riscv32_csr[csr_addr].name));
118 csregset_regnums.push_back(csr_addr);
119 const RegisterInfo &csr = g_register_infos_riscv32_csr[csr_addr];
142 return &
m_reg_infos_up->GetRegisterInfo()[
static_cast<uint32_t
>(reg)];
152 return m_reg_infos_up->GetRegisterSet(
static_cast<uint32_t
>(set));
158 const uint8_t *src =
nullptr;
212 offset -= (g_register_infos_riscv32_gpr[0].byte_size *
268 offset -= ((g_register_infos_riscv32_gpr[0].byte_size *
270 (g_register_infos_riscv32_fpr[0].byte_size *
282 return error.Success();
297 .equals_insensitive(llvm::StringRef(
"GPR")))
306 .equals_insensitive(llvm::StringRef(
"FPR")))
315 .equals_insensitive(llvm::StringRef(
"CSR")))
static llvm::raw_ostream & error(Stream &strm)
const size_t k_num_gpr_registers
const size_t k_num_csr_registers
const size_t k_num_fpr_registers
static std::vector< uint32_t > CopyRegisterListToVector(const uint32_t *regs)
const lldb_private::RegisterInfo * GetRegisterInfoAtIndex(size_t reg) override
void InvalidateAllRegisters() override
lldb_private::DataExtractor m_csregset
static std::unique_ptr< RegisterContextCorePOSIX_riscv32 > Create(lldb_private::Thread &thread, const lldb_private::ArchSpec &arch, const lldb_private::DataExtractor &gpregset, llvm::ArrayRef< lldb_private::CoreNote > notes)
const lldb_private::RegisterSet * GetRegisterSet(size_t set) override
size_t GetRegisterCount() override
bool WriteRegister(const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value) override
RegisterContextCorePOSIX_riscv32(lldb_private::Thread &thread, std::unique_ptr< RegisterInfoPOSIXDynamic_riscv32 > register_info, const lldb_private::DataExtractor &gpregset, llvm::ArrayRef< lldb_private::CoreNote > notes)
size_t GetRegisterSetCount() override
bool ReadRegister(const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value) override
std::unique_ptr< RegisterInfoPOSIXDynamic_riscv32 > m_reg_infos_up
lldb_private::DataExtractor m_fpregset
lldb_private::DataExtractor m_gpregset
~RegisterContextCorePOSIX_riscv32() override
lldb_private::DynamicRegisterInfo::Register BuildDynamicRegister(const lldb_private::RegisterInfo ®_info, const lldb_private::ConstString &set_name, uint32_t byte_offset)
An architecture specification class.
llvm::Triple & GetTriple()
Architecture triple accessor.
lldb::ByteOrder GetByteOrder() const
Returns the byte order for the architecture specification.
A uniqued constant string class.
static void ReportWarning(std::string message, std::optional< lldb::user_id_t > debugger_id=std::nullopt, std::once_flag *once=nullptr)
Report warning events.
RegisterContext(Thread &thread, uint32_t concrete_frame_idx)
uint32_t SetFromMemoryData(const RegisterInfo ®_info, const void *src, uint32_t src_len, lldb::ByteOrder src_byte_order, Status &error)
#define LLDB_INVALID_REGNUM
A class that represents a running process on the host machine.
constexpr RegsetDesc RISCV32_CSREGMAP_Desc[]
DataExtractor getRegset(llvm::ArrayRef< CoreNote > Notes, const llvm::Triple &Triple, llvm::ArrayRef< RegsetDesc > RegsetDescs)
constexpr RegsetDesc FPR_Desc[]
ByteOrder
Byte ordering definitions.
@ eRegisterKindGeneric
insn ptr reg, stack ptr reg, etc not specific to any particular target
@ eRegisterKindLLDB
lldb's internal register numbers
@ eRegisterKindDWARF
the register numbers seen DWARF
@ eRegisterKindEHFrame
the register numbers seen in eh_frame
@ eRegisterKindProcessPlugin
num used by the process plugin - e.g.
Every register is described in detail including its name, alternate name (optional),...
lldb::Encoding encoding
Encoding of the register bits.
const char * alt_name
Alternate name of this register, can be NULL.
uint32_t * value_regs
List of registers (terminated with LLDB_INVALID_REGNUM).
uint32_t byte_offset
The byte offset in the register context data where this register's value is found.
uint32_t byte_size
Size in bytes of the register.
uint32_t kinds[lldb::kNumRegisterKinds]
Holds all of the various register numbers for all register kinds.
const RegisterFlags * flags_type
If not nullptr, a type defined by XML descriptions.
const char * name
Name of this register, can't be NULL.
lldb::Format format
Default display format.
uint32_t * invalidate_regs
List of registers (terminated with LLDB_INVALID_REGNUM).
Registers are grouped into register sets.
const char * name
Name of this register set.