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();
140 Range.Entry.Memory =
layout(File, Range.Content);
144 M.Entry.ModuleNameRVA =
File.allocateString(
M.Name);
146 M.Entry.CvRecord =
layout(File,
M.CvRecord);
147 M.Entry.MiscRecord =
layout(File,
M.MiscRecord);
151 T.Entry.Stack.Memory =
layout(File,
T.Stack);
152 T.Entry.Context =
layout(File,
T.Context);
155template <
typename EntryT>
161 File.allocateObject(
E.Entry);
163 size_t DataEnd = File.tell();
166 DataEnd = File.tell();
175 Result.Type = S.
Type;
176 Result.Location.RVA = File.tell();
177 std::optional<size_t> DataEnd;
179 case Stream::StreamKind::Exception:
180 DataEnd =
layout(File, cast<MinidumpYAML::ExceptionStream>(S));
182 case Stream::StreamKind::MemoryInfoList: {
186 InfoList.
Infos.size());
190 case Stream::StreamKind::MemoryList:
191 DataEnd =
layout(File, cast<MemoryListStream>(S));
193 case Stream::StreamKind::ModuleList:
194 DataEnd =
layout(File, cast<ModuleListStream>(S));
196 case Stream::StreamKind::RawContent: {
199 Raw.Content.writeAsBinary(OS);
200 assert(Raw.Content.binary_size() <= Raw.Size);
201 OS << std::string(Raw.Size - Raw.Content.binary_size(),
'\0');
205 case Stream::StreamKind::SystemInfo: {
209 DataEnd = File.tell();
213 case Stream::StreamKind::TextContent:
214 File.allocateArray(arrayRefFromStringRef(cast<TextContentStream>(S).Text));
216 case Stream::StreamKind::ThreadList:
217 DataEnd =
layout(File, cast<ThreadListStream>(S));
222 Result.Location.DataSize =
223 DataEnd.value_or(File.tell()) - Result.Location.RVA;
233 File.allocateObject(Obj.
Header);
235 std::vector<Directory> StreamDirectory(Obj.
Streams.size());
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static LocationDescriptor layout(BlobAllocator &File, yaml::BinaryRef Data)
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 are tuples (A,...
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
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.