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