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             {
57d9e416c0SGreg Clayton                 m_thread_wp = frame_sp->GetThread();
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()));
84d9e416c0SGreg Clayton                     if (tmp_frame_sp == frame_sp)
85b9556accSGreg Clayton                         return frame_sp;
86b9556accSGreg Clayton                 }
87b9556accSGreg Clayton                 // The original stack frame might have gone away,
88d9e416c0SGreg Clayton                 // we need to check for the frame by stack ID
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;
101d9e416c0SGreg Clayton                 m_thread_wp = frame_sp->GetThread();
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;
206d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
207d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
208d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
209d9e416c0SGreg Clayton     if (frame && target)
210af67cecdSGreg Clayton     {
211d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
212d9e416c0SGreg Clayton         sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope));
213af67cecdSGreg Clayton     }
214ceb6b139SCaroline Tice 
21569b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
216ceb6b139SCaroline Tice     if (log)
2174838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)",
218d9e416c0SGreg Clayton                      frame, resolve_scope, sb_sym_ctx.get());
219ceb6b139SCaroline Tice 
22030fdc8d8SChris Lattner     return sb_sym_ctx;
22130fdc8d8SChris Lattner }
22230fdc8d8SChris Lattner 
22330fdc8d8SChris Lattner SBModule
22430fdc8d8SChris Lattner SBFrame::GetModule () const
22530fdc8d8SChris Lattner {
22672eff18aSGreg Clayton     SBModule sb_module;
227acdbe816SGreg Clayton     ModuleSP module_sp;
228d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
229d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
230d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
231d9e416c0SGreg Clayton     if (frame && target)
232af67cecdSGreg Clayton     {
233d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
234d9e416c0SGreg Clayton         module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp;
235acdbe816SGreg Clayton         sb_module.SetSP (module_sp);
236af67cecdSGreg Clayton     }
23772eff18aSGreg Clayton 
23869b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2394838131bSGreg Clayton     if (log)
2404838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
241d9e416c0SGreg Clayton                      frame, module_sp.get());
2424838131bSGreg Clayton 
24330fdc8d8SChris Lattner     return sb_module;
24430fdc8d8SChris Lattner }
24530fdc8d8SChris Lattner 
24630fdc8d8SChris Lattner SBCompileUnit
24730fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
24830fdc8d8SChris Lattner {
24972eff18aSGreg Clayton     SBCompileUnit sb_comp_unit;
250d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
251d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
252d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
253d9e416c0SGreg Clayton     if (frame && target)
254af67cecdSGreg Clayton     {
255d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
256d9e416c0SGreg Clayton         sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
257af67cecdSGreg Clayton     }
25869b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
259ceb6b139SCaroline Tice     if (log)
2604838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBCompileUnit(%p)",
261d9e416c0SGreg Clayton                      frame, sb_comp_unit.get());
262ceb6b139SCaroline Tice 
26330fdc8d8SChris Lattner     return sb_comp_unit;
26430fdc8d8SChris Lattner }
26530fdc8d8SChris Lattner 
26630fdc8d8SChris Lattner SBFunction
26730fdc8d8SChris Lattner SBFrame::GetFunction () const
26830fdc8d8SChris Lattner {
26972eff18aSGreg Clayton     SBFunction sb_function;
270d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
271d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
272d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
273d9e416c0SGreg Clayton     if (frame && target)
274af67cecdSGreg Clayton     {
275d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
276d9e416c0SGreg Clayton         sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function);
277af67cecdSGreg Clayton     }
27869b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2794838131bSGreg Clayton     if (log)
2804838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
281d9e416c0SGreg Clayton                      frame, sb_function.get());
2824838131bSGreg Clayton 
28330fdc8d8SChris Lattner     return sb_function;
28430fdc8d8SChris Lattner }
28530fdc8d8SChris Lattner 
2863b06557eSGreg Clayton SBSymbol
2873b06557eSGreg Clayton SBFrame::GetSymbol () const
2883b06557eSGreg Clayton {
28972eff18aSGreg Clayton     SBSymbol sb_symbol;
290d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
291d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
292d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
293d9e416c0SGreg Clayton     if (frame && target)
294af67cecdSGreg Clayton     {
295d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
296d9e416c0SGreg Clayton         sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol);
297af67cecdSGreg Clayton     }
29869b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2994838131bSGreg Clayton     if (log)
3004838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
301d9e416c0SGreg Clayton                      frame, sb_symbol.get());
3023b06557eSGreg Clayton     return sb_symbol;
3033b06557eSGreg Clayton }
3043b06557eSGreg Clayton 
30530fdc8d8SChris Lattner SBBlock
30630fdc8d8SChris Lattner SBFrame::GetBlock () const
30730fdc8d8SChris Lattner {
30872eff18aSGreg Clayton     SBBlock sb_block;
309d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
310d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
311d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
312d9e416c0SGreg Clayton     if (frame && target)
313af67cecdSGreg Clayton     {
314d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
315d9e416c0SGreg Clayton         sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block);
316af67cecdSGreg Clayton     }
31769b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3184838131bSGreg Clayton     if (log)
3194838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
320d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
32130fdc8d8SChris Lattner     return sb_block;
32230fdc8d8SChris Lattner }
32330fdc8d8SChris Lattner 
32495897c6aSGreg Clayton SBBlock
32595897c6aSGreg Clayton SBFrame::GetFrameBlock () const
32695897c6aSGreg Clayton {
32772eff18aSGreg Clayton     SBBlock sb_block;
328d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
329d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
330d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
331d9e416c0SGreg Clayton     if (frame && target)
332af67cecdSGreg Clayton     {
333d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
334d9e416c0SGreg Clayton         sb_block.SetPtr(frame->GetFrameBlock ());
335af67cecdSGreg Clayton     }
33669b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3374838131bSGreg Clayton     if (log)
3384838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
339d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
34095897c6aSGreg Clayton     return sb_block;
34195897c6aSGreg Clayton }
34295897c6aSGreg Clayton 
34330fdc8d8SChris Lattner SBLineEntry
34430fdc8d8SChris Lattner SBFrame::GetLineEntry () const
34530fdc8d8SChris Lattner {
34672eff18aSGreg Clayton     SBLineEntry sb_line_entry;
347d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
348d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
349d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
350d9e416c0SGreg Clayton     if (frame && target)
351af67cecdSGreg Clayton     {
352d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
353d9e416c0SGreg Clayton         sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry);
354af67cecdSGreg Clayton     }
35569b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3564838131bSGreg Clayton     if (log)
3574838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
358d9e416c0SGreg Clayton                      frame, sb_line_entry.get());
35930fdc8d8SChris Lattner     return sb_line_entry;
36030fdc8d8SChris Lattner }
36130fdc8d8SChris Lattner 
36230fdc8d8SChris Lattner uint32_t
36330fdc8d8SChris Lattner SBFrame::GetFrameID () const
36430fdc8d8SChris Lattner {
365b9556accSGreg Clayton     uint32_t frame_idx = UINT32_MAX;
366b9556accSGreg Clayton 
367b9556accSGreg Clayton 
368d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
369d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
370d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
371d9e416c0SGreg Clayton     if (frame && target)
372d9e416c0SGreg Clayton         frame_idx = frame->GetFrameIndex ();
3734838131bSGreg Clayton 
37469b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3754838131bSGreg Clayton     if (log)
3764838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameID () => %u",
377d9e416c0SGreg Clayton                      frame, frame_idx);
3784838131bSGreg Clayton     return frame_idx;
37930fdc8d8SChris Lattner }
38030fdc8d8SChris Lattner 
38169b582faSGreg Clayton addr_t
38230fdc8d8SChris Lattner SBFrame::GetPC () const
38330fdc8d8SChris Lattner {
38469b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
385d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
386d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
387d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
388d9e416c0SGreg Clayton     if (frame && target)
389af67cecdSGreg Clayton     {
390d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
391d9e416c0SGreg Clayton         addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target);
392af67cecdSGreg Clayton     }
393ceb6b139SCaroline Tice 
39469b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
395ceb6b139SCaroline Tice     if (log)
396d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", frame, addr);
397ceb6b139SCaroline Tice 
398ceb6b139SCaroline Tice     return addr;
39930fdc8d8SChris Lattner }
40030fdc8d8SChris Lattner 
40130fdc8d8SChris Lattner bool
40269b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc)
40330fdc8d8SChris Lattner {
404ceb6b139SCaroline Tice     bool ret_val = false;
405d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
406d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
407d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
408d9e416c0SGreg Clayton     if (frame && target)
409af67cecdSGreg Clayton     {
410d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
411d9e416c0SGreg Clayton         ret_val = frame->GetRegisterContext()->SetPC (new_pc);
412af67cecdSGreg Clayton     }
413ceb6b139SCaroline Tice 
41469b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
415ceb6b139SCaroline Tice     if (log)
4164838131bSGreg Clayton         log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i",
417d9e416c0SGreg Clayton                      frame, new_pc, ret_val);
418ceb6b139SCaroline Tice 
419ceb6b139SCaroline Tice     return ret_val;
42030fdc8d8SChris Lattner }
42130fdc8d8SChris Lattner 
42269b582faSGreg Clayton addr_t
42330fdc8d8SChris Lattner SBFrame::GetSP () const
42430fdc8d8SChris Lattner {
4254838131bSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
426d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
427d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
428d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
429d9e416c0SGreg Clayton     if (frame && target)
430af67cecdSGreg Clayton     {
431d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
432d9e416c0SGreg Clayton         addr = frame->GetRegisterContext()->GetSP();
433af67cecdSGreg Clayton     }
43469b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4354838131bSGreg Clayton     if (log)
436d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", frame, addr);
4374838131bSGreg Clayton 
4384838131bSGreg Clayton     return addr;
43930fdc8d8SChris Lattner }
44030fdc8d8SChris Lattner 
44130fdc8d8SChris Lattner 
44269b582faSGreg Clayton addr_t
44330fdc8d8SChris Lattner SBFrame::GetFP () const
44430fdc8d8SChris Lattner {
44569b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
446d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
447d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
448d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
449d9e416c0SGreg Clayton     if (frame && target)
450af67cecdSGreg Clayton     {
451d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
452d9e416c0SGreg Clayton         addr = frame->GetRegisterContext()->GetFP();
453af67cecdSGreg Clayton     }
454ceb6b139SCaroline Tice 
45569b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
456ceb6b139SCaroline Tice     if (log)
457d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", frame, addr);
458ceb6b139SCaroline Tice     return addr;
45930fdc8d8SChris Lattner }
46030fdc8d8SChris Lattner 
46130fdc8d8SChris Lattner 
46230fdc8d8SChris Lattner SBAddress
46330fdc8d8SChris Lattner SBFrame::GetPCAddress () const
46430fdc8d8SChris Lattner {
46530fdc8d8SChris Lattner     SBAddress sb_addr;
466d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
467d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
468d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
469d9e416c0SGreg Clayton     if (frame && target)
470af67cecdSGreg Clayton     {
471d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
472d9e416c0SGreg Clayton         sb_addr.SetAddress (&frame->GetFrameCodeAddress());
473af67cecdSGreg Clayton     }
47469b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4754838131bSGreg Clayton     if (log)
476d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get());
47730fdc8d8SChris Lattner     return sb_addr;
47830fdc8d8SChris Lattner }
47930fdc8d8SChris Lattner 
48030fdc8d8SChris Lattner void
48130fdc8d8SChris Lattner SBFrame::Clear()
48230fdc8d8SChris Lattner {
4836611103cSGreg Clayton     m_opaque_sp.reset();
48430fdc8d8SChris Lattner }
48530fdc8d8SChris Lattner 
4867edbdfc9SGreg Clayton lldb::SBValue
4877edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path)
4887edbdfc9SGreg Clayton {
4897edbdfc9SGreg Clayton     SBValue sb_value;
490d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
491d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
492d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
493d9e416c0SGreg Clayton     if (frame && target)
4947edbdfc9SGreg Clayton     {
495d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
4967edbdfc9SGreg Clayton         sb_value = GetValueForVariablePath (var_path, use_dynamic);
4977edbdfc9SGreg Clayton     }
4987edbdfc9SGreg Clayton     return sb_value;
4997edbdfc9SGreg Clayton }
5007edbdfc9SGreg Clayton 
5017edbdfc9SGreg Clayton lldb::SBValue
5027edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic)
5037edbdfc9SGreg Clayton {
5047edbdfc9SGreg Clayton     SBValue sb_value;
505d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
506d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
507d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
508d9e416c0SGreg Clayton     if (frame && target && var_path && var_path[0])
5097edbdfc9SGreg Clayton     {
510d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
5117edbdfc9SGreg Clayton         VariableSP var_sp;
5127edbdfc9SGreg Clayton         Error error;
513d9e416c0SGreg Clayton         ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path,
5147edbdfc9SGreg Clayton                                                                           use_dynamic,
5157edbdfc9SGreg Clayton                                                                           StackFrame::eExpressionPathOptionCheckPtrVsMember,
5167edbdfc9SGreg Clayton                                                                           var_sp,
5177edbdfc9SGreg Clayton                                                                           error));
51881e871edSGreg Clayton         sb_value.SetSP(value_sp);
5197edbdfc9SGreg Clayton     }
5207edbdfc9SGreg Clayton     return sb_value;
5217edbdfc9SGreg Clayton }
5227edbdfc9SGreg Clayton 
52330fdc8d8SChris Lattner SBValue
52469b582faSGreg Clayton SBFrame::FindVariable (const char *name)
52530fdc8d8SChris Lattner {
526316d498bSGreg Clayton     SBValue value;
527d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
528d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
529d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
530d9e416c0SGreg Clayton     if (frame && target)
531316d498bSGreg Clayton     {
532d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
533316d498bSGreg Clayton         value = FindVariable (name, use_dynamic);
534316d498bSGreg Clayton     }
535316d498bSGreg Clayton     return value;
53678a685aaSJim Ingham }
53778a685aaSJim Ingham 
5387edbdfc9SGreg Clayton 
53978a685aaSJim Ingham SBValue
5402837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
54178a685aaSJim Ingham {
54269b582faSGreg Clayton     VariableSP var_sp;
54358b59f95SJim Ingham     SBValue sb_value;
54481e871edSGreg Clayton     ValueObjectSP value_sp;
545d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
546d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
547d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
548d9e416c0SGreg Clayton     if (frame && target && name && name[0])
54930fdc8d8SChris Lattner     {
55069b582faSGreg Clayton         VariableList variable_list;
551d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
552d9e416c0SGreg Clayton         SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
55330fdc8d8SChris Lattner 
55472eff18aSGreg Clayton         if (sc.block)
55530fdc8d8SChris Lattner         {
55672eff18aSGreg Clayton             const bool can_create = true;
55772eff18aSGreg Clayton             const bool get_parent_variables = true;
55872eff18aSGreg Clayton             const bool stop_if_block_is_inlined_function = true;
55972eff18aSGreg Clayton 
56072eff18aSGreg Clayton             if (sc.block->AppendVariables (can_create,
56172eff18aSGreg Clayton                                            get_parent_variables,
56272eff18aSGreg Clayton                                            stop_if_block_is_inlined_function,
56372eff18aSGreg Clayton                                            &variable_list))
56472eff18aSGreg Clayton             {
56569b582faSGreg Clayton                 var_sp = variable_list.FindVariable (ConstString(name));
56630fdc8d8SChris Lattner             }
56772eff18aSGreg Clayton         }
56830fdc8d8SChris Lattner 
5694838131bSGreg Clayton         if (var_sp)
57081e871edSGreg Clayton         {
571d9e416c0SGreg Clayton             value_sp = frame->GetValueObjectForFrameVariable(var_sp, use_dynamic);
57281e871edSGreg Clayton             sb_value.SetSP(value_sp);
57381e871edSGreg Clayton         }
5744838131bSGreg Clayton 
575316d498bSGreg Clayton     }
576316d498bSGreg Clayton 
57769b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5784838131bSGreg Clayton     if (log)
57969b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
580d9e416c0SGreg Clayton                      frame, name, value_sp.get());
5814838131bSGreg Clayton 
582dde9cff3SCaroline Tice     return sb_value;
583dde9cff3SCaroline Tice }
584dde9cff3SCaroline Tice 
58530fdc8d8SChris Lattner SBValue
58669b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type)
58730fdc8d8SChris Lattner {
588316d498bSGreg Clayton     SBValue value;
589d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
590d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
591d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
592d9e416c0SGreg Clayton     if (frame && target)
593316d498bSGreg Clayton     {
594d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
595316d498bSGreg Clayton         value = FindValue (name, value_type, use_dynamic);
596316d498bSGreg Clayton     }
597316d498bSGreg Clayton     return value;
59878a685aaSJim Ingham }
59978a685aaSJim Ingham 
60078a685aaSJim Ingham SBValue
6012837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
60278a685aaSJim Ingham {
60369b582faSGreg Clayton     SBValue sb_value;
60481e871edSGreg Clayton     ValueObjectSP value_sp;
605d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
606d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
607d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
608d9e416c0SGreg Clayton     if (frame && target && name && name[0])
60930fdc8d8SChris Lattner     {
610d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
61130fdc8d8SChris Lattner 
61269b582faSGreg Clayton         switch (value_type)
61330fdc8d8SChris Lattner         {
61469b582faSGreg Clayton         case eValueTypeVariableGlobal:      // global variable
61569b582faSGreg Clayton         case eValueTypeVariableStatic:      // static variable
61669b582faSGreg Clayton         case eValueTypeVariableArgument:    // function argument variables
61769b582faSGreg Clayton         case eValueTypeVariableLocal:       // function local variables
61869b582faSGreg Clayton             {
619d9e416c0SGreg Clayton                 VariableList *variable_list = frame->GetVariableList(true);
62072eff18aSGreg Clayton 
621d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
62272eff18aSGreg Clayton 
62372eff18aSGreg Clayton                 const bool can_create = true;
62472eff18aSGreg Clayton                 const bool get_parent_variables = true;
62572eff18aSGreg Clayton                 const bool stop_if_block_is_inlined_function = true;
62672eff18aSGreg Clayton 
62772eff18aSGreg Clayton                 if (sc.block && sc.block->AppendVariables (can_create,
62872eff18aSGreg Clayton                                                            get_parent_variables,
62972eff18aSGreg Clayton                                                            stop_if_block_is_inlined_function,
630e85d9cb8SJohnny Chen                                                            variable_list))
631beae523aSJohnny Chen                 {
63269b582faSGreg Clayton                     ConstString const_name(name);
633e85d9cb8SJohnny Chen                     const uint32_t num_variables = variable_list->GetSize();
63472eff18aSGreg Clayton                     for (uint32_t i = 0; i < num_variables; ++i)
63530fdc8d8SChris Lattner                     {
63669b582faSGreg Clayton                         VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
63769b582faSGreg Clayton                         if (variable_sp &&
63869b582faSGreg Clayton                             variable_sp->GetScope() == value_type &&
63969b582faSGreg Clayton                             variable_sp->GetName() == const_name)
640beae523aSJohnny Chen                         {
641d9e416c0SGreg Clayton                             value_sp = frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic);
64281e871edSGreg Clayton                             sb_value.SetSP (value_sp);
643beae523aSJohnny Chen                             break;
644beae523aSJohnny Chen                         }
64530fdc8d8SChris Lattner                     }
64630fdc8d8SChris Lattner                 }
64730fdc8d8SChris Lattner             }
64869b582faSGreg Clayton             break;
64969b582faSGreg Clayton 
65069b582faSGreg Clayton         case eValueTypeRegister:            // stack frame register value
65169b582faSGreg Clayton             {
652d9e416c0SGreg Clayton                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
65369b582faSGreg Clayton                 if (reg_ctx)
65469b582faSGreg Clayton                 {
65569b582faSGreg Clayton                     const uint32_t num_regs = reg_ctx->GetRegisterCount();
65669b582faSGreg Clayton                     for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
65769b582faSGreg Clayton                     {
65869b582faSGreg Clayton                         const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
65969b582faSGreg Clayton                         if (reg_info &&
66069b582faSGreg Clayton                             ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
66169b582faSGreg Clayton                              (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
66269b582faSGreg Clayton                         {
663d9e416c0SGreg Clayton                             value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
66481e871edSGreg Clayton                             sb_value.SetSP (value_sp);
66581e871edSGreg Clayton                             break;
66669b582faSGreg Clayton                         }
66769b582faSGreg Clayton                     }
66869b582faSGreg Clayton                 }
66969b582faSGreg Clayton             }
67069b582faSGreg Clayton             break;
67169b582faSGreg Clayton 
67269b582faSGreg Clayton         case eValueTypeRegisterSet:         // A collection of stack frame register values
67369b582faSGreg Clayton             {
674d9e416c0SGreg Clayton                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
67569b582faSGreg Clayton                 if (reg_ctx)
67669b582faSGreg Clayton                 {
67769b582faSGreg Clayton                     const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
67869b582faSGreg Clayton                     for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
67969b582faSGreg Clayton                     {
68069b582faSGreg Clayton                         const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
68169b582faSGreg Clayton                         if (reg_set &&
68269b582faSGreg Clayton                             ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
68369b582faSGreg Clayton                              (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
68469b582faSGreg Clayton                         {
685d9e416c0SGreg Clayton                             value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
68681e871edSGreg Clayton                             sb_value.SetSP (value_sp);
68781e871edSGreg Clayton                             break;
68869b582faSGreg Clayton                         }
68969b582faSGreg Clayton                     }
69069b582faSGreg Clayton                 }
69169b582faSGreg Clayton             }
69269b582faSGreg Clayton             break;
69369b582faSGreg Clayton 
69469b582faSGreg Clayton         case eValueTypeConstResult:         // constant result variables
69569b582faSGreg Clayton             {
69669b582faSGreg Clayton                 ConstString const_name(name);
697d9e416c0SGreg Clayton                 ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name));
69869b582faSGreg Clayton                 if (expr_var_sp)
69981e871edSGreg Clayton                 {
70081e871edSGreg Clayton                     value_sp = expr_var_sp->GetValueObject();
70181e871edSGreg Clayton                     sb_value.SetSP (value_sp);
70281e871edSGreg Clayton                 }
70369b582faSGreg Clayton             }
70469b582faSGreg Clayton             break;
70569b582faSGreg Clayton 
70669b582faSGreg Clayton         default:
70769b582faSGreg Clayton             break;
70869b582faSGreg Clayton         }
709beae523aSJohnny Chen     }
710dde9cff3SCaroline Tice 
71169b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7124838131bSGreg Clayton     if (log)
71369b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
714d9e416c0SGreg Clayton                      frame, name, value_type, value_sp.get());
7154838131bSGreg Clayton 
7164838131bSGreg Clayton 
717dde9cff3SCaroline Tice     return sb_value;
718dde9cff3SCaroline Tice }
719dde9cff3SCaroline Tice 
72030fdc8d8SChris Lattner bool
72130fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
72230fdc8d8SChris Lattner {
723b9556accSGreg Clayton     return GetFrameSP().get() == rhs.GetFrameSP().get();
72430fdc8d8SChris Lattner }
72530fdc8d8SChris Lattner 
72630fdc8d8SChris Lattner bool
72730fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
72830fdc8d8SChris Lattner {
729b9556accSGreg Clayton     return GetFrameSP().get() != rhs.GetFrameSP().get();
730481cef25SGreg Clayton }
73130fdc8d8SChris Lattner 
73230fdc8d8SChris Lattner SBThread
73330fdc8d8SChris Lattner SBFrame::GetThread () const
73430fdc8d8SChris Lattner {
73569b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
736ceb6b139SCaroline Tice 
737d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
738d9e416c0SGreg Clayton     ThreadSP thread_sp (exe_ctx.GetThreadSP());
739d9e416c0SGreg Clayton     SBThread sb_thread (thread_sp);
740ceb6b139SCaroline Tice 
741ceb6b139SCaroline Tice     if (log)
742750cd175SCaroline Tice     {
743750cd175SCaroline Tice         SBStream sstr;
744750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
745d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
746d9e416c0SGreg Clayton                      exe_ctx.GetFramePtr(),
747d9e416c0SGreg Clayton                      thread_sp.get(),
748d9e416c0SGreg Clayton                      sstr.GetData());
749750cd175SCaroline Tice     }
750ceb6b139SCaroline Tice 
75130fdc8d8SChris Lattner     return sb_thread;
75230fdc8d8SChris Lattner }
75330fdc8d8SChris Lattner 
75430fdc8d8SChris Lattner const char *
75530fdc8d8SChris Lattner SBFrame::Disassemble () const
75630fdc8d8SChris Lattner {
7574838131bSGreg Clayton     const char *disassembly = NULL;
758d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
759d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
760d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
761d9e416c0SGreg Clayton     if (frame && target)
762af67cecdSGreg Clayton     {
763d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
764d9e416c0SGreg Clayton         disassembly = frame->Disassemble();
765af67cecdSGreg Clayton     }
76669b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7674838131bSGreg Clayton 
7684838131bSGreg Clayton     if (log)
769d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly);
7704838131bSGreg Clayton 
7714838131bSGreg Clayton     return disassembly;
77230fdc8d8SChris Lattner }
77330fdc8d8SChris Lattner 
77430fdc8d8SChris Lattner 
77530fdc8d8SChris Lattner SBValueList
77630fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
77730fdc8d8SChris Lattner                        bool locals,
77830fdc8d8SChris Lattner                        bool statics,
77930fdc8d8SChris Lattner                        bool in_scope_only)
78030fdc8d8SChris Lattner {
781316d498bSGreg Clayton     SBValueList value_list;
782d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
783d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
784d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
785d9e416c0SGreg Clayton     if (frame && target)
786316d498bSGreg Clayton     {
787d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
788316d498bSGreg Clayton         value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic);
789316d498bSGreg Clayton     }
790316d498bSGreg Clayton     return value_list;
79178a685aaSJim Ingham }
79278a685aaSJim Ingham 
79378a685aaSJim Ingham SBValueList
79478a685aaSJim Ingham SBFrame::GetVariables (bool arguments,
79578a685aaSJim Ingham                        bool locals,
79678a685aaSJim Ingham                        bool statics,
79778a685aaSJim Ingham                        bool in_scope_only,
7982837b766SJim Ingham                        lldb::DynamicValueType  use_dynamic)
79978a685aaSJim Ingham {
80069b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
801ceb6b139SCaroline Tice 
802b9556accSGreg Clayton     SBValueList value_list;
803d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
804d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
805d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
806b9556accSGreg Clayton 
807ceb6b139SCaroline Tice     if (log)
8084838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
809d9e416c0SGreg Clayton                      frame,
8104838131bSGreg Clayton                      arguments,
8114838131bSGreg Clayton                      locals,
8124838131bSGreg Clayton                      statics,
8134838131bSGreg Clayton                      in_scope_only);
814ceb6b139SCaroline Tice 
815d9e416c0SGreg Clayton     if (frame && target)
81630fdc8d8SChris Lattner     {
817af67cecdSGreg Clayton 
81830fdc8d8SChris Lattner         size_t i;
819af67cecdSGreg Clayton         VariableList *variable_list = NULL;
820af67cecdSGreg Clayton         // Scope for locker
821af67cecdSGreg Clayton         {
822d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
823d9e416c0SGreg Clayton             variable_list = frame->GetVariableList(true);
824af67cecdSGreg Clayton         }
82530fdc8d8SChris Lattner         if (variable_list)
82630fdc8d8SChris Lattner         {
82730fdc8d8SChris Lattner             const size_t num_variables = variable_list->GetSize();
82830fdc8d8SChris Lattner             if (num_variables)
82930fdc8d8SChris Lattner             {
83030fdc8d8SChris Lattner                 for (i = 0; i < num_variables; ++i)
83130fdc8d8SChris Lattner                 {
83230fdc8d8SChris Lattner                     VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
83330fdc8d8SChris Lattner                     if (variable_sp)
83430fdc8d8SChris Lattner                     {
83530fdc8d8SChris Lattner                         bool add_variable = false;
83630fdc8d8SChris Lattner                         switch (variable_sp->GetScope())
83730fdc8d8SChris Lattner                         {
83830fdc8d8SChris Lattner                         case eValueTypeVariableGlobal:
83930fdc8d8SChris Lattner                         case eValueTypeVariableStatic:
84030fdc8d8SChris Lattner                             add_variable = statics;
84130fdc8d8SChris Lattner                             break;
84230fdc8d8SChris Lattner 
84330fdc8d8SChris Lattner                         case eValueTypeVariableArgument:
84430fdc8d8SChris Lattner                             add_variable = arguments;
84530fdc8d8SChris Lattner                             break;
84630fdc8d8SChris Lattner 
84730fdc8d8SChris Lattner                         case eValueTypeVariableLocal:
84830fdc8d8SChris Lattner                             add_variable = locals;
84930fdc8d8SChris Lattner                             break;
850c982c768SGreg Clayton 
851c982c768SGreg Clayton                         default:
852c982c768SGreg Clayton                             break;
85330fdc8d8SChris Lattner                         }
85430fdc8d8SChris Lattner                         if (add_variable)
85530fdc8d8SChris Lattner                         {
856d9e416c0SGreg Clayton                             if (in_scope_only && !variable_sp->IsInScope(frame))
85730fdc8d8SChris Lattner                                 continue;
85830fdc8d8SChris Lattner 
859d9e416c0SGreg Clayton                             value_list.Append(frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic));
86030fdc8d8SChris Lattner                         }
86130fdc8d8SChris Lattner                     }
86230fdc8d8SChris Lattner                 }
86330fdc8d8SChris Lattner             }
86430fdc8d8SChris Lattner         }
86530fdc8d8SChris Lattner     }
866ceb6b139SCaroline Tice 
867ceb6b139SCaroline Tice     if (log)
868ceb6b139SCaroline Tice     {
869d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame,
870750cd175SCaroline Tice                      value_list.get());
871ceb6b139SCaroline Tice     }
872ceb6b139SCaroline Tice 
87330fdc8d8SChris Lattner     return value_list;
87430fdc8d8SChris Lattner }
87530fdc8d8SChris Lattner 
87669b582faSGreg Clayton SBValueList
87730fdc8d8SChris Lattner SBFrame::GetRegisters ()
87830fdc8d8SChris Lattner {
87969b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
880ceb6b139SCaroline Tice 
88130fdc8d8SChris Lattner     SBValueList value_list;
882d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
883d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
884d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
885d9e416c0SGreg Clayton     if (frame && target)
88630fdc8d8SChris Lattner     {
887d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
888d9e416c0SGreg Clayton         RegisterContextSP reg_ctx (frame->GetRegisterContext());
88930fdc8d8SChris Lattner         if (reg_ctx)
89030fdc8d8SChris Lattner         {
89130fdc8d8SChris Lattner             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
89230fdc8d8SChris Lattner             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
89330fdc8d8SChris Lattner             {
894d9e416c0SGreg Clayton                 value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
89530fdc8d8SChris Lattner             }
89630fdc8d8SChris Lattner         }
89730fdc8d8SChris Lattner     }
898ceb6b139SCaroline Tice 
899ceb6b139SCaroline Tice     if (log)
900d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::Registers () => SBValueList(%p)", frame, value_list.get());
901ceb6b139SCaroline Tice 
90230fdc8d8SChris Lattner     return value_list;
90330fdc8d8SChris Lattner }
90430fdc8d8SChris Lattner 
905dde9cff3SCaroline Tice bool
906dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
907dde9cff3SCaroline Tice {
908da7bc7d0SGreg Clayton     Stream &strm = description.ref();
909da7bc7d0SGreg Clayton 
910d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
911d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
912d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
913d9e416c0SGreg Clayton     if (frame && target)
914dde9cff3SCaroline Tice     {
915d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
916d9e416c0SGreg Clayton         frame->DumpUsingSettingsFormat (&strm);
917dde9cff3SCaroline Tice     }
918dde9cff3SCaroline Tice     else
919da7bc7d0SGreg Clayton         strm.PutCString ("No value");
920dde9cff3SCaroline Tice 
921dde9cff3SCaroline Tice     return true;
922dde9cff3SCaroline Tice }
9231d3afba3SGreg Clayton 
92469b582faSGreg Clayton SBValue
9251d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
9261d3afba3SGreg Clayton {
927316d498bSGreg Clayton     SBValue result;
928d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
929d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
930d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
931d9e416c0SGreg Clayton     if (frame && target)
932316d498bSGreg Clayton     {
933d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
934316d498bSGreg Clayton         result = EvaluateExpression (expr, use_dynamic);
935316d498bSGreg Clayton     }
936316d498bSGreg Clayton     return result;
93778a685aaSJim Ingham }
93878a685aaSJim Ingham 
93978a685aaSJim Ingham SBValue
9402837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
94178a685aaSJim Ingham {
94269b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
9434838131bSGreg Clayton 
94469b582faSGreg Clayton     LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
945a162ebafSSean Callanan 
94625f3a3cdSJohnny Chen     ExecutionResults exe_results;
94769b582faSGreg Clayton     SBValue expr_result;
94881e871edSGreg Clayton     ValueObjectSP expr_value_sp;
9494838131bSGreg Clayton 
950d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
951d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
952d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
953b9556accSGreg Clayton     if (log)
954d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame, expr);
955b9556accSGreg Clayton 
956d9e416c0SGreg Clayton     if (frame && target)
9571d3afba3SGreg Clayton     {
958d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
959316d498bSGreg Clayton 
9601ba7c4d0SGreg Clayton 
9611ba7c4d0SGreg Clayton         StreamString frame_description;
962d9e416c0SGreg Clayton         frame->DumpUsingSettingsFormat (&frame_description);
9631ba7c4d0SGreg Clayton 
9641ba7c4d0SGreg Clayton         Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
9651ba7c4d0SGreg Clayton                                              expr, fetch_dynamic_value, frame_description.GetString().c_str());
9661ba7c4d0SGreg Clayton 
96720bb3aa5SSean Callanan         const bool coerce_to_id = false;
9688b2fe6dcSGreg Clayton         const bool unwind_on_error = true;
96992adcac9SSean Callanan         const bool keep_in_memory = false;
970322f529bSSean Callanan 
971d9e416c0SGreg Clayton         exe_results = target->EvaluateExpression (expr,
972d9e416c0SGreg Clayton                                                   frame,
9733bfdaa2aSSean Callanan                                                   eExecutionPolicyOnlyWhenNeeded,
97420bb3aa5SSean Callanan                                                   coerce_to_id,
97578a685aaSJim Ingham                                                   unwind_on_error,
97678a685aaSJim Ingham                                                   keep_in_memory,
9772837b766SJim Ingham                                                   fetch_dynamic_value,
97881e871edSGreg Clayton                                                   expr_value_sp);
97981e871edSGreg Clayton         expr_result.SetSP(expr_value_sp);
980f49e65aeSGreg Clayton         Host::SetCrashDescription (NULL);
9811d3afba3SGreg Clayton     }
9824838131bSGreg Clayton 
983*cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
984a162ebafSSean Callanan     if (expr_log)
98578a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
986fe42ac4dSGreg Clayton                          expr_result.GetValue(),
987fe42ac4dSGreg Clayton                          expr_result.GetSummary());
988a162ebafSSean Callanan 
9894838131bSGreg Clayton     if (log)
990d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
991d9e416c0SGreg Clayton                      frame,
99278a685aaSJim Ingham                      expr,
99381e871edSGreg Clayton                      expr_value_sp.get(),
99425f3a3cdSJohnny Chen                      exe_results);
995*cf7e2dc0SJason Molenda #endif
9964838131bSGreg Clayton 
997cfd1acedSGreg Clayton     return expr_result;
9981d3afba3SGreg Clayton }
999316d498bSGreg Clayton 
1000316d498bSGreg Clayton bool
1001316d498bSGreg Clayton SBFrame::IsInlined()
1002316d498bSGreg Clayton {
1003d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
1004d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1005d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1006d9e416c0SGreg Clayton     if (frame && target)
1007316d498bSGreg Clayton     {
1008d9e416c0SGreg Clayton         Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1009316d498bSGreg Clayton         if (block)
1010316d498bSGreg Clayton             return block->GetContainingInlinedBlock () != NULL;
1011316d498bSGreg Clayton     }
1012316d498bSGreg Clayton     return false;
1013316d498bSGreg Clayton }
1014316d498bSGreg Clayton 
1015316d498bSGreg Clayton const char *
1016316d498bSGreg Clayton SBFrame::GetFunctionName()
1017316d498bSGreg Clayton {
1018316d498bSGreg Clayton     const char *name = NULL;
1019d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
1020d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1021d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1022d9e416c0SGreg Clayton     if (frame && target)
1023316d498bSGreg Clayton     {
1024d9e416c0SGreg Clayton         SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1025316d498bSGreg Clayton         if (sc.block)
1026316d498bSGreg Clayton         {
1027316d498bSGreg Clayton             Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1028316d498bSGreg Clayton             if (inlined_block)
1029316d498bSGreg Clayton             {
1030316d498bSGreg Clayton                 const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1031316d498bSGreg Clayton                 name = inlined_info->GetName().AsCString();
1032316d498bSGreg Clayton             }
1033316d498bSGreg Clayton         }
1034316d498bSGreg Clayton 
1035316d498bSGreg Clayton         if (name == NULL)
1036316d498bSGreg Clayton         {
1037316d498bSGreg Clayton             if (sc.function)
1038316d498bSGreg Clayton                 name = sc.function->GetName().GetCString();
1039316d498bSGreg Clayton         }
1040316d498bSGreg Clayton 
1041316d498bSGreg Clayton         if (name == NULL)
1042316d498bSGreg Clayton         {
1043316d498bSGreg Clayton             if (sc.symbol)
1044316d498bSGreg Clayton                 name = sc.symbol->GetName().GetCString();
1045316d498bSGreg Clayton         }
1046316d498bSGreg Clayton     }
1047316d498bSGreg Clayton     return name;
1048316d498bSGreg Clayton }
1049316d498bSGreg Clayton 
1050