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 &reg_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 &reg_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