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