mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-04-13 03:41:11 +00:00

at each public stop to improve performance a bit. Most of the information lldb needed was already in the jThreadsInfo response; complete that information and catch a few cases where we could still fall back to getting the information via discrete memory reads. debugserver adds 'associated_with_dispatch_queue' and 'dispatch_queue_t keys to the jThreadsInfo response for all the threads. lldb needs the dispatch_queue_t value. And associated_with_dispatch_queue helps to identify which threads definitively don't have any queue information so lldb doesn't try to do memory reads to get that information just because it was absent in the jThreadsInfo response. Remove the queue information from the questionmark (T) packet. We'll get the information for all threads via the jThreadsInfo response - sending the information for the stopping thread (on all the private stops, plus the less frequent public stop) was unnecessary information being sent over the wire. SystemRuntimeMacOSX will try to get information about queues by asking the Threads for them, instead of reading memory. ProcessGDBRemote changes to recognize the new keys being sent in the jThreadsInfo response. Changes to ThreadGDBRemote to track the new information. Also, when a thread is marked as definitively not associated with a libdispatch queue, don't fall back to the system runtime to try memory reads to find the queue name / kind / ID etc. <rdar://problem/23309359> llvm-svn: 257453
156 lines
3.6 KiB
C++
156 lines
3.6 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::QueueKind
|
|
GetQueueKind () override;
|
|
|
|
lldb::queue_id_t
|
|
GetQueueID () override;
|
|
|
|
lldb::QueueSP
|
|
GetQueue () override;
|
|
|
|
lldb::addr_t
|
|
GetQueueLibdispatchQueueAddress () override;
|
|
|
|
void
|
|
SetQueueLibdispatchQueueAddress (lldb::addr_t dispatch_queue_t) override;
|
|
|
|
bool
|
|
ThreadHasQueueInformation () const 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, lldb::addr_t dispatch_queue_t, lldb_private::LazyBool associated_with_libdispatch_queue);
|
|
|
|
lldb_private::LazyBool
|
|
GetAssociatedWithLibdispatchQueue () override;
|
|
|
|
void
|
|
SetAssociatedWithLibdispatchQueue (lldb_private::LazyBool associated_with_libdispatch_queue) override;
|
|
|
|
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::addr_t m_dispatch_queue_t;
|
|
lldb::QueueKind m_queue_kind; // Queue info from stop reply/stop info for thread
|
|
uint64_t m_queue_serial_number; // Queue info from stop reply/stop info for thread
|
|
lldb_private::LazyBool m_associated_with_libdispatch_queue;
|
|
|
|
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_
|