"thread-pcs" key is added to the T (questionmark) packet in gdb-remote protocol so that lldb doesn't need to query the pc values of every thread before it resumes a process. The only odd part with this is that I'm sending the pc values in big endian order, so we need to know the endianness of the remote process before we can use them. All other register values in gdb-remote protocol are sent in native-endian format so this requirement doesn't exist. This addition is a performance enhancement -- lldb will fall back to querying the pc of each thread individually if it needs to -- so when we don't have the byte order for the process yet, we don't use these values. Practically speaking, the only way I've been able to elicit this condition is for the first T packet when we attach to a process. <rdar://problem/21963031> llvm-svn: 255942
139 lines
3.0 KiB
C++
139 lines
3.0 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_
|
|
|
|
// C Includes
|
|
// C++ Includes
|
|
#include <string>
|
|
|
|
// Other libraries and framework includes
|
|
// Project includes
|
|
#include "lldb/Core/StructuredData.h"
|
|
#include "lldb/Target/Process.h"
|
|
#include "lldb/Target/Thread.h"
|
|
|
|
class StringExtractor;
|
|
|
|
namespace lldb_private {
|
|
namespace process_gdb_remote {
|
|
|
|
class ProcessGDBRemote;
|
|
|
|
class ThreadGDBRemote : public Thread
|
|
{
|
|
public:
|
|
ThreadGDBRemote (Process &process, lldb::tid_t tid);
|
|
|
|
~ThreadGDBRemote() override;
|
|
|
|
void
|
|
WillResume (lldb::StateType resume_state) override;
|
|
|
|
void
|
|
RefreshStateAfterStop() override;
|
|
|
|
const char *
|
|
GetName () override;
|
|
|
|
const char *
|
|
GetQueueName () override;
|
|
|
|
lldb::queue_id_t
|
|
GetQueueID () override;
|
|
|
|
lldb::QueueSP
|
|
GetQueue () override;
|
|
|
|
lldb::addr_t
|
|
GetQueueLibdispatchQueueAddress () override;
|
|
|
|
lldb::RegisterContextSP
|
|
GetRegisterContext () override;
|
|
|
|
lldb::RegisterContextSP
|
|
CreateRegisterContextForFrame (StackFrame *frame) override;
|
|
|
|
void
|
|
Dump (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) override
|
|
{
|
|
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;
|
|
}
|
|
|
|
void
|
|
ClearQueueInfo ();
|
|
|
|
void
|
|
SetQueueInfo (std::string &&queue_name, lldb::QueueKind queue_kind, uint64_t queue_serial);
|
|
|
|
StructuredData::ObjectSP
|
|
FetchThreadExtendedInfo () override;
|
|
|
|
protected:
|
|
friend class ProcessGDBRemote;
|
|
|
|
std::string m_thread_name;
|
|
std::string m_dispatch_queue_name;
|
|
lldb::addr_t m_thread_dispatch_qaddr;
|
|
lldb::QueueKind m_queue_kind; // Queue info from stop reply/stop info for thread
|
|
uint64_t m_queue_serial; // Queue info from stop reply/stop info for thread
|
|
|
|
bool
|
|
PrivateSetRegisterValue (uint32_t reg,
|
|
StringExtractor &response);
|
|
|
|
bool
|
|
PrivateSetRegisterValue (uint32_t reg,
|
|
uint64_t regval);
|
|
|
|
bool
|
|
CachedQueueInfoIsValid() const
|
|
{
|
|
return m_queue_kind != lldb::eQueueKindUnknown;
|
|
}
|
|
void
|
|
SetStopInfoFromPacket (StringExtractor &stop_packet, uint32_t stop_id);
|
|
|
|
bool
|
|
CalculateStopInfo () override;
|
|
};
|
|
|
|
} // namespace process_gdb_remote
|
|
} // namespace lldb_private
|
|
|
|
#endif // liblldb_ThreadGDBRemote_h_
|