Skip to content

Commit ec1efe7

Browse files
committed
[LLDB] Let DataExtractor deal with two-byte addresses
AVR usually uses two byte addresses. By making DataExtractor deal with this, it is possible to load AVR binaries that don't have debug info associated with them. Differential Revision: https://reviews.llvm.org/D73969
1 parent 2855c8f commit ec1efe7

File tree

2 files changed

+40
-7
lines changed

2 files changed

+40
-7
lines changed

lldb/source/Utility/DataExtractor.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ DataExtractor::DataExtractor(const void *data, offset_t length,
133133
m_end(const_cast<uint8_t *>(static_cast<const uint8_t *>(data)) + length),
134134
m_byte_order(endian), m_addr_size(addr_size), m_data_sp(),
135135
m_target_byte_size(target_byte_size) {
136-
assert(addr_size == 4 || addr_size == 8);
136+
assert(addr_size >= 1 && addr_size <= 8);
137137
}
138138

139139
// Make a shared pointer reference to the shared data in "data_sp" and set the
@@ -146,7 +146,7 @@ DataExtractor::DataExtractor(const DataBufferSP &data_sp, ByteOrder endian,
146146
: m_start(nullptr), m_end(nullptr), m_byte_order(endian),
147147
m_addr_size(addr_size), m_data_sp(),
148148
m_target_byte_size(target_byte_size) {
149-
assert(addr_size == 4 || addr_size == 8);
149+
assert(addr_size >= 1 && addr_size <= 8);
150150
SetData(data_sp);
151151
}
152152

@@ -160,7 +160,7 @@ DataExtractor::DataExtractor(const DataExtractor &data, offset_t offset,
160160
: m_start(nullptr), m_end(nullptr), m_byte_order(data.m_byte_order),
161161
m_addr_size(data.m_addr_size), m_data_sp(),
162162
m_target_byte_size(target_byte_size) {
163-
assert(m_addr_size == 4 || m_addr_size == 8);
163+
assert(m_addr_size >= 1 && m_addr_size <= 8);
164164
if (data.ValidOffset(offset)) {
165165
offset_t bytes_available = data.GetByteSize() - offset;
166166
if (length > bytes_available)
@@ -173,7 +173,7 @@ DataExtractor::DataExtractor(const DataExtractor &rhs)
173173
: m_start(rhs.m_start), m_end(rhs.m_end), m_byte_order(rhs.m_byte_order),
174174
m_addr_size(rhs.m_addr_size), m_data_sp(rhs.m_data_sp),
175175
m_target_byte_size(rhs.m_target_byte_size) {
176-
assert(m_addr_size == 4 || m_addr_size == 8);
176+
assert(m_addr_size >= 1 && m_addr_size <= 8);
177177
}
178178

179179
// Assignment operator
@@ -251,7 +251,7 @@ lldb::offset_t DataExtractor::SetData(const DataExtractor &data,
251251
offset_t data_offset,
252252
offset_t data_length) {
253253
m_addr_size = data.m_addr_size;
254-
assert(m_addr_size == 4 || m_addr_size == 8);
254+
assert(m_addr_size >= 1 && m_addr_size <= 8);
255255
// If "data" contains shared pointer to data, then we can use that
256256
if (data.m_data_sp) {
257257
m_byte_order = data.m_byte_order;
@@ -680,12 +680,12 @@ long double DataExtractor::GetLongDouble(offset_t *offset_ptr) const {
680680
//
681681
// RETURNS the address that was extracted, or zero on failure.
682682
uint64_t DataExtractor::GetAddress(offset_t *offset_ptr) const {
683-
assert(m_addr_size == 4 || m_addr_size == 8);
683+
assert(m_addr_size >= 1 && m_addr_size <= 8);
684684
return GetMaxU64(offset_ptr, m_addr_size);
685685
}
686686

687687
uint64_t DataExtractor::GetAddress_unchecked(offset_t *offset_ptr) const {
688-
assert(m_addr_size == 4 || m_addr_size == 8);
688+
assert(m_addr_size >= 1 && m_addr_size <= 8);
689689
return GetMaxU64_unchecked(offset_ptr, m_addr_size);
690690
}
691691

lldb/unittests/Utility/DataExtractorTest.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,39 @@ TEST(DataExtractorTest, GetCStrAtNullOffset) {
112112
EXPECT_EQ(4U, offset);
113113
}
114114

115+
TEST(DataExtractorTest, UncommonAddressSize) {
116+
uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
117+
DataExtractor E2(buffer, sizeof buffer, lldb::eByteOrderLittle, 2);
118+
DataExtractor E5(buffer, sizeof buffer, lldb::eByteOrderLittle, 5);
119+
DataExtractor E7(buffer, sizeof buffer, lldb::eByteOrderLittle, 7);
120+
121+
lldb::offset_t offset;
122+
123+
// Test 2-byte addresses (for AVR).
124+
offset = 0;
125+
EXPECT_EQ(0x0201U, E2.GetMaxU64(&offset, 2));
126+
EXPECT_EQ(2U, offset);
127+
offset = 0;
128+
EXPECT_EQ(0x0201U, E2.GetAddress(&offset));
129+
EXPECT_EQ(2U, offset);
130+
131+
// Test 5-byte addresses.
132+
offset = 0;
133+
EXPECT_EQ(0x030201U, E5.GetMaxU64(&offset, 3));
134+
EXPECT_EQ(3U, offset);
135+
offset = 3;
136+
EXPECT_EQ(0x0807060504U, E5.GetAddress(&offset));
137+
EXPECT_EQ(8U, offset);
138+
139+
// Test 7-byte addresses.
140+
offset = 0;
141+
EXPECT_EQ(0x0504030201U, E7.GetMaxU64(&offset, 5));
142+
EXPECT_EQ(5U, offset);
143+
offset = 0;
144+
EXPECT_EQ(0x07060504030201U, E7.GetAddress(&offset));
145+
EXPECT_EQ(7U, offset);
146+
}
147+
115148
TEST(DataExtractorTest, GetMaxU64) {
116149
uint8_t buffer[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
117150
DataExtractor LE(buffer, sizeof(buffer), lldb::eByteOrderLittle,

0 commit comments

Comments
 (0)