Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions lldb/include/lldb/Target/DynamicRegisterInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ class DynamicRegisterInfo {

template <typename T> T registers() = delete;

template <typename T> T registers() const = delete;

void ConfigureOffsets();

protected:
Expand Down Expand Up @@ -145,6 +147,12 @@ DynamicRegisterInfo::registers() {
return reg_collection_range(m_regs);
}

template <>
inline DynamicRegisterInfo::reg_collection_const_range
DynamicRegisterInfo::registers() const {
return reg_collection_const_range(m_regs);
}

void addSupplementaryRegister(std::vector<DynamicRegisterInfo::Register> &regs,
DynamicRegisterInfo::Register new_reg_info);

Expand Down
1 change: 1 addition & 0 deletions lldb/source/Plugins/Process/Utility/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ add_lldb_library(lldbPluginProcessUtility
RegisterInfoPOSIX_ppc64le.cpp
RegisterInfoPOSIX_riscv32.cpp
RegisterInfoPOSIX_riscv64.cpp
RegisterInfoPOSIXDynamic_riscv32.cpp
StopInfoMachException.cpp
ThreadMemory.cpp

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
//===-- RegisterInfoPOSIXDynamic_riscv32.cpp ------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===---------------------------------------------------------------------===//

#include <lldb/Utility/Flags.h>
#include <stddef.h>

#include "lldb/lldb-defines.h"
#include "llvm/Support/Compiler.h"

#include "RegisterInfoPOSIXDynamic_riscv32.h"

RegisterInfoPOSIXDynamic_riscv32::RegisterInfoPOSIXDynamic_riscv32(
const lldb_private::ArchSpec &target_arch)
: lldb_private::RegisterInfoAndSetInterface(target_arch),
m_target_arch(target_arch) {}

uint32_t RegisterInfoPOSIXDynamic_riscv32::GetRegisterCount() const {
return m_dyn_reg_infos.GetNumRegisters();
}

size_t RegisterInfoPOSIXDynamic_riscv32::GetGPRSize() const {
for (uint32_t set_idx = 0; set_idx < GetRegisterSetCount(); ++set_idx) {
const lldb_private::RegisterSet *set =
m_dyn_reg_infos.GetRegisterSet(set_idx);
if (lldb_private::ConstString(set->name) == "GPR")
return set->num_registers;
}
return 0;
}

size_t RegisterInfoPOSIXDynamic_riscv32::GetFPRSize() const {
for (uint32_t set_idx = 0; set_idx < GetRegisterSetCount(); ++set_idx) {
const lldb_private::RegisterSet *set =
m_dyn_reg_infos.GetRegisterSet(set_idx);
if (lldb_private::ConstString(set->name) == "FPR")
return set->num_registers;
}
return 0;
}

const lldb_private::RegisterInfo *
RegisterInfoPOSIXDynamic_riscv32::GetRegisterInfo() const {
return &*m_dyn_reg_infos
.registers<lldb_private::DynamicRegisterInfo::
reg_collection_const_range>()
.begin();
}

size_t RegisterInfoPOSIXDynamic_riscv32::GetRegisterSetCount() const {
return m_dyn_reg_infos.GetNumRegisterSets();
}

size_t RegisterInfoPOSIXDynamic_riscv32::GetRegisterSetFromRegisterIndex(
uint32_t reg_index) const {
for (size_t set_index = 0; set_index < m_dyn_reg_infos.GetNumRegisterSets();
++set_index) {
const lldb_private::RegisterSet *reg_set =
m_dyn_reg_infos.GetRegisterSet(set_index);
for (uint32_t idx = 0; idx < reg_set->num_registers; ++idx)
if (reg_set->registers[idx] == reg_index)
return set_index;
}
return LLDB_INVALID_REGNUM;
}

const lldb_private::RegisterSet *
RegisterInfoPOSIXDynamic_riscv32::GetRegisterSet(size_t set_index) const {
if (set_index < GetRegisterSetCount())
return m_dyn_reg_infos.GetRegisterSet(set_index);
return nullptr;
}

size_t RegisterInfoPOSIXDynamic_riscv32::SetRegisterInfo(
std::vector<lldb_private::DynamicRegisterInfo::Register> regs) {
return m_dyn_reg_infos.SetRegisterInfo(std::move(regs), m_target_arch);
}

const lldb_private::RegisterInfo *
RegisterInfoPOSIXDynamic_riscv32::GetRegisterInfo(
llvm::StringRef reg_name) const {
return m_dyn_reg_infos.GetRegisterInfo(reg_name);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
//===-- RegisterInfoPOSIXDynamic_riscv32.h ----------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERINFOPOSIXDYNAMIC_RISCV32_H
#define LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERINFOPOSIXDYNAMIC_RISCV32_H

#include "RegisterInfoAndSetInterface.h"
#include "lldb/Target/DynamicRegisterInfo.h"
#include "lldb/Target/RegisterContext.h"
#include "lldb/Utility/Flags.h"
#include "lldb/lldb-private.h"
#include <map>

class RegisterInfoPOSIXDynamic_riscv32
: public lldb_private::RegisterInfoAndSetInterface {
public:
RegisterInfoPOSIXDynamic_riscv32(const lldb_private::ArchSpec &target_arch);

size_t GetGPRSize() const override;

size_t GetFPRSize() const override;

const lldb_private::RegisterInfo *GetRegisterInfo() const override;

uint32_t GetRegisterCount() const override;

const lldb_private::RegisterSet *
GetRegisterSet(size_t reg_set) const override;

size_t GetRegisterSetCount() const override;

size_t GetRegisterSetFromRegisterIndex(uint32_t reg_index) const override;

size_t SetRegisterInfo(
std::vector<lldb_private::DynamicRegisterInfo::Register> regs);

const lldb_private::RegisterInfo *
GetRegisterInfo(llvm::StringRef reg_name) const;

private:
lldb_private::DynamicRegisterInfo m_dyn_reg_infos;
const lldb_private::ArchSpec m_target_arch;
};

#endif // LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_REGISTERINFOPOSIXDYNAMIC_RISCV32_H
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@

#define GPR_OFFSET(idx) ((idx) * 4 + 0)
#define FPR_OFFSET(idx) ((idx) * 4 + sizeof(RegisterInfoPOSIX_riscv32::GPR))
#define CSR_OFFSET(idx) \
((idx) * 4 + sizeof(RegisterInfoPOSIX_riscv32::GPR) + \
sizeof(RegisterInfoPOSIX_riscv32::FPR))

#define REG_CONTEXT_SIZE \
(sizeof(RegisterInfoPOSIX_riscv32::GPR) + \
Expand Down
Loading
Loading