[Lldb-commits] [lldb] r356992 - Minidump: Use minidump types defined in llvm

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Tue Mar 26 06:23:02 PDT 2019


Author: labath
Date: Tue Mar 26 06:23:01 2019
New Revision: 356992

URL: http://llvm.org/viewvc/llvm-project?rev=356992&view=rev
Log:
Minidump: Use minidump types defined in llvm

This is the next step in moving the minidump parsing into llvm. I remove
the minidump structures already defined in the llvm Object library and
convert our parser to use those. NFC.

Modified:
    lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp
    lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h
    lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp
    lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h
    lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp

Modified: lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp?rev=356992&r1=356991&r2=356992&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp (original)
+++ lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.cpp Tue Mar 26 06:23:01 2019
@@ -28,19 +28,34 @@ static llvm::Error stringError(llvm::Str
                                              llvm::inconvertibleErrorCode());
 }
 
+const Header *ParseHeader(llvm::ArrayRef<uint8_t> &data) {
+  const Header *header = nullptr;
+  Status error = consumeObject(data, header);
+
+  uint32_t signature = header->Signature;
+  uint32_t version = header->Version & 0x0000ffff;
+  // the high 16 bits of the version field are implementation specific
+
+  if (error.Fail() || signature != Header::MagicSignature ||
+      version != Header::MagicVersion)
+    return nullptr;
+
+  return header;
+}
+
 llvm::Expected<MinidumpParser>
 MinidumpParser::Create(const lldb::DataBufferSP &data_sp) {
-  if (data_sp->GetByteSize() < sizeof(MinidumpHeader))
+  if (data_sp->GetByteSize() < sizeof(Header))
     return stringError("Buffer too small.");
 
   llvm::ArrayRef<uint8_t> header_data(data_sp->GetBytes(),
-                                      sizeof(MinidumpHeader));
-  const MinidumpHeader *header = MinidumpHeader::Parse(header_data);
+                                      sizeof(Header));
+  const Header *header = ParseHeader(header_data);
   if (!header)
     return stringError("invalid minidump: can't parse the header");
 
   // A minidump without at least one stream is clearly ill-formed
