diff options
Diffstat (limited to 'lldb/source')
10 files changed, 18 insertions, 607 deletions
diff --git a/lldb/source/API/SystemInitializerFull.cpp b/lldb/source/API/SystemInitializerFull.cpp index cfc7c2c1740..a297a7c111c 100644 --- a/lldb/source/API/SystemInitializerFull.cpp +++ b/lldb/source/API/SystemInitializerFull.cpp @@ -78,7 +78,6 @@ #include "Plugins/Platform/gdb-server/PlatformRemoteGDBServer.h" #include "Plugins/Process/elf-core/ProcessElfCore.h" #include "Plugins/Process/gdb-remote/ProcessGDBRemote.h" -#include "Plugins/Process/minidump/ProcessMinidump.h" #include "Plugins/ScriptInterpreter/None/ScriptInterpreterNone.h" #include "Plugins/SymbolFile/DWARF/SymbolFileDWARF.h" #include "Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h" @@ -308,7 +307,6 @@ void SystemInitializerFull::Initialize() { #if defined(_MSC_VER) ProcessWinMiniDump::Initialize(); #endif - minidump::ProcessMinidump::Initialize(); MemoryHistoryASan::Initialize(); AddressSanitizerRuntime::Initialize(); ThreadSanitizerRuntime::Initialize(); @@ -431,11 +429,9 @@ void SystemInitializerFull::Terminate() { JITLoaderGDB::Terminate(); ProcessElfCore::Terminate(); - #if defined(_MSC_VER) ProcessWinMiniDump::Terminate(); #endif - minidump::ProcessMinidump::Terminate(); MemoryHistoryASan::Terminate(); AddressSanitizerRuntime::Terminate(); ThreadSanitizerRuntime::Terminate(); diff --git a/lldb/source/Plugins/Process/minidump/CMakeLists.txt b/lldb/source/Plugins/Process/minidump/CMakeLists.txt index f6f9faff875..ab3cfbb58f0 100644 --- a/lldb/source/Plugins/Process/minidump/CMakeLists.txt +++ b/lldb/source/Plugins/Process/minidump/CMakeLists.txt @@ -4,6 +4,4 @@ add_lldb_library(lldbPluginProcessMinidump MinidumpTypes.cpp MinidumpParser.cpp RegisterContextMinidump_x86_64.cpp - ThreadMinidump.cpp - ProcessMinidump.cpp ) diff --git a/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp b/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp index 6661e0bba1d..2ccea6839cb 100644 --- a/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp +++ b/lldb/source/Plugins/Process/minidump/MinidumpParser.cpp @@ -1,11 +1,11 @@ -//===-- MinidumpParser.cpp -------------------------------------*- C++ -*-===// +//===-- MinidumpParser.cpp ---------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // -//===--------------------------------------------------------------------===// +//===----------------------------------------------------------------------===// // Project includes #include "MinidumpParser.h" @@ -65,7 +65,8 @@ MinidumpParser::MinidumpParser( } llvm::ArrayRef<uint8_t> MinidumpParser::GetData() { - return m_data_sp->GetData(); + return llvm::ArrayRef<uint8_t>(m_data_sp->GetBytes(), + m_data_sp->GetByteSize()); } llvm::ArrayRef<uint8_t> @@ -75,14 +76,15 @@ MinidumpParser::GetStream(MinidumpStreamType stream_type) { return {}; // check if there is enough data - if (iter->second.rva + iter->second.data_size > GetData().size()) + if (iter->second.rva + iter->second.data_size > m_data_sp->GetByteSize()) return {}; - return GetData().slice(iter->second.rva, iter->second.data_size); + return llvm::ArrayRef<uint8_t>(m_data_sp->GetBytes() + iter->second.rva, + iter->second.data_size); } llvm::Optional<std::string> MinidumpParser::GetMinidumpString(uint32_t rva) { - auto arr_ref = GetData(); + auto arr_ref = m_data_sp->GetData(); if (rva > arr_ref.size()) return llvm::None; arr_ref = arr_ref.drop_front(rva); @@ -98,14 +100,6 @@ llvm::ArrayRef<MinidumpThread> MinidumpParser::GetThreads() { return MinidumpThread::ParseThreadList(data); } -llvm::ArrayRef<uint8_t> -MinidumpParser::GetThreadContext(const MinidumpThread &td) { - if (td.thread_context.rva + td.thread_context.data_size > GetData().size()) - return llvm::None; - - return GetData().slice(td.thread_context.rva, td.thread_context.data_size); -} - const MinidumpSystemInfo *MinidumpParser::GetSystemInfo() { llvm::ArrayRef<uint8_t> data = GetStream(MinidumpStreamType::SystemInfo); @@ -230,33 +224,3 @@ const MinidumpExceptionStream *MinidumpParser::GetExceptionStream() { return MinidumpExceptionStream::Parse(data); } - -llvm::Optional<Range> MinidumpParser::FindMemoryRange(lldb::addr_t addr) { - llvm::ArrayRef<uint8_t> data = GetStream(MinidumpStreamType::MemoryList); - - if (data.size() == 0) - return llvm::None; - - llvm::ArrayRef<MinidumpMemoryDescriptor> memory_list = - MinidumpMemoryDescriptor::ParseMemoryList(data); - - if (memory_list.size() == 0) - return llvm::None; - - for (auto memory_desc : memory_list) { - const MinidumpLocationDescriptor &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; - - if (loc_desc.rva + loc_desc.data_size > GetData().size()) - return llvm::None; - - if (range_start <= addr && addr < range_start + range_size) { - return Range(range_start, GetData().slice(loc_desc.rva, range_size)); - } - } - - // TODO parse Memory64List which is present in full-memory Minidumps - - return llvm::None; -} diff --git a/lldb/source/Plugins/Process/minidump/MinidumpParser.h b/lldb/source/Plugins/Process/minidump/MinidumpParser.h index 686d0f39f6e..76a8ece00b2 100644 --- a/lldb/source/Plugins/Process/minidump/MinidumpParser.h +++ b/lldb/source/Plugins/Process/minidump/MinidumpParser.h @@ -1,11 +1,12 @@ -//===-- MinidumpParser.h ---------------------------------------*- C++ -*-===// +//===-- MinidumpParser.h -----------------------------------------*- C++ +//-*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // -//===--------------------------------------------------------------------===// +//===----------------------------------------------------------------------===// #ifndef liblldb_MinidumpParser_h_ #define liblldb_MinidumpParser_h_ @@ -24,22 +25,15 @@ #include "llvm/ADT/StringRef.h" // C includes + // C++ includes +#include <cstring> +#include <unordered_map> namespace lldb_private { namespace minidump { -// Describes a range of memory captured in the Minidump -struct Range { - lldb::addr_t start; // virtual address of the beginning of the range - // range_ref - absolute pointer to the first byte of the range and size - llvm::ArrayRef<uint8_t> range_ref; - - Range(lldb::addr_t start, llvm::ArrayRef<uint8_t> range_ref) - : start(start), range_ref(range_ref) {} -}; - class MinidumpParser { public: static llvm::Optional<MinidumpParser> @@ -53,8 +47,6 @@ public: llvm::ArrayRef<MinidumpThread> GetThreads(); - llvm::ArrayRef<uint8_t> GetThreadContext(const MinidumpThread &td); - const MinidumpSystemInfo *GetSystemInfo(); ArchSpec GetArchitecture(); @@ -69,8 +61,6 @@ public: const MinidumpExceptionStream *GetExceptionStream(); - llvm::Optional<Range> FindMemoryRange(lldb::addr_t addr); - private: lldb::DataBufferSP m_data_sp; const MinidumpHeader *m_header; diff --git a/lldb/source/Plugins/Process/minidump/MinidumpTypes.cpp b/lldb/source/Plugins/Process/minidump/MinidumpTypes.cpp index 55f859838cd..5f8aa59397f 100644 --- a/lldb/source/Plugins/Process/minidump/MinidumpTypes.cpp +++ b/lldb/source/Plugins/Process/minidump/MinidumpTypes.cpp @@ -85,7 +85,7 @@ MinidumpThread::ParseThreadList(llvm::ArrayRef<uint8_t> &data) { if (error.Fail() || *thread_count * sizeof(MinidumpThread) > data.size()) return {}; - return llvm::makeArrayRef( + return llvm::ArrayRef<MinidumpThread>( reinterpret_cast<const MinidumpThread *>(data.data()), *thread_count); } @@ -162,7 +162,7 @@ MinidumpModule::ParseModuleList(llvm::ArrayRef<uint8_t> &data) { if (error.Fail() || *modules_count * sizeof(MinidumpModule) > data.size()) return {}; - return llvm::makeArrayRef( + return llvm::ArrayRef<MinidumpModule>( reinterpret_cast<const MinidumpModule *>(data.data()), *modules_count); } @@ -176,16 +176,3 @@ MinidumpExceptionStream::Parse(llvm::ArrayRef<uint8_t> &data) { return exception_stream; } - -llvm::ArrayRef<MinidumpMemoryDescriptor> -MinidumpMemoryDescriptor::ParseMemoryList(llvm::ArrayRef<uint8_t> &data) { - const llvm::support::ulittle32_t *mem_ranges_count; - Error error = consumeObject(data, mem_ranges_count); - if (error.Fail() || - *mem_ranges_count * sizeof(MinidumpMemoryDescriptor) > data.size()) - return {}; - - return llvm::makeArrayRef( - reinterpret_cast<const MinidumpMemoryDescriptor *>(data.data()), - *mem_ranges_count); -} diff --git a/lldb/source/Plugins/Process/minidump/MinidumpTypes.h b/lldb/source/Plugins/Process/minidump/MinidumpTypes.h index b452c27514b..bc3d846550a 100644 --- a/lldb/source/Plugins/Process/minidump/MinidumpTypes.h +++ b/lldb/source/Plugins/Process/minidump/MinidumpTypes.h @@ -207,9 +207,6 @@ static_assert(sizeof(MinidumpLocationDescriptor) == 8, struct MinidumpMemoryDescriptor { llvm::support::ulittle64_t start_of_memory_range; MinidumpLocationDescriptor memory; - - static llvm::ArrayRef<MinidumpMemoryDescriptor> - ParseMemoryList(llvm::ArrayRef<uint8_t> &data); }; static_assert(sizeof(MinidumpMemoryDescriptor) == 16, "sizeof MinidumpMemoryDescriptor is not correct!"); @@ -365,8 +362,7 @@ static_assert(sizeof(MinidumpModule) == 108, // Exception stuff struct MinidumpException { enum { - ExceptonInfoMaxParams = 15, - DumpRequested = 0xFFFFFFFF, + MaxParams = 15, }; llvm::support::ulittle32_t exception_code; @@ -375,7 +371,7 @@ struct MinidumpException { llvm::support::ulittle64_t exception_address; llvm::support::ulittle32_t number_parameters; llvm::support::ulittle32_t unused_alignment; - llvm::support::ulittle64_t exception_information[ExceptonInfoMaxParams]; + llvm::support::ulittle64_t exception_information[MaxParams]; }; static_assert(sizeof(MinidumpException) == 152, "sizeof MinidumpException is not correct!"); diff --git a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp b/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp deleted file mode 100644 index 12f83fe3f20..00000000000 --- a/lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp +++ /dev/null @@ -1,263 +0,0 @@ -//===-- ProcessMinidump.cpp -------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -// Project includes -#include "ProcessMinidump.h" -#include "ThreadMinidump.h" - -// Other libraries and framework includes -#include "lldb/Core/DataBufferHeap.h" -#include "lldb/Core/Log.h" -#include "lldb/Core/Module.h" -#include "lldb/Core/ModuleSpec.h" -#include "lldb/Core/PluginManager.h" -#include "lldb/Core/Section.h" -#include "lldb/Core/State.h" -#include "lldb/Target/DynamicLoader.h" -#include "lldb/Target/MemoryRegionInfo.h" -#include "lldb/Target/Target.h" -#include "lldb/Target/UnixSignals.h" -#include "lldb/Utility/LLDBAssert.h" - -// C includes -// C++ includes - -using namespace lldb_private; -using namespace minidump; - -ConstString ProcessMinidump::GetPluginNameStatic() { - static ConstString g_name("minidump"); - return g_name; -} - -const char *ProcessMinidump::GetPluginDescriptionStatic() { - return "Minidump plug-in."; -} - -lldb::ProcessSP ProcessMinidump::CreateInstance(lldb::TargetSP target_sp, - lldb::ListenerSP listener_sp, - const FileSpec *crash_file) { - if (!crash_file) - return nullptr; - - lldb::ProcessSP process_sp; - // Read enough data for the Minidump header - const size_t header_size = sizeof(MinidumpHeader); - lldb::DataBufferSP data_sp(crash_file->MemoryMapFileContents(0, header_size)); - // The memory map can fail - if (!data_sp) - return nullptr; - - // first, only try to parse the header, beacuse we need to be fast - llvm::ArrayRef<uint8_t> header_data(data_sp->GetBytes(), header_size); - const MinidumpHeader *header = MinidumpHeader::Parse(header_data); - - if (data_sp->GetByteSize() != header_size || header == nullptr) - return nullptr; - - lldb::DataBufferSP all_data_sp(crash_file->MemoryMapFileContents()); - auto minidump_parser = MinidumpParser::Create(all_data_sp); - // check if the parser object is valid - // skip if the Minidump file is Windows generated, because we are still - // work-in-progress - if (!minidump_parser || - minidump_parser->GetArchitecture().GetTriple().getOS() == - llvm::Triple::OSType::Win32) - return nullptr; - - return lldb::ProcessSP(new ProcessMinidump( - target_sp, listener_sp, *crash_file, minidump_parser.getValue())); -} - -// TODO leave it to be only "return true" ? -bool ProcessMinidump::CanDebug(lldb::TargetSP target_sp, - bool plugin_specified_by_name) { - return true; -} - -ProcessMinidump::ProcessMinidump(lldb::TargetSP target_sp, - lldb::ListenerSP listener_sp, - const FileSpec &core_file, - MinidumpParser minidump_parser) - : Process(target_sp, listener_sp), m_minidump_parser(minidump_parser), - m_core_file(core_file) {} - -ProcessMinidump::~ProcessMinidump() { - Clear(); - // We need to call finalize on the process before destroying ourselves - // to make sure all of the broadcaster cleanup goes as planned. If we - // destruct this class, then Process::~Process() might have problems - // trying to fully destroy the broadcaster. - Finalize(); -} - -void ProcessMinidump::Initialize() { - static std::once_flag g_once_flag; - - std::call_once(g_once_flag, []() { - PluginManager::RegisterPlugin(GetPluginNameStatic(), - GetPluginDescriptionStatic(), - ProcessMinidump::CreateInstance); - }); -} - -void ProcessMinidump::Terminate() { - PluginManager::UnregisterPlugin(ProcessMinidump::CreateInstance); -} - -Error ProcessMinidump::DoLoadCore() { - Error error; - - m_thread_list = m_minidump_parser.GetThreads(); - m_active_exception = m_minidump_parser.GetExceptionStream(); - GetTarget().SetArchitecture(GetArchitecture()); - ReadModuleList(); - - llvm::Optional<lldb::pid_t> pid = m_minidump_parser.GetPid(); - if (!pid) { - error.SetErrorString("failed to parse PID"); - return error; - } - SetID(pid.getValue()); - - return error; -} - -DynamicLoader *ProcessMinidump::GetDynamicLoader() { - if (m_dyld_ap.get() == nullptr) - m_dyld_ap.reset(DynamicLoader::FindPlugin(this, nullptr)); - return m_dyld_ap.get(); -} - -ConstString ProcessMinidump::GetPluginName() { return GetPluginNameStatic(); } - -uint32_t ProcessMinidump::GetPluginVersion() { return 1; } - -Error ProcessMinidump::DoDestroy() { return Error(); } - -void ProcessMinidump::RefreshStateAfterStop() { - if (!m_active_exception) - return; - - if (m_active_exception->exception_record.exception_code == - MinidumpException::DumpRequested) { - return; - } - - lldb::StopInfoSP stop_info; - lldb::ThreadSP stop_thread; - - Process::m_thread_list.SetSelectedThreadByID(m_active_exception->thread_id); - stop_thread = Process::m_thread_list.GetSelectedThread(); - ArchSpec arch = GetArchitecture(); - - if (arch.GetTriple().getOS() == llvm::Triple::Linux) { - stop_info = StopInfo::CreateStopReasonWithSignal( - *stop_thread, m_active_exception->exception_record.exception_code); - } else { - std::string desc; - llvm::raw_string_ostream desc_stream(desc); - desc_stream << "Exception " - << llvm::format_hex( - m_active_exception->exception_record.exception_code, 8) - << " encountered at address " - << llvm::format_hex( - m_active_exception->exception_record.exception_address, - 8); - stop_info = StopInfo::CreateStopReasonWithException( - *stop_thread, desc_stream.str().c_str()); - } - - stop_thread->SetStopInfo(stop_info); -} - -bool ProcessMinidump::IsAlive() { return true; } - -bool ProcessMinidump::WarnBeforeDetach() const { return false; } - -size_t ProcessMinidump::ReadMemory(lldb::addr_t addr, void *buf, size_t size, - lldb_private::Error &error) { - // Don't allow the caching that lldb_private::Process::ReadMemory does - // since we have it all cached in our dump file anyway. - return DoReadMemory(addr, buf, size, error); -} - -size_t ProcessMinidump::DoReadMemory(lldb::addr_t addr, void *buf, size_t size, - lldb_private::Error &error) { - // I don't have a sense of how frequently this is called or how many memory - // ranges a Minidump typically has, so I'm not sure if searching for the - // appropriate range linearly each time is stupid. Perhaps we should build - // an index for faster lookups. - llvm::Optional<Range> range = m_minidump_parser.FindMemoryRange(addr); - if (!range) - return 0; - - // There's at least some overlap between the beginning of the desired range - // (addr) and the current range. Figure out where the overlap begins and - // how much overlap there is, then copy it to the destination buffer. - lldbassert(range->start <= addr); - const size_t offset = addr - range->start; - lldbassert(offset < range->range_ref.size()); - const size_t overlap = std::min(size, range->range_ref.size() - offset); - std::memcpy(buf, range->range_ref.data() + offset, overlap); - return overlap; -} - -ArchSpec ProcessMinidump::GetArchitecture() { - return m_minidump_parser.GetArchitecture(); -} - -// TODO - parse the MemoryInfoListStream and implement this method -Error ProcessMinidump::GetMemoryRegionInfo( - lldb::addr_t load_addr, lldb_private::MemoryRegionInfo &range_info) { - return {}; -} - -void ProcessMinidump::Clear() { Process::m_thread_list.Clear(); } - -bool ProcessMinidump::UpdateThreadList( - lldb_private::ThreadList &old_thread_list, - lldb_private::ThreadList &new_thread_list) { - uint32_t num_threads = 0; - if (m_thread_list.size() > 0) - num_threads = m_thread_list.size(); - - for (lldb::tid_t tid = 0; tid < num_threads; ++tid) { - lldb::ThreadSP thread_sp(new ThreadMinidump( - *this, m_thread_list[tid], - m_minidump_parser.GetThreadContext(m_thread_list[tid]))); - new_thread_list.AddThread(thread_sp); - } - return new_thread_list.GetSize(false) > 0; -} - -void ProcessMinidump::ReadModuleList() { - llvm::ArrayRef<MinidumpModule> modules = m_minidump_parser.GetModuleList(); - - for (auto module : modules) { - llvm::Optional<std::string> name = - m_minidump_parser.GetMinidumpString(module.module_name_rva); - - if (!name) - continue; - - const auto file_spec = FileSpec(name.getValue(), true); - ModuleSpec module_spec = file_spec; - Error error; - lldb::ModuleSP module_sp = - this->GetTarget().GetSharedModule(module_spec, &error); - if (!module_sp || error.Fail()) { - continue; - } - - bool load_addr_changed = false; - module_sp->SetLoadAddress(this->GetTarget(), module.base_of_image, false, - load_addr_changed); - } -} diff --git a/lldb/source/Plugins/Process/minidump/ProcessMinidump.h b/lldb/source/Plugins/Process/minidump/ProcessMinidump.h deleted file mode 100644 index 00c45d6491a..00000000000 --- a/lldb/source/Plugins/Process/minidump/ProcessMinidump.h +++ /dev/null @@ -1,103 +0,0 @@ -//===-- ProcessMinidump.h ---------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef liblldb_ProcessMinidump_h_ -#define liblldb_ProcessMinidump_h_ - -// Project includes -#include "MinidumpParser.h" -#include "MinidumpTypes.h" - -// Other libraries and framework includes -#include "lldb/Core/ConstString.h" -#include "lldb/Core/Error.h" -#include "lldb/Target/Process.h" -#include "lldb/Target/StopInfo.h" -#include "lldb/Target/Target.h" - -#include "llvm/Support/Format.h" -#include "llvm/Support/raw_ostream.h" - -// C Includes -// C++ Includes - -namespace lldb_private { - -namespace minidump { - -class ProcessMinidump : public Process { -public: - static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp, - lldb::ListenerSP listener_sp, - const FileSpec *crash_file_path); - - static void Initialize(); - - static void Terminate(); - - static ConstString GetPluginNameStatic(); - - static const char *GetPluginDescriptionStatic(); - - ProcessMinidump(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, - const lldb_private::FileSpec &core_file, - MinidumpParser minidump_parser); - - ~ProcessMinidump() override; - - bool CanDebug(lldb::TargetSP target_sp, - bool plugin_specified_by_name) override; - - Error DoLoadCore() override; - - DynamicLoader *GetDynamicLoader() override; - - ConstString GetPluginName() override; - - uint32_t GetPluginVersion() override; - - Error DoDestroy() override; - - void RefreshStateAfterStop() override; - - bool IsAlive() override; - - bool WarnBeforeDetach() const override; - - size_t ReadMemory(lldb::addr_t addr, void *buf, size_t size, - Error &error) override; - - size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, - Error &error) override; - - ArchSpec GetArchitecture(); - - Error GetMemoryRegionInfo(lldb::addr_t load_addr, - MemoryRegionInfo &range_info) override; - - MinidumpParser m_minidump_parser; - -protected: - void Clear(); - - bool UpdateThreadList(ThreadList &old_thread_list, - ThreadList &new_thread_list) override; - - void ReadModuleList(); - -private: - FileSpec m_core_file; - llvm::ArrayRef<MinidumpThread> m_thread_list; - const MinidumpExceptionStream *m_active_exception; -}; - -} // namespace minidump -} // namespace lldb_private - -#endif // liblldb_ProcessMinidump_h_ diff --git a/lldb/source/Plugins/Process/minidump/ThreadMinidump.cpp b/lldb/source/Plugins/Process/minidump/ThreadMinidump.cpp deleted file mode 100644 index 22641da9e69..00000000000 --- a/lldb/source/Plugins/Process/minidump/ThreadMinidump.cpp +++ /dev/null @@ -1,102 +0,0 @@ -//===-- ThreadMinidump.cpp --------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -// Project includes -#include "ThreadMinidump.h" -#include "ProcessMinidump.h" - -#include "RegisterContextMinidump_x86_64.h" - -// Other libraries and framework includes -#include "Plugins/Process/Utility/RegisterContextLinux_x86_64.h" - -#include "Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.h" - -#include "lldb/Core/DataExtractor.h" -#include "lldb/Core/Log.h" -#include "lldb/Target/RegisterContext.h" -#include "lldb/Target/StopInfo.h" -#include "lldb/Target/Target.h" -#include "lldb/Target/Unwind.h" - -// C Includes -// C++ Includes - -using namespace lldb; -using namespace lldb_private; -using namespace minidump; - -ThreadMinidump::ThreadMinidump(Process &process, const MinidumpThread &td, - llvm::ArrayRef<uint8_t> gpregset_data) - : Thread(process, td.thread_id), m_thread_reg_ctx_sp(), - m_gpregset_data(gpregset_data) {} - -ThreadMinidump::~ThreadMinidump() {} - -void ThreadMinidump::RefreshStateAfterStop() {} - -void ThreadMinidump::ClearStackFrames() {} - -RegisterContextSP ThreadMinidump::GetRegisterContext() { - if (!m_reg_context_sp) { - m_reg_context_sp = CreateRegisterContextForFrame(nullptr); - } - return m_reg_context_sp; -} - -RegisterContextSP -ThreadMinidump::CreateRegisterContextForFrame(StackFrame *frame) { - RegisterContextSP reg_ctx_sp; - uint32_t concrete_frame_idx = 0; - Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD)); - - if (frame) - concrete_frame_idx = frame->GetConcreteFrameIndex(); - - if (concrete_frame_idx == 0) { - if (m_thread_reg_ctx_sp) - return m_thread_reg_ctx_sp; - - ProcessMinidump *process = - static_cast<ProcessMinidump *>(GetProcess().get()); - ArchSpec arch = process->GetArchitecture(); - RegisterInfoInterface *reg_interface = nullptr; - - // TODO write other register contexts and add them here - switch (arch.GetMachine()) { - case llvm::Triple::x86_64: { - reg_interface = new RegisterContextLinux_x86_64(arch); - lldb::DataBufferSP buf = - ConvertMinidumpContextToRegIface(m_gpregset_data, reg_interface); - DataExtractor gpregs(buf, lldb::eByteOrderLittle, 8); - DataExtractor fpregs; - m_thread_reg_ctx_sp.reset(new RegisterContextCorePOSIX_x86_64( - *this, reg_interface, gpregs, fpregs)); - break; - } - default: - break; - } - - if (!reg_interface) { - if (log) - log->Printf("elf-core::%s:: Architecture(%d) not supported", - __FUNCTION__, arch.GetMachine()); - assert(false && "Architecture not supported"); - } - - reg_ctx_sp = m_thread_reg_ctx_sp; - } else if (m_unwinder_ap) { - reg_ctx_sp = m_unwinder_ap->CreateRegisterContextForFrame(frame); - } - - return reg_ctx_sp; -} - -bool ThreadMinidump::CalculateStopInfo() { return false; } diff --git a/lldb/source/Plugins/Process/minidump/ThreadMinidump.h b/lldb/source/Plugins/Process/minidump/ThreadMinidump.h deleted file mode 100644 index 97db452edff..00000000000 --- a/lldb/source/Plugins/Process/minidump/ThreadMinidump.h +++ /dev/null @@ -1,52 +0,0 @@ -//===-- ThreadMinidump.h ---------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#ifndef liblldb_ThreadMinidump_h_ -#define liblldb_ThreadMinidump_h_ - -// Project includes -#include "MinidumpTypes.h" - -// Other libraries and framework includes -#include "lldb/Target/Thread.h" - -// C Includes -// C++ Includes - -namespace lldb_private { - -namespace minidump { - -class ThreadMinidump : public Thread { -public: - ThreadMinidump(Process &process, const MinidumpThread &td, - llvm::ArrayRef<uint8_t> gpregset_data); - - ~ThreadMinidump() override; - - void RefreshStateAfterStop() override; - - lldb::RegisterContextSP GetRegisterContext() override; - - lldb::RegisterContextSP - CreateRegisterContextForFrame(StackFrame *frame) override; - - void ClearStackFrames() override; - -protected: - lldb::RegisterContextSP m_thread_reg_ctx_sp; - llvm::ArrayRef<uint8_t> m_gpregset_data; - - bool CalculateStopInfo() override; -}; - -} // namespace minidump -} // namespace lldb_private - -#endif // liblldb_ThreadMinidump_h_ |

