StackFrame.h revision b3a1a2bba41281ba56a99fe64887a8a04760784c
1//===-- StackFrame.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_StackFrame_h_ 11#define liblldb_StackFrame_h_ 12 13// C Includes 14// C++ Includes 15// Other libraries and framework includes 16// Project includes 17#include "lldb/Core/Error.h" 18#include "lldb/Core/Flags.h" 19#include "lldb/Core/Scalar.h" 20#include "lldb/Core/StreamString.h" 21#include "lldb/Core/UserID.h" 22#include "lldb/Core/ValueObjectList.h" 23#include "lldb/Symbol/SymbolContext.h" 24#include "lldb/Target/ExecutionContextScope.h" 25#include "lldb/Target/StackID.h" 26 27namespace lldb_private { 28 29class StackFrame : 30 public STD_ENABLE_SHARED_FROM_THIS(StackFrame), 31 public ExecutionContextScope 32{ 33public: 34 enum ExpressionPathOption 35 { 36 eExpressionPathOptionCheckPtrVsMember = (1u << 0), 37 eExpressionPathOptionsNoFragileObjcIvar = (1u << 1), 38 eExpressionPathOptionsNoSyntheticChildren = (1u << 2), 39 eExpressionPathOptionsNoSyntheticArrayRange = (1u << 3), 40 eExpressionPathOptionsAllowDirectIVarAccess = (1u << 4) 41 }; 42 //------------------------------------------------------------------ 43 // Constructors and Destructors 44 //------------------------------------------------------------------ 45 StackFrame (const lldb::ThreadSP &thread_sp, 46 lldb::user_id_t frame_idx, 47 lldb::user_id_t concrete_frame_idx, 48 lldb::addr_t cfa, 49 lldb::addr_t pc, 50 const SymbolContext *sc_ptr); 51 52 StackFrame (const lldb::ThreadSP &thread_sp, 53 lldb::user_id_t frame_idx, 54 lldb::user_id_t concrete_frame_idx, 55 const lldb::RegisterContextSP ®_context_sp, 56 lldb::addr_t cfa, 57 lldb::addr_t pc, 58 const SymbolContext *sc_ptr); 59 60 StackFrame (const lldb::ThreadSP &thread_sp, 61 lldb::user_id_t frame_idx, 62 lldb::user_id_t concrete_frame_idx, 63 const lldb::RegisterContextSP ®_context_sp, 64 lldb::addr_t cfa, 65 const Address& pc, 66 const SymbolContext *sc_ptr); 67 68 virtual ~StackFrame (); 69 70 lldb::ThreadSP 71 GetThread () const 72 { 73 return m_thread_wp.lock(); 74 } 75 76 StackID& 77 GetStackID(); 78 79 const Address& 80 GetFrameCodeAddress(); 81 82 void 83 ChangePC (lldb::addr_t pc); 84 85 const SymbolContext& 86 GetSymbolContext (uint32_t resolve_scope); 87 88 bool 89 GetFrameBaseValue(Scalar &value, Error *error_ptr); 90 91 Block * 92 GetFrameBlock (); 93 94 lldb::RegisterContextSP 95 GetRegisterContext (); 96 97 const lldb::RegisterContextSP & 98 GetRegisterContextSP () const 99 { 100 return m_reg_context_sp; 101 } 102 103 VariableList * 104 GetVariableList (bool get_file_globals); 105 106 lldb::VariableListSP 107 GetInScopeVariableList (bool get_file_globals); 108 109 // See ExpressionPathOption enumeration for "options" values 110 lldb::ValueObjectSP 111 GetValueForVariableExpressionPath (const char *var_expr, 112 lldb::DynamicValueType use_dynamic, 113 uint32_t options, 114 lldb::VariableSP &var_sp, 115 Error &error); 116 117 bool 118 HasDebugInformation (); 119 120 const char * 121 Disassemble (); 122 123 void 124 DumpUsingSettingsFormat (Stream *strm); 125 126 void 127 Dump (Stream *strm, bool show_frame_index, bool show_fullpaths); 128 129 bool 130 IsInlined (); 131 132 uint32_t 133 GetFrameIndex () const 134 { 135 return m_frame_index; 136 } 137 138 uint32_t 139 GetConcreteFrameIndex () const 140 { 141 return m_concrete_frame_index; 142 } 143 144 lldb::ValueObjectSP 145 GetValueObjectForFrameVariable (const lldb::VariableSP &variable_sp, lldb::DynamicValueType use_dynamic); 146 147 lldb::ValueObjectSP 148 TrackGlobalVariable (const lldb::VariableSP &variable_sp, lldb::DynamicValueType use_dynamic); 149 150 //------------------------------------------------------------------ 151 // lldb::ExecutionContextScope pure virtual functions 152 //------------------------------------------------------------------ 153 virtual lldb::TargetSP 154 CalculateTarget (); 155 156 virtual lldb::ProcessSP 157 CalculateProcess (); 158 159 virtual lldb::ThreadSP 160 CalculateThread (); 161 162 virtual lldb::StackFrameSP 163 CalculateStackFrame (); 164 165 virtual void 166 CalculateExecutionContext (ExecutionContext &exe_ctx); 167 168 bool 169 GetStatus (Stream &strm, 170 bool show_frame_info, 171 bool show_source); 172 173protected: 174 friend class StackFrameList; 175 176 void 177 SetSymbolContextScope (SymbolContextScope *symbol_scope); 178 179 void 180 UpdateCurrentFrameFromPreviousFrame (StackFrame &prev_frame); 181 182 void 183 UpdatePreviousFrameFromCurrentFrame (StackFrame &curr_frame); 184 185 bool 186 HasCachedData () const; 187 188private: 189 //------------------------------------------------------------------ 190 // For StackFrame only 191 //------------------------------------------------------------------ 192 lldb::ThreadWP m_thread_wp; 193 uint32_t m_frame_index; 194 uint32_t m_concrete_frame_index; 195 lldb::RegisterContextSP m_reg_context_sp; 196 StackID m_id; 197 Address m_frame_code_addr; // The frame code address (might not be the same as the actual PC for inlined frames) as a section/offset address 198 SymbolContext m_sc; 199 Flags m_flags; 200 Scalar m_frame_base; 201 Error m_frame_base_error; 202 lldb::VariableListSP m_variable_list_sp; 203 ValueObjectList m_variable_list_value_objects; // Value objects for each variable in m_variable_list_sp 204 StreamString m_disassembly; 205 DISALLOW_COPY_AND_ASSIGN (StackFrame); 206}; 207 208} // namespace lldb_private 209 210#endif // liblldb_StackFrame_h_ 211