Thread.h revision 008f3dc79c762b7d240b5ad6d4fb148c5cb039ca
1//===-- Thread.h ------------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_Thread_h_
11#define liblldb_Thread_h_
12
13#include "lldb/lldb-private.h"
14#include "lldb/Host/Mutex.h"
15#include "lldb/Core/Broadcaster.h"
16#include "lldb/Core/Event.h"
17#include "lldb/Core/UserID.h"
18#include "lldb/Core/UserSettingsController.h"
19#include "lldb/Target/ExecutionContextScope.h"
20#include "lldb/Target/StackFrameList.h"
21
22#define LLDB_THREAD_MAX_STOP_EXC_DATA 8
23
24namespace lldb_private {
25
26class ThreadProperties : public Properties
27{
28public:
29    ThreadProperties(bool is_global);
30
31    virtual
32    ~ThreadProperties();
33
34    //------------------------------------------------------------------
35    /// The regular expression returned determines symbols that this
36    /// thread won't stop in during "step-in" operations.
37    ///
38    /// @return
39    ///    A pointer to a regular expression to compare against symbols,
40    ///    or NULL if all symbols are allowed.
41    ///
42    //------------------------------------------------------------------
43    const RegularExpression *
44    GetSymbolsToAvoidRegexp();
45
46    bool
47    GetTraceEnabledState() const;
48};
49
50typedef std::shared_ptr<ThreadProperties> ThreadPropertiesSP;
51
52class Thread :
53    public std::enable_shared_from_this<Thread>,
54    public ThreadProperties,
55    public UserID,
56    public ExecutionContextScope,
57    public Broadcaster
58{
59public:
60    //------------------------------------------------------------------
61    /// Broadcaster event bits definitions.
62    //------------------------------------------------------------------
63    enum
64    {
65        eBroadcastBitStackChanged           = (1 << 0),
66        eBroadcastBitThreadSuspended        = (1 << 1),
67        eBroadcastBitThreadResumed          = (1 << 2),
68        eBroadcastBitSelectedFrameChanged   = (1 << 3),
69        eBroadcastBitThreadSelected         = (1 << 4)
70    };
71
72    static ConstString &GetStaticBroadcasterClass ();
73
74    virtual ConstString &GetBroadcasterClass() const
75    {
76        return GetStaticBroadcasterClass();
77    }
78
79    class ThreadEventData :
80        public EventData
81    {
82    public:
83        ThreadEventData (const lldb::ThreadSP thread_sp);
84
85        ThreadEventData (const lldb::ThreadSP thread_sp, const StackID &stack_id);
86
87        ThreadEventData();
88
89        virtual ~ThreadEventData();
90
91        static const ConstString &
92        GetFlavorString ();
93
94        virtual const ConstString &
95        GetFlavor () const
96        {
97            return ThreadEventData::GetFlavorString ();
98        }
99
100        virtual void
101        Dump (Stream *s) const;
102
103        static const ThreadEventData *
104        GetEventDataFromEvent (const Event *event_ptr);
105
106        static lldb::ThreadSP
107        GetThreadFromEvent (const Event *event_ptr);
108
109        static StackID
110        GetStackIDFromEvent (const Event *event_ptr);
111
112        static lldb::StackFrameSP
113        GetStackFrameFromEvent (const Event *event_ptr);
114
115        lldb::ThreadSP
116        GetThread () const
117        {
118            return m_thread_sp;
119        }
120
121        StackID
122        GetStackID () const
123        {
124            return m_stack_id;
125        }
126
127    private:
128        lldb::ThreadSP m_thread_sp;
129        StackID        m_stack_id;
130    DISALLOW_COPY_AND_ASSIGN (ThreadEventData);
131    };
132
133    // TODO: You shouldn't just checkpoint the register state alone, so this should get
134    // moved to protected.  To do that ThreadStateCheckpoint needs to be returned as a token...
135    class RegisterCheckpoint
136    {
137    public:
138
139        RegisterCheckpoint() :
140            m_stack_id (),
141            m_data_sp ()
142        {
143        }
144
145        RegisterCheckpoint (const StackID &stack_id) :
146            m_stack_id (stack_id),
147            m_data_sp ()
148        {
149        }
150
151        ~RegisterCheckpoint()
152        {
153        }
154
155        const RegisterCheckpoint&
156        operator= (const RegisterCheckpoint &rhs)
157        {
158            if (this != &rhs)
159            {
160                this->m_stack_id = rhs.m_stack_id;
161                this->m_data_sp  = rhs.m_data_sp;
162            }
163            return *this;
164        }
165
166        RegisterCheckpoint (const RegisterCheckpoint &rhs) :
167            m_stack_id (rhs.m_stack_id),
168            m_data_sp (rhs.m_data_sp)
169        {
170        }
171
172        const StackID &
173        GetStackID()
174        {
175            return m_stack_id;
176        }
177
178        void
179        SetStackID (const StackID &stack_id)
180        {
181            m_stack_id = stack_id;
182        }
183
184        lldb::DataBufferSP &
185        GetData()
186        {
187            return m_data_sp;
188        }
189
190        const lldb::DataBufferSP &
191        GetData() const
192        {
193            return m_data_sp;
194        }
195
196    protected:
197        StackID m_stack_id;
198        lldb::DataBufferSP m_data_sp;
199    };
200
201    struct ThreadStateCheckpoint
202    {
203        uint32_t           orig_stop_id;  // Dunno if I need this yet but it is an interesting bit of data.
204        lldb::StopInfoSP   stop_info_sp;  // You have to restore the stop info or you might continue with the wrong signals.
205        RegisterCheckpoint register_backup;  // You need to restore the registers, of course...
206        uint32_t           current_inlined_depth;
207        lldb::addr_t       current_inlined_pc;
208    };
209
210    static void
211    SettingsInitialize ();
212
213    static void
214    SettingsTerminate ();
215
216    static const ThreadPropertiesSP &
217    GetGlobalProperties();
218
219    Thread (Process &process, lldb::tid_t tid);
220    virtual ~Thread();
221
222    lldb::ProcessSP
223    GetProcess() const
224    {
225        return m_process_wp.lock();
226    }
227
228    int
229    GetResumeSignal () const
230    {
231        return m_resume_signal;
232    }
233
234    void
235    SetResumeSignal (int signal)
236    {
237        m_resume_signal = signal;
238    }
239
240    lldb::StateType
241    GetState() const;
242
243    void
244    SetState (lldb::StateType state);
245
246    lldb::StateType
247    GetResumeState () const
248    {
249        return m_resume_state;
250    }
251
252    void
253    SetResumeState (lldb::StateType state)
254    {
255        m_resume_state = state;
256    }
257
258    // This function is called on all the threads before "ShouldResume" and
259    // "WillResume" in case a thread needs to change its state before the
260    // ThreadList polls all the threads to figure out which ones actually
261    // will get to run and how.
262    void
263    SetupForResume ();
264
265    // Do not override this function, it is for thread plan logic only
266    bool
267    ShouldResume (lldb::StateType resume_state);
268
269    // Override this to do platform specific tasks before resume.
270    virtual void
271    WillResume (lldb::StateType resume_state)
272    {
273    }
274
275    // This clears generic thread state after a resume.  If you subclass this,
276    // be sure to call it.
277    virtual void
278    DidResume ();
279
280    // This notifies the thread when a private stop occurs.
281    virtual void
282    DidStop ();
283
284    virtual void
285    RefreshStateAfterStop() = 0;
286
287    void
288    WillStop ();
289
290    bool
291    ShouldStop (Event *event_ptr);
292
293    Vote
294    ShouldReportStop (Event *event_ptr);
295
296    Vote
297    ShouldReportRun (Event *event_ptr);
298
299    void
300    Flush ();
301
302    // Return whether this thread matches the specification in ThreadSpec.  This is a virtual
303    // method because at some point we may extend the thread spec with a platform specific
304    // dictionary of attributes, which then only the platform specific Thread implementation
305    // would know how to match.  For now, this just calls through to the ThreadSpec's
306    // ThreadPassesBasicTests method.
307    virtual bool
308    MatchesSpec (const ThreadSpec *spec);
309
310    lldb::StopInfoSP
311    GetStopInfo ();
312
313    lldb::StopReason
314    GetStopReason();
315
316    // This sets the stop reason to a "blank" stop reason, so you can call functions on the thread
317    // without having the called function run with whatever stop reason you stopped with.
318    void
319    SetStopInfoToNothing();
320
321    bool
322    ThreadStoppedForAReason ();
323
324    static const char *
325    RunModeAsCString (lldb::RunMode mode);
326
327    static const char *
328    StopReasonAsCString (lldb::StopReason reason);
329
330    virtual const char *
331    GetInfo ()
332    {
333        return NULL;
334    }
335
336    virtual const char *
337    GetName ()
338    {
339        return NULL;
340    }
341
342    virtual const char *
343    GetQueueName ()
344    {
345        return NULL;
346    }
347
348    virtual uint32_t
349    GetStackFrameCount()
350    {
351        return GetStackFrameList()->GetNumFrames();
352    }
353
354    virtual lldb::StackFrameSP
355    GetStackFrameAtIndex (uint32_t idx)
356    {
357        return GetStackFrameList()->GetFrameAtIndex(idx);
358    }
359
360    virtual lldb::StackFrameSP
361    GetFrameWithConcreteFrameIndex (uint32_t unwind_idx);
362
363    bool
364    DecrementCurrentInlinedDepth()
365    {
366        return GetStackFrameList()->DecrementCurrentInlinedDepth();
367    }
368
369    uint32_t
370    GetCurrentInlinedDepth()
371    {
372        return GetStackFrameList()->GetCurrentInlinedDepth();
373    }
374
375    Error
376    ReturnFromFrameWithIndex (uint32_t frame_idx, lldb::ValueObjectSP return_value_sp, bool broadcast = false);
377
378    Error
379    ReturnFromFrame (lldb::StackFrameSP frame_sp, lldb::ValueObjectSP return_value_sp, bool broadcast = false);
380
381    virtual lldb::StackFrameSP
382    GetFrameWithStackID (const StackID &stack_id)
383    {
384        if (stack_id.IsValid())
385            return GetStackFrameList()->GetFrameWithStackID (stack_id);
386        return lldb::StackFrameSP();
387    }
388
389    uint32_t
390    GetSelectedFrameIndex ()
391    {
392        return GetStackFrameList()->GetSelectedFrameIndex();
393    }
394
395    lldb::StackFrameSP
396    GetSelectedFrame ()
397    {
398        lldb::StackFrameListSP stack_frame_list_sp(GetStackFrameList());
399        return stack_frame_list_sp->GetFrameAtIndex (stack_frame_list_sp->GetSelectedFrameIndex());
400    }
401
402    uint32_t
403    SetSelectedFrame (lldb_private::StackFrame *frame, bool broadcast = false);
404
405
406    bool
407    SetSelectedFrameByIndex (uint32_t frame_idx, bool broadcast = false);
408
409    bool
410    SetSelectedFrameByIndexNoisily (uint32_t frame_idx, Stream &output_stream);
411
412    void
413    SetDefaultFileAndLineToSelectedFrame()
414    {
415        GetStackFrameList()->SetDefaultFileAndLineToSelectedFrame();
416    }
417
418    virtual lldb::RegisterContextSP
419    GetRegisterContext () = 0;
420
421    virtual lldb::RegisterContextSP
422    CreateRegisterContextForFrame (StackFrame *frame) = 0;
423
424    virtual void
425    ClearStackFrames ();
426
427    virtual bool
428    SetBackingThread (const lldb::ThreadSP &thread_sp)
429    {
430        return false;
431    }
432
433    virtual lldb::ThreadSP
434    GetBackingThread () const
435    {
436        return lldb::ThreadSP();
437    }
438
439    virtual void
440    ClearBackingThread ()
441    {
442        // Subclasses can use this function if a thread is actually backed by
443        // another thread. This is currently used for the OperatingSystem plug-ins
444        // where they might have a thread that is in memory, yet its registers
445        // are available through the lldb_private::Thread subclass for the current
446        // lldb_private::Process class. Since each time the process stops the backing
447        // threads for memory threads can change, we need a way to clear the backing
448        // thread for all memory threads each time we stop.
449    }
450
451    void
452    DumpUsingSettingsFormat (Stream &strm, uint32_t frame_idx);
453
454    //------------------------------------------------------------------
455    // Thread Plan Providers:
456    // This section provides the basic thread plans that the Process control
457    // machinery uses to run the target.  ThreadPlan.h provides more details on
458    // how this mechanism works.
459    // The thread provides accessors to a set of plans that perform basic operations.
460    // The idea is that particular Platform plugins can override these methods to
461    // provide the implementation of these basic operations appropriate to their
462    // environment.
463    //
464    // NB: All the QueueThreadPlanXXX providers return Shared Pointers to
465    // Thread plans.  This is useful so that you can modify the plans after
466    // creation in ways specific to that plan type.  Also, it is often necessary for
467    // ThreadPlans that utilize other ThreadPlans to implement their task to keep a shared
468    // pointer to the sub-plan.
469    // But besides that, the shared pointers should only be held onto by entities who live no longer
470    // than the thread containing the ThreadPlan.
471    // FIXME: If this becomes a problem, we can make a version that just returns a pointer,
472    // which it is clearly unsafe to hold onto, and a shared pointer version, and only allow
473    // ThreadPlan and Co. to use the latter.  That is made more annoying to do because there's
474    // no elegant way to friend a method to all sub-classes of a given class.
475    //
476    //------------------------------------------------------------------
477
478    //------------------------------------------------------------------
479    /// Queues the base plan for a thread.
480    /// The version returned by Process does some things that are useful,
481    /// like handle breakpoints and signals, so if you return a plugin specific
482    /// one you probably want to call through to the Process one for anything
483    /// your plugin doesn't explicitly handle.
484    ///
485    /// @param[in] abort_other_plans
486    ///    \b true if we discard the currently queued plans and replace them with this one.
487    ///    Otherwise this plan will go on the end of the plan stack.
488    ///
489    /// @return
490    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
491    //------------------------------------------------------------------
492    virtual lldb::ThreadPlanSP
493    QueueFundamentalPlan (bool abort_other_plans);
494
495    //------------------------------------------------------------------
496    /// Queues the plan used to step over a breakpoint at the current PC of \a thread.
497    /// The default version returned by Process handles trap based breakpoints, and
498    /// will disable the breakpoint, single step over it, then re-enable it.
499    ///
500    /// @param[in] abort_other_plans
501    ///    \b true if we discard the currently queued plans and replace them with this one.
502    ///    Otherwise this plan will go on the end of the plan stack.
503    ///
504    /// @return
505    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
506    //------------------------------------------------------------------
507    virtual lldb::ThreadPlanSP
508    QueueThreadPlanForStepOverBreakpointPlan (bool abort_other_plans);
509
510    //------------------------------------------------------------------
511    /// Queues the plan used to step one instruction from the current PC of \a thread.
512    ///
513    /// @param[in] step_over
514    ///    \b true if we step over calls to functions, false if we step in.
515    ///
516    /// @param[in] abort_other_plans
517    ///    \b true if we discard the currently queued plans and replace them with this one.
518    ///    Otherwise this plan will go on the end of the plan stack.
519    ///
520    /// @param[in] stop_other_threads
521    ///    \b true if we will stop other threads while we single step this one.
522    ///
523    /// @return
524    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
525    //------------------------------------------------------------------
526    virtual lldb::ThreadPlanSP
527    QueueThreadPlanForStepSingleInstruction (bool step_over,
528                                             bool abort_other_plans,
529                                             bool stop_other_threads);
530
531    //------------------------------------------------------------------
532    /// Queues the plan used to step through an address range, stepping  over
533    /// function calls.
534    ///
535    /// @param[in] abort_other_plans
536    ///    \b true if we discard the currently queued plans and replace them with this one.
537    ///    Otherwise this plan will go on the end of the plan stack.
538    ///
539    /// @param[in] type
540    ///    Type of step to do, only eStepTypeInto and eStepTypeOver are supported by this plan.
541    ///
542    /// @param[in] range
543    ///    The address range to step through.
544    ///
545    /// @param[in] addr_context
546    ///    When dealing with stepping through inlined functions the current PC is not enough information to know
547    ///    what "step" means.  For instance a series of nested inline functions might start at the same address.
548    //     The \a addr_context provides the current symbol context the step
549    ///    is supposed to be out of.
550    //   FIXME: Currently unused.
551    ///
552    /// @param[in] stop_other_threads
553    ///    \b true if we will stop other threads while we single step this one.
554    ///
555    /// @return
556    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
557    //------------------------------------------------------------------
558    virtual lldb::ThreadPlanSP
559    QueueThreadPlanForStepOverRange (bool abort_other_plans,
560                                 const AddressRange &range,
561                                 const SymbolContext &addr_context,
562                                 lldb::RunMode stop_other_threads);
563
564    //------------------------------------------------------------------
565    /// Queues the plan used to step through an address range, stepping into functions.
566    ///
567    /// @param[in] abort_other_plans
568    ///    \b true if we discard the currently queued plans and replace them with this one.
569    ///    Otherwise this plan will go on the end of the plan stack.
570    ///
571    /// @param[in] type
572    ///    Type of step to do, only eStepTypeInto and eStepTypeOver are supported by this plan.
573    ///
574    /// @param[in] range
575    ///    The address range to step through.
576    ///
577    /// @param[in] addr_context
578    ///    When dealing with stepping through inlined functions the current PC is not enough information to know
579    ///    what "step" means.  For instance a series of nested inline functions might start at the same address.
580    //     The \a addr_context provides the current symbol context the step
581    ///    is supposed to be out of.
582    //   FIXME: Currently unused.
583    ///
584    /// @param[in] step_in_target
585    ///    Name if function we are trying to step into.  We will step out if we don't land in that function.
586    ///
587    /// @param[in] stop_other_threads
588    ///    \b true if we will stop other threads while we single step this one.
589    ///
590    /// @param[in] avoid_code_without_debug_info
591    ///    If \b true we will step out if we step into code with no debug info.
592    ///
593    /// @return
594    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
595    //------------------------------------------------------------------
596    virtual lldb::ThreadPlanSP
597    QueueThreadPlanForStepInRange (bool abort_other_plans,
598                                 const AddressRange &range,
599                                 const SymbolContext &addr_context,
600                                 const char *step_in_target,
601                                 lldb::RunMode stop_other_threads,
602                                 bool avoid_code_without_debug_info);
603
604    //------------------------------------------------------------------
605    /// Queue the plan used to step out of the function at the current PC of
606    /// \a thread.
607    ///
608    /// @param[in] abort_other_plans
609    ///    \b true if we discard the currently queued plans and replace them with this one.
610    ///    Otherwise this plan will go on the end of the plan stack.
611    ///
612    /// @param[in] addr_context
613    ///    When dealing with stepping through inlined functions the current PC is not enough information to know
614    ///    what "step" means.  For instance a series of nested inline functions might start at the same address.
615    //     The \a addr_context provides the current symbol context the step
616    ///    is supposed to be out of.
617    //   FIXME: Currently unused.
618    ///
619    /// @param[in] first_insn
620    ///     \b true if this is the first instruction of a function.
621    ///
622    /// @param[in] stop_other_threads
623    ///    \b true if we will stop other threads while we single step this one.
624    ///
625    /// @param[in] stop_vote
626    /// @param[in] run_vote
627    ///    See standard meanings for the stop & run votes in ThreadPlan.h.
628    ///
629    /// @return
630    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
631    //------------------------------------------------------------------
632    virtual lldb::ThreadPlanSP
633    QueueThreadPlanForStepOut (bool abort_other_plans,
634                               SymbolContext *addr_context,
635                               bool first_insn,
636                               bool stop_other_threads,
637                               Vote stop_vote, // = eVoteYes,
638                               Vote run_vote, // = eVoteNoOpinion);
639                               uint32_t frame_idx);
640
641    //------------------------------------------------------------------
642    /// Gets the plan used to step through the code that steps from a function
643    /// call site at the current PC into the actual function call.
644    ///
645    ///
646    /// @param[in] return_stack_id
647    ///    The stack id that we will return to (by setting backstop breakpoints on the return
648    ///    address to that frame) if we fail to step through.
649    ///
650    /// @param[in] abort_other_plans
651    ///    \b true if we discard the currently queued plans and replace them with this one.
652    ///    Otherwise this plan will go on the end of the plan stack.
653    ///
654    /// @param[in] stop_other_threads
655    ///    \b true if we will stop other threads while we single step this one.
656    ///
657    /// @return
658    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
659    //------------------------------------------------------------------
660    virtual lldb::ThreadPlanSP
661    QueueThreadPlanForStepThrough (StackID &return_stack_id,
662                                   bool abort_other_plans,
663                                   bool stop_other_threads);
664
665    //------------------------------------------------------------------
666    /// Gets the plan used to continue from the current PC.
667    /// This is a simple plan, mostly useful as a backstop when you are continuing
668    /// for some particular purpose.
669    ///
670    /// @param[in] abort_other_plans
671    ///    \b true if we discard the currently queued plans and replace them with this one.
672    ///    Otherwise this plan will go on the end of the plan stack.
673    ///
674    /// @param[in] target_addr
675    ///    The address to which we're running.
676    ///
677    /// @param[in] stop_other_threads
678    ///    \b true if we will stop other threads while we single step this one.
679    ///
680    /// @return
681    ///     A shared pointer to the newly queued thread plan, or NULL if the plan could not be queued.
682    //------------------------------------------------------------------
683    virtual lldb::ThreadPlanSP
684    QueueThreadPlanForRunToAddress (bool abort_other_plans,
685                                    Address &target_addr,
686                                    bool stop_other_threads);
687
688    virtual lldb::ThreadPlanSP
689    QueueThreadPlanForStepUntil (bool abort_other_plans,
690                                 lldb::addr_t *address_list,
691                                 size_t num_addresses,
692                                 bool stop_others,
693                                 uint32_t frame_idx);
694
695    virtual lldb::ThreadPlanSP
696    QueueThreadPlanForCallFunction (bool abort_other_plans,
697                                    Address& function,
698                                    lldb::addr_t arg,
699                                    bool stop_other_threads,
700                                    bool unwind_on_error = false,
701                                    bool ignore_breakpoints = true);
702
703    //------------------------------------------------------------------
704    // Thread Plan accessors:
705    //------------------------------------------------------------------
706
707    //------------------------------------------------------------------
708    /// Gets the plan which will execute next on the plan stack.
709    ///
710    /// @return
711    ///     A pointer to the next executed plan.
712    //------------------------------------------------------------------
713    ThreadPlan *
714    GetCurrentPlan ();
715
716    //------------------------------------------------------------------
717    /// Unwinds the thread stack for the innermost expression plan currently
718    /// on the thread plan stack.
719    ///
720    /// @return
721    ///     An error if the thread plan could not be unwound.
722    //------------------------------------------------------------------
723
724    Error
725    UnwindInnermostExpression();
726
727private:
728    bool
729    PlanIsBasePlan (ThreadPlan *plan_ptr);
730
731    void
732    BroadcastSelectedFrameChange(StackID &new_frame_id);
733
734public:
735
736    //------------------------------------------------------------------
737    /// Gets the outer-most plan that was popped off the plan stack in the
738    /// most recent stop.  Useful for printing the stop reason accurately.
739    ///
740    /// @return
741    ///     A pointer to the last completed plan.
742    //------------------------------------------------------------------
743    lldb::ThreadPlanSP
744    GetCompletedPlan ();
745
746    //------------------------------------------------------------------
747    /// Gets the outer-most return value from the completed plans
748    ///
749    /// @return
750    ///     A ValueObjectSP, either empty if there is no return value,
751    ///     or containing the return value.
752    //------------------------------------------------------------------
753    lldb::ValueObjectSP
754    GetReturnValueObject ();
755
756    //------------------------------------------------------------------
757    ///  Checks whether the given plan is in the completed plans for this
758    ///  stop.
759    ///
760    /// @param[in] plan
761    ///     Pointer to the plan you're checking.
762    ///
763    /// @return
764    ///     Returns true if the input plan is in the completed plan stack,
765    ///     false otherwise.
766    //------------------------------------------------------------------
767    bool
768    IsThreadPlanDone (ThreadPlan *plan);
769
770    //------------------------------------------------------------------
771    ///  Checks whether the given plan is in the discarded plans for this
772    ///  stop.
773    ///
774    /// @param[in] plan
775    ///     Pointer to the plan you're checking.
776    ///
777    /// @return
778    ///     Returns true if the input plan is in the discarded plan stack,
779    ///     false otherwise.
780    //------------------------------------------------------------------
781    bool
782    WasThreadPlanDiscarded (ThreadPlan *plan);
783
784    //------------------------------------------------------------------
785    /// Queues a generic thread plan.
786    ///
787    /// @param[in] plan_sp
788    ///    The plan to queue.
789    ///
790    /// @param[in] abort_other_plans
791    ///    \b true if we discard the currently queued plans and replace them with this one.
792    ///    Otherwise this plan will go on the end of the plan stack.
793    ///
794    /// @return
795    ///     A pointer to the last completed plan.
796    //------------------------------------------------------------------
797    void
798    QueueThreadPlan (lldb::ThreadPlanSP &plan_sp, bool abort_other_plans);
799
800
801    //------------------------------------------------------------------
802    /// Discards the plans queued on the plan stack of the current thread.  This is
803    /// arbitrated by the "Master" ThreadPlans, using the "OkayToDiscard" call.
804    //  But if \a force is true, all thread plans are discarded.
805    //------------------------------------------------------------------
806    void
807    DiscardThreadPlans (bool force);
808
809    //------------------------------------------------------------------
810    /// Discards the plans queued on the plan stack of the current thread up to and
811    /// including up_to_plan_sp.
812    //
813    // @param[in] up_to_plan_sp
814    //   Discard all plans up to and including this one.
815    //------------------------------------------------------------------
816    void
817    DiscardThreadPlansUpToPlan (lldb::ThreadPlanSP &up_to_plan_sp);
818
819    void
820    DiscardThreadPlansUpToPlan (ThreadPlan *up_to_plan_ptr);
821
822    //------------------------------------------------------------------
823    /// Prints the current plan stack.
824    ///
825    /// @param[in] s
826    ///    The stream to which to dump the plan stack info.
827    ///
828    //------------------------------------------------------------------
829    void
830    DumpThreadPlans (Stream *s) const;
831
832    virtual bool
833    CheckpointThreadState (ThreadStateCheckpoint &saved_state);
834
835    virtual bool
836    RestoreRegisterStateFromCheckpoint (ThreadStateCheckpoint &saved_state);
837
838    virtual bool
839    RestoreThreadStateFromCheckpoint (ThreadStateCheckpoint &saved_state);
840
841    void
842    EnableTracer (bool value, bool single_step);
843
844    void
845    SetTracer (lldb::ThreadPlanTracerSP &tracer_sp);
846
847    //------------------------------------------------------------------
848    // Get the thread index ID. The index ID that is guaranteed to not
849    // be re-used by a process. They start at 1 and increase with each
850    // new thread. This allows easy command line access by a unique ID
851    // that is easier to type than the actual system thread ID.
852    //------------------------------------------------------------------
853    uint32_t
854    GetIndexID () const;
855
856
857    //------------------------------------------------------------------
858    // The API ID is often the same as the Thread::GetID(), but not in
859    // all cases. Thread::GetID() is the user visible thread ID that
860    // clients would want to see. The API thread ID is the thread ID
861    // that is used when sending data to/from the debugging protocol.
862    //------------------------------------------------------------------
863    virtual lldb::user_id_t
864    GetProtocolID () const
865    {
866        return GetID();
867    }
868
869    //------------------------------------------------------------------
870    // lldb::ExecutionContextScope pure virtual functions
871    //------------------------------------------------------------------
872    virtual lldb::TargetSP
873    CalculateTarget ();
874
875    virtual lldb::ProcessSP
876    CalculateProcess ();
877
878    virtual lldb::ThreadSP
879    CalculateThread ();
880
881    virtual lldb::StackFrameSP
882    CalculateStackFrame ();
883
884    virtual void
885    CalculateExecutionContext (ExecutionContext &exe_ctx);
886
887    lldb::StackFrameSP
888    GetStackFrameSPForStackFramePtr (StackFrame *stack_frame_ptr);
889
890    size_t
891    GetStatus (Stream &strm,
892               uint32_t start_frame,
893               uint32_t num_frames,
894               uint32_t num_frames_with_source);
895
896    size_t
897    GetStackFrameStatus (Stream& strm,
898                         uint32_t first_frame,
899                         uint32_t num_frames,
900                         bool show_frame_info,
901                         uint32_t num_frames_with_source);
902
903    // We need a way to verify that even though we have a thread in a shared
904    // pointer that the object itself is still valid. Currently this won't be
905    // the case if DestroyThread() was called. DestroyThread is called when
906    // a thread has been removed from the Process' thread list.
907    bool
908    IsValid () const
909    {
910        return !m_destroy_called;
911    }
912
913    // Sets and returns a valid stop info based on the process stop ID and the
914    // current thread plan. If the thread stop ID does not match the process'
915    // stop ID, the private stop reason is not set and an invalid StopInfoSP may
916    // be returned.
917    //
918    // NOTE: This function must be called before the current thread plan is
919    // moved to the completed plan stack (in Thread::ShouldStop()).
920    //
921    // NOTE: If subclasses override this function, ensure they do not overwrite
922    // the m_actual_stop_info if it is valid.  The stop info may be a
923    // "checkpointed and restored" stop info, so if it is still around it is
924    // right even if you have not calculated this yourself, or if it disagrees
925    // with what you might have calculated.
926    virtual lldb::StopInfoSP
927    GetPrivateStopInfo ();
928
929    //----------------------------------------------------------------------
930    // Ask the thread subclass to set its stop info.
931    //
932    // Thread subclasses should call Thread::SetStopInfo(...) with the
933    // reason the thread stopped.
934    //
935    // @return
936    //      True if Thread::SetStopInfo(...) was called, false otherwise.
937    //----------------------------------------------------------------------
938    virtual bool
939    CalculateStopInfo () = 0;
940
941    //----------------------------------------------------------------------
942    // Gets the temporary resume state for a thread.
943    //
944    // This value gets set in each thread by complex debugger logic in
945    // Thread::ShouldResume() and an appropriate thread resume state will get
946    // set in each thread every time the process is resumed prior to calling
947    // Process::DoResume(). The lldb_private::Process subclass should adhere
948    // to the thread resume state request which will be one of:
949    //
950    //  eStateRunning   - thread will resume when process is resumed
951    //  eStateStepping  - thread should step 1 instruction and stop when process
952    //                    is resumed
953    //  eStateSuspended - thread should not execute any instructions when
954    //                    process is resumed
955    //----------------------------------------------------------------------
956    lldb::StateType
957    GetTemporaryResumeState() const
958    {
959        return m_temporary_resume_state;
960    }
961
962    void
963    SetStopInfo (const lldb::StopInfoSP &stop_info_sp);
964
965    void
966    SetShouldReportStop (Vote vote);
967
968protected:
969
970    friend class ThreadPlan;
971    friend class ThreadList;
972    friend class ThreadEventData;
973    friend class StackFrameList;
974    friend class StackFrame;
975    friend class OperatingSystem;
976
977    // This is necessary to make sure thread assets get destroyed while the thread is still in good shape
978    // to call virtual thread methods.  This must be called by classes that derive from Thread in their destructor.
979    virtual void DestroyThread ();
980
981    void
982    PushPlan (lldb::ThreadPlanSP &plan_sp);
983
984    void
985    PopPlan ();
986
987    void
988    DiscardPlan ();
989
990    ThreadPlan *GetPreviousPlan (ThreadPlan *plan);
991
992    typedef std::vector<lldb::ThreadPlanSP> plan_stack;
993
994    virtual bool
995    SaveFrameZeroState (RegisterCheckpoint &checkpoint);
996
997    virtual bool
998    RestoreSaveFrameZero (const RegisterCheckpoint &checkpoint);
999
1000    // register_data_sp must be a DataSP passed to ReadAllRegisterValues.
1001    bool
1002    ResetFrameZeroRegisters (lldb::DataBufferSP register_data_sp);
1003
1004    virtual lldb_private::Unwind *
1005    GetUnwinder ();
1006
1007    // Check to see whether the thread is still at the last breakpoint hit that stopped it.
1008    virtual bool
1009    IsStillAtLastBreakpointHit();
1010
1011    // Some threads are threads that are made up by OperatingSystem plugins that
1012    // are threads that exist and are context switched out into memory. The
1013    // OperatingSystem plug-in need a ways to know if a thread is "real" or made
1014    // up.
1015    virtual bool
1016    IsOperatingSystemPluginThread () const
1017    {
1018        return false;
1019    }
1020
1021
1022    lldb::StackFrameListSP
1023    GetStackFrameList ();
1024
1025    struct ThreadState
1026    {
1027        uint32_t           orig_stop_id;
1028        lldb::StopInfoSP   stop_info_sp;
1029        RegisterCheckpoint register_backup;
1030    };
1031
1032    //------------------------------------------------------------------
1033    // Classes that inherit from Process can see and modify these
1034    //------------------------------------------------------------------
1035    lldb::ProcessWP     m_process_wp;           ///< The process that owns this thread.
1036    lldb::StopInfoSP    m_stop_info_sp;         ///< The private stop reason for this thread
1037    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
1038    // the thread's m_stop_info_sp is current and you don't have to fetch it again
1039    const uint32_t      m_index_id;             ///< A unique 1 based index assigned to each thread for easy UI/command line access.
1040    lldb::RegisterContextSP m_reg_context_sp;   ///< The register context for this thread's current register state.
1041    lldb::StateType     m_state;                ///< The state of our process.
1042    mutable Mutex       m_state_mutex;          ///< Multithreaded protection for m_state.
1043    plan_stack          m_plan_stack;           ///< The stack of plans this thread is executing.
1044    plan_stack          m_completed_plan_stack; ///< Plans that have been completed by this stop.  They get deleted when the thread resumes.
1045    plan_stack          m_discarded_plan_stack; ///< Plans that have been discarded by this stop.  They get deleted when the thread resumes.
1046    mutable Mutex       m_frame_mutex;          ///< Multithreaded protection for m_state.
1047    lldb::StackFrameListSP m_curr_frames_sp;    ///< The stack frames that get lazily populated after a thread stops.
1048    lldb::StackFrameListSP m_prev_frames_sp;    ///< The previous stack frames from the last time this thread stopped.
1049    int                 m_resume_signal;        ///< The signal that should be used when continuing this thread.
1050    lldb::StateType     m_resume_state;         ///< This state is used to force a thread to be suspended from outside the ThreadPlan logic.
1051    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.
1052                                                  /// It gets set in Thread::ShoudResume.
1053    std::unique_ptr<lldb_private::Unwind> m_unwinder_ap;
1054    bool                m_destroy_called;       // This is used internally to make sure derived Thread classes call DestroyThread.
1055    LazyBool            m_override_should_notify;
1056private:
1057    //------------------------------------------------------------------
1058    // For Thread only
1059    //------------------------------------------------------------------
1060
1061    DISALLOW_COPY_AND_ASSIGN (Thread);
1062
1063};
1064
1065} // namespace lldb_private
1066
1067#endif  // liblldb_Thread_h_
1068