1af245d11STodd Fiala //===-- NativeThreadLinux.h ----------------------------------- -*- C++ -*-===//
2af245d11STodd Fiala //
3af245d11STodd Fiala //                     The LLVM Compiler Infrastructure
4af245d11STodd Fiala //
5af245d11STodd Fiala // This file is distributed under the University of Illinois Open Source
6af245d11STodd Fiala // License. See LICENSE.TXT for details.
7af245d11STodd Fiala //
8af245d11STodd Fiala //===----------------------------------------------------------------------===//
9af245d11STodd Fiala 
10af245d11STodd Fiala #ifndef liblldb_NativeThreadLinux_H_
11af245d11STodd Fiala #define liblldb_NativeThreadLinux_H_
12af245d11STodd Fiala 
13af245d11STodd Fiala #include "lldb/lldb-private-forward.h"
142fe1d0abSChaoren Lin #include "lldb/Host/common/NativeThreadProtocol.h"
15af245d11STodd Fiala 
1618fe6404SChaoren Lin #include <map>
177572caf4SRichard Smith #include <string>
1818fe6404SChaoren Lin 
19db264a6dSTamas Berghammer namespace lldb_private {
20db264a6dSTamas Berghammer namespace process_linux {
21db264a6dSTamas Berghammer 
22af245d11STodd Fiala     class NativeProcessLinux;
23af245d11STodd Fiala 
24af245d11STodd Fiala     class NativeThreadLinux : public NativeThreadProtocol
25af245d11STodd Fiala     {
26af245d11STodd Fiala         friend class NativeProcessLinux;
27af245d11STodd Fiala 
28af245d11STodd Fiala     public:
29af245d11STodd Fiala         NativeThreadLinux (NativeProcessLinux *process, lldb::tid_t tid);
30af245d11STodd Fiala 
31af245d11STodd Fiala         // ---------------------------------------------------------------------
32af245d11STodd Fiala         // NativeThreadProtocol Interface
33af245d11STodd Fiala         // ---------------------------------------------------------------------
347206c6d1STodd Fiala         std::string
35af245d11STodd Fiala         GetName() override;
36af245d11STodd Fiala 
37af245d11STodd Fiala         lldb::StateType
38af245d11STodd Fiala         GetState () override;
39af245d11STodd Fiala 
40af245d11STodd Fiala         bool
4128e57429SChaoren Lin         GetStopReason (ThreadStopInfo &stop_info, std::string& description) override;
42af245d11STodd Fiala 
43af245d11STodd Fiala         NativeRegisterContextSP
44af245d11STodd Fiala         GetRegisterContext () override;
45af245d11STodd Fiala 
46af245d11STodd Fiala         Error
47af245d11STodd Fiala         SetWatchpoint (lldb::addr_t addr, size_t size, uint32_t watch_flags, bool hardware) override;
48af245d11STodd Fiala 
49af245d11STodd Fiala         Error
50af245d11STodd Fiala         RemoveWatchpoint (lldb::addr_t addr) override;
51af245d11STodd Fiala 
52af245d11STodd Fiala     private:
53af245d11STodd Fiala         // ---------------------------------------------------------------------
54af245d11STodd Fiala         // Interface for friend classes
55af245d11STodd Fiala         // ---------------------------------------------------------------------
56af245d11STodd Fiala         void
57af245d11STodd Fiala         SetRunning ();
58af245d11STodd Fiala 
59af245d11STodd Fiala         void
60af245d11STodd Fiala         SetStepping ();
61af245d11STodd Fiala 
62af245d11STodd Fiala         void
63c4e25c96SPavel Labath         SetStoppedBySignal(uint32_t signo, const siginfo_t *info = nullptr);
64af245d11STodd Fiala 
65511e5cdcSTodd Fiala         /// Return true if the thread is stopped.
66511e5cdcSTodd Fiala         /// If stopped by a signal, indicate the signo in the signo argument.
67511e5cdcSTodd Fiala         /// Otherwise, return LLDB_INVALID_SIGNAL_NUMBER.
68511e5cdcSTodd Fiala         bool
69511e5cdcSTodd Fiala         IsStopped (int *signo);
70511e5cdcSTodd Fiala 
71af245d11STodd Fiala         void
72a9882ceeSTodd Fiala         SetStoppedByExec ();
73a9882ceeSTodd Fiala 
74a9882ceeSTodd Fiala         void
75af245d11STodd Fiala         SetStoppedByBreakpoint ();
76af245d11STodd Fiala 
7718fe6404SChaoren Lin         void
78c16f5dcaSChaoren Lin         SetStoppedByWatchpoint (uint32_t wp_index);
7918fe6404SChaoren Lin 
80af245d11STodd Fiala         bool
81af245d11STodd Fiala         IsStoppedAtBreakpoint ();
82af245d11STodd Fiala 
8318fe6404SChaoren Lin         bool
8418fe6404SChaoren Lin         IsStoppedAtWatchpoint ();
8518fe6404SChaoren Lin 
86af245d11STodd Fiala         void
8728e57429SChaoren Lin         SetStoppedByTrace ();
8828e57429SChaoren Lin 
8928e57429SChaoren Lin         void
90*05569f67SPavel Labath         SetStoppedWithNoReason ();
91af245d11STodd Fiala 
92af245d11STodd Fiala         void
93af245d11STodd Fiala         SetExited ();
94af245d11STodd Fiala 
958c8ff7afSPavel Labath         Error
968c8ff7afSPavel Labath         RequestStop ();
978c8ff7afSPavel Labath 
988c8ff7afSPavel Labath         typedef std::function<Error (lldb::tid_t tid, bool supress_signal)> ResumeThreadFunction;
998c8ff7afSPavel Labath         struct ThreadContext
1008c8ff7afSPavel Labath         {
1018c8ff7afSPavel Labath             bool stop_requested = false;
1028c8ff7afSPavel Labath             ResumeThreadFunction request_resume_function;
1038c8ff7afSPavel Labath         };
1048c8ff7afSPavel Labath 
1058c8ff7afSPavel Labath         ThreadContext &
1068c8ff7afSPavel Labath         GetThreadContext() { return m_thread_context; }
1078c8ff7afSPavel Labath 
108af245d11STodd Fiala         // ---------------------------------------------------------------------
109af245d11STodd Fiala         // Private interface
110af245d11STodd Fiala         // ---------------------------------------------------------------------
111af245d11STodd Fiala         void
112af245d11STodd Fiala         MaybeLogStateChange (lldb::StateType new_state);
113af245d11STodd Fiala 
114af245d11STodd Fiala         // ---------------------------------------------------------------------
115af245d11STodd Fiala         // Member Variables
116af245d11STodd Fiala         // ---------------------------------------------------------------------
117af245d11STodd Fiala         lldb::StateType m_state;
118af245d11STodd Fiala         ThreadStopInfo m_stop_info;
119af245d11STodd Fiala         NativeRegisterContextSP m_reg_context_sp;
12028e57429SChaoren Lin         std::string m_stop_description;
12118fe6404SChaoren Lin         using WatchpointIndexMap = std::map<lldb::addr_t, uint32_t>;
12218fe6404SChaoren Lin         WatchpointIndexMap m_watchpoint_index_map;
1238c8ff7afSPavel Labath         ThreadContext m_thread_context;
124af245d11STodd Fiala     };
125db264a6dSTamas Berghammer 
126db264a6dSTamas Berghammer } // namespace process_linux
127db264a6dSTamas Berghammer } // namespace lldb_private
128af245d11STodd Fiala 
129af245d11STodd Fiala #endif // #ifndef liblldb_NativeThreadLinux_H_
130