Thread.h revision 5205f0b6585a127acc6ed210021abb6091220a89
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Thread.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 liblldb_Thread_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_Thread_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Mutex.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UserID.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContextScope.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrameList.h"
1871219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham#include "libunwind/include/libunwind.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define LLDB_THREAD_MAX_STOP_EXC_DATA 8
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// I forward declare these here so I don't have to #include ThreadPlan, so in turn I
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// can use Thread.h in ThreadPlan.h.
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Thread :
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public UserID,
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public ExecutionContextScope
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class RegisterCheckpoint
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public:
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        RegisterCheckpoint() :
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_stack_id (),
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_data_sp ()
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        RegisterCheckpoint (const StackID &stack_id) :
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_stack_id (stack_id),
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_data_sp ()
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ~RegisterCheckpoint()
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const StackID &
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetStackID()
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_stack_id;
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetStackID (const StackID &stack_id)
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_stack_id = stack_id;
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::DataBufferSP &
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetData()
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_data_sp;
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const lldb::DataBufferSP &
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetData() const
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_data_sp;
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    protected:
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        StackID m_stack_id;
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::DataBufferSP m_data_sp;
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Thread (Process &process, lldb::tid_t tid);
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ~Thread();
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Process &
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetProcess() { return m_process; }
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Process &
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetProcess() const { return m_process; }
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetResumeSignal () const;
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetResumeSignal (int signal);
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StateType
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetState() const;
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::ThreadSP
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetSP ();
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetState (lldb::StateType state);
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StateType
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetResumeState () const;
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetResumeState (lldb::StateType state);
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This function is called on all the threads before "WillResume" in case
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // a thread needs to change its state before the ThreadList polls all the
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // threads to figure out which ones actually will get to run and how.
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetupForResume ();
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Override this to do platform specific tasks before resume, but always
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // call the Thread::WillResume at the end of your work.
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WillResume (lldb::StateType resume_state);
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This clears generic thread state after a resume.  If you subclass this,
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // be sure to call it.
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DidResume ();
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RefreshStateAfterStop() = 0;
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WillStop ();
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ShouldStop (Event *event_ptr);
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::Vote
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ShouldReportStop (Event *event_ptr);
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::Vote
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ShouldReportRun (Event *event_ptr);
1433c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham
144649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham    // Return whether this thread matches the specification in ThreadSpec.  This is a virtual
145649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham    // method because at some point we may extend the thread spec with a platform specific
146649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham    // dictionary of attributes, which then only the platform specific Thread implementation
147649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham    // would know how to match.  For now, this just calls through to the ThreadSpec's
148649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham    // ThreadPassesBasicTests method.
1493c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    virtual bool
1503c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    MatchesSpec (const ThreadSpec *spec);
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
152643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    StopInfo *
153643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    GetStopInfo ();
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadStoppedForAReason ();
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual const char *
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetInfo () = 0;
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual const char *
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName ()
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual const char *
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetQueueName ()
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint32_t
17471219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham    GetStackFrameCount();
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb::StackFrameSP
17771219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham    GetStackFrameAtIndex (uint32_t idx);
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StackFrameSP
180c833295baeec641086f536e78050388af36784f8Jim Ingham    GetSelectedFrame ();
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
183c833295baeec641086f536e78050388af36784f8Jim Ingham    SetSelectedFrame (lldb_private::StackFrame *frame);
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
186c833295baeec641086f536e78050388af36784f8Jim Ingham    SetSelectedFrameByIndex (uint32_t frame_idx);
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual RegisterContext *
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetRegisterContext () = 0;
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SaveFrameZeroState (RegisterCheckpoint &checkpoint) = 0;
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RestoreSaveFrameZero (const RegisterCheckpoint &checkpoint) = 0;
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual RegisterContext *
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CreateRegisterContextForFrame (StackFrame *frame) = 0;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
201782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    ClearStackFrames ();
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpInfo (Stream &strm,
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              bool show_stop_reason,
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              bool show_name,
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              bool show_queue,
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              uint32_t frame_idx);// = UINT32_MAX);
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Thread Plan Providers:
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This section provides the basic thread plans that the Process control
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // machinery uses to run the target.  ThreadPlan.h provides more details on
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // how this mechanism works.
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The thread provides accessors to a set of plans that perform basic operations.
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The idea is that particular Platform plugins can override these methods to
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // provide the implementation of these basic operations appropriate to their
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // environment.
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queues the base plan for a thread.
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The version returned by Process does some things that are useful,
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// like handle breakpoints and signals, so if you return a plugin specific
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// one you probably want to call through to the Process one for anything
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// your plugin doesn't explicitly handle.
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the newly queued thread plan, or NULL if the plan could not be queued.
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueFundamentalPlan (bool abort_other_plans);
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queues the plan used to step over a breakpoint at the current PC of \a thread.
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The default version returned by Process handles trap based breakpoints, and
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// will disable the breakpoint, single step over it, then re-enable it.
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the newly queued thread plan, or NULL if the plan could not be queued.
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepOverBreakpointPlan (bool abort_other_plans);
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queues the plan used to step one instruction from the current PC of \a thread.
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] step_over
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we step over calls to functions, false if we step in.
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_other_threads
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we will stop other threads while we single step this one.
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the newly queued thread plan, or NULL if the plan could not be queued.
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepSingleInstruction (bool step_over,
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             bool abort_other_plans,
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             bool stop_other_threads);
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queues the plan used to step through an address range, stepping into or over
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// function calls depending on the value of StepType.
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] type
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Type of step to do, only eStepTypeInto and eStepTypeOver are supported by this plan.
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] range
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The address range to step through.
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] addr_context
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    When dealing with stepping through inlined functions the current PC is not enough information to know
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    what "step" means.  For instance a series of nested inline functions might start at the same address.
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //     The \a addr_context provides the current symbol context the step
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    is supposed to be out of.
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //   FIXME: Currently unused.
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_other_threads
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we will stop other threads while we single step this one.
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the newly queued thread plan, or NULL if the plan could not be queued.
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepRange (bool abort_other_plans,
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 lldb::StepType type,
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 const AddressRange &range,
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 const SymbolContext &addr_context,
3068f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton                                 lldb::RunMode stop_other_threads,
3078f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton                                 bool avoid_code_without_debug_info);
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queue the plan used to step out of the function at the current PC of
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// \a thread.
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] addr_context
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    When dealing with stepping through inlined functions the current PC is not enough information to know
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    what "step" means.  For instance a series of nested inline functions might start at the same address.
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //     The \a addr_context provides the current symbol context the step
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    is supposed to be out of.
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //   FIXME: Currently unused.
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] first_insn
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b true if this is the first instruction of a function.
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_other_threads
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we will stop other threads while we single step this one.
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_vote
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] run_vote
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    See standard meanings for the stop & run votes in ThreadPlan.h.
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the newly queued thread plan, or NULL if the plan could not be queued.
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepOut (bool abort_other_plans,
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               SymbolContext *addr_context,
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               bool first_insn,
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               bool stop_other_threads,
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               lldb::Vote stop_vote = lldb::eVoteYes,
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               lldb::Vote run_vote = lldb::eVoteNoOpinion);
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the plan used to step through the code that steps from a function
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// call site at the current PC into the actual function call.
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_other_threads
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we will stop other threads while we single step this one.
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the newly queued thread plan, or NULL if the plan could not be queued.
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepThrough (bool abort_other_plans,
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   bool stop_other_threads);
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the plan used to continue from the current PC.
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// This is a simple plan, mostly useful as a backstop when you are continuing
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// for some particular purpose.
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] target_addr
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The address to which we're running.
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_other_threads
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we will stop other threads while we single step this one.
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the newly queued thread plan, or NULL if the plan could not be queued.
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForRunToAddress (bool abort_other_plans,
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    Address &target_addr,
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    bool stop_other_threads);
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepUntil (bool abort_other_plans,
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               lldb::addr_t *address_list,
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               size_t num_addresses,
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               bool stop_others);
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForCallFunction (bool abort_other_plans,
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    Address& function,
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    lldb::addr_t arg,
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    bool stop_other_threads,
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    bool discard_on_error = false);
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForCallFunction (bool abort_other_plans,
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    Address& function,
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    ValueList &args,
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    bool stop_other_threads,
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    bool discard_on_error = false);
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Thread Plan accessors:
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the plan which will execute next on the plan stack.
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the next executed plan.
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadPlan *
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCurrentPlan ();
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the inner-most plan that was popped off the plan stack in the
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// most recent stop.  Useful for printing the stop reason accurately.
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the last completed plan.
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::ThreadPlanSP
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCompletedPlan ();
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///  Checks whether the given plan is in the completed plans for this
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///  stop.
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] plan
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Pointer to the plan you're checking.
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Returns true if the input plan is in the completed plan stack,
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     false otherwise.
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsThreadPlanDone (ThreadPlan *plan);
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///  Checks whether the given plan is in the discarded plans for this
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///  stop.
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] plan
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Pointer to the plan you're checking.
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Returns true if the input plan is in the discarded plan stack,
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     false otherwise.
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WasThreadPlanDiscarded (ThreadPlan *plan);
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queues a generic thread plan.
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] plan_sp
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The plan to queue.
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the last completed plan.
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlan (lldb::ThreadPlanSP &plan_sp, bool abort_other_plans);
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Discards the plans queued on the plan stack of the current thread.  This is
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// arbitrated by the "Master" ThreadPlans, using the "OkayToDiscard" call.
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //  But if \a force is true, all thread plans are discarded.
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DiscardThreadPlans (bool force);
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Prints the current plan stack.
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The stream to which to dump the plan stack info.
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpThreadPlans (Stream *s) const;
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Get the thread index ID. The index ID that is guaranteed to not be
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // re-used by a process. They start at 1 and increase with each new thread.
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This allows easy command line access by a unique ID that is easier to
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // type than the actual system thread ID.
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetIndexID () const;
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // lldb::ExecutionContextScope pure virtual functions
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual Target *
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CalculateTarget ();
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual Process *
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CalculateProcess ();
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual Thread *
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CalculateThread ();
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual StackFrame *
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CalculateStackFrame ();
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Calculate (ExecutionContext &exe_ctx);
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
51832f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton
51932f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton    friend class ThreadPlan;
520782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    friend class StackFrameList;
52132f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PushPlan (lldb::ThreadPlanSP &plan_sp);
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PopPlan ();
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DiscardPlan ();
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadPlan *GetPreviousPlan (ThreadPlan *plan);
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
533643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual lldb::StopInfoSP
534643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    GetPrivateStopReason () = 0;
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector<lldb::ThreadPlanSP> plan_stack;
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53871219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham    virtual lldb_private::Unwind *
53971219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham    GetUnwinder () = 0;
54071219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham
541782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    StackFrameList &
542782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    GetStackFrameList ();
543782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Classes that inherit from Process can see and modify these
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Process &           m_process;          ///< The process that owns this thread.
548643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    lldb::StopInfoSP    m_public_stop_info_sp;     ///< The public stop reason for this thread
549643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    lldb::StopInfoSP    m_actual_stop_info_sp;     ///< The private stop reason for this thread
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t      m_index_id;         ///< A unique 1 based index assigned to each thread for easy UI/command line access.
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::RegisterContextSP   m_reg_context_sp;   ///< The register context for this thread's current register state.
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StateType     m_state;            ///< The state of our process.
553782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    mutable Mutex       m_state_mutex;      ///< Multithreaded protection for m_state.
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    plan_stack          m_plan_stack;       ///< The stack of plans this thread is executing.
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    plan_stack          m_immediate_plan_stack; ///< The plans that need to get executed before any other work gets done.
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    plan_stack          m_completed_plan_stack;  ///< Plans that have been completed by this stop.  They get deleted when the thread resumes.
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    plan_stack          m_discarded_plan_stack;  ///< Plans that have been discarded by this stop.  They get deleted when the thread resumes.
558f40e30823926f27e3cb9364f3c8fe2e4be0c7658Greg Clayton    std::auto_ptr<StackFrameList> m_curr_frames_ap; ///< The stack frames that get lazily populated after a thread stops.
5595205f0b6585a127acc6ed210021abb6091220a89Greg Clayton    lldb::StackFrameListSP m_prev_frames_sp; ///< The previous stack frames from the last time this thread stopped.
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int                 m_resume_signal;    ///< The signal that should be used when continuing this thread.
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StateType     m_resume_state;     ///< The state that indicates what this thread should do when the process is resumed.
56271219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham    std::auto_ptr<lldb_private::Unwind> m_unwinder_ap;
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // For Thread only
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (Thread);
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Thread_h_
574