Greg Clayton 56d9a1b31b Added a new plug-in type: lldb_private::OperatingSystem. The operating system
plug-ins are add on plug-ins for the lldb_private::Process class that can add
thread contexts that are read from memory. It is common in kernels to have
a lot of threads that are not currently executing on any cores (JTAG debugging
also follows this sort of thing) and are context switched out whose state is
stored in memory data structures. Clients can now subclass the OperatingSystem
plug-ins and then make sure their Create functions correcltly only enable 
themselves when the right binary/target triple are being debugged. The 
operating system plug-ins get a chance to attach themselves to processes just
after launching or attaching and are given a lldb_private::Process object 
pointer which can be inspected to see if the main executable, target triple,
or any shared  libraries match a case where the OS plug-in should be used.
Currently the OS plug-ins can create new threads, define the register contexts
for these threads (which can all be different if desired), and populate and
manage the thread info (stop reason, registers in the register context) as
the debug session goes on.

llvm-svn: 138228
2011-08-22 02:49:39 +00:00

110 lines
2.3 KiB
C++

//===-- ThreadKDP.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_ThreadKDP_h_
#define liblldb_ThreadKDP_h_
#include <string>
#include "lldb/Target/Process.h"
#include "lldb/Target/Thread.h"
class ProcessKDP;
class ThreadKDP : public lldb_private::Thread
{
public:
ThreadKDP (ProcessKDP &process,
lldb::tid_t tid);
virtual
~ThreadKDP ();
virtual bool
WillResume (lldb::StateType resume_state);
virtual void
RefreshStateAfterStop();
virtual const char *
GetName ();
virtual const char *
GetQueueName ();
virtual lldb::RegisterContextSP
GetRegisterContext ();
virtual lldb::RegisterContextSP
CreateRegisterContextForFrame (lldb_private::StackFrame *frame);
virtual void
ClearStackFrames ();
ProcessKDP &
GetKDPProcess ()
{
return (ProcessKDP &)m_process;
}
void
Dump (lldb_private::Log *log, uint32_t index);
static bool
ThreadIDIsValid (lldb::tid_t thread);
bool
ShouldStop (bool &step_more);
const char *
GetBasicInfoAsString ();
void
SetName (const char *name)
{
if (name && name[0])
m_thread_name.assign (name);
else
m_thread_name.clear();
}
lldb::addr_t
GetThreadDispatchQAddr ()
{
return m_thread_dispatch_qaddr;
}
void
SetThreadDispatchQAddr (lldb::addr_t thread_dispatch_qaddr)
{
m_thread_dispatch_qaddr = thread_dispatch_qaddr;
}
protected:
friend class ProcessKDP;
//------------------------------------------------------------------
// Member variables.
//------------------------------------------------------------------
std::string m_thread_name;
std::string m_dispatch_queue_name;
lldb::addr_t m_thread_dispatch_qaddr;
//------------------------------------------------------------------
// Member variables.
//------------------------------------------------------------------
virtual lldb::StopInfoSP
GetPrivateStopReason ();
};
#endif // liblldb_ThreadKDP_h_