Go to the documentation of this file.
31 size_t tell()
const {
return NextOffset; }
33 size_t allocateCallback(
size_t Size,
35 size_t Offset = NextOffset;
42 return allocateCallback(
48 Data.writeAsBinary(OS);
52 template <
typename T>
size_t allocateArray(
ArrayRef<T> Data) {
53 return allocateBytes({
reinterpret_cast<const uint8_t *
>(
Data.data()),
54 sizeof(
T) *
Data.size()});
57 template <
typename T,
typename RangeType>
58 std::pair<size_t, MutableArrayRef<T>>
61 template <
typename T>
size_t allocateObject(
const T &Data) {
65 template <
typename T,
typename... Types>
66 std::pair<size_t, T *> allocateNewObject(Types &&...
Args) {
67 T *
Object =
new (Temporaries.Allocate<
T>())
T(std::forward<Types>(
Args)...);
76 size_t NextOffset = 0;
83 template <
typename T,
typename RangeType>
84 std::pair<size_t, MutableArrayRef<T>>
86 size_t Num = std::distance(Range.
begin(), Range.
end());
88 std::uninitialized_copy(Range.
begin(), Range.
end(),
Array.begin());
89 return {allocateArray(Array),
Array};
92 size_t BlobAllocator::allocateString(
StringRef Str) {
95 assert(OK &&
"Invalid UTF8 in Str?");
102 allocateNewObject<support::ulittle32_t>(2 * (WStr.size() - 1)).first;
103 allocateNewArray<support::ulittle16_t>(
make_range(WStr.begin(), WStr.end()));
107 void BlobAllocator::writeTo(
raw_ostream &OS)
const {
108 size_t BeginOffset = OS.
tell();
109 for (
const auto &Callback : Callbacks)
111 assert(OS.
tell() == BeginOffset + NextOffset &&
112 "Callbacks wrote an unexpected number of bytes.");
122 File.allocateObject(
S.MDExceptionStream);
124 size_t DataEnd = File.tell();
133 S.MDExceptionStream.ThreadContext =
layout(File,
S.ThreadContext);
139 Range.Entry.Memory =
layout(File, Range.Content);
143 M.Entry.ModuleNameRVA =
File.allocateString(
M.Name);
145 M.Entry.CvRecord =
layout(File,
M.CvRecord);
146 M.Entry.MiscRecord =
layout(File,
M.MiscRecord);
150 T.Entry.Stack.Memory =
layout(File,
T.Stack);
151 T.Entry.Context =
layout(File,
T.Context);
154 template <
typename EntryT>
155 static size_t layout(BlobAllocator &File,
159 for (
auto &
E :
S.Entries)
160 File.allocateObject(
E.Entry);
162 size_t DataEnd = File.tell();
165 DataEnd = File.tell();
166 for (
auto &
E :
S.Entries)
174 Result.Type =
S.Type;
175 Result.Location.RVA = File.tell();
178 case Stream::StreamKind::Exception:
179 DataEnd =
layout(File, cast<MinidumpYAML::ExceptionStream>(
S));
181 case Stream::StreamKind::MemoryInfoList: {
185 InfoList.
Infos.size());
189 case Stream::StreamKind::MemoryList:
190 DataEnd =
layout(File, cast<MemoryListStream>(
S));
192 case Stream::StreamKind::ModuleList:
193 DataEnd =
layout(File, cast<ModuleListStream>(
S));
195 case Stream::StreamKind::RawContent: {
198 Raw.Content.writeAsBinary(OS);
199 assert(Raw.Content.binary_size() <= Raw.Size);
200 OS << std::string(Raw.Size - Raw.Content.binary_size(),
'\0');
204 case Stream::StreamKind::SystemInfo: {
208 DataEnd = File.tell();
212 case Stream::StreamKind::TextContent:
213 File.allocateArray(arrayRefFromStringRef(cast<TextContentStream>(
S).Text));
215 case Stream::StreamKind::ThreadList:
216 DataEnd =
layout(File, cast<ThreadListStream>(
S));
221 Result.Location.DataSize =
222 DataEnd.
getValueOr(File.tell()) - Result.Location.RVA;
232 File.allocateObject(Obj.
Header);
234 std::vector<Directory> StreamDirectory(Obj.
Streams.size());
uint64_t tell() const
tell - Return the current offset with the file.
This is an optimization pass for GlobalISel generic memory operations.
We currently emits eax Perhaps this is what we really should generate is Is imull three or four cycles eax eax The current instruction priority is based on pattern complexity The former is more complex because it folds a load so the latter will not be emitted Perhaps we should use AddedComplexity to give LEA32r a higher priority We should always try to match LEA first since the LEA matching code does some estimate to determine whether the match is profitable if we care more about code then imull is better It s two bytes shorter than movl leal On a Pentium M
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
The top level structure representing a minidump object, consisting of a minidump header,...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
static LocationDescriptor layout(BlobAllocator &File, yaml::BinaryRef Data)
detail::enumerator< R > enumerate(R &&TheRange)
Given an input range, returns a new range whose values are are pair (A,B) such that A is the 0-based ...
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...
A stream representing a list of abstract entries in a minidump stream.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
minidump::Header Header
The minidump header.
std::vector< std::unique_ptr< Stream > > Streams
The list of streams in this minidump object.
constexpr T getValueOr(U &&value) const &
This class implements an extremely fast bulk output stream that can only output to a stream.
An efficient, type-erasing, non-owning reference to a callable.
detail::packed_endian_specific_integral< uint32_t, little, unaligned > ulittle32_t
Allocate memory in an ever growing pool, as if by bump-pointer.
compiles ldr LCPI1_0 ldr ldr mov lsr tst moveq r1 ldr LCPI1_1 and r0 bx lr It would be better to do something like to fold the shift into the conditional move
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
print Print MemDeps of function
The base class for all minidump streams.
SystemInfo minidump stream.
std::vector< minidump::MemoryInfo > Infos
StringRef - Represent a constant reference to a string, i.e.
Specialized YAMLIO scalar type for representing a binary blob.
This class represents a YAML stream potentially containing multiple documents.
add sub stmia L5 ldr r0 bl L_printf $stub Instead of a and a wouldn t it be better to do three moves *Return an aggregate type is even return S
bool convertUTF8ToUTF16String(StringRef SrcUTF8, SmallVectorImpl< UTF16 > &DstUTF16)
Converts a UTF-8 string into a UTF-16 string with native endianness.
Specifies the location and type of a single stream in the minidump file.
bool yaml2minidump(MinidumpYAML::Object &Doc, raw_ostream &Out, ErrorHandler EH)
ArrayRef< T > makeArrayRef(const T &OneElt)
Construct an ArrayRef from a single element.
ExceptionStream minidump stream.
A minidump stream represented as a sequence of hex bytes.
A range adaptor for a pair of iterators.
support::ulittle32_t CSDVersionRVA
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
A structure containing the list of MemoryInfo entries comprising a MemoryInfoList stream.