130fdc8d8SChris Lattner //===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
104c5de699SEli Friedman #include "lldb/API/SBFrame.h"
1130fdc8d8SChris Lattner 
1230fdc8d8SChris Lattner #include <string>
1330fdc8d8SChris Lattner #include <algorithm>
1430fdc8d8SChris Lattner 
1530fdc8d8SChris Lattner #include "lldb/lldb-types.h"
1630fdc8d8SChris Lattner 
1730fdc8d8SChris Lattner #include "lldb/Core/Address.h"
1830fdc8d8SChris Lattner #include "lldb/Core/ConstString.h"
19ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
2030fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h"
2330fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h"
24b71f3844SGreg Clayton #include "lldb/Expression/ClangUserExpression.h"
251ba7c4d0SGreg Clayton #include "lldb/Host/Host.h"
2630fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
2730fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
2830fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h"
2930fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
3030fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
3130fdc8d8SChris Lattner #include "lldb/Target/Target.h"
3230fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
3430fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h"
35b9556accSGreg Clayton #include "lldb/Target/StackID.h"
3630fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
3730fdc8d8SChris Lattner 
384c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
394c5de699SEli Friedman #include "lldb/API/SBValue.h"
404c5de699SEli Friedman #include "lldb/API/SBAddress.h"
41dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
424c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h"
434c5de699SEli Friedman #include "lldb/API/SBThread.h"
4430fdc8d8SChris Lattner 
45b9556accSGreg Clayton namespace lldb_private {
46b9556accSGreg Clayton 
47b9556accSGreg Clayton     class StackFrameImpl
48b9556accSGreg Clayton     {
49b9556accSGreg Clayton     public:
50b9556accSGreg Clayton         StackFrameImpl (const lldb::StackFrameSP &frame_sp) :
51b9556accSGreg Clayton             m_frame_wp (frame_sp),
52b9556accSGreg Clayton             m_thread_wp (),
53b9556accSGreg Clayton             m_stack_id ()
54b9556accSGreg Clayton         {
55b9556accSGreg Clayton             if (frame_sp)
56b9556accSGreg Clayton             {
57b9556accSGreg Clayton                 m_thread_wp = frame_sp->GetThread().shared_from_this();
58b9556accSGreg Clayton                 m_stack_id = frame_sp->GetStackID();
59b9556accSGreg Clayton             }
60b9556accSGreg Clayton         }
61b9556accSGreg Clayton 
62b9556accSGreg Clayton         ~StackFrameImpl()
63b9556accSGreg Clayton         {
64b9556accSGreg Clayton         }
65b9556accSGreg Clayton 
66b9556accSGreg Clayton         lldb::StackFrameSP
67b9556accSGreg Clayton         GetFrameSP ()
68b9556accSGreg Clayton         {
69b9556accSGreg Clayton             lldb::StackFrameSP frame_sp;
70b9556accSGreg Clayton             // We have a weak pointer to our thread, which might
71b9556accSGreg Clayton             // be NULL'ed out if the thread went away, so first
72b9556accSGreg Clayton             // make sure our thread is still alive.
73b9556accSGreg Clayton             lldb::ThreadSP thread_sp (m_thread_wp.lock());
74b9556accSGreg Clayton             if (thread_sp)
75b9556accSGreg Clayton             {
76b9556accSGreg Clayton                 // Our thread is still here, check if our frame
77b9556accSGreg Clayton                 // is still alive as well.
78b9556accSGreg Clayton                 frame_sp = m_frame_wp.lock();
79b9556accSGreg Clayton                 if (frame_sp)
80b9556accSGreg Clayton                 {
81b9556accSGreg Clayton                     // Our frame is still alive, make sure that our thread
82b9556accSGreg Clayton                     // still has this exact frame...
83b9556accSGreg Clayton                     lldb::StackFrameSP tmp_frame_sp (thread_sp->GetStackFrameAtIndex (frame_sp->GetFrameIndex()));
84b9556accSGreg Clayton                     if (tmp_frame_sp.get() == frame_sp.get())
85b9556accSGreg Clayton                         return frame_sp;
86b9556accSGreg Clayton                 }
87b9556accSGreg Clayton                 // The original stack frame might have gone away,
88b9556accSGreg Clayton                 // we need to check for the stac
89b9556accSGreg Clayton                 frame_sp = thread_sp->GetFrameWithStackID (m_stack_id);
90b9556accSGreg Clayton                 m_frame_wp = frame_sp;
91b9556accSGreg Clayton             }
92b9556accSGreg Clayton             return frame_sp;
93b9556accSGreg Clayton         }
94b9556accSGreg Clayton 
95b9556accSGreg Clayton         void
96b9556accSGreg Clayton         SetFrameSP (const lldb::StackFrameSP &frame_sp)
97b9556accSGreg Clayton         {
98b9556accSGreg Clayton             if (frame_sp)
99b9556accSGreg Clayton             {
100b9556accSGreg Clayton                 m_frame_wp = frame_sp;
101b9556accSGreg Clayton                 m_thread_wp = frame_sp->GetThread().shared_from_this();
102b9556accSGreg Clayton                 m_stack_id = frame_sp->GetStackID();
103b9556accSGreg Clayton             }
104b9556accSGreg Clayton             else
105b9556accSGreg Clayton             {
106b9556accSGreg Clayton                 m_frame_wp.reset();
107b9556accSGreg Clayton                 m_thread_wp.reset();
108b9556accSGreg Clayton                 m_stack_id.Clear();
109b9556accSGreg Clayton             }
110b9556accSGreg Clayton         }
111b9556accSGreg Clayton 
112b9556accSGreg Clayton     protected:
113b9556accSGreg Clayton         lldb::StackFrameWP m_frame_wp;
114b9556accSGreg Clayton         lldb::ThreadWP m_thread_wp;
115b9556accSGreg Clayton         StackID m_stack_id;
116b9556accSGreg Clayton     };
117b9556accSGreg Clayton } // namespace lldb_private
118b9556accSGreg Clayton 
11930fdc8d8SChris Lattner using namespace lldb;
12030fdc8d8SChris Lattner using namespace lldb_private;
12130fdc8d8SChris Lattner 
122b9556accSGreg Clayton 
12330fdc8d8SChris Lattner SBFrame::SBFrame () :
1246611103cSGreg Clayton     m_opaque_sp ()
12530fdc8d8SChris Lattner {
12630fdc8d8SChris Lattner }
12730fdc8d8SChris Lattner 
12869b582faSGreg Clayton SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) :
129b9556accSGreg Clayton     m_opaque_sp (new StackFrameImpl (lldb_object_sp))
13030fdc8d8SChris Lattner {
13169b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
132ceb6b139SCaroline Tice 
133ceb6b139SCaroline Tice     if (log)
134ceb6b139SCaroline Tice     {
135ceb6b139SCaroline Tice         SBStream sstr;
136ceb6b139SCaroline Tice         GetDescription (sstr);
1374838131bSGreg Clayton         log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s",
138b9556accSGreg Clayton                      lldb_object_sp.get(), lldb_object_sp.get(), sstr.GetData());
139750cd175SCaroline Tice 
140ceb6b139SCaroline Tice     }
14130fdc8d8SChris Lattner }
14230fdc8d8SChris Lattner 
143efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) :
144efabb123SGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
145efabb123SGreg Clayton {
146efabb123SGreg Clayton }
147efabb123SGreg Clayton 
148efabb123SGreg Clayton const SBFrame &
149efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs)
150efabb123SGreg Clayton {
151efabb123SGreg Clayton     if (this != &rhs)
152efabb123SGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
153efabb123SGreg Clayton     return *this;
154efabb123SGreg Clayton }
155efabb123SGreg Clayton 
15630fdc8d8SChris Lattner SBFrame::~SBFrame()
15730fdc8d8SChris Lattner {
15830fdc8d8SChris Lattner }
15930fdc8d8SChris Lattner 
160b9556accSGreg Clayton StackFrameSP
161b9556accSGreg Clayton SBFrame::GetFrameSP() const
162b9556accSGreg Clayton {
163b9556accSGreg Clayton     StackFrameImplSP impl_sp (m_opaque_sp);
164b9556accSGreg Clayton     StackFrameSP frame_sp;
165b9556accSGreg Clayton     if (impl_sp)
166b9556accSGreg Clayton         frame_sp = impl_sp->GetFrameSP();
167b9556accSGreg Clayton     return frame_sp;
168b9556accSGreg Clayton }
16930fdc8d8SChris Lattner 
17030fdc8d8SChris Lattner void
171b9556accSGreg Clayton SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp)
17230fdc8d8SChris Lattner {
173b9556accSGreg Clayton     if (lldb_object_sp)
1744838131bSGreg Clayton     {
175b9556accSGreg Clayton         if (m_opaque_sp)
176b9556accSGreg Clayton         {
177b9556accSGreg Clayton             StackFrameImplSP impl_sp (m_opaque_sp);
178b9556accSGreg Clayton             if (impl_sp)
179b9556accSGreg Clayton                 impl_sp->SetFrameSP (lldb_object_sp);
1804838131bSGreg Clayton         }
181b9556accSGreg Clayton         else
182b9556accSGreg Clayton         {
183b9556accSGreg Clayton             m_opaque_sp = StackFrameImplSP (new StackFrameImpl(lldb_object_sp));
18430fdc8d8SChris Lattner         }
185b9556accSGreg Clayton     }
186b9556accSGreg Clayton     else
187b9556accSGreg Clayton     {
188b9556accSGreg Clayton         m_opaque_sp.reset();
189b9556accSGreg Clayton     }
190b9556accSGreg Clayton }
19130fdc8d8SChris Lattner 
19230fdc8d8SChris Lattner bool
19330fdc8d8SChris Lattner SBFrame::IsValid() const
19430fdc8d8SChris Lattner {
195b9556accSGreg Clayton     StackFrameImplSP impl_sp (m_opaque_sp);
196b9556accSGreg Clayton     if (impl_sp)
197b9556accSGreg Clayton         return (impl_sp->GetFrameSP().get() != NULL);
198b9556accSGreg Clayton     return false;
19930fdc8d8SChris Lattner }
20030fdc8d8SChris Lattner 
20130fdc8d8SChris Lattner SBSymbolContext
20230fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const
20330fdc8d8SChris Lattner {
204ceb6b139SCaroline Tice 
20530fdc8d8SChris Lattner     SBSymbolContext sb_sym_ctx;
206b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
207b9556accSGreg Clayton     if (frame_sp)
208af67cecdSGreg Clayton     {
209b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
210b9556accSGreg Clayton         sb_sym_ctx.SetSymbolContext(&frame_sp->GetSymbolContext (resolve_scope));
211af67cecdSGreg Clayton     }
212ceb6b139SCaroline Tice 
21369b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
214ceb6b139SCaroline Tice     if (log)
2154838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)",
216b9556accSGreg Clayton                      frame_sp.get(), resolve_scope, sb_sym_ctx.get());
217ceb6b139SCaroline Tice 
21830fdc8d8SChris Lattner     return sb_sym_ctx;
21930fdc8d8SChris Lattner }
22030fdc8d8SChris Lattner 
22130fdc8d8SChris Lattner SBModule
22230fdc8d8SChris Lattner SBFrame::GetModule () const
22330fdc8d8SChris Lattner {
22472eff18aSGreg Clayton     SBModule sb_module;
225acdbe816SGreg Clayton     ModuleSP module_sp;
226b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
227b9556accSGreg Clayton     if (frame_sp)
228af67cecdSGreg Clayton     {
229b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
230acdbe816SGreg Clayton         module_sp = frame_sp->GetSymbolContext (eSymbolContextModule).module_sp;
231acdbe816SGreg Clayton         sb_module.SetSP (module_sp);
232af67cecdSGreg Clayton     }
23372eff18aSGreg Clayton 
23469b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2354838131bSGreg Clayton     if (log)
2364838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
237acdbe816SGreg Clayton                      frame_sp.get(), module_sp.get());
2384838131bSGreg Clayton 
23930fdc8d8SChris Lattner     return sb_module;
24030fdc8d8SChris Lattner }
24130fdc8d8SChris Lattner 
24230fdc8d8SChris Lattner SBCompileUnit
24330fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
24430fdc8d8SChris Lattner {
24572eff18aSGreg Clayton     SBCompileUnit sb_comp_unit;
246b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
247b9556accSGreg Clayton     if (frame_sp)
248af67cecdSGreg Clayton     {
249b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
250b9556accSGreg Clayton         sb_comp_unit.reset (frame_sp->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
251af67cecdSGreg Clayton     }
25269b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
253ceb6b139SCaroline Tice     if (log)
2544838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBCompileUnit(%p)",
255b9556accSGreg Clayton                      frame_sp.get(), sb_comp_unit.get());
256ceb6b139SCaroline Tice 
25730fdc8d8SChris Lattner     return sb_comp_unit;
25830fdc8d8SChris Lattner }
25930fdc8d8SChris Lattner 
26030fdc8d8SChris Lattner SBFunction
26130fdc8d8SChris Lattner SBFrame::GetFunction () const
26230fdc8d8SChris Lattner {
26372eff18aSGreg Clayton     SBFunction sb_function;
264b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
265b9556accSGreg Clayton     if (frame_sp)
266af67cecdSGreg Clayton     {
267b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
268b9556accSGreg Clayton         sb_function.reset(frame_sp->GetSymbolContext (eSymbolContextFunction).function);
269af67cecdSGreg Clayton     }
27069b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2714838131bSGreg Clayton     if (log)
2724838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
273b9556accSGreg Clayton                      frame_sp.get(), sb_function.get());
2744838131bSGreg Clayton 
27530fdc8d8SChris Lattner     return sb_function;
27630fdc8d8SChris Lattner }
27730fdc8d8SChris Lattner 
2783b06557eSGreg Clayton SBSymbol
2793b06557eSGreg Clayton SBFrame::GetSymbol () const
2803b06557eSGreg Clayton {
28172eff18aSGreg Clayton     SBSymbol sb_symbol;
282b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
283b9556accSGreg Clayton     if (frame_sp)
284af67cecdSGreg Clayton     {
285b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
286b9556accSGreg Clayton         sb_symbol.reset(frame_sp->GetSymbolContext (eSymbolContextSymbol).symbol);
287af67cecdSGreg Clayton     }
28869b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2894838131bSGreg Clayton     if (log)
2904838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
291b9556accSGreg Clayton                      frame_sp.get(), sb_symbol.get());
2923b06557eSGreg Clayton     return sb_symbol;
2933b06557eSGreg Clayton }
2943b06557eSGreg Clayton 
29530fdc8d8SChris Lattner SBBlock
29630fdc8d8SChris Lattner SBFrame::GetBlock () const
29730fdc8d8SChris Lattner {
29872eff18aSGreg Clayton     SBBlock sb_block;
299b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
300b9556accSGreg Clayton     if (frame_sp)
301af67cecdSGreg Clayton     {
302b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
303b9556accSGreg Clayton         sb_block.reset (frame_sp->GetSymbolContext (eSymbolContextBlock).block);
304af67cecdSGreg Clayton     }
30569b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3064838131bSGreg Clayton     if (log)
3074838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
308b9556accSGreg Clayton                      frame_sp.get(), sb_block.get());
30930fdc8d8SChris Lattner     return sb_block;
31030fdc8d8SChris Lattner }
31130fdc8d8SChris Lattner 
31295897c6aSGreg Clayton SBBlock
31395897c6aSGreg Clayton SBFrame::GetFrameBlock () const
31495897c6aSGreg Clayton {
31572eff18aSGreg Clayton     SBBlock sb_block;
316b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
317b9556accSGreg Clayton     if (frame_sp)
318af67cecdSGreg Clayton     {
319b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
320b9556accSGreg Clayton         sb_block.reset(frame_sp->GetFrameBlock ());
321af67cecdSGreg Clayton     }
32269b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3234838131bSGreg Clayton     if (log)
3244838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
325b9556accSGreg Clayton                      frame_sp.get(), sb_block.get());
32695897c6aSGreg Clayton     return sb_block;
32795897c6aSGreg Clayton }
32895897c6aSGreg Clayton 
32930fdc8d8SChris Lattner SBLineEntry
33030fdc8d8SChris Lattner SBFrame::GetLineEntry () const
33130fdc8d8SChris Lattner {
33272eff18aSGreg Clayton     SBLineEntry sb_line_entry;
333b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
334b9556accSGreg Clayton     if (frame_sp)
335af67cecdSGreg Clayton     {
336b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
337b9556accSGreg Clayton         sb_line_entry.SetLineEntry (frame_sp->GetSymbolContext (eSymbolContextLineEntry).line_entry);
338af67cecdSGreg Clayton     }
33969b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3404838131bSGreg Clayton     if (log)
3414838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
342b9556accSGreg Clayton                      frame_sp.get(), sb_line_entry.get());
34330fdc8d8SChris Lattner     return sb_line_entry;
34430fdc8d8SChris Lattner }
34530fdc8d8SChris Lattner 
34630fdc8d8SChris Lattner uint32_t
34730fdc8d8SChris Lattner SBFrame::GetFrameID () const
34830fdc8d8SChris Lattner {
349b9556accSGreg Clayton     uint32_t frame_idx = UINT32_MAX;
350b9556accSGreg Clayton 
351b9556accSGreg Clayton 
352b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
353b9556accSGreg Clayton     if (frame_sp)
354b9556accSGreg Clayton         frame_idx = frame_sp->GetFrameIndex ();
3554838131bSGreg Clayton 
35669b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3574838131bSGreg Clayton     if (log)
3584838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameID () => %u",
359b9556accSGreg Clayton                      frame_sp.get(), frame_idx);
3604838131bSGreg Clayton     return frame_idx;
36130fdc8d8SChris Lattner }
36230fdc8d8SChris Lattner 
36369b582faSGreg Clayton addr_t
36430fdc8d8SChris Lattner SBFrame::GetPC () const
36530fdc8d8SChris Lattner {
36669b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
367b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
368b9556accSGreg Clayton     if (frame_sp)
369af67cecdSGreg Clayton     {
370b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
371b9556accSGreg Clayton         addr = frame_sp->GetFrameCodeAddress().GetOpcodeLoadAddress (&frame_sp->GetThread().GetProcess().GetTarget());
372af67cecdSGreg Clayton     }
373ceb6b139SCaroline Tice 
37469b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
375ceb6b139SCaroline Tice     if (log)
376b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", frame_sp.get(), addr);
377ceb6b139SCaroline Tice 
378ceb6b139SCaroline Tice     return addr;
37930fdc8d8SChris Lattner }
38030fdc8d8SChris Lattner 
38130fdc8d8SChris Lattner bool
38269b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc)
38330fdc8d8SChris Lattner {
384ceb6b139SCaroline Tice     bool ret_val = false;
385b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
386b9556accSGreg Clayton     if (frame_sp)
387af67cecdSGreg Clayton     {
388b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
389b9556accSGreg Clayton         ret_val = frame_sp->GetRegisterContext()->SetPC (new_pc);
390af67cecdSGreg Clayton     }
391ceb6b139SCaroline Tice 
39269b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
393ceb6b139SCaroline Tice     if (log)
3944838131bSGreg Clayton         log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i",
395b9556accSGreg Clayton                      frame_sp.get(), new_pc, ret_val);
396ceb6b139SCaroline Tice 
397ceb6b139SCaroline Tice     return ret_val;
39830fdc8d8SChris Lattner }
39930fdc8d8SChris Lattner 
40069b582faSGreg Clayton addr_t
40130fdc8d8SChris Lattner SBFrame::GetSP () const
40230fdc8d8SChris Lattner {
4034838131bSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
404b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
405b9556accSGreg Clayton     if (frame_sp)
406af67cecdSGreg Clayton     {
407b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
408b9556accSGreg Clayton         addr = frame_sp->GetRegisterContext()->GetSP();
409af67cecdSGreg Clayton     }
41069b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4114838131bSGreg Clayton     if (log)
412b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", frame_sp.get(), addr);
4134838131bSGreg Clayton 
4144838131bSGreg Clayton     return addr;
41530fdc8d8SChris Lattner }
41630fdc8d8SChris Lattner 
41730fdc8d8SChris Lattner 
41869b582faSGreg Clayton addr_t
41930fdc8d8SChris Lattner SBFrame::GetFP () const
42030fdc8d8SChris Lattner {
42169b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
422b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
423b9556accSGreg Clayton     if (frame_sp)
424af67cecdSGreg Clayton     {
425b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
426b9556accSGreg Clayton         addr = frame_sp->GetRegisterContext()->GetFP();
427af67cecdSGreg Clayton     }
428ceb6b139SCaroline Tice 
42969b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
430ceb6b139SCaroline Tice     if (log)
431b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", frame_sp.get(), addr);
432ceb6b139SCaroline Tice     return addr;
43330fdc8d8SChris Lattner }
43430fdc8d8SChris Lattner 
43530fdc8d8SChris Lattner 
43630fdc8d8SChris Lattner SBAddress
43730fdc8d8SChris Lattner SBFrame::GetPCAddress () const
43830fdc8d8SChris Lattner {
43930fdc8d8SChris Lattner     SBAddress sb_addr;
440b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
441b9556accSGreg Clayton     if (frame_sp)
442af67cecdSGreg Clayton     {
443b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
444b9556accSGreg Clayton         sb_addr.SetAddress (&frame_sp->GetFrameCodeAddress());
445af67cecdSGreg Clayton     }
44669b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4474838131bSGreg Clayton     if (log)
448b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame_sp.get(), sb_addr.get());
44930fdc8d8SChris Lattner     return sb_addr;
45030fdc8d8SChris Lattner }
45130fdc8d8SChris Lattner 
45230fdc8d8SChris Lattner void
45330fdc8d8SChris Lattner SBFrame::Clear()
45430fdc8d8SChris Lattner {
4556611103cSGreg Clayton     m_opaque_sp.reset();
45630fdc8d8SChris Lattner }
45730fdc8d8SChris Lattner 
4587edbdfc9SGreg Clayton lldb::SBValue
4597edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path)
4607edbdfc9SGreg Clayton {
4617edbdfc9SGreg Clayton     SBValue sb_value;
4627edbdfc9SGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
4637edbdfc9SGreg Clayton     if (frame_sp)
4647edbdfc9SGreg Clayton     {
4657edbdfc9SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue();
4667edbdfc9SGreg Clayton         sb_value = GetValueForVariablePath (var_path, use_dynamic);
4677edbdfc9SGreg Clayton     }
4687edbdfc9SGreg Clayton     return sb_value;
4697edbdfc9SGreg Clayton }
4707edbdfc9SGreg Clayton 
4717edbdfc9SGreg Clayton lldb::SBValue
4727edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic)
4737edbdfc9SGreg Clayton {
4747edbdfc9SGreg Clayton     SBValue sb_value;
4757edbdfc9SGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
4767edbdfc9SGreg Clayton     if (frame_sp && var_path && var_path[0])
4777edbdfc9SGreg Clayton     {
4787edbdfc9SGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
4797edbdfc9SGreg Clayton         VariableSP var_sp;
4807edbdfc9SGreg Clayton         Error error;
4817edbdfc9SGreg Clayton         ValueObjectSP value_sp (frame_sp->GetValueForVariableExpressionPath (var_path,
4827edbdfc9SGreg Clayton                                                                              use_dynamic,
4837edbdfc9SGreg Clayton                                                                              StackFrame::eExpressionPathOptionCheckPtrVsMember,
4847edbdfc9SGreg Clayton                                                                              var_sp,
4857edbdfc9SGreg Clayton                                                                              error));
486*81e871edSGreg Clayton         sb_value.SetSP(value_sp);
4877edbdfc9SGreg Clayton     }
4887edbdfc9SGreg Clayton     return sb_value;
4897edbdfc9SGreg Clayton }
4907edbdfc9SGreg Clayton 
49130fdc8d8SChris Lattner SBValue
49269b582faSGreg Clayton SBFrame::FindVariable (const char *name)
49330fdc8d8SChris Lattner {
494316d498bSGreg Clayton     SBValue value;
495b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
496b9556accSGreg Clayton     if (frame_sp)
497316d498bSGreg Clayton     {
498b9556accSGreg Clayton         lldb::DynamicValueType  use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue();
499316d498bSGreg Clayton         value = FindVariable (name, use_dynamic);
500316d498bSGreg Clayton     }
501316d498bSGreg Clayton     return value;
50278a685aaSJim Ingham }
50378a685aaSJim Ingham 
5047edbdfc9SGreg Clayton 
50578a685aaSJim Ingham SBValue
5062837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
50778a685aaSJim Ingham {
50869b582faSGreg Clayton     VariableSP var_sp;
50958b59f95SJim Ingham     SBValue sb_value;
510*81e871edSGreg Clayton     ValueObjectSP value_sp;
511b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
512b9556accSGreg Clayton     if (frame_sp && name && name[0])
51330fdc8d8SChris Lattner     {
51469b582faSGreg Clayton         VariableList variable_list;
515b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
516b9556accSGreg Clayton         SymbolContext sc (frame_sp->GetSymbolContext (eSymbolContextBlock));
51730fdc8d8SChris Lattner 
51872eff18aSGreg Clayton         if (sc.block)
51930fdc8d8SChris Lattner         {
52072eff18aSGreg Clayton             const bool can_create = true;
52172eff18aSGreg Clayton             const bool get_parent_variables = true;
52272eff18aSGreg Clayton             const bool stop_if_block_is_inlined_function = true;
52372eff18aSGreg Clayton 
52472eff18aSGreg Clayton             if (sc.block->AppendVariables (can_create,
52572eff18aSGreg Clayton                                            get_parent_variables,
52672eff18aSGreg Clayton                                            stop_if_block_is_inlined_function,
52772eff18aSGreg Clayton                                            &variable_list))
52872eff18aSGreg Clayton             {
52969b582faSGreg Clayton                 var_sp = variable_list.FindVariable (ConstString(name));
53030fdc8d8SChris Lattner             }
53172eff18aSGreg Clayton         }
53230fdc8d8SChris Lattner 
5334838131bSGreg Clayton         if (var_sp)
534*81e871edSGreg Clayton         {
535*81e871edSGreg Clayton             value_sp = frame_sp->GetValueObjectForFrameVariable(var_sp, use_dynamic);
536*81e871edSGreg Clayton             sb_value.SetSP(value_sp);
537*81e871edSGreg Clayton         }
5384838131bSGreg Clayton 
539316d498bSGreg Clayton     }
540316d498bSGreg Clayton 
54169b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5424838131bSGreg Clayton     if (log)
54369b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
544*81e871edSGreg Clayton                      frame_sp.get(), name, value_sp.get());
5454838131bSGreg Clayton 
546dde9cff3SCaroline Tice     return sb_value;
547dde9cff3SCaroline Tice }
548dde9cff3SCaroline Tice 
54930fdc8d8SChris Lattner SBValue
55069b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type)
55130fdc8d8SChris Lattner {
552316d498bSGreg Clayton     SBValue value;
553b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
554b9556accSGreg Clayton     if (frame_sp)
555316d498bSGreg Clayton     {
556b9556accSGreg Clayton         lldb::DynamicValueType use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue();
557316d498bSGreg Clayton         value = FindValue (name, value_type, use_dynamic);
558316d498bSGreg Clayton     }
559316d498bSGreg Clayton     return value;
56078a685aaSJim Ingham }
56178a685aaSJim Ingham 
56278a685aaSJim Ingham SBValue
5632837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
56478a685aaSJim Ingham {
56569b582faSGreg Clayton     SBValue sb_value;
566*81e871edSGreg Clayton     ValueObjectSP value_sp;
567b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
568b9556accSGreg Clayton     if (frame_sp && name && name[0])
56930fdc8d8SChris Lattner     {
570b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
57130fdc8d8SChris Lattner 
57269b582faSGreg Clayton         switch (value_type)
57330fdc8d8SChris Lattner         {
57469b582faSGreg Clayton         case eValueTypeVariableGlobal:      // global variable
57569b582faSGreg Clayton         case eValueTypeVariableStatic:      // static variable
57669b582faSGreg Clayton         case eValueTypeVariableArgument:    // function argument variables
57769b582faSGreg Clayton         case eValueTypeVariableLocal:       // function local variables
57869b582faSGreg Clayton             {
579b9556accSGreg Clayton                 VariableList *variable_list = frame_sp->GetVariableList(true);
58072eff18aSGreg Clayton 
581b9556accSGreg Clayton                 SymbolContext sc (frame_sp->GetSymbolContext (eSymbolContextBlock));
58272eff18aSGreg Clayton 
58372eff18aSGreg Clayton                 const bool can_create = true;
58472eff18aSGreg Clayton                 const bool get_parent_variables = true;
58572eff18aSGreg Clayton                 const bool stop_if_block_is_inlined_function = true;
58672eff18aSGreg Clayton 
58772eff18aSGreg Clayton                 if (sc.block && sc.block->AppendVariables (can_create,
58872eff18aSGreg Clayton                                                            get_parent_variables,
58972eff18aSGreg Clayton                                                            stop_if_block_is_inlined_function,
590e85d9cb8SJohnny Chen                                                            variable_list))
591beae523aSJohnny Chen                 {
59269b582faSGreg Clayton                     ConstString const_name(name);
593e85d9cb8SJohnny Chen                     const uint32_t num_variables = variable_list->GetSize();
59472eff18aSGreg Clayton                     for (uint32_t i = 0; i < num_variables; ++i)
59530fdc8d8SChris Lattner                     {
59669b582faSGreg Clayton                         VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
59769b582faSGreg Clayton                         if (variable_sp &&
59869b582faSGreg Clayton                             variable_sp->GetScope() == value_type &&
59969b582faSGreg Clayton                             variable_sp->GetName() == const_name)
600beae523aSJohnny Chen                         {
601*81e871edSGreg Clayton                             value_sp = frame_sp->GetValueObjectForFrameVariable (variable_sp, use_dynamic);
602*81e871edSGreg Clayton                             sb_value.SetSP (value_sp);
603beae523aSJohnny Chen                             break;
604beae523aSJohnny Chen                         }
60530fdc8d8SChris Lattner                     }
60630fdc8d8SChris Lattner                 }
60730fdc8d8SChris Lattner             }
60869b582faSGreg Clayton             break;
60969b582faSGreg Clayton 
61069b582faSGreg Clayton         case eValueTypeRegister:            // stack frame register value
61169b582faSGreg Clayton             {
612b9556accSGreg Clayton                 RegisterContextSP reg_ctx (frame_sp->GetRegisterContext());
61369b582faSGreg Clayton                 if (reg_ctx)
61469b582faSGreg Clayton                 {
61569b582faSGreg Clayton                     const uint32_t num_regs = reg_ctx->GetRegisterCount();
61669b582faSGreg Clayton                     for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
61769b582faSGreg Clayton                     {
61869b582faSGreg Clayton                         const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
61969b582faSGreg Clayton                         if (reg_info &&
62069b582faSGreg Clayton                             ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
62169b582faSGreg Clayton                              (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
62269b582faSGreg Clayton                         {
623*81e871edSGreg Clayton                             value_sp = ValueObjectRegister::Create (frame_sp.get(), reg_ctx, reg_idx);
624*81e871edSGreg Clayton                             sb_value.SetSP (value_sp);
625*81e871edSGreg Clayton                             break;
62669b582faSGreg Clayton                         }
62769b582faSGreg Clayton                     }
62869b582faSGreg Clayton                 }
62969b582faSGreg Clayton             }
63069b582faSGreg Clayton             break;
63169b582faSGreg Clayton 
63269b582faSGreg Clayton         case eValueTypeRegisterSet:         // A collection of stack frame register values
63369b582faSGreg Clayton             {
634b9556accSGreg Clayton                 RegisterContextSP reg_ctx (frame_sp->GetRegisterContext());
63569b582faSGreg Clayton                 if (reg_ctx)
63669b582faSGreg Clayton                 {
63769b582faSGreg Clayton                     const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
63869b582faSGreg Clayton                     for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
63969b582faSGreg Clayton                     {
64069b582faSGreg Clayton                         const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
64169b582faSGreg Clayton                         if (reg_set &&
64269b582faSGreg Clayton                             ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
64369b582faSGreg Clayton                              (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
64469b582faSGreg Clayton                         {
645*81e871edSGreg Clayton                             value_sp = ValueObjectRegisterSet::Create (frame_sp.get(), reg_ctx, set_idx);
646*81e871edSGreg Clayton                             sb_value.SetSP (value_sp);
647*81e871edSGreg Clayton                             break;
64869b582faSGreg Clayton                         }
64969b582faSGreg Clayton                     }
65069b582faSGreg Clayton                 }
65169b582faSGreg Clayton             }
65269b582faSGreg Clayton             break;
65369b582faSGreg Clayton 
65469b582faSGreg Clayton         case eValueTypeConstResult:         // constant result variables
65569b582faSGreg Clayton             {
65669b582faSGreg Clayton                 ConstString const_name(name);
657b9556accSGreg Clayton                 ClangExpressionVariableSP expr_var_sp (frame_sp->GetThread().GetProcess().GetTarget().GetPersistentVariables().GetVariable (const_name));
65869b582faSGreg Clayton                 if (expr_var_sp)
659*81e871edSGreg Clayton                 {
660*81e871edSGreg Clayton                     value_sp = expr_var_sp->GetValueObject();
661*81e871edSGreg Clayton                     sb_value.SetSP (value_sp);
662*81e871edSGreg Clayton                 }
66369b582faSGreg Clayton             }
66469b582faSGreg Clayton             break;
66569b582faSGreg Clayton 
66669b582faSGreg Clayton         default:
66769b582faSGreg Clayton             break;
66869b582faSGreg Clayton         }
669beae523aSJohnny Chen     }
670dde9cff3SCaroline Tice 
67169b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6724838131bSGreg Clayton     if (log)
67369b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
674*81e871edSGreg Clayton                      frame_sp.get(), name, value_type, value_sp.get());
6754838131bSGreg Clayton 
6764838131bSGreg Clayton 
677dde9cff3SCaroline Tice     return sb_value;
678dde9cff3SCaroline Tice }
679dde9cff3SCaroline Tice 
68030fdc8d8SChris Lattner bool
68130fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
68230fdc8d8SChris Lattner {
683b9556accSGreg Clayton     return GetFrameSP().get() == rhs.GetFrameSP().get();
68430fdc8d8SChris Lattner }
68530fdc8d8SChris Lattner 
68630fdc8d8SChris Lattner bool
68730fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
68830fdc8d8SChris Lattner {
689b9556accSGreg Clayton     return GetFrameSP().get() != rhs.GetFrameSP().get();
690481cef25SGreg Clayton }
69130fdc8d8SChris Lattner 
69230fdc8d8SChris Lattner SBThread
69330fdc8d8SChris Lattner SBFrame::GetThread () const
69430fdc8d8SChris Lattner {
69569b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
696ceb6b139SCaroline Tice 
69772eff18aSGreg Clayton     SBThread sb_thread;
69817a6ad05SGreg Clayton     ThreadSP thread_sp;
699b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
700b9556accSGreg Clayton     if (frame_sp)
701af67cecdSGreg Clayton     {
702b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
703b9556accSGreg Clayton         thread_sp = frame_sp->GetThread().shared_from_this();
70417a6ad05SGreg Clayton         sb_thread.SetThread (thread_sp);
705af67cecdSGreg Clayton     }
706ceb6b139SCaroline Tice 
707ceb6b139SCaroline Tice     if (log)
708750cd175SCaroline Tice     {
709750cd175SCaroline Tice         SBStream sstr;
710750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
711b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", frame_sp.get(),
71217a6ad05SGreg Clayton                      thread_sp.get(), sstr.GetData());
713750cd175SCaroline Tice     }
714ceb6b139SCaroline Tice 
71530fdc8d8SChris Lattner     return sb_thread;
71630fdc8d8SChris Lattner }
71730fdc8d8SChris Lattner 
71830fdc8d8SChris Lattner const char *
71930fdc8d8SChris Lattner SBFrame::Disassemble () const
72030fdc8d8SChris Lattner {
7214838131bSGreg Clayton     const char *disassembly = NULL;
722b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
723b9556accSGreg Clayton     if (frame_sp)
724af67cecdSGreg Clayton     {
725b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
726b9556accSGreg Clayton         disassembly = frame_sp->Disassemble();
727af67cecdSGreg Clayton     }
72869b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7294838131bSGreg Clayton 
7304838131bSGreg Clayton     if (log)
731b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::Disassemble () => %s", frame_sp.get(), disassembly);
7324838131bSGreg Clayton 
7334838131bSGreg Clayton     return disassembly;
73430fdc8d8SChris Lattner }
73530fdc8d8SChris Lattner 
73630fdc8d8SChris Lattner 
73730fdc8d8SChris Lattner SBValueList
73830fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
73930fdc8d8SChris Lattner                        bool locals,
74030fdc8d8SChris Lattner                        bool statics,
74130fdc8d8SChris Lattner                        bool in_scope_only)
74230fdc8d8SChris Lattner {
743316d498bSGreg Clayton     SBValueList value_list;
744b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
745b9556accSGreg Clayton     if (frame_sp)
746316d498bSGreg Clayton     {
747b9556accSGreg Clayton         lldb::DynamicValueType use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue();
748316d498bSGreg Clayton         value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic);
749316d498bSGreg Clayton     }
750316d498bSGreg Clayton     return value_list;
75178a685aaSJim Ingham }
75278a685aaSJim Ingham 
75378a685aaSJim Ingham SBValueList
75478a685aaSJim Ingham SBFrame::GetVariables (bool arguments,
75578a685aaSJim Ingham                        bool locals,
75678a685aaSJim Ingham                        bool statics,
75778a685aaSJim Ingham                        bool in_scope_only,
7582837b766SJim Ingham                        lldb::DynamicValueType  use_dynamic)
75978a685aaSJim Ingham {
76069b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
761ceb6b139SCaroline Tice 
762b9556accSGreg Clayton     SBValueList value_list;
763b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
764b9556accSGreg Clayton 
765ceb6b139SCaroline Tice     if (log)
7664838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
767b9556accSGreg Clayton                      frame_sp.get(),
7684838131bSGreg Clayton                      arguments,
7694838131bSGreg Clayton                      locals,
7704838131bSGreg Clayton                      statics,
7714838131bSGreg Clayton                      in_scope_only);
772ceb6b139SCaroline Tice 
773b9556accSGreg Clayton     if (frame_sp)
77430fdc8d8SChris Lattner     {
775af67cecdSGreg Clayton 
77630fdc8d8SChris Lattner         size_t i;
777af67cecdSGreg Clayton         VariableList *variable_list = NULL;
778af67cecdSGreg Clayton         // Scope for locker
779af67cecdSGreg Clayton         {
780b9556accSGreg Clayton             Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
781b9556accSGreg Clayton             variable_list = frame_sp->GetVariableList(true);
782af67cecdSGreg Clayton         }
78330fdc8d8SChris Lattner         if (variable_list)
78430fdc8d8SChris Lattner         {
78530fdc8d8SChris Lattner             const size_t num_variables = variable_list->GetSize();
78630fdc8d8SChris Lattner             if (num_variables)
78730fdc8d8SChris Lattner             {
78830fdc8d8SChris Lattner                 for (i = 0; i < num_variables; ++i)
78930fdc8d8SChris Lattner                 {
79030fdc8d8SChris Lattner                     VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
79130fdc8d8SChris Lattner                     if (variable_sp)
79230fdc8d8SChris Lattner                     {
79330fdc8d8SChris Lattner                         bool add_variable = false;
79430fdc8d8SChris Lattner                         switch (variable_sp->GetScope())
79530fdc8d8SChris Lattner                         {
79630fdc8d8SChris Lattner                         case eValueTypeVariableGlobal:
79730fdc8d8SChris Lattner                         case eValueTypeVariableStatic:
79830fdc8d8SChris Lattner                             add_variable = statics;
79930fdc8d8SChris Lattner                             break;
80030fdc8d8SChris Lattner 
80130fdc8d8SChris Lattner                         case eValueTypeVariableArgument:
80230fdc8d8SChris Lattner                             add_variable = arguments;
80330fdc8d8SChris Lattner                             break;
80430fdc8d8SChris Lattner 
80530fdc8d8SChris Lattner                         case eValueTypeVariableLocal:
80630fdc8d8SChris Lattner                             add_variable = locals;
80730fdc8d8SChris Lattner                             break;
808c982c768SGreg Clayton 
809c982c768SGreg Clayton                         default:
810c982c768SGreg Clayton                             break;
81130fdc8d8SChris Lattner                         }
81230fdc8d8SChris Lattner                         if (add_variable)
81330fdc8d8SChris Lattner                         {
814b9556accSGreg Clayton                             if (in_scope_only && !variable_sp->IsInScope(frame_sp.get()))
81530fdc8d8SChris Lattner                                 continue;
81630fdc8d8SChris Lattner 
817b9556accSGreg Clayton                             value_list.Append(frame_sp->GetValueObjectForFrameVariable (variable_sp, use_dynamic));
81830fdc8d8SChris Lattner                         }
81930fdc8d8SChris Lattner                     }
82030fdc8d8SChris Lattner                 }
82130fdc8d8SChris Lattner             }
82230fdc8d8SChris Lattner         }
82330fdc8d8SChris Lattner     }
824ceb6b139SCaroline Tice 
825ceb6b139SCaroline Tice     if (log)
826ceb6b139SCaroline Tice     {
827b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame_sp.get(),
828750cd175SCaroline Tice                      value_list.get());
829ceb6b139SCaroline Tice     }
830ceb6b139SCaroline Tice 
83130fdc8d8SChris Lattner     return value_list;
83230fdc8d8SChris Lattner }
83330fdc8d8SChris Lattner 
83469b582faSGreg Clayton SBValueList
83530fdc8d8SChris Lattner SBFrame::GetRegisters ()
83630fdc8d8SChris Lattner {
83769b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
838ceb6b139SCaroline Tice 
83930fdc8d8SChris Lattner     SBValueList value_list;
840b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
841b9556accSGreg Clayton     if (frame_sp)
84230fdc8d8SChris Lattner     {
843b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
844b9556accSGreg Clayton         RegisterContextSP reg_ctx (frame_sp->GetRegisterContext());
84530fdc8d8SChris Lattner         if (reg_ctx)
84630fdc8d8SChris Lattner         {
84730fdc8d8SChris Lattner             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
84830fdc8d8SChris Lattner             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
84930fdc8d8SChris Lattner             {
850b9556accSGreg Clayton                 value_list.Append(ValueObjectRegisterSet::Create (frame_sp.get(), reg_ctx, set_idx));
85130fdc8d8SChris Lattner             }
85230fdc8d8SChris Lattner         }
85330fdc8d8SChris Lattner     }
854ceb6b139SCaroline Tice 
855ceb6b139SCaroline Tice     if (log)
856b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::Registers () => SBValueList(%p)", frame_sp.get(), value_list.get());
857ceb6b139SCaroline Tice 
85830fdc8d8SChris Lattner     return value_list;
85930fdc8d8SChris Lattner }
86030fdc8d8SChris Lattner 
861dde9cff3SCaroline Tice bool
862dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
863dde9cff3SCaroline Tice {
864da7bc7d0SGreg Clayton     Stream &strm = description.ref();
865da7bc7d0SGreg Clayton 
866b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
867b9556accSGreg Clayton     if (frame_sp)
868dde9cff3SCaroline Tice     {
869b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
870b9556accSGreg Clayton         frame_sp->DumpUsingSettingsFormat (&strm);
871dde9cff3SCaroline Tice     }
872dde9cff3SCaroline Tice     else
873da7bc7d0SGreg Clayton         strm.PutCString ("No value");
874dde9cff3SCaroline Tice 
875dde9cff3SCaroline Tice     return true;
876dde9cff3SCaroline Tice }
8771d3afba3SGreg Clayton 
87869b582faSGreg Clayton SBValue
8791d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
8801d3afba3SGreg Clayton {
881316d498bSGreg Clayton     SBValue result;
882b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
883b9556accSGreg Clayton     if (frame_sp)
884316d498bSGreg Clayton     {
885b9556accSGreg Clayton         lldb::DynamicValueType use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue();
886316d498bSGreg Clayton         result = EvaluateExpression (expr, use_dynamic);
887316d498bSGreg Clayton     }
888316d498bSGreg Clayton     return result;
88978a685aaSJim Ingham }
89078a685aaSJim Ingham 
89178a685aaSJim Ingham SBValue
8922837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
89378a685aaSJim Ingham {
89469b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
8954838131bSGreg Clayton 
89669b582faSGreg Clayton     LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
897a162ebafSSean Callanan 
89825f3a3cdSJohnny Chen     ExecutionResults exe_results;
89969b582faSGreg Clayton     SBValue expr_result;
900*81e871edSGreg Clayton     ValueObjectSP expr_value_sp;
9014838131bSGreg Clayton 
902b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
903b9556accSGreg Clayton     if (log)
904b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame_sp.get(), expr);
905b9556accSGreg Clayton 
906b9556accSGreg Clayton     if (frame_sp)
9071d3afba3SGreg Clayton     {
908b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
909316d498bSGreg Clayton 
9101ba7c4d0SGreg Clayton 
9111ba7c4d0SGreg Clayton         StreamString frame_description;
912b9556accSGreg Clayton         frame_sp->DumpUsingSettingsFormat (&frame_description);
9131ba7c4d0SGreg Clayton 
9141ba7c4d0SGreg Clayton         Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
9151ba7c4d0SGreg Clayton                                              expr, fetch_dynamic_value, frame_description.GetString().c_str());
9161ba7c4d0SGreg Clayton 
91720bb3aa5SSean Callanan         const bool coerce_to_id = false;
9188b2fe6dcSGreg Clayton         const bool unwind_on_error = true;
91992adcac9SSean Callanan         const bool keep_in_memory = false;
920322f529bSSean Callanan 
921b9556accSGreg Clayton         exe_results = frame_sp->GetThread().GetProcess().GetTarget().EvaluateExpression(expr,
922b9556accSGreg Clayton                                                                                         frame_sp.get(),
9233bfdaa2aSSean Callanan                                                                                         eExecutionPolicyOnlyWhenNeeded,
92420bb3aa5SSean Callanan                                                                                         coerce_to_id,
92578a685aaSJim Ingham                                                                                         unwind_on_error,
92678a685aaSJim Ingham                                                                                         keep_in_memory,
9272837b766SJim Ingham                                                                                         fetch_dynamic_value,
928*81e871edSGreg Clayton                                                                                         expr_value_sp);
929*81e871edSGreg Clayton         expr_result.SetSP(expr_value_sp);
930f49e65aeSGreg Clayton         Host::SetCrashDescription (NULL);
9311d3afba3SGreg Clayton     }
9324838131bSGreg Clayton 
933a162ebafSSean Callanan     if (expr_log)
93478a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
935fe42ac4dSGreg Clayton                          expr_result.GetValue(),
936fe42ac4dSGreg Clayton                          expr_result.GetSummary());
937a162ebafSSean Callanan 
9384838131bSGreg Clayton     if (log)
939b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", frame_sp.get(),
94078a685aaSJim Ingham                      expr,
941*81e871edSGreg Clayton                      expr_value_sp.get(),
94225f3a3cdSJohnny Chen                      exe_results);
9434838131bSGreg Clayton 
944cfd1acedSGreg Clayton     return expr_result;
9451d3afba3SGreg Clayton }
946316d498bSGreg Clayton 
947316d498bSGreg Clayton bool
948316d498bSGreg Clayton SBFrame::IsInlined()
949316d498bSGreg Clayton {
950b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
951b9556accSGreg Clayton     if (frame_sp)
952316d498bSGreg Clayton     {
953b9556accSGreg Clayton         Block *block = frame_sp->GetSymbolContext(eSymbolContextBlock).block;
954316d498bSGreg Clayton         if (block)
955316d498bSGreg Clayton             return block->GetContainingInlinedBlock () != NULL;
956316d498bSGreg Clayton     }
957316d498bSGreg Clayton     return false;
958316d498bSGreg Clayton }
959316d498bSGreg Clayton 
960316d498bSGreg Clayton const char *
961316d498bSGreg Clayton SBFrame::GetFunctionName()
962316d498bSGreg Clayton {
963316d498bSGreg Clayton     const char *name = NULL;
964b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
965b9556accSGreg Clayton     if (frame_sp)
966316d498bSGreg Clayton     {
967b9556accSGreg Clayton         SymbolContext sc (frame_sp->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
968316d498bSGreg Clayton         if (sc.block)
969316d498bSGreg Clayton         {
970316d498bSGreg Clayton             Block *inlined_block = sc.block->GetContainingInlinedBlock ();
971316d498bSGreg Clayton             if (inlined_block)
972316d498bSGreg Clayton             {
973316d498bSGreg Clayton                 const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
974316d498bSGreg Clayton                 name = inlined_info->GetName().AsCString();
975316d498bSGreg Clayton             }
976316d498bSGreg Clayton         }
977316d498bSGreg Clayton 
978316d498bSGreg Clayton         if (name == NULL)
979316d498bSGreg Clayton         {
980316d498bSGreg Clayton             if (sc.function)
981316d498bSGreg Clayton                 name = sc.function->GetName().GetCString();
982316d498bSGreg Clayton         }
983316d498bSGreg Clayton 
984316d498bSGreg Clayton         if (name == NULL)
985316d498bSGreg Clayton         {
986316d498bSGreg Clayton             if (sc.symbol)
987316d498bSGreg Clayton                 name = sc.symbol->GetName().GetCString();
988316d498bSGreg Clayton         }
989316d498bSGreg Clayton     }
990316d498bSGreg Clayton     return name;
991316d498bSGreg Clayton }
992316d498bSGreg Clayton 
993