xref: /llvm-project/lldb/source/Plugins/Process/gdb-remote/ThreadGDBRemote.h (revision 0b90be1c4f151dd3f8eda2a291a68554e67a3742)
1 //===-- 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 
13 #include <string>
14 
15 #include "lldb/Core/StructuredData.h"
16 #include "lldb/Target/Process.h"
17 #include "lldb/Target/Thread.h"
18 
19 class StringExtractor;
20 
21 namespace lldb_private {
22 namespace process_gdb_remote {
23 
24 class ProcessGDBRemote;
25 
26 class ThreadGDBRemote : public Thread
27 {
28 public:
29     ThreadGDBRemote (Process &process, lldb::tid_t tid);
30 
31     virtual
32     ~ThreadGDBRemote ();
33 
34     void
35     WillResume (lldb::StateType resume_state) override;
36 
37     void
38     RefreshStateAfterStop() override;
39 
40     const char *
41     GetName () override;
42 
43     const char *
44     GetQueueName () override;
45 
46     lldb::queue_id_t
47     GetQueueID () override;
48 
49     lldb::QueueSP
50     GetQueue () override;
51 
52     lldb::addr_t
53     GetQueueLibdispatchQueueAddress () override;
54 
55     lldb::RegisterContextSP
56     GetRegisterContext () override;
57 
58     lldb::RegisterContextSP
59     CreateRegisterContextForFrame (StackFrame *frame) override;
60 
61     void
62     Dump (Log *log, uint32_t index);
63 
64     static bool
65     ThreadIDIsValid (lldb::tid_t thread);
66 
67     bool
68     ShouldStop (bool &step_more);
69 
70     const char *
71     GetBasicInfoAsString ();
72 
73     void
74     SetName (const char *name) override
75     {
76         if (name && name[0])
77             m_thread_name.assign (name);
78         else
79             m_thread_name.clear();
80     }
81 
82     lldb::addr_t
83     GetThreadDispatchQAddr ()
84     {
85         return m_thread_dispatch_qaddr;
86     }
87 
88     void
89     SetThreadDispatchQAddr (lldb::addr_t thread_dispatch_qaddr)
90     {
91         m_thread_dispatch_qaddr = thread_dispatch_qaddr;
92     }
93 
94     void
95     ClearQueueInfo ();
96 
97     void
98     SetQueueInfo (std::string &&queue_name, lldb::QueueKind queue_kind, uint64_t queue_serial);
99 
100     StructuredData::ObjectSP
101     FetchThreadExtendedInfo () override;
102 
103 protected:
104 
105     friend class ProcessGDBRemote;
106 
107     bool
108     PrivateSetRegisterValue (uint32_t reg,
109                              StringExtractor &response);
110 
111     bool
112     CachedQueueInfoIsValid() const
113     {
114         return m_queue_kind != lldb::eQueueKindUnknown;
115     }
116     //------------------------------------------------------------------
117     // Member variables.
118     //------------------------------------------------------------------
119     std::string m_thread_name;
120     std::string m_dispatch_queue_name;
121     lldb::addr_t m_thread_dispatch_qaddr;
122     lldb::QueueKind m_queue_kind;     // Queue info from stop reply/stop info for thread
123     uint64_t m_queue_serial;    // Queue info from stop reply/stop info for thread
124     //------------------------------------------------------------------
125     // Member variables.
126     //------------------------------------------------------------------
127 
128     void
129     SetStopInfoFromPacket (StringExtractor &stop_packet, uint32_t stop_id);
130 
131     bool
132     CalculateStopInfo () override;
133 };
134 
135 } // namespace process_gdb_remote
136 } // namespace lldb_private
137 
138 #endif  // liblldb_ThreadGDBRemote_h_
139