17 std::optional<ArrayRef<uint8_t>>
19 auto It = StreamMap.find(
Type);
20 if (It != StreamMap.end())
21 return getRawStream(Streams[It->second]);
30 getDataSliceAs<support::ulittle32_t>(getData(), Offset, 1);
32 return ExpectedSize.takeError();
33 size_t Size = (*ExpectedSize)[0];
42 getDataSliceAs<support::ulittle16_t>(getData(), Offset, Size);
44 return ExpectedData.takeError();
47 copy(*ExpectedData, WStr.begin());
58 std::optional<ArrayRef<uint8_t>> Stream =
59 getRawStream(StreamType::MemoryInfoList);
63 getDataSliceAs<minidump::MemoryInfoListHeader>(*Stream, 0, 1);
65 return ExpectedHeader.takeError();
68 getDataSlice(*Stream,
H.SizeOfHeader,
H.SizeOfEntry *
H.NumberOfEntries);
70 return Data.takeError();
77 std::optional<ArrayRef<uint8_t>> Stream = getRawStream(
Type);
80 auto ExpectedSize = getDataSliceAs<support::ulittle32_t>(*Stream, 0, 1);
82 return ExpectedSize.takeError();
84 size_t ListSize = ExpectedSize.get()[0];
86 size_t ListOffset = 4;
90 if (ListOffset +
sizeof(
T) * ListSize < Stream->
size())
93 return getDataSliceAs<T>(*Stream, ListOffset, ListSize);
100 MinidumpFile::getListStream(
StreamType)
const;
105 if (Offset + Size < Offset || Offset + Size < Size ||
106 Offset + Size >
Data.size())
107 return createEOFError();
108 return Data.slice(Offset, Size);
114 auto ExpectedHeader = getDataSliceAs<minidump::Header>(
Data, 0, 1);
116 return ExpectedHeader.takeError();
119 if (Hdr.
Signature != Header::MagicSignature)
121 if ((Hdr.
Version & 0xffff) != Header::MagicVersion)
126 if (!ExpectedStreams)
127 return ExpectedStreams.takeError();
130 for (
const auto &StreamDescriptor :
llvm::enumerate(*ExpectedStreams)) {
147 return createError(
"Cannot handle one of the minidump streams");
154 return std::unique_ptr<MinidumpFile>(