blob: 3f122c234abf8f649fed4f1f5a905b30bf1740b1 [file] [log] [blame]
//===-- ThreadMacOSX.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_ThreadMacOSX_h_
#define liblldb_ThreadMacOSX_h_
#include <libproc.h>
#include "lldb/Target/Process.h"
#include "lldb/Target/Thread.h"
#include "MachException.h"
class ProcessMacOSX;
class MachThreadContext;
class ThreadMacOSX : public lldb_private::Thread
{
public:
ThreadMacOSX (ProcessMacOSX &process, lldb::tid_t tid);
virtual
~ThreadMacOSX ();
virtual bool
WillResume (lldb::StateType resume_state);
virtual void
RefreshStateAfterStop();
virtual const char *
GetInfo ();
virtual const char *
GetName ();
virtual lldb::RegisterContextSP
GetRegisterContext ();
virtual lldb::RegisterContextSP
CreateRegisterContextForFrame (lldb_private::StackFrame *frame);
virtual void
ClearStackFrames ();
ProcessMacOSX &
GetMacOSXProcess ()
{
return (ProcessMacOSX &)m_process;
}
const ProcessMacOSX &
GetMacOSXProcess () const
{
return (ProcessMacOSX &)m_process;
}
void
Dump (lldb_private::Log *log, uint32_t index);
lldb::tid_t
InferiorThreadID () const;
static bool
ThreadIDIsValid (lldb::tid_t thread);
int32_t
Resume ();
int32_t
Suspend ();
int32_t
GetSuspendCount () const { return m_suspend_count; }
bool
RestoreSuspendCount ();
uint32_t
SetHardwareBreakpoint (const lldb_private::BreakpointSite *bp);
uint32_t
SetHardwareWatchpoint (const lldb_private::WatchpointLocation *wp);
bool
ClearHardwareBreakpoint (const lldb_private::BreakpointSite *bp);
bool
ClearHardwareWatchpoint (const lldb_private::WatchpointLocation *wp);
void
ThreadWillResume (lldb::StateType resume_state);
virtual void
DidResume ();
bool
ShouldStop (bool &step_more);
bool
NotifyException (MachException::Data& exc);
const MachException::Data&
GetStopException () { return m_stop_exception; }
const char *
GetBasicInfoAsString ();
size_t
GetStackFrameData (std::vector<std::pair<lldb::addr_t, lldb::addr_t> >& fp_pc_pairs);
virtual lldb::StopInfoSP
GetPrivateStopReason ();
protected:
virtual bool
SaveFrameZeroState (RegisterCheckpoint &checkpoint);
virtual bool
RestoreSaveFrameZero (const RegisterCheckpoint &checkpoint);
bool
GetIdentifierInfo ();
const char *
GetDispatchQueueName();
static bool
GetBasicInfo (lldb::tid_t threadID, struct thread_basic_info *basic_info);
virtual lldb_private::Unwind *
GetUnwinder ();
//------------------------------------------------------------------
// Member variables.
//------------------------------------------------------------------
std::vector<std::pair<lldb::addr_t, lldb::addr_t> > m_fp_pc_pairs;
struct thread_basic_info m_basic_info; // Basic information for a thread used to see if a thread is valid
std::string m_basic_info_string;// Basic thread info as a C string.
#ifdef THREAD_IDENTIFIER_INFO_COUNT
thread_identifier_info_data_t m_ident_info;
struct proc_threadinfo m_proc_threadinfo;
std::string m_dispatch_queue_name;
#endif
int32_t m_suspend_count; // The current suspend count
MachException::Data m_stop_exception; // The best exception that describes why this thread is stopped
std::auto_ptr<MachThreadContext> m_context; // The arch specific thread context for this thread (register state and more)
};
#endif // liblldb_ThreadMacOSX_h_