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:
2494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    enum
2594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    {
2694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        eBroadcastBitStackChanged           = (1 << 0),
2794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        eBroadcastBitThreadSuspended        = (1 << 1),
2894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        eBroadcastBitThreadResumed          = (1 << 2),
292e2812388b75d3c62c9518cc1a6550ce29325aa6Jim Ingham        eBroadcastBitSelectedFrameChanged   = (1 << 3),
302e2812388b75d3c62c9518cc1a6550ce29325aa6Jim Ingham        eBroadcastBitThreadSelected         = (1 << 4)
3194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    };
3294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
3394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    static const char *
3494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    GetBroadcasterClassName ();
3594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBThread ();
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SBThread (const lldb::SBThread &thread);
39001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata
40001cd53e9d8d9e481ada536924ea7563b84ee9cfEnrico Granata    SBThread (const lldb::ThreadSP& lldb_object_sp);
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner   ~SBThread();
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsValid() const;
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4743490d1332d13694fb6690365984bf0ecdd8dcc3Greg Clayton    void
4843490d1332d13694fb6690365984bf0ecdd8dcc3Greg Clayton    Clear ();
4943490d1332d13694fb6690365984bf0ecdd8dcc3Greg Clayton
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StopReason
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetStopReason();
52640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton
532ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// Get the number of words associated with the stop reason.
542ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// See also GetStopReasonDataAtIndex().
55640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    size_t
56640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    GetStopReasonDataCount();
57640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton
58640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    //--------------------------------------------------------------------------
592ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// Get information associated with a stop reason.
602ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    ///
612ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// Breakpoint stop reasons will have data that consists of pairs of
622ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// breakpoint IDs followed by the breakpoint location IDs (they always come
632ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// in pairs).
642ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    ///
652ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// Stop Reason              Count Data Type
662ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// ======================== ===== =========================================
672ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// eStopReasonNone          0
682ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// eStopReasonTrace         0
692ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// eStopReasonBreakpoint    N     duple: {breakpoint id, location id}
70bcbefa8de7877c5d0674d5816cf96db48b103e6fJohnny Chen    /// eStopReasonWatchpoint    1     watchpoint id
712ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// eStopReasonSignal        1     unix signal number
722ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// eStopReasonException     N     exception data
730bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    /// eStopReasonExec          0
742ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// eStopReasonPlanComplete  0
75640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    //--------------------------------------------------------------------------
76640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    uint64_t
77640dc6b983964615bcb149d7d37ee007a13fb02cGreg Clayton    GetStopReasonDataAtIndex(uint32_t idx);
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetStopDescription (char *dst, size_t dst_len);
811586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
821586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    SBValue
831586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    GetStopReturnValue ();
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::tid_t
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetThreadID () const;
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetIndexID () const;
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName () const;
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetQueueName() const;
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StepOver (lldb::RunMode stop_other_threads = lldb::eOnlyDuringStepping);
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StepInto (lldb::RunMode stop_other_threads = lldb::eOnlyDuringStepping);
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
104f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    StepInto (const char *target_name, lldb::RunMode stop_other_threads = lldb::eOnlyDuringStepping);
105f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham
106f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    void
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StepOut ();
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
1101ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    StepOutOfFrame (lldb::SBFrame &frame);
1111ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
1121ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    void
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StepInstruction(bool step_over);
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1151ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    SBError
1161ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton    StepOverUntil (lldb::SBFrame &frame,
1171ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                   lldb::SBFileSpec &file_spec,
1181ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                   uint32_t line);
1191ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RunToAddress (lldb::addr_t addr);
122a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham
123a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    SBError
124f59388aa57559d7d074613d65b88abacfd699845Jim Ingham    ReturnFromFrame (SBFrame &frame, SBValue &return_value);
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    //--------------------------------------------------------------------------
1272ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// LLDB currently supports process centric debugging which means when any
1282ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// thread in a process stops, all other threads are stopped. The Suspend()
1292ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// call here tells our process to suspend a thread and not let it run when
1302ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// the other threads in a process are allowed to run. So when
1312ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// SBProcess::Continue() is called, any threads that aren't suspended will
1322ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// be allowed to run. If any of the SBThread functions for stepping are
1332ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// called (StepOver, StepInto, StepOut, StepInstruction, RunToAddres), the
13423df42a102f7f4c83128865e396eb9411f9a3cddAndrew Kaylor    /// thread will not be allowed to run and these funtions will simply return.
1352ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    ///
1362ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// Eventually we plan to add support for thread centric debugging where
1372ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// each thread is controlled individually and each thread would broadcast
1382ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// its state, but we haven't implemented this yet.
1392ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    ///
1402ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// Likewise the SBThread::Resume() call will again allow the thread to run
1412ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// when the process is continued.
1422ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    ///
1432ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// Suspend() and Resume() functions are not currently reference counted, if
1442ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// anyone has the need for them to be reference counted, please let us
1452ded5ed80f3f4c794a2323b68a5da11fad61b6f2Johnny Chen    /// know.
146123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    //--------------------------------------------------------------------------
147123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    bool
148123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    Suspend();
149123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton
150123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    bool
151123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    Resume ();
152123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton
153123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    bool
154123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    IsSuspended();
155123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton
1562c354722318f0fcad087c76f2bc0dc8db9200b4bAndrew Kaylor    bool
1572c354722318f0fcad087c76f2bc0dc8db9200b4bAndrew Kaylor    IsStopped();
1582c354722318f0fcad087c76f2bc0dc8db9200b4bAndrew Kaylor
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetNumFrames ();
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::SBFrame
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetFrameAtIndex (uint32_t idx);
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
165c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    lldb::SBFrame
166c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    GetSelectedFrame ();
167c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton
168c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    lldb::SBFrame
169c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton    SetSelectedFrame (uint32_t frame_idx);
17094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
17194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    static bool
17294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    EventIsThreadEvent (const SBEvent &event);
17394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
17494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    static SBFrame
17594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    GetStackFrameFromEvent (const SBEvent &event);
17694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
17794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    static SBThread
17894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    GetThreadFromEvent (const SBEvent &event);
179c5157ecb9c6185b92923fab50de53f3fad86095dGreg Clayton
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::SBProcess
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetProcess ();
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const lldb::SBThread &
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    operator = (const lldb::SBThread &rhs);
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    operator == (const lldb::SBThread &rhs) const;
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    operator != (const lldb::SBThread &rhs) const;
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19298f930f429160f9777f626c3ac6aa609f4e965d2Caroline Tice    bool
1937826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    GetDescription (lldb::SBStream &description) const;
19494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
19594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    bool
19694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    GetStatus (lldb::SBStream &status) const;
1977826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    friend class SBBreakpoint;
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    friend class SBBreakpointLocation;
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    friend class SBFrame;
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    friend class SBProcess;
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    friend class SBDebugger;
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    friend class SBValue;
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetThread (const lldb::ThreadSP& lldb_object_sp);
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20988e3de205708f14431559072ca258899b5ac31ccJim Ingham#ifndef SWIG
21088e3de205708f14431559072ca258899b5ac31ccJim Ingham    SBError
21188e3de205708f14431559072ca258899b5ac31ccJim Ingham    ResumeNewPlan (lldb_private::ExecutionContext &exe_ctx, lldb_private::ThreadPlan *new_plan);
21288e3de205708f14431559072ca258899b5ac31ccJim Ingham#endif
21388e3de205708f14431559072ca258899b5ac31ccJim Ingham
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
215a894fe78bc15344a0025c1154e414c554ab31dd9Greg Clayton    lldb::ExecutionContextRefSP m_opaque_sp;
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // LLDB_SBThread_h_
221