32 size_t tell()
const {
return NextOffset; }
34 size_t allocateCallback(
size_t Size,
36 size_t Offset = NextOffset;
38 Callbacks.push_back(std::move(Callback));
43 return allocateCallback(
44 Data.size(), [Data](
raw_ostream &
OS) { OS << toStringRef(Data); });
48 return allocateCallback(Data.binary_size(), [Data](
raw_ostream &
OS) {
49 Data.writeAsBinary(OS);
53 template <
typename T>
size_t allocateArray(
ArrayRef<T> Data) {
54 return allocateBytes({
reinterpret_cast<const uint8_t *
>(Data.data()),
55 sizeof(
T) * Data.size()});
58 template <
typename T,
typename RangeType>
59 std::pair<size_t, MutableArrayRef<T>>
62 template <
typename T>
size_t allocateObject(
const T &Data) {
63 return allocateArray(
ArrayRef(Data));
66 template <
typename T,
typename...
Types>
67 std::pair<size_t, T *> allocateNewObject(Types &&... Args) {
68 T *
Object =
new (Temporaries.Allocate<
T>())
T(std::forward<Types>(Args)...);
77 size_t NextOffset = 0;
80 std::vector<std::function<void(
raw_ostream &)>> Callbacks;
84template <
typename T,
typename RangeType>
85std::pair<size_t, MutableArrayRef<T>>
87 size_t Num = std::distance(
Range.begin(),
Range.end());
90 return {allocateArray(Array),
Array};
93size_t BlobAllocator::allocateString(
StringRef Str) {
96 assert(OK &&
"Invalid UTF8 in Str?");
103 allocateNewObject<support::ulittle32_t>(2 * (WStr.
size() - 1)).first;
109 size_t BeginOffset =
OS.
tell();
110 for (
const auto &Callback : Callbacks)
113 "Callbacks wrote an unexpected number of bytes.");
125 size_t DataEnd = File.tell();
144 File.allocateObject(S.
Header);
146 File.allocateObject(E.Entry);
149 size_t DataEnd = File.tell();
151 File.allocateBytes(E.Content);
152 if (E.Entry.DataSize > E.Content.binary_size()) {
153 size_t Padding = E.Entry.DataSize - E.Content.binary_size();
155 OS << std::string(Padding,
'\0');
168 M.Entry.ModuleNameRVA =
File.allocateString(
M.Name);
170 M.Entry.CvRecord =
layout(File,
M.CvRecord);
171 M.Entry.MiscRecord =
layout(File,
M.MiscRecord);
175 T.Entry.Stack.Memory =
layout(File,
T.Stack);
176 T.Entry.Context =
layout(File,
T.Context);
179template <
typename EntryT>
185 File.allocateObject(E.Entry);
187 size_t DataEnd = File.tell();
190 DataEnd = File.tell();
199 Result.Type = S.
Type;
200 Result.Location.RVA = File.tell();
201 std::optional<size_t> DataEnd;
203 case Stream::StreamKind::Exception:
204 DataEnd =
layout(File, cast<MinidumpYAML::ExceptionStream>(S));
206 case Stream::StreamKind::MemoryInfoList: {
210 InfoList.
Infos.size());
214 case Stream::StreamKind::MemoryList:
215 DataEnd =
layout(File, cast<MemoryListStream>(S));
217 case Stream::StreamKind::Memory64List:
218 DataEnd =
layout(File, cast<Memory64ListStream>(S));
220 case Stream::StreamKind::ModuleList:
221 DataEnd =
layout(File, cast<ModuleListStream>(S));
223 case Stream::StreamKind::RawContent: {
226 Raw.Content.writeAsBinary(OS);
227 assert(Raw.Content.binary_size() <= Raw.Size);
228 OS << std::string(Raw.Size - Raw.Content.binary_size(),
'\0');
232 case Stream::StreamKind::SystemInfo: {
236 DataEnd = File.tell();
240 case Stream::StreamKind::TextContent:
241 File.allocateArray(arrayRefFromStringRef(cast<TextContentStream>(S).Text));
243 case Stream::StreamKind::ThreadList:
244 DataEnd =
layout(File, cast<ThreadListStream>(S));
249 Result.Location.DataSize =
250 DataEnd.value_or(File.tell()) - Result.Location.RVA;
260 File.allocateObject(Obj.
Header);
262 std::vector<Directory> StreamDirectory(Obj.
Streams.size());
static LocationDescriptor layout(BlobAllocator &File, yaml::BinaryRef Data)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Allocate memory in an ever growing pool, as if by bump-pointer.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
An efficient, type-erasing, non-owning reference to a callable.
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
uint64_t tell() const
tell - Return the current offset with the file.
Specialized YAMLIO scalar type for representing a binary blob.
This class represents a YAML stream potentially containing multiple documents.
detail::packed_endian_specific_integral< uint32_t, llvm::endianness::little, unaligned > ulittle32_t
bool yaml2minidump(MinidumpYAML::Object &Doc, raw_ostream &Out, ErrorHandler EH)
This is an optimization pass for GlobalISel generic memory operations.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
bool convertUTF8ToUTF16String(StringRef SrcUTF8, SmallVectorImpl< UTF16 > &DstUTF16)
Converts a UTF-8 string into a UTF-16 string with native endianness.
ExceptionStream minidump stream.
minidump::ExceptionStream MDExceptionStream
yaml::BinaryRef ThreadContext
minidump::Memory64ListHeader Header
A structure containing the list of MemoryInfo entries comprising a MemoryInfoList stream.
std::vector< minidump::MemoryInfo > Infos
The top level structure representing a minidump object, consisting of a minidump header,...
std::vector< std::unique_ptr< Stream > > Streams
The list of streams in this minidump object.
minidump::Header Header
The minidump header.
A minidump stream represented as a sequence of hex bytes.
The base class for all minidump streams.
const minidump::StreamType Type
SystemInfo minidump stream.
A stream representing a list of abstract entries in a minidump stream.
std::vector< entry_type > Entries
Specifies the location and type of a single stream in the minidump file.
LocationDescriptor ThreadContext
Specifies the location (and size) of various objects in the minidump file.
The SystemInfo stream, containing various information about the system where this minidump was genera...
support::ulittle32_t CSDVersionRVA
Common declarations for yaml2obj.