StackFrame.h revision f669850b51f3898020cbae8fdfd17faf4f18ba02
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    };
39    //------------------------------------------------------------------
40    // Constructors and Destructors
41    //------------------------------------------------------------------
42    StackFrame (lldb::user_id_t frame_idx,
43                lldb::user_id_t concrete_frame_idx,
44                Thread &thread,
45                lldb::addr_t cfa,
46                lldb::addr_t pc,
47                const SymbolContext *sc_ptr);
48
49    StackFrame (lldb::user_id_t frame_idx,
50                lldb::user_id_t concrete_frame_idx,
51                Thread &thread,
52                const lldb::RegisterContextSP &reg_context_sp,
53                lldb::addr_t cfa,
54                lldb::addr_t pc,
55                const SymbolContext *sc_ptr);
56
57    StackFrame (lldb::user_id_t frame_idx,
58                lldb::user_id_t concrete_frame_idx,
59                Thread &thread,
60                const lldb::RegisterContextSP &reg_context_sp,
61                lldb::addr_t cfa,
62                const Address& pc,
63                const SymbolContext *sc_ptr);
64
65    virtual ~StackFrame ();
66
67    Thread &
68    GetThread()
69    { return m_thread; }
70
71    const Thread &
72    GetThread() const
73    { return m_thread; }
74
75    StackID&
76    GetStackID();
77
78    const Address&
79    GetFrameCodeAddress();
80
81    void
82    ChangePC (lldb::addr_t pc);
83
84    const SymbolContext&
85    GetSymbolContext (uint32_t resolve_scope);
86
87    bool
88    GetFrameBaseValue(Scalar &value, Error *error_ptr);
89
90    Block *
91    GetFrameBlock ();
92
93    lldb::RegisterContextSP
94    GetRegisterContext ();
95
96    const lldb::RegisterContextSP &
97    GetRegisterContextSP () const
98    {
99        return m_reg_context_sp;
100    }
101
102    VariableList *
103    GetVariableList (bool get_file_globals);
104
105    lldb::VariableListSP
106    GetInScopeVariableList (bool get_file_globals);
107
108    // See ExpressionPathOption enumeration for "options" values
109    lldb::ValueObjectSP
110    GetValueForVariableExpressionPath (const char *var_expr,
111                                       lldb::DynamicValueType use_dynamic,
112                                       uint32_t options,
113                                       lldb::VariableSP &var_sp,
114                                       Error &error);
115
116    bool
117    HasDebugInformation ();
118
119    const char *
120    Disassemble ();
121
122    void
123    DumpUsingSettingsFormat (Stream *strm);
124
125    void
126    Dump (Stream *strm, bool show_frame_index, bool show_fullpaths);
127
128    bool
129    IsInlined ();
130
131    uint32_t
132    GetFrameIndex () const
133    {
134        return m_frame_index;
135    }
136
137    uint32_t
138    GetConcreteFrameIndex () const
139    {
140        return m_concrete_frame_index;
141    }
142
143    lldb::ValueObjectSP
144    GetValueObjectForFrameVariable (const lldb::VariableSP &variable_sp, lldb::DynamicValueType use_dynamic);
145
146    lldb::ValueObjectSP
147    TrackGlobalVariable (const lldb::VariableSP &variable_sp, lldb::DynamicValueType use_dynamic);
148
149    //------------------------------------------------------------------
150    // lldb::ExecutionContextScope pure virtual functions
151    //------------------------------------------------------------------
152    virtual Target *
153    CalculateTarget ();
154
155    virtual Process *
156    CalculateProcess ();
157
158    virtual Thread *
159    CalculateThread ();
160
161    virtual StackFrame *
162    CalculateStackFrame ();
163
164    virtual void
165    CalculateExecutionContext (ExecutionContext &exe_ctx);
166
167    lldb::StackFrameSP
168    GetSP ();
169
170    bool
171    GetStatus (Stream &strm,
172               bool show_frame_info,
173               bool show_source,
174               uint32_t source_lines_before,
175               uint32_t source_lines_after);
176
177protected:
178    friend class StackFrameList;
179
180    void
181    SetSymbolContextScope (SymbolContextScope *symbol_scope);
182
183    void
184    UpdateCurrentFrameFromPreviousFrame (StackFrame &prev_frame);
185
186    void
187    UpdatePreviousFrameFromCurrentFrame (StackFrame &curr_frame);
188
189    bool
190    HasCachedData () const;
191private:
192    //------------------------------------------------------------------
193    // For StackFrame only
194    //------------------------------------------------------------------
195    Thread &m_thread;
196    uint32_t m_frame_index;
197    uint32_t m_concrete_frame_index;
198    lldb::RegisterContextSP m_reg_context_sp;
199    StackID m_id;
200    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
201    SymbolContext m_sc;
202    Flags m_flags;
203    Scalar m_frame_base;
204    Error m_frame_base_error;
205    lldb::VariableListSP m_variable_list_sp;
206    ValueObjectList m_variable_list_value_objects;  // Value objects for each variable in m_variable_list_sp
207    StreamString m_disassembly;
208    DISALLOW_COPY_AND_ASSIGN (StackFrame);
209};
210
211} // namespace lldb_private
212
213#endif  // liblldb_StackFrame_h_
214