Skip to content

Commit

Permalink
[LLDB][RISCV] Add RVV register infos
Browse files Browse the repository at this point in the history
RVV stands for "RISC-V V Extension", which adds 32 vector registers, and seven unprivileged CSRs (vstart, vxsat, vxrm, vcsr, vtype, vl, vlenb) to a base scalar RISC-V ISA.

The base vector extension is intended to provide general support for data-parallel execution within the 32-bit instruction encoding space, with later vector extensions supporting richer functionality for certain domains.

This patch adds the definitions of RVV registers in `RegisterInfos_riscv64.h`, whose purpose is to provide support (such as reading, writing, and calculating the offsets) for future register-related functions.

Reviewed By: kito-cheng

Differential Revision: https://reviews.llvm.org/D143374
  • Loading branch information
SEmmmer committed Apr 19, 2023
1 parent 8e0ee5a commit efd64c2
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 0 deletions.
Expand Up @@ -35,6 +35,11 @@ class RegisterInfoPOSIX_riscv64
uint32_t fcsr;
};

struct VPR {
// The size should be VLEN*32 in bits, but we don't have VLEN here.
void *vpr;
};

RegisterInfoPOSIX_riscv64(const lldb_private::ArchSpec &target_arch,
lldb_private::Flags flags);

Expand Down
46 changes: 46 additions & 0 deletions lldb/source/Plugins/Process/Utility/RegisterInfos_riscv64.h
Expand Up @@ -42,6 +42,9 @@ using namespace riscv_dwarf;
// FPR register kinds array for vector registers
#define FPR64_KIND(reg, generic_kind) KIND_HELPER(reg, generic_kind)

// VPR register kinds array for vector registers
#define VPR_KIND(reg, generic_kind) KIND_HELPER(reg, generic_kind)

// Defines a 64-bit general purpose register
#define DEFINE_GPR64(reg, generic_kind) DEFINE_GPR64_ALT(reg, reg, generic_kind)

Expand All @@ -64,6 +67,16 @@ using namespace riscv_dwarf;
FPR64_KIND(fpr_##reg, generic_kind), nullptr, nullptr, nullptr, \
}

#define DEFINE_VPR(reg, generic_kind) DEFINE_VPR_ALT(reg, reg, generic_kind)

// Defines a scalable vector register, with default size 128 bits
// The byte offset 0 is a placeholder, which should be corrected at runtime.
#define DEFINE_VPR_ALT(reg, alt, generic_kind) \
{ \
#reg, #alt, 16, 0, lldb::eEncodingVector, lldb::eFormatVectorOfUInt8, \
VPR_KIND(vpr_##reg, generic_kind), nullptr, nullptr \
}

// clang-format on

static lldb_private::RegisterInfo g_register_infos_riscv64_le[] = {
Expand Down Expand Up @@ -135,6 +148,39 @@ static lldb_private::RegisterInfo g_register_infos_riscv64_le[] = {
DEFINE_FPR64_ALT(ft10, f30, LLDB_INVALID_REGNUM),
DEFINE_FPR64_ALT(ft11, f31, LLDB_INVALID_REGNUM),
DEFINE_FPR_ALT(fcsr, nullptr, 4, LLDB_INVALID_REGNUM),

DEFINE_VPR(v0, LLDB_INVALID_REGNUM),
DEFINE_VPR(v1, LLDB_INVALID_REGNUM),
DEFINE_VPR(v2, LLDB_INVALID_REGNUM),
DEFINE_VPR(v3, LLDB_INVALID_REGNUM),
DEFINE_VPR(v4, LLDB_INVALID_REGNUM),
DEFINE_VPR(v5, LLDB_INVALID_REGNUM),
DEFINE_VPR(v6, LLDB_INVALID_REGNUM),
DEFINE_VPR(v7, LLDB_INVALID_REGNUM),
DEFINE_VPR(v8, LLDB_INVALID_REGNUM),
DEFINE_VPR(v9, LLDB_INVALID_REGNUM),
DEFINE_VPR(v10, LLDB_INVALID_REGNUM),
DEFINE_VPR(v11, LLDB_INVALID_REGNUM),
DEFINE_VPR(v12, LLDB_INVALID_REGNUM),
DEFINE_VPR(v13, LLDB_INVALID_REGNUM),
DEFINE_VPR(v14, LLDB_INVALID_REGNUM),
DEFINE_VPR(v15, LLDB_INVALID_REGNUM),
DEFINE_VPR(v16, LLDB_INVALID_REGNUM),
DEFINE_VPR(v17, LLDB_INVALID_REGNUM),
DEFINE_VPR(v18, LLDB_INVALID_REGNUM),
DEFINE_VPR(v19, LLDB_INVALID_REGNUM),
DEFINE_VPR(v20, LLDB_INVALID_REGNUM),
DEFINE_VPR(v21, LLDB_INVALID_REGNUM),
DEFINE_VPR(v22, LLDB_INVALID_REGNUM),
DEFINE_VPR(v23, LLDB_INVALID_REGNUM),
DEFINE_VPR(v24, LLDB_INVALID_REGNUM),
DEFINE_VPR(v25, LLDB_INVALID_REGNUM),
DEFINE_VPR(v26, LLDB_INVALID_REGNUM),
DEFINE_VPR(v27, LLDB_INVALID_REGNUM),
DEFINE_VPR(v28, LLDB_INVALID_REGNUM),
DEFINE_VPR(v29, LLDB_INVALID_REGNUM),
DEFINE_VPR(v30, LLDB_INVALID_REGNUM),
DEFINE_VPR(v31, LLDB_INVALID_REGNUM),
};

#endif // DECLARE_REGISTER_INFOS_RISCV64_STRUCT

0 comments on commit efd64c2

Please sign in to comment.