SBThread.h revision 123db408a6bc06614ec893040aaad84d8d0d16f9
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SBThread.h ----------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef LLDB_SBThread_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define LLDB_SBThread_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1374089e10cfbb4665da128f26d78c2b4006b5f1c6Christopher Friesen#include "lldb/API/SBDefines.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
157884ab842f7f0be6c583eac2904f5763706816bcEli Friedman#include <stdio.h>
167884ab842f7f0be6c583eac2904f5763706816bcEli Friedman
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb {
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass SBFrame;
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass SBThread
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBThread ();
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBThread (const lldb::SBThread &thread);
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   ~SBThread();
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsValid() const;
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3343490d1332d13694fb6690365984bf0ecdd8dcc3Greg Clayton    void
3443490d1332d13694fb6690365984bf0ecdd8dcc3Greg Clayton    Clear ();
3543490d1332d13694fb6690365984bf0ecdd8dcc3Greg Clayton
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StopReason
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetStopReason();
38640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton
39640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    // Get the number of words associated with the stop reason.
40640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    size_t
41640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    GetStopReasonDataCount();
42640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton
43640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    //--------------------------------------------------------------------------
44640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    // Get information associated with a stop reason.
45640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    //
46640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    // Breakpoint stop reasons will have data that consists of pairs of
47640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    // breakpoint IDs followed by the breakpoint location IDs (they always come
48640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    // in pairs).
49640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    //
50640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    // Stop Reason              Count Data Type
51640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    // ======================== ===== ==========================================
52640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    // eStopReasonNone          0
53640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    // eStopReasonTrace         0
54640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    // eStopReasonBreakpoint    N     duple: {breakpoint id, location id}
55640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    // eStopReasonWatchpoint    N     duple: {watchpoint id, location id}
56640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    // eStopReasonSignal        1     unix signal number
57640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    // eStopReasonException     N     exception data
58640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    // eStopReasonPlanComplete  0
59640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    //--------------------------------------------------------------------------
60640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    uint64_t
61640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    GetStopReasonDataAtIndex(uint32_t idx);
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetStopDescription (char *dst, size_t dst_len);
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::tid_t
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetThreadID () const;
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetIndexID () const;
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName () const;
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetQueueName() const;
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StepOver (lldb::RunMode stop_other_threads = lldb::eOnlyDuringStepping);
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StepInto (lldb::RunMode stop_other_threads = lldb::eOnlyDuringStepping);
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StepOut ();
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StepInstruction(bool step_over);
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RunToAddress (lldb::addr_t addr);
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    //--------------------------------------------------------------------------
94123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // LLDB currently supports process centric debugging which means when any
95123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // thread in a process stops, all other threads are stopped. The Suspend()
96123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // call here tells our process to suspend a thread and not let it run when
97123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // the other threads in a process are allowed to run. So when
98123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // SBProcess::Continue() is called, any threads that aren't suspended will
99123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // be allowed to run. If any of the SBThread functions for stepping are
100123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // called (StepOver, StepInto, StepOut, StepInstruction, RunToAddres), the
101123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // thread will now be allowed to run and these funtions will simply return.
102123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    //
103123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // Eventually we plan to add support for thread centric debugging where each
104123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // thread is controlled individually and each thread would broadcast its
105123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // state, but we haven't implemented this yet.
106123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    //
107123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // Likewise the SBThread::Resume() call will again allow the thread to run
108123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // when the process is continued.
109123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    //
110123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // The Suspend() and Resume() functions are not currently reference counted,
111123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // if anyone has the need for them to be reference counted, please let us
112123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    // know.
113123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    //--------------------------------------------------------------------------
114123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    bool
115123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    Suspend();
116123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton
117123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    bool
118123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    Resume ();
119123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton
120123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    bool
121123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    IsSuspended();
122123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetNumFrames ();
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::SBFrame
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFrameAtIndex (uint32_t idx);
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
129c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    lldb::SBFrame
130c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    GetSelectedFrame ();
131c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton
132c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    lldb::SBFrame
133c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    SetSelectedFrame (uint32_t frame_idx);
134c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::SBProcess
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetProcess ();
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef SWIG
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb::SBThread &
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    operator = (const lldb::SBThread &rhs);
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    operator == (const lldb::SBThread &rhs) const;
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    operator != (const lldb::SBThread &rhs) const;
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15198f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    bool
1527826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    GetDescription (lldb::SBStream &description) const;
1537826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    friend class SBBreakpoint;
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    friend class SBBreakpointLocation;
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    friend class SBFrame;
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    friend class SBProcess;
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    friend class SBDebugger;
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    friend class SBValue;
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef SWIG
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
165a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    lldb_private::Thread *
166a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton    get ();
167a66ba46379fe41036d870975c56ccc2319cb6618Greg Clayton
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb_private::Thread *
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    operator->() const;
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb_private::Thread &
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    operator*() const;
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::Thread *
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    operator->();
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::Thread &
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    operator*();
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBThread (const lldb::ThreadSP& lldb_object_sp);
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetThread (const lldb::ThreadSP& lldb_object_sp);
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Classes that inherit from Thread can see and modify these
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19363094e0bb161580564954dee512955c1c79d3476Greg Clayton    lldb::ThreadSP m_opaque_sp;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // LLDB_SBThread_h_
199