blob: e87f6496134b4b62aba958065ddab45c3d35a93f [file] [log] [blame]
Jason Molenda02706c32013-11-08 04:59:54 +00001//===-- HistoryThread.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_HistoryThread_h_
11#define liblldb_HistoryThread_h_
12
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000013// C Includes
14// C++ Includes
15// Other libraries and framework includes
16// Project includes
Jason Molenda02706c32013-11-08 04:59:54 +000017#include "lldb/lldb-private.h"
18#include "lldb/Host/Mutex.h"
19#include "lldb/Core/Broadcaster.h"
20#include "lldb/Core/Event.h"
21#include "lldb/Core/UserID.h"
22#include "lldb/Core/UserSettingsController.h"
23#include "lldb/Target/ExecutionContextScope.h"
24#include "lldb/Target/StackFrameList.h"
25#include "lldb/Target/Thread.h"
26
27namespace lldb_private {
28
Jason Molenda2fd83352014-02-05 05:44:54 +000029//----------------------------------------------------------------------
30/// @class HistoryThread HistoryThread.h "HistoryThread.h"
31/// @brief A thread object representing a backtrace from a previous point in the process execution
32///
33/// This subclass of Thread is used to provide a backtrace from earlier in
34/// process execution. It is given a backtrace list of pc addresses and
35/// optionally a stop_id of when those pc addresses were collected, and it will
36/// create stack frames for them.
37//----------------------------------------------------------------------
38
Jason Molenda02706c32013-11-08 04:59:54 +000039class HistoryThread : public lldb_private::Thread
40{
41public:
Jason Molenda8ee9cb52013-11-16 01:24:22 +000042 HistoryThread (lldb_private::Process &process, lldb::tid_t tid, std::vector<lldb::addr_t> pcs, uint32_t stop_id, bool stop_id_is_valid);
Jason Molenda02706c32013-11-08 04:59:54 +000043
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000044 ~HistoryThread() override;
Jason Molenda02706c32013-11-08 04:59:54 +000045
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000046 lldb::RegisterContextSP
47 GetRegisterContext() override;
Jason Molenda02706c32013-11-08 04:59:54 +000048
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000049 lldb::RegisterContextSP
50 CreateRegisterContextForFrame(StackFrame *frame) override;
Jason Molenda02706c32013-11-08 04:59:54 +000051
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000052 void
53 RefreshStateAfterStop() override { }
Jason Molenda02706c32013-11-08 04:59:54 +000054
55 bool
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000056 CalculateStopInfo() override
57 {
58 return false;
59 }
Jason Molenda02706c32013-11-08 04:59:54 +000060
Jason Molendaa7b5afa2013-11-15 00:17:32 +000061 void
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000062 SetExtendedBacktraceToken(uint64_t token) override
Jason Molendaa7b5afa2013-11-15 00:17:32 +000063 {
64 m_extended_unwind_token = token;
65 }
66
67 uint64_t
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000068 GetExtendedBacktraceToken() override
Jason Molendaa7b5afa2013-11-15 00:17:32 +000069 {
70 return m_extended_unwind_token;
71 }
72
73 const char *
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000074 GetQueueName() override
Jason Molendaa7b5afa2013-11-15 00:17:32 +000075 {
76 return m_queue_name.c_str();
77 }
78
79 void
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000080 SetQueueName(const char *name) override
Jason Molendaa7b5afa2013-11-15 00:17:32 +000081 {
82 m_queue_name = name;
83 }
84
Jason Molendaa6e91302013-11-19 05:44:41 +000085 lldb::queue_id_t
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000086 GetQueueID() override
Jason Molendaa6e91302013-11-19 05:44:41 +000087 {
88 return m_queue_id;
89 }
90
91 void
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000092 SetQueueID(lldb::queue_id_t queue) override
Jason Molendaa6e91302013-11-19 05:44:41 +000093 {
94 m_queue_id = queue;
95 }
96
Jason Molenda8ee9cb52013-11-16 01:24:22 +000097 const char *
98 GetThreadName ()
99 {
100 return m_thread_name.c_str();
101 }
102
103 uint32_t
Eugene Zelenkofb2eec72015-10-17 00:19:57 +0000104 GetExtendedBacktraceOriginatingIndexID() override;
Jason Molenda8ee9cb52013-11-16 01:24:22 +0000105
106 void
107 SetThreadName (const char *name)
108 {
109 m_thread_name = name;
110 }
Kuba Breckabeed8212014-09-04 01:03:18 +0000111
Eugene Zelenkofb2eec72015-10-17 00:19:57 +0000112 const char *
113 GetName() override
Kuba Breckabeed8212014-09-04 01:03:18 +0000114 {
115 return m_thread_name.c_str();
116 }
117
Eugene Zelenkofb2eec72015-10-17 00:19:57 +0000118 void
119 SetName(const char *name) override
Kuba Breckabeed8212014-09-04 01:03:18 +0000120 {
121 m_thread_name = name;
122 }
Jason Molenda8ee9cb52013-11-16 01:24:22 +0000123
Jason Molenda02706c32013-11-08 04:59:54 +0000124protected:
125 virtual lldb::StackFrameListSP
126 GetStackFrameList ();
127
128 mutable Mutex m_framelist_mutex;
129 lldb::StackFrameListSP m_framelist;
130 std::vector<lldb::addr_t> m_pcs;
131 uint32_t m_stop_id;
132 bool m_stop_id_is_valid;
Jason Molendaa7b5afa2013-11-15 00:17:32 +0000133
134 uint64_t m_extended_unwind_token;
135 std::string m_queue_name;
Jason Molenda8ee9cb52013-11-16 01:24:22 +0000136 std::string m_thread_name;
137 lldb::tid_t m_originating_unique_thread_id;
Jason Molendaa6e91302013-11-19 05:44:41 +0000138 lldb::queue_id_t m_queue_id;
Jason Molenda02706c32013-11-08 04:59:54 +0000139};
140
141} // namespace lldb_private
142
Eugene Zelenkofb2eec72015-10-17 00:19:57 +0000143#endif // liblldb_HistoryThread_h_