Path: blob/main/contrib/llvm-project/lldb/source/Plugins/Process/minidump/ThreadMinidump.cpp
39644 views
//===-- ThreadMinidump.cpp ------------------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "ThreadMinidump.h"910#include "ProcessMinidump.h"1112#include "RegisterContextMinidump_ARM.h"13#include "RegisterContextMinidump_ARM64.h"14#include "RegisterContextMinidump_x86_32.h"15#include "RegisterContextMinidump_x86_64.h"1617#include "Plugins/Process/Utility/RegisterContextLinux_i386.h"18#include "Plugins/Process/Utility/RegisterContextLinux_x86_64.h"19#include "Plugins/Process/elf-core/RegisterContextPOSIXCore_x86_64.h"20#include "Plugins/Process/elf-core/RegisterUtilities.h"2122#include "lldb/Target/RegisterContext.h"23#include "lldb/Target/StopInfo.h"24#include "lldb/Target/Target.h"25#include "lldb/Target/Unwind.h"26#include "lldb/Utility/DataExtractor.h"27#include "lldb/Utility/Log.h"2829#include <memory>3031using namespace lldb;32using namespace lldb_private;33using namespace minidump;3435ThreadMinidump::ThreadMinidump(Process &process, const minidump::Thread &td,36llvm::ArrayRef<uint8_t> gpregset_data)37: Thread(process, td.ThreadId), m_thread_reg_ctx_sp(),38m_gpregset_data(gpregset_data) {}3940ThreadMinidump::~ThreadMinidump() = default;4142void ThreadMinidump::RefreshStateAfterStop() {}4344RegisterContextSP ThreadMinidump::GetRegisterContext() {45if (!m_reg_context_sp) {46m_reg_context_sp = CreateRegisterContextForFrame(nullptr);47}48return m_reg_context_sp;49}5051RegisterContextSP52ThreadMinidump::CreateRegisterContextForFrame(StackFrame *frame) {53RegisterContextSP reg_ctx_sp;54uint32_t concrete_frame_idx = 0;5556if (frame)57concrete_frame_idx = frame->GetConcreteFrameIndex();5859if (concrete_frame_idx == 0) {60if (m_thread_reg_ctx_sp)61return m_thread_reg_ctx_sp;6263ProcessMinidump *process =64static_cast<ProcessMinidump *>(GetProcess().get());65ArchSpec arch = process->GetArchitecture();66RegisterInfoInterface *reg_interface = nullptr;6768// TODO write other register contexts and add them here69switch (arch.GetMachine()) {70case llvm::Triple::x86: {71reg_interface = new RegisterContextLinux_i386(arch);72lldb::DataBufferSP buf =73ConvertMinidumpContext_x86_32(m_gpregset_data, reg_interface);74DataExtractor gpregset(buf, lldb::eByteOrderLittle, 4);75m_thread_reg_ctx_sp = std::make_shared<RegisterContextCorePOSIX_x86_64>(76*this, reg_interface, gpregset,77llvm::ArrayRef<lldb_private::CoreNote>());78break;79}80case llvm::Triple::x86_64: {81reg_interface = new RegisterContextLinux_x86_64(arch);82lldb::DataBufferSP buf =83ConvertMinidumpContext_x86_64(m_gpregset_data, reg_interface);84DataExtractor gpregset(buf, lldb::eByteOrderLittle, 8);85m_thread_reg_ctx_sp = std::make_shared<RegisterContextCorePOSIX_x86_64>(86*this, reg_interface, gpregset,87llvm::ArrayRef<lldb_private::CoreNote>());88break;89}90case llvm::Triple::aarch64: {91DataExtractor data(m_gpregset_data.data(), m_gpregset_data.size(),92lldb::eByteOrderLittle, 8);93m_thread_reg_ctx_sp =94std::make_shared<RegisterContextMinidump_ARM64>(*this, data);95break;96}97case llvm::Triple::arm: {98DataExtractor data(m_gpregset_data.data(), m_gpregset_data.size(),99lldb::eByteOrderLittle, 8);100const bool apple = arch.GetTriple().getVendor() == llvm::Triple::Apple;101m_thread_reg_ctx_sp =102std::make_shared<RegisterContextMinidump_ARM>(*this, data, apple);103break;104}105default:106break;107}108109reg_ctx_sp = m_thread_reg_ctx_sp;110} else if (m_unwinder_up) {111reg_ctx_sp = m_unwinder_up->CreateRegisterContextForFrame(frame);112}113114return reg_ctx_sp;115}116117bool ThreadMinidump::CalculateStopInfo() { return false; }118119120