diff options
author | Pavel Labath <pavel@labath.sk> | 2019-04-10 11:07:28 +0000 |
---|---|---|
committer | Pavel Labath <pavel@labath.sk> | 2019-04-10 11:07:28 +0000 |
commit | 139e9f247ab376734dcda9f2197d5fd2aea8c46f (patch) | |
tree | a75e0702954006003cd4375edef1dcf39b153d95 /lldb/source/Plugins/Process | |
parent | 3a8bb7cd2c75cc1bb83411c380b41e39003823de (diff) | |
download | bcm5719-llvm-139e9f247ab376734dcda9f2197d5fd2aea8c46f.tar.gz bcm5719-llvm-139e9f247ab376734dcda9f2197d5fd2aea8c46f.zip |
Minidump: Use llvm parser for reading the ModuleList stream
In this patch, I just remove the structure definitions for the
ModuleList stream and the associated parsing code. The rest of the code
is converted to work with the definitions in llvm. NFC.
llvm-svn: 358070
Diffstat (limited to 'lldb/source/Plugins/Process')
5 files changed, 34 insertions, 109 deletions
diff --git a/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp b/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp index d4d29f2ee45..11203f2bfcf 100644 --- a/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp +++ b/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp @@ -24,21 +24,6 @@ using namespace lldb_private; using namespace minidump; -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) { auto ExpectedFile = llvm::object::MinidumpFile::create( @@ -63,9 +48,9 @@ llvm::ArrayRef<uint8_t> MinidumpParser::GetStream(StreamType stream_type) { .getValueOr(llvm::ArrayRef<uint8_t>()); } -UUID MinidumpParser::GetModuleUUID(const MinidumpModule *module) { +UUID MinidumpParser::GetModuleUUID(const minidump::Module *module) { auto cv_record = - GetData().slice(module->CV_record.RVA, module->CV_record.DataSize); + GetData().slice(module->CvRecord.RVA, module->CvRecord.DataSize); // Read the CV record signature const llvm::support::ulittle32_t *signature = nullptr; @@ -284,28 +269,36 @@ llvm::Optional<lldb::pid_t> MinidumpParser::GetPid() { return llvm::None; } -llvm::ArrayRef<MinidumpModule> MinidumpParser::GetModuleList() { - llvm::ArrayRef<uint8_t> data = GetStream(StreamType::ModuleList); - - if (data.size() == 0) - return {}; +llvm::ArrayRef<minidump::Module> MinidumpParser::GetModuleList() { + auto ExpectedModules = GetMinidumpFile().getModuleList(); + if (ExpectedModules) + return *ExpectedModules; - return MinidumpModule::ParseModuleList(data); + LLDB_LOG_ERROR(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_MODULES), + ExpectedModules.takeError(), + "Failed to read module list: {0}"); + return {}; } -std::vector<const MinidumpModule *> MinidumpParser::GetFilteredModuleList() { - llvm::ArrayRef<MinidumpModule> modules = GetModuleList(); +std::vector<const minidump::Module *> MinidumpParser::GetFilteredModuleList() { + Log *log = GetLogIfAnyCategoriesSet(LIBLLDB_LOG_MODULES); + auto ExpectedModules = GetMinidumpFile().getModuleList(); + if (!ExpectedModules) { + LLDB_LOG_ERROR(log, ExpectedModules.takeError(), + "Failed to read module list: {0}"); + return {}; + } + // map module_name -> filtered_modules index typedef llvm::StringMap<size_t> MapType; MapType module_name_to_filtered_index; - std::vector<const MinidumpModule *> filtered_modules; - - for (const auto &module : modules) { - auto ExpectedName = m_file->getString(module.module_name_rva); + std::vector<const minidump::Module *> filtered_modules; + + for (const auto &module : *ExpectedModules) { + auto ExpectedName = m_file->getString(module.ModuleNameRVA); if (!ExpectedName) { - LLDB_LOG_ERROR(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_MODULES), - ExpectedName.takeError(), + LLDB_LOG_ERROR(log, ExpectedName.takeError(), "Failed to module name: {0}"); continue; } @@ -328,7 +321,7 @@ std::vector<const MinidumpModule *> MinidumpParser::GetFilteredModuleList() { // times when they are mapped discontiguously, so find the module with // the lowest "base_of_image" and use that as the filtered module. auto dup_module = filtered_modules[iter->second]; - if (module.base_of_image < dup_module->base_of_image) + if (module.BaseOfImage < dup_module->BaseOfImage) filtered_modules[iter->second] = &module; } } diff --git a/lldb/source/Plugins/Process/minidump/MinidumpParser.h b/lldb/source/Plugins/Process/minidump/MinidumpParser.h index 5df2d74466a..3488bcd7cfa 100644 --- a/lldb/source/Plugins/Process/minidump/MinidumpParser.h +++ b/lldb/source/Plugins/Process/minidump/MinidumpParser.h @@ -52,7 +52,7 @@ public: llvm::ArrayRef<uint8_t> GetStream(StreamType stream_type); - UUID GetModuleUUID(const MinidumpModule* module); + UUID GetModuleUUID(const minidump::Module *module); llvm::ArrayRef<MinidumpThread> GetThreads(); @@ -70,13 +70,13 @@ public: llvm::Optional<lldb::pid_t> GetPid(); - llvm::ArrayRef<MinidumpModule> GetModuleList(); + llvm::ArrayRef<minidump::Module> GetModuleList(); // There are cases in which there is more than one record in the ModuleList // for the same module name.(e.g. when the binary has non contiguous segments) // So this function returns a filtered module list - if it finds records that // have the same name, it keeps the copy with the lowest load address. - std::vector<const MinidumpModule *> GetFilteredModuleList(); + std::vector<const minidump::Module *> GetFilteredModuleList(); const MinidumpExceptionStream *GetExceptionStream(); diff --git a/lldb/source/Plugins/Process/minidump/MinidumpTypes.cpp b/lldb/source/Plugins/Process/minidump/MinidumpTypes.cpp index ba1f102c53a..13caa58b4e0 100644 --- a/lldb/source/Plugins/Process/minidump/MinidumpTypes.cpp +++ b/lldb/source/Plugins/Process/minidump/MinidumpTypes.cpp @@ -84,33 +84,6 @@ LinuxProcStatus::Parse(llvm::ArrayRef<uint8_t> &data) { lldb::pid_t LinuxProcStatus::GetPid() const { return pid; } -// Module stuff -const MinidumpModule *MinidumpModule::Parse(llvm::ArrayRef<uint8_t> &data) { - const MinidumpModule *module = nullptr; - Status error = consumeObject(data, module); - if (error.Fail()) - return nullptr; - - return module; -} - -llvm::ArrayRef<MinidumpModule> -MinidumpModule::ParseModuleList(llvm::ArrayRef<uint8_t> &data) { - const auto orig_size = data.size(); - const llvm::support::ulittle32_t *modules_count; - Status error = consumeObject(data, modules_count); - if (error.Fail() || *modules_count * sizeof(MinidumpModule) > data.size()) - return {}; - - // Compilers might end up padding an extra 4 bytes depending on how the - // structure is padded by the compiler and the #pragma pack settings. - if (4 + *modules_count * sizeof(MinidumpModule) < orig_size) - data = data.drop_front(4); - - return llvm::ArrayRef<MinidumpModule>( - reinterpret_cast<const MinidumpModule *>(data.data()), *modules_count); -} - // Exception stuff const MinidumpExceptionStream * MinidumpExceptionStream::Parse(llvm::ArrayRef<uint8_t> &data) { diff --git a/lldb/source/Plugins/Process/minidump/MinidumpTypes.h b/lldb/source/Plugins/Process/minidump/MinidumpTypes.h index ac69066ead0..711636b81e6 100644 --- a/lldb/source/Plugins/Process/minidump/MinidumpTypes.h +++ b/lldb/source/Plugins/Process/minidump/MinidumpTypes.h @@ -228,46 +228,6 @@ private: LinuxProcStatus() = default; }; -// MinidumpModule stuff -struct MinidumpVSFixedFileInfo { - llvm::support::ulittle32_t signature; - llvm::support::ulittle32_t struct_version; - llvm::support::ulittle32_t file_version_hi; - llvm::support::ulittle32_t file_version_lo; - llvm::support::ulittle32_t product_version_hi; - llvm::support::ulittle32_t product_version_lo; - // file_flags_mask - identifies valid bits in fileFlags - llvm::support::ulittle32_t file_flags_mask; - llvm::support::ulittle32_t file_flags; - llvm::support::ulittle32_t file_os; - llvm::support::ulittle32_t file_type; - llvm::support::ulittle32_t file_subtype; - llvm::support::ulittle32_t file_date_hi; - llvm::support::ulittle32_t file_date_lo; -}; -static_assert(sizeof(MinidumpVSFixedFileInfo) == 52, - "sizeof MinidumpVSFixedFileInfo is not correct!"); - -struct MinidumpModule { - llvm::support::ulittle64_t base_of_image; - llvm::support::ulittle32_t size_of_image; - llvm::support::ulittle32_t checksum; - llvm::support::ulittle32_t time_date_stamp; - llvm::support::ulittle32_t module_name_rva; - MinidumpVSFixedFileInfo version_info; - LocationDescriptor CV_record; - LocationDescriptor misc_record; - llvm::support::ulittle32_t reserved0[2]; - llvm::support::ulittle32_t reserved1[2]; - - static const MinidumpModule *Parse(llvm::ArrayRef<uint8_t> &data); - - static llvm::ArrayRef<MinidumpModule> - ParseModuleList(llvm::ArrayRef<uint8_t> &data); -}; -static_assert(sizeof(MinidumpModule) == 108, - "sizeof MinidumpVSFixedFileInfo is not correct!"); - // Exception stuff struct MinidumpException { enum : unsigned { diff --git a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp index 79de4aaabeb..5d32ba614e8 100644 --- a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp +++ b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp @@ -348,18 +348,17 @@ bool ProcessMinidump::UpdateThreadList(ThreadList &old_thread_list, } void ProcessMinidump::ReadModuleList() { - std::vector<const MinidumpModule *> filtered_modules = + std::vector<const minidump::Module *> filtered_modules = m_minidump_parser->GetFilteredModuleList(); Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES)); for (auto module : filtered_modules) { std::string name = cantFail(m_minidump_parser->GetMinidumpFile().getString( - module->module_name_rva)); + module->ModuleNameRVA)); LLDB_LOG(log, "found module: name: {0} {1:x10}-{2:x10} size: {3}", name, - module->base_of_image, - module->base_of_image + module->size_of_image, - module->size_of_image); + module->BaseOfImage, module->BaseOfImage + module->SizeOfImage, + module->SizeOfImage); // check if the process is wow64 - a 32 bit windows process running on a // 64 bit windows @@ -417,12 +416,12 @@ void ProcessMinidump::ReadModuleList() { name); module_sp = Module::CreateModuleFromObjectFile<PlaceholderObjectFile>( - module_spec, module->base_of_image, module->size_of_image); + module_spec, module->BaseOfImage, module->SizeOfImage); GetTarget().GetImages().Append(module_sp, true /* notify */); } bool load_addr_changed = false; - module_sp->SetLoadAddress(GetTarget(), module->base_of_image, false, + module_sp->SetLoadAddress(GetTarget(), module->BaseOfImage, false, load_addr_changed); } } |