blob: 43ac13c2d8bcb56c405068bba10fb29769bade41 [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
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +000015#include <mutex>
16
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000017// Other libraries and framework includes
18// Project includes
Jason Molenda02706c32013-11-08 04:59:54 +000019#include "lldb/lldb-private.h"
Jason Molenda02706c32013-11-08 04:59:54 +000020#include "lldb/Core/Broadcaster.h"
21#include "lldb/Core/Event.h"
22#include "lldb/Core/UserID.h"
23#include "lldb/Core/UserSettingsController.h"
24#include "lldb/Target/ExecutionContextScope.h"
25#include "lldb/Target/StackFrameList.h"
26#include "lldb/Target/Thread.h"
27
28namespace lldb_private {
29
Jason Molenda2fd83352014-02-05 05:44:54 +000030//----------------------------------------------------------------------
31/// @class HistoryThread HistoryThread.h "HistoryThread.h"
32/// @brief A thread object representing a backtrace from a previous point in the process execution
33///
34/// This subclass of Thread is used to provide a backtrace from earlier in
35/// process execution. It is given a backtrace list of pc addresses and
36/// optionally a stop_id of when those pc addresses were collected, and it will
37/// create stack frames for them.
38//----------------------------------------------------------------------
39
Jason Molenda02706c32013-11-08 04:59:54 +000040class HistoryThread : public lldb_private::Thread
41{
42public:
Jason Molenda8ee9cb52013-11-16 01:24:22 +000043 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 +000044
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000045 ~HistoryThread() override;
Jason Molenda02706c32013-11-08 04:59:54 +000046
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000047 lldb::RegisterContextSP
48 GetRegisterContext() override;
Jason Molenda02706c32013-11-08 04:59:54 +000049
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000050 lldb::RegisterContextSP
51 CreateRegisterContextForFrame(StackFrame *frame) override;
Jason Molenda02706c32013-11-08 04:59:54 +000052
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000053 void
54 RefreshStateAfterStop() override { }
Jason Molenda02706c32013-11-08 04:59:54 +000055
56 bool
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000057 CalculateStopInfo() override
58 {
59 return false;
60 }
Jason Molenda02706c32013-11-08 04:59:54 +000061
Jason Molendaa7b5afa2013-11-15 00:17:32 +000062 void
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000063 SetExtendedBacktraceToken(uint64_t token) override
Jason Molendaa7b5afa2013-11-15 00:17:32 +000064 {
65 m_extended_unwind_token = token;
66 }
67
68 uint64_t
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000069 GetExtendedBacktraceToken() override
Jason Molendaa7b5afa2013-11-15 00:17:32 +000070 {
71 return m_extended_unwind_token;
72 }
73
74 const char *
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000075 GetQueueName() override
Jason Molendaa7b5afa2013-11-15 00:17:32 +000076 {
77 return m_queue_name.c_str();
78 }
79
80 void
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000081 SetQueueName(const char *name) override
Jason Molendaa7b5afa2013-11-15 00:17:32 +000082 {
83 m_queue_name = name;
84 }
85
Jason Molendaa6e91302013-11-19 05:44:41 +000086 lldb::queue_id_t
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000087 GetQueueID() override
Jason Molendaa6e91302013-11-19 05:44:41 +000088 {
89 return m_queue_id;
90 }
91
92 void
Eugene Zelenkofb2eec72015-10-17 00:19:57 +000093 SetQueueID(lldb::queue_id_t queue) override
Jason Molendaa6e91302013-11-19 05:44:41 +000094 {
95 m_queue_id = queue;
96 }
97
Jason Molenda8ee9cb52013-11-16 01:24:22 +000098 const char *
99 GetThreadName ()
100 {
101 return m_thread_name.c_str();
102 }
103
104 uint32_t
Eugene Zelenkofb2eec72015-10-17 00:19:57 +0000105 GetExtendedBacktraceOriginatingIndexID() override;
Jason Molenda8ee9cb52013-11-16 01:24:22 +0000106
107 void
108 SetThreadName (const char *name)
109 {
110 m_thread_name = name;
111 }
Kuba Breckabeed8212014-09-04 01:03:18 +0000112
Eugene Zelenkofb2eec72015-10-17 00:19:57 +0000113 const char *
114 GetName() override
Kuba Breckabeed8212014-09-04 01:03:18 +0000115 {
116 return m_thread_name.c_str();
117 }
118
Eugene Zelenkofb2eec72015-10-17 00:19:57 +0000119 void
120 SetName(const char *name) override
Kuba Breckabeed8212014-09-04 01:03:18 +0000121 {
122 m_thread_name = name;
123 }
Jason Molenda8ee9cb52013-11-16 01:24:22 +0000124
Jason Molenda02706c32013-11-08 04:59:54 +0000125protected:
126 virtual lldb::StackFrameListSP
127 GetStackFrameList ();
128
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +0000129 mutable std::mutex m_framelist_mutex;
Jason Molenda02706c32013-11-08 04:59:54 +0000130 lldb::StackFrameListSP m_framelist;
131 std::vector<lldb::addr_t> m_pcs;
132 uint32_t m_stop_id;
133 bool m_stop_id_is_valid;
Jason Molendaa7b5afa2013-11-15 00:17:32 +0000134
135 uint64_t m_extended_unwind_token;
136 std::string m_queue_name;
Jason Molenda8ee9cb52013-11-16 01:24:22 +0000137 std::string m_thread_name;
138 lldb::tid_t m_originating_unique_thread_id;
Jason Molendaa6e91302013-11-19 05:44:41 +0000139 lldb::queue_id_t m_queue_id;
Jason Molenda02706c32013-11-08 04:59:54 +0000140};
141
142} // namespace lldb_private
143
Eugene Zelenkofb2eec72015-10-17 00:19:57 +0000144#endif // liblldb_HistoryThread_h_