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"
1594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham#include "lldb/Core/Broadcaster.h"
1694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham#include "lldb/Core/Event.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UserID.h"
1820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham#include "lldb/Core/UserSettingsController.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ExecutionContextScope.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrameList.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define LLDB_THREAD_MAX_STOP_EXC_DATA 8
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Inghamclass ThreadProperties : public Properties
27ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham{
28ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Inghampublic:
29ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    ThreadProperties(bool is_global);
30745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
31ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    virtual
32ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    ~ThreadProperties();
33ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham
34ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    //------------------------------------------------------------------
35ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    /// The regular expression returned determines symbols that this
36ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    /// thread won't stop in during "step-in" operations.
37ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    ///
38ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    /// @return
39ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    ///    A pointer to a regular expression to compare against symbols,
40ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    ///    or NULL if all symbols are allowed.
41ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    ///
42ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    //------------------------------------------------------------------
43ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    const RegularExpression *
44ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    GetSymbolsToAvoidRegexp();
45ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham
46ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    bool
47ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham    GetTraceEnabledState() const;
48ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham};
49ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Ingham
50102b2c2681c9a830afe25bfea35557421905e42cGreg Claytontypedef std::shared_ptr<ThreadProperties> ThreadPropertiesSP;
5120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
52ee5bba0f13cac9134ab8f7d23c387891b90e14b3Jim Inghamclass Thread :
53102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    public std::enable_shared_from_this<Thread>,
5473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    public ThreadProperties,
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public UserID,
5694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    public ExecutionContextScope,
5794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    public Broadcaster
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
6094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    //------------------------------------------------------------------
6194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    /// Broadcaster event bits definitions.
6294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    //------------------------------------------------------------------
6394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    enum
6494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    {
6594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        eBroadcastBitStackChanged           = (1 << 0),
6694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        eBroadcastBitThreadSuspended        = (1 << 1),
6794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        eBroadcastBitThreadResumed          = (1 << 2),
682e2812388b75d3c62c9518cc1a6550ce29325aa6Jim Ingham        eBroadcastBitSelectedFrameChanged   = (1 << 3),
692e2812388b75d3c62c9518cc1a6550ce29325aa6Jim Ingham        eBroadcastBitThreadSelected         = (1 << 4)
7094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    };
7194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
7294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    static ConstString &GetStaticBroadcasterClass ();
7394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
7494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    virtual ConstString &GetBroadcasterClass() const
7594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    {
7694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        return GetStaticBroadcasterClass();
7794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    }
7894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
7994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    class ThreadEventData :
8094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        public EventData
8194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    {
8294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    public:
8394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        ThreadEventData (const lldb::ThreadSP thread_sp);
8494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
8594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        ThreadEventData (const lldb::ThreadSP thread_sp, const StackID &stack_id);
8694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
8794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        ThreadEventData();
8894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
8994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        virtual ~ThreadEventData();
9094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
9194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        static const ConstString &
9294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        GetFlavorString ();
9394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
9494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        virtual const ConstString &
9594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        GetFlavor () const
9694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        {
9794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham            return ThreadEventData::GetFlavorString ();
9894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        }
9994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
10094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        virtual void
10194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        Dump (Stream *s) const;
10294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
10394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        static const ThreadEventData *
10494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        GetEventDataFromEvent (const Event *event_ptr);
10594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
10694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        static lldb::ThreadSP
10794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        GetThreadFromEvent (const Event *event_ptr);
10894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
10994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        static StackID
11094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        GetStackIDFromEvent (const Event *event_ptr);
11194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
11294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        static lldb::StackFrameSP
11394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        GetStackFrameFromEvent (const Event *event_ptr);
11494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
11594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        lldb::ThreadSP
11694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        GetThread () const
11794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        {
11894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham            return m_thread_sp;
11994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        }
12094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
12194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        StackID
12294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        GetStackID () const
12394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        {
12494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham            return m_stack_id;
12594a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        }
12694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
12794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    private:
12894a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        lldb::ThreadSP m_thread_sp;
12994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham        StackID        m_stack_id;
13094a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    DISALLOW_COPY_AND_ASSIGN (ThreadEventData);
13194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    };
13294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
13394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    // TODO: You shouldn't just checkpoint the register state alone, so this should get
13415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    // moved to protected.  To do that ThreadStateCheckpoint needs to be returned as a token...
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class RegisterCheckpoint
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public:
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        RegisterCheckpoint() :
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_stack_id (),
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_data_sp ()
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        RegisterCheckpoint (const StackID &stack_id) :
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_stack_id (stack_id),
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_data_sp ()
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ~RegisterCheckpoint()
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        const RegisterCheckpoint&
15615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        operator= (const RegisterCheckpoint &rhs)
15715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        {
15815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham            if (this != &rhs)
15915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham            {
16015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham                this->m_stack_id = rhs.m_stack_id;
16115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham                this->m_data_sp  = rhs.m_data_sp;
16215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham            }
16315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham            return *this;
16415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        }
16515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
16615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        RegisterCheckpoint (const RegisterCheckpoint &rhs) :
16715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham            m_stack_id (rhs.m_stack_id),
16815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham            m_data_sp (rhs.m_data_sp)
16915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        {
17015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        }
17115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const StackID &
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetStackID()
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_stack_id;
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SetStackID (const StackID &stack_id)
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_stack_id = stack_id;
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::DataBufferSP &
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetData()
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_data_sp;
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const lldb::DataBufferSP &
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetData() const
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_data_sp;
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    protected:
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        StackID m_stack_id;
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::DataBufferSP m_data_sp;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20115dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    struct ThreadStateCheckpoint
20215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    {
20315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        uint32_t           orig_stop_id;  // Dunno if I need this yet but it is an interesting bit of data.
20415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        lldb::StopInfoSP   stop_info_sp;  // You have to restore the stop info or you might continue with the wrong signals.
20515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        RegisterCheckpoint register_backup;  // You need to restore the registers, of course...
20636de3c01c2f3ceac59b8e34b47c17fac200e27a1Jim Ingham        uint32_t           current_inlined_depth;
20736de3c01c2f3ceac59b8e34b47c17fac200e27a1Jim Ingham        lldb::addr_t       current_inlined_pc;
20815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    };
20915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
210990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    static void
2112a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    SettingsInitialize ();
212990de7bb41d3afec6b789155408ff322187d8682Greg Clayton
213990de7bb41d3afec6b789155408ff322187d8682Greg Clayton    static void
2142a456816c5d7c575f2e141acd48bb5f8085d9910Caroline Tice    SettingsTerminate ();
215990de7bb41d3afec6b789155408ff322187d8682Greg Clayton
21673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    static const ThreadPropertiesSP &
21773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    GetGlobalProperties();
21820594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
21994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    Thread (Process &process, lldb::tid_t tid);
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual ~Thread();
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
222f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    lldb::ProcessSP
223f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    GetProcess() const
22437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    {
225f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        return m_process_wp.lock();
22637f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    }
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int
229123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    GetResumeSignal () const
230123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    {
231123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton        return m_resume_signal;
232123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    }
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
235123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    SetResumeSignal (int signal)
236123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    {
237123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton        m_resume_signal = signal;
238123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    }
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StateType
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetState() const;
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetState (lldb::StateType state);
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StateType
247123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    GetResumeState () const
248123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    {
249123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton        return m_resume_state;
250123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    }
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
253123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    SetResumeState (lldb::StateType state)
254123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    {
255123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton        m_resume_state = state;
256123db408a6bc06614ec893040aaad84d8d0d16f9Greg Clayton    }
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
258a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // This function is called on all the threads before "ShouldResume" and
259a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // "WillResume" in case a thread needs to change its state before the
260a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // ThreadList polls all the threads to figure out which ones actually
261a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // will get to run and how.
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetupForResume ();
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
265a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // Do not override this function, it is for thread plan logic only
266a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    bool
267a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    ShouldResume (lldb::StateType resume_state);
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
269a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // Override this to do platform specific tasks before resume.
270a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    virtual void
271a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    WillResume (lldb::StateType resume_state)
272a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    {
273a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    }
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This clears generic thread state after a resume.  If you subclass this,
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // be sure to call it.
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DidResume ();
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2801f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor    // This notifies the thread when a private stop occurs.
2811f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor    virtual void
2821f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor    DidStop ();
2831f85fa8c8611a175819009dd83e724b6788a6587Andrew Kaylor
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RefreshStateAfterStop() = 0;
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WillStop ();
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ShouldStop (Event *event_ptr);
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
293b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    Vote
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ShouldReportStop (Event *event_ptr);
2957c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham
296b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    Vote
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ShouldReportRun (Event *event_ptr);
2983c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham
299cf5927ee246f5e431162f2753ed9e040dd060fe5Greg Clayton    void
300cf5927ee246f5e431162f2753ed9e040dd060fe5Greg Clayton    Flush ();
301cf5927ee246f5e431162f2753ed9e040dd060fe5Greg Clayton
302649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham    // Return whether this thread matches the specification in ThreadSpec.  This is a virtual
303649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham    // method because at some point we may extend the thread spec with a platform specific
304649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham    // dictionary of attributes, which then only the platform specific Thread implementation
305649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham    // would know how to match.  For now, this just calls through to the ThreadSpec's
306649492b3614c11e52a2dbe3693bbdf97efec9ba0Jim Ingham    // ThreadPassesBasicTests method.
3073c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    virtual bool
3083c7b5b9f83cae58ca366db2bba37dc09485f7dccJim Ingham    MatchesSpec (const ThreadSpec *spec);
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3106297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham    lldb::StopInfoSP
311643ee7301b5d4b05c321d906bc0d7ff11f571295Greg Clayton    GetStopInfo ();
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3133acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    lldb::StopReason
3143acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    GetStopReason();
3153acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton
31615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    // This sets the stop reason to a "blank" stop reason, so you can call functions on the thread
31715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    // without having the called function run with whatever stop reason you stopped with.
31815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    void
31915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    SetStopInfoToNothing();
32015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadStoppedForAReason ();
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3247826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    static const char *
3257826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    RunModeAsCString (lldb::RunMode mode);
3267826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
3277826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    static const char *
3287826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    StopReasonAsCString (lldb::StopReason reason);
3297826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual const char *
33137f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    GetInfo ()
33237f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    {
33337f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton        return NULL;
33437f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    }
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual const char *
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetName ()
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual const char *
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetQueueName ()
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return NULL;
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint32_t
349fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    GetStackFrameCount()
350fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    {
3512450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton        return GetStackFrameList()->GetNumFrames();
352fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    }
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb::StackFrameSP
355fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    GetStackFrameAtIndex (uint32_t idx)
356fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    {
3572450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton        return GetStackFrameList()->GetFrameAtIndex(idx);
358fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    }
35908d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton
36008d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    virtual lldb::StackFrameSP
36108d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    GetFrameWithConcreteFrameIndex (uint32_t unwind_idx);
3625c4b1607e8783a3d3f1f28fa66fcaa89ac246bd1Jim Ingham
3630c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    bool
3640c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    DecrementCurrentInlinedDepth()
3650c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    {
3660c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham        return GetStackFrameList()->DecrementCurrentInlinedDepth();
3670c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    }
3680c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham
3690c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    uint32_t
3700c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    GetCurrentInlinedDepth()
3710c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    {
37236de3c01c2f3ceac59b8e34b47c17fac200e27a1Jim Ingham        return GetStackFrameList()->GetCurrentInlinedDepth();
3730c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    }
3740c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham
375a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    Error
37694a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    ReturnFromFrameWithIndex (uint32_t frame_idx, lldb::ValueObjectSP return_value_sp, bool broadcast = false);
377a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham
378a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    Error
37994a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    ReturnFromFrame (lldb::StackFrameSP frame_sp, lldb::ValueObjectSP return_value_sp, bool broadcast = false);
380a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham
3815c4b1607e8783a3d3f1f28fa66fcaa89ac246bd1Jim Ingham    virtual lldb::StackFrameSP
382b4d7fc0c466d446876e5f2d701f0e574dd0be8e7Greg Clayton    GetFrameWithStackID (const StackID &stack_id)
383fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    {
384d1ddde0c443e67b37f9303b5bdff19aad9f54fdcGreg Clayton        if (stack_id.IsValid())
385d1ddde0c443e67b37f9303b5bdff19aad9f54fdcGreg Clayton            return GetStackFrameList()->GetFrameWithStackID (stack_id);
386d1ddde0c443e67b37f9303b5bdff19aad9f54fdcGreg Clayton        return lldb::StackFrameSP();
387fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    }
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
389c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton    uint32_t
390fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    GetSelectedFrameIndex ()
391fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    {
3922450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton        return GetStackFrameList()->GetSelectedFrameIndex();
393fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    }
394c12b6b40b93687539b0ca303f64eb77b6af6924dGreg Clayton
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::StackFrameSP
396fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    GetSelectedFrame ()
397fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    {
3982450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton        lldb::StackFrameListSP stack_frame_list_sp(GetStackFrameList());
3992450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton        return stack_frame_list_sp->GetFrameAtIndex (stack_frame_list_sp->GetSelectedFrameIndex());
400fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    }
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
40394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    SetSelectedFrame (lldb_private::StackFrame *frame, bool broadcast = false);
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
405be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham
406bf97d74c0c3e9a0f7c89fe0cd4a059015ec482d5Jim Ingham    bool
40794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    SetSelectedFrameByIndex (uint32_t frame_idx, bool broadcast = false);
408fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham
409be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham    bool
410be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham    SetSelectedFrameByIndexNoisily (uint32_t frame_idx, Stream &output_stream);
411be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham
412fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    void
413fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    SetDefaultFileAndLineToSelectedFrame()
414fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    {
4152450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton        GetStackFrameList()->SetDefaultFileAndLineToSelectedFrame();
416fdf24efe672bf3fa041cdbebd2d7f406b11882bdJim Ingham    }
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41808d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    virtual lldb::RegisterContextSP
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetRegisterContext () = 0;
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42108d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton    virtual lldb::RegisterContextSP
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CreateRegisterContextForFrame (StackFrame *frame) = 0;
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
425782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    ClearStackFrames ();
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4279acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton    virtual bool
4289acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton    SetBackingThread (const lldb::ThreadSP &thread_sp)
4299acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton    {
4309acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton        return false;
4319acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton    }
4325042acfb254338f60ef8bc3a8715e229795d941fGreg Clayton
4335042acfb254338f60ef8bc3a8715e229795d941fGreg Clayton    virtual lldb::ThreadSP
4345042acfb254338f60ef8bc3a8715e229795d941fGreg Clayton    GetBackingThread () const
4355042acfb254338f60ef8bc3a8715e229795d941fGreg Clayton    {
4365042acfb254338f60ef8bc3a8715e229795d941fGreg Clayton        return lldb::ThreadSP();
4375042acfb254338f60ef8bc3a8715e229795d941fGreg Clayton    }
4389acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton
4399acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton    virtual void
4409acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton    ClearBackingThread ()
4419acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton    {
4429acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton        // Subclasses can use this function if a thread is actually backed by
4439acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton        // another thread. This is currently used for the OperatingSystem plug-ins
4449acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton        // where they might have a thread that is in memory, yet its registers
4459acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton        // are available through the lldb_private::Thread subclass for the current
4469acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton        // lldb_private::Process class. Since each time the process stops the backing
4479acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton        // threads for memory threads can change, we need a way to clear the backing
4489acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton        // thread for all memory threads each time we stop.
4499acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton    }
4509acf3699d2bea583b45c762f4cd82b2a4af6131bGreg Clayton
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
452a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    DumpUsingSettingsFormat (Stream &strm, uint32_t frame_idx);
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Thread Plan Providers:
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This section provides the basic thread plans that the Process control
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // machinery uses to run the target.  ThreadPlan.h provides more details on
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // how this mechanism works.
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The thread provides accessors to a set of plans that perform basic operations.
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // The idea is that particular Platform plugins can override these methods to
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // provide the implementation of these basic operations appropriate to their
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // environment.
463008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    //
464008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    // NB: All the QueueThreadPlanXXX providers return Shared Pointers to
465008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    // Thread plans.  This is useful so that you can modify the plans after
466008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    // creation in ways specific to that plan type.  Also, it is often necessary for
467008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    // ThreadPlans that utilize other ThreadPlans to implement their task to keep a shared
468008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    // pointer to the sub-plan.
469008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    // But besides that, the shared pointers should only be held onto by entities who live no longer
470008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    // than the thread containing the ThreadPlan.
471008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    // FIXME: If this becomes a problem, we can make a version that just returns a pointer,
472008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    // which it is clearly unsafe to hold onto, and a shared pointer version, and only allow
473008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    // ThreadPlan and Co. to use the latter.  That is made more annoying to do because there's
474008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    // no elegant way to friend a method to all sub-classes of a given class.
475008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    //
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queues the base plan for a thread.
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The version returned by Process does some things that are useful,
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// like handle breakpoints and signals, so if you return a plugin specific
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// one you probably want to call through to the Process one for anything
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// your plugin doesn't explicitly handle.
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
490008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
492008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    virtual lldb::ThreadPlanSP
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueFundamentalPlan (bool abort_other_plans);
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queues the plan used to step over a breakpoint at the current PC of \a thread.
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// The default version returned by Process handles trap based breakpoints, and
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// will disable the breakpoint, single step over it, then re-enable it.
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
505008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
507008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    virtual lldb::ThreadPlanSP
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepOverBreakpointPlan (bool abort_other_plans);
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queues the plan used to step one instruction from the current PC of \a thread.
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] step_over
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we step over calls to functions, false if we step in.
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_other_threads
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we will stop other threads while we single step this one.
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
524008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
526008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    virtual lldb::ThreadPlanSP
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepSingleInstruction (bool step_over,
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             bool abort_other_plans,
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             bool stop_other_threads);
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
532f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    /// Queues the plan used to step through an address range, stepping  over
533f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    /// function calls.
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] type
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Type of step to do, only eStepTypeInto and eStepTypeOver are supported by this plan.
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] range
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The address range to step through.
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] addr_context
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    When dealing with stepping through inlined functions the current PC is not enough information to know
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    what "step" means.  For instance a series of nested inline functions might start at the same address.
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //     The \a addr_context provides the current symbol context the step
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    is supposed to be out of.
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //   FIXME: Currently unused.
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_other_threads
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we will stop other threads while we single step this one.
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
556008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
558008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    virtual lldb::ThreadPlanSP
559f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    QueueThreadPlanForStepOverRange (bool abort_other_plans,
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 const AddressRange &range,
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                 const SymbolContext &addr_context,
562f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham                                 lldb::RunMode stop_other_threads);
563f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham
564f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    //------------------------------------------------------------------
565f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    /// Queues the plan used to step through an address range, stepping into functions.
566f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///
567f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    /// @param[in] abort_other_plans
568f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///    \b true if we discard the currently queued plans and replace them with this one.
569f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///    Otherwise this plan will go on the end of the plan stack.
570f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///
571f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    /// @param[in] type
572f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///    Type of step to do, only eStepTypeInto and eStepTypeOver are supported by this plan.
573f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///
574f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    /// @param[in] range
575f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///    The address range to step through.
576f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///
577f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    /// @param[in] addr_context
578f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///    When dealing with stepping through inlined functions the current PC is not enough information to know
579f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///    what "step" means.  For instance a series of nested inline functions might start at the same address.
580f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    //     The \a addr_context provides the current symbol context the step
581f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///    is supposed to be out of.
582f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    //   FIXME: Currently unused.
583f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///
584f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    /// @param[in] step_in_target
585f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///    Name if function we are trying to step into.  We will step out if we don't land in that function.
586f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///
587f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    /// @param[in] stop_other_threads
588f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///    \b true if we will stop other threads while we single step this one.
589f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///
590f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    /// @param[in] avoid_code_without_debug_info
591f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///    If \b true we will step out if we step into code with no debug info.
592f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    ///
593f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    /// @return
594008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
595f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    //------------------------------------------------------------------
596008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    virtual lldb::ThreadPlanSP
597f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham    QueueThreadPlanForStepInRange (bool abort_other_plans,
598f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham                                 const AddressRange &range,
599f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham                                 const SymbolContext &addr_context,
600f2ca573e8dc034ecc5050a874d8f01ace0703e18Jim Ingham                                 const char *step_in_target,
6018f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton                                 lldb::RunMode stop_other_threads,
6028f5fd6b999b0c9b7398870ccc3ed438d7a6a0830Greg Clayton                                 bool avoid_code_without_debug_info);
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queue the plan used to step out of the function at the current PC of
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// \a thread.
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] addr_context
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    When dealing with stepping through inlined functions the current PC is not enough information to know
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    what "step" means.  For instance a series of nested inline functions might start at the same address.
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //     The \a addr_context provides the current symbol context the step
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    is supposed to be out of.
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //   FIXME: Currently unused.
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] first_insn
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \b true if this is the first instruction of a function.
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_other_threads
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we will stop other threads while we single step this one.
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_vote
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] run_vote
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    See standard meanings for the stop & run votes in ThreadPlan.h.
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
630008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
632008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    virtual lldb::ThreadPlanSP
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepOut (bool abort_other_plans,
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               SymbolContext *addr_context,
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               bool first_insn,
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                               bool stop_other_threads,
637b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                               Vote stop_vote, // = eVoteYes,
638b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                               Vote run_vote, // = eVoteNoOpinion);
6391ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                               uint32_t frame_idx);
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the plan used to step through the code that steps from a function
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// call site at the current PC into the actual function call.
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
645038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham    ///
646038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham    /// @param[in] return_stack_id
647038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham    ///    The stack id that we will return to (by setting backstop breakpoints on the return
648038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham    ///    address to that frame) if we fail to step through.
649038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham    ///
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_other_threads
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we will stop other threads while we single step this one.
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
658008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
660008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    virtual lldb::ThreadPlanSP
661038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham    QueueThreadPlanForStepThrough (StackID &return_stack_id,
662038fa8e30621e0e55faed3479387d811986f28b7Jim Ingham                                   bool abort_other_plans,
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   bool stop_other_threads);
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the plan used to continue from the current PC.
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// This is a simple plan, mostly useful as a backstop when you are continuing
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// for some particular purpose.
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] target_addr
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The address to which we're running.
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] stop_other_threads
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we will stop other threads while we single step this one.
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
681008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
683008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    virtual lldb::ThreadPlanSP
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForRunToAddress (bool abort_other_plans,
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    Address &target_addr,
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    bool stop_other_threads);
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
688008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    virtual lldb::ThreadPlanSP
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForStepUntil (bool abort_other_plans,
6901ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                                 lldb::addr_t *address_list,
6911ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                                 size_t num_addresses,
6921ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                                 bool stop_others,
6931ebdcc7789aac1ef30ad6dcd485dff86c63136adGreg Clayton                                 uint32_t frame_idx);
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
695008f3dc79c762b7d240b5ad6d4fb148c5cb039caJim Ingham    virtual lldb::ThreadPlanSP
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlanForCallFunction (bool abort_other_plans,
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    Address& function,
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    lldb::addr_t arg,
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    bool stop_other_threads,
700b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham                                    bool unwind_on_error = false,
701b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham                                    bool ignore_breakpoints = true);
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Thread Plan accessors:
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Gets the plan which will execute next on the plan stack.
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the next executed plan.
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadPlan *
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCurrentPlan ();
715be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham
716be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham    //------------------------------------------------------------------
717be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham    /// Unwinds the thread stack for the innermost expression plan currently
718be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham    /// on the thread plan stack.
719be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham    ///
720be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham    /// @return
721be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham    ///     An error if the thread plan could not be unwound.
722be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham    //------------------------------------------------------------------
723be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham
724be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham    Error
725be51f8a81ecf1f50b2843b7b3ecb8cfbc54d9787Jim Ingham    UnwindInnermostExpression();
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
727f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghamprivate:
728f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham    bool
7292bcbaf625afd8f521da03ddaa146e7ea7650ee38Jim Ingham    PlanIsBasePlan (ThreadPlan *plan_ptr);
7302bcbaf625afd8f521da03ddaa146e7ea7650ee38Jim Ingham
73194a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    void
73294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham    BroadcastSelectedFrameChange(StackID &new_frame_id);
73394a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham
734f9f40c20b210eea72ab042c63178ca000f005ed9Jim Inghampublic:
735f9f40c20b210eea72ab042c63178ca000f005ed9Jim Ingham
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7371586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    /// Gets the outer-most plan that was popped off the plan stack in the
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// most recent stop.  Useful for printing the stop reason accurately.
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the last completed plan.
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::ThreadPlanSP
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetCompletedPlan ();
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7471586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    /// Gets the outer-most return value from the completed plans
7481586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    ///
7491586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    /// @return
7501586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    ///     A ValueObjectSP, either empty if there is no return value,
7511586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    ///     or containing the return value.
7521586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    //------------------------------------------------------------------
7531586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    lldb::ValueObjectSP
7541586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    GetReturnValueObject ();
7551586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham
7561586d9720002e407a3a097baf302de5fa4ca9c1bJim Ingham    //------------------------------------------------------------------
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///  Checks whether the given plan is in the completed plans for this
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///  stop.
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] plan
76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Pointer to the plan you're checking.
76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Returns true if the input plan is in the completed plan stack,
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     false otherwise.
76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsThreadPlanDone (ThreadPlan *plan);
76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///  Checks whether the given plan is in the discarded plans for this
77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///  stop.
77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] plan
77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Pointer to the plan you're checking.
77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     Returns true if the input plan is in the discarded plan stack,
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     false otherwise.
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    WasThreadPlanDiscarded (ThreadPlan *plan);
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Queues a generic thread plan.
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] plan_sp
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The plan to queue.
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] abort_other_plans
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    \b true if we discard the currently queued plans and replace them with this one.
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    Otherwise this plan will go on the end of the plan stack.
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     A pointer to the last completed plan.
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    QueueThreadPlan (lldb::ThreadPlanSP &plan_sp, bool abort_other_plans);
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Discards the plans queued on the plan stack of the current thread.  This is
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// arbitrated by the "Master" ThreadPlans, using the "OkayToDiscard" call.
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //  But if \a force is true, all thread plans are discarded.
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DiscardThreadPlans (bool force);
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
810ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    /// Discards the plans queued on the plan stack of the current thread up to and
811ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    /// including up_to_plan_sp.
812ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    //
813ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    // @param[in] up_to_plan_sp
814ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    //   Discard all plans up to and including this one.
815ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    //------------------------------------------------------------------
816ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    void
817ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    DiscardThreadPlansUpToPlan (lldb::ThreadPlanSP &up_to_plan_sp);
818ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham
81988e3de205708f14431559072ca258899b5ac31ccJim Ingham    void
82088e3de205708f14431559072ca258899b5ac31ccJim Ingham    DiscardThreadPlansUpToPlan (ThreadPlan *up_to_plan_ptr);
82188e3de205708f14431559072ca258899b5ac31ccJim Ingham
822ea9d4267a629a1c732eb0400fa0288cee31ad49dJim Ingham    //------------------------------------------------------------------
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Prints the current plan stack.
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] s
82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The stream to which to dump the plan stack info.
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DumpThreadPlans (Stream *s) const;
83120594b1b003f63ed34ebafeec37634ee44552339Jim Ingham
83215dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    virtual bool
83315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    CheckpointThreadState (ThreadStateCheckpoint &saved_state);
83415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
83515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    virtual bool
83676b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham    RestoreRegisterStateFromCheckpoint (ThreadStateCheckpoint &saved_state);
83776b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham
83876b258db0611dad2f5b5ae51721a4bc0abd580aeJim Ingham    virtual bool
83915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    RestoreThreadStateFromCheckpoint (ThreadStateCheckpoint &saved_state);
84015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
841745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    void
842745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    EnableTracer (bool value, bool single_step);
843745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
844745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    void
845745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham    SetTracer (lldb::ThreadPlanTracerSP &tracer_sp);
846745ac7a5826fe7c392007941a4046bfb1a8dff81Jim Ingham
847a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    //------------------------------------------------------------------
848a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // Get the thread index ID. The index ID that is guaranteed to not
849a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // be re-used by a process. They start at 1 and increase with each
850a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // new thread. This allows easy command line access by a unique ID
851a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // that is easier to type than the actual system thread ID.
852a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    //------------------------------------------------------------------
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetIndexID () const;
855cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham
856a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton
857a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    //------------------------------------------------------------------
858a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // The API ID is often the same as the Thread::GetID(), but not in
859a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // all cases. Thread::GetID() is the user visible thread ID that
860a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // clients would want to see. The API thread ID is the thread ID
861a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // that is used when sending data to/from the debugging protocol.
862a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    //------------------------------------------------------------------
863a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    virtual lldb::user_id_t
864a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    GetProtocolID () const
865a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    {
866863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton        return GetID();
867a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    }
868a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // lldb::ExecutionContextScope pure virtual functions
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
872289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton    virtual lldb::TargetSP
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CalculateTarget ();
874289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton
875289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton    virtual lldb::ProcessSP
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CalculateProcess ();
877289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton
878289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton    virtual lldb::ThreadSP
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CalculateThread ();
880289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton
881289afcb5e26c2527a0d2e71f84e780b86bbcf90aGreg Clayton    virtual lldb::StackFrameSP
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CalculateStackFrame ();
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
885a830adbcd63d1995a01e6e18da79893c1426ca43Greg Clayton    CalculateExecutionContext (ExecutionContext &exe_ctx);
886ccd584dccb920cdb028de69950774c3bcdc025ecJim Ingham
887ccd584dccb920cdb028de69950774c3bcdc025ecJim Ingham    lldb::StackFrameSP
888ccd584dccb920cdb028de69950774c3bcdc025ecJim Ingham    GetStackFrameSPForStackFramePtr (StackFrame *stack_frame_ptr);
889abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton
890abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    size_t
891abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    GetStatus (Stream &strm,
892abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton               uint32_t start_frame,
893abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton               uint32_t num_frames,
894abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton               uint32_t num_frames_with_source);
895abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton
896abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    size_t
897abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton    GetStackFrameStatus (Stream& strm,
898abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton                         uint32_t first_frame,
899abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton                         uint32_t num_frames,
900abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton                         bool show_frame_info,
901a7d3dc75ec4f46033c3f991f11fb58a058091a85Greg Clayton                         uint32_t num_frames_with_source);
90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9033feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton    // We need a way to verify that even though we have a thread in a shared
9043feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton    // pointer that the object itself is still valid. Currently this won't be
9053feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton    // the case if DestroyThread() was called. DestroyThread is called when
9063feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton    // a thread has been removed from the Process' thread list.
9073feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton    bool
9083feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton    IsValid () const
9093feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton    {
910d0bdddff8bc6dd5f71492452ce2bbd72fdaa147bJim Ingham        return !m_destroy_called;
9113feafabba22e8b7110d556cb1c8690461e391fdbGreg Clayton    }
91206b84494c72ceb559ca07ff5e2ccd2fe645b6363Jim Ingham
913375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea    // Sets and returns a valid stop info based on the process stop ID and the
914375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea    // current thread plan. If the thread stop ID does not match the process'
915375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea    // stop ID, the private stop reason is not set and an invalid StopInfoSP may
916375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea    // be returned.
917375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea    //
918375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea    // NOTE: This function must be called before the current thread plan is
919375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea    // moved to the completed plan stack (in Thread::ShouldStop()).
920375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea    //
921375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea    // NOTE: If subclasses override this function, ensure they do not overwrite
922375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea    // the m_actual_stop_info if it is valid.  The stop info may be a
923375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea    // "checkpointed and restored" stop info, so if it is still around it is
924375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea    // right even if you have not calculated this yourself, or if it disagrees
925375ba883a11c84b7eb27f6f04751aea878e3e9b0Daniel Malea    // with what you might have calculated.
92606b84494c72ceb559ca07ff5e2ccd2fe645b6363Jim Ingham    virtual lldb::StopInfoSP
927863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    GetPrivateStopInfo ();
928863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton
929863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    //----------------------------------------------------------------------
930863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    // Ask the thread subclass to set its stop info.
931863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    //
932863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    // Thread subclasses should call Thread::SetStopInfo(...) with the
933863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    // reason the thread stopped.
934863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    //
935863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    // @return
936863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    //      True if Thread::SetStopInfo(...) was called, false otherwise.
937863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    //----------------------------------------------------------------------
938863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    virtual bool
939863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    CalculateStopInfo () = 0;
94006b84494c72ceb559ca07ff5e2ccd2fe645b6363Jim Ingham
9413acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    //----------------------------------------------------------------------
9423acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    // Gets the temporary resume state for a thread.
9433acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    //
9443acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    // This value gets set in each thread by complex debugger logic in
945a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // Thread::ShouldResume() and an appropriate thread resume state will get
9463acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    // set in each thread every time the process is resumed prior to calling
9473acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    // Process::DoResume(). The lldb_private::Process subclass should adhere
9483acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    // to the thread resume state request which will be one of:
9493acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    //
9503acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    //  eStateRunning   - thread will resume when process is resumed
9513acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    //  eStateStepping  - thread should step 1 instruction and stop when process
9523acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    //                    is resumed
9533acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    //  eStateSuspended - thread should not execute any instructions when
9543acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    //                    process is resumed
9553acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    //----------------------------------------------------------------------
9563acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    lldb::StateType
9573acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    GetTemporaryResumeState() const
9583acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    {
9593acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton        return m_temporary_resume_state;
9603acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton    }
9613acaa926c8f0d32da48db61a5fcb95276e6a4006Greg Clayton
962a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    void
963a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    SetStopInfo (const lldb::StopInfoSP &stop_info_sp);
964a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton
9657c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    void
9667c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    SetShouldReportStop (Vote vote);
9677c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham
96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
96932f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton
97032f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton    friend class ThreadPlan;
97113d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    friend class ThreadList;
97281f4b8953db5db67bec754dc895a5a83c96c84fbAndy Gibbs    friend class ThreadEventData;
973782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    friend class StackFrameList;
9740c8fa2d7dd18ae1816c82846234c45f79142e3dfJim Ingham    friend class StackFrame;
975a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    friend class OperatingSystem;
976cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham
977cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham    // This is necessary to make sure thread assets get destroyed while the thread is still in good shape
978cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham    // to call virtual thread methods.  This must be called by classes that derive from Thread in their destructor.
979cdea2365030d283cd9082fa0b80bead79a104e55Jim Ingham    virtual void DestroyThread ();
98032f4fdde0882395aec2ea56d1adcce78759105b7Greg Clayton
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PushPlan (lldb::ThreadPlanSP &plan_sp);
98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PopPlan ();
98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DiscardPlan ();
98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadPlan *GetPreviousPlan (ThreadPlan *plan);
99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::vector<lldb::ThreadPlanSP> plan_stack;
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
99415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    virtual bool
995e426d855032b9b1962b98028b42e3a4e88975b03Peter Collingbourne    SaveFrameZeroState (RegisterCheckpoint &checkpoint);
99615dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
99715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    virtual bool
998e426d855032b9b1962b98028b42e3a4e88975b03Peter Collingbourne    RestoreSaveFrameZero (const RegisterCheckpoint &checkpoint);
999a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham
1000a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    // register_data_sp must be a DataSP passed to ReadAllRegisterValues.
1001a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    bool
1002a17a81a1a9ff6b8d87c4a1e47dd874f6ea8a4f1dJim Ingham    ResetFrameZeroRegisters (lldb::DataBufferSP register_data_sp);
100315dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
100471219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham    virtual lldb_private::Unwind *
100537f962e785be99dc4f0c5e9d02416992ff03bbd0Greg Clayton    GetUnwinder ();
100671219089a9896e3c5c307f7465c8f90f2a9f6d68Jim Ingham
10076bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham    // Check to see whether the thread is still at the last breakpoint hit that stopped it.
10081a00ab35c98b2acd393bb1ceee3e0e2bf4e02768Filipe Cabecinhas    virtual bool
10096bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham    IsStillAtLastBreakpointHit();
10106bc24c10080b624a2782e6e42f683e5d65c6903cJim Ingham
1011a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // Some threads are threads that are made up by OperatingSystem plugins that
1012a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // are threads that exist and are context switched out into memory. The
1013a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // OperatingSystem plug-in need a ways to know if a thread is "real" or made
1014a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    // up.
1015a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    virtual bool
1016a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    IsOperatingSystemPluginThread () const
1017a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    {
1018a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton        return false;
1019a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton    }
1020a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton
1021a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton
10222450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton    lldb::StackFrameListSP
1023782b9ccd9f2b290585cd6bb4c1f0cc6cb7e22e15Greg Clayton    GetStackFrameList ();
102415dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
102515dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    struct ThreadState
10266297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham    {
102715dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        uint32_t           orig_stop_id;
102815dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        lldb::StopInfoSP   stop_info_sp;
102915dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham        RegisterCheckpoint register_backup;
103015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham    };
10316297a3a5c4d8b61f2429f371bdf207043dbca832Jim Ingham
103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Classes that inherit from Process can see and modify these
103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
1035f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    lldb::ProcessWP     m_process_wp;           ///< The process that owns this thread.
1036863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    lldb::StopInfoSP    m_stop_info_sp;         ///< The private stop reason for this thread
1037863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    uint32_t            m_stop_info_stop_id;    // This is the stop id for which the StopInfo is valid.  Can use this so you know that
1038863aa28adf536c9c008e1590f25da662431d6f13Greg Clayton    // the thread's m_stop_info_sp is current and you don't have to fetch it again
1039f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    const uint32_t      m_index_id;             ///< A unique 1 based index assigned to each thread for easy UI/command line access.
1040f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    lldb::RegisterContextSP m_reg_context_sp;   ///< The register context for this thread's current register state.
1041f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    lldb::StateType     m_state;                ///< The state of our process.
1042f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    mutable Mutex       m_state_mutex;          ///< Multithreaded protection for m_state.
1043f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    plan_stack          m_plan_stack;           ///< The stack of plans this thread is executing.
1044f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    plan_stack          m_completed_plan_stack; ///< Plans that have been completed by this stop.  They get deleted when the thread resumes.
1045f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    plan_stack          m_discarded_plan_stack; ///< Plans that have been discarded by this stop.  They get deleted when the thread resumes.
10462450cb19a85dcd4a14032bd96b16389416b4ff7fGreg Clayton    mutable Mutex       m_frame_mutex;          ///< Multithreaded protection for m_state.
1047f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    lldb::StackFrameListSP m_curr_frames_sp;    ///< The stack frames that get lazily populated after a thread stops.
1048f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    lldb::StackFrameListSP m_prev_frames_sp;    ///< The previous stack frames from the last time this thread stopped.
1049f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    int                 m_resume_signal;        ///< The signal that should be used when continuing this thread.
1050f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    lldb::StateType     m_resume_state;         ///< This state is used to force a thread to be suspended from outside the ThreadPlan logic.
1051149d1f525c4744c41984d4b9dab78f6a8ba1d147Jim 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.
1052a46013bde54626b68cd2013b108f73a205f4b29aGreg Clayton                                                  /// It gets set in Thread::ShoudResume.
1053102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<lldb_private::Unwind> m_unwinder_ap;
1054f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    bool                m_destroy_called;       // This is used internally to make sure derived Thread classes call DestroyThread.
10557c79a27b955432dfd3ad9439640f0af2eccf37b8Jim Ingham    LazyBool            m_override_should_notify;
105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // For Thread only
105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
106015dcb7ca49b8d8f46910cf085b4c249aac5317faJim Ingham
106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (Thread);
106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Thread_h_
1068