1//===-- FreeBSDThread.h -----------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef liblldb_FreeBSDThread_H_
10#define liblldb_FreeBSDThread_H_
11
12#include <memory>
13#include <string>
14
15#include "RegisterContextPOSIX.h"
16#include "lldb/Target/Thread.h"
17
18class ProcessMessage;
19class ProcessMonitor;
20class POSIXBreakpointProtocol;
21
22// @class FreeBSDThread
23// Abstraction of a FreeBSD thread.
24class FreeBSDThread : public lldb_private::Thread {
25public:
26  // Constructors and destructors
27  FreeBSDThread(lldb_private::Process &process, lldb::tid_t tid);
28
29  virtual ~FreeBSDThread();
30
31  // POSIXThread
32  void RefreshStateAfterStop() override;
33
34  // This notifies the thread when a private stop occurs.
35  void DidStop() override;
36
37  const char *GetInfo() override;
38
39  void SetName(const char *name) override;
40
41  const char *GetName() override;
42
43  lldb::RegisterContextSP GetRegisterContext() override;
44
45  lldb::RegisterContextSP
46  CreateRegisterContextForFrame(lldb_private::StackFrame *frame) override;
47
48  lldb::addr_t GetThreadPointer() override;
49
50  // These functions provide a mapping from the register offset
51  // back to the register index or name for use in debugging or log
52  // output.
53
54  unsigned GetRegisterIndexFromOffset(unsigned offset);
55
56  const char *GetRegisterName(unsigned reg);
57
58  const char *GetRegisterNameFromOffset(unsigned offset);
59
60  // These methods form a specialized interface to POSIX threads.
61  //
62  bool Resume();
63
64  void Notify(const ProcessMessage &message);
65
66  // These methods provide an interface to watchpoints
67  //
68  bool EnableHardwareWatchpoint(lldb_private::Watchpoint *wp);
69
70  bool DisableHardwareWatchpoint(lldb_private::Watchpoint *wp);
71
72  uint32_t NumSupportedHardwareWatchpoints();
73
74  uint32_t FindVacantWatchpointIndex();
75
76protected:
77  POSIXBreakpointProtocol *GetPOSIXBreakpointProtocol() {
78    if (!m_reg_context_sp)
79      m_reg_context_sp = GetRegisterContext();
80    return m_posix_thread;
81  }
82
83  std::unique_ptr<lldb_private::StackFrame> m_frame_up;
84
85  lldb::BreakpointSiteSP m_breakpoint;
86
87  bool m_thread_name_valid;
88  std::string m_thread_name;
89  POSIXBreakpointProtocol *m_posix_thread;
90
91  ProcessMonitor &GetMonitor();
92
93  bool CalculateStopInfo() override;
94
95  void BreakNotify(const ProcessMessage &message);
96  void WatchNotify(const ProcessMessage &message);
97  virtual void TraceNotify(const ProcessMessage &message);
98  void LimboNotify(const ProcessMessage &message);
99  void SignalNotify(const ProcessMessage &message);
100  void SignalDeliveredNotify(const ProcessMessage &message);
101  void CrashNotify(const ProcessMessage &message);
102  void ExitNotify(const ProcessMessage &message);
103  void ExecNotify(const ProcessMessage &message);
104
105  // FreeBSDThread internal API.
106
107  // POSIXThread override
108  virtual void WillResume(lldb::StateType resume_state) override;
109};
110
111#endif // #ifndef liblldb_FreeBSDThread_H_
112