xref: /openbsd-src/gnu/llvm/lldb/source/Plugins/Process/Utility/HistoryThread.h (revision dda2819751e49c83612958492e38917049128b41)
1061da546Spatrick //===-- HistoryThread.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 
9*dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_HISTORYTHREAD_H
10*dda28197Spatrick #define LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_HISTORYTHREAD_H
11061da546Spatrick 
12061da546Spatrick #include <mutex>
13061da546Spatrick 
14061da546Spatrick #include "lldb/Core/UserSettingsController.h"
15061da546Spatrick #include "lldb/Target/ExecutionContextScope.h"
16061da546Spatrick #include "lldb/Target/StackFrameList.h"
17061da546Spatrick #include "lldb/Target/Thread.h"
18061da546Spatrick #include "lldb/Utility/Broadcaster.h"
19061da546Spatrick #include "lldb/Utility/Event.h"
20061da546Spatrick #include "lldb/Utility/UserID.h"
21061da546Spatrick #include "lldb/lldb-private.h"
22061da546Spatrick 
23061da546Spatrick namespace lldb_private {
24061da546Spatrick 
25061da546Spatrick /// \class HistoryThread HistoryThread.h "HistoryThread.h"
26061da546Spatrick /// A thread object representing a backtrace from a previous point in the
27061da546Spatrick /// process execution
28061da546Spatrick ///
29061da546Spatrick /// This subclass of Thread is used to provide a backtrace from earlier in
30061da546Spatrick /// process execution.  It is given a backtrace list of pc addresses and it
31061da546Spatrick /// will create stack frames for them.
32061da546Spatrick 
33061da546Spatrick class HistoryThread : public lldb_private::Thread {
34061da546Spatrick public:
35061da546Spatrick   HistoryThread(lldb_private::Process &process, lldb::tid_t tid,
36*dda28197Spatrick                 std::vector<lldb::addr_t> pcs,
37*dda28197Spatrick                 bool pcs_are_call_addresses = false);
38061da546Spatrick 
39061da546Spatrick   ~HistoryThread() override;
40061da546Spatrick 
41061da546Spatrick   lldb::RegisterContextSP GetRegisterContext() override;
42061da546Spatrick 
43061da546Spatrick   lldb::RegisterContextSP
44061da546Spatrick   CreateRegisterContextForFrame(StackFrame *frame) override;
45061da546Spatrick 
RefreshStateAfterStop()46061da546Spatrick   void RefreshStateAfterStop() override {}
47061da546Spatrick 
CalculateStopInfo()48061da546Spatrick   bool CalculateStopInfo() override { return false; }
49061da546Spatrick 
SetExtendedBacktraceToken(uint64_t token)50061da546Spatrick   void SetExtendedBacktraceToken(uint64_t token) override {
51061da546Spatrick     m_extended_unwind_token = token;
52061da546Spatrick   }
53061da546Spatrick 
GetExtendedBacktraceToken()54061da546Spatrick   uint64_t GetExtendedBacktraceToken() override {
55061da546Spatrick     return m_extended_unwind_token;
56061da546Spatrick   }
57061da546Spatrick 
GetQueueName()58061da546Spatrick   const char *GetQueueName() override { return m_queue_name.c_str(); }
59061da546Spatrick 
SetQueueName(const char * name)60061da546Spatrick   void SetQueueName(const char *name) override { m_queue_name = name; }
61061da546Spatrick 
GetQueueID()62061da546Spatrick   lldb::queue_id_t GetQueueID() override { return m_queue_id; }
63061da546Spatrick 
SetQueueID(lldb::queue_id_t queue)64061da546Spatrick   void SetQueueID(lldb::queue_id_t queue) override { m_queue_id = queue; }
65061da546Spatrick 
GetThreadName()66061da546Spatrick   const char *GetThreadName() { return m_thread_name.c_str(); }
67061da546Spatrick 
68061da546Spatrick   uint32_t GetExtendedBacktraceOriginatingIndexID() override;
69061da546Spatrick 
SetThreadName(const char * name)70061da546Spatrick   void SetThreadName(const char *name) { m_thread_name = name; }
71061da546Spatrick 
GetName()72061da546Spatrick   const char *GetName() override { return m_thread_name.c_str(); }
73061da546Spatrick 
SetName(const char * name)74061da546Spatrick   void SetName(const char *name) override { m_thread_name = name; }
75061da546Spatrick 
76061da546Spatrick protected:
77061da546Spatrick   virtual lldb::StackFrameListSP GetStackFrameList();
78061da546Spatrick 
79061da546Spatrick   mutable std::mutex m_framelist_mutex;
80061da546Spatrick   lldb::StackFrameListSP m_framelist;
81061da546Spatrick   std::vector<lldb::addr_t> m_pcs;
82061da546Spatrick 
83061da546Spatrick   uint64_t m_extended_unwind_token;
84061da546Spatrick   std::string m_queue_name;
85061da546Spatrick   std::string m_thread_name;
86061da546Spatrick   lldb::tid_t m_originating_unique_thread_id;
87061da546Spatrick   lldb::queue_id_t m_queue_id;
88061da546Spatrick };
89061da546Spatrick 
90061da546Spatrick } // namespace lldb_private
91061da546Spatrick 
92*dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_HISTORYTHREAD_H
93