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