LLDB mainline
RegisterContextPOSIXCore_arm.cpp
Go to the documentation of this file.
1//===-- RegisterContextPOSIXCore_arm.cpp ----------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
10
11#include "lldb/Target/Thread.h"
13
14#include <memory>
15
16using namespace lldb_private;
17
19 Thread &thread, std::unique_ptr<RegisterInfoPOSIX_arm> register_info,
20 const DataExtractor &gpregset, llvm::ArrayRef<CoreNote> notes)
21 : RegisterContextPOSIX_arm(thread, std::move(register_info)) {
22 m_gpr_buffer = std::make_shared<DataBufferHeap>(gpregset.GetDataStart(),
23 gpregset.GetByteSize());
24 m_gpr.SetData(m_gpr_buffer);
25 m_gpr.SetByteOrder(gpregset.GetByteOrder());
26
27 const llvm::Triple &target_triple =
28 m_register_info_up->GetTargetArchitecture().GetTriple();
29 m_fpr = getRegset(notes, target_triple, ARM_VFP_Desc);
30}
31
33
35
37
39 assert(0);
40 return false;
41}
42
44 assert(0);
45 return false;
46}
47
49 RegisterValue &value) {
50 const uint32_t reg = reg_info->kinds[lldb::eRegisterKindLLDB];
51 if (reg == LLDB_INVALID_REGNUM)
52 return false;
53
54 if (IsGPR(reg)) {
55 lldb::offset_t offset = reg_info->byte_offset;
56 if (m_gpr.ValidOffsetForDataOfSize(offset, reg_info->byte_size)) {
57 value = m_gpr.GetMaxU64(&offset, reg_info->byte_size);
58 return offset == reg_info->byte_offset + reg_info->byte_size;
59 }
60 } else if (IsFPR(reg)) {
61 assert(reg_info->byte_offset >= GetGPRSize());
62 lldb::offset_t offset = reg_info->byte_offset - GetGPRSize();
63 if (m_fpr.ValidOffsetForDataOfSize(offset, reg_info->byte_size))
64 return value
65 .SetValueFromData(*reg_info, m_fpr, offset, /*partial_data_ok=*/false)
66 .Success();
67 }
68
69 return false;
70}
71
76
78 const RegisterValue &value) {
79 return false;
80}
81
83 const lldb::DataBufferSP &data_sp) {
84 return false;
85}
86
88 return false;
89}
RegisterContextCorePOSIX_arm(lldb_private::Thread &thread, std::unique_ptr< RegisterInfoPOSIX_arm > register_info, const lldb_private::DataExtractor &gpregset, llvm::ArrayRef< lldb_private::CoreNote > notes)
bool HardwareSingleStep(bool enable) override
bool WriteRegister(const lldb_private::RegisterInfo *reg_info, const lldb_private::RegisterValue &value) override
bool ReadAllRegisterValues(lldb::WritableDataBufferSP &data_sp) override
bool ReadRegister(const lldb_private::RegisterInfo *reg_info, lldb_private::RegisterValue &value) override
~RegisterContextCorePOSIX_arm() override
bool WriteAllRegisterValues(const lldb::DataBufferSP &data_sp) override
RegisterContextPOSIX_arm(lldb_private::Thread &thread, std::unique_ptr< RegisterInfoPOSIX_arm > register_info)
std::unique_ptr< RegisterInfoPOSIX_arm > m_register_info_up
An data extractor class.
uint64_t GetByteSize() const
Get the number of bytes contained in this object.
const uint8_t * GetDataStart() const
Get the data start pointer.
lldb::ByteOrder GetByteOrder() const
Get the current byte order value.
Status SetValueFromData(const RegisterInfo &reg_info, DataExtractor &data, lldb::offset_t offset, bool partial_data_ok)
bool Success() const
Test for success condition.
Definition Status.cpp:304
#define LLDB_INVALID_REGNUM
A class that represents a running process on the host machine.
constexpr RegsetDesc ARM_VFP_Desc[]
DataExtractor getRegset(llvm::ArrayRef< CoreNote > Notes, const llvm::Triple &Triple, llvm::ArrayRef< RegsetDesc > RegsetDescs)
uint64_t offset_t
Definition lldb-types.h:85
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
std::shared_ptr< lldb_private::WritableDataBuffer > WritableDataBufferSP
@ eRegisterKindLLDB
lldb's internal register numbers
Every register is described in detail including its name, alternate name (optional),...
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.