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