ExecutionContext.h revision 1e911a03121ab57f16b017be7d8bcf580a999e29
1//===-- ExecutionContext.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/// Execution context objects refer to objects in the execution of the
10/// program that is being debugged. The consist of one or more of the
11/// following objects: target, process, thread, and frame. Many objects
12/// in the debugger need to track different executions contexts. For
13/// example, a local function variable might have an execution context
14/// that refers to a stack frame. A global or static variable might
15/// refer to a target since a stack frame isn't required in order to
16/// evaluate a global or static variable (a process isn't necessarily
17/// needed for a global variable since we might be able to read the
18/// variable value from a data section in one of the object files in
19/// a target). There are two types of objects that hold onto execution
20/// contexts: ExecutionContextRef and ExecutionContext. Both of these
21/// objects are deascribed below.
22///
23/// Not all objects in an ExectionContext objects will be valid. If you want
24/// to refer stronly (ExectionContext) or weakly (ExectionContextRef) to
25/// a process, then only the process and target references will be valid.
26/// For threads, only the thread, process and target references will be
27/// filled in. For frames, all of the objects will be filled in.
28///
29/// These classes are designed to be used as baton objects that get passed
30/// to a wide variety of functions that require execution contexts.
31//===----------------------------------------------------------------------===//
32
33
34
35#ifndef liblldb_ExecutionContext_h_
36#define liblldb_ExecutionContext_h_
37
38#include "lldb/lldb-private.h"
39#include "lldb/Target/StackID.h"
40#include "lldb/Host/Mutex.h"
41
42namespace lldb_private {
43
44//----------------------------------------------------------------------
45/// @class ExecutionContextRef ExecutionContext.h "lldb/Target/ExecutionContext.h"
46/// @brief A class that holds a weak reference to an execution context.
47///
48/// ExecutionContextRef objects are designed to hold onto an execution
49/// context that might change over time. For example, if an object wants
50/// to refer to a stack frame, it should hold onto an ExecutionContextRef
51/// to a frame object. The backing object that represents the stack frame
52/// might change over time and instaces of this object can track the logical
53/// object that refers to a frame even if it does change.
54///
55/// These objects also don't keep execution objects around longer than they
56/// should since they use weak pointers. For example if an object refers
57/// to a stack frame and a stack frame is no longer in a thread, then a
58/// ExecutionContextRef object that refers to that frame will not be able
59/// to get a shared pointer to those objects since they are no longer around.
60///
61/// ExecutionContextRef objects can also be used as objects in classes
62/// that want to track a "previous execution context". Since the weak
63/// references to the execution objects (target, process, thread and frame)
64/// don't keep these objects around, they are safe to keep around.
65///
66/// The general rule of thumb is all long lived objects that want to
67/// refer to execution contexts should use ExecutionContextRef objcts.
68/// The ExecutionContext class is used to temporarily get shared
69/// pointers to any execution context objects that are still around
70/// so they are guaranteed to exist during a function that requires the
71/// objects. ExecutionContext objects should NOT be used for long term
72/// storage since they will keep objects alive with extra shared pointer
73/// references to these  objects.
74//----------------------------------------------------------------------
75class ExecutionContextRef
76{
77public:
78    //------------------------------------------------------------------
79    /// Default Constructor.
80    //------------------------------------------------------------------
81    ExecutionContextRef();
82
83    //------------------------------------------------------------------
84    /// Copy Constructor.
85    //------------------------------------------------------------------
86    ExecutionContextRef (const ExecutionContextRef &rhs);
87
88    //------------------------------------------------------------------
89    /// Construct using an ExecutionContext object that might be NULL.
90    ///
91    /// If \a exe_ctx_ptr is valid, then make weak references to any
92    /// valid objects in the ExecutionContext, othewise no weak
93    /// references to any execution context objects will be made.
94    //------------------------------------------------------------------
95    ExecutionContextRef (const ExecutionContext *exe_ctx_ptr);
96
97    //------------------------------------------------------------------
98    /// Construct using an ExecutionContext object.
99    ///
100    /// Make weak references to any valid objects in the ExecutionContext.
101    //------------------------------------------------------------------
102    ExecutionContextRef (const ExecutionContext &exe_ctx);
103
104    //------------------------------------------------------------------
105    /// Assignment operator
106    ///
107    /// Copy all weak refernces in \a rhs.
108    //------------------------------------------------------------------
109    ExecutionContextRef &
110    operator =(const ExecutionContextRef &rhs);
111
112    //------------------------------------------------------------------
113    /// Assignment operator from a ExecutionContext
114    ///
115    /// Make weak refernces to any stringly referenced objects in \a exe_ctx.
116    //------------------------------------------------------------------
117    ExecutionContextRef &
118    operator =(const ExecutionContext &exe_ctx);
119
120    //------------------------------------------------------------------
121    /// Construct using the target and all the selected items inside of it
122    /// (the process and its selected thread, and the thread's selected
123    /// frame). If there is no selected thread, default to the first thread
124    /// If there is no selected frame, default to the first frame.
125    //------------------------------------------------------------------
126    ExecutionContextRef (Target *target, bool adopt_selected);
127
128    //------------------------------------------------------------------
129    /// Construct using an execution context scope.
130    ///
131    /// If the ExecutionContextScope object is valid and refers to a frame,
132    /// make weak refernces too the frame, thread, process and target.
133    /// If the ExecutionContextScope object is valid and refers to a thread,
134    /// make weak refernces too the thread, process and target.
135    /// If the ExecutionContextScope object is valid and refers to a process,
136    /// make weak refernces too the process and target.
137    /// If the ExecutionContextScope object is valid and refers to a target,
138    /// make weak refernces too the target.
139    //------------------------------------------------------------------
140    ExecutionContextRef (ExecutionContextScope *exe_scope);
141
142    //------------------------------------------------------------------
143    /// Construct using an execution context scope.
144    ///
145    /// If the ExecutionContextScope object refers to a frame,
146    /// make weak refernces too the frame, thread, process and target.
147    /// If the ExecutionContextScope object refers to a thread,
148    /// make weak refernces too the thread, process and target.
149    /// If the ExecutionContextScope object refers to a process,
150    /// make weak refernces too the process and target.
151    /// If the ExecutionContextScope object refers to a target,
152    /// make weak refernces too the target.
153    //------------------------------------------------------------------
154    ExecutionContextRef (ExecutionContextScope &exe_scope);
155
156    ~ExecutionContextRef();
157    //------------------------------------------------------------------
158    /// Clear the object's state.
159    ///
160    /// Sets the process and thread to NULL, and the frame index to an
161    /// invalid value.
162    //------------------------------------------------------------------
163    void
164    Clear ();
165
166    //------------------------------------------------------------------
167    /// Set accessor that creates a weak reference to the target
168    /// referenced in \a target_sp.
169    ///
170    /// If \a target_sp is valid this object will create a weak
171    /// reference to that object, otherwise any previous target weak
172    /// reference contained in this object will be reset.
173    ///
174    /// Only the weak reference to the target will be updated, no other
175    /// weak references will be modified. If you want this execution
176    /// context to make a weak reference to the target's process, use
177    /// the ExecutionContextRef::SetContext() functions.
178    ///
179    /// @see ExecutionContextRef::SetContext(const lldb::TargetSP &, bool)
180    //------------------------------------------------------------------
181    void
182    SetTargetSP (const lldb::TargetSP &target_sp);
183
184    //------------------------------------------------------------------
185    /// Set accessor that creates a weak reference to the process
186    /// referenced in \a process_sp.
187    ///
188    /// If \a process_sp is valid this object will create a weak
189    /// reference to that object, otherwise any previous process weak
190    /// reference contained in this object will be reset.
191    ///
192    /// Only the weak reference to the process will be updated, no other
193    /// weak references will be modified. If you want this execution
194    /// context to make a weak reference to the target, use the
195    /// ExecutionContextRef::SetContext() functions.
196    ///
197    /// @see ExecutionContextRef::SetContext(const lldb::ProcessSP &)
198    //------------------------------------------------------------------
199    void
200    SetProcessSP (const lldb::ProcessSP &process_sp);
201
202    //------------------------------------------------------------------
203    /// Set accessor that creates a weak reference to the thread
204    /// referenced in \a thread_sp.
205    ///
206    /// If \a thread_sp is valid this object will create a weak
207    /// reference to that object, otherwise any previous thread weak
208    /// reference contained in this object will be reset.
209    ///
210    /// Only the weak reference to the thread will be updated, no other
211    /// weak references will be modified. If you want this execution
212    /// context to make a weak reference to the thread's process and
213    /// target, use the ExecutionContextRef::SetContext() functions.
214    ///
215    /// @see ExecutionContextRef::SetContext(const lldb::ThreadSP &)
216    //------------------------------------------------------------------
217    void
218    SetThreadSP (const lldb::ThreadSP &thread_sp);
219
220    //------------------------------------------------------------------
221    /// Set accessor that creates a weak reference to the frame
222    /// referenced in \a frame_sp.
223    ///
224    /// If \a frame_sp is valid this object will create a weak
225    /// reference to that object, otherwise any previous frame weak
226    /// reference contained in this object will be reset.
227    ///
228    /// Only the weak reference to the frame will be updated, no other
229    /// weak references will be modified. If you want this execution
230    /// context to make a weak reference to the frame's thread, process
231    /// and target, use the ExecutionContextRef::SetContext() functions.
232    ///
233    /// @see ExecutionContextRef::SetContext(const lldb::StackFrameSP &)
234    //------------------------------------------------------------------
235    void
236    SetFrameSP (const lldb::StackFrameSP &frame_sp);
237
238    void
239    SetTargetPtr (Target* target, bool adopt_selected);
240
241    void
242    SetProcessPtr (Process *process);
243
244    void
245    SetThreadPtr (Thread *thread);
246
247    void
248    SetFramePtr (StackFrame *frame);
249
250    //------------------------------------------------------------------
251    /// Get accessor that creates a strong reference from the weak target
252    /// reference contained in this object.
253    ///
254    /// @returns
255    ///     A shared pointer to a target that is not guaranteed to be valid.
256    //------------------------------------------------------------------
257    lldb::TargetSP
258    GetTargetSP () const;
259
260    //------------------------------------------------------------------
261    /// Get accessor that creates a strong reference from the weak process
262    /// reference contained in this object.
263    ///
264    /// @returns
265    ///     A shared pointer to a process that is not guaranteed to be valid.
266    //------------------------------------------------------------------
267    lldb::ProcessSP
268    GetProcessSP () const;
269
270    //------------------------------------------------------------------
271    /// Get accessor that creates a strong reference from the weak thread
272    /// reference contained in this object.
273    ///
274    /// @returns
275    ///     A shared pointer to a thread that is not guaranteed to be valid.
276    //------------------------------------------------------------------
277    lldb::ThreadSP
278    GetThreadSP () const;
279
280    //------------------------------------------------------------------
281    /// Get accessor that creates a strong reference from the weak frame
282    /// reference contained in this object.
283    ///
284    /// @returns
285    ///     A shared pointer to a frame that is not guaranteed to be valid.
286    //------------------------------------------------------------------
287    lldb::StackFrameSP
288    GetFrameSP () const;
289
290    //------------------------------------------------------------------
291    /// Create an ExecutionContext object from this object.
292    ///
293    /// Create strong references to any execution context objects that
294    /// are still valid. Any of the returned shared pointers in the
295    /// ExecutionContext objects is not guaranteed to be valid.
296    /// @returns
297    ///     An execution context object that has strong references to
298    ///     any valid weak references in this object.
299    //------------------------------------------------------------------
300    ExecutionContext
301    Lock () const;
302
303    //------------------------------------------------------------------
304    /// Returns true if this object has a weak reference to a thread.
305    /// The return value is only an indication of wether this object has
306    /// a weak reference and does not indicate wether the weak rerference
307    /// is valid or not.
308    //------------------------------------------------------------------
309    bool
310    HasThreadRef () const
311    {
312        return m_tid != LLDB_INVALID_THREAD_ID;
313    }
314
315    //------------------------------------------------------------------
316    /// Returns true if this object has a weak reference to a frame.
317    /// The return value is only an indication of wether this object has
318    /// a weak reference and does not indicate wether the weak rerference
319    /// is valid or not.
320    //------------------------------------------------------------------
321    bool
322    HasFrameRef () const
323    {
324        return m_stack_id.IsValid();
325    }
326
327    void
328    ClearThread ()
329    {
330        m_thread_wp.reset();
331        m_tid = LLDB_INVALID_THREAD_ID;
332    }
333
334    void
335    ClearFrame ()
336    {
337        m_stack_id.Clear();
338    }
339
340protected:
341    //------------------------------------------------------------------
342    // Member variables
343    //------------------------------------------------------------------
344    lldb::TargetWP m_target_wp;             ///< A weak reference to a target
345    lldb::ProcessWP m_process_wp;           ///< A weak reference to a process
346    mutable lldb::ThreadWP m_thread_wp;     ///< A weak reference to a thread
347    lldb::tid_t m_tid;                      ///< The thread ID that this object refers to in case the backing object changes
348    StackID m_stack_id;                     ///< The stack ID that this object refers to in case the backing object changes
349};
350
351//----------------------------------------------------------------------
352/// @class ExecutionContext ExecutionContext.h "lldb/Target/ExecutionContext.h"
353/// @brief A class that contains an execution context.
354///
355/// This baton object can be passed into any function that requires
356/// a context that specifies a target, process, thread and frame.
357/// These objects are designed to be used for short term execution
358/// context object storage while a function might be trying to evaluate
359/// something that requires a thread or frame. ExecutionContextRef
360/// objects can be used to initialize one of these objects to turn
361/// the weak execution context object references to the target, process,
362/// thread and frame into strong references (shared pointers) so that
363/// functions can guarantee that these objects won't go away in the
364/// middle of a function.
365///
366/// ExecutionContext objects should be used as short lived objects
367/// (typically on the stack) in order to lock down an execution context
368/// for local use and for passing down to other functions that also
369/// require specific contexts. They should NOT be used for long term
370/// storage, for long term storage use ExecutionContextRef objects.
371//----------------------------------------------------------------------
372class ExecutionContext
373{
374public:
375    //------------------------------------------------------------------
376    /// Default Constructor.
377    //------------------------------------------------------------------
378    ExecutionContext();
379
380    //------------------------------------------------------------------
381    // Copy constructor
382    //------------------------------------------------------------------
383    ExecutionContext (const ExecutionContext &rhs);
384
385    //------------------------------------------------------------------
386    // Adopt the target and optionally its current context.
387    //------------------------------------------------------------------
388    ExecutionContext (Target* t, bool fill_current_process_thread_frame = true);
389
390    //------------------------------------------------------------------
391    // Create execution contexts from shared pointers
392    //------------------------------------------------------------------
393    ExecutionContext (const lldb::TargetSP &target_sp, bool get_process);
394    ExecutionContext (const lldb::ProcessSP &process_sp);
395    ExecutionContext (const lldb::ThreadSP &thread_sp);
396    ExecutionContext (const lldb::StackFrameSP &frame_sp);
397    //------------------------------------------------------------------
398    // Create execution contexts from weak pointers
399    //------------------------------------------------------------------
400    ExecutionContext (const lldb::TargetWP &target_wp, bool get_process);
401    ExecutionContext (const lldb::ProcessWP &process_wp);
402    ExecutionContext (const lldb::ThreadWP &thread_wp);
403    ExecutionContext (const lldb::StackFrameWP &frame_wp);
404    ExecutionContext (const ExecutionContextRef &exe_ctx_ref);
405    ExecutionContext (const ExecutionContextRef *exe_ctx_ref);
406
407    // These two variants take in a locker, and grab the target, lock the API mutex into locker, then
408    // fill in the rest of the shared pointers.
409    ExecutionContext (const ExecutionContextRef &exe_ctx_ref, Mutex::Locker &locker);
410    ExecutionContext (const ExecutionContextRef *exe_ctx_ref, Mutex::Locker &locker);
411    //------------------------------------------------------------------
412    // Create execution contexts from execution context scopes
413    //------------------------------------------------------------------
414    ExecutionContext (ExecutionContextScope *exe_scope);
415    ExecutionContext (ExecutionContextScope &exe_scope);
416
417
418    ExecutionContext &
419    operator =(const ExecutionContext &rhs);
420
421    bool
422    operator ==(const ExecutionContext &rhs) const;
423
424    bool
425    operator !=(const ExecutionContext &rhs) const;
426
427    //------------------------------------------------------------------
428    /// Construct with process, thread, and frame index.
429    ///
430    /// Initialize with process \a p, thread \a t, and frame index \a f.
431    ///
432    /// @param[in] process
433    ///     The process for this execution context.
434    ///
435    /// @param[in] thread
436    ///     The thread for this execution context.
437    ///
438    /// @param[in] frame
439    ///     The frame index for this execution context.
440    //------------------------------------------------------------------
441    ExecutionContext (Process* process,
442                      Thread *thread = NULL,
443                      StackFrame * frame = NULL);
444
445
446    ~ExecutionContext();
447    //------------------------------------------------------------------
448    /// Clear the object's state.
449    ///
450    /// Sets the process and thread to NULL, and the frame index to an
451    /// invalid value.
452    //------------------------------------------------------------------
453    void
454    Clear ();
455
456    RegisterContext *
457    GetRegisterContext () const;
458
459    ExecutionContextScope *
460    GetBestExecutionContextScope () const;
461
462    uint32_t
463    GetAddressByteSize() const;
464
465    //------------------------------------------------------------------
466    /// Returns a pointer to the target object.
467    ///
468    /// The returned pointer might be NULL. Calling HasTargetScope(),
469    /// HasProcessScope(), HasThreadScope(), or HasFrameScope()
470    /// can help to pre-validate this pointer so that this accessor can
471    /// freely be used without having to check for NULL each time.
472    ///
473    /// @see ExecutionContext::HasTargetScope() const
474    /// @see ExecutionContext::HasProcessScope() const
475    /// @see ExecutionContext::HasThreadScope() const
476    /// @see ExecutionContext::HasFrameScope() const
477    //------------------------------------------------------------------
478    Target *
479    GetTargetPtr () const;
480
481    //------------------------------------------------------------------
482    /// Returns a pointer to the process object.
483    ///
484    /// The returned pointer might be NULL. Calling HasProcessScope(),
485    /// HasThreadScope(), or HasFrameScope()  can help to pre-validate
486    /// this pointer so that this accessor can freely be used without
487    /// having to check for NULL each time.
488    ///
489    /// @see ExecutionContext::HasProcessScope() const
490    /// @see ExecutionContext::HasThreadScope() const
491    /// @see ExecutionContext::HasFrameScope() const
492    //------------------------------------------------------------------
493    Process *
494    GetProcessPtr () const;
495
496    //------------------------------------------------------------------
497    /// Returns a pointer to the thread object.
498    ///
499    /// The returned pointer might be NULL. Calling HasThreadScope() or
500    /// HasFrameScope() can help to pre-validate this pointer so that
501    /// this accessor can freely be used without having to check for
502    /// NULL each time.
503    ///
504    /// @see ExecutionContext::HasThreadScope() const
505    /// @see ExecutionContext::HasFrameScope() const
506    //------------------------------------------------------------------
507    Thread *
508    GetThreadPtr () const
509    {
510        return m_thread_sp.get();
511    }
512
513    //------------------------------------------------------------------
514    /// Returns a pointer to the frame object.
515    ///
516    /// The returned pointer might be NULL. Calling HasFrameScope(),
517    /// can help to pre-validate this pointer so that this accessor can
518    /// freely be used without having to check for NULL each time.
519    ///
520    /// @see ExecutionContext::HasFrameScope() const
521    //------------------------------------------------------------------
522    StackFrame *
523    GetFramePtr () const
524    {
525        return m_frame_sp.get();
526    }
527
528    //------------------------------------------------------------------
529    /// Returns a reference to the target object.
530    ///
531    /// Clients should call HasTargetScope(), HasProcessScope(),
532    /// HasThreadScope(), or HasFrameScope() prior to calling this
533    /// function to ensure that this ExecutionContext object contains
534    /// a valid target.
535    ///
536    /// @see ExecutionContext::HasTargetScope() const
537    /// @see ExecutionContext::HasProcessScope() const
538    /// @see ExecutionContext::HasThreadScope() const
539    /// @see ExecutionContext::HasFrameScope() const
540    //------------------------------------------------------------------
541    Target &
542    GetTargetRef () const;
543
544    //------------------------------------------------------------------
545    /// Returns a reference to the process object.
546    ///
547    /// Clients should call HasProcessScope(), HasThreadScope(), or
548    /// HasFrameScope() prior to calling this  function to ensure that
549    /// this ExecutionContext object contains a valid target.
550    ///
551    /// @see ExecutionContext::HasProcessScope() const
552    /// @see ExecutionContext::HasThreadScope() const
553    /// @see ExecutionContext::HasFrameScope() const
554    //------------------------------------------------------------------
555    Process &
556    GetProcessRef () const;
557
558    //------------------------------------------------------------------
559    /// Returns a reference to the thread object.
560    ///
561    /// Clients should call HasThreadScope(), or  HasFrameScope() prior
562    /// to calling this  function to ensure that  this ExecutionContext
563    /// object contains a valid target.
564    ///
565    /// @see ExecutionContext::HasThreadScope() const
566    /// @see ExecutionContext::HasFrameScope() const
567    //------------------------------------------------------------------
568    Thread &
569    GetThreadRef () const;
570
571    //------------------------------------------------------------------
572    /// Returns a reference to the thread object.
573    ///
574    /// Clients should call HasFrameScope() prior to calling this
575    /// function to ensure that  this ExecutionContext object contains
576    /// a valid target.
577    ///
578    /// @see ExecutionContext::HasFrameScope() const
579    //------------------------------------------------------------------
580    StackFrame &
581    GetFrameRef () const;
582
583    //------------------------------------------------------------------
584    /// Get accessor to get the target shared pointer.
585    ///
586    /// The returned shared pointer is not guaranteed to be valid.
587    //------------------------------------------------------------------
588    const lldb::TargetSP &
589    GetTargetSP () const
590    {
591        return m_target_sp;
592    }
593
594    //------------------------------------------------------------------
595    /// Get accessor to get the process shared pointer.
596    ///
597    /// The returned shared pointer is not guaranteed to be valid.
598    //------------------------------------------------------------------
599    const lldb::ProcessSP &
600    GetProcessSP () const
601    {
602        return m_process_sp;
603    }
604
605    //------------------------------------------------------------------
606    /// Get accessor to get the thread shared pointer.
607    ///
608    /// The returned shared pointer is not guaranteed to be valid.
609    //------------------------------------------------------------------
610    const lldb::ThreadSP &
611    GetThreadSP () const
612    {
613        return m_thread_sp;
614    }
615
616    //------------------------------------------------------------------
617    /// Get accessor to get the frame shared pointer.
618    ///
619    /// The returned shared pointer is not guaranteed to be valid.
620    //------------------------------------------------------------------
621    const lldb::StackFrameSP &
622    GetFrameSP () const
623    {
624        return m_frame_sp;
625    }
626
627    //------------------------------------------------------------------
628    /// Set accessor to set only the target shared pointer.
629    //------------------------------------------------------------------
630    void
631    SetTargetSP (const lldb::TargetSP &target_sp);
632
633    //------------------------------------------------------------------
634    /// Set accessor to set only the process shared pointer.
635    //------------------------------------------------------------------
636    void
637    SetProcessSP (const lldb::ProcessSP &process_sp);
638
639    //------------------------------------------------------------------
640    /// Set accessor to set only the thread shared pointer.
641    //------------------------------------------------------------------
642    void
643    SetThreadSP (const lldb::ThreadSP &thread_sp);
644
645    //------------------------------------------------------------------
646    /// Set accessor to set only the frame shared pointer.
647    //------------------------------------------------------------------
648    void
649    SetFrameSP (const lldb::StackFrameSP &frame_sp);
650
651    //------------------------------------------------------------------
652    /// Set accessor to set only the target shared pointer from a target
653    /// pointer.
654    //------------------------------------------------------------------
655    void
656    SetTargetPtr (Target* target);
657
658    //------------------------------------------------------------------
659    /// Set accessor to set only the process shared pointer from a
660    /// process pointer.
661    //------------------------------------------------------------------
662    void
663    SetProcessPtr (Process *process);
664
665    //------------------------------------------------------------------
666    /// Set accessor to set only the thread shared pointer from a thread
667    /// pointer.
668    //------------------------------------------------------------------
669    void
670    SetThreadPtr (Thread *thread);
671
672    //------------------------------------------------------------------
673    /// Set accessor to set only the frame shared pointer from a frame
674    /// pointer.
675    //------------------------------------------------------------------
676    void
677    SetFramePtr (StackFrame *frame);
678
679    //------------------------------------------------------------------
680    // Set the execution context using a target shared pointer.
681    //
682    // If "target_sp" is valid, sets the target context to match and
683    // if "get_process" is true, sets the process shared pointer if
684    // the target currently has a process.
685    //------------------------------------------------------------------
686    void
687    SetContext (const lldb::TargetSP &target_sp, bool get_process);
688
689    //------------------------------------------------------------------
690    // Set the execution context using a process shared pointer.
691    //
692    // If "process_sp" is valid, then set the process and target in this
693    // context. Thread and frame contexts will be cleared.
694    // If "process_sp" is not valid, all shared pointers are reset.
695    //------------------------------------------------------------------
696    void
697    SetContext (const lldb::ProcessSP &process_sp);
698
699    //------------------------------------------------------------------
700    // Set the execution context using a thread shared pointer.
701    //
702    // If "thread_sp" is valid, then set the thread, process and target
703    // in this context. The frame context will be cleared.
704    // If "thread_sp" is not valid, all shared pointers are reset.
705    //------------------------------------------------------------------
706    void
707    SetContext (const lldb::ThreadSP &thread_sp);
708
709    //------------------------------------------------------------------
710    // Set the execution context using a frame shared pointer.
711    //
712    // If "frame_sp" is valid, then set the frame, thread, process and
713    // target in this context
714    // If "frame_sp" is not valid, all shared pointers are reset.
715    //------------------------------------------------------------------
716    void
717    SetContext (const lldb::StackFrameSP &frame_sp);
718
719    //------------------------------------------------------------------
720    /// Returns true the ExecutionContext object contains a valid
721    /// target.
722    ///
723    /// This function can be called after initializing an ExecutionContext
724    /// object, and if it returns true, calls to GetTargetPtr() and
725    /// GetTargetRef() do not need to be checked for validity.
726    //------------------------------------------------------------------
727    bool
728    HasTargetScope () const;
729
730    //------------------------------------------------------------------
731    /// Returns true the ExecutionContext object contains a valid
732    /// target and process.
733    ///
734    /// This function can be called after initializing an ExecutionContext
735    /// object, and if it returns true, calls to GetTargetPtr() and
736    /// GetTargetRef(), GetProcessPtr(), and GetProcessRef(), do not
737    /// need to be checked for validity.
738    //------------------------------------------------------------------
739    bool
740    HasProcessScope () const;
741
742    //------------------------------------------------------------------
743    /// Returns true the ExecutionContext object contains a valid
744    /// target, process, and thread.
745    ///
746    /// This function can be called after initializing an ExecutionContext
747    /// object, and if it returns true, calls to GetTargetPtr(),
748    /// GetTargetRef(), GetProcessPtr(), GetProcessRef(), GetThreadPtr(),
749    /// and GetThreadRef() do not need to be checked for validity.
750    //------------------------------------------------------------------
751    bool
752    HasThreadScope () const;
753
754    //------------------------------------------------------------------
755    /// Returns true the ExecutionContext object contains a valid
756    /// target, process, thread and frame.
757    ///
758    /// This function can be called after initializing an ExecutionContext
759    /// object, and if it returns true, calls to GetTargetPtr(),
760    /// GetTargetRef(), GetProcessPtr(), GetProcessRef(), GetThreadPtr(),
761    /// GetThreadRef(), GetFramePtr(), and GetFrameRef() do not need
762    /// to be checked for validity.
763    //------------------------------------------------------------------
764    bool
765    HasFrameScope () const;
766
767protected:
768    //------------------------------------------------------------------
769    // Member variables
770    //------------------------------------------------------------------
771    lldb::TargetSP m_target_sp;     ///< The target that owns the process/thread/frame
772    lldb::ProcessSP m_process_sp;   ///< The process that owns the thread/frame
773    lldb::ThreadSP m_thread_sp;     ///< The thread that owns the frame
774    lldb::StackFrameSP m_frame_sp;  ///< The stack frame in thread.
775};
776} // namespace lldb_private
777
778#endif  // liblldb_ExecutionContext_h_
779