summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/Process/minidump
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/Process/minidump')
-rw-r--r--lldb/source/Plugins/Process/minidump/MinidumpParser.cpp222
-rw-r--r--lldb/source/Plugins/Process/minidump/MinidumpParser.h50
-rw-r--r--lldb/source/Plugins/Process/minidump/MinidumpTypes.cpp122
-rw-r--r--lldb/source/Plugins/Process/minidump/MinidumpTypes.h436
4 files changed, 404 insertions, 426 deletions
diff --git a/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp b/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp
index 18b8a3ff361..28dbd1bb5f1 100644
--- a/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp
+++ b/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp
@@ -1,4 +1,5 @@
-//===-- MinidumpParser.cpp ---------------------------------------*- C++ -*-===//
+//===-- MinidumpParser.cpp ---------------------------------------*- C++
+//-*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -18,143 +19,136 @@ using namespace lldb_private;
using namespace minidump;
llvm::Optional<MinidumpParser>
-MinidumpParser::Create(const lldb::DataBufferSP &data_buf_sp)
-{
- if (data_buf_sp->GetByteSize() < sizeof(MinidumpHeader))
- {
- return llvm::None;
+MinidumpParser::Create(const lldb::DataBufferSP &data_buf_sp) {
+ if (data_buf_sp->GetByteSize() < sizeof(MinidumpHeader)) {
+ return llvm::None;
+ }
+
+ llvm::ArrayRef<uint8_t> header_data(data_buf_sp->GetBytes(),
+ sizeof(MinidumpHeader));
+ const MinidumpHeader *header = MinidumpHeader::Parse(header_data);
+
+ if (header == nullptr) {
+ return llvm::None;
+ }
+
+ lldb::offset_t directory_list_offset = header->stream_directory_rva;
+ // check if there is enough data for the parsing of the directory list
+ if ((directory_list_offset +
+ sizeof(MinidumpDirectory) * header->streams_count) >
+ data_buf_sp->GetByteSize()) {
+ return llvm::None;
+ }
+
+ const MinidumpDirectory *directory = nullptr;
+ Error error;
+ llvm::ArrayRef<uint8_t> directory_data(
+ data_buf_sp->GetBytes() + directory_list_offset,
+ sizeof(MinidumpDirectory) * header->streams_count);
+ llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> directory_map;
+
+ for (uint32_t i = 0; i < header->streams_count; ++i) {
+ error = consumeObject(directory_data, directory);
+ if (error.Fail()) {
+ return llvm::None;
}
+ directory_map[static_cast<const uint32_t>(directory->stream_type)] =
+ directory->location;
+ }
- llvm::ArrayRef<uint8_t> header_data(data_buf_sp->GetBytes(), sizeof(MinidumpHeader));
- const MinidumpHeader *header = MinidumpHeader::Parse(header_data);
-
- if (header == nullptr)
- {
- return llvm::None;
- }
-
- lldb::offset_t directory_list_offset = header->stream_directory_rva;
- // check if there is enough data for the parsing of the directory list
- if ((directory_list_offset + sizeof(MinidumpDirectory) * header->streams_count) > data_buf_sp->GetByteSize())
- {
- return llvm::None;
- }
-
- const MinidumpDirectory *directory = nullptr;
- Error error;
- llvm::ArrayRef<uint8_t> directory_data(data_buf_sp->GetBytes() + directory_list_offset,
- sizeof(MinidumpDirectory) * header->streams_count);
- llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> directory_map;
-
- for (uint32_t i = 0; i < header->streams_count; ++i)
- {
- error = consumeObject(directory_data, directory);
- if (error.Fail())
- {
- return llvm::None;
- }
- directory_map[static_cast<const uint32_t>(directory->stream_type)] = directory->location;
- }
-
- MinidumpParser parser(data_buf_sp, header, directory_map);
- return llvm::Optional<MinidumpParser>(parser);
+ MinidumpParser parser(data_buf_sp, header, directory_map);
+ return llvm::Optional<MinidumpParser>(parser);
}
-MinidumpParser::MinidumpParser(const lldb::DataBufferSP &data_buf_sp, const MinidumpHeader *header,
- const llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> &directory_map)
- : m_data_sp(data_buf_sp), m_header(header), m_directory_map(directory_map)
-{
+MinidumpParser::MinidumpParser(
+ const lldb::DataBufferSP &data_buf_sp, const MinidumpHeader *header,
+ const llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> &directory_map)
+ : m_data_sp(data_buf_sp), m_header(header), m_directory_map(directory_map) {
}
-lldb::offset_t
-MinidumpParser::GetByteSize()
-{
- return m_data_sp->GetByteSize();
+lldb::offset_t MinidumpParser::GetByteSize() {
+ return m_data_sp->GetByteSize();
}
llvm::Optional<llvm::ArrayRef<uint8_t>>
-MinidumpParser::GetStream(MinidumpStreamType stream_type)
-{
- auto iter = m_directory_map.find(static_cast<uint32_t>(stream_type));
- if (iter == m_directory_map.end())
- return llvm::None;
-
- // check if there is enough data
- if (iter->second.rva + iter->second.data_size > m_data_sp->GetByteSize())
- return llvm::None;
-
- llvm::ArrayRef<uint8_t> arr_ref(m_data_sp->GetBytes() + iter->second.rva, iter->second.data_size);
- return llvm::Optional<llvm::ArrayRef<uint8_t>>(arr_ref);
+MinidumpParser::GetStream(MinidumpStreamType stream_type) {
+ auto iter = m_directory_map.find(static_cast<uint32_t>(stream_type));
+ if (iter == m_directory_map.end())
+ return llvm::None;
+
+ // check if there is enough data
+ if (iter->second.rva + iter->second.data_size > m_data_sp->GetByteSize())
+ return llvm::None;
+
+ llvm::ArrayRef<uint8_t> arr_ref(m_data_sp->GetBytes() + iter->second.rva,
+ iter->second.data_size);
+ return llvm::Optional<llvm::ArrayRef<uint8_t>>(arr_ref);
}
llvm::Optional<std::vector<const MinidumpThread *>>
-MinidumpParser::GetThreads()
-{
- llvm::Optional<llvm::ArrayRef<uint8_t>> data = GetStream(MinidumpStreamType::ThreadList);
+MinidumpParser::GetThreads() {
+ llvm::Optional<llvm::ArrayRef<uint8_t>> data =
+ GetStream(MinidumpStreamType::ThreadList);
- if (!data)
- return llvm::None;
+ if (!data)
+ return llvm::None;
- return MinidumpThread::ParseThreadList(data.getValue());
+ return MinidumpThread::ParseThreadList(data.getValue());
}
-const MinidumpSystemInfo *
-MinidumpParser::GetSystemInfo()
-{
- llvm::Optional<llvm::ArrayRef<uint8_t>> data = GetStream(MinidumpStreamType::SystemInfo);
+const MinidumpSystemInfo *MinidumpParser::GetSystemInfo() {
+ llvm::Optional<llvm::ArrayRef<uint8_t>> data =
+ GetStream(MinidumpStreamType::SystemInfo);
- if (!data)
- return nullptr;
+ if (!data)
+ return nullptr;
- return MinidumpSystemInfo::Parse(data.getValue());
+ return MinidumpSystemInfo::Parse(data.getValue());
}
-ArchSpec
-MinidumpParser::GetArchitecture()
-{
- ArchSpec arch_spec;
- arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS);
- arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
- arch_spec.GetTriple().setArch(llvm::Triple::ArchType::UnknownArch);
-
- // TODO should we add the OS type here, or somewhere else ?
-
- const MinidumpSystemInfo *system_info = GetSystemInfo();
-
- if (!system_info)
- return arch_spec;
-
- // TODO what to do about big endiand flavors of arm ?
- // TODO set the arm subarch stuff if the minidump has info about it
-
- const MinidumpCPUArchitecture arch =
- static_cast<const MinidumpCPUArchitecture>(static_cast<const uint32_t>(system_info->processor_arch));
- switch (arch)
- {
- case MinidumpCPUArchitecture::X86:
- arch_spec.GetTriple().setArch(llvm::Triple::ArchType::x86);
- break;
- case MinidumpCPUArchitecture::AMD64:
- arch_spec.GetTriple().setArch(llvm::Triple::ArchType::x86_64);
- break;
- case MinidumpCPUArchitecture::ARM:
- arch_spec.GetTriple().setArch(llvm::Triple::ArchType::arm);
- break;
- case MinidumpCPUArchitecture::ARM64:
- arch_spec.GetTriple().setArch(llvm::Triple::ArchType::aarch64);
- break;
- }
+ArchSpec MinidumpParser::GetArchitecture() {
+ ArchSpec arch_spec;
+ arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS);
+ arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
+ arch_spec.GetTriple().setArch(llvm::Triple::ArchType::UnknownArch);
+
+ // TODO should we add the OS type here, or somewhere else ?
+ const MinidumpSystemInfo *system_info = GetSystemInfo();
+
+ if (!system_info)
return arch_spec;
+
+ // TODO what to do about big endiand flavors of arm ?
+ // TODO set the arm subarch stuff if the minidump has info about it
+
+ const MinidumpCPUArchitecture arch =
+ static_cast<const MinidumpCPUArchitecture>(
+ static_cast<const uint32_t>(system_info->processor_arch));
+ switch (arch) {
+ case MinidumpCPUArchitecture::X86:
+ arch_spec.GetTriple().setArch(llvm::Triple::ArchType::x86);
+ break;
+ case MinidumpCPUArchitecture::AMD64:
+ arch_spec.GetTriple().setArch(llvm::Triple::ArchType::x86_64);
+ break;
+ case MinidumpCPUArchitecture::ARM:
+ arch_spec.GetTriple().setArch(llvm::Triple::ArchType::arm);
+ break;
+ case MinidumpCPUArchitecture::ARM64:
+ arch_spec.GetTriple().setArch(llvm::Triple::ArchType::aarch64);
+ break;
+ }
+
+ return arch_spec;
}
-const MinidumpMiscInfo *
-MinidumpParser::GetMiscInfo()
-{
- llvm::Optional<llvm::ArrayRef<uint8_t>> data = GetStream(MinidumpStreamType::MiscInfo);
+const MinidumpMiscInfo *MinidumpParser::GetMiscInfo() {
+ llvm::Optional<llvm::ArrayRef<uint8_t>> data =
+ GetStream(MinidumpStreamType::MiscInfo);
- if (!data)
- return nullptr;
+ if (!data)
+ return nullptr;
- return MinidumpMiscInfo::Parse(data.getValue());
+ return MinidumpMiscInfo::Parse(data.getValue());
}
diff --git a/lldb/source/Plugins/Process/minidump/MinidumpParser.h b/lldb/source/Plugins/Process/minidump/MinidumpParser.h
index d99bd57f2f4..acee0e5869a 100644
--- a/lldb/source/Plugins/Process/minidump/MinidumpParser.h
+++ b/lldb/source/Plugins/Process/minidump/MinidumpParser.h
@@ -1,4 +1,5 @@
-//===-- MinidumpParser.h -----------------------------------------*- C++ -*-===//
+//===-- MinidumpParser.h -----------------------------------------*- C++
+//-*-===//
//
// The LLVM Compiler Infrastructure
//
@@ -28,44 +29,37 @@
#include <cstring>
#include <unordered_map>
+namespace lldb_private {
-namespace lldb_private
-{
+namespace minidump {
-namespace minidump
-{
-
-class MinidumpParser
-{
+class MinidumpParser {
public:
- static llvm::Optional<MinidumpParser>
- Create(const lldb::DataBufferSP &data_buf_sp);
+ static llvm::Optional<MinidumpParser>
+ Create(const lldb::DataBufferSP &data_buf_sp);
- lldb::offset_t
- GetByteSize();
+ lldb::offset_t GetByteSize();
- llvm::Optional<llvm::ArrayRef<uint8_t>>
- GetStream(MinidumpStreamType stream_type);
+ llvm::Optional<llvm::ArrayRef<uint8_t>>
+ GetStream(MinidumpStreamType stream_type);
- llvm::Optional<std::vector<const MinidumpThread *>>
- GetThreads();
+ llvm::Optional<std::vector<const MinidumpThread *>> GetThreads();
- const MinidumpSystemInfo *
- GetSystemInfo();
+ const MinidumpSystemInfo *GetSystemInfo();
- ArchSpec
- GetArchitecture();
+ ArchSpec GetArchitecture();
- const MinidumpMiscInfo *
- GetMiscInfo();
+ const MinidumpMiscInfo *GetMiscInfo();
private:
- lldb::DataBufferSP m_data_sp;
- const MinidumpHeader *m_header;
- llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> m_directory_map;
-
- MinidumpParser(const lldb::DataBufferSP &data_buf_sp, const MinidumpHeader *header,
- const llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> &directory_map);
+ lldb::DataBufferSP m_data_sp;
+ const MinidumpHeader *m_header;
+ llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> m_directory_map;
+
+ MinidumpParser(const lldb::DataBufferSP &data_buf_sp,
+ const MinidumpHeader *header,
+ const llvm::DenseMap<uint32_t, MinidumpLocationDescriptor>
+ &directory_map);
};
} // namespace minidump
diff --git a/lldb/source/Plugins/Process/minidump/MinidumpTypes.cpp b/lldb/source/Plugins/Process/minidump/MinidumpTypes.cpp
index dbcf730aaea..4f1cb0aa43a 100644
--- a/lldb/source/Plugins/Process/minidump/MinidumpTypes.cpp
+++ b/lldb/source/Plugins/Process/minidump/MinidumpTypes.cpp
@@ -18,81 +18,75 @@
using namespace lldb_private;
using namespace minidump;
-const MinidumpHeader *
-MinidumpHeader::Parse(llvm::ArrayRef<uint8_t> &data)
-{
- const MinidumpHeader *header = nullptr;
- Error error = consumeObject(data, header);
-
- const MinidumpHeaderConstants signature =
- static_cast<const MinidumpHeaderConstants>(static_cast<const uint32_t>(header->signature));
- const MinidumpHeaderConstants version =
- static_cast<const MinidumpHeaderConstants>(static_cast<const uint32_t>(header->version) & 0x0000ffff);
- // the high 16 bits of the version field are implementation specific
-
- if (error.Fail() || signature != MinidumpHeaderConstants::Signature || version != MinidumpHeaderConstants::Version)
- return nullptr;
-
- // TODO check for max number of streams ?
- // TODO more sanity checks ?
-
- return header;
+const MinidumpHeader *MinidumpHeader::Parse(llvm::ArrayRef<uint8_t> &data) {
+ const MinidumpHeader *header = nullptr;
+ Error error = consumeObject(data, header);
+
+ const MinidumpHeaderConstants signature =
+ static_cast<const MinidumpHeaderConstants>(
+ static_cast<const uint32_t>(header->signature));
+ const MinidumpHeaderConstants version =
+ static_cast<const MinidumpHeaderConstants>(
+ static_cast<const uint32_t>(header->version) & 0x0000ffff);
+ // the high 16 bits of the version field are implementation specific
+
+ if (error.Fail() || signature != MinidumpHeaderConstants::Signature ||
+ version != MinidumpHeaderConstants::Version)
+ return nullptr;
+
+ // TODO check for max number of streams ?
+ // TODO more sanity checks ?
+
+ return header;
}
// MinidumpThread
-const MinidumpThread *
-MinidumpThread::Parse(llvm::ArrayRef<uint8_t> &data)
-{
- const MinidumpThread *thread = nullptr;
- Error error = consumeObject(data, thread);
- if (error.Fail())
- return nullptr;
-
- return thread;
+const MinidumpThread *MinidumpThread::Parse(llvm::ArrayRef<uint8_t> &data) {
+ const MinidumpThread *thread = nullptr;
+ Error error = consumeObject(data, thread);
+ if (error.Fail())
+ return nullptr;
+
+ return thread;
}
llvm::Optional<std::vector<const MinidumpThread *>>
-MinidumpThread::ParseThreadList(llvm::ArrayRef<uint8_t> &data)
-{
- std::vector<const MinidumpThread *> thread_list;
-
- const llvm::support::ulittle32_t *thread_count;
- Error error = consumeObject(data, thread_count);
- if (error.Fail())
- return llvm::None;
-
- const MinidumpThread *thread;
- for (uint32_t i = 0; i < *thread_count; ++i)
- {
- thread = MinidumpThread::Parse(data);
- if (thread == nullptr)
- return llvm::None;
- thread_list.push_back(thread);
- }
-
- return llvm::Optional<std::vector<const MinidumpThread *>>(thread_list);
+MinidumpThread::ParseThreadList(llvm::ArrayRef<uint8_t> &data) {
+ std::vector<const MinidumpThread *> thread_list;
+
+ const llvm::support::ulittle32_t *thread_count;
+ Error error = consumeObject(data, thread_count);
+ if (error.Fail())
+ return llvm::None;
+
+ const MinidumpThread *thread;
+ for (uint32_t i = 0; i < *thread_count; ++i) {
+ thread = MinidumpThread::Parse(data);
+ if (thread == nullptr)
+ return llvm::None;
+ thread_list.push_back(thread);
+ }
+
+ return llvm::Optional<std::vector<const MinidumpThread *>>(thread_list);
}
// MinidumpSystemInfo
const MinidumpSystemInfo *
-MinidumpSystemInfo::Parse(llvm::ArrayRef<uint8_t> &data)
-{
- const MinidumpSystemInfo *system_info;
- Error error = consumeObject(data, system_info);
- if (error.Fail())
- return nullptr;
-
- return system_info;
+MinidumpSystemInfo::Parse(llvm::ArrayRef<uint8_t> &data) {
+ const MinidumpSystemInfo *system_info;
+ Error error = consumeObject(data, system_info);
+ if (error.Fail())
+ return nullptr;
+
+ return system_info;
}
// MinidumpMiscInfo
-const MinidumpMiscInfo *
-MinidumpMiscInfo::Parse(llvm::ArrayRef<uint8_t> &data)
-{
- const MinidumpMiscInfo *misc_info;
- Error error = consumeObject(data, misc_info);
- if (error.Fail())
- return nullptr;
-
- return misc_info;
+const MinidumpMiscInfo *MinidumpMiscInfo::Parse(llvm::ArrayRef<uint8_t> &data) {
+ const MinidumpMiscInfo *misc_info;
+ Error error = consumeObject(data, misc_info);
+ if (error.Fail())
+ return nullptr;
+
+ return misc_info;
}
diff --git a/lldb/source/Plugins/Process/minidump/MinidumpTypes.h b/lldb/source/Plugins/Process/minidump/MinidumpTypes.h
index 6017db03527..95dc07ff9d5 100644
--- a/lldb/source/Plugins/Process/minidump/MinidumpTypes.h
+++ b/lldb/source/Plugins/Process/minidump/MinidumpTypes.h
@@ -27,271 +27,267 @@
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms679293(v=vs.85).aspx
// https://chromium.googlesource.com/breakpad/breakpad/
-namespace lldb_private
-{
+namespace lldb_private {
-namespace minidump
-{
+namespace minidump {
LLVM_ENABLE_BITMASK_ENUMS_IN_NAMESPACE();
-enum class MinidumpHeaderConstants : uint32_t
-{
- Signature = 0x504d444d, // 'PMDM'
- Version = 0x0000a793, // 42899
- LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ Signature)
+enum class MinidumpHeaderConstants : uint32_t {
+ Signature = 0x504d444d, // 'PMDM'
+ Version = 0x0000a793, // 42899
+ LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ Signature)
};
-// Reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ms680394.aspx
-enum class MinidumpStreamType : uint32_t
-{
- Unused = 0,
- Reserved0 = 1,
- Reserved1 = 2,
- ThreadList = 3,
- ModuleList = 4,
- MemoryList = 5,
- Exception = 6,
- SystemInfo = 7,
- ThreadExList = 8,
- Memory64List = 9,
- CommentA = 10,
- CommentW = 11,
- HandleData = 12,
- FunctionTable = 13,
- UnloadedModuleList = 14,
- MiscInfo = 15,
- MemoryInfoList = 16,
- ThreadInfoList = 17,
- HandleOperationList = 18,
- Token = 19,
- JavascriptData = 20,
- SystemMemoryInfo = 21,
- ProcessVMCounters = 22,
- LastReserved = 0x0000ffff,
-
- /* Breakpad extension types. 0x4767 = "Gg" */
- BreakpadInfo = 0x47670001,
- AssertionInfo = 0x47670002,
- /* These are additional minidump stream values which are specific to
- * the linux breakpad implementation. */
- LinuxCPUInfo = 0x47670003, /* /proc/cpuinfo */
- LinuxProcStatus = 0x47670004, /* /proc/$x/status */
- LinuxLSBRelease = 0x47670005, /* /etc/lsb-release */
- LinuxCMDLine = 0x47670006, /* /proc/$x/cmdline */
- LinuxEnviron = 0x47670007, /* /proc/$x/environ */
- LinuxAuxv = 0x47670008, /* /proc/$x/auxv */
- LinuxMaps = 0x47670009, /* /proc/$x/maps */
- LinuxDSODebug = 0x4767000A
+// Reference:
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680394.aspx
+enum class MinidumpStreamType : uint32_t {
+ Unused = 0,
+ Reserved0 = 1,
+ Reserved1 = 2,
+ ThreadList = 3,
+ ModuleList = 4,
+ MemoryList = 5,
+ Exception = 6,
+ SystemInfo = 7,
+ ThreadExList = 8,
+ Memory64List = 9,
+ CommentA = 10,
+ CommentW = 11,
+ HandleData = 12,
+ FunctionTable = 13,
+ UnloadedModuleList = 14,
+ MiscInfo = 15,
+ MemoryInfoList = 16,
+ ThreadInfoList = 17,
+ HandleOperationList = 18,
+ Token = 19,
+ JavascriptData = 20,
+ SystemMemoryInfo = 21,
+ ProcessVMCounters = 22,
+ LastReserved = 0x0000ffff,
+
+ /* Breakpad extension types. 0x4767 = "Gg" */
+ BreakpadInfo = 0x47670001,
+ AssertionInfo = 0x47670002,
+ /* These are additional minidump stream values which are specific to
+ * the linux breakpad implementation. */
+ LinuxCPUInfo = 0x47670003, /* /proc/cpuinfo */
+ LinuxProcStatus = 0x47670004, /* /proc/$x/status */
+ LinuxLSBRelease = 0x47670005, /* /etc/lsb-release */
+ LinuxCMDLine = 0x47670006, /* /proc/$x/cmdline */
+ LinuxEnviron = 0x47670007, /* /proc/$x/environ */
+ LinuxAuxv = 0x47670008, /* /proc/$x/auxv */
+ LinuxMaps = 0x47670009, /* /proc/$x/maps */
+ LinuxDSODebug = 0x4767000A
};
// for MinidumpSystemInfo.processor_arch
-enum class MinidumpCPUArchitecture : uint16_t
-{
- X86 = 0, /* PROCESSOR_ARCHITECTURE_INTEL */
- MIPS = 1, /* PROCESSOR_ARCHITECTURE_MIPS */
- Alpha = 2, /* PROCESSOR_ARCHITECTURE_ALPHA */
- PPC = 3, /* PROCESSOR_ARCHITECTURE_PPC */
- SHX = 4, /* PROCESSOR_ARCHITECTURE_SHX (Super-H) */
- ARM = 5, /* PROCESSOR_ARCHITECTURE_ARM */
- IA64 = 6, /* PROCESSOR_ARCHITECTURE_IA64 */
- Alpha64 = 7, /* PROCESSOR_ARCHITECTURE_ALPHA64 */
- MSIL = 8, /* PROCESSOR_ARCHITECTURE_MSIL
- * (Microsoft Intermediate Language) */
- AMD64 = 9, /* PROCESSOR_ARCHITECTURE_AMD64 */
- X86Win64 = 10, /* PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 (WoW64) */
- SPARC = 0x8001, /* Breakpad-defined value for SPARC */
- PPC64 = 0x8002, /* Breakpad-defined value for PPC64 */
- ARM64 = 0x8003, /* Breakpad-defined value for ARM64 */
- MIPS64 = 0x8004, /* Breakpad-defined value for MIPS64 */
- Unknown = 0xffff /* PROCESSOR_ARCHITECTURE_UNKNOWN */
+enum class MinidumpCPUArchitecture : uint16_t {
+ X86 = 0, /* PROCESSOR_ARCHITECTURE_INTEL */
+ MIPS = 1, /* PROCESSOR_ARCHITECTURE_MIPS */
+ Alpha = 2, /* PROCESSOR_ARCHITECTURE_ALPHA */
+ PPC = 3, /* PROCESSOR_ARCHITECTURE_PPC */
+ SHX = 4, /* PROCESSOR_ARCHITECTURE_SHX (Super-H) */
+ ARM = 5, /* PROCESSOR_ARCHITECTURE_ARM */
+ IA64 = 6, /* PROCESSOR_ARCHITECTURE_IA64 */
+ Alpha64 = 7, /* PROCESSOR_ARCHITECTURE_ALPHA64 */
+ MSIL = 8, /* PROCESSOR_ARCHITECTURE_MSIL
+ * (Microsoft Intermediate Language) */
+ AMD64 = 9, /* PROCESSOR_ARCHITECTURE_AMD64 */
+ X86Win64 = 10, /* PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 (WoW64) */
+ SPARC = 0x8001, /* Breakpad-defined value for SPARC */
+ PPC64 = 0x8002, /* Breakpad-defined value for PPC64 */
+ ARM64 = 0x8003, /* Breakpad-defined value for ARM64 */
+ MIPS64 = 0x8004, /* Breakpad-defined value for MIPS64 */
+ Unknown = 0xffff /* PROCESSOR_ARCHITECTURE_UNKNOWN */
};
// for MinidumpSystemInfo.platform_id
-enum class MinidumpOSPlatform : uint32_t
-{
- Win32S = 0, /* VER_PLATFORM_WIN32s (Windows 3.1) */
- Win32Windows = 1, /* VER_PLATFORM_WIN32_WINDOWS (Windows 95-98-Me) */
- Win32NT = 2, /* VER_PLATFORM_WIN32_NT (Windows NT, 2000+) */
- Win32CE = 3, /* VER_PLATFORM_WIN32_CE, VER_PLATFORM_WIN32_HH
- * (Windows CE, Windows Mobile, "Handheld") */
-
- /* The following values are Breakpad-defined. */
- Unix = 0x8000, /* Generic Unix-ish */
- MacOSX = 0x8101, /* Mac OS X/Darwin */
- IOS = 0x8102, /* iOS */
- Linux = 0x8201, /* Linux */
- Solaris = 0x8202, /* Solaris */
- Android = 0x8203, /* Android */
- PS3 = 0x8204, /* PS3 */
- NaCl = 0x8205 /* Native Client (NaCl) */
+enum class MinidumpOSPlatform : uint32_t {
+ Win32S = 0, /* VER_PLATFORM_WIN32s (Windows 3.1) */
+ Win32Windows = 1, /* VER_PLATFORM_WIN32_WINDOWS (Windows 95-98-Me) */
+ Win32NT = 2, /* VER_PLATFORM_WIN32_NT (Windows NT, 2000+) */
+ Win32CE = 3, /* VER_PLATFORM_WIN32_CE, VER_PLATFORM_WIN32_HH
+ * (Windows CE, Windows Mobile, "Handheld") */
+
+ /* The following values are Breakpad-defined. */
+ Unix = 0x8000, /* Generic Unix-ish */
+ MacOSX = 0x8101, /* Mac OS X/Darwin */
+ IOS = 0x8102, /* iOS */
+ Linux = 0x8201, /* Linux */
+ Solaris = 0x8202, /* Solaris */
+ Android = 0x8203, /* Android */
+ PS3 = 0x8204, /* PS3 */
+ NaCl = 0x8205 /* Native Client (NaCl) */
};
// For MinidumpCPUInfo.arm_cpu_info.elf_hwcaps.
// This matches the Linux kernel definitions from <asm/hwcaps.h>
-enum class MinidumpPCPUInformationARMElfHwCaps : uint32_t
-{
- SWP = (1 << 0),
- Half = (1 << 1),
- Thumb = (1 << 2),
- _26BIT = (1 << 3),
- FastMult = (1 << 4),
- FPA = (1 << 5),
- VFP = (1 << 6),
- EDSP = (1 << 7),
- Java = (1 << 8),
- IWMMXT = (1 << 9),
- Crunch = (1 << 10),
- ThumbEE = (1 << 11),
- Neon = (1 << 12),
- VFPv3 = (1 << 13),
- VFPv3D16 = (1 << 14),
- TLS = (1 << 15),
- VFPv4 = (1 << 16),
- IDIVA = (1 << 17),
- IDIVT = (1 << 18),
- LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ IDIVT)
+enum class MinidumpPCPUInformationARMElfHwCaps : uint32_t {
+ SWP = (1 << 0),
+ Half = (1 << 1),
+ Thumb = (1 << 2),
+ _26BIT = (1 << 3),
+ FastMult = (1 << 4),
+ FPA = (1 << 5),
+ VFP = (1 << 6),
+ EDSP = (1 << 7),
+ Java = (1 << 8),
+ IWMMXT = (1 << 9),
+ Crunch = (1 << 10),
+ ThumbEE = (1 << 11),
+ Neon = (1 << 12),
+ VFPv3 = (1 << 13),
+ VFPv3D16 = (1 << 14),
+ TLS = (1 << 15),
+ VFPv4 = (1 << 16),
+ IDIVA = (1 << 17),
+ IDIVT = (1 << 18),
+ LLVM_MARK_AS_BITMASK_ENUM(/* LargestValue = */ IDIVT)
};
template <typename T>
-Error
-consumeObject(llvm::ArrayRef<uint8_t> &Buffer, const T *&Object)
-{
- Error error;
- if (Buffer.size() < sizeof(T))
- {
- error.SetErrorString("Insufficient buffer!");
- return error;
- }
-
- Object = reinterpret_cast<const T *>(Buffer.data());
- Buffer = Buffer.drop_front(sizeof(T));
+Error consumeObject(llvm::ArrayRef<uint8_t> &Buffer, const T *&Object) {
+ Error error;
+ if (Buffer.size() < sizeof(T)) {
+ error.SetErrorString("Insufficient buffer!");
return error;
+ }
+
+ Object = reinterpret_cast<const T *>(Buffer.data());
+ Buffer = Buffer.drop_front(sizeof(T));
+ return error;
}
-// Reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ms680378(v=vs.85).aspx
-struct MinidumpHeader
-{
- llvm::support::ulittle32_t signature;
- llvm::support::ulittle32_t version; // The high 16 bits of version field are implementation specific
- llvm::support::ulittle32_t streams_count;
- llvm::support::ulittle32_t stream_directory_rva; // offset of the stream directory
- llvm::support::ulittle32_t checksum;
- llvm::support::ulittle32_t time_date_stamp; // time_t format
- llvm::support::ulittle64_t flags;
-
- static const MinidumpHeader *
- Parse(llvm::ArrayRef<uint8_t> &data);
+// Reference:
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680378(v=vs.85).aspx
+struct MinidumpHeader {
+ llvm::support::ulittle32_t signature;
+ llvm::support::ulittle32_t
+ version; // The high 16 bits of version field are implementation specific
+ llvm::support::ulittle32_t streams_count;
+ llvm::support::ulittle32_t
+ stream_directory_rva; // offset of the stream directory
+ llvm::support::ulittle32_t checksum;
+ llvm::support::ulittle32_t time_date_stamp; // time_t format
+ llvm::support::ulittle64_t flags;
+
+ static const MinidumpHeader *Parse(llvm::ArrayRef<uint8_t> &data);
};
-static_assert(sizeof(MinidumpHeader) == 32, "sizeof MinidumpHeader is not correct!");
+static_assert(sizeof(MinidumpHeader) == 32,
+ "sizeof MinidumpHeader is not correct!");
-// Reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ms680383.aspx
-struct MinidumpLocationDescriptor
-{
- llvm::support::ulittle32_t data_size;
- llvm::support::ulittle32_t rva;
+// Reference:
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680383.aspx
+struct MinidumpLocationDescriptor {
+ llvm::support::ulittle32_t data_size;
+ llvm::support::ulittle32_t rva;
};
-static_assert(sizeof(MinidumpLocationDescriptor) == 8, "sizeof MinidumpLocationDescriptor is not correct!");
+static_assert(sizeof(MinidumpLocationDescriptor) == 8,
+ "sizeof MinidumpLocationDescriptor is not correct!");
-// Reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ms680384(v=vs.85).aspx
-struct MinidumpMemoryDescriptor
-{
- llvm::support::ulittle64_t start_of_memory_range;
- MinidumpLocationDescriptor memory;
+// Reference:
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680384(v=vs.85).aspx
+struct MinidumpMemoryDescriptor {
+ llvm::support::ulittle64_t start_of_memory_range;
+ MinidumpLocationDescriptor memory;
};
-static_assert(sizeof(MinidumpMemoryDescriptor) == 16, "sizeof MinidumpMemoryDescriptor is not correct!");
+static_assert(sizeof(MinidumpMemoryDescriptor) == 16,
+ "sizeof MinidumpMemoryDescriptor is not correct!");
-// Reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ms680365.aspx
-struct MinidumpDirectory
-{
- llvm::support::ulittle32_t stream_type;
- MinidumpLocationDescriptor location;
+// Reference:
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680365.aspx
+struct MinidumpDirectory {
+ llvm::support::ulittle32_t stream_type;
+ MinidumpLocationDescriptor location;
};
-static_assert(sizeof(MinidumpDirectory) == 12, "sizeof MinidumpDirectory is not correct!");
-
-// Reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ms680517(v=vs.85).aspx
-struct MinidumpThread
-{
- llvm::support::ulittle32_t thread_id;
- llvm::support::ulittle32_t suspend_count;
- llvm::support::ulittle32_t priority_class;
- llvm::support::ulittle32_t priority;
- llvm::support::ulittle64_t teb;
- MinidumpMemoryDescriptor stack;
- MinidumpLocationDescriptor thread_context;
-
- static const MinidumpThread *
- Parse(llvm::ArrayRef<uint8_t> &data);
-
- static llvm::Optional<std::vector<const MinidumpThread *>>
- ParseThreadList(llvm::ArrayRef<uint8_t> &data);
+static_assert(sizeof(MinidumpDirectory) == 12,
+ "sizeof MinidumpDirectory is not correct!");
+
+// Reference:
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680517(v=vs.85).aspx
+struct MinidumpThread {
+ llvm::support::ulittle32_t thread_id;
+ llvm::support::ulittle32_t suspend_count;
+ llvm::support::ulittle32_t priority_class;
+ llvm::support::ulittle32_t priority;
+ llvm::support::ulittle64_t teb;
+ MinidumpMemoryDescriptor stack;
+ MinidumpLocationDescriptor thread_context;
+
+ static const MinidumpThread *Parse(llvm::ArrayRef<uint8_t> &data);
+
+ static llvm::Optional<std::vector<const MinidumpThread *>>
+ ParseThreadList(llvm::ArrayRef<uint8_t> &data);
};
-static_assert(sizeof(MinidumpThread) == 48, "sizeof MinidumpThread is not correct!");
+static_assert(sizeof(MinidumpThread) == 48,
+ "sizeof MinidumpThread is not correct!");
-// Reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ms680396(v=vs.85).aspx
+// Reference:
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680396(v=vs.85).aspx
union MinidumpCPUInfo {
- struct
- {
- llvm::support::ulittle32_t vendor_id[3]; /* cpuid 0: ebx, edx, ecx */
- llvm::support::ulittle32_t version_information; /* cpuid 1: eax */
- llvm::support::ulittle32_t feature_information; /* cpuid 1: edx */
- llvm::support::ulittle32_t amd_extended_cpu_features; /* cpuid 0x80000001, ebx */
- } x86_cpu_info;
- struct
- {
- llvm::support::ulittle32_t cpuid;
- llvm::support::ulittle32_t elf_hwcaps; /* linux specific, 0 otherwise */
- } arm_cpu_info;
- struct
- {
- llvm::support::ulittle64_t processor_features[2];
- } other_cpu_info;
+ struct {
+ llvm::support::ulittle32_t vendor_id[3]; /* cpuid 0: ebx, edx, ecx */
+ llvm::support::ulittle32_t version_information; /* cpuid 1: eax */
+ llvm::support::ulittle32_t feature_information; /* cpuid 1: edx */
+ llvm::support::ulittle32_t
+ amd_extended_cpu_features; /* cpuid 0x80000001, ebx */
+ } x86_cpu_info;
+ struct {
+ llvm::support::ulittle32_t cpuid;
+ llvm::support::ulittle32_t elf_hwcaps; /* linux specific, 0 otherwise */
+ } arm_cpu_info;
+ struct {
+ llvm::support::ulittle64_t processor_features[2];
+ } other_cpu_info;
};
-static_assert(sizeof(MinidumpCPUInfo) == 24, "sizeof MinidumpCPUInfo is not correct!");
+static_assert(sizeof(MinidumpCPUInfo) == 24,
+ "sizeof MinidumpCPUInfo is not correct!");
-// Reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ms680396(v=vs.85).aspx
-struct MinidumpSystemInfo
-{
- llvm::support::ulittle16_t processor_arch;
- llvm::support::ulittle16_t processor_level;
- llvm::support::ulittle16_t processor_revision;
+// Reference:
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680396(v=vs.85).aspx
+struct MinidumpSystemInfo {
+ llvm::support::ulittle16_t processor_arch;
+ llvm::support::ulittle16_t processor_level;
+ llvm::support::ulittle16_t processor_revision;
- uint8_t number_of_processors;
- uint8_t product_type;
+ uint8_t number_of_processors;
+ uint8_t product_type;
- llvm::support::ulittle32_t major_version;
- llvm::support::ulittle32_t minor_version;
- llvm::support::ulittle32_t build_number;
- llvm::support::ulittle32_t platform_id;
- llvm::support::ulittle32_t csd_version_rva;
+ llvm::support::ulittle32_t major_version;
+ llvm::support::ulittle32_t minor_version;
+ llvm::support::ulittle32_t build_number;
+ llvm::support::ulittle32_t platform_id;
+ llvm::support::ulittle32_t csd_version_rva;
- llvm::support::ulittle16_t suit_mask;
- llvm::support::ulittle16_t reserved2;
+ llvm::support::ulittle16_t suit_mask;
+ llvm::support::ulittle16_t reserved2;
- MinidumpCPUInfo cpu;
+ MinidumpCPUInfo cpu;
- static const MinidumpSystemInfo *
- Parse(llvm::ArrayRef<uint8_t> &data);
+ static const MinidumpSystemInfo *Parse(llvm::ArrayRef<uint8_t> &data);
};
-static_assert(sizeof(MinidumpSystemInfo) == 56, "sizeof MinidumpSystemInfo is not correct!");
+static_assert(sizeof(MinidumpSystemInfo) == 56,
+ "sizeof MinidumpSystemInfo is not correct!");
// TODO check flags to see what's valid
// TODO misc2, misc3 ?
-// Reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ms680389(v=vs.85).aspx
-struct MinidumpMiscInfo
-{
- llvm::support::ulittle32_t size;
- llvm::support::ulittle32_t flags1;
- llvm::support::ulittle32_t process_id;
- llvm::support::ulittle32_t process_create_time;
- llvm::support::ulittle32_t process_user_time;
- llvm::support::ulittle32_t process_kernel_time;
-
- static const MinidumpMiscInfo *
- Parse(llvm::ArrayRef<uint8_t> &data);
+// Reference:
+// https://msdn.microsoft.com/en-us/library/windows/desktop/ms680389(v=vs.85).aspx
+struct MinidumpMiscInfo {
+ llvm::support::ulittle32_t size;
+ llvm::support::ulittle32_t flags1;
+ llvm::support::ulittle32_t process_id;
+ llvm::support::ulittle32_t process_create_time;
+ llvm::support::ulittle32_t process_user_time;
+ llvm::support::ulittle32_t process_kernel_time;
+
+ static const MinidumpMiscInfo *Parse(llvm::ArrayRef<uint8_t> &data);
};
-static_assert(sizeof(MinidumpMiscInfo) == 24, "sizeof MinidumpMiscInfo is not correct!");
+static_assert(sizeof(MinidumpMiscInfo) == 24,
+ "sizeof MinidumpMiscInfo is not correct!");
} // namespace minidump
} // namespace lldb_private
OpenPOWER on IntegriCloud