From 660e34fd38c3fb39fba1871bbf5b2eb3a48bf277 Mon Sep 17 00:00:00 2001 From: Alexey Merzlyakov <60094858+AlexeyMerzlyakov@users.noreply.github.com> Date: Wed, 4 Sep 2024 17:31:59 +0300 Subject: [PATCH] [lldb][RISCV] Support optionally disabled FPR for riscv64 (#104547) The PR adds the support optionally enabled/disabled FP-registers to LLDB `RegisterInfoPOSIX_riscv64`. This situation might take place for RISC-V builds having no FP-registers, like RV64IMAC or RV64IMACV. To aim this, patch adds `opt_regsets` flags mechanism. It re-works RegisterInfo class to work with flexibly allocated (depending on `opt_regsets` flag) `m_register_sets` and `m_register_infos` vectors instead of statically defined structures. The registration of regsets is being arranged by `m_per_regset_regnum_range` map. The patch flows are spread to `NativeRegisterContextLinux_riscv64` and `RegisterContextCorePOSIX_riscv64` classes, that were tested on: - x86_64 host working with coredumps - RV64GC and RV64IMAC targets working with coredumps and natively in run-time with binaries `EmulateInstructionRISCV` is out of scope of this patch, and its behavior did not change, using maximum set of registers. According testcase built for RV64IMAC (no-FPR) was added to `TestLinuxCore.py`. --- .../RISCV/EmulateInstructionRISCV.cpp | 8 +- .../NativeRegisterContextLinux_riscv64.cpp | 57 +++++--- .../NativeRegisterContextLinux_riscv64.h | 2 + .../Utility/RegisterContextPOSIX_riscv64.cpp | 3 +- .../Utility/RegisterInfoPOSIX_riscv64.cpp | 132 +++++++++-------- .../Utility/RegisterInfoPOSIX_riscv64.h | 38 +++-- .../Process/Utility/RegisterInfos_riscv64.h | 54 +++---- .../RegisterContextPOSIXCore_riscv64.cpp | 25 ++-- .../RegisterContextPOSIXCore_riscv64.h | 3 - .../postmortem/elf-core/TestLinuxCore.py | 133 ++++++++++++++---- ...iscv64.core => linux-riscv64.gpr_fpr.core} | Bin 20480 -> 20480 bytes .../elf-core/linux-riscv64.gpr_fpr.out | Bin 0 -> 3480 bytes .../elf-core/linux-riscv64.gpr_only.core | Bin 0 -> 28672 bytes .../elf-core/linux-riscv64.gpr_only.out | Bin 0 -> 3520 bytes .../postmortem/elf-core/linux-riscv64.out | Bin 3328 -> 0 bytes .../postmortem/elf-core/main_fpr.c | 14 ++ 16 files changed, 300 insertions(+), 169 deletions(-) rename lldb/test/API/functionalities/postmortem/elf-core/{linux-riscv64.core => linux-riscv64.gpr_fpr.core} (76%) create mode 100755 lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.gpr_fpr.out create mode 100644 lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.gpr_only.core create mode 100755 lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.gpr_only.out delete mode 100755 lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.out create mode 100644 lldb/test/API/functionalities/postmortem/elf-core/main_fpr.c diff --git a/lldb/source/Plugins/Instruction/RISCV/EmulateInstructionRISCV.cpp b/lldb/source/Plugins/Instruction/RISCV/EmulateInstructionRISCV.cpp index e8014b1eeb37..badc7ba36f01 100644 --- a/lldb/source/Plugins/Instruction/RISCV/EmulateInstructionRISCV.cpp +++ b/lldb/source/Plugins/Instruction/RISCV/EmulateInstructionRISCV.cpp @@ -1748,10 +1748,10 @@ EmulateInstructionRISCV::GetRegisterInfo(RegisterKind reg_kind, } } - const RegisterInfo *array = - RegisterInfoPOSIX_riscv64::GetRegisterInfoPtr(m_arch); - const uint32_t length = - RegisterInfoPOSIX_riscv64::GetRegisterInfoCount(m_arch); + RegisterInfoPOSIX_riscv64 reg_info(m_arch, + RegisterInfoPOSIX_riscv64::eRegsetMaskAll); + const RegisterInfo *array = reg_info.GetRegisterInfo(); + const uint32_t length = reg_info.GetRegisterCount(); if (reg_index >= length || reg_kind != eRegisterKindLLDB) return {}; diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_riscv64.cpp b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_riscv64.cpp index bfa1a154b0f2..45b6c8ff9905 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_riscv64.cpp +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_riscv64.cpp @@ -23,12 +23,11 @@ // System includes - They have to be included after framework includes because // they define some macros which collide with variable names in other modules +#include #include // NT_PRSTATUS and NT_FPREGSET definition #include -#define REG_CONTEXT_SIZE (GetGPRSize() + GetFPRSize()) - using namespace lldb; using namespace lldb_private; using namespace lldb_private::process_linux; @@ -38,7 +37,21 @@ NativeRegisterContextLinux::CreateHostNativeRegisterContextLinux( const ArchSpec &target_arch, NativeThreadLinux &native_thread) { switch (target_arch.GetMachine()) { case llvm::Triple::riscv64: { - Flags opt_regsets; + Flags opt_regsets(RegisterInfoPOSIX_riscv64::eRegsetMaskDefault); + + RegisterInfoPOSIX_riscv64::FPR fpr; + struct iovec ioVec; + ioVec.iov_base = &fpr; + ioVec.iov_len = sizeof(fpr); + unsigned int regset = NT_FPREGSET; + + if (NativeProcessLinux::PtraceWrapper(PTRACE_GETREGSET, + native_thread.GetID(), ®set, + &ioVec, sizeof(fpr)) + .Success()) { + opt_regsets.Set(RegisterInfoPOSIX_riscv64::eRegsetMaskFP); + } + auto register_info_up = std::make_unique(target_arch, opt_regsets); return std::make_unique( @@ -194,20 +207,23 @@ Status NativeRegisterContextLinux_riscv64::ReadAllRegisterValues( lldb::WritableDataBufferSP &data_sp) { Status error; - data_sp.reset(new DataBufferHeap(REG_CONTEXT_SIZE, 0)); + data_sp.reset(new DataBufferHeap(GetRegContextSize(), 0)); error = ReadGPR(); if (error.Fail()) return error; - error = ReadFPR(); - if (error.Fail()) - return error; + if (GetRegisterInfo().IsFPPresent()) { + error = ReadFPR(); + if (error.Fail()) + return error; + } uint8_t *dst = const_cast(data_sp->GetBytes()); ::memcpy(dst, GetGPRBuffer(), GetGPRSize()); dst += GetGPRSize(); - ::memcpy(dst, GetFPRBuffer(), GetFPRSize()); + if (GetRegisterInfo().IsFPPresent()) + ::memcpy(dst, GetFPRBuffer(), GetFPRSize()); return error; } @@ -223,11 +239,11 @@ Status NativeRegisterContextLinux_riscv64::WriteAllRegisterValues( return error; } - if (data_sp->GetByteSize() != REG_CONTEXT_SIZE) { + if (data_sp->GetByteSize() != GetRegContextSize()) { error = Status::FromErrorStringWithFormat( "NativeRegisterContextLinux_riscv64::%s data_sp contained mismatched " "data size, expected %" PRIu64 ", actual %" PRIu64, - __FUNCTION__, REG_CONTEXT_SIZE, data_sp->GetByteSize()); + __FUNCTION__, GetRegContextSize(), data_sp->GetByteSize()); return error; } @@ -247,23 +263,32 @@ Status NativeRegisterContextLinux_riscv64::WriteAllRegisterValues( return error; src += GetRegisterInfoInterface().GetGPRSize(); - ::memcpy(GetFPRBuffer(), src, GetFPRSize()); - error = WriteFPR(); - if (error.Fail()) - return error; + if (GetRegisterInfo().IsFPPresent()) { + ::memcpy(GetFPRBuffer(), src, GetFPRSize()); + + error = WriteFPR(); + if (error.Fail()) + return error; + } return error; } +size_t NativeRegisterContextLinux_riscv64::GetRegContextSize() { + size_t size = GetGPRSize(); + if (GetRegisterInfo().IsFPPresent()) + size += GetFPRSize(); + return size; +} + bool NativeRegisterContextLinux_riscv64::IsGPR(unsigned reg) const { return GetRegisterInfo().GetRegisterSetFromRegisterIndex(reg) == RegisterInfoPOSIX_riscv64::GPRegSet; } bool NativeRegisterContextLinux_riscv64::IsFPR(unsigned reg) const { - return GetRegisterInfo().GetRegisterSetFromRegisterIndex(reg) == - RegisterInfoPOSIX_riscv64::FPRegSet; + return GetRegisterInfo().IsFPReg(reg); } Status NativeRegisterContextLinux_riscv64::ReadGPR() { diff --git a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_riscv64.h b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_riscv64.h index 41b4e2573add..d5cc50131cdc 100644 --- a/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_riscv64.h +++ b/lldb/source/Plugins/Process/Linux/NativeRegisterContextLinux_riscv64.h @@ -75,6 +75,8 @@ private: RegisterInfoPOSIX_riscv64::FPR m_fpr; + size_t GetRegContextSize(); + bool IsGPR(unsigned reg) const; bool IsFPR(unsigned reg) const; diff --git a/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_riscv64.cpp b/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_riscv64.cpp index 035ce00e1162..bbcfb9eae100 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_riscv64.cpp +++ b/lldb/source/Plugins/Process/Utility/RegisterContextPOSIX_riscv64.cpp @@ -77,6 +77,5 @@ bool RegisterContextPOSIX_riscv64::IsGPR(unsigned int reg) { } bool RegisterContextPOSIX_riscv64::IsFPR(unsigned int reg) { - return m_register_info_up->GetRegisterSetFromRegisterIndex(reg) == - RegisterInfoPOSIX_riscv64::FPRegSet; + return m_register_info_up->IsFPReg(reg); } diff --git a/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_riscv64.cpp b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_riscv64.cpp index 3819401c543b..4a3737795848 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_riscv64.cpp +++ b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_riscv64.cpp @@ -18,42 +18,15 @@ #define GPR_OFFSET(idx) ((idx)*8 + 0) #define FPR_OFFSET(idx) ((idx)*8 + sizeof(RegisterInfoPOSIX_riscv64::GPR)) -#define REG_CONTEXT_SIZE \ - (sizeof(RegisterInfoPOSIX_riscv64::GPR) + \ - sizeof(RegisterInfoPOSIX_riscv64::FPR)) - #define DECLARE_REGISTER_INFOS_RISCV64_STRUCT #include "RegisterInfos_riscv64.h" #undef DECLARE_REGISTER_INFOS_RISCV64_STRUCT -const lldb_private::RegisterInfo *RegisterInfoPOSIX_riscv64::GetRegisterInfoPtr( - const lldb_private::ArchSpec &target_arch) { - switch (target_arch.GetMachine()) { - case llvm::Triple::riscv64: - return g_register_infos_riscv64_le; - default: - assert(false && "Unhandled target architecture."); - return nullptr; - } -} - -uint32_t RegisterInfoPOSIX_riscv64::GetRegisterInfoCount( - const lldb_private::ArchSpec &target_arch) { - switch (target_arch.GetMachine()) { - case llvm::Triple::riscv64: - return static_cast(sizeof(g_register_infos_riscv64_le) / - sizeof(g_register_infos_riscv64_le[0])); - default: - assert(false && "Unhandled target architecture."); - return 0; - } -} - // Number of register sets provided by this context. enum { k_num_gpr_registers = gpr_last_riscv - gpr_first_riscv + 1, k_num_fpr_registers = fpr_last_riscv - fpr_first_riscv + 1, - k_num_register_sets = 2 + k_num_register_sets_default = 1 }; // RISC-V64 general purpose registers. @@ -73,38 +46,69 @@ static_assert(((sizeof g_gpr_regnums_riscv64 / 1) == k_num_gpr_registers, "g_gpr_regnums_riscv64 has wrong number of register infos"); -// RISC-V64 floating point registers. -static const uint32_t g_fpr_regnums_riscv64[] = { - fpr_f0_riscv, fpr_f1_riscv, fpr_f2_riscv, fpr_f3_riscv, - fpr_f4_riscv, fpr_f5_riscv, fpr_f6_riscv, fpr_f7_riscv, - fpr_f8_riscv, fpr_f9_riscv, fpr_f10_riscv, fpr_f11_riscv, - fpr_f12_riscv, fpr_f13_riscv, fpr_f14_riscv, fpr_f15_riscv, - fpr_f16_riscv, fpr_f17_riscv, fpr_f18_riscv, fpr_f19_riscv, - fpr_f20_riscv, fpr_f21_riscv, fpr_f22_riscv, fpr_f23_riscv, - fpr_f24_riscv, fpr_f25_riscv, fpr_f26_riscv, fpr_f27_riscv, - fpr_f28_riscv, fpr_f29_riscv, fpr_f30_riscv, fpr_f31_riscv, - fpr_fcsr_riscv, LLDB_INVALID_REGNUM}; - -static_assert(((sizeof g_fpr_regnums_riscv64 / - sizeof g_fpr_regnums_riscv64[0]) - - 1) == k_num_fpr_registers, - "g_fpr_regnums_riscv64 has wrong number of register infos"); - // Register sets for RISC-V64. -static const lldb_private::RegisterSet g_reg_sets_riscv64[k_num_register_sets] = - {{"General Purpose Registers", "gpr", k_num_gpr_registers, - g_gpr_regnums_riscv64}, - {"Floating Point Registers", "fpr", k_num_fpr_registers, - g_fpr_regnums_riscv64}}; +static const lldb_private::RegisterSet g_reg_set_gpr_riscv64 = { + "General Purpose Registers", "gpr", k_num_gpr_registers, + g_gpr_regnums_riscv64}; +static const lldb_private::RegisterSet g_reg_set_fpr_riscv64 = { + "Floating Point Registers", "fpr", k_num_fpr_registers, nullptr}; RegisterInfoPOSIX_riscv64::RegisterInfoPOSIX_riscv64( - const lldb_private::ArchSpec &target_arch, lldb_private::Flags flags) + const lldb_private::ArchSpec &target_arch, lldb_private::Flags opt_regsets) : lldb_private::RegisterInfoAndSetInterface(target_arch), - m_register_info_p(GetRegisterInfoPtr(target_arch)), - m_register_info_count(GetRegisterInfoCount(target_arch)) {} + m_opt_regsets(opt_regsets) { + switch (target_arch.GetMachine()) { + case llvm::Triple::riscv64: { + // By-default considering RISC-V has only GPR. + // Other register sets could be enabled optionally by opt_regsets. + AddRegSetGP(); + + if (m_opt_regsets.AnySet(eRegsetMaskFP)) + AddRegSetFP(); + + break; + } + default: + assert(false && "Unhandled target architecture."); + } +} + +void RegisterInfoPOSIX_riscv64::AddRegSetGP() { + m_register_infos.resize(k_num_gpr_registers); + memcpy(&m_register_infos[0], g_register_infos_riscv64_gpr, + sizeof(g_register_infos_riscv64_gpr)); + m_register_sets.push_back(g_reg_set_gpr_riscv64); + + m_per_regset_regnum_range[GPRegSet] = + std::make_pair(gpr_first_riscv, m_register_infos.size()); +} + +void RegisterInfoPOSIX_riscv64::AddRegSetFP() { + const uint32_t register_info_count = m_register_infos.size(); + const uint32_t register_set_count = m_register_sets.size(); + + // Filling m_register_infos. + // For FPR case we do not need to correct register offsets and kinds + // while for other further cases (like VPR), register offset/kind + // should be started counting from the last one in previously added + // regset. This is needed for the case e.g. when architecture has GPR + VPR + // sets only. + m_register_infos.resize(register_info_count + k_num_fpr_registers); + memcpy(&m_register_infos[register_info_count], g_register_infos_riscv64_fpr, + sizeof(g_register_infos_riscv64_fpr)); + + // Filling m_register_sets with enabled register set + for (uint32_t i = 0; i < k_num_fpr_registers; i++) + m_fp_regnum_collection.push_back(register_info_count + i); + m_register_sets.push_back(g_reg_set_fpr_riscv64); + m_register_sets.back().registers = m_fp_regnum_collection.data(); + + m_per_regset_regnum_range[register_set_count] = + std::make_pair(register_info_count, m_register_infos.size()); +} uint32_t RegisterInfoPOSIX_riscv64::GetRegisterCount() const { - return m_register_info_count; + return m_register_infos.size(); } size_t RegisterInfoPOSIX_riscv64::GetGPRSize() const { @@ -117,26 +121,30 @@ size_t RegisterInfoPOSIX_riscv64::GetFPRSize() const { const lldb_private::RegisterInfo * RegisterInfoPOSIX_riscv64::GetRegisterInfo() const { - return m_register_info_p; + return m_register_infos.data(); } size_t RegisterInfoPOSIX_riscv64::GetRegisterSetCount() const { - return k_num_register_sets; + return m_register_sets.size(); } size_t RegisterInfoPOSIX_riscv64::GetRegisterSetFromRegisterIndex( uint32_t reg_index) const { - // coverity[unsigned_compare] - if (reg_index >= gpr_first_riscv && reg_index <= gpr_last_riscv) - return GPRegSet; - if (reg_index >= fpr_first_riscv && reg_index <= fpr_last_riscv) - return FPRegSet; + for (const auto ®set_range : m_per_regset_regnum_range) { + if (reg_index >= regset_range.second.first && + reg_index < regset_range.second.second) + return regset_range.first; + } return LLDB_INVALID_REGNUM; } +bool RegisterInfoPOSIX_riscv64::IsFPReg(unsigned reg) const { + return llvm::is_contained(m_fp_regnum_collection, reg); +} + const lldb_private::RegisterSet * RegisterInfoPOSIX_riscv64::GetRegisterSet(size_t set_index) const { if (set_index < GetRegisterSetCount()) - return &g_reg_sets_riscv64[set_index]; + return &m_register_sets[set_index]; return nullptr; } diff --git a/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_riscv64.h b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_riscv64.h index 4bf4bede0132..f8e22c7df3c8 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_riscv64.h +++ b/lldb/source/Plugins/Process/Utility/RegisterInfoPOSIX_riscv64.h @@ -11,19 +11,21 @@ #include "RegisterInfoAndSetInterface.h" #include "lldb/Target/RegisterContext.h" +#include "lldb/Utility/Flags.h" #include "lldb/lldb-private.h" #include class RegisterInfoPOSIX_riscv64 : public lldb_private::RegisterInfoAndSetInterface { public: - static const lldb_private::RegisterInfo * - GetRegisterInfoPtr(const lldb_private::ArchSpec &target_arch); - static uint32_t - GetRegisterInfoCount(const lldb_private::ArchSpec &target_arch); + enum { GPRegSet = 0 }; -public: - enum { GPRegSet = 0, FPRegSet }; + // RISC-V64 register set mask value + enum { + eRegsetMaskDefault = 0, + eRegsetMaskFP = 1, + eRegsetMaskAll = -1, + }; struct GPR { // note: gpr[0] is pc, not x0 @@ -41,7 +43,11 @@ public: }; RegisterInfoPOSIX_riscv64(const lldb_private::ArchSpec &target_arch, - lldb_private::Flags flags); + lldb_private::Flags opt_regsets); + + void AddRegSetGP(); + + void AddRegSetFP(); size_t GetGPRSize() const override; @@ -58,9 +64,23 @@ public: size_t GetRegisterSetFromRegisterIndex(uint32_t reg_index) const override; + bool IsFPPresent() const { return m_opt_regsets.AnySet(eRegsetMaskFP); } + + bool IsFPReg(unsigned reg) const; + private: - const lldb_private::RegisterInfo *m_register_info_p; - uint32_t m_register_info_count; + std::vector m_register_infos; + + std::vector m_register_sets; + + // Contains pair of [start, end] register numbers of a register set with start + // and end included. + std::map> m_per_regset_regnum_range; + + // Register collections to be stored as reference for m_register_sets items + std::vector m_fp_regnum_collection; + + lldb_private::Flags m_opt_regsets; }; #endif diff --git a/lldb/source/Plugins/Process/Utility/RegisterInfos_riscv64.h b/lldb/source/Plugins/Process/Utility/RegisterInfos_riscv64.h index 720d900c7b97..628ed3770bdc 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterInfos_riscv64.h +++ b/lldb/source/Plugins/Process/Utility/RegisterInfos_riscv64.h @@ -79,7 +79,7 @@ using namespace riscv_dwarf; // clang-format on -static lldb_private::RegisterInfo g_register_infos_riscv64_le[] = { +static lldb_private::RegisterInfo g_register_infos_riscv64_gpr[] = { // DEFINE_GPR64(name, GENERIC KIND) DEFINE_GPR64(pc, LLDB_REGNUM_GENERIC_PC), DEFINE_GPR64_ALT(ra, x1, LLDB_REGNUM_GENERIC_RA), @@ -114,7 +114,9 @@ static lldb_private::RegisterInfo g_register_infos_riscv64_le[] = { DEFINE_GPR64_ALT(t5, x30, LLDB_INVALID_REGNUM), DEFINE_GPR64_ALT(t6, x31, LLDB_INVALID_REGNUM), DEFINE_GPR64_ALT(zero, x0, LLDB_INVALID_REGNUM), +}; +static lldb_private::RegisterInfo g_register_infos_riscv64_fpr[] = { DEFINE_FPR64_ALT(ft0, f0, LLDB_INVALID_REGNUM), DEFINE_FPR64_ALT(ft1, f1, LLDB_INVALID_REGNUM), DEFINE_FPR64_ALT(ft2, f2, LLDB_INVALID_REGNUM), @@ -148,39 +150,25 @@ 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), +static lldb_private::RegisterInfo g_register_infos_riscv64_vpr[] = { + 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 diff --git a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp index 5ba18cdb9889..3dca4b160990 100644 --- a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp +++ b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.cpp @@ -16,9 +16,17 @@ std::unique_ptr RegisterContextCorePOSIX_riscv64::Create(Thread &thread, const ArchSpec &arch, const DataExtractor &gpregset, llvm::ArrayRef notes) { + Flags opt_regsets = RegisterInfoPOSIX_riscv64::eRegsetMaskDefault; + + DataExtractor fpregset = getRegset(notes, arch.GetTriple(), FPR_Desc); + if (fpregset.GetByteSize() >= sizeof(uint64_t)) { + opt_regsets.Set(RegisterInfoPOSIX_riscv64::eRegsetMaskFP); + } + return std::unique_ptr( new RegisterContextCorePOSIX_riscv64( - thread, std::make_unique(arch, Flags()), + thread, + std::make_unique(arch, opt_regsets), gpregset, notes)); } @@ -27,17 +35,14 @@ RegisterContextCorePOSIX_riscv64::RegisterContextCorePOSIX_riscv64( const DataExtractor &gpregset, llvm::ArrayRef notes) : RegisterContextPOSIX_riscv64(thread, std::move(register_info)) { - m_gpr_buffer = std::make_shared(gpregset.GetDataStart(), - gpregset.GetByteSize()); - m_gpr.SetData(m_gpr_buffer); + m_gpr.SetData(std::make_shared(gpregset.GetDataStart(), + gpregset.GetByteSize())); m_gpr.SetByteOrder(gpregset.GetByteOrder()); - ArchSpec arch = m_register_info_up->GetTargetArchitecture(); - DataExtractor fpregset = getRegset(notes, arch.GetTriple(), FPR_Desc); - m_fpr_buffer = std::make_shared(fpregset.GetDataStart(), - fpregset.GetByteSize()); - m_fpr.SetData(m_fpr_buffer); - m_fpr.SetByteOrder(fpregset.GetByteOrder()); + if (m_register_info_up->IsFPPresent()) { + ArchSpec arch = m_register_info_up->GetTargetArchitecture(); + m_fpr = getRegset(notes, arch.GetTriple(), FPR_Desc); + } } RegisterContextCorePOSIX_riscv64::~RegisterContextCorePOSIX_riscv64() = default; diff --git a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.h b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.h index 3cf9531df2c1..a9a598446357 100644 --- a/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.h +++ b/lldb/source/Plugins/Process/elf-core/RegisterContextPOSIXCore_riscv64.h @@ -50,9 +50,6 @@ protected: bool WriteFPR() override; private: - lldb::DataBufferSP m_gpr_buffer; - lldb::DataBufferSP m_fpr_buffer; - lldb_private::DataExtractor m_gpr; lldb_private::DataExtractor m_fpr; }; diff --git a/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py b/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py index 0b9d17bc9f45..7e8531c88bf3 100644 --- a/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py +++ b/lldb/test/API/functionalities/postmortem/elf-core/TestLinuxCore.py @@ -21,7 +21,8 @@ class LinuxCoreTestCase(TestBase): _x86_64_pid = 32259 _s390x_pid = 1045 _ppc64le_pid = 28147 - _riscv64_pid = 89328 + _riscv64_gpr_fpr_pid = 1089 + _riscv64_gpr_only_pid = 97 _aarch64_regions = 4 _i386_regions = 4 @@ -61,9 +62,25 @@ class LinuxCoreTestCase(TestBase): self.do_test("linux-s390x", self._s390x_pid, self._s390x_regions, "a.out") @skipIfLLVMTargetMissing("RISCV") - def test_riscv64(self): + def test_riscv64_gpr_fpr(self): """Test that lldb can read the process information from an riscv64 linux core file.""" - self.do_test("linux-riscv64", self._riscv64_pid, self._riscv64_regions, "a.out") + self.do_test( + "linux-riscv64.gpr_fpr", + self._riscv64_gpr_fpr_pid, + self._riscv64_regions, + "a.out", + ) + + @skipIfLLVMTargetMissing("RISCV") + def test_riscv64_gpr_only(self): + """Test that lldb can read the process information from an riscv64 linux core file + made for a RV64IMAC target, having no FP-registers.""" + self.do_test( + "linux-riscv64.gpr_only", + self._riscv64_gpr_only_pid, + self._riscv64_regions, + "a.out", + ) @skipIfLLVMTargetMissing("X86") def test_same_pid_running(self): @@ -668,46 +685,47 @@ class LinuxCoreTestCase(TestBase): self.expect("register read --all") @skipIfLLVMTargetMissing("RISCV") - def test_riscv64_regs(self): + def test_riscv64_regs_gpr_fpr(self): # check basic registers using 64 bit RISC-V core file target = self.dbg.CreateTarget(None) self.assertTrue(target, VALID_TARGET) - process = target.LoadCore("linux-riscv64.core") + process = target.LoadCore("linux-riscv64.gpr_fpr.core") values = {} - values["pc"] = "0x000000000001015e" - values["ra"] = "0x000000000001018c" - values["sp"] = "0x0000003fffd132a0" - values["gp"] = "0x0000002ae919af50" - values["tp"] = "0x0000003fdceae3e0" - values["t0"] = "0x0" - values["t1"] = "0x0000002ae9187b1c" - values["t2"] = "0x0000000000000021" - values["fp"] = "0x0000003fffd132d0" - values["s1"] = "0x0000002ae919cd98" + values["pc"] = "0x000000000001016e" + values["ra"] = "0x00000000000101a4" + values["sp"] = "0x0000003fffc1d2d0" + values["gp"] = "0x0000002ae6eccf50" + values["tp"] = "0x0000003ff3cb5400" + values["t0"] = "0x7f7f7f7fffffffff" + values["t1"] = "0x0000002ae6eb9b1c" + values["t2"] = "0xffffffffffffffff" + values["fp"] = "0x0000003fffc1d300" + values["s1"] = "0x0000002ae6eced98" values["a0"] = "0x0" values["a1"] = "0x0000000000010144" - values["a2"] = "0x0000002ae919cdb0" - values["a3"] = "0x000000000000002f" - values["a4"] = "0x000000000000002f" + values["a2"] = "0x0000002ae6ecedb0" + values["a3"] = "0xafdbdbff81cf7f81" + values["a4"] = "0x00000000000101e4" values["a5"] = "0x0" - values["a6"] = "0x7efefefefefefeff" + values["a6"] = "0x2f5b5a40014e0001" values["a7"] = "0x00000000000000dd" - values["s2"] = "0x0000002ae9196860" - values["s3"] = "0x0000002ae919cdb0" - values["s4"] = "0x0000003fffc63be8" - values["s5"] = "0x0000002ae919cb78" - values["s6"] = "0x0000002ae9196860" - values["s7"] = "0x0000002ae9196860" + values["s2"] = "0x0000002ae6ec8860" + values["s3"] = "0x0000002ae6ecedb0" + values["s4"] = "0x0000003fff886c18" + values["s5"] = "0x0000002ae6eceb78" + values["s6"] = "0x0000002ae6ec8860" + values["s7"] = "0x0000002ae6ec8860" values["s8"] = "0x0" values["s9"] = "0x000000000000000f" - values["s10"] = "0x0000002ae919a8d0" + values["s10"] = "0x0000002ae6ecc8d0" values["s11"] = "0x0000000000000008" - values["t3"] = "0x0000003fdce07df4" + values["t3"] = "0x0000003ff3be3728" values["t4"] = "0x0" - values["t5"] = "0x0000000000000020" - values["t6"] = "0x0000002ae919f1b0" + values["t5"] = "0x0000000000000002" + values["t6"] = "0x0000002ae6ed08b9" values["zero"] = "0x0" + values["fa5"] = "0xffffffff423c0000" values["fcsr"] = "0x00000000" fpr_names = { @@ -728,7 +746,7 @@ class LinuxCoreTestCase(TestBase): "fa2", "fa3", "fa4", - "fa5", + # fa5 is non-zero and checked in the list above. "fa6", "fa7", "fs0", @@ -760,6 +778,61 @@ class LinuxCoreTestCase(TestBase): self.expect("register read --all") + @skipIfLLVMTargetMissing("RISCV") + def test_riscv64_regs_gpr_only(self): + # check registers using 64 bit RISC-V core file containing GP-registers only + target = self.dbg.CreateTarget(None) + self.assertTrue(target, VALID_TARGET) + process = target.LoadCore("linux-riscv64.gpr_only.core") + + values = {} + values["pc"] = "0x0000000000010164" + values["ra"] = "0x0000000000010194" + values["sp"] = "0x00fffffff4d5fcc0" + values["gp"] = "0x0000000000157678" + values["tp"] = "0x00ffffff99c43400" + values["t0"] = "0x00ffffff99c6b260" + values["t1"] = "0x00ffffff99b7bd54" + values["t2"] = "0x0000000003f0b27f" + values["fp"] = "0x00fffffff4d5fcf0" + values["s1"] = "0x0000000000000003" + values["a0"] = "0x0" + values["a1"] = "0x0000000000010144" + values["a2"] = "0x0000000000176460" + values["a3"] = "0x000000000015ee38" + values["a4"] = "0x00000000423c0000" + values["a5"] = "0x0" + values["a6"] = "0x0" + values["a7"] = "0x00000000000000dd" + values["s2"] = "0x0" + values["s3"] = "0x000000000014ddf8" + values["s4"] = "0x000000000003651c" + values["s5"] = "0x00fffffffccd8d28" + values["s6"] = "0x000000000014ddf8" + values["s7"] = "0x00ffffff99c69d48" + values["s8"] = "0x00ffffff99c6a008" + values["s9"] = "0x0" + values["s10"] = "0x0" + values["s11"] = "0x0" + values["t3"] = "0x00ffffff99c42000" + values["t4"] = "0x00ffffff99af8e20" + values["t5"] = "0x0000000000000005" + values["t6"] = "0x44760bdd8d5f6381" + values["zero"] = "0x0" + + for regname, value in values.items(): + self.expect( + "register read {}".format(regname), + substrs=["{} = {}".format(regname, value)], + ) + + # Check that LLDB does not try to read other registers from core file + self.expect( + "register read --all", + matching=False, + substrs=["registers were unavailable"], + ) + def test_get_core_file_api(self): """ Test SBProcess::GetCoreFile() API can successfully get the core file. diff --git a/lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.core b/lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.gpr_fpr.core similarity index 76% rename from lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.core rename to lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.gpr_fpr.core index 0b159fcab931dca85bd5d09c282c2d6c217e2b83..7187b4000c56dc8ca74aec484310746a0fdd1e9c 100644 GIT binary patch delta 1412 zcmchV?@N# zpsaD<1VTuJy@*U0K|u_KA%%i7O$CbzMDQ0G_NFM;b9c`L?GNa{<#W&Xo^$Sf&U1o; zTyT(k(8~P?`&#+9VJ`f;IJ~aqzmQ$2YIH17h47dn3)geCff^-3lL~|w5!hfl+fi2M zal3@+_%0W@#;M=I(YPnT_v%ZErv)5I3>6S4(}6%4E;4~Rev&CrC08<0Sf zWV1uT5zzYrQ+EByrWJTTGuoXbsUiEHAe`lzheL^h&3So zmKM;!LGjUO@(Wm;+`Oc{)@&@}1%;5a!Xrc$Ybh{N$Y*loci8Ko!5F0PN?pu zRN6?NaYjlgQlMVa;09jvSf{Icm7gXz51}`!b))2)ND#5j-e*HOvcETP;Uc-FB`SFj zKGmXA&>-1Ytp3cwHN0qIG0{e8KZ#{A%GoW`PJc&^k>#+uB#s!Hx83i;+xo_IRyH@d z{my?oJK{5(HQ*6m)W&Qy7a?J03{TjKQYUQG9*Q&SGqLnez{uOD*R++dHqK zX1mMlad-CS2rg{{%IrmQfjzeQb90KApWqx=GCD`ou1Q%su z>L24cdC>zLFpb7bC8hdd-pn?M6O%v2iO)>ikt^#u5Jn*W=4%?y;=&>n9D)}Hc*Dp7 z<14ategeVYKnt0Qs|1D$_Kb@rZ-)ltJ@DqD6=@ya$KA=TXqAkqk?RbKrD?yEgY^i4*aIWLx%$V0~lYlp)v@DmvbBI%o*!Th6xOU&;M=PfA~GL&{X@oy^SAqk~H- z^5OapF52!Z5Q>A1JsphZNcx2gUx@4xL5g?r;e2#!fgVKiLw7qfqzN$^SWGnDZy~WP z=GDGG+SUH596ifnbx9mCIz$L1o(r$=9(6Zt&CU0iTpty&fX=T=tEXwwuXz;z-n&_a zLcE#w<`L$~H->$!FgJ5iI&f@<&(K0v;2Zc0!0ZxQW-D+v&;hIko&lFgi$P7rg(Ev%&s&@dF2ZiJ;Re(oo}tZk2UYFn6K&S(4tze-D9KkjJ)0oUwNg=UR7f=3MG1@ zVAUH<(qrX|%~p$mO%8WHgt{xm>O-Q<(9qHxG*As+cGPhKo^tF|K~O_mTPyzQD8vVx zCJj0)I(=Td*Xwdu`COvSY_#Ir&NG}4TVK(hqNXYT{!+Nt&1=Y}{OXgGnDH~Wu*ojE QYTO=Mdt)Y^o* z6l*2o2V_yNls7lehS&=(LhMzQhNTHlW+3W|5ftl+_pBL2aXfQ4<3f= zw_X_>y!6}UBNtEI{p*KsjGyN_3bV(0Z$szi-5=dO9|1UbrayM(lL+*0z5Va09jBKz zBGwVh+cJj5^V@CfIjAmOz$DGTm-oXT@=T)V?YZ!CWIH-leZ&gR3|1`YN5EWmEeKVkkhE5;?y9RhZO zu}v)!B$3sLd3bqwc{@tTwx+W4Qg&Swia)NCQrT8;=W{ojo<`0P=Zw5A&4-9pxRUkr z@@PMTyp+dF)_A(hOH#b?{rh(%9~v=qQ!6LagGxq84P*vw`1T<)Q%S3(OeLjiq!luijGCt+N7$U1tJXt*$9?O)5UZp1&?AF zZ*N7ZdoaQ`(7SGJb#Wb`Fffx`hmVQ)B2hYB_3Tl}pxTzN$Z+;K3>Fi?WKyDJh!Gd$&#-9L zH5(Xf5&d+R7IC)VhGilw26FwWSHOlqj_&GVkH>fR#13>wo!C|w)gdx+cy@t){` z4qT9SwxzWrE_ZM0ZfENwiH$f}3VX5(9pV@w-rq&=-p&(U4B1V65RX3*mvQ|g3d439 zaH0>eewQ2z1GUh+nmE^mqqu-M3{iN5M#R`Ztt}+zR=|u(H={L@Shv*XEjQNCgF#FZ z6Vefm$t>0k49f(tFv$&AlVee=k&RH-q{sr1ftCOt@YJ2$n*-Pt9rkk5Hr7)x*eCI=>=P_#4$bjvD% zT6Hwr(+wL+npsv06CPwzXuusj7jvqLvs#woXOsJy=M_gU6 zR{3dA)q0wd*BlL0ql_m(sm_)hO-Je2o}3a|*>VhJvOKNm(`GS0VCF$_j2Qs3t7g)5eA+~;+%_rQ(vG7+;MeD!5ZyAaZ<&7Fv7QG@VON2h#>Ti z5mn&g-nh#Bz4Id2-k)xzhCh~ozqnr(x&OSMjC$~f7~}rp0Ty)epWG?{E_qnD&jdY- znf|uiTodA-OK-P734eiUs01;x-Q*Jz>{pOW4F@su@1c(B9l|k+av;;9CC-_2t zTJ!XjAoneVgBUTt=Kc$wTdfRo-$4su!EqkuPXc~5>XPsm@*-Lr`CsAw_%EqT!p|?o v-t!Z$a{r^;h+h$C$1L`bh)XXEpK8B540Gb=b?EB3qL_{Rf93v{@8SO+vIc^W literal 0 HcmV?d00001 diff --git a/lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.gpr_only.core b/lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.gpr_only.core new file mode 100644 index 0000000000000000000000000000000000000000..63265a5db123d9ebc699a927d7477a264b558e91 GIT binary patch literal 28672 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 literal 0 HcmV?d00001 diff --git a/lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.out b/lldb/test/API/functionalities/postmortem/elf-core/linux-riscv64.out deleted file mode 100755 index ae28aa9ba9aad9700b193281fa8045587c344187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3328 zcmbtW-ESL35TCuv*-o4|P6KM93dK#+4-mQ7Zs-?nN!_GrB@{seQp-oLXZswx_G)g^p$EPvj88ld zjrV?9y7=O)UEfc9_r=Kz-&9|I^~+N;XZshSXUqN%{<;=TMQ%kG|9*Yn zpD~;L-k5p$(#+Y&V*i5A+p^~~~UZh7~9mLKnmB|gHL&BX=xiu$R*ObIVIN~ zgO|Q-SJJrz0Oe;tK4*~gxZsSwrp&bv>(tk|Ag_q_8uE7dywo!91 zTKS4uOJ#QISv@^C>{{n$oJQtR0l=Z-7{RSH3g>_wMYScVx#xBbSF-htVQ1@U!z8Vg zt!IrQbp^s^D}{#ZDXn8$*r;2D1KD(DZzh}BNp`nT zKEThmZI+4!{}5yEpWxKs6yzPp=AGq&(eO;ygF+d1*fuLQy#PaH$F_!wyq<=vYH6_G zxE5yM-hJ~m$zn+O?RNS8W1BDB294Gv$ajdeO|ArAU-l7 zqYAhQ>ogVOYfw5dE%5tN*g!KXfjr3SY3IbX`I!*>a3RwTmZbPSG}B6>J2FXMiR5bh zD&iY(-tZ0LHQ`@sg1^xOf42#Kvk5NG7hNU;=O6U;rQ6Ohrm9ZftQvKvQu8c#0FlYj zL(d&Da%1DiCJY0|xyeamY+{t_`9?#Wcf(jsvx=r?f??G#nR;W!_RKs=&-G`n1KlbcCD*hq&!ENC`$5|^~xN;8)|MUulYx2KsYY3OsA>}yQ=^rvg zTmGMe_OUOP`!M%1 zTEZBS=fp<8zwGHNVeXp<6Bd5YZQ`narHQ|c^L7*edEw80j{-5IUr@@k6QIGT!hb{< oJJ6WKN1h-25#fz)e32@F_+mkPIzC#3uFX|f6aVXCqW{YOKOsPGG5`Po diff --git a/lldb/test/API/functionalities/postmortem/elf-core/main_fpr.c b/lldb/test/API/functionalities/postmortem/elf-core/main_fpr.c new file mode 100644 index 000000000000..bcfe6d27359c --- /dev/null +++ b/lldb/test/API/functionalities/postmortem/elf-core/main_fpr.c @@ -0,0 +1,14 @@ +static void bar(float *boom) { + float F = 98.0; + *boom = 47.0; // Frame bar +} + +static void foo(float *boom, void (*boomer)(float *)) { + float F = 102.0; + boomer(boom); // Frame foo +} + +void _start(void) { + float F = 95.0; + foo(0, bar); // Frame _start +}