-  if (header->streams_count == 0)
+  if (header->NumberOfStreams == 0)
     return stringError("invalid minidump: no streams present");
 
   struct FileRange {
@@ -58,42 +73,42 @@ MinidumpParser::Create(const lldb::DataB
   // - truncation (streams pointing past the end of file)
   std::vector<FileRange> minidump_map;
 
-  minidump_map.emplace_back(0, sizeof(MinidumpHeader));
+  minidump_map.emplace_back(0, sizeof(Header));
 
   // Add the directory entries to the file map
-  FileRange directory_range(header->stream_directory_rva,
-                            header->streams_count * sizeof(MinidumpDirectory));
+  FileRange directory_range(header->StreamDirectoryRVA,
+                            header->NumberOfStreams * sizeof(Directory));
   if (directory_range.end() > file_size)
     return stringError("invalid minidump: truncated streams directory");
   minidump_map.push_back(directory_range);
 
-  llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> directory_map;
+  llvm::DenseMap<StreamType, LocationDescriptor> directory_map;
 
   // Parse stream directory entries
   llvm::ArrayRef<uint8_t> directory_data(
       data_sp->GetBytes() + directory_range.offset, directory_range.size);
-  for (uint32_t i = 0; i < header->streams_count; ++i) {
-    const MinidumpDirectory *directory_entry = nullptr;
+  for (uint32_t i = 0; i < header->NumberOfStreams; ++i) {
+    const Directory *directory_entry = nullptr;
     Status error = consumeObject(directory_data, directory_entry);
     if (error.Fail())
       return error.ToError();
-    if (directory_entry->stream_type == 0) {
+    if (directory_entry->Type == StreamType::Unused) {
       // Ignore dummy streams (technically ill-formed, but a number of
       // existing minidumps seem to contain such streams)
-      if (directory_entry->location.data_size == 0)
+      if (directory_entry->Location.DataSize == 0)
         continue;
       return stringError("invalid minidump: bad stream type");
     }
     // Update the streams map, checking for duplicate stream types
     if (!directory_map
-             .insert({directory_entry->stream_type, directory_entry->location})
+             .insert({directory_entry->Type, directory_entry->Location})
              .second)
       return stringError("invalid minidump: duplicate stream type");
 
     // Ignore the zero-length streams for layout checks
-    if (directory_entry->location.data_size != 0) {
-      minidump_map.emplace_back(directory_entry->location.rva,
-                                directory_entry->location.data_size);
+    if (directory_entry->Location.DataSize != 0) {
+      minidump_map.emplace_back(directory_entry->Location.RVA,
+                                directory_entry->Location.DataSize);
     }
   }
 
@@ -120,7 +135,7 @@ MinidumpParser::Create(const lldb::DataB
 
 MinidumpParser::MinidumpParser(
     lldb::DataBufferSP data_sp,
-    llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> directory_map)
+    llvm::DenseMap<StreamType, LocationDescriptor> directory_map)
     : m_data_sp(std::move(data_sp)), m_directory_map(std::move(directory_map)) {
 }
 
@@ -131,16 +146,16 @@ llvm::ArrayRef<uint8_t> MinidumpParser::
 
 llvm::ArrayRef<uint8_t>
 MinidumpParser::GetStream(StreamType stream_type) {
-  auto iter = m_directory_map.find(static_cast<uint32_t>(stream_type));
+  auto iter = m_directory_map.find(stream_type);
   if (iter == m_directory_map.end())
     return {};
 
   // check if there is enough data
-  if (iter->second.rva + iter->second.data_size > m_data_sp->GetByteSize())
+  if (iter->second.RVA + iter->second.DataSize > m_data_sp->GetByteSize())
     return {};
 
-  return llvm::ArrayRef<uint8_t>(m_data_sp->GetBytes() + iter->second.rva,
-                                 iter->second.data_size);
+  return llvm::ArrayRef<uint8_t>(m_data_sp->GetBytes() + iter->second.RVA,
+                                 iter->second.DataSize);
 }
 
 llvm::Optional<std::string> MinidumpParser::GetMinidumpString(uint32_t rva) {
@@ -153,7 +168,7 @@ llvm::Optional<std::string> MinidumpPars
 
 UUID MinidumpParser::GetModuleUUID(const MinidumpModule *module) {
   auto cv_record =
-      GetData().slice(module->CV_record.rva, module->CV_record.data_size);
+      GetData().slice(module->CV_record.RVA, module->CV_record.DataSize);
 
   // Read the CV record signature
   const llvm::support::ulittle32_t *signature = nullptr;
@@ -219,10 +234,10 @@ llvm::ArrayRef<MinidumpThread> MinidumpP
 }
 
 llvm::ArrayRef<uint8_t>
-MinidumpParser::GetThreadContext(const MinidumpLocationDescriptor &location) {
-  if (location.rva + location.data_size > GetData().size())
+MinidumpParser::GetThreadContext(const LocationDescriptor &location) {
+  if (location.RVA + location.DataSize > GetData().size())
     return {};
-  return GetData().slice(location.rva, location.data_size);
+  return GetData().slice(location.RVA, location.DataSize);
 }
 
 llvm::ArrayRef<uint8_t>
@@ -261,13 +276,18 @@ MinidumpParser::GetThreadContextWow64(co
   // stored in the first slot of the 64-bit TEB (wow64teb.Reserved1[0]).
 }
 
-const MinidumpSystemInfo *MinidumpParser::GetSystemInfo() {
+const SystemInfo *MinidumpParser::GetSystemInfo() {
   llvm::ArrayRef<uint8_t> data = GetStream(StreamType::SystemInfo);
 
   if (data.size() == 0)
     return nullptr;
+  const SystemInfo *system_info;
 
-  return MinidumpSystemInfo::Parse(data);
+  Status error = consumeObject(data, system_info);
+  if (error.Fail())
+    return nullptr;
+
+  return system_info;
 }
 
 ArchSpec MinidumpParser::GetArchitecture() {
@@ -275,7 +295,7 @@ ArchSpec MinidumpParser::GetArchitecture
     return m_arch;
 
   // Set the architecture in m_arch
-  const MinidumpSystemInfo *system_info = GetSystemInfo();
+  const SystemInfo *system_info = GetSystemInfo();
 
   if (!system_info)
     return m_arch;
@@ -286,10 +306,7 @@ ArchSpec MinidumpParser::GetArchitecture
   llvm::Triple triple;
   triple.setVendor(llvm::Triple::VendorType::UnknownVendor);
 
-  auto arch = static_cast<ProcessorArchitecture>(
-      static_cast<uint32_t>(system_info->processor_arch));
-
-  switch (arch) {
+  switch (system_info->ProcessorArch) {
   case ProcessorArchitecture::X86:
     triple.setArch(llvm::Triple::ArchType::x86);
     break;
@@ -307,11 +324,8 @@ ArchSpec MinidumpParser::GetArchitecture
     break;
   }
 
-  auto os =
-      static_cast<OSPlatform>(static_cast<uint32_t>(system_info->platform_id));
-
   // TODO add all of the OSes that Minidump/breakpad distinguishes?
-  switch (os) {
+  switch (system_info->PlatformId) {
   case OSPlatform::Win32S:
   case OSPlatform::Win32Windows:
   case OSPlatform::Win32NT:
@@ -336,7 +350,7 @@ ArchSpec MinidumpParser::GetArchitecture
   default: {
     triple.setOS(llvm::Triple::OSType::UnknownOS);
     std::string csd_version;
-    if (auto s = GetMinidumpString(system_info->csd_version_rva))
+    if (auto s = GetMinidumpString(system_info->CSDVersionRVA))
       csd_version = *s;
     if (csd_version.find("Linux") != std::string::npos)
       triple.setOS(llvm::Triple::OSType::Linux);
@@ -457,16 +471,16 @@ MinidumpParser::FindMemoryRange(lldb::ad
       return llvm::None;
 
     for (const auto &memory_desc : memory_list) {
-      const MinidumpLocationDescriptor &loc_desc = memory_desc.memory;
+      const LocationDescriptor &loc_desc = memory_desc.memory;
       const lldb::addr_t range_start = memory_desc.start_of_memory_range;
-      const size_t range_size = loc_desc.data_size;
+      const size_t range_size = loc_desc.DataSize;
 
-      if (loc_desc.rva + loc_desc.data_size > GetData().size())
+      if (loc_desc.RVA + loc_desc.DataSize > GetData().size())
         return llvm::None;
 
       if (range_start <= addr && addr < range_start + range_size) {
         return minidump::Range(range_start,
-                               GetData().slice(loc_desc.rva, range_size));
+                               GetData().slice(loc_desc.RVA, range_size));
       }
     }
   }
@@ -578,11 +592,11 @@ CreateRegionsCacheFromMemoryList(Minidum
     return false;
   regions.reserve(memory_list.size());
   for (const auto &memory_desc : memory_list) {
-    if (memory_desc.memory.data_size == 0)
+    if (memory_desc.memory.DataSize == 0)
       continue;
     MemoryRegionInfo region;
     region.GetRange().SetRangeBase(memory_desc.start_of_memory_range);
-    region.GetRange().SetByteSize(memory_desc.memory.data_size);
+    region.GetRange().SetByteSize(memory_desc.memory.DataSize);
     region.SetReadable(MemoryRegionInfo::eYes);
     region.SetMapped(MemoryRegionInfo::eYes);
     regions.push_back(region);
@@ -675,10 +689,12 @@ const MemoryRegionInfos &MinidumpParser:
   return m_regions;
 }
 
-#define ENUM_TO_CSTR(ST) case (uint32_t)StreamType::ST: return #ST
+#define ENUM_TO_CSTR(ST)                                                       \
+  case StreamType::ST:                                                         \
+    return #ST
 
 llvm::StringRef
-MinidumpParser::GetStreamTypeAsString(uint32_t stream_type) {
+MinidumpParser::GetStreamTypeAsString(StreamType stream_type) {
   switch (stream_type) {
     ENUM_TO_CSTR(Unused);
     ENUM_TO_CSTR(ThreadList);
@@ -701,6 +717,7 @@ MinidumpParser::GetStreamTypeAsString(ui
     ENUM_TO_CSTR(JavascriptData);
     ENUM_TO_CSTR(SystemMemoryInfo);
     ENUM_TO_CSTR(ProcessVMCounters);
+    ENUM_TO_CSTR(LastReserved);
     ENUM_TO_CSTR(BreakpadInfo);
     ENUM_TO_CSTR(AssertionInfo);
     ENUM_TO_CSTR(LinuxCPUInfo);

Modified: lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h?rev=356992&r1=356991&r2=356992&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h (original)
+++ lldb/trunk/source/Plugins/Process/minidump/MinidumpParser.h Tue Mar 26 06:23:01 2019
@@ -57,14 +57,13 @@ public:
 
   llvm::ArrayRef<MinidumpThread> GetThreads();
 
-  llvm::ArrayRef<uint8_t>
-  GetThreadContext(const MinidumpLocationDescriptor &location);
+  llvm::ArrayRef<uint8_t> GetThreadContext(const LocationDescriptor &location);
 
   llvm::ArrayRef<uint8_t> GetThreadContext(const MinidumpThread &td);
 
   llvm::ArrayRef<uint8_t> GetThreadContextWow64(const MinidumpThread &td);
 
-  const MinidumpSystemInfo *GetSystemInfo();
+  const SystemInfo *GetSystemInfo();
 
   ArchSpec GetArchitecture();
 
@@ -92,23 +91,22 @@ public:
 
   const MemoryRegionInfos &GetMemoryRegions();
 
-  static llvm::StringRef GetStreamTypeAsString(uint32_t stream_type);
+  static llvm::StringRef GetStreamTypeAsString(StreamType stream_type);
 
-  const llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> &
+  const llvm::DenseMap<StreamType, LocationDescriptor> &
   GetDirectoryMap() const {
     return m_directory_map;
   }
 
 private:
-  MinidumpParser(
-      lldb::DataBufferSP data_sp,
-      llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> directory_map);
+  MinidumpParser(lldb::DataBufferSP data_sp,
+                 llvm::DenseMap<StreamType, LocationDescriptor> directory_map);
 
   MemoryRegionInfo FindMemoryRegion(lldb::addr_t load_addr) const;
 
 private:
   lldb::DataBufferSP m_data_sp;
-  llvm::DenseMap<uint32_t, MinidumpLocationDescriptor> m_directory_map;
+  llvm::DenseMap<StreamType, LocationDescriptor> m_directory_map;
   ArchSpec m_arch;
   MemoryRegionInfos m_regions;
   bool m_parsed_regions = false;

Modified: lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp?rev=356992&r1=356991&r2=356992&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp (original)
+++ lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.cpp Tue Mar 26 06:23:01 2019
@@ -14,21 +14,6 @@
 using namespace lldb_private;
 using namespace minidump;
 
-const MinidumpHeader *MinidumpHeader::Parse(llvm::ArrayRef<uint8_t> &data) {
-  const MinidumpHeader *header = nullptr;
-  Status error = consumeObject(data, header);
-
-  uint32_t signature = header->signature;
-  uint32_t version = header->version & 0x0000ffff;
-  // the high 16 bits of the version field are implementation specific
-
-  if (error.Fail() || signature != Header::MagicSignature ||
-      version != Header::MagicVersion)
-    return nullptr;
-
-  return header;
-}
-
 // Minidump string
 llvm::Optional<std::string>
 lldb_private::minidump::parseMinidumpString(llvm::ArrayRef<uint8_t> &data) {
@@ -93,17 +78,6 @@ MinidumpThread::ParseThreadList(llvm::Ar
       reinterpret_cast<const MinidumpThread *>(data.data()), *thread_count);
 }
 
-// MinidumpSystemInfo
-const MinidumpSystemInfo *
-MinidumpSystemInfo::Parse(llvm::ArrayRef<uint8_t> &data) {
-  const MinidumpSystemInfo *system_info;
-  Status 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;

Modified: lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h?rev=356992&r1=356991&r2=356992&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h (original)
+++ lldb/trunk/source/Plugins/Process/minidump/MinidumpTypes.h Tue Mar 26 06:23:01 2019
@@ -76,37 +76,10 @@ Status consumeObject(llvm::ArrayRef<uint
 llvm::Optional<std::string> parseMinidumpString(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!");
-
-// 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!");
-
-// 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;
+  LocationDescriptor memory;
 
   static llvm::ArrayRef<MinidumpMemoryDescriptor>
   ParseMemoryList(llvm::ArrayRef<uint8_t> &data);
@@ -125,15 +98,6 @@ static_assert(sizeof(MinidumpMemoryDescr
               "sizeof MinidumpMemoryDescriptor64 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;
-};
-static_assert(sizeof(MinidumpDirectory) == 12,
-              "sizeof MinidumpDirectory is not correct!");
-
-// Reference:
 // https://msdn.microsoft.com/en-us/library/windows/desktop/ms680385(v=vs.85).aspx
 struct MinidumpMemoryInfoListHeader {
   llvm::support::ulittle32_t size_of_header;
@@ -226,7 +190,7 @@ struct MinidumpThread {
   llvm::support::ulittle32_t priority;
   llvm::support::ulittle64_t teb;
   MinidumpMemoryDescriptor stack;
-  MinidumpLocationDescriptor thread_context;
+  LocationDescriptor thread_context;
 
   static const MinidumpThread *Parse(llvm::ArrayRef<uint8_t> &data);
 
@@ -236,53 +200,6 @@ struct MinidumpThread {
 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
-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;
-};
-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;
-
-  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::ulittle16_t suit_mask;
-  llvm::support::ulittle16_t reserved2;
-
-  MinidumpCPUInfo cpu;
-
-  static const MinidumpSystemInfo *Parse(llvm::ArrayRef<uint8_t> &data);
-};
-static_assert(sizeof(MinidumpSystemInfo) == 56,
-              "sizeof MinidumpSystemInfo is not correct!");
-
 // TODO misc2, misc3 ?
 // Reference:
 // https://msdn.microsoft.com/en-us/library/windows/desktop/ms680389(v=vs.85).aspx
@@ -343,8 +260,8 @@ struct MinidumpModule {
   llvm::support::ulittle32_t time_date_stamp;
   llvm::support::ulittle32_t module_name_rva;
   MinidumpVSFixedFileInfo version_info;
-  MinidumpLocationDescriptor CV_record;
-  MinidumpLocationDescriptor misc_record;
+  LocationDescriptor CV_record;
+  LocationDescriptor misc_record;
   llvm::support::ulittle32_t reserved0[2];
   llvm::support::ulittle32_t reserved1[2];
 
@@ -378,7 +295,7 @@ struct MinidumpExceptionStream {
   llvm::support::ulittle32_t thread_id;
   llvm::support::ulittle32_t alignment;
   MinidumpException exception_record;
-  MinidumpLocationDescriptor thread_context;
+  LocationDescriptor thread_context;
 
   static const MinidumpExceptionStream *Parse(llvm::ArrayRef<uint8_t> &data);
 };

Modified: lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp?rev=356992&r1=356991&r2=356992&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp (original)
+++ lldb/trunk/source/Plugins/Process/minidump/ProcessMinidump.cpp Tue Mar 26 06:23:01 2019
@@ -29,7 +29,7 @@
 #include "lldb/Utility/LLDBAssert.h"
 #include "lldb/Utility/Log.h"
 #include "lldb/Utility/State.h"
-
+#include "llvm/BinaryFormat/Magic.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Threading.h"
 
@@ -104,18 +104,14 @@ lldb::ProcessSP ProcessMinidump::CreateI
 
   lldb::ProcessSP process_sp;
   // Read enough data for the Minidump header
-  constexpr size_t header_size = sizeof(MinidumpHeader);
+  constexpr size_t header_size = sizeof(Header);
   auto DataPtr = FileSystem::Instance().CreateDataBuffer(crash_file->GetPath(),
                                                          header_size, 0);
   if (!DataPtr)
     return nullptr;
 
   lldbassert(DataPtr->GetByteSize() == header_size);
-
-  // first, only try to parse the header, beacuse we need to be fast
-  llvm::ArrayRef<uint8_t> HeaderBytes = DataPtr->GetData();
-  const MinidumpHeader *header = MinidumpHeader::Parse(HeaderBytes);
-  if (header == nullptr)
+  if (identify_magic(toStringRef(DataPtr->GetData())) != llvm::file_magic::minidump)
     return nullptr;
 
   auto AllData =
@@ -301,7 +297,7 @@ void ProcessMinidump::Clear() { Process:
 bool ProcessMinidump::UpdateThreadList(ThreadList &old_thread_list,
                                        ThreadList &new_thread_list) {
   for (const MinidumpThread& thread : m_thread_list) {
-    MinidumpLocationDescriptor context_location = thread.thread_context;
+    LocationDescriptor context_location = thread.thread_context;
 
     // If the minidump contains an exception context, use it
     if (m_active_exception != nullptr &&
@@ -666,8 +662,8 @@ public:
       s.Printf("RVA        SIZE       TYPE       StreamType\n");
       s.Printf("---------- ---------- ---------- --------------------------\n");
       for (const auto &pair: minidump.GetDirectoryMap())
-        s.Printf("0x%8.8x 0x%8.8x 0x%8.8x %s\n", (uint32_t)pair.second.rva,
-                 (uint32_t)pair.second.data_size, pair.first,
+        s.Printf("0x%8.8x 0x%8.8x 0x%8.8x %s\n", (uint32_t)pair.second.RVA,
+                 (uint32_t)pair.second.DataSize, (unsigned)pair.first,
                  MinidumpParser::GetStreamTypeAsString(pair.first).data());
       s.Printf("\n");
     }
@@ -676,7 +672,7 @@ public:
       auto bytes = minidump.GetStream(stream_type);
       if (!bytes.empty()) {
         if (label.empty())
-          label = MinidumpParser::GetStreamTypeAsString((uint32_t)stream_type);
+          label = MinidumpParser::GetStreamTypeAsString(stream_type);
         s.Printf("%s:\n%s\n\n", label.data(), bytes.data());
       }
     };
@@ -685,7 +681,7 @@ public:
       auto bytes = minidump.GetStream(stream_type);
       if (!bytes.empty()) {
         if (label.empty())
-          label = MinidumpParser::GetStreamTypeAsString((uint32_t)stream_type);
+          label = MinidumpParser::GetStreamTypeAsString(stream_type);
         s.Printf("%s:\n", label.data());
         DataExtractor data(bytes.data(), bytes.size(), eByteOrderLittle,
                            process->GetAddressByteSize());




More information about the lldb-commits mailing list