
a method: void RegisterContext::InvalidateIfNeeded (bool force); Each time this function is called, when "force" is false, it will only call the pure virtual "virtual void RegisterContext::InvalideAllRegisters()" if the register context's stop ID doesn't match that of the process. When the stop ID doesn't match, or "force" is true, the base class will clear its cached registers and the RegisterContext will update its stop ID to match that of the process. This helps make it easier to correctly flush the register context (possibly from multiple locations depending on when and where new registers are availabe) without inadvertently clearing the register cache when it doesn't need to be. Modified the ProcessGDBRemote plug-in to be much more efficient when it comes to: - caching the expedited registers in the stop reply packets (we were ignoring these before and it was causing us to read at least three registers every time we stopped that were already supplied in the stop reply packet). - When a thread has no stop reason, don't keep asking for the thread stopped info. Prior to this fix we would continually send a qThreadStopInfo packet over and over when any thread stop info was requested. We now note the stop ID that the stop info was requested for and avoid multiple requests. Cleaned up some of the expression code to not look for ClangExpressionVariable objects up by name since they are now shared pointers and we can just look for the exact pointer match and avoid possible errors. Fixed an bug in the ValueObject code that would cause children to not be displayed. llvm-svn: 123127
142 lines
3.1 KiB
C++
142 lines
3.1 KiB
C++
//===-- ThreadGDBRemote.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_ThreadGDBRemote_h_
|
|
#define liblldb_ThreadGDBRemote_h_
|
|
|
|
#include <string>
|
|
|
|
#include "lldb/Target/Process.h"
|
|
#include "lldb/Target/Thread.h"
|
|
|
|
class StringExtractor;
|
|
class ProcessGDBRemote;
|
|
|
|
class ThreadGDBRemote : public lldb_private::Thread
|
|
{
|
|
public:
|
|
ThreadGDBRemote (ProcessGDBRemote &process, lldb::tid_t tid);
|
|
|
|
virtual
|
|
~ThreadGDBRemote ();
|
|
|
|
virtual bool
|
|
WillResume (lldb::StateType resume_state);
|
|
|
|
virtual void
|
|
RefreshStateAfterStop();
|
|
|
|
virtual const char *
|
|
GetInfo ();
|
|
|
|
virtual const char *
|
|
GetName ();
|
|
|
|
virtual const char *
|
|
GetQueueName ();
|
|
|
|
virtual lldb::RegisterContextSP
|
|
GetRegisterContext ();
|
|
|
|
virtual lldb::RegisterContextSP
|
|
CreateRegisterContextForFrame (lldb_private::StackFrame *frame);
|
|
|
|
virtual bool
|
|
SaveFrameZeroState (RegisterCheckpoint &checkpoint);
|
|
|
|
virtual bool
|
|
RestoreSaveFrameZero (const RegisterCheckpoint &checkpoint);
|
|
|
|
virtual void
|
|
ClearStackFrames ();
|
|
|
|
ProcessGDBRemote &
|
|
GetGDBProcess ()
|
|
{
|
|
return (ProcessGDBRemote &)m_process;
|
|
}
|
|
|
|
const ProcessGDBRemote &
|
|
GetGDBProcess () const
|
|
{
|
|
return (ProcessGDBRemote &)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
|
|
SetStopInfo (const lldb::StopInfoSP &stop_info)
|
|
{
|
|
m_actual_stop_info_sp = stop_info;
|
|
}
|
|
|
|
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 ProcessGDBRemote;
|
|
|
|
void
|
|
PrivateSetRegisterValue (uint32_t reg,
|
|
StringExtractor &response);
|
|
|
|
//------------------------------------------------------------------
|
|
// Member variables.
|
|
//------------------------------------------------------------------
|
|
std::string m_thread_name;
|
|
std::string m_dispatch_queue_name;
|
|
lldb::addr_t m_thread_dispatch_qaddr;
|
|
uint32_t m_thread_stop_reason_stop_id;
|
|
//------------------------------------------------------------------
|
|
// Member variables.
|
|
//------------------------------------------------------------------
|
|
|
|
virtual lldb_private::Unwind *
|
|
GetUnwinder ();
|
|
|
|
void
|
|
SetStopInfoFromPacket (StringExtractor &stop_packet, uint32_t stop_id);
|
|
|
|
virtual lldb::StopInfoSP
|
|
GetPrivateStopReason ();
|
|
|
|
|
|
};
|
|
|
|
#endif // liblldb_ThreadGDBRemote_h_
|