19template <
typename EndianType>
20static inline void mapOptional(yaml::IO &IO,
const char *Key, EndianType &Val,
21 typename EndianType::value_type
Default) {
22 IO.mapOptional(Key, Val, EndianType(
Default));
26template <
typename MapType,
typename EndianType>
29 MapType Mapped =
static_cast<typename EndianType::value_type
>(Val);
30 IO.mapRequired(Key, Mapped);
31 Val =
static_cast<typename EndianType::value_type
>(Mapped);
36template <
typename MapType,
typename EndianType>
37static inline void mapOptionalAs(yaml::IO &IO,
const char *Key, EndianType &Val,
39 MapType Mapped =
static_cast<typename EndianType::value_type
>(Val);
40 IO.mapOptional(Key, Mapped,
Default);
41 Val =
static_cast<typename EndianType::value_type
>(Mapped);
46template <
typename EndianType>
struct HexType;
47template <>
struct HexType<support::
ulittle16_t> {
using type = yaml::Hex16; };
48template <>
struct HexType<support::
ulittle32_t> {
using type = yaml::Hex32; };
49template <>
struct HexType<support::
ulittle64_t> {
using type = yaml::Hex64; };
53template <
typename EndianType>
56 mapRequiredAs<typename HexType<EndianType>::type>(IO, Key, Val);
61template <
typename EndianType>
64 typename EndianType::value_type
Default) {
65 mapOptionalAs<typename HexType<EndianType>::type>(IO, Key, Val,
Default);
72 case StreamType::Exception:
74 case StreamType::MemoryInfoList:
76 case StreamType::MemoryList:
78 case StreamType::ModuleList:
80 case StreamType::SystemInfo:
82 case StreamType::LinuxCPUInfo:
83 case StreamType::LinuxProcStatus:
84 case StreamType::LinuxLSBRelease:
85 case StreamType::LinuxCMDLine:
86 case StreamType::LinuxMaps:
87 case StreamType::LinuxProcStat:
88 case StreamType::LinuxProcUptime:
90 case StreamType::ThreadList:
101 return std::make_unique<ExceptionStream>();
103 return std::make_unique<MemoryInfoListStream>();
105 return std::make_unique<MemoryListStream>();
107 return std::make_unique<ModuleListStream>();
109 return std::make_unique<RawContentStream>(
Type);
111 return std::make_unique<SystemInfoStream>();
113 return std::make_unique<TextContentStream>(
Type);
115 return std::make_unique<ThreadListStream>();
120void yaml::ScalarBitSetTraits<MemoryProtection>::bitset(
122#define HANDLE_MDMP_PROTECT(CODE, NAME, NATIVENAME) \
123 IO.bitSetCase(Protect, #NATIVENAME, MemoryProtection::NAME);
124#include "llvm/BinaryFormat/MinidumpConstants.def"
127void yaml::ScalarBitSetTraits<MemoryState>::bitset(IO &IO,
MemoryState &State) {
128#define HANDLE_MDMP_MEMSTATE(CODE, NAME, NATIVENAME) \
129 IO.bitSetCase(State, #NATIVENAME, MemoryState::NAME);
130#include "llvm/BinaryFormat/MinidumpConstants.def"
133void yaml::ScalarBitSetTraits<MemoryType>::bitset(IO &IO,
MemoryType &
Type) {
134#define HANDLE_MDMP_MEMTYPE(CODE, NAME, NATIVENAME) \
135 IO.bitSetCase(Type, #NATIVENAME, MemoryType::NAME);
136#include "llvm/BinaryFormat/MinidumpConstants.def"
139void yaml::ScalarEnumerationTraits<ProcessorArchitecture>::enumeration(
141#define HANDLE_MDMP_ARCH(CODE, NAME) \
142 IO.enumCase(Arch, #NAME, ProcessorArchitecture::NAME);
143#include "llvm/BinaryFormat/MinidumpConstants.def"
144 IO.enumFallback<Hex16>(Arch);
147void yaml::ScalarEnumerationTraits<OSPlatform>::enumeration(IO &IO,
149#define HANDLE_MDMP_PLATFORM(CODE, NAME) \
150 IO.enumCase(Plat, #NAME, OSPlatform::NAME);
151#include "llvm/BinaryFormat/MinidumpConstants.def"
152 IO.enumFallback<Hex32>(Plat);
155void yaml::ScalarEnumerationTraits<StreamType>::enumeration(IO &IO,
157#define HANDLE_MDMP_STREAM_TYPE(CODE, NAME) \
158 IO.enumCase(Type, #NAME, StreamType::NAME);
159#include "llvm/BinaryFormat/MinidumpConstants.def"
160 IO.enumFallback<Hex32>(
Type);
170template <std::
size_t N>
struct FixedSizeHex {
171 FixedSizeHex(uint8_t (&Storage)[
N]) : Storage(Storage) {}
173 uint8_t (&Storage)[
N];
179template <std::
size_t N>
struct ScalarTraits<FixedSizeHex<
N>> {
186 return "Invalid hex digit in input";
187 if (Scalar.size() < 2 *
N)
188 return "String too short";
189 if (Scalar.size() > 2 *
N)
190 return "String too long";
201 FixedSizeHex<
sizeof(
Info.ProcessorFeatures)> Features(
Info.ProcessorFeatures);
202 IO.mapRequired(
"Features", Features);
207template <std::
size_t N>
struct FixedSizeString {
208 FixedSizeString(
char (&Storage)[
N]) : Storage(Storage) {}
216template <std::
size_t N>
struct ScalarTraits<FixedSizeString<
N>> {
222 if (Scalar.size() <
N)
223 return "String too short";
224 if (Scalar.size() >
N)
225 return "String too long";
237 FixedSizeString<
sizeof(
Info.VendorID)> VendorID(
Info.VendorID);
238 IO.mapRequired(
"Vendor ID", VendorID);
248 mapRequiredAs<MemoryProtection>(IO,
"Allocation Protect",
249 Info.AllocationProtect);
252 mapRequiredAs<MemoryState>(IO,
"State",
Info.State);
253 mapOptionalAs<MemoryProtection>(IO,
"Protect",
Info.Protect,
254 Info.AllocationProtect);
255 mapRequiredAs<MemoryType>(IO,
"Type",
Info.Type);
281 mapOptional(IO,
"Time Date Stamp",
M.Entry.TimeDateStamp, 0);
282 IO.mapRequired(
"Module Name",
M.Name);
284 IO.mapRequired(
"CodeView Record",
M.CvRecord);
291 IO.mapOptional(
"Content",
Stream.Content);
292 IO.mapOptional(
"Size",
Stream.Size,
Stream.Content.binary_size());
297 return "Stream size must be greater or equal to the content size";
303 MappingContextTraits<MemoryDescriptor, yaml::BinaryRef>::mapping(
308 IO.mapRequired(
"Memory Ranges",
Stream.Infos);
312 IO.mapRequired(
"Memory Ranges",
Stream.Entries);
316 IO.mapRequired(
"Modules",
Stream.Entries);
321 IO.mapRequired(
"Processor Arch",
Info.ProcessorArch);
324 IO.mapOptional(
"Number of Processors",
Info.NumberOfProcessors, 0);
325 IO.mapOptional(
"Product type",
Info.ProductType, 0);
329 IO.mapRequired(
"Platform ID",
Info.PlatformId);
330 IO.mapOptional(
"CSD Version",
Stream.CSDVersion,
"");
334 case ProcessorArchitecture::X86:
335 case ProcessorArchitecture::AMD64:
336 IO.mapOptional(
"CPU",
Info.CPU.X86);
338 case ProcessorArchitecture::ARM:
339 case ProcessorArchitecture::ARM64:
340 case ProcessorArchitecture::BP_ARM64:
341 IO.mapOptional(
"CPU",
Info.CPU.Arm);
344 IO.mapOptional(
"CPU",
Info.CPU.Other);
350 IO.mapOptional(
"Text",
Stream.Text);
353void yaml::MappingContextTraits<MemoryDescriptor, yaml::BinaryRef>::mapping(
356 IO.mapRequired(
"Content",
Content);
366 IO.mapRequired(
"Context",
T.Context);
367 IO.mapRequired(
"Stack",
T.Entry.Stack,
T.Stack);
371 IO.mapRequired(
"Threads",
Stream.Entries);
376 IO.mapRequired(
"Exception Record",
Stream.MDExceptionStream.ExceptionRecord);
377 IO.mapRequired(
"Thread Context",
Stream.ThreadContext);
401 yaml::IO &IO, std::unique_ptr<MinidumpYAML::Stream> &S) {
405 IO.mapRequired(
"Type",
Type);
407 if (!IO.outputting())
411 streamMapping(IO, llvm::cast<MinidumpYAML::ExceptionStream>(*S));
438 yaml::IO &IO, std::unique_ptr<MinidumpYAML::Stream> &S) {
455 IO.mapTag(
"!minidump",
true);
459 IO.mapRequired(
"Streams",
O.Streams);
468 File.getExceptionStream();
469 if (!ExpectedExceptionStream)
470 return ExpectedExceptionStream.
takeError();
472 File.getRawData(ExpectedExceptionStream->ThreadContext);
473 if (!ExpectedThreadContext)
474 return ExpectedThreadContext.
takeError();
475 return std::make_unique<ExceptionStream>(*ExpectedExceptionStream,
476 *ExpectedThreadContext);
479 if (
auto ExpectedList = File.getMemoryInfoList())
480 return std::make_unique<MemoryInfoListStream>(*ExpectedList);
482 return ExpectedList.takeError();
485 auto ExpectedList = File.getMemoryList();
487 return ExpectedList.takeError();
488 std::vector<MemoryListStream::entry_type> Ranges;
490 auto ExpectedContent = File.getRawData(MD.Memory);
491 if (!ExpectedContent)
492 return ExpectedContent.takeError();
493 Ranges.push_back({MD, *ExpectedContent});
495 return std::make_unique<MemoryListStream>(std::move(Ranges));
498 auto ExpectedList = File.getModuleList();
500 return ExpectedList.takeError();
501 std::vector<ModuleListStream::entry_type> Modules;
502 for (
const Module &M : *ExpectedList) {
503 auto ExpectedName = File.getString(M.ModuleNameRVA);
505 return ExpectedName.takeError();
506 auto ExpectedCv = File.getRawData(M.CvRecord);
508 return ExpectedCv.takeError();
509 auto ExpectedMisc = File.getRawData(M.MiscRecord);
511 return ExpectedMisc.takeError();
513 {M, std::move(*ExpectedName), *ExpectedCv, *ExpectedMisc});
515 return std::make_unique<ModuleListStream>(std::move(Modules));
518 return std::make_unique<RawContentStream>(StreamDesc.
Type,
519 File.getRawStream(StreamDesc));
521 auto ExpectedInfo = File.getSystemInfo();
523 return ExpectedInfo.takeError();
524 auto ExpectedCSDVersion = File.getString(ExpectedInfo->CSDVersionRVA);
525 if (!ExpectedCSDVersion)
526 return ExpectedInfo.takeError();
527 return std::make_unique<SystemInfoStream>(*ExpectedInfo,
528 std::move(*ExpectedCSDVersion));
531 return std::make_unique<TextContentStream>(
534 auto ExpectedList = File.getThreadList();
536 return ExpectedList.takeError();
537 std::vector<ThreadListStream::entry_type> Threads;
538 for (
const Thread &
T : *ExpectedList) {
539 auto ExpectedStack = File.getRawData(
T.Stack.Memory);
541 return ExpectedStack.takeError();
542 auto ExpectedContext = File.getRawData(
T.Context);
543 if (!ExpectedContext)
544 return ExpectedContext.takeError();
545 Threads.push_back({
T, *ExpectedStack, *ExpectedContext});
547 return std::make_unique<ThreadListStream>(std::move(Threads));
554 std::vector<std::unique_ptr<Stream>>
Streams;
555 Streams.reserve(File.streams().size());
556 for (
const Directory &StreamDesc : File.streams()) {
559 return ExpectedStream.takeError();
560 Streams.push_back(std::move(*ExpectedStream));
This file defines the BumpPtrAllocator interface.
Analysis containing CSE Info
static void mapOptionalHex(yaml::IO &IO, const char *Key, EndianType &Val, typename EndianType::value_type Default)
Perform an optional yaml-mapping of an endian-aware type as an appropriately-sized hex value.
static void mapRequiredAs(yaml::IO &IO, const char *Key, EndianType &Val)
Yaml-map an endian-aware type EndianType as some other type MapType.
static std::string streamValidate(RawContentStream &Stream)
static void mapOptionalAs(yaml::IO &IO, const char *Key, EndianType &Val, MapType Default)
Perform an optional yaml-mapping of an endian-aware type EndianType as some other type MapType.
static void mapRequiredHex(yaml::IO &IO, const char *Key, EndianType &Val)
Yaml-map an endian-aware type as an appropriately-sized hex value.
static void streamMapping(yaml::IO &IO, RawContentStream &Stream)
static void mapOptional(yaml::IO &IO, const char *Key, EndianType &Val, typename EndianType::value_type Default)
Perform an optional yaml-mapping of an endian-aware type EndianType.
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
static bool isHexDigit(const char C)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
A Module instance is used to store all the information related to an LLVM module.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
StringRef - Represent a constant reference to a string, i.e.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
void toVector(SmallVectorImpl< char > &Out) const
Append the concatenated string into the given SmallString or SmallVector.
The instances of the Type class are immutable: once they are created, they are never changed.
Type(LLVMContext &C, TypeID tid)
A class providing access to the contents of a minidump file.
This class implements an extremely fast bulk output stream that can only output to a stream.
This class provides various memory handling functions that manipulate MemoryBlock instances.
Specialized YAMLIO scalar type for representing a binary blob.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
StringRef toStringRef(const std::optional< DWARFFormValue > &V, StringRef Default={})
Take an optional DWARFFormValue and try to extract a string value from it.
ProcessorArchitecture
The processor architecture of the system that generated this minidump.
StreamType
The type of a minidump stream identifies its contents.
OSPlatform
The OS Platform of the system that generated this minidump.
detail::packed_endian_specific_integral< uint16_t, llvm::endianness::little, unaligned > ulittle16_t
detail::packed_endian_specific_integral< uint32_t, llvm::endianness::little, unaligned > ulittle32_t
detail::packed_endian_specific_integral< uint64_t, llvm::endianness::little, unaligned > ulittle64_t
This is an optimization pass for GlobalISel generic memory operations.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
OutputIt copy(R &&Range, OutputIt Out)
ExceptionStream minidump stream.
A structure containing the list of MemoryInfo entries comprising a MemoryInfoList stream.
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.
static Expected< Object > create(const object::MinidumpFile &File)
A minidump stream represented as a sequence of hex bytes.
The base class for all minidump streams.
static std::unique_ptr< Stream > create(minidump::StreamType Type)
Create an empty stream of the given Type.
static StreamKind getKind(minidump::StreamType Type)
Get the stream Kind used for representing streams of a given Type.
SystemInfo minidump stream.
A StringRef, which is printed using YAML block notation.
A stream representing a list of abstract entries in a minidump stream.
Specifies the location and type of a single stream in the minidump file.
support::little_t< StreamType > Type
static constexpr size_t MaxParameters
support::ulittle32_t ExceptionFlags
support::ulittle32_t NumberParameters
support::ulittle64_t ExceptionInformation[MaxParameters]
support::ulittle64_t ExceptionRecord
support::ulittle64_t ExceptionAddress
support::ulittle32_t ExceptionCode
Describes a single memory range (both its VM address and where to find it in the file) of the process...
The SystemInfo stream, containing various information about the system where this minidump was genera...
Describes a single thread in the minidump file.
static QuotingType mustQuote(StringRef S)
static StringRef input(StringRef Scalar, void *, FixedSizeHex< N > &Fixed)
static void output(const FixedSizeHex< N > &Fixed, void *, raw_ostream &OS)
static QuotingType mustQuote(StringRef S)
static StringRef input(StringRef Scalar, void *, FixedSizeString< N > &Fixed)
static void output(const FixedSizeString< N > &Fixed, void *, raw_ostream &OS)