blob: 1a5b60aea2887de90fb4b738fd4db6575841252c [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- ThreadGDBRemote.h ---------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_ThreadGDBRemote_h_
11#define liblldb_ThreadGDBRemote_h_
12
Eugene Zelenkoedb35d92015-10-24 01:08:35 +000013// C Includes
14// C++ Includes
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015#include <string>
16
Eugene Zelenkoedb35d92015-10-24 01:08:35 +000017// Other libraries and framework includes
18// Project includes
Chris Lattner30fdc8d2010-06-08 16:52:24 +000019#include "lldb/Target/Process.h"
20#include "lldb/Target/Thread.h"
Pavel Labathf2a8bcc2017-06-27 10:45:31 +000021#include "lldb/Utility/StructuredData.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000022
23class StringExtractor;
Tamas Berghammerdb264a62015-03-31 09:52:22 +000024
25namespace lldb_private {
26namespace process_gdb_remote {
27
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028class ProcessGDBRemote;
29
Kate Stoneb9c1b512016-09-06 20:57:50 +000030class ThreadGDBRemote : public Thread {
Chris Lattner30fdc8d2010-06-08 16:52:24 +000031public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000032 ThreadGDBRemote(Process &process, lldb::tid_t tid);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000033
Kate Stoneb9c1b512016-09-06 20:57:50 +000034 ~ThreadGDBRemote() override;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000035
Kate Stoneb9c1b512016-09-06 20:57:50 +000036 void WillResume(lldb::StateType resume_state) override;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000037
Kate Stoneb9c1b512016-09-06 20:57:50 +000038 void RefreshStateAfterStop() override;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000039
Kate Stoneb9c1b512016-09-06 20:57:50 +000040 const char *GetName() override;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000041
Kate Stoneb9c1b512016-09-06 20:57:50 +000042 const char *GetQueueName() override;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000043
Kate Stoneb9c1b512016-09-06 20:57:50 +000044 lldb::QueueKind GetQueueKind() override;
Jason Molenda77f89352016-01-12 07:09:16 +000045
Kate Stoneb9c1b512016-09-06 20:57:50 +000046 lldb::queue_id_t GetQueueID() override;
Jason Molenda3dc4f442013-10-18 05:55:24 +000047
Kate Stoneb9c1b512016-09-06 20:57:50 +000048 lldb::QueueSP GetQueue() override;
Jason Molenda2dd5deb2014-04-25 00:02:11 +000049
Kate Stoneb9c1b512016-09-06 20:57:50 +000050 lldb::addr_t GetQueueLibdispatchQueueAddress() override;
Jason Molendaaac16e02014-03-13 02:54:54 +000051
Kate Stoneb9c1b512016-09-06 20:57:50 +000052 void SetQueueLibdispatchQueueAddress(lldb::addr_t dispatch_queue_t) override;
Jason Molenda77f89352016-01-12 07:09:16 +000053
Kate Stoneb9c1b512016-09-06 20:57:50 +000054 bool ThreadHasQueueInformation() const override;
Jason Molenda77f89352016-01-12 07:09:16 +000055
Kate Stoneb9c1b512016-09-06 20:57:50 +000056 lldb::RegisterContextSP GetRegisterContext() override;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000057
Kate Stoneb9c1b512016-09-06 20:57:50 +000058 lldb::RegisterContextSP
59 CreateRegisterContextForFrame(StackFrame *frame) override;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000060
Kate Stoneb9c1b512016-09-06 20:57:50 +000061 void Dump(Log *log, uint32_t index);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000062
Kate Stoneb9c1b512016-09-06 20:57:50 +000063 static bool ThreadIDIsValid(lldb::tid_t thread);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000064
Kate Stoneb9c1b512016-09-06 20:57:50 +000065 bool ShouldStop(bool &step_more);
Chris Lattner30fdc8d2010-06-08 16:52:24 +000066
Kate Stoneb9c1b512016-09-06 20:57:50 +000067 const char *GetBasicInfoAsString();
Chris Lattner30fdc8d2010-06-08 16:52:24 +000068
Kate Stoneb9c1b512016-09-06 20:57:50 +000069 void SetName(const char *name) override {
70 if (name && name[0])
71 m_thread_name.assign(name);
72 else
73 m_thread_name.clear();
74 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000075
Kate Stoneb9c1b512016-09-06 20:57:50 +000076 lldb::addr_t GetThreadDispatchQAddr() { return m_thread_dispatch_qaddr; }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000077
Kate Stoneb9c1b512016-09-06 20:57:50 +000078 void SetThreadDispatchQAddr(lldb::addr_t thread_dispatch_qaddr) {
79 m_thread_dispatch_qaddr = thread_dispatch_qaddr;
80 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +000081
Kate Stoneb9c1b512016-09-06 20:57:50 +000082 void ClearQueueInfo();
Jason Molenda77f89352016-01-12 07:09:16 +000083
Kate Stoneb9c1b512016-09-06 20:57:50 +000084 void SetQueueInfo(std::string &&queue_name, lldb::QueueKind queue_kind,
85 uint64_t queue_serial, lldb::addr_t dispatch_queue_t,
86 lldb_private::LazyBool associated_with_libdispatch_queue);
Jason Molenda77f89352016-01-12 07:09:16 +000087
Kate Stoneb9c1b512016-09-06 20:57:50 +000088 lldb_private::LazyBool GetAssociatedWithLibdispatchQueue() override;
Greg Clayton0b90be12015-06-23 21:27:50 +000089
Kate Stoneb9c1b512016-09-06 20:57:50 +000090 void SetAssociatedWithLibdispatchQueue(
91 lldb_private::LazyBool associated_with_libdispatch_queue) override;
92
93 StructuredData::ObjectSP FetchThreadExtendedInfo() override;
Jason Molenda705b1802014-06-13 02:37:02 +000094
Chris Lattner30fdc8d2010-06-08 16:52:24 +000095protected:
Kate Stoneb9c1b512016-09-06 20:57:50 +000096 friend class ProcessGDBRemote;
Greg Clayton3e06bd92011-01-09 21:07:35 +000097
Kate Stoneb9c1b512016-09-06 20:57:50 +000098 std::string m_thread_name;
99 std::string m_dispatch_queue_name;
100 lldb::addr_t m_thread_dispatch_qaddr;
101 lldb::addr_t m_dispatch_queue_t;
102 lldb::QueueKind
103 m_queue_kind; // Queue info from stop reply/stop info for thread
104 uint64_t
105 m_queue_serial_number; // Queue info from stop reply/stop info for thread
106 lldb_private::LazyBool m_associated_with_libdispatch_queue;
Eugene Zelenkoedb35d92015-10-24 01:08:35 +0000107
Kate Stoneb9c1b512016-09-06 20:57:50 +0000108 bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data);
Greg Clayton0b90be12015-06-23 21:27:50 +0000109
Kate Stoneb9c1b512016-09-06 20:57:50 +0000110 bool PrivateSetRegisterValue(uint32_t reg, uint64_t regval);
Jason Molenda545304d2015-12-18 00:45:35 +0000111
Kate Stoneb9c1b512016-09-06 20:57:50 +0000112 bool CachedQueueInfoIsValid() const {
113 return m_queue_kind != lldb::eQueueKindUnknown;
114 }
115 void SetStopInfoFromPacket(StringExtractor &stop_packet, uint32_t stop_id);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000116
Kate Stoneb9c1b512016-09-06 20:57:50 +0000117 bool CalculateStopInfo() override;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000118};
119
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000120} // namespace process_gdb_remote
121} // namespace lldb_private
122
Eugene Zelenkoedb35d92015-10-24 01:08:35 +0000123#endif // liblldb_ThreadGDBRemote_h_