blob: 1a4898a95b7dcef42c43f865501fcb41376c2825 [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/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"
Kate Stoneb9c1b512016-09-06 20:57:50 +000026#include "lldb/lldb-private.h"
Jason Molenda02706c32013-11-08 04:59:54 +000027
28namespace lldb_private {
29
Jason Molenda2fd83352014-02-05 05:44:54 +000030//----------------------------------------------------------------------
31/// @class HistoryThread HistoryThread.h "HistoryThread.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000032/// @brief A thread object representing a backtrace from a previous point in the
33/// process execution
Jason Molenda2fd83352014-02-05 05:44:54 +000034///
35/// This subclass of Thread is used to provide a backtrace from earlier in
Kate Stoneb9c1b512016-09-06 20:57:50 +000036/// process execution. It is given a backtrace list of pc addresses and
Jason Molenda2fd83352014-02-05 05:44:54 +000037/// optionally a stop_id of when those pc addresses were collected, and it will
38/// create stack frames for them.
39//----------------------------------------------------------------------
40
Kate Stoneb9c1b512016-09-06 20:57:50 +000041class HistoryThread : public lldb_private::Thread {
Jason Molenda02706c32013-11-08 04:59:54 +000042public:
Kate Stoneb9c1b512016-09-06 20:57:50 +000043 HistoryThread(lldb_private::Process &process, lldb::tid_t tid,
44 std::vector<lldb::addr_t> pcs, uint32_t stop_id,
45 bool stop_id_is_valid);
Jason Molenda02706c32013-11-08 04:59:54 +000046
Kate Stoneb9c1b512016-09-06 20:57:50 +000047 ~HistoryThread() override;
Jason Molenda02706c32013-11-08 04:59:54 +000048
Kate Stoneb9c1b512016-09-06 20:57:50 +000049 lldb::RegisterContextSP GetRegisterContext() override;
Jason Molenda02706c32013-11-08 04:59:54 +000050
Kate Stoneb9c1b512016-09-06 20:57:50 +000051 lldb::RegisterContextSP
52 CreateRegisterContextForFrame(StackFrame *frame) override;
Jason Molenda02706c32013-11-08 04:59:54 +000053
Kate Stoneb9c1b512016-09-06 20:57:50 +000054 void RefreshStateAfterStop() override {}
Jason Molenda02706c32013-11-08 04:59:54 +000055
Kate Stoneb9c1b512016-09-06 20:57:50 +000056 bool CalculateStopInfo() override { return false; }
Jason Molenda02706c32013-11-08 04:59:54 +000057
Kate Stoneb9c1b512016-09-06 20:57:50 +000058 void SetExtendedBacktraceToken(uint64_t token) override {
59 m_extended_unwind_token = token;
60 }
Jason Molendaa7b5afa2013-11-15 00:17:32 +000061
Kate Stoneb9c1b512016-09-06 20:57:50 +000062 uint64_t GetExtendedBacktraceToken() override {
63 return m_extended_unwind_token;
64 }
Jason Molendaa7b5afa2013-11-15 00:17:32 +000065
Kate Stoneb9c1b512016-09-06 20:57:50 +000066 const char *GetQueueName() override { return m_queue_name.c_str(); }
Jason Molendaa7b5afa2013-11-15 00:17:32 +000067
Kate Stoneb9c1b512016-09-06 20:57:50 +000068 void SetQueueName(const char *name) override { m_queue_name = name; }
Jason Molendaa7b5afa2013-11-15 00:17:32 +000069
Kate Stoneb9c1b512016-09-06 20:57:50 +000070 lldb::queue_id_t GetQueueID() override { return m_queue_id; }
Jason Molendaa6e91302013-11-19 05:44:41 +000071
Kate Stoneb9c1b512016-09-06 20:57:50 +000072 void SetQueueID(lldb::queue_id_t queue) override { m_queue_id = queue; }
Jason Molendaa6e91302013-11-19 05:44:41 +000073
Kate Stoneb9c1b512016-09-06 20:57:50 +000074 const char *GetThreadName() { return m_thread_name.c_str(); }
Jason Molenda8ee9cb52013-11-16 01:24:22 +000075
Kate Stoneb9c1b512016-09-06 20:57:50 +000076 uint32_t GetExtendedBacktraceOriginatingIndexID() override;
Jason Molenda8ee9cb52013-11-16 01:24:22 +000077
Kate Stoneb9c1b512016-09-06 20:57:50 +000078 void SetThreadName(const char *name) { m_thread_name = name; }
79
80 const char *GetName() override { return m_thread_name.c_str(); }
81
82 void SetName(const char *name) override { m_thread_name = name; }
Jason Molenda8ee9cb52013-11-16 01:24:22 +000083
Jason Molenda02706c32013-11-08 04:59:54 +000084protected:
Kate Stoneb9c1b512016-09-06 20:57:50 +000085 virtual lldb::StackFrameListSP GetStackFrameList();
Jason Molenda02706c32013-11-08 04:59:54 +000086
Kate Stoneb9c1b512016-09-06 20:57:50 +000087 mutable std::mutex m_framelist_mutex;
88 lldb::StackFrameListSP m_framelist;
89 std::vector<lldb::addr_t> m_pcs;
90 uint32_t m_stop_id;
91 bool m_stop_id_is_valid;
Jason Molendaa7b5afa2013-11-15 00:17:32 +000092
Kate Stoneb9c1b512016-09-06 20:57:50 +000093 uint64_t m_extended_unwind_token;
94 std::string m_queue_name;
95 std::string m_thread_name;
96 lldb::tid_t m_originating_unique_thread_id;
97 lldb::queue_id_t m_queue_id;
Jason Molenda02706c32013-11-08 04:59:54 +000098};
99
100} // namespace lldb_private
101
Eugene Zelenkofb2eec72015-10-17 00:19:57 +0000102#endif // liblldb_HistoryThread_h_