Thread.h revision b4d7fc0c466d446876e5f2d701f0e574dd0be8e7
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"
1620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham#include "lldb/Core/UserSettingsController.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContextScope.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrameList.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define LLDB_THREAD_MAX_STOP_EXC_DATA 8
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2420594b1b003f63ed34ebafeec37634ee44552339Jim Inghamclass ThreadInstanceSettings : public InstanceSettings
2520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham{
2620594b1b003f63ed34ebafeec37634ee44552339Jim Inghampublic:
2720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
28334d33a19fd28cf41cba74cc61cf149e7101a603Greg Clayton    ThreadInstanceSettings (const lldb::UserSettingsControllerSP &owner_sp, bool live_instance = true, const char *name = NULL);
2920594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
3020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    ThreadInstanceSettings (const ThreadInstanceSettings &rhs);
3120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
3220594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    virtual
3320594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    ~ThreadInstanceSettings ();
3420594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
3520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    ThreadInstanceSettings&
3620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    operator= (const ThreadInstanceSettings &rhs);
3720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
3820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
3920594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    void
4020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    UpdateInstanceSettingsVariable (const ConstString &var_name,
4120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham                                    const char *index_value,
4220594b1b003f63ed34ebafeec37634ee44552339Jim Ingham                                    const char *value,
4320594b1b003f63ed34ebafeec37634ee44552339Jim Ingham                                    const ConstString &instance_name,
4420594b1b003f63ed34ebafeec37634ee44552339Jim Ingham                                    const SettingEntry &entry,
45b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                    VarSetOperationType op,
4620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham                                    Error &err,
4720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham                                    bool pending);
4820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
49bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice    bool
5020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    GetInstanceSettingsValue (const SettingEntry &entry,
5120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham                              const ConstString &var_name,
525bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice                              StringList &value,
53bcb5b454767121980d937d2610ba762fdb575c45Caroline Tice                              Error *err);
5420594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
5520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    RegularExpression *
5620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    GetSymbolsToAvoidRegexp()
5720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    {
5820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham        return m_avoid_regexp_ap.get();
5920594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    }
6020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
6120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    static const ConstString &
6220594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    StepAvoidRegexpVarName ();
63745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
64745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    bool
65745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    GetTraceEnabledState()
66745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    {
67745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham        return m_trace_enabled;
68745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    }
69745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    static const ConstString &
70745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    GetTraceThreadVarName ();
7120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
7220594b1b003f63ed34ebafeec37634ee44552339Jim Inghamprotected:
7320594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
7420594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    void
7520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings,
7620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham                          bool pending);
7720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
780021c97fbd17e38113d2e76b93c94ee05213ee45Johnny Chen    const ConstString
7920594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    CreateInstanceName ();
8020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
8120594b1b003f63ed34ebafeec37634ee44552339Jim Inghamprivate:
8220594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
8320594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    std::auto_ptr<RegularExpression> m_avoid_regexp_ap;
84745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    bool m_trace_enabled;
8520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham};
8620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Thread :
8813d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    public std::tr1::enable_shared_from_this<Thread>,
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public UserID,
9020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    public ExecutionContextScope,
9120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    public ThreadInstanceSettings
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    class SettingsController : public UserSettingsController
9620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    {
9720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    public:
9820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
99990de7bb41d3afec6b789155408ff322187d8682Greg Clayton        SettingsController ();
10020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
10120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham        virtual
102990de7bb41d3afec6b789155408ff322187d8682Greg Clayton        ~SettingsController ();
103d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton
10420594b1b003f63ed34ebafeec37634ee44552339Jim Ingham        static SettingEntry global_settings_table[];
10520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham        static SettingEntry instance_settings_table[];
10620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
10720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    protected:
10820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
10920594b1b003f63ed34ebafeec37634ee44552339Jim Ingham        lldb::InstanceSettingsSP
110d0a5a23d734da7a2170802ccd096f53b8a527811Greg Clayton        CreateInstanceSettings (const char *instance_name);
11120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
11220594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    private:
11320594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
11420594b1b003f63ed34ebafeec37634ee44552339Jim Ingham        // Class-wide settings.
11520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
116990de7bb41d3afec6b789155408ff322187d8682Greg Clayton        DISALLOW_COPY_AND_ASSIGN (SettingsController);
11720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    };
11820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
11915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    // TODO: You shouldn't just checkpoint the register state alone, so this should get
12015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    // moved to protected.  To do that ThreadStateCheckpoint needs to be returned as a token...
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class RegisterCheckpoint
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public:
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        RegisterCheckpoint() :
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_stack_id (),
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_data_sp ()
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        RegisterCheckpoint (const StackID &stack_id) :
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_stack_id (stack_id),
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_data_sp ()
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ~RegisterCheckpoint()
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        const RegisterCheckpoint&
14215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        operator= (const RegisterCheckpoint &rhs)
14315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        {
14415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham            if (this != &rhs)
14515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham            {
14615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham                this->m_stack_id = rhs.m_stack_id;
14715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham                this->m_data_sp  = rhs.m_data_sp;
14815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham            }
14915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham            return *this;
15015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        }
15115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
15215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        RegisterCheckpoint (const RegisterCheckpoint &rhs) :
15315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham            m_stack_id (rhs.m_stack_id),
15415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham            m_data_sp (rhs.m_data_sp)
15515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        {
15615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        }
15715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const StackID &
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetStackID()
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_stack_id;
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetStackID (const StackID &stack_id)
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_stack_id = stack_id;
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::DataBufferSP &
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetData()
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_data_sp;
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const lldb::DataBufferSP &
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetData() const
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_data_sp;
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    protected:
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        StackID m_stack_id;
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::DataBufferSP m_data_sp;
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    struct ThreadStateCheckpoint
18815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    {
18915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        uint32_t           orig_stop_id;  // Dunno if I need this yet but it is an interesting bit of data.
19015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        lldb::StopInfoSP   stop_info_sp;  // You have to restore the stop info or you might continue with the wrong signals.
19115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        RegisterCheckpoint register_backup;  // You need to restore the registers, of course...
19215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    };
19315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
1941ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice    void
1951ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice    UpdateInstanceName ();
1961ebef44c126bd3a615b3ad844c46a82a82efa0e7Caroline Tice
197990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    static void
1982a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    SettingsInitialize ();
199990de7bb41d3afec6b789155408ff322187d8682Greg Clayton
200990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    static void
2012a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    SettingsTerminate ();
202990de7bb41d3afec6b789155408ff322187d8682Greg Clayton
203990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    static lldb::UserSettingsControllerSP &
204990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    GetSettingsController ();
20520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Thread (Process &process, lldb::tid_t tid);
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ~Thread();
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Process &
21037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    GetProcess()
21137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    {
21237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        return m_process;
21337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    }
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Process &
21637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    GetProcess() const
21737f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    {
21837f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        return m_process;
21937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    }
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int
222123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    GetResumeSignal () const
223123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    {
224123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton        return m_resume_signal;
225123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    }
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
228123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    SetResumeSignal (int signal)
229123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    {
230123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton        m_resume_signal = signal;
231123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    }
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StateType
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetState() const;
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetState (lldb::StateType state);
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StateType
240123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    GetResumeState () const
241123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    {
242123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton        return m_resume_state;
243123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    }
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
246123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    SetResumeState (lldb::StateType state)
247123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    {
248123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton        m_resume_state = state;
249123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    }
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This function is called on all the threads before "WillResume" in case
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // a thread needs to change its state before the ThreadList polls all the
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // threads to figure out which ones actually will get to run and how.
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetupForResume ();
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Override this to do platform specific tasks before resume, but always
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // call the Thread::WillResume at the end of your work.
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WillResume (lldb::StateType resume_state);
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This clears generic thread state after a resume.  If you subclass this,
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // be sure to call it.
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DidResume ();
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RefreshStateAfterStop() = 0;
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WillStop ();
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ShouldStop (Event *event_ptr);
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
277b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    Vote
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ShouldReportStop (Event *event_ptr);
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
280b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    Vote
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ShouldReportRun (Event *event_ptr);
2823c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham
283649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham    // Return whether this thread matches the specification in ThreadSpec.  This is a virtual
284649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham    // method because at some point we may extend the thread spec with a platform specific
285649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham    // dictionary of attributes, which then only the platform specific Thread implementation
286649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham    // would know how to match.  For now, this just calls through to the ThreadSpec's
287649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham    // ThreadPassesBasicTests method.
2883c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    virtual bool
2893c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    MatchesSpec (const ThreadSpec *spec);
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2916297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham    lldb::StopInfoSP
292643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    GetStopInfo ();
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    // This sets the stop reason to a "blank" stop reason, so you can call functions on the thread
29515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    // without having the called function run with whatever stop reason you stopped with.
29615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    void
29715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    SetStopInfoToNothing();
29815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadStoppedForAReason ();
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3027826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    static const char *
3037826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    RunModeAsCString (lldb::RunMode mode);
3047826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
3057826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    static const char *
3067826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    StopReasonAsCString (lldb::StopReason reason);
3077826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual const char *
30937f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    GetInfo ()
31037f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    {
31137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        return NULL;
31237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    }
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual const char *
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName ()
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual const char *
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetQueueName ()
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint32_t
327fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    GetStackFrameCount()
328fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    {
329fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        return GetStackFrameList().GetNumFrames();
330fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    }
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb::StackFrameSP
333fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    GetStackFrameAtIndex (uint32_t idx)
334fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    {
335fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        return GetStackFrameList().GetFrameAtIndex(idx);
336fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    }
33708d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton
33808d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    virtual lldb::StackFrameSP
33908d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    GetFrameWithConcreteFrameIndex (uint32_t unwind_idx);
3405c4b1607e8783a3d3f1f28fa66fcaa89ac246bd1Jim Ingham
3415c4b1607e8783a3d3f1f28fa66fcaa89ac246bd1Jim Ingham    virtual lldb::StackFrameSP
342b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    GetFrameWithStackID (const StackID &stack_id)
343fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    {
344fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        return GetStackFrameList().GetFrameWithStackID (stack_id);
345fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    }
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
347c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton    uint32_t
348fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    GetSelectedFrameIndex ()
349fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    {
350fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        return GetStackFrameList().GetSelectedFrameIndex();
351fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    }
352c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StackFrameSP
354fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    GetSelectedFrame ()
355fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    {
356fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        return GetStackFrameAtIndex (GetStackFrameList().GetSelectedFrameIndex());
357fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    }
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
360fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    SetSelectedFrame (lldb_private::StackFrame *frame)
361fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    {
362fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        return GetStackFrameList().SetSelectedFrame(frame);
363fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    }
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
366fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    SetSelectedFrameByIndex (uint32_t frame_idx)
367fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    {
368fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        GetStackFrameList().SetSelectedFrameByIndex(frame_idx);
369fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    }
370fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham
371fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    void
372fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    SetDefaultFileAndLineToSelectedFrame()
373fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    {
374fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham        GetStackFrameList().SetDefaultFileAndLineToSelectedFrame();
375fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    }
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37708d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    virtual lldb::RegisterContextSP
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetRegisterContext () = 0;
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38008d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    virtual lldb::RegisterContextSP
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CreateRegisterContextForFrame (StackFrame *frame) = 0;
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
384782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    ClearStackFrames ();
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
387a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    DumpUsingSettingsFormat (Stream &strm, uint32_t frame_idx);
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Thread Plan Providers:
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This section provides the basic thread plans that the Process control
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // machinery uses to run the target.  ThreadPlan.h provides more details on
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // how this mechanism works.
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The thread provides accessors to a set of plans that perform basic operations.
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The idea is that particular Platform plugins can override these methods to
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // provide the implementation of these basic operations appropriate to their
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // environment.
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queues the base plan for a thread.
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The version returned by Process does some things that are useful,
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// like handle breakpoints and signals, so if you return a plugin specific
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// one you probably want to call through to the Process one for anything
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// your plugin doesn't explicitly handle.
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the newly queued thread plan, or NULL if the plan could not be queued.
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueFundamentalPlan (bool abort_other_plans);
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queues the plan used to step over a breakpoint at the current PC of \a thread.
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The default version returned by Process handles trap based breakpoints, and
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// will disable the breakpoint, single step over it, then re-enable it.
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the newly queued thread plan, or NULL if the plan could not be queued.
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepOverBreakpointPlan (bool abort_other_plans);
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queues the plan used to step one instruction from the current PC of \a thread.
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] step_over
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we step over calls to functions, false if we step in.
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_other_threads
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we will stop other threads while we single step this one.
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the newly queued thread plan, or NULL if the plan could not be queued.
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepSingleInstruction (bool step_over,
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             bool abort_other_plans,
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             bool stop_other_threads);
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queues the plan used to step through an address range, stepping into or over
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// function calls depending on the value of StepType.
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] type
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Type of step to do, only eStepTypeInto and eStepTypeOver are supported by this plan.
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] range
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The address range to step through.
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] addr_context
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    When dealing with stepping through inlined functions the current PC is not enough information to know
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    what "step" means.  For instance a series of nested inline functions might start at the same address.
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //     The \a addr_context provides the current symbol context the step
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    is supposed to be out of.
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //   FIXME: Currently unused.
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_other_threads
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we will stop other threads while we single step this one.
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the newly queued thread plan, or NULL if the plan could not be queued.
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepRange (bool abort_other_plans,
482b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                 StepType type,
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 const AddressRange &range,
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 const SymbolContext &addr_context,
4858f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton                                 lldb::RunMode stop_other_threads,
4868f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton                                 bool avoid_code_without_debug_info);
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queue the plan used to step out of the function at the current PC of
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// \a thread.
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] addr_context
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    When dealing with stepping through inlined functions the current PC is not enough information to know
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    what "step" means.  For instance a series of nested inline functions might start at the same address.
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //     The \a addr_context provides the current symbol context the step
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    is supposed to be out of.
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //   FIXME: Currently unused.
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] first_insn
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b true if this is the first instruction of a function.
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_other_threads
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we will stop other threads while we single step this one.
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_vote
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] run_vote
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    See standard meanings for the stop & run votes in ThreadPlan.h.
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the newly queued thread plan, or NULL if the plan could not be queued.
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepOut (bool abort_other_plans,
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               SymbolContext *addr_context,
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               bool first_insn,
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               bool stop_other_threads,
521b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                               Vote stop_vote, // = eVoteYes,
522b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                               Vote run_vote, // = eVoteNoOpinion);
5231ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                               uint32_t frame_idx);
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the plan used to step through the code that steps from a function
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// call site at the current PC into the actual function call.
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_other_threads
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we will stop other threads while we single step this one.
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the newly queued thread plan, or NULL if the plan could not be queued.
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepThrough (bool abort_other_plans,
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   bool stop_other_threads);
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the plan used to continue from the current PC.
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// This is a simple plan, mostly useful as a backstop when you are continuing
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// for some particular purpose.
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] target_addr
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The address to which we're running.
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_other_threads
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we will stop other threads while we single step this one.
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the newly queued thread plan, or NULL if the plan could not be queued.
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForRunToAddress (bool abort_other_plans,
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    Address &target_addr,
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    bool stop_other_threads);
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepUntil (bool abort_other_plans,
5681ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                                 lldb::addr_t *address_list,
5691ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                                 size_t num_addresses,
5701ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                                 bool stop_others,
5711ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                                 uint32_t frame_idx);
57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ThreadPlan *
57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForCallFunction (bool abort_other_plans,
57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    Address& function,
57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    lldb::addr_t arg,
57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    bool stop_other_threads,
57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    bool discard_on_error = false);
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Thread Plan accessors:
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the plan which will execute next on the plan stack.
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the next executed plan.
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadPlan *
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCurrentPlan ();
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
593f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghamprivate:
594f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    bool
595f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    PlanIsBasePlan (ThreadPlan *plan_ptr)
596f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    {
597f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        if (m_plan_stack.size() == 0)
598f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham            return false;
599f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham        return m_plan_stack[0].get() == plan_ptr;
600f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    }
601f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghampublic:
602f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6041586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    /// Gets the outer-most plan that was popped off the plan stack in the
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// most recent stop.  Useful for printing the stop reason accurately.
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the last completed plan.
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::ThreadPlanSP
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCompletedPlan ();
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
6141586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    /// Gets the outer-most return value from the completed plans
6151586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    ///
6161586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    /// @return
6171586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    ///     A ValueObjectSP, either empty if there is no return value,
6181586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    ///     or containing the return value.
6191586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    //------------------------------------------------------------------
6201586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    lldb::ValueObjectSP
6211586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    GetReturnValueObject ();
6221586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
6231586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    //------------------------------------------------------------------
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///  Checks whether the given plan is in the completed plans for this
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///  stop.
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] plan
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Pointer to the plan you're checking.
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Returns true if the input plan is in the completed plan stack,
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     false otherwise.
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsThreadPlanDone (ThreadPlan *plan);
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///  Checks whether the given plan is in the discarded plans for this
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///  stop.
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] plan
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Pointer to the plan you're checking.
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Returns true if the input plan is in the discarded plan stack,
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     false otherwise.
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WasThreadPlanDiscarded (ThreadPlan *plan);
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queues a generic thread plan.
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] plan_sp
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The plan to queue.
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the last completed plan.
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlan (lldb::ThreadPlanSP &plan_sp, bool abort_other_plans);
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Discards the plans queued on the plan stack of the current thread.  This is
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// arbitrated by the "Master" ThreadPlans, using the "OkayToDiscard" call.
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //  But if \a force is true, all thread plans are discarded.
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DiscardThreadPlans (bool force);
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
677ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    /// Discards the plans queued on the plan stack of the current thread up to and
678ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    /// including up_to_plan_sp.
679ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    //
680ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    // @param[in] up_to_plan_sp
681ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    //   Discard all plans up to and including this one.
682ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    //------------------------------------------------------------------
683ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    void
684ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    DiscardThreadPlansUpToPlan (lldb::ThreadPlanSP &up_to_plan_sp);
685ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham
686ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    //------------------------------------------------------------------
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Prints the current plan stack.
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The stream to which to dump the plan stack info.
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpThreadPlans (Stream *s) const;
69520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
69615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    virtual bool
69715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    CheckpointThreadState (ThreadStateCheckpoint &saved_state);
69815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
69915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    virtual bool
70015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    RestoreThreadStateFromCheckpoint (ThreadStateCheckpoint &saved_state);
70115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
702745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    void
703745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    EnableTracer (bool value, bool single_step);
704745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
705745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    void
706745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    SetTracer (lldb::ThreadPlanTracerSP &tracer_sp);
707745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
70820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    //------------------------------------------------------------------
70920594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    /// The regular expression returned determines symbols that this
71020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    /// thread won't stop in during "step-in" operations.
71120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    ///
71220594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    /// @return
71320594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    ///    A pointer to a regular expression to compare against symbols,
71420594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    ///    or NULL if all symbols are allowed.
71520594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    ///
71620594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    //------------------------------------------------------------------
71720594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    RegularExpression *
71820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    GetSymbolsToAvoidRegexp()
71920594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    {
72020594b1b003f63ed34ebafeec37634ee44552339Jim Ingham        return ThreadInstanceSettings::GetSymbolsToAvoidRegexp();
72120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham    }
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Get the thread index ID. The index ID that is guaranteed to not be
72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // re-used by a process. They start at 1 and increase with each new thread.
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This allows easy command line access by a unique ID that is easier to
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // type than the actual system thread ID.
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetIndexID () const;
729cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // lldb::ExecutionContextScope pure virtual functions
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual Target *
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CalculateTarget ();
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual Process *
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CalculateProcess ();
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual Thread *
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CalculateThread ();
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual StackFrame *
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CalculateStackFrame ();
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
746a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    CalculateExecutionContext (ExecutionContext &exe_ctx);
747ccd584dccb920cdb028de69950774c3bcdc025ecJim Ingham
748ccd584dccb920cdb028de69950774c3bcdc025ecJim Ingham    lldb::StackFrameSP
749ccd584dccb920cdb028de69950774c3bcdc025ecJim Ingham    GetStackFrameSPForStackFramePtr (StackFrame *stack_frame_ptr);
750abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton
751abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    size_t
752abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    GetStatus (Stream &strm,
753abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton               uint32_t start_frame,
754abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton               uint32_t num_frames,
755abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton               uint32_t num_frames_with_source);
756abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton
757abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    size_t
758abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    GetStackFrameStatus (Stream& strm,
759abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton                         uint32_t first_frame,
760abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton                         uint32_t num_frames,
761abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton                         bool show_frame_info,
762abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton                         uint32_t num_frames_with_source,
763abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton                         uint32_t source_lines_before,
764abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton                         uint32_t source_lines_after);
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
76732f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton
76832f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton    friend class ThreadPlan;
76913d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    friend class ThreadList;
770782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    friend class StackFrameList;
771cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham
772cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham    // This is necessary to make sure thread assets get destroyed while the thread is still in good shape
773cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham    // to call virtual thread methods.  This must be called by classes that derive from Thread in their destructor.
774cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham    virtual void DestroyThread ();
77532f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PushPlan (lldb::ThreadPlanSP &plan_sp);
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PopPlan ();
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DiscardPlan ();
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadPlan *GetPreviousPlan (ThreadPlan *plan);
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    // When you implement this method, make sure you don't overwrite the m_actual_stop_info if it claims to be
78815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    // valid.  The stop info may be a "checkpointed and restored" stop info, so if it is still around it is right
78915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    // even if you have not calculated this yourself, or if it disagrees with what you might have calculated.
790643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    virtual lldb::StopInfoSP
791643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    GetPrivateStopReason () = 0;
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector<lldb::ThreadPlanSP> plan_stack;
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    void
79615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    SetStopInfo (const lldb::StopInfoSP &stop_info_sp);
79715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
79815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    virtual bool
799e426d855032b9b1962b98028b42e3a4e88975b03Peter Collingbourne    SaveFrameZeroState (RegisterCheckpoint &checkpoint);
80015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
80115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    virtual bool
802e426d855032b9b1962b98028b42e3a4e88975b03Peter Collingbourne    RestoreSaveFrameZero (const RegisterCheckpoint &checkpoint);
80315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
80471219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham    virtual lldb_private::Unwind *
80537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    GetUnwinder ();
80671219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham
807782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    StackFrameList &
808782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    GetStackFrameList ();
80915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
810149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham    lldb::StateType GetTemporaryResumeState()
811149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham    {
812149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham        return m_temporary_resume_state;
813149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham    }
814149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham
815149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham    lldb::StateType SetTemporaryResumeState(lldb::StateType resume_state)
816149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham    {
817149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham        lldb::StateType old_temp_resume_state = m_temporary_resume_state;
818149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham        m_temporary_resume_state = resume_state;
819149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham        return old_temp_resume_state;
820149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham    }
821149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham
82215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    struct ThreadState
8236297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham    {
82415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        uint32_t           orig_stop_id;
82515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        lldb::StopInfoSP   stop_info_sp;
82615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        RegisterCheckpoint register_backup;
82715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    };
8286297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Classes that inherit from Process can see and modify these
83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Process &           m_process;          ///< The process that owns this thread.
833643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    lldb::StopInfoSP    m_actual_stop_info_sp;     ///< The private stop reason for this thread
83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t      m_index_id;         ///< A unique 1 based index assigned to each thread for easy UI/command line access.
83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::RegisterContextSP   m_reg_context_sp;   ///< The register context for this thread's current register state.
83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StateType     m_state;            ///< The state of our process.
837782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    mutable Mutex       m_state_mutex;      ///< Multithreaded protection for m_state.
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    plan_stack          m_plan_stack;       ///< The stack of plans this thread is executing.
83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    plan_stack          m_completed_plan_stack;  ///< Plans that have been completed by this stop.  They get deleted when the thread resumes.
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    plan_stack          m_discarded_plan_stack;  ///< Plans that have been discarded by this stop.  They get deleted when the thread resumes.
841c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    lldb::StackFrameListSP m_curr_frames_sp; ///< The stack frames that get lazily populated after a thread stops.
8425205f0b6585a127acc6ed210021abb6091220a89Greg Clayton    lldb::StackFrameListSP m_prev_frames_sp; ///< The previous stack frames from the last time this thread stopped.
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int                 m_resume_signal;    ///< The signal that should be used when continuing this thread.
844149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham    lldb::StateType     m_resume_state;     ///< This state is used to force a thread to be suspended from outside the ThreadPlan logic.
845149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham    lldb::StateType     m_temporary_resume_state; ///< This state records what the thread was told to do by the thread plan logic for the current resume.
846149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim Ingham                                                  /// It gets set in Thread::WillResume.
84771219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham    std::auto_ptr<lldb_private::Unwind> m_unwinder_ap;
848cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham    bool                m_destroy_called;    // This is used internally to make sure derived Thread classes call DestroyThread.
84915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    uint32_t m_thread_stop_reason_stop_id;   // This is the stop id for which the StopInfo is valid.  Can use this so you know that
85015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham                                             // the thread's m_actual_stop_info_sp is current and you don't have to fetch it again
85115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // For Thread only
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
85615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (Thread);
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Thread_h_
864