LLDB  mainline
NativeThreadDarwin.h
Go to the documentation of this file.
1 //===-- NativeThreadDarwin.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 NativeThreadDarwin_H
10 #define NativeThreadDarwin_H
11 
12 // C includes
13 #include <mach/mach_types.h>
14 #include <sched.h>
15 #include <sys/proc_info.h>
16 
17 // C++ includes
18 #include <map>
19 #include <memory>
20 #include <string>
21 
22 // LLDB includes
25 
26 #include "MachException.h"
27 
28 namespace lldb_private {
29 namespace process_darwin {
30 
31 class NativeProcessDarwin;
32 using NativeProcessDarwinSP = std::shared_ptr<NativeProcessDarwin>;
33 
35 
37  friend class NativeProcessDarwin;
38  friend class NativeThreadListDarwin;
39 
40 public:
41  static uint64_t
43 
44  NativeThreadDarwin(NativeProcessDarwin *process, bool is_64_bit,
45  lldb::tid_t unique_thread_id = 0,
46  ::thread_t mach_thread_port = 0);
47 
48  // NativeThreadProtocol Interface
49  std::string GetName() override;
50 
51  lldb::StateType GetState() override;
52 
53  bool GetStopReason(ThreadStopInfo &stop_info,
54  std::string &description) override;
55 
56  NativeRegisterContextSP GetRegisterContext() override;
57 
58  Status SetWatchpoint(lldb::addr_t addr, size_t size, uint32_t watch_flags,
59  bool hardware) override;
60 
61  Status RemoveWatchpoint(lldb::addr_t addr) override;
62 
63  // New methods that are fine for others to call.
64  void Dump(Stream &stream) const;
65 
66 private:
67  // Interface for friend classes
68 
69  /// Resumes the thread. If \p signo is anything but
70  /// LLDB_INVALID_SIGNAL_NUMBER, deliver that signal to the thread.
71  Status Resume(uint32_t signo);
72 
73  /// Single steps the thread. If \p signo is anything but
74  /// LLDB_INVALID_SIGNAL_NUMBER, deliver that signal to the thread.
75  Status SingleStep(uint32_t signo);
76 
77  bool NotifyException(MachException::Data &exc);
78 
79  bool ShouldStop(bool &step_more) const;
80 
81  void ThreadDidStop();
82 
83  void SetStoppedBySignal(uint32_t signo, const siginfo_t *info = nullptr);
84 
85  /// Return true if the thread is stopped.
86  /// If stopped by a signal, indicate the signo in the signo
87  /// argument. Otherwise, return LLDB_INVALID_SIGNAL_NUMBER.
88  bool IsStopped(int *signo);
89 
90  const struct thread_basic_info *GetBasicInfo() const;
91 
92  static bool GetBasicInfo(::thread_t thread,
93  struct thread_basic_info *basicInfoPtr);
94 
95  bool IsUserReady() const;
96 
97  void SetStoppedByExec();
98 
99  void SetStoppedByBreakpoint();
100 
101  void SetStoppedByWatchpoint(uint32_t wp_index);
102 
103  bool IsStoppedAtBreakpoint();
104 
105  bool IsStoppedAtWatchpoint();
106 
107  void SetStoppedByTrace();
108 
109  void SetStoppedWithNoReason();
110 
111  void SetExited();
112 
113  Status RequestStop();
114 
115  /// Return the mach thread port number for this thread.
116  ///
117  /// \return
118  /// The mach port number for this thread. Returns NULL_THREAD
119  /// when the thread is invalid.
120  thread_t GetMachPortNumber() const { return m_mach_thread_port; }
121 
122  static bool MachPortNumberIsValid(::thread_t thread);
123 
124  // Private interface
125  bool GetIdentifierInfo();
126 
127  void MaybeLogStateChange(lldb::StateType new_state);
128 
129  NativeProcessDarwinSP GetNativeProcessDarwinSP();
130 
131  void SetStopped();
132 
133  inline void MaybePrepareSingleStepWorkaround();
134 
135  inline void MaybeCleanupSingleStepWorkaround();
136 
137  // Member Variables
138 
139  // The mach thread port for the thread.
140  ::thread_t m_mach_thread_port;
141 
142  // The most recently-retrieved thread basic info.
143  mutable ::thread_basic_info m_basic_info;
144 
145  struct proc_threadinfo m_proc_threadinfo;
146 
147  thread_identifier_info_data_t m_ident_info;
148 
149 #if 0
150  lldb::StateType m_state;
151  ThreadStopInfo m_stop_info;
152  NativeRegisterContextSP m_reg_context_sp;
153  std::string m_stop_description;
154  using WatchpointIndexMap = std::map<lldb::addr_t, uint32_t>;
155  WatchpointIndexMap m_watchpoint_index_map;
156  // cpu_set_t m_original_cpu_set; // For single-step workaround.
157 #endif
158 };
159 
160 typedef std::shared_ptr<NativeThreadDarwin> NativeThreadDarwinSP;
161 
162 } // namespace process_darwin
163 } // namespace lldb_private
164 
165 #endif // #ifndef NativeThreadDarwin_H
std::shared_ptr< NativeProcessDarwin > NativeProcessDarwinSP
Enumerations for broadcasting.
Definition: SBLaunchInfo.h:14
A stream class that can stream formatted output to a file.
Definition: Stream.h:28
Manages communication with the inferior (debugee) process.
NativeThreadDarwin(NativeProcessDarwin *process, bool is_64_bit, lldb::tid_t unique_thread_id=0, ::thread_t mach_thread_port=0)
static uint64_t GetGloballyUniqueThreadIDForMachPortID(::thread_t mach_port_id)
Status SetWatchpoint(lldb::addr_t addr, size_t size, uint32_t watch_flags, bool hardware) override
uint64_t tid_t
Definition: lldb-types.h:86
Status RemoveWatchpoint(lldb::addr_t addr) override
NativeRegisterContextSP GetRegisterContext() override
pthread_t thread_t
Definition: lldb-types.h:58
std::shared_ptr< NativeThreadDarwin > NativeThreadDarwinSP
uint64_t addr_t
Definition: lldb-types.h:83
bool GetStopReason(ThreadStopInfo &stop_info, std::string &description) override
An error handling class.
Definition: Status.h:44