#ifndef liblldb_StackFrame_h_
#define liblldb_StackFrame_h_
#include "lldb/Core/Error.h"
#include "lldb/Core/Flags.h"
#include "lldb/Core/Scalar.h"
#include "lldb/Core/StreamString.h"
#include "lldb/Core/UserID.h"
#include "lldb/Core/ValueObjectList.h"
#include "lldb/Symbol/SymbolContext.h"
#include "lldb/Target/ExecutionContextScope.h"
#include "lldb/Target/StackID.h"
namespace lldb_private {
class StackFrame :
public ExecutionContextScope
{
public:
enum ExpressionPathOption
{
eExpressionPathOptionCheckPtrVsMember = (1u << 0),
eExpressionPathOptionsNoFragileObjcIvar = (1u << 1),
eExpressionPathOptionsNoSyntheticChildren = (1u << 2)
};
StackFrame (lldb::user_id_t frame_idx,
lldb::user_id_t concrete_frame_idx,
Thread &thread,
lldb::addr_t cfa,
lldb::addr_t pc,
const SymbolContext *sc_ptr);
StackFrame (lldb::user_id_t frame_idx,
lldb::user_id_t concrete_frame_idx,
Thread &thread,
const lldb::RegisterContextSP ®_context_sp,
lldb::addr_t cfa,
lldb::addr_t pc,
const SymbolContext *sc_ptr);
StackFrame (lldb::user_id_t frame_idx,
lldb::user_id_t concrete_frame_idx,
Thread &thread,
const lldb::RegisterContextSP ®_context_sp,
lldb::addr_t cfa,
const Address& pc,
const SymbolContext *sc_ptr);
virtual ~StackFrame ();
Thread &
GetThread()
{ return m_thread; }
const Thread &
GetThread() const
{ return m_thread; }
StackID&
GetStackID();
const Address&
GetFrameCodeAddress();
void
ChangePC (lldb::addr_t pc);
const SymbolContext&
GetSymbolContext (uint32_t resolve_scope);
bool
GetFrameBaseValue(Scalar &value, Error *error_ptr);
Block *
GetFrameBlock ();
lldb::RegisterContextSP
GetRegisterContext ();
const lldb::RegisterContextSP &
GetRegisterContextSP () const
{
return m_reg_context_sp;
}
VariableList *
GetVariableList (bool get_file_globals);
lldb::VariableListSP
GetInScopeVariableList (bool get_file_globals);
lldb::ValueObjectSP
GetValueForVariableExpressionPath (const char *var_expr,
lldb::DynamicValueType use_dynamic,
uint32_t options,
lldb::VariableSP &var_sp,
Error &error);
bool
HasDebugInformation ();
const char *
Disassemble ();
void
DumpUsingSettingsFormat (Stream *strm);
void
Dump (Stream *strm, bool show_frame_index, bool show_fullpaths);
bool
IsInlined ();
uint32_t
GetFrameIndex () const
{
return m_frame_index;
}
uint32_t
GetConcreteFrameIndex () const
{
return m_concrete_frame_index;
}
lldb::ValueObjectSP
GetValueObjectForFrameVariable (const lldb::VariableSP &variable_sp, lldb::DynamicValueType use_dynamic);
lldb::ValueObjectSP
TrackGlobalVariable (const lldb::VariableSP &variable_sp, lldb::DynamicValueType use_dynamic);
virtual Target *
CalculateTarget ();
virtual Process *
CalculateProcess ();
virtual Thread *
CalculateThread ();
virtual StackFrame *
CalculateStackFrame ();
virtual void
CalculateExecutionContext (ExecutionContext &exe_ctx);
lldb::StackFrameSP
GetSP ();
bool
GetStatus (Stream &strm,
bool show_frame_info,
bool show_source,
uint32_t source_lines_before,
uint32_t source_lines_after);
protected:
friend class StackFrameList;
void
SetSymbolContextScope (SymbolContextScope *symbol_scope);
void
UpdateCurrentFrameFromPreviousFrame (StackFrame &prev_frame);
void
UpdatePreviousFrameFromCurrentFrame (StackFrame &curr_frame);
bool
HasCachedData () const;
private:
Thread &m_thread;
uint32_t m_frame_index;
uint32_t m_concrete_frame_index;
lldb::RegisterContextSP m_reg_context_sp;
StackID m_id;
Address m_frame_code_addr; SymbolContext m_sc;
Flags m_flags;
Scalar m_frame_base;
Error m_frame_base_error;
lldb::VariableListSP m_variable_list_sp;
ValueObjectList m_variable_list_value_objects; StreamString m_disassembly;
DISALLOW_COPY_AND_ASSIGN (StackFrame);
};
}
#endif // liblldb_StackFrame_h_