diff options
Diffstat (limited to 'lldb/source/Plugins/Process/Darwin/NativeThreadDarwin.h')
-rw-r--r-- | lldb/source/Plugins/Process/Darwin/NativeThreadDarwin.h | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/lldb/source/Plugins/Process/Darwin/NativeThreadDarwin.h b/lldb/source/Plugins/Process/Darwin/NativeThreadDarwin.h new file mode 100644 index 00000000000..efdf79ac3e0 --- /dev/null +++ b/lldb/source/Plugins/Process/Darwin/NativeThreadDarwin.h @@ -0,0 +1,216 @@ +//===-- NativeThreadDarwin.h ---------------------------------- -*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef NativeThreadDarwin_H +#define NativeThreadDarwin_H + +// C includes +#include <mach/mach_types.h> +#include <sched.h> +#include <sys/proc_info.h> + +// C++ includes +#include <map> +#include <memory> +#include <string> + +// LLDB includes +#include "lldb/lldb-private-forward.h" +#include "lldb/Host/common/NativeThreadProtocol.h" + +#include "MachException.h" + +namespace lldb_private { +namespace process_darwin { + +class NativeProcessDarwin; +using NativeProcessDarwinSP = std::shared_ptr<NativeProcessDarwin>; + +class NativeThreadListDarwin; + +class NativeThreadDarwin : public NativeThreadProtocol +{ + friend class NativeProcessDarwin; + friend class NativeThreadListDarwin; + +public: + + static uint64_t + GetGloballyUniqueThreadIDForMachPortID(::thread_t mach_port_id); + + NativeThreadDarwin(NativeProcessDarwin *process, bool is_64_bit, + lldb::tid_t unique_thread_id = 0, + ::thread_t mach_thread_port = 0); + + // ----------------------------------------------------------------- + // NativeThreadProtocol Interface + // ----------------------------------------------------------------- + std::string + GetName() override; + + lldb::StateType + GetState () override; + + bool + GetStopReason(ThreadStopInfo &stop_info, + std::string& description) override; + + NativeRegisterContextSP + GetRegisterContext() override; + + Error + SetWatchpoint(lldb::addr_t addr, size_t size, + uint32_t watch_flags, bool hardware) override; + + Error + RemoveWatchpoint(lldb::addr_t addr) override; + + // ----------------------------------------------------------------- + // New methods that are fine for others to call. + // ----------------------------------------------------------------- + void + Dump(Stream &stream) const; + +private: + // ----------------------------------------------------------------- + // Interface for friend classes + // ----------------------------------------------------------------- + + /// Resumes the thread. If @p signo is anything but + /// LLDB_INVALID_SIGNAL_NUMBER, deliver that signal to the thread. + Error + Resume(uint32_t signo); + + /// Single steps the thread. If @p signo is anything but + /// LLDB_INVALID_SIGNAL_NUMBER, deliver that signal to the thread. + Error + SingleStep(uint32_t signo); + + bool + NotifyException(MachException::Data &exc); + + bool + ShouldStop(bool &step_more) const; + + void + ThreadDidStop(); + + void + SetStoppedBySignal(uint32_t signo, const siginfo_t *info = nullptr); + + /// Return true if the thread is stopped. + /// If stopped by a signal, indicate the signo in the signo + /// argument. Otherwise, return LLDB_INVALID_SIGNAL_NUMBER. + bool + IsStopped (int *signo); + + const struct thread_basic_info * + GetBasicInfo() const; + + static bool + GetBasicInfo(::thread_t thread, struct thread_basic_info *basicInfoPtr); + + bool + IsUserReady() const; + + void + SetStoppedByExec (); + + void + SetStoppedByBreakpoint (); + + void + SetStoppedByWatchpoint (uint32_t wp_index); + + bool + IsStoppedAtBreakpoint (); + + bool + IsStoppedAtWatchpoint (); + + void + SetStoppedByTrace (); + + void + SetStoppedWithNoReason (); + + void + SetExited (); + + Error + RequestStop (); + + // ------------------------------------------------------------------------- + /// Return the mach thread port number for this thread. + /// + /// @return + /// The mach port number for this thread. Returns NULL_THREAD + /// when the thread is invalid. + // ------------------------------------------------------------------------- + thread_t + GetMachPortNumber() const + { + return m_mach_thread_port; + } + + static bool + MachPortNumberIsValid(::thread_t thread); + + // --------------------------------------------------------------------- + // Private interface + // --------------------------------------------------------------------- + bool + GetIdentifierInfo(); + + void + MaybeLogStateChange (lldb::StateType new_state); + + NativeProcessDarwinSP + GetNativeProcessDarwinSP(); + + void + SetStopped(); + + inline void + MaybePrepareSingleStepWorkaround(); + + inline void + MaybeCleanupSingleStepWorkaround(); + + // ----------------------------------------------------------------- + // Member Variables + // ----------------------------------------------------------------- + + // The mach thread port for the thread. + ::thread_t m_mach_thread_port; + + // The most recently-retrieved thread basic info. + mutable ::thread_basic_info m_basic_info; + + struct proc_threadinfo m_proc_threadinfo; + + thread_identifier_info_data_t m_ident_info; + +#if 0 + lldb::StateType m_state; + ThreadStopInfo m_stop_info; + NativeRegisterContextSP m_reg_context_sp; + std::string m_stop_description; + using WatchpointIndexMap = std::map<lldb::addr_t, uint32_t>; + WatchpointIndexMap m_watchpoint_index_map; + // cpu_set_t m_original_cpu_set; // For single-step workaround. +#endif +}; + +typedef std::shared_ptr<NativeThreadDarwin> NativeThreadDarwinSP; + +} // namespace process_darwin +} // namespace lldb_private + +#endif // #ifndef NativeThreadDarwin_H |