1061da546Spatrick //===-- ThreadGDBRemote.h ---------------------------------------*- C++ -*-===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_THREADGDBREMOTE_H 10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_THREADGDBREMOTE_H 11061da546Spatrick 12061da546Spatrick #include <string> 13061da546Spatrick 14061da546Spatrick #include "lldb/Target/Thread.h" 15061da546Spatrick #include "lldb/Utility/StructuredData.h" 16061da546Spatrick 17be691f3bSpatrick #include "GDBRemoteRegisterContext.h" 18be691f3bSpatrick 19061da546Spatrick class StringExtractor; 20061da546Spatrick 21061da546Spatrick namespace lldb_private { 22061da546Spatrick class Process; 23061da546Spatrick 24061da546Spatrick namespace process_gdb_remote { 25061da546Spatrick 26061da546Spatrick class ProcessGDBRemote; 27061da546Spatrick 28061da546Spatrick class ThreadGDBRemote : public Thread { 29061da546Spatrick public: 30061da546Spatrick ThreadGDBRemote(Process &process, lldb::tid_t tid); 31061da546Spatrick 32061da546Spatrick ~ThreadGDBRemote() override; 33061da546Spatrick 34061da546Spatrick void WillResume(lldb::StateType resume_state) override; 35061da546Spatrick 36061da546Spatrick void RefreshStateAfterStop() override; 37061da546Spatrick 38061da546Spatrick const char *GetName() override; 39061da546Spatrick 40061da546Spatrick const char *GetQueueName() override; 41061da546Spatrick 42061da546Spatrick lldb::QueueKind GetQueueKind() override; 43061da546Spatrick 44061da546Spatrick lldb::queue_id_t GetQueueID() override; 45061da546Spatrick 46061da546Spatrick lldb::QueueSP GetQueue() override; 47061da546Spatrick 48061da546Spatrick lldb::addr_t GetQueueLibdispatchQueueAddress() override; 49061da546Spatrick 50061da546Spatrick void SetQueueLibdispatchQueueAddress(lldb::addr_t dispatch_queue_t) override; 51061da546Spatrick 52061da546Spatrick bool ThreadHasQueueInformation() const override; 53061da546Spatrick 54061da546Spatrick lldb::RegisterContextSP GetRegisterContext() override; 55061da546Spatrick 56061da546Spatrick lldb::RegisterContextSP 57061da546Spatrick CreateRegisterContextForFrame(StackFrame *frame) override; 58061da546Spatrick 59061da546Spatrick void Dump(Log *log, uint32_t index); 60061da546Spatrick 61061da546Spatrick static bool ThreadIDIsValid(lldb::tid_t thread); 62061da546Spatrick 63061da546Spatrick bool ShouldStop(bool &step_more); 64061da546Spatrick 65061da546Spatrick const char *GetBasicInfoAsString(); 66061da546Spatrick SetName(const char * name)67061da546Spatrick void SetName(const char *name) override { 68061da546Spatrick if (name && name[0]) 69061da546Spatrick m_thread_name.assign(name); 70061da546Spatrick else 71061da546Spatrick m_thread_name.clear(); 72061da546Spatrick } 73061da546Spatrick GetThreadDispatchQAddr()74061da546Spatrick lldb::addr_t GetThreadDispatchQAddr() { return m_thread_dispatch_qaddr; } 75061da546Spatrick SetThreadDispatchQAddr(lldb::addr_t thread_dispatch_qaddr)76061da546Spatrick void SetThreadDispatchQAddr(lldb::addr_t thread_dispatch_qaddr) { 77061da546Spatrick m_thread_dispatch_qaddr = thread_dispatch_qaddr; 78061da546Spatrick } 79061da546Spatrick 80061da546Spatrick void ClearQueueInfo(); 81061da546Spatrick 82061da546Spatrick void SetQueueInfo(std::string &&queue_name, lldb::QueueKind queue_kind, 83061da546Spatrick uint64_t queue_serial, lldb::addr_t dispatch_queue_t, 84061da546Spatrick lldb_private::LazyBool associated_with_libdispatch_queue); 85061da546Spatrick 86061da546Spatrick lldb_private::LazyBool GetAssociatedWithLibdispatchQueue() override; 87061da546Spatrick 88061da546Spatrick void SetAssociatedWithLibdispatchQueue( 89061da546Spatrick lldb_private::LazyBool associated_with_libdispatch_queue) override; 90061da546Spatrick 91061da546Spatrick StructuredData::ObjectSP FetchThreadExtendedInfo() override; 92061da546Spatrick 93061da546Spatrick protected: 94061da546Spatrick friend class ProcessGDBRemote; 95061da546Spatrick 96061da546Spatrick std::string m_thread_name; 97061da546Spatrick std::string m_dispatch_queue_name; 98061da546Spatrick lldb::addr_t m_thread_dispatch_qaddr; 99061da546Spatrick lldb::addr_t m_dispatch_queue_t; 100061da546Spatrick lldb::QueueKind 101061da546Spatrick m_queue_kind; // Queue info from stop reply/stop info for thread 102061da546Spatrick uint64_t 103061da546Spatrick m_queue_serial_number; // Queue info from stop reply/stop info for thread 104061da546Spatrick lldb_private::LazyBool m_associated_with_libdispatch_queue; 105061da546Spatrick 106be691f3bSpatrick GDBRemoteDynamicRegisterInfoSP m_reg_info_sp; 107be691f3bSpatrick 108061da546Spatrick bool PrivateSetRegisterValue(uint32_t reg, llvm::ArrayRef<uint8_t> data); 109061da546Spatrick 110061da546Spatrick bool PrivateSetRegisterValue(uint32_t reg, uint64_t regval); 111061da546Spatrick CachedQueueInfoIsValid()112061da546Spatrick bool CachedQueueInfoIsValid() const { 113061da546Spatrick return m_queue_kind != lldb::eQueueKindUnknown; 114061da546Spatrick } 115061da546Spatrick void SetStopInfoFromPacket(StringExtractor &stop_packet, uint32_t stop_id); 116061da546Spatrick 117061da546Spatrick bool CalculateStopInfo() override; 118*f6aab3d8Srobert 119*f6aab3d8Srobert llvm::Expected<std::unique_ptr<llvm::MemoryBuffer>> 120*f6aab3d8Srobert GetSiginfo(size_t max_size) const override; 121061da546Spatrick }; 122061da546Spatrick 123061da546Spatrick } // namespace process_gdb_remote 124061da546Spatrick } // namespace lldb_private 125061da546Spatrick 126dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_PROCESS_GDB_REMOTE_THREADGDBREMOTE_H 127