|
7 | 7 | //===----------------------------------------------------------------------===//
|
8 | 8 |
|
9 | 9 | #include "llvm/DebugInfo/DWARF/DWARFDebugArangeSet.h"
|
| 10 | +#include "llvm/Testing/Support/Error.h" |
10 | 11 | #include "gtest/gtest.h"
|
11 | 12 |
|
12 | 13 | using namespace llvm;
|
@@ -166,24 +167,78 @@ TEST(DWARFDebugArangeSet, UnevenLength) {
|
166 | 167 | "of the tuple size");
|
167 | 168 | }
|
168 | 169 |
|
169 |
| -TEST(DWARFDebugArangeSet, ZeroLengthEntry) { |
| 170 | +TEST(DWARFDebugArangeSet, ZeroAddressEntry) { |
170 | 171 | static const char DebugArangesSecRaw[] =
|
171 |
| - "\x24\x00\x00\x00" // Length |
| 172 | + "\x1c\x00\x00\x00" // Length |
172 | 173 | "\x02\x00" // Version
|
173 | 174 | "\x00\x00\x00\x00" // Debug Info Offset
|
174 | 175 | "\x04" // Address Size
|
175 | 176 | "\x00" // Segment Selector Size
|
176 | 177 | "\x00\x00\x00\x00" // Padding
|
177 | 178 | "\x00\x00\x00\x00" // Entry1: Address
|
178 | 179 | "\x01\x00\x00\x00" // Length
|
| 180 | + "\x00\x00\x00\x00" // Termination tuple |
| 181 | + "\x00\x00\x00\x00"; |
| 182 | + DWARFDataExtractor Extractor( |
| 183 | + StringRef(DebugArangesSecRaw, sizeof(DebugArangesSecRaw) - 1), |
| 184 | + /*IsLittleEndian=*/true, |
| 185 | + /*AddressSize=*/4); |
| 186 | + DWARFDebugArangeSet Set; |
| 187 | + uint64_t Offset = 0; |
| 188 | + ASSERT_THAT_ERROR(Set.extract(Extractor, &Offset), |
| 189 | + Succeeded()); |
| 190 | + auto Range = Set.descriptors(); |
| 191 | + auto Iter = Range.begin(); |
| 192 | + ASSERT_EQ(std::distance(Iter, Range.end()), 1u); |
| 193 | + EXPECT_EQ(Iter->Address, 0u); |
| 194 | + EXPECT_EQ(Iter->Length, 1u); |
| 195 | +} |
| 196 | + |
| 197 | +TEST(DWARFDebugArangeSet, ZeroLengthEntry) { |
| 198 | + static const char DebugArangesSecRaw[] = |
| 199 | + "\x1c\x00\x00\x00" // Length |
| 200 | + "\x02\x00" // Version |
| 201 | + "\x00\x00\x00\x00" // Debug Info Offset |
| 202 | + "\x04" // Address Size |
| 203 | + "\x00" // Segment Selector Size |
| 204 | + "\x00\x00\x00\x00" // Padding |
| 205 | + "\x01\x00\x00\x00" // Entry1: Address |
| 206 | + "\x00\x00\x00\x00" // Length |
| 207 | + "\x00\x00\x00\x00" // Termination tuple |
| 208 | + "\x00\x00\x00\x00"; |
| 209 | + DWARFDataExtractor Extractor( |
| 210 | + StringRef(DebugArangesSecRaw, sizeof(DebugArangesSecRaw) - 1), |
| 211 | + /*IsLittleEndian=*/true, |
| 212 | + /*AddressSize=*/4); |
| 213 | + DWARFDebugArangeSet Set; |
| 214 | + uint64_t Offset = 0; |
| 215 | + ASSERT_THAT_ERROR(Set.extract(Extractor, &Offset), |
| 216 | + Succeeded()); |
| 217 | + auto Range = Set.descriptors(); |
| 218 | + auto Iter = Range.begin(); |
| 219 | + ASSERT_EQ(std::distance(Iter, Range.end()), 1u); |
| 220 | + EXPECT_EQ(Iter->Address, 1u); |
| 221 | + EXPECT_EQ(Iter->Length, 0u); |
| 222 | +} |
| 223 | + |
| 224 | +TEST(DWARFDebugArangesSet, PrematureTerminator) { |
| 225 | + static const char DebugArangesSecRaw[] = |
| 226 | + "\x24\x00\x00\x00" // Length |
| 227 | + "\x02\x00" // Version |
| 228 | + "\x00\x00\x00\x00" // Debug Info Offset |
| 229 | + "\x04" // Address Size |
| 230 | + "\x00" // Segment Selector Size |
| 231 | + "\x00\x00\x00\x00" // Padding |
| 232 | + "\x00\x00\x00\x00" // Entry1: Premature |
| 233 | + "\x00\x00\x00\x00" // terminator |
179 | 234 | "\x01\x00\x00\x00" // Entry2: Address
|
180 |
| - "\x00\x00\x00\x00" // Length (invalid) |
| 235 | + "\x01\x00\x00\x00" // Length |
181 | 236 | "\x00\x00\x00\x00" // Termination tuple
|
182 | 237 | "\x00\x00\x00\x00";
|
183 | 238 | ExpectExtractError(
|
184 | 239 | DebugArangesSecRaw,
|
185 |
| - "address range table at offset 0x0 has an invalid tuple (length = 0) " |
186 |
| - "at offset 0x18"); |
| 240 | + "address range table at offset 0x0 has a premature " |
| 241 | + "terminator entry at offset 0x10"); |
187 | 242 | }
|
188 | 243 |
|
189 | 244 | } // end anonymous namespace
|
0 commit comments