diff options
author | Johnny Chen <johnny.chen@apple.com> | 2012-01-05 19:17:38 +0000 |
---|---|---|
committer | Johnny Chen <johnny.chen@apple.com> | 2012-01-05 19:17:38 +0000 |
commit | 30213ffc28b97229c0d06b1332eaced3deba62d7 (patch) | |
tree | 32b27820081f772dedf9dcec828ab8aef3406c96 /lldb/source/Plugins/Process/Linux/LinuxThread.cpp | |
parent | 99ab273a778d4836981f71dd7c947785dc3816b8 (diff) | |
download | bcm5719-llvm-30213ffc28b97229c0d06b1332eaced3deba62d7.tar.gz bcm5719-llvm-30213ffc28b97229c0d06b1332eaced3deba62d7.zip |
This patch combines common code from Linux and FreeBSD into
a new POSIX platform. It also contains fixes for 64bit FreeBSD.
The patch is based on changes by Mark Peek <mp@FreeBSD.org> and
"K. Macy" <kmacy@freebsd.org> in their github repo located at
https://github.com/fbsd/lldb.
llvm-svn: 147609
Diffstat (limited to 'lldb/source/Plugins/Process/Linux/LinuxThread.cpp')
-rw-r--r-- | lldb/source/Plugins/Process/Linux/LinuxThread.cpp | 350 |
1 files changed, 0 insertions, 350 deletions
diff --git a/lldb/source/Plugins/Process/Linux/LinuxThread.cpp b/lldb/source/Plugins/Process/Linux/LinuxThread.cpp index 7745cc9360f..e69de29bb2d 100644 --- a/lldb/source/Plugins/Process/Linux/LinuxThread.cpp +++ b/lldb/source/Plugins/Process/Linux/LinuxThread.cpp @@ -1,350 +0,0 @@ -//===-- LinuxThread.cpp -----------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -// C Includes -#include <errno.h> - -// C++ Includes -// Other libraries and framework includes -// Project includes -#include "lldb/Core/Debugger.h" -#include "lldb/Host/Host.h" -#include "lldb/Target/Process.h" -#include "lldb/Target/StopInfo.h" -#include "lldb/Target/Target.h" -#include "LinuxStopInfo.h" -#include "LinuxThread.h" -#include "ProcessLinux.h" -#include "ProcessLinuxLog.h" -#include "ProcessMonitor.h" -#include "RegisterContextLinux_i386.h" -#include "RegisterContextLinux_x86_64.h" -#include "UnwindLLDB.h" - -using namespace lldb_private; - - -LinuxThread::LinuxThread(Process &process, lldb::tid_t tid) - : Thread(process, tid), - m_frame_ap(0) -{ - LogSP log (ProcessLinuxLog::GetLogIfAllCategoriesSet (LINUX_LOG_THREAD)); - if (log && log->GetMask().Test(LINUX_LOG_VERBOSE)) - log->Printf ("LinuxThread::%s (tid = %i)", __FUNCTION__, tid); -} - -LinuxThread::~LinuxThread() -{ - DestroyThread(); -} - -ProcessMonitor & -LinuxThread::GetMonitor() -{ - ProcessLinux &process = static_cast<ProcessLinux&>(GetProcess()); - return process.GetMonitor(); -} - -void -LinuxThread::RefreshStateAfterStop() -{ - LogSP log (ProcessLinuxLog::GetLogIfAllCategoriesSet (LINUX_LOG_THREAD)); - if (log && log->GetMask().Test(LINUX_LOG_VERBOSE)) - log->Printf ("LinuxThread::%s ()", __FUNCTION__); - - // Let all threads recover from stopping and do any clean up based - // on the previous thread state (if any). - ProcessLinux &process = static_cast<ProcessLinux&>(GetProcess()); - process.GetThreadList().RefreshStateAfterStop(); -} - -const char * -LinuxThread::GetInfo() -{ - return NULL; -} - -lldb::RegisterContextSP -LinuxThread::GetRegisterContext() -{ - if (!m_reg_context_sp) - { - ArchSpec arch = Host::GetArchitecture(); - - switch (arch.GetCore()) - { - default: - assert(false && "CPU type not supported!"); - break; - - case ArchSpec::eCore_x86_32_i386: - case ArchSpec::eCore_x86_32_i486: - case ArchSpec::eCore_x86_32_i486sx: - m_reg_context_sp.reset(new RegisterContextLinux_i386(*this, 0)); - break; - - case ArchSpec::eCore_x86_64_x86_64: - m_reg_context_sp.reset(new RegisterContextLinux_x86_64(*this, 0)); - break; - } - } - return m_reg_context_sp; -} - -lldb::RegisterContextSP -LinuxThread::CreateRegisterContextForFrame(lldb_private::StackFrame *frame) -{ - lldb::RegisterContextSP reg_ctx_sp; - uint32_t concrete_frame_idx = 0; - - LogSP log (ProcessLinuxLog::GetLogIfAllCategoriesSet (LINUX_LOG_THREAD)); - if (log && log->GetMask().Test(LINUX_LOG_VERBOSE)) - log->Printf ("LinuxThread::%s ()", __FUNCTION__); - - if (frame) - concrete_frame_idx = frame->GetConcreteFrameIndex(); - - if (concrete_frame_idx == 0) - reg_ctx_sp = GetRegisterContext(); - else - { - assert(GetUnwinder()); - reg_ctx_sp = GetUnwinder()->CreateRegisterContextForFrame(frame); - } - - return reg_ctx_sp; -} - -lldb::StopInfoSP -LinuxThread::GetPrivateStopReason() -{ - return m_stop_info; -} - -Unwind * -LinuxThread::GetUnwinder() -{ - if (m_unwinder_ap.get() == NULL) - m_unwinder_ap.reset(new UnwindLLDB(*this)); - - return m_unwinder_ap.get(); -} - -bool -LinuxThread::WillResume(lldb::StateType resume_state) -{ - SetResumeState(resume_state); - - ClearStackFrames(); - if (m_unwinder_ap.get()) - m_unwinder_ap->Clear(); - - return Thread::WillResume(resume_state); -} - -bool -LinuxThread::Resume() -{ - lldb::StateType resume_state = GetResumeState(); - ProcessMonitor &monitor = GetMonitor(); - bool status; - - LogSP log (ProcessLinuxLog::GetLogIfAllCategoriesSet (LINUX_LOG_THREAD)); - if (log && log->GetMask().Test(LINUX_LOG_VERBOSE)) - log->Printf ("LinuxThread::%s ()", __FUNCTION__); - - switch (resume_state) - { - default: - assert(false && "Unexpected state for resume!"); - status = false; - break; - - case lldb::eStateRunning: - SetState(resume_state); - status = monitor.Resume(GetID(), GetResumeSignal()); - break; - - case lldb::eStateStepping: - SetState(resume_state); - status = monitor.SingleStep(GetID(), GetResumeSignal()); - break; - } - - return status; -} - -void -LinuxThread::Notify(const ProcessMessage &message) -{ - LogSP log (ProcessLinuxLog::GetLogIfAllCategoriesSet (LINUX_LOG_THREAD)); - if (log) - log->Printf ("LinuxThread::%s () message kind = '%s'", __FUNCTION__, message.PrintKind()); - - switch (message.GetKind()) - { - default: - assert(false && "Unexpected message kind!"); - break; - - case ProcessMessage::eLimboMessage: - LimboNotify(message); - break; - - case ProcessMessage::eSignalMessage: - SignalNotify(message); - break; - - case ProcessMessage::eSignalDeliveredMessage: - SignalDeliveredNotify(message); - break; - - case ProcessMessage::eTraceMessage: - TraceNotify(message); - break; - - case ProcessMessage::eBreakpointMessage: - BreakNotify(message); - break; - - case ProcessMessage::eCrashMessage: - CrashNotify(message); - break; - } -} - -void -LinuxThread::BreakNotify(const ProcessMessage &message) -{ - bool status; - LogSP log (ProcessLinuxLog::GetLogIfAllCategoriesSet (LINUX_LOG_THREAD)); - - assert(GetRegisterContextLinux()); - status = GetRegisterContextLinux()->UpdateAfterBreakpoint(); - assert(status && "Breakpoint update failed!"); - - // With our register state restored, resolve the breakpoint object - // corresponding to our current PC. - assert(GetRegisterContext()); - lldb::addr_t pc = GetRegisterContext()->GetPC(); - if (log) - log->Printf ("LinuxThread::%s () PC=0x%8.8llx", __FUNCTION__, pc); - lldb::BreakpointSiteSP bp_site(GetProcess().GetBreakpointSiteList().FindByAddress(pc)); - assert(bp_site); - lldb::break_id_t bp_id = bp_site->GetID(); - assert(bp_site && bp_site->ValidForThisThread(this)); - - - m_breakpoint = bp_site; - m_stop_info = StopInfo::CreateStopReasonWithBreakpointSiteID(*this, bp_id); -} - -void -LinuxThread::TraceNotify(const ProcessMessage &message) -{ - m_stop_info = StopInfo::CreateStopReasonToTrace(*this); -} - -void -LinuxThread::LimboNotify(const ProcessMessage &message) -{ - m_stop_info = lldb::StopInfoSP(new LinuxLimboStopInfo(*this)); -} - -void -LinuxThread::SignalNotify(const ProcessMessage &message) -{ - int signo = message.GetSignal(); - - m_stop_info = StopInfo::CreateStopReasonWithSignal(*this, signo); - SetResumeSignal(signo); -} - -void -LinuxThread::SignalDeliveredNotify(const ProcessMessage &message) -{ - int signo = message.GetSignal(); - - // Just treat debugger generated signal events like breakpoints for now. - m_stop_info = StopInfo::CreateStopReasonToTrace(*this); - SetResumeSignal(signo); -} - -void -LinuxThread::CrashNotify(const ProcessMessage &message) -{ - int signo = message.GetSignal(); - - assert(message.GetKind() == ProcessMessage::eCrashMessage); - - LogSP log (ProcessLinuxLog::GetLogIfAllCategoriesSet (LINUX_LOG_THREAD)); - if (log) - log->Printf ("LinuxThread::%s () signo = %i, reason = '%s'", __FUNCTION__, signo, message.PrintCrashReason()); - - m_stop_info = lldb::StopInfoSP(new LinuxCrashStopInfo( - *this, signo, message.GetCrashReason())); - SetResumeSignal(signo); -} - -unsigned -LinuxThread::GetRegisterIndexFromOffset(unsigned offset) -{ - unsigned reg; - ArchSpec arch = Host::GetArchitecture(); - - switch (arch.GetCore()) - { - default: - assert(false && "CPU type not supported!"); - break; - - case ArchSpec::eCore_x86_32_i386: - case ArchSpec::eCore_x86_32_i486: - case ArchSpec::eCore_x86_32_i486sx: - reg = RegisterContextLinux_i386::GetRegisterIndexFromOffset(offset); - break; - - case ArchSpec::eCore_x86_64_x86_64: - reg = RegisterContextLinux_x86_64::GetRegisterIndexFromOffset(offset); - break; - } - return reg; -} - -const char * -LinuxThread::GetRegisterName(unsigned reg) -{ - const char * name; - ArchSpec arch = Host::GetArchitecture(); - - switch (arch.GetCore()) - { - default: - assert(false && "CPU type not supported!"); - break; - - case ArchSpec::eCore_x86_32_i386: - case ArchSpec::eCore_x86_32_i486: - case ArchSpec::eCore_x86_32_i486sx: - name = RegisterContextLinux_i386::GetRegisterName(reg); - break; - - case ArchSpec::eCore_x86_64_x86_64: - name = RegisterContextLinux_x86_64::GetRegisterName(reg); - break; - } - return name; -} - -const char * -LinuxThread::GetRegisterNameFromOffset(unsigned offset) -{ - return GetRegisterName(GetRegisterIndexFromOffset(offset)); -} - |