MinidumpTypes.h revision 314564
1193323Sed//===-- MinidumpTypes.h -----------------------------------------*- C++ -*-===//
2193323Sed//
3353358Sdim//                     The LLVM Compiler Infrastructure
4353358Sdim//
5353358Sdim// This file is distributed under the University of Illinois Open Source
6193323Sed// License. See LICENSE.TXT for details.
7193323Sed//
8193323Sed//===----------------------------------------------------------------------===//
9193323Sed
10193323Sed#ifndef liblldb_MinidumpTypes_h_
11193323Sed#define liblldb_MinidumpTypes_h_
12193323Sed
13193323Sed// Project includes
14193323Sed
15193323Sed// Other libraries and framework includes
16193323Sed#include "lldb/Core/Error.h"
17288943Sdim
18193323Sed#include "llvm/ADT/ArrayRef.h"
19193323Sed#include "llvm/ADT/BitmaskEnum.h"
20193323Sed#include "llvm/ADT/Optional.h"
21193323Sed#include "llvm/ADT/SmallVector.h"
22309124Sdim#include "llvm/ADT/StringRef.h"
23314564Sdim#include "llvm/Support/ConvertUTF.h"
24261991Sdim#include "llvm/Support/Endian.h"
25309124Sdim
26309124Sdim// C includes
27309124Sdim// C++ includes
28261991Sdim
29261991Sdim// Reference:
30261991Sdim// https://msdn.microsoft.com/en-us/library/windows/desktop/ms679293(v=vs.85).aspx
31309124Sdim// https://chromium.googlesource.com/breakpad/breakpad/
32193323Sed
33234353Sdimnamespace lldb_private {
34234353Sdim
35321369Sdimnamespace minidump {
36276479Sdim
37193323SedLLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
38193323Sed
39193323Sedenum class MinidumpHeaderConstants : uint32_t {
40212904Sdim  Signature = 0x504d444d, // 'PMDM'
41193323Sed  Version = 0x0000a793,   // 42899
42193323Sed  LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ Signature)
43193323Sed
44193323Sed};
45193323Sed
46212904Sdim// Reference:
47206124Srdivacky// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680394.aspx
48206124Srdivackyenum class MinidumpStreamType : uint32_t {
49206124Srdivacky  Unused = 0,
50193323Sed  Reserved0 = 1,
51288943Sdim  Reserved1 = 2,
52288943Sdim  ThreadList = 3,
53288943Sdim  ModuleList = 4,
54288943Sdim  MemoryList = 5,
55314564Sdim  Exception = 6,
56314564Sdim  SystemInfo = 7,
57314564Sdim  ThreadExList = 8,
58314564Sdim  Memory64List = 9,
59321369Sdim  CommentA = 10,
60321369Sdim  CommentW = 11,
61321369Sdim  HandleData = 12,
62314564Sdim  FunctionTable = 13,
63276479Sdim  UnloadedModuleList = 14,
64276479Sdim  MiscInfo = 15,
65321369Sdim  MemoryInfoList = 16,
66276479Sdim  ThreadInfoList = 17,
67321369Sdim  HandleOperationList = 18,
68321369Sdim  Token = 19,
69321369Sdim  JavascriptData = 20,
70321369Sdim  SystemMemoryInfo = 21,
71280031Sdim  ProcessVMCounters = 22,
72280031Sdim  LastReserved = 0x0000ffff,
73280031Sdim
74276479Sdim  /* Breakpad extension types.  0x4767 = "Gg" */
75234353Sdim  BreakpadInfo = 0x47670001,
76212904Sdim  AssertionInfo = 0x47670002,
77193323Sed  /* These are additional minidump stream values which are specific to
78234353Sdim   * the linux breakpad implementation.   */
79212904Sdim  LinuxCPUInfo = 0x47670003,    /* /proc/cpuinfo      */
80193323Sed  LinuxProcStatus = 0x47670004, /* /proc/$x/status    */
81276479Sdim  LinuxLSBRelease = 0x47670005, /* /etc/lsb-release   */
82276479Sdim  LinuxCMDLine = 0x47670006,    /* /proc/$x/cmdline   */
83276479Sdim  LinuxEnviron = 0x47670007,    /* /proc/$x/environ   */
84321369Sdim  LinuxAuxv = 0x47670008,       /* /proc/$x/auxv      */
85321369Sdim  LinuxMaps = 0x47670009,       /* /proc/$x/maps      */
86321369Sdim  LinuxDSODebug = 0x4767000A
87218893Sdim};
88218893Sdim
89218893Sdim// for MinidumpSystemInfo.processor_arch
90234353Sdimenum class MinidumpCPUArchitecture : uint16_t {
91234353Sdim  X86 = 0,         /* PROCESSOR_ARCHITECTURE_INTEL */
92234353Sdim  MIPS = 1,        /* PROCESSOR_ARCHITECTURE_MIPS */
93234353Sdim  Alpha = 2,       /* PROCESSOR_ARCHITECTURE_ALPHA */
94234353Sdim  PPC = 3,         /* PROCESSOR_ARCHITECTURE_PPC */
95193323Sed  SHX = 4,         /* PROCESSOR_ARCHITECTURE_SHX (Super-H) */
96193323Sed  ARM = 5,         /* PROCESSOR_ARCHITECTURE_ARM */
97193323Sed  IA64 = 6,        /* PROCESSOR_ARCHITECTURE_IA64 */
98212904Sdim  Alpha64 = 7,     /* PROCESSOR_ARCHITECTURE_ALPHA64 */
99212904Sdim  MSIL = 8,        /* PROCESSOR_ARCHITECTURE_MSIL
100239462Sdim                                              * (Microsoft Intermediate Language) */
101239462Sdim  AMD64 = 9,       /* PROCESSOR_ARCHITECTURE_AMD64 */
102239462Sdim  X86Win64 = 10,   /* PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 (WoW64) */
103239462Sdim  SPARC = 0x8001,  /* Breakpad-defined value for SPARC */
104218893Sdim  PPC64 = 0x8002,  /* Breakpad-defined value for PPC64 */
105218893Sdim  ARM64 = 0x8003,  /* Breakpad-defined value for ARM64 */
106218893Sdim  MIPS64 = 0x8004, /* Breakpad-defined value for MIPS64 */
107234353Sdim  Unknown = 0xffff /* PROCESSOR_ARCHITECTURE_UNKNOWN */
108193323Sed};
109193323Sed
110212904Sdim// for MinidumpSystemInfo.platform_id
111193323Sedenum class MinidumpOSPlatform : uint32_t {
112234353Sdim  Win32S = 0,       /* VER_PLATFORM_WIN32s (Windows 3.1) */
113234353Sdim  Win32Windows = 1, /* VER_PLATFORM_WIN32_WINDOWS (Windows 95-98-Me) */
114226633Sdim  Win32NT = 2,      /* VER_PLATFORM_WIN32_NT (Windows NT, 2000+) */
115234353Sdim  Win32CE = 3,      /* VER_PLATFORM_WIN32_CE, VER_PLATFORM_WIN32_HH
116234353Sdim                                  * (Windows CE, Windows Mobile, "Handheld") */
117234353Sdim
118234353Sdim  /* The following values are Breakpad-defined. */
119234353Sdim  Unix = 0x8000,    /* Generic Unix-ish */
120234353Sdim  MacOSX = 0x8101,  /* Mac OS X/Darwin */
121276479Sdim  IOS = 0x8102,     /* iOS */
122276479Sdim  Linux = 0x8201,   /* Linux */
123276479Sdim  Solaris = 0x8202, /* Solaris */
124218893Sdim  Android = 0x8203, /* Android */
125218893Sdim  PS3 = 0x8204,     /* PS3 */
126218893Sdim  NaCl = 0x8205     /* Native Client (NaCl) */
127218893Sdim};
128288943Sdim
129288943Sdim// For MinidumpCPUInfo.arm_cpu_info.elf_hwcaps.
130288943Sdim// This matches the Linux kernel definitions from <asm/hwcaps.h>
131288943Sdimenum class MinidumpPCPUInformationARMElfHwCaps : uint32_t {
132321369Sdim  SWP = (1 << 0),
133321369Sdim  Half = (1 << 1),
134321369Sdim  Thumb = (1 << 2),
135321369Sdim  _26BIT = (1 << 3),
136314564Sdim  FastMult = (1 << 4),
137314564Sdim  FPA = (1 << 5),
138314564Sdim  VFP = (1 << 6),
139321369Sdim  EDSP = (1 << 7),
140321369Sdim  Java = (1 << 8),
141321369Sdim  IWMMXT = (1 << 9),
142239462Sdim  Crunch = (1 << 10),
143239462Sdim  ThumbEE = (1 << 11),
144239462Sdim  Neon = (1 << 12),
145239462Sdim  VFPv3 = (1 << 13),
146234353Sdim  VFPv3D16 = (1 << 14),
147193323Sed  TLS = (1 << 15),
148212904Sdim  VFPv4 = (1 << 16),
149193323Sed  IDIVA = (1 << 17),
150234353Sdim  IDIVT = (1 << 18),
151234353Sdim  LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ IDIVT)
152193323Sed};
153309124Sdim
154309124Sdimenum class MinidumpMiscInfoFlags : uint32_t {
155309124Sdim  ProcessID = (1 << 0),
156341825Sdim  ProcessTimes = (1 << 1),
157341825Sdim  LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ ProcessTimes)
158341825Sdim};
159207618Srdivacky
160207618Srdivackytemplate <typename T>
161207618SrdivackyError consumeObject(llvm::ArrayRef<uint8_t> &Buffer, const T *&Object) {
162207618Srdivacky  Error error;
163207618Srdivacky  if (Buffer.size() < sizeof(T)) {
164218893Sdim    error.SetErrorString("Insufficient buffer!");
165218893Sdim    return error;
166218893Sdim  }
167218893Sdim
168218893Sdim  Object = reinterpret_cast<const T *>(Buffer.data());
169218893Sdim  Buffer = Buffer.drop_front(sizeof(T));
170218893Sdim  return error;
171218893Sdim}
172218893Sdim
173218893Sdim// parse a MinidumpString which is with UTF-16
174193323Sed// Reference:
175193323Sed// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680395(v=vs.85).aspx
176193323Sedllvm::Optional<std::string> parseMinidumpString(llvm::ArrayRef<uint8_t> &data);
177218893Sdim
178193323Sed// Reference:
179234353Sdim// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680378(v=vs.85).aspx
180193323Sedstruct MinidumpHeader {
181234353Sdim  llvm::support::ulittle32_t signature;
182321369Sdim  llvm::support::ulittle32_t
183212904Sdim      version; // The high 16 bits of version field are implementation specific
184234353Sdim  llvm::support::ulittle32_t streams_count;
185226633Sdim  llvm::support::ulittle32_t
186234353Sdim      stream_directory_rva; // offset of the stream directory
187193323Sed  llvm::support::ulittle32_t checksum;
188309124Sdim  llvm::support::ulittle32_t time_date_stamp; // time_t format
189309124Sdim  llvm::support::ulittle64_t flags;
190309124Sdim
191309124Sdim  static const MinidumpHeader *Parse(llvm::ArrayRef<uint8_t> &data);
192198396Srdivacky};
193198396Srdivackystatic_assert(sizeof(MinidumpHeader) == 32,
194234353Sdim              "sizeof MinidumpHeader is not correct!");
195193323Sed
196234353Sdim// Reference:
197193323Sed// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680383.aspx
198193323Sedstruct MinidumpLocationDescriptor {
199193323Sed  llvm::support::ulittle32_t data_size;
200234353Sdim  llvm::support::ulittle32_t rva;
201193323Sed};
202314564Sdimstatic_assert(sizeof(MinidumpLocationDescriptor) == 8,
203314564Sdim              "sizeof MinidumpLocationDescriptor is not correct!");
204314564Sdim
205314564Sdim// Reference:
206239462Sdim// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680384(v=vs.85).aspx
207239462Sdimstruct MinidumpMemoryDescriptor {
208239462Sdim  llvm::support::ulittle64_t start_of_memory_range;
209288943Sdim  MinidumpLocationDescriptor memory;
210288943Sdim
211288943Sdim  static llvm::ArrayRef<MinidumpMemoryDescriptor>
212288943Sdim  ParseMemoryList(llvm::ArrayRef<uint8_t> &data);
213234353Sdim};
214199989Srdivackystatic_assert(sizeof(MinidumpMemoryDescriptor) == 16,
215234353Sdim              "sizeof MinidumpMemoryDescriptor is not correct!");
216199989Srdivacky
217341825Sdimstruct MinidumpMemoryDescriptor64 {
218341825Sdim  llvm::support::ulittle64_t start_of_memory_range;
219341825Sdim  llvm::support::ulittle64_t data_size;
220341825Sdim
221239462Sdim  static std::pair<llvm::ArrayRef<MinidumpMemoryDescriptor64>, uint64_t>
222239462Sdim  ParseMemory64List(llvm::ArrayRef<uint8_t> &data);
223239462Sdim};
224239462Sdimstatic_assert(sizeof(MinidumpMemoryDescriptor64) == 16,
225239462Sdim              "sizeof MinidumpMemoryDescriptor64 is not correct!");
226239462Sdim
227239462Sdim// Reference:
228239462Sdim// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680365.aspx
229360784Sdimstruct MinidumpDirectory {
230360784Sdim  llvm::support::ulittle32_t stream_type;
231360784Sdim  MinidumpLocationDescriptor location;
232360784Sdim};
233280031Sdimstatic_assert(sizeof(MinidumpDirectory) == 12,
234280031Sdim              "sizeof MinidumpDirectory is not correct!");
235280031Sdim
236280031Sdim// Reference:
237243830Sdim// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680385(v=vs.85).aspx
238243830Sdimstruct MinidumpMemoryInfoListHeader {
239243830Sdim  llvm::support::ulittle32_t size_of_header;
240243830Sdim  llvm::support::ulittle32_t size_of_entry;
241234353Sdim  llvm::support::ulittle64_t num_of_entries;
242234353Sdim};
243193323Sedstatic_assert(sizeof(MinidumpMemoryInfoListHeader) == 16,
244314564Sdim              "sizeof MinidumpMemoryInfoListHeader is not correct!");
245314564Sdim
246288943Sdim// Reference:
247234353Sdim// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680386(v=vs.85).aspx
248234353Sdimstruct MinidumpMemoryInfo {
249234353Sdim  llvm::support::ulittle64_t base_address;
250234353Sdim  llvm::support::ulittle64_t allocation_base;
251234353Sdim  llvm::support::ulittle32_t allocation_protect;
252234353Sdim  llvm::support::ulittle32_t alignment1;
253234353Sdim  llvm::support::ulittle64_t region_size;
254234353Sdim  llvm::support::ulittle32_t state;
255234353Sdim  llvm::support::ulittle32_t protect;
256288943Sdim  llvm::support::ulittle32_t type;
257288943Sdim  llvm::support::ulittle32_t alignment2;
258193323Sed
259212904Sdim  static std::vector<const MinidumpMemoryInfo *>
260288943Sdim  ParseMemoryInfoList(llvm::ArrayRef<uint8_t> &data);
261288943Sdim};
262288943Sdimstatic_assert(sizeof(MinidumpMemoryInfo) == 48,
263288943Sdim              "sizeof MinidumpMemoryInfo is not correct!");
264288943Sdim
265234353Sdimenum class MinidumpMemoryInfoState : uint32_t {
266234353Sdim  MemCommit = 0x1000,
267234353Sdim  MemFree = 0x10000,
268234353Sdim  MemReserve = 0x2000,
269234353Sdim  LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ MemFree)
270212904Sdim};
271193323Sed
272212904Sdimenum class MinidumpMemoryInfoType : uint32_t {
273198090Srdivacky  MemImage = 0x1000000,
274212904Sdim  MemMapped = 0x40000,
275234353Sdim  MemPrivate = 0x20000,
276234353Sdim  LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ MemImage)
277204642Srdivacky};
278360784Sdim
279360784Sdim// Reference:
280360784Sdim// https://msdn.microsoft.com/en-us/library/windows/desktop/aa366786(v=vs.85).aspx
281360784Sdimenum class MinidumpMemoryProtectionContants : uint32_t {
282360784Sdim  PageExecute = 0x10,
283288943Sdim  PageExecuteRead = 0x20,
284288943Sdim  PageExecuteReadWrite = 0x40,
285288943Sdim  PageExecuteWriteCopy = 0x80,
286288943Sdim  PageNoAccess = 0x01,
287341825Sdim  PageReadOnly = 0x02,
288234353Sdim  PageReadWrite = 0x04,
289193323Sed  PageWriteCopy = 0x08,
290341825Sdim  PageTargetsInvalid = 0x40000000,
291341825Sdim  PageTargetsNoUpdate = 0x40000000,
292341825Sdim
293341825Sdim  PageWritable = PageExecuteReadWrite | PageExecuteWriteCopy | PageReadWrite |
294234353Sdim                 PageWriteCopy,
295234353Sdim  PageExecutable = PageExecute | PageExecuteRead | PageExecuteReadWrite |
296193323Sed                   PageExecuteWriteCopy,
297234353Sdim  LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ PageTargetsInvalid)
298234353Sdim};
299234353Sdim
300234353Sdim// Reference:
301234353Sdim// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680517(v=vs.85).aspx
302212904Sdimstruct MinidumpThread {
303234353Sdim  llvm::support::ulittle32_t thread_id;
304202375Srdivacky  llvm::support::ulittle32_t suspend_count;
305234353Sdim  llvm::support::ulittle32_t priority_class;
306203954Srdivacky  llvm::support::ulittle32_t priority;
307234353Sdim  llvm::support::ulittle64_t teb;
308203954Srdivacky  MinidumpMemoryDescriptor stack;
309234353Sdim  MinidumpLocationDescriptor thread_context;
310234353Sdim
311193323Sed  static const MinidumpThread *Parse(llvm::ArrayRef<uint8_t> &data);
312341825Sdim
313296417Sdim  static llvm::ArrayRef<MinidumpThread>
314296417Sdim  ParseThreadList(llvm::ArrayRef<uint8_t> &data);
315309124Sdim};
316309124Sdimstatic_assert(sizeof(MinidumpThread) == 48,
317309124Sdim              "sizeof MinidumpThread is not correct!");
318309124Sdim
319321369Sdim// Reference:
320321369Sdim// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680396(v=vs.85).aspx
321321369Sdimunion MinidumpCPUInfo {
322341825Sdim  struct {
323309124Sdim    llvm::support::ulittle32_t vendor_id[3];        /* cpuid 0: ebx, edx, ecx */
324309124Sdim    llvm::support::ulittle32_t version_information; /* cpuid 1: eax */
325193323Sed    llvm::support::ulittle32_t feature_information; /* cpuid 1: edx */
326234353Sdim    llvm::support::ulittle32_t
327321369Sdim        amd_extended_cpu_features; /* cpuid 0x80000001, ebx */
328193323Sed  } x86_cpu_info;
329193323Sed  struct {
330193323Sed    llvm::support::ulittle32_t cpuid;
331234353Sdim    llvm::support::ulittle32_t elf_hwcaps; /* linux specific, 0 otherwise */
332280031Sdim  } arm_cpu_info;
333193323Sed  struct {
334193323Sed    llvm::support::ulittle64_t processor_features[2];
335193323Sed  } other_cpu_info;
336321369Sdim};
337193323Sedstatic_assert(sizeof(MinidumpCPUInfo) == 24,
338288943Sdim              "sizeof MinidumpCPUInfo is not correct!");
339288943Sdim
340341825Sdim// Reference:
341288943Sdim// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680396(v=vs.85).aspx
342234353Sdimstruct MinidumpSystemInfo {
343198090Srdivacky  llvm::support::ulittle16_t processor_arch;
344234353Sdim  llvm::support::ulittle16_t processor_level;
345288943Sdim  llvm::support::ulittle16_t processor_revision;
346198090Srdivacky
347341825Sdim  uint8_t number_of_processors;
348341825Sdim  uint8_t product_type;
349341825Sdim
350341825Sdim  llvm::support::ulittle32_t major_version;
351234353Sdim  llvm::support::ulittle32_t minor_version;
352234353Sdim  llvm::support::ulittle32_t build_number;
353234353Sdim  llvm::support::ulittle32_t platform_id;
354234353Sdim  llvm::support::ulittle32_t csd_version_rva;
355234353Sdim
356212904Sdim  llvm::support::ulittle16_t suit_mask;
357353358Sdim  llvm::support::ulittle16_t reserved2;
358353358Sdim
359353358Sdim  MinidumpCPUInfo cpu;
360218893Sdim
361234353Sdim  static const MinidumpSystemInfo *Parse(llvm::ArrayRef<uint8_t> &data);
362234353Sdim};
363234353Sdimstatic_assert(sizeof(MinidumpSystemInfo) == 56,
364288943Sdim              "sizeof MinidumpSystemInfo is not correct!");
365314564Sdim
366288943Sdim// TODO misc2, misc3 ?
367234353Sdim// Reference:
368234353Sdim// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680389(v=vs.85).aspx
369234353Sdimstruct MinidumpMiscInfo {
370234353Sdim  llvm::support::ulittle32_t size;
371276479Sdim  // flags1 represents what info in the struct is valid
372276479Sdim  llvm::support::ulittle32_t flags1;
373276479Sdim  llvm::support::ulittle32_t process_id;
374276479Sdim  llvm::support::ulittle32_t process_create_time;
375276479Sdim  llvm::support::ulittle32_t process_user_time;
376296417Sdim  llvm::support::ulittle32_t process_kernel_time;
377296417Sdim
378296417Sdim  static const MinidumpMiscInfo *Parse(llvm::ArrayRef<uint8_t> &data);
379276479Sdim
380276479Sdim  llvm::Optional<lldb::pid_t> GetPid() const;
381280031Sdim};
382280031Sdimstatic_assert(sizeof(MinidumpMiscInfo) == 24,
383280031Sdim              "sizeof MinidumpMiscInfo is not correct!");
384280031Sdim
385288943Sdim// The /proc/pid/status is saved as an ascii string in the file
386288943Sdimclass LinuxProcStatus {
387288943Sdimpublic:
388288943Sdim  llvm::StringRef proc_status;
389321369Sdim  lldb::pid_t pid;
390309124Sdim
391344779Sdim  static llvm::Optional<LinuxProcStatus> Parse(llvm::ArrayRef<uint8_t> &data);
392344779Sdim
393344779Sdim  lldb::pid_t GetPid() const;
394344779Sdim
395344779Sdimprivate:
396309124Sdim  LinuxProcStatus() = default;
397309124Sdim};
398309124Sdim
399321369Sdim// MinidumpModule stuff
400309124Sdimstruct MinidumpVSFixedFileInfo {
401344779Sdim  llvm::support::ulittle32_t signature;
402344779Sdim  llvm::support::ulittle32_t struct_version;
403344779Sdim  llvm::support::ulittle32_t file_version_hi;
404344779Sdim  llvm::support::ulittle32_t file_version_lo;
405309124Sdim  llvm::support::ulittle32_t product_version_hi;
406309124Sdim  llvm::support::ulittle32_t product_version_lo;
407309124Sdim  // file_flags_mask - identifies valid bits in fileFlags
408309124Sdim  llvm::support::ulittle32_t file_flags_mask;
409309124Sdim  llvm::support::ulittle32_t file_flags;
410309124Sdim  llvm::support::ulittle32_t file_os;
411309124Sdim  llvm::support::ulittle32_t file_type;
412309124Sdim  llvm::support::ulittle32_t file_subtype;
413309124Sdim  llvm::support::ulittle32_t file_date_hi;
414309124Sdim  llvm::support::ulittle32_t file_date_lo;
415309124Sdim};
416309124Sdimstatic_assert(sizeof(MinidumpVSFixedFileInfo) == 52,
417321369Sdim              "sizeof MinidumpVSFixedFileInfo is not correct!");
418309124Sdim
419309124Sdimstruct MinidumpModule {
420309124Sdim  llvm::support::ulittle64_t base_of_image;
421309124Sdim  llvm::support::ulittle32_t size_of_image;
422309124Sdim  llvm::support::ulittle32_t checksum;
423309124Sdim  llvm::support::ulittle32_t time_date_stamp;
424309124Sdim  llvm::support::ulittle32_t module_name_rva;
425309124Sdim  MinidumpVSFixedFileInfo version_info;
426309124Sdim  MinidumpLocationDescriptor CV_record;
427309124Sdim  MinidumpLocationDescriptor misc_record;
428309124Sdim  llvm::support::ulittle32_t reserved0[2];
429309124Sdim  llvm::support::ulittle32_t reserved1[2];
430309124Sdim
431309124Sdim  static const MinidumpModule *Parse(llvm::ArrayRef<uint8_t> &data);
432314564Sdim
433314564Sdim  static llvm::ArrayRef<MinidumpModule>
434314564Sdim  ParseModuleList(llvm::ArrayRef<uint8_t> &data);
435314564Sdim};
436314564Sdimstatic_assert(sizeof(MinidumpModule) == 108,
437314564Sdim              "sizeof MinidumpVSFixedFileInfo is not correct!");
438193323Sed
439321369Sdim// Exception stuff
440321369Sdimstruct MinidumpException {
441341825Sdim  enum : unsigned {
442276479Sdim    ExceptonInfoMaxParams = 15,
443321369Sdim    DumpRequested = 0xFFFFFFFF,
444321369Sdim  };
445321369Sdim
446288943Sdim  llvm::support::ulittle32_t exception_code;
447327952Sdim  llvm::support::ulittle32_t exception_flags;
448327952Sdim  llvm::support::ulittle64_t exception_record;
449327952Sdim  llvm::support::ulittle64_t exception_address;
450341825Sdim  llvm::support::ulittle32_t number_parameters;
451341825Sdim  llvm::support::ulittle32_t unused_alignment;
452341825Sdim  llvm::support::ulittle64_t exception_information[ExceptonInfoMaxParams];
453328817Sdim};
454328817Sdimstatic_assert(sizeof(MinidumpException) == 152,
455328817Sdim              "sizeof MinidumpException is not correct!");
456341825Sdim
457341825Sdimstruct MinidumpExceptionStream {
458341825Sdim  llvm::support::ulittle32_t thread_id;
459360784Sdim  llvm::support::ulittle32_t alignment;
460360784Sdim  MinidumpException exception_record;
461360784Sdim  MinidumpLocationDescriptor thread_context;
462360784Sdim
463353358Sdim  static const MinidumpExceptionStream *Parse(llvm::ArrayRef<uint8_t> &data);
464353358Sdim};
465353358Sdimstatic_assert(sizeof(MinidumpExceptionStream) == 168,
466360784Sdim              "sizeof MinidumpExceptionStream is not correct!");
467360784Sdim
468360784Sdim} // namespace minidump
469321369Sdim} // namespace lldb_private
470321369Sdim#endif // liblldb_MinidumpTypes_h_
471193323Sed