blob: 1e7cbfa4481537fa90db87bc10a0e08692d55da9 [file] [log] [blame]
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +00001//===-- ThreadMemory.h ------------------------------------------*- C++ -*-===//
Greg Clayton56d9a1b2011-08-22 02:49:39 +00002//
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_ThreadMemory_h_
11#define liblldb_ThreadMemory_h_
12
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000013// C Includes
14// C++ Includes
Eugene Zelenkoca64d672015-10-30 00:55:29 +000015#include <string>
16
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000017// Other libraries and framework includes
18// Project includes
Greg Clayton56d9a1b2011-08-22 02:49:39 +000019#include "lldb/Target/Thread.h"
20
21class ThreadMemory :
22 public lldb_private::Thread
23{
24public:
Jim Ingham4f465cf2012-10-10 18:32:14 +000025 ThreadMemory (lldb_private::Process &process,
Greg Clayton1ac04c32012-02-21 00:09:25 +000026 lldb::tid_t tid,
27 const lldb::ValueObjectSP &thread_info_valobj_sp);
Greg Clayton56d9a1b2011-08-22 02:49:39 +000028
Jim Ingham4f465cf2012-10-10 18:32:14 +000029 ThreadMemory (lldb_private::Process &process,
Greg Clayton435ce132012-08-24 05:45:15 +000030 lldb::tid_t tid,
31 const char *name,
Greg Claytonead45e02012-10-25 17:56:31 +000032 const char *queue,
33 lldb::addr_t register_data_addr);
Greg Clayton435ce132012-08-24 05:45:15 +000034
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000035 ~ThreadMemory() override;
Greg Clayton56d9a1b2011-08-22 02:49:39 +000036
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000037 lldb::RegisterContextSP
38 GetRegisterContext() override;
Greg Clayton56d9a1b2011-08-22 02:49:39 +000039
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000040 lldb::RegisterContextSP
41 CreateRegisterContextForFrame(lldb_private::StackFrame *frame) override;
Greg Clayton56d9a1b2011-08-22 02:49:39 +000042
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000043 bool
44 CalculateStopInfo() override;
Greg Clayton56d9a1b2011-08-22 02:49:39 +000045
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000046 const char *
47 GetInfo() override
Greg Claytonb3ae8762013-04-12 20:07:46 +000048 {
49 if (m_backing_thread_sp)
50 m_backing_thread_sp->GetInfo();
Eugene Zelenkoca64d672015-10-30 00:55:29 +000051 return nullptr;
Greg Claytonb3ae8762013-04-12 20:07:46 +000052 }
53
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000054 const char *
55 GetName() override
Greg Clayton435ce132012-08-24 05:45:15 +000056 {
Greg Claytonb3ae8762013-04-12 20:07:46 +000057 if (!m_name.empty())
58 return m_name.c_str();
59 if (m_backing_thread_sp)
60 m_backing_thread_sp->GetName();
Eugene Zelenkoca64d672015-10-30 00:55:29 +000061 return nullptr;
Greg Clayton435ce132012-08-24 05:45:15 +000062 }
63
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000064 const char *
65 GetQueueName() override
Greg Clayton435ce132012-08-24 05:45:15 +000066 {
Greg Claytonb3ae8762013-04-12 20:07:46 +000067 if (!m_queue.empty())
68 return m_queue.c_str();
69 if (m_backing_thread_sp)
70 m_backing_thread_sp->GetQueueName();
Eugene Zelenkoca64d672015-10-30 00:55:29 +000071 return nullptr;
Greg Clayton435ce132012-08-24 05:45:15 +000072 }
73
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000074 void
75 WillResume(lldb::StateType resume_state) override;
Greg Clayton56d9a1b2011-08-22 02:49:39 +000076
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000077 void
78 DidResume() override
Greg Claytonb3ae8762013-04-12 20:07:46 +000079 {
80 if (m_backing_thread_sp)
81 m_backing_thread_sp->DidResume();
82 }
Greg Clayton160c9d82013-05-01 21:54:04 +000083
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000084 lldb::user_id_t
85 GetProtocolID() const override
Greg Clayton160c9d82013-05-01 21:54:04 +000086 {
87 if (m_backing_thread_sp)
88 return m_backing_thread_sp->GetProtocolID();
89 return Thread::GetProtocolID();
90 }
Greg Claytonb3ae8762013-04-12 20:07:46 +000091
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +000092 void
93 RefreshStateAfterStop() override;
Greg Claytonb3ae8762013-04-12 20:07:46 +000094
Greg Clayton56d9a1b2011-08-22 02:49:39 +000095 lldb::ValueObjectSP &
96 GetValueObject ()
97 {
98 return m_thread_info_valobj_sp;
99 }
Greg Claytonb3ae8762013-04-12 20:07:46 +0000100
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +0000101 void
102 ClearStackFrames() override;
Greg Clayton160c9d82013-05-01 21:54:04 +0000103
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +0000104 void
105 ClearBackingThread() override
Greg Claytonb3ae8762013-04-12 20:07:46 +0000106 {
107 m_backing_thread_sp.reset();
108 }
109
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +0000110 bool
111 SetBackingThread(const lldb::ThreadSP &thread_sp) override
Greg Claytonb3ae8762013-04-12 20:07:46 +0000112 {
Greg Clayton160c9d82013-05-01 21:54:04 +0000113 //printf ("Thread 0x%llx is being backed by thread 0x%llx\n", GetID(), thread_sp->GetID());
Greg Claytonb3ae8762013-04-12 20:07:46 +0000114 m_backing_thread_sp = thread_sp;
115 return (bool)thread_sp;
116 }
Greg Claytond1d06e42013-04-20 00:27:58 +0000117
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +0000118 lldb::ThreadSP
119 GetBackingThread() const override
Greg Claytond1d06e42013-04-20 00:27:58 +0000120 {
121 return m_backing_thread_sp;
122 }
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000123
124protected:
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +0000125 bool
126 IsOperatingSystemPluginThread() const override
Greg Clayton160c9d82013-05-01 21:54:04 +0000127 {
128 return true;
129 }
130
Greg Claytonb3ae8762013-04-12 20:07:46 +0000131 // If this memory thread is actually represented by a thread from the
132 // lldb_private::Process subclass, then fill in the thread here and
133 // all APIs will be routed through this thread object. If m_backing_thread_sp
134 // is empty, then this thread is simply in memory with no representation
135 // through the process plug-in.
136 lldb::ThreadSP m_backing_thread_sp;
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000137 lldb::ValueObjectSP m_thread_info_valobj_sp;
Greg Clayton435ce132012-08-24 05:45:15 +0000138 std::string m_name;
139 std::string m_queue;
Greg Claytonead45e02012-10-25 17:56:31 +0000140 lldb::addr_t m_register_data_addr;
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +0000141
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000142private:
Greg Clayton56d9a1b2011-08-22 02:49:39 +0000143 DISALLOW_COPY_AND_ASSIGN (ThreadMemory);
144};
145
Eugene Zelenkoab7f6d02015-10-21 18:46:17 +0000146#endif // liblldb_ThreadMemory_h_