StackFrame.h revision caf798c28b23aeee54279366f46e5dee8799c558
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 ExecutionContextScope 31{ 32public: 33 enum ExpressionPathOption 34 { 35 eExpressionPathOptionCheckPtrVsMember = (1u << 0), 36 eExpressionPathOptionsNoFragileObjcIvar = (1u << 1), 37 eExpressionPathOptionsNoSyntheticChildren = (1u << 2), 38 eExpressionPathOptionsNoSyntheticArrayRange = (1u << 3) 39 }; 40 //------------------------------------------------------------------ 41 // Constructors and Destructors 42 //------------------------------------------------------------------ 43 StackFrame (lldb::user_id_t frame_idx, 44 lldb::user_id_t concrete_frame_idx, 45 Thread &thread, 46 lldb::addr_t cfa, 47 lldb::addr_t pc, 48 const SymbolContext *sc_ptr); 49 50 StackFrame (lldb::user_id_t frame_idx, 51 lldb::user_id_t concrete_frame_idx, 52 Thread &thread, 53 const lldb::RegisterContextSP ®_context_sp, 54 lldb::addr_t cfa, 55 lldb::addr_t pc, 56 const SymbolContext *sc_ptr); 57 58 StackFrame (lldb::user_id_t frame_idx, 59 lldb::user_id_t concrete_frame_idx, 60 Thread &thread, 61 const lldb::RegisterContextSP ®_context_sp, 62 lldb::addr_t cfa, 63 const Address& pc, 64 const SymbolContext *sc_ptr); 65 66 virtual ~StackFrame (); 67 68 Thread & 69 GetThread() 70 { return m_thread; } 71 72 const Thread & 73 GetThread() const 74 { return m_thread; } 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 Target * 154 CalculateTarget (); 155 156 virtual Process * 157 CalculateProcess (); 158 159 virtual Thread * 160 CalculateThread (); 161 162 virtual StackFrame * 163 CalculateStackFrame (); 164 165 virtual void 166 CalculateExecutionContext (ExecutionContext &exe_ctx); 167 168 lldb::StackFrameSP 169 GetSP (); 170 171 bool 172 GetStatus (Stream &strm, 173 bool show_frame_info, 174 bool show_source, 175 uint32_t source_lines_before, 176 uint32_t source_lines_after); 177 178protected: 179 friend class StackFrameList; 180 181 void 182 SetSymbolContextScope (SymbolContextScope *symbol_scope); 183 184 void 185 UpdateCurrentFrameFromPreviousFrame (StackFrame &prev_frame); 186 187 void 188 UpdatePreviousFrameFromCurrentFrame (StackFrame &curr_frame); 189 190 bool 191 HasCachedData () const; 192private: 193 //------------------------------------------------------------------ 194 // For StackFrame only 195 //------------------------------------------------------------------ 196 Thread &m_thread; 197 uint32_t m_frame_index; 198 uint32_t m_concrete_frame_index; 199 lldb::RegisterContextSP m_reg_context_sp; 200 StackID m_id; 201 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 202 SymbolContext m_sc; 203 Flags m_flags; 204 Scalar m_frame_base; 205 Error m_frame_base_error; 206 lldb::VariableListSP m_variable_list_sp; 207 ValueObjectList m_variable_list_value_objects; // Value objects for each variable in m_variable_list_sp 208 StreamString m_disassembly; 209 DISALLOW_COPY_AND_ASSIGN (StackFrame); 210}; 211 212} // namespace lldb_private 213 214#endif // liblldb_StackFrame_h_ 215