LLDB
mainline
llvm-project
lldb
include
lldb
Utility
VirtualDataExtractor.h
Go to the documentation of this file.
1
//===----------------------------------------------------------------------===//
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
9
#ifndef LLDB_UTILITY_VIRTUALDATAEXTRACTOR_H
10
#define LLDB_UTILITY_VIRTUALDATAEXTRACTOR_H
11
12
#include "
lldb/Utility/DataExtractor.h
"
13
#include "
lldb/Utility/RangeMap.h
"
14
#include "
lldb/lldb-types.h
"
15
16
namespace
lldb_private
{
17
18
/// A DataExtractor subclass that allows reading data at virtual addresses
19
/// using a lookup table that maps virtual address ranges to physical offsets.
20
///
21
/// This class maintains a lookup table where each entry contains:
22
/// - base: starting virtual address for this entry
23
/// - size: size of this entry in bytes
24
/// - data: physical offset in the underlying data buffer
25
///
26
/// Reads are translated from virtual addresses to physical offsets using
27
/// this lookup table. Reads cannot cross entry boundaries and this is
28
/// enforced with assertions.
29
class
VirtualDataExtractor
:
public
DataExtractor
{
30
public
:
31
/// Type alias for the range map used internally.
32
/// Maps virtual addresses (base) to physical offsets (data).
33
using
LookupTable
=
34
RangeDataVector<lldb::offset_t, lldb::offset_t, lldb::offset_t>
;
35
36
VirtualDataExtractor
() =
default
;
37
38
VirtualDataExtractor
(
const
void
*data,
lldb::offset_t
data_length,
39
lldb::ByteOrder
byte_order, uint32_t addr_size,
40
LookupTable
lookup_table);
41
42
VirtualDataExtractor
(
const
lldb::DataBufferSP
&data_sp,
43
lldb::ByteOrder
byte_order, uint32_t addr_size,
44
LookupTable
lookup_table);
45
46
VirtualDataExtractor
(
const
lldb::DataBufferSP
&data_sp,
47
LookupTable
lookup_table);
48
49
lldb::DataExtractorSP
Clone
()
const override
{
50
return
std::make_shared<VirtualDataExtractor>(*
this
);
51
}
52
53
const
void
*
GetData
(
lldb::offset_t
*offset_ptr,
54
lldb::offset_t
length)
const override
;
55
56
const
uint8_t *
PeekData
(
lldb::offset_t
offset,
57
lldb::offset_t
length)
const override
;
58
59
lldb::DataExtractorSP
GetSubsetExtractorSP
(
lldb::offset_t
offset,
60
lldb::offset_t
length)
override
;
61
62
lldb::DataExtractorSP
GetSubsetExtractorSP
(
lldb::offset_t
offset)
override
;
63
64
llvm::ArrayRef<uint8_t>
GetData
()
const override
;
65
66
/// GetByteSize is called by external users often, and we want to
67
/// return the virtual buffer size that the user expects to see.
68
uint64_t
GetByteSize
()
const override
{
return
GetVirtualByteSize
(); }
69
70
/// BytesLeft is mostly called by DataExtractor internal methods, to
71
/// ensure we don't read past the end of the DataBuffer. Use the
72
/// physical buffer size.
73
lldb::offset_t
BytesLeft
(
lldb::offset_t
offset)
const override
{
74
return
PhysicalBytesLeft
(offset);
75
}
76
77
lldb::offset_t
SetData
(
const
void
*bytes,
lldb::offset_t
length,
78
lldb::ByteOrder
byte_order)
override
;
79
80
lldb::offset_t
SetData
(
const
DataExtractor
&data,
lldb::offset_t
offset,
81
lldb::offset_t
length)
override
;
82
83
lldb::offset_t
SetData
(
const
lldb::DataBufferSP
&data_sp,
84
lldb::offset_t
offset = 0,
85
lldb::offset_t
length =
LLDB_INVALID_OFFSET
)
override
;
86
87
/// Unchecked overrides
88
/// @{
89
uint8_t
GetU8_unchecked
(
lldb::offset_t
*offset_ptr)
const override
;
90
uint16_t
GetU16_unchecked
(
lldb::offset_t
*offset_ptr)
const override
;
91
uint32_t
GetU32_unchecked
(
lldb::offset_t
*offset_ptr)
const override
;
92
uint64_t
GetU64_unchecked
(
lldb::offset_t
*offset_ptr)
const override
;
93
/// @}
94
95
protected
:
96
/// Find the lookup entry that contains the given virtual address.
97
const
LookupTable::Entry
*
FindEntry
(
lldb::offset_t
virtual_addr)
const
;
98
99
/// Validate that a read at a virtual address is within bounds and
100
/// does not cross entry boundaries.
101
bool
ValidateVirtualRead
(
lldb::offset_t
virtual_addr,
102
lldb::offset_t
length)
const
;
103
104
uint64_t
GetVirtualByteSize
()
const
;
105
uint64_t
GetPhysicalByteSize
()
const
;
106
lldb::offset_t
VirtualBytesLeft
(
lldb::offset_t
virtual_offset)
const
;
107
lldb::offset_t
PhysicalBytesLeft
(
lldb::offset_t
physical_offset)
const
;
108
109
void
ResetLookupTableToMatchPhysical
();
110
111
private
:
112
LookupTable
m_lookup_table
;
113
};
114
115
}
// namespace lldb_private
116
117
#endif
// LLDB_UTILITY_VIRTUALDATAEXTRACTOR_H
DataExtractor.h
RangeMap.h
lldb_private::DataExtractor
An data extractor class.
Definition
DataExtractor.h:50
lldb_private::DataExtractor::DataExtractor
DataExtractor()
Default constructor.
Definition
DataExtractor.cpp:123
lldb_private::RangeDataVector
Definition
RangeMap.h:459
lldb_private::RangeDataVector< lldb::offset_t, lldb::offset_t, lldb::offset_t >::Entry
RangeData< lldb::offset_t, lldb::offset_t, lldb::offset_t > Entry
Definition
RangeMap.h:462
lldb_private::VirtualDataExtractor::Clone
lldb::DataExtractorSP Clone() const override
Return a shared pointer to a copy of this object.
Definition
VirtualDataExtractor.h:49
lldb_private::VirtualDataExtractor::GetSubsetExtractorSP
lldb::DataExtractorSP GetSubsetExtractorSP(lldb::offset_t offset, lldb::offset_t length) override
Return a new DataExtractor which represents a subset of an existing data extractor's bytes,...
Definition
VirtualDataExtractor.cpp:250
lldb_private::VirtualDataExtractor::VirtualDataExtractor
VirtualDataExtractor()=default
lldb_private::VirtualDataExtractor::BytesLeft
lldb::offset_t BytesLeft(lldb::offset_t offset) const override
BytesLeft is mostly called by DataExtractor internal methods, to ensure we don't read past the end of...
Definition
VirtualDataExtractor.h:73
lldb_private::VirtualDataExtractor::GetU32_unchecked
uint32_t GetU32_unchecked(lldb::offset_t *offset_ptr) const override
Definition
VirtualDataExtractor.cpp:227
lldb_private::VirtualDataExtractor::GetVirtualByteSize
uint64_t GetVirtualByteSize() const
Definition
VirtualDataExtractor.cpp:162
lldb_private::VirtualDataExtractor::FindEntry
const LookupTable::Entry * FindEntry(lldb::offset_t virtual_addr) const
Find the lookup entry that contains the given virtual address.
Definition
VirtualDataExtractor.cpp:41
lldb_private::VirtualDataExtractor::GetData
llvm::ArrayRef< uint8_t > GetData() const override
Definition
VirtualDataExtractor.cpp:307
lldb_private::VirtualDataExtractor::ValidateVirtualRead
bool ValidateVirtualRead(lldb::offset_t virtual_addr, lldb::offset_t length) const
Validate that a read at a virtual address is within bounds and does not cross entry boundaries.
Definition
VirtualDataExtractor.cpp:46
lldb_private::VirtualDataExtractor::PeekData
const uint8_t * PeekData(lldb::offset_t offset, lldb::offset_t length) const override
Peek at a bytes at offset.
Definition
VirtualDataExtractor.cpp:191
lldb_private::VirtualDataExtractor::GetU8_unchecked
uint8_t GetU8_unchecked(lldb::offset_t *offset_ptr) const override
Unchecked overrides.
Definition
VirtualDataExtractor.cpp:205
lldb_private::VirtualDataExtractor::GetU64_unchecked
uint64_t GetU64_unchecked(lldb::offset_t *offset_ptr) const override
Definition
VirtualDataExtractor.cpp:238
lldb_private::VirtualDataExtractor::LookupTable
RangeDataVector< lldb::offset_t, lldb::offset_t, lldb::offset_t > LookupTable
Type alias for the range map used internally.
Definition
VirtualDataExtractor.h:33
lldb_private::VirtualDataExtractor::ResetLookupTableToMatchPhysical
void ResetLookupTableToMatchPhysical()
Definition
VirtualDataExtractor.cpp:149
lldb_private::VirtualDataExtractor::SetData
lldb::offset_t SetData(const void *bytes, lldb::offset_t length, lldb::ByteOrder byte_order) override
Set data with a buffer that is caller owned.
Definition
VirtualDataExtractor.cpp:89
lldb_private::VirtualDataExtractor::m_lookup_table
LookupTable m_lookup_table
Definition
VirtualDataExtractor.h:112
lldb_private::VirtualDataExtractor::GetByteSize
uint64_t GetByteSize() const override
GetByteSize is called by external users often, and we want to return the virtual buffer size that the...
Definition
VirtualDataExtractor.h:68
lldb_private::VirtualDataExtractor::GetU16_unchecked
uint16_t GetU16_unchecked(lldb::offset_t *offset_ptr) const override
Definition
VirtualDataExtractor.cpp:216
lldb_private::VirtualDataExtractor::PhysicalBytesLeft
lldb::offset_t PhysicalBytesLeft(lldb::offset_t physical_offset) const
Definition
VirtualDataExtractor.cpp:184
lldb_private::VirtualDataExtractor::GetPhysicalByteSize
uint64_t GetPhysicalByteSize() const
Definition
VirtualDataExtractor.cpp:172
lldb_private::VirtualDataExtractor::VirtualBytesLeft
lldb::offset_t VirtualBytesLeft(lldb::offset_t virtual_offset) const
Definition
VirtualDataExtractor.cpp:176
LLDB_INVALID_OFFSET
#define LLDB_INVALID_OFFSET
Definition
lldb-defines.h:95
lldb-types.h
lldb_private
A class that represents a running process on the host machine.
Definition
SBAddressRange.h:14
lldb::offset_t
uint64_t offset_t
Definition
lldb-types.h:85
lldb::ByteOrder
ByteOrder
Byte ordering definitions.
Definition
lldb-enumerations.h:144
lldb::DataBufferSP
std::shared_ptr< lldb_private::DataBuffer > DataBufferSP
Definition
lldb-forward.h:342
lldb::DataExtractorSP
std::shared_ptr< lldb_private::DataExtractor > DataExtractorSP
Definition
lldb-forward.h:344
Generated on
for LLDB by
1.14.0