blob: 7f3e77e49d6cfaa79e298017758386ecc8dc618b [file] [log] [blame]
//===-- ExecutionContext.h --------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
/// Execution context objects refer to objects in the execution of the
/// program that is being debugged. The consist of one or more of the
/// following objects: target, process, thread, and frame. Many objects
/// in the debugger need to track different executions contexts. For
/// example, a local function variable might have an execution context
/// that refers to a stack frame. A global or static variable might
/// refer to a target since a stack frame isn't required in order to
/// evaluate a global or static variable (a process isn't necessarily
/// needed for a global variable since we might be able to read the
/// variable value from a data section in one of the object files in
/// a target). There are two types of objects that hold onto execution
/// contexts: ExecutionContextRef and ExecutionContext. Both of these
/// objects are deascribed below.
///
/// Not all objects in an ExectionContext objects will be valid. If you want
/// to refer stronly (ExectionContext) or weakly (ExectionContextRef) to
/// a process, then only the process and target references will be valid.
/// For threads, only the thread, process and target references will be
/// filled in. For frames, all of the objects will be filled in.
///
/// These classes are designed to be used as baton objects that get passed
/// to a wide variety of functions that require execution contexts.
//===----------------------------------------------------------------------===//
#ifndef liblldb_ExecutionContext_h_
#define liblldb_ExecutionContext_h_
#include "lldb/lldb-private.h"
#include "lldb/Target/StackID.h"
namespace lldb_private {
//----------------------------------------------------------------------
/// @class ExecutionContextRef ExecutionContext.h "lldb/Target/ExecutionContext.h"
/// @brief A class that holds a weak reference to an execution context.
///
/// ExecutionContextRef objects are designed to hold onto an execution
/// context that might change over time. For example, if an object wants
/// to refer to a stack frame, it should hold onto an ExecutionContextRef
/// to a frame object. The backing object that represents the stack frame
/// might change over time and instaces of this object can track the logical
/// object that refers to a frame even if it does change.
///
/// These objects also don't keep execution objects around longer than they
/// should since they use weak pointers. For example if an object refers
/// to a stack frame and a stack frame is no longer in a thread, then a
/// ExecutionContextRef object that refers to that frame will not be able
/// to get a shared pointer to those objects since they are no longer around.
///
/// ExecutionContextRef objects can also be used as objects in classes
/// that want to track a "previous execution context". Since the weak
/// references to the execution objects (target, process, thread and frame)
/// don't keep these objects around, they are safe to keep around.
///
/// The general rule of thumb is all long lived objects that want to
/// refer to execution contexts should use ExecutionContextRef objcts.
/// The ExecutionContext class is used to temporarily get shared
/// pointers to any execution context objects that are still around
/// so they are guaranteed to exist during a function that requires the
/// objects. ExecutionContext objects should NOT be used for long term
/// storage since they will keep objects alive with extra shared pointer
/// references to these objects.
//----------------------------------------------------------------------
class ExecutionContextRef
{
public:
//------------------------------------------------------------------
/// Default Constructor.
//------------------------------------------------------------------
ExecutionContextRef();
//------------------------------------------------------------------
/// Copy Constructor.
//------------------------------------------------------------------
ExecutionContextRef (const ExecutionContextRef &rhs);
//------------------------------------------------------------------
/// Construct using an ExecutionContext object that might be NULL.
///
/// If \a exe_ctx_ptr is valid, then make weak references to any
/// valid objects in the ExecutionContext, othewise no weak
/// references to any execution context objects will be made.
//------------------------------------------------------------------
ExecutionContextRef (const ExecutionContext *exe_ctx_ptr);
//------------------------------------------------------------------
/// Construct using an ExecutionContext object.
///
/// Make weak references to any valid objects in the ExecutionContext.
//------------------------------------------------------------------
ExecutionContextRef (const ExecutionContext &exe_ctx);
//------------------------------------------------------------------
/// Assignment operator
///
/// Copy all weak refernces in \a rhs.
//------------------------------------------------------------------
ExecutionContextRef &
operator =(const ExecutionContextRef &rhs);
//------------------------------------------------------------------
/// Assignment operator from a ExecutionContext
///
/// Make weak refernces to any stringly referenced objects in \a exe_ctx.
//------------------------------------------------------------------
ExecutionContextRef &
operator =(const ExecutionContext &exe_ctx);
//------------------------------------------------------------------
/// Construct using the target and all the selected items inside of it
/// (the process and its selected thread, and the thread's selected
/// frame). If there is no selected thread, default to the first thread
/// If there is no selected frame, default to the first frame.
//------------------------------------------------------------------
ExecutionContextRef (Target *target, bool adopt_selected);
//------------------------------------------------------------------
/// Construct using an execution context scope.
///
/// If the ExecutionContextScope object is valid and refers to a frame,
/// make weak refernces too the frame, thread, process and target.
/// If the ExecutionContextScope object is valid and refers to a thread,
/// make weak refernces too the thread, process and target.
/// If the ExecutionContextScope object is valid and refers to a process,
/// make weak refernces too the process and target.
/// If the ExecutionContextScope object is valid and refers to a target,
/// make weak refernces too the target.
//------------------------------------------------------------------
ExecutionContextRef (ExecutionContextScope *exe_scope);
//------------------------------------------------------------------
/// Construct using an execution context scope.
///
/// If the ExecutionContextScope object refers to a frame,
/// make weak refernces too the frame, thread, process and target.
/// If the ExecutionContextScope object refers to a thread,
/// make weak refernces too the thread, process and target.
/// If the ExecutionContextScope object refers to a process,
/// make weak refernces too the process and target.
/// If the ExecutionContextScope object refers to a target,
/// make weak refernces too the target.
//------------------------------------------------------------------
ExecutionContextRef (ExecutionContextScope &exe_scope);
~ExecutionContextRef();
//------------------------------------------------------------------
/// Clear the object's state.
///
/// Sets the process and thread to NULL, and the frame index to an
/// invalid value.
//------------------------------------------------------------------
void
Clear ();
//------------------------------------------------------------------
/// Set accessor that creates a weak reference to the target
/// referenced in \a target_sp.
///
/// If \a target_sp is valid this object will create a weak
/// reference to that object, otherwise any previous target weak
/// reference contained in this object will be reset.
///
/// Only the weak reference to the target will be updated, no other
/// weak references will be modified. If you want this execution
/// context to make a weak reference to the target's process, use
/// the ExecutionContextRef::SetContext() functions.
///
/// @see ExecutionContextRef::SetContext(const lldb::TargetSP &, bool)
//------------------------------------------------------------------
void
SetTargetSP (const lldb::TargetSP &target_sp);
//------------------------------------------------------------------
/// Set accessor that creates a weak reference to the process
/// referenced in \a process_sp.
///
/// If \a process_sp is valid this object will create a weak
/// reference to that object, otherwise any previous process weak
/// reference contained in this object will be reset.
///
/// Only the weak reference to the process will be updated, no other
/// weak references will be modified. If you want this execution
/// context to make a weak reference to the target, use the
/// ExecutionContextRef::SetContext() functions.
///
/// @see ExecutionContextRef::SetContext(const lldb::ProcessSP &)
//------------------------------------------------------------------
void
SetProcessSP (const lldb::ProcessSP &process_sp);
//------------------------------------------------------------------
/// Set accessor that creates a weak reference to the thread
/// referenced in \a thread_sp.
///
/// If \a thread_sp is valid this object will create a weak
/// reference to that object, otherwise any previous thread weak
/// reference contained in this object will be reset.
///
/// Only the weak reference to the thread will be updated, no other
/// weak references will be modified. If you want this execution
/// context to make a weak reference to the thread's process and
/// target, use the ExecutionContextRef::SetContext() functions.
///
/// @see ExecutionContextRef::SetContext(const lldb::ThreadSP &)
//------------------------------------------------------------------
void
SetThreadSP (const lldb::ThreadSP &thread_sp);
//------------------------------------------------------------------
/// Set accessor that creates a weak reference to the frame
/// referenced in \a frame_sp.
///
/// If \a frame_sp is valid this object will create a weak
/// reference to that object, otherwise any previous frame weak
/// reference contained in this object will be reset.
///
/// Only the weak reference to the frame will be updated, no other
/// weak references will be modified. If you want this execution
/// context to make a weak reference to the frame's thread, process
/// and target, use the ExecutionContextRef::SetContext() functions.
///
/// @see ExecutionContextRef::SetContext(const lldb::StackFrameSP &)
//------------------------------------------------------------------
void
SetFrameSP (const lldb::StackFrameSP &frame_sp);
void
SetTargetPtr (Target* target, bool adopt_selected);
void
SetProcessPtr (Process *process);
void
SetThreadPtr (Thread *thread);
void
SetFramePtr (StackFrame *frame);
//------------------------------------------------------------------
/// Get accessor that creates a strong reference from the weak target
/// reference contained in this object.
///
/// @returns
/// A shared pointer to a target that is not guaranteed to be valid.
//------------------------------------------------------------------
lldb::TargetSP
GetTargetSP () const
{
return m_target_wp.lock();
}
//------------------------------------------------------------------
/// Get accessor that creates a strong reference from the weak process
/// reference contained in this object.
///
/// @returns
/// A shared pointer to a process that is not guaranteed to be valid.
//------------------------------------------------------------------
lldb::ProcessSP
GetProcessSP () const
{
return m_process_wp.lock();
}
//------------------------------------------------------------------
/// Get accessor that creates a strong reference from the weak thread
/// reference contained in this object.
///
/// @returns
/// A shared pointer to a thread that is not guaranteed to be valid.
//------------------------------------------------------------------
lldb::ThreadSP
GetThreadSP () const;
//------------------------------------------------------------------
/// Get accessor that creates a strong reference from the weak frame
/// reference contained in this object.
///
/// @returns
/// A shared pointer to a frame that is not guaranteed to be valid.
//------------------------------------------------------------------
lldb::StackFrameSP
GetFrameSP () const;
//------------------------------------------------------------------
/// Create an ExecutionContext object from this object.
///
/// Create strong references to any execution context objects that
/// are still valid. Any of the returned shared pointers in the
/// ExecutionContext objects is not guaranteed to be valid.
/// @returns
/// An execution context object that has strong references to
/// any valid weak references in this object.
//------------------------------------------------------------------
ExecutionContext
Lock () const;
//------------------------------------------------------------------
/// Returns true if this object has a weak reference to a thread.
/// The return value is only an indication of wether this object has
/// a weak reference and does not indicate wether the weak rerference
/// is valid or not.
//------------------------------------------------------------------
bool
HasThreadRef () const
{
return m_tid != LLDB_INVALID_THREAD_ID;
}
//------------------------------------------------------------------
/// Returns true if this object has a weak reference to a frame.
/// The return value is only an indication of wether this object has
/// a weak reference and does not indicate wether the weak rerference
/// is valid or not.
//------------------------------------------------------------------
bool
HasFrameRef () const
{
return m_stack_id.IsValid();
}
void
ClearThread ()
{
m_thread_wp.reset();
m_tid = LLDB_INVALID_THREAD_ID;
}
void
ClearFrame ()
{
m_stack_id.Clear();
m_frame_wp.reset();
}
protected:
//------------------------------------------------------------------
// Member variables
//------------------------------------------------------------------
lldb::TargetWP m_target_wp; ///< A weak reference to a target
lldb::ProcessWP m_process_wp; ///< A weak reference to a process
mutable lldb::ThreadWP m_thread_wp; ///< A weak reference to a thread
mutable lldb::StackFrameWP m_frame_wp; ///< A weak reference to a frame
lldb::tid_t m_tid; ///< The thread ID that this object refers to in case the backing object changes
StackID m_stack_id; ///< The stack ID that this object refers to in case the backing object changes
};
//----------------------------------------------------------------------
/// @class ExecutionContext ExecutionContext.h "lldb/Target/ExecutionContext.h"
/// @brief A class that contains an execution context.
///
/// This baton object can be passed into any function that requires
/// a context that specifies a target, process, thread and frame.
/// These objects are designed to be used for short term execution
/// context object storage while a function might be trying to evaluate
/// something that requires a thread or frame. ExecutionContextRef
/// objects can be used to initialize one of these objects to turn
/// the weak execution context object references to the target, process,
/// thread and frame into strong references (shared pointers) so that
/// functions can guarantee that these objects won't go away in the
/// middle of a function.
///
/// ExecutionContext objects should be used as short lived objects
/// (typically on the stack) in order to lock down an execution context
/// for local use and for passing down to other functions that also
/// require specific contexts. They should NOT be used for long term
/// storage, for long term storage use ExecutionContextRef objects.
//----------------------------------------------------------------------
class ExecutionContext
{
public:
//------------------------------------------------------------------
/// Default Constructor.
//------------------------------------------------------------------
ExecutionContext();
//------------------------------------------------------------------
// Copy constructor
//------------------------------------------------------------------
ExecutionContext (const ExecutionContext &rhs);
//------------------------------------------------------------------
// Adopt the target and optionally its current context.
//------------------------------------------------------------------
ExecutionContext (Target* t, bool fill_current_process_thread_frame = true);
//------------------------------------------------------------------
// Create execution contexts from shared pointers
//------------------------------------------------------------------
ExecutionContext (const lldb::TargetSP &target_sp, bool get_process);
ExecutionContext (const lldb::ProcessSP &process_sp);
ExecutionContext (const lldb::ThreadSP &thread_sp);
ExecutionContext (const lldb::StackFrameSP &frame_sp);
//------------------------------------------------------------------
// Create execution contexts from weak pointers
//------------------------------------------------------------------
ExecutionContext (const lldb::TargetWP &target_wp, bool get_process);
ExecutionContext (const lldb::ProcessWP &process_wp);
ExecutionContext (const lldb::ThreadWP &thread_wp);
ExecutionContext (const lldb::StackFrameWP &frame_wp);
ExecutionContext (const ExecutionContextRef &exe_ctx_ref);
ExecutionContext (const ExecutionContextRef *exe_ctx_ref);
//------------------------------------------------------------------
// Create execution contexts from execution context scopes
//------------------------------------------------------------------
ExecutionContext (ExecutionContextScope *exe_scope);
ExecutionContext (ExecutionContextScope &exe_scope);
ExecutionContext &
operator =(const ExecutionContext &rhs);
bool
operator ==(const ExecutionContext &rhs) const;
bool
operator !=(const ExecutionContext &rhs) const;
//------------------------------------------------------------------
/// Construct with process, thread, and frame index.
///
/// Initialize with process \a p, thread \a t, and frame index \a f.
///
/// @param[in] process
/// The process for this execution context.
///
/// @param[in] thread
/// The thread for this execution context.
///
/// @param[in] frame
/// The frame index for this execution context.
//------------------------------------------------------------------
ExecutionContext (Process* process,
Thread *thread = NULL,
StackFrame * frame = NULL);
~ExecutionContext();
//------------------------------------------------------------------
/// Clear the object's state.
///
/// Sets the process and thread to NULL, and the frame index to an
/// invalid value.
//------------------------------------------------------------------
void
Clear ();
RegisterContext *
GetRegisterContext () const;
ExecutionContextScope *
GetBestExecutionContextScope () const;
uint32_t
GetAddressByteSize() const;
//------------------------------------------------------------------
/// Returns a pointer to the target object.
///
/// The returned pointer might be NULL. Calling HasTargetScope(),
/// HasProcessScope(), HasThreadScope(), or HasFrameScope()
/// can help to pre-validate this pointer so that this accessor can
/// freely be used without having to check for NULL each time.
///
/// @see ExecutionContext::HasTargetScope() const
/// @see ExecutionContext::HasProcessScope() const
/// @see ExecutionContext::HasThreadScope() const
/// @see ExecutionContext::HasFrameScope() const
//------------------------------------------------------------------
Target *
GetTargetPtr () const;
//------------------------------------------------------------------
/// Returns a pointer to the process object.
///
/// The returned pointer might be NULL. Calling HasProcessScope(),
/// HasThreadScope(), or HasFrameScope() can help to pre-validate
/// this pointer so that this accessor can freely be used without
/// having to check for NULL each time.
///
/// @see ExecutionContext::HasProcessScope() const
/// @see ExecutionContext::HasThreadScope() const
/// @see ExecutionContext::HasFrameScope() const
//------------------------------------------------------------------
Process *
GetProcessPtr () const;
//------------------------------------------------------------------
/// Returns a pointer to the thread object.
///
/// The returned pointer might be NULL. Calling HasThreadScope() or
/// HasFrameScope() can help to pre-validate this pointer so that
/// this accessor can freely be used without having to check for
/// NULL each time.
///
/// @see ExecutionContext::HasThreadScope() const
/// @see ExecutionContext::HasFrameScope() const
//------------------------------------------------------------------
Thread *
GetThreadPtr () const
{
return m_thread_sp.get();
}
//------------------------------------------------------------------
/// Returns a pointer to the frame object.
///
/// The returned pointer might be NULL. Calling HasFrameScope(),
/// can help to pre-validate this pointer so that this accessor can
/// freely be used without having to check for NULL each time.
///
/// @see ExecutionContext::HasFrameScope() const
//------------------------------------------------------------------
StackFrame *
GetFramePtr () const
{
return m_frame_sp.get();
}
//------------------------------------------------------------------
/// Returns a reference to the target object.
///
/// Clients should call HasTargetScope(), HasProcessScope(),
/// HasThreadScope(), or HasFrameScope() prior to calling this
/// function to ensure that this ExecutionContext object contains
/// a valid target.
///
/// @see ExecutionContext::HasTargetScope() const
/// @see ExecutionContext::HasProcessScope() const
/// @see ExecutionContext::HasThreadScope() const
/// @see ExecutionContext::HasFrameScope() const
//------------------------------------------------------------------
Target &
GetTargetRef () const;
//------------------------------------------------------------------
/// Returns a reference to the process object.
///
/// Clients should call HasProcessScope(), HasThreadScope(), or
/// HasFrameScope() prior to calling this function to ensure that
/// this ExecutionContext object contains a valid target.
///
/// @see ExecutionContext::HasProcessScope() const
/// @see ExecutionContext::HasThreadScope() const
/// @see ExecutionContext::HasFrameScope() const
//------------------------------------------------------------------
Process &
GetProcessRef () const;
//------------------------------------------------------------------
/// Returns a reference to the thread object.
///
/// Clients should call HasThreadScope(), or HasFrameScope() prior
/// to calling this function to ensure that this ExecutionContext
/// object contains a valid target.
///
/// @see ExecutionContext::HasThreadScope() const
/// @see ExecutionContext::HasFrameScope() const
//------------------------------------------------------------------
Thread &
GetThreadRef () const;
//------------------------------------------------------------------
/// Returns a reference to the thread object.
///
/// Clients should call HasFrameScope() prior to calling this
/// function to ensure that this ExecutionContext object contains
/// a valid target.
///
/// @see ExecutionContext::HasFrameScope() const
//------------------------------------------------------------------
StackFrame &
GetFrameRef () const;
//------------------------------------------------------------------
/// Get accessor to get the target shared pointer.
///
/// The returned shared pointer is not guaranteed to be valid.
//------------------------------------------------------------------
const lldb::TargetSP &
GetTargetSP () const
{
return m_target_sp;
}
//------------------------------------------------------------------
/// Get accessor to get the process shared pointer.
///
/// The returned shared pointer is not guaranteed to be valid.
//------------------------------------------------------------------
const lldb::ProcessSP &
GetProcessSP () const
{
return m_process_sp;
}
//------------------------------------------------------------------
/// Get accessor to get the thread shared pointer.
///
/// The returned shared pointer is not guaranteed to be valid.
//------------------------------------------------------------------
const lldb::ThreadSP &
GetThreadSP () const
{
return m_thread_sp;
}
//------------------------------------------------------------------
/// Get accessor to get the frame shared pointer.
///
/// The returned shared pointer is not guaranteed to be valid.
//------------------------------------------------------------------
const lldb::StackFrameSP &
GetFrameSP () const
{
return m_frame_sp;
}
//------------------------------------------------------------------
/// Set accessor to set only the target shared pointer.
//------------------------------------------------------------------
void
SetTargetSP (const lldb::TargetSP &target_sp);
//------------------------------------------------------------------
/// Set accessor to set only the process shared pointer.
//------------------------------------------------------------------
void
SetProcessSP (const lldb::ProcessSP &process_sp);
//------------------------------------------------------------------
/// Set accessor to set only the thread shared pointer.
//------------------------------------------------------------------
void
SetThreadSP (const lldb::ThreadSP &thread_sp);
//------------------------------------------------------------------
/// Set accessor to set only the frame shared pointer.
//------------------------------------------------------------------
void
SetFrameSP (const lldb::StackFrameSP &frame_sp);
//------------------------------------------------------------------
/// Set accessor to set only the target shared pointer from a target
/// pointer.
//------------------------------------------------------------------
void
SetTargetPtr (Target* target);
//------------------------------------------------------------------
/// Set accessor to set only the process shared pointer from a
/// process pointer.
//------------------------------------------------------------------
void
SetProcessPtr (Process *process);
//------------------------------------------------------------------
/// Set accessor to set only the thread shared pointer from a thread
/// pointer.
//------------------------------------------------------------------
void
SetThreadPtr (Thread *thread);
//------------------------------------------------------------------
/// Set accessor to set only the frame shared pointer from a frame
/// pointer.
//------------------------------------------------------------------
void
SetFramePtr (StackFrame *frame);
//------------------------------------------------------------------
// Set the execution context using a target shared pointer.
//
// If "target_sp" is valid, sets the target context to match and
// if "get_process" is true, sets the process shared pointer if
// the target currently has a process.
//------------------------------------------------------------------
void
SetContext (const lldb::TargetSP &target_sp, bool get_process);
//------------------------------------------------------------------
// Set the execution context using a process shared pointer.
//
// If "process_sp" is valid, then set the process and target in this
// context. Thread and frame contexts will be cleared.
// If "process_sp" is not valid, all shared pointers are reset.
//------------------------------------------------------------------
void
SetContext (const lldb::ProcessSP &process_sp);
//------------------------------------------------------------------
// Set the execution context using a thread shared pointer.
//
// If "thread_sp" is valid, then set the thread, process and target
// in this context. The frame context will be cleared.
// If "thread_sp" is not valid, all shared pointers are reset.
//------------------------------------------------------------------
void
SetContext (const lldb::ThreadSP &thread_sp);
//------------------------------------------------------------------
// Set the execution context using a frame shared pointer.
//
// If "frame_sp" is valid, then set the frame, thread, process and
// target in this context
// If "frame_sp" is not valid, all shared pointers are reset.
//------------------------------------------------------------------
void
SetContext (const lldb::StackFrameSP &frame_sp);
//------------------------------------------------------------------
/// Returns true the ExecutionContext object contains a valid
/// target.
///
/// This function can be called after initializing an ExecutionContext
/// object, and if it returns true, calls to GetTargetPtr() and
/// GetTargetRef() do not need to be checked for validity.
//------------------------------------------------------------------
bool
HasTargetScope () const
{
return m_target_sp;
}
//------------------------------------------------------------------
/// Returns true the ExecutionContext object contains a valid
/// target and process.
///
/// This function can be called after initializing an ExecutionContext
/// object, and if it returns true, calls to GetTargetPtr() and
/// GetTargetRef(), GetProcessPtr(), and GetProcessRef(), do not
/// need to be checked for validity.
//------------------------------------------------------------------
bool
HasProcessScope () const
{
return m_target_sp && m_process_sp;
}
//------------------------------------------------------------------
/// Returns true the ExecutionContext object contains a valid
/// target, process, and thread.
///
/// This function can be called after initializing an ExecutionContext
/// object, and if it returns true, calls to GetTargetPtr(),
/// GetTargetRef(), GetProcessPtr(), GetProcessRef(), GetThreadPtr(),
/// and GetThreadRef() do not need to be checked for validity.
//------------------------------------------------------------------
bool
HasThreadScope () const
{
return m_target_sp && m_process_sp && m_thread_sp;
}
//------------------------------------------------------------------
/// Returns true the ExecutionContext object contains a valid
/// target, process, thread and frame.
///
/// This function can be called after initializing an ExecutionContext
/// object, and if it returns true, calls to GetTargetPtr(),
/// GetTargetRef(), GetProcessPtr(), GetProcessRef(), GetThreadPtr(),
/// GetThreadRef(), GetFramePtr(), and GetFrameRef() do not need
/// to be checked for validity.
//------------------------------------------------------------------
bool
HasFrameScope () const
{
return m_target_sp && m_process_sp && m_thread_sp && m_frame_sp;
}
protected:
//------------------------------------------------------------------
// Member variables
//------------------------------------------------------------------
lldb::TargetSP m_target_sp; ///< The target that owns the process/thread/frame
lldb::ProcessSP m_process_sp; ///< The process that owns the thread/frame
lldb::ThreadSP m_thread_sp; ///< The thread that owns the frame
lldb::StackFrameSP m_frame_sp; ///< The stack frame in thread.
};
} // namespace lldb_private
#endif // liblldb_ExecutionContext_h_