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
721*35e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const
722*35e2ab60SJohnny Chen {
723*35e2ab60SJohnny Chen     lldb::StackFrameSP this_sp = GetFrameSP();
724*35e2ab60SJohnny Chen     lldb::StackFrameSP that_sp = that.GetFrameSP();
725*35e2ab60SJohnny Chen     return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
726*35e2ab60SJohnny Chen }
727*35e2ab60SJohnny Chen 
728*35e2ab60SJohnny Chen bool
72930fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
73030fdc8d8SChris Lattner {
731*35e2ab60SJohnny Chen     return IsEqual(rhs);
73230fdc8d8SChris Lattner }
73330fdc8d8SChris Lattner 
73430fdc8d8SChris Lattner bool
73530fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
73630fdc8d8SChris Lattner {
737*35e2ab60SJohnny Chen     return !IsEqual(rhs);
738481cef25SGreg Clayton }
73930fdc8d8SChris Lattner 
74030fdc8d8SChris Lattner SBThread
74130fdc8d8SChris Lattner SBFrame::GetThread () const
74230fdc8d8SChris Lattner {
74369b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
744ceb6b139SCaroline Tice 
745d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
746d9e416c0SGreg Clayton     ThreadSP thread_sp (exe_ctx.GetThreadSP());
747d9e416c0SGreg Clayton     SBThread sb_thread (thread_sp);
748ceb6b139SCaroline Tice 
749ceb6b139SCaroline Tice     if (log)
750750cd175SCaroline Tice     {
751750cd175SCaroline Tice         SBStream sstr;
752750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
753d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
754d9e416c0SGreg Clayton                      exe_ctx.GetFramePtr(),
755d9e416c0SGreg Clayton                      thread_sp.get(),
756d9e416c0SGreg Clayton                      sstr.GetData());
757750cd175SCaroline Tice     }
758ceb6b139SCaroline Tice 
75930fdc8d8SChris Lattner     return sb_thread;
76030fdc8d8SChris Lattner }
76130fdc8d8SChris Lattner 
76230fdc8d8SChris Lattner const char *
76330fdc8d8SChris Lattner SBFrame::Disassemble () const
76430fdc8d8SChris Lattner {
7654838131bSGreg Clayton     const char *disassembly = NULL;
766d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
767d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
768d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
769d9e416c0SGreg Clayton     if (frame && target)
770af67cecdSGreg Clayton     {
771d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
772d9e416c0SGreg Clayton         disassembly = frame->Disassemble();
773af67cecdSGreg Clayton     }
77469b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
7754838131bSGreg Clayton 
7764838131bSGreg Clayton     if (log)
777d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly);
7784838131bSGreg Clayton 
7794838131bSGreg Clayton     return disassembly;
78030fdc8d8SChris Lattner }
78130fdc8d8SChris Lattner 
78230fdc8d8SChris Lattner 
78330fdc8d8SChris Lattner SBValueList
78430fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
78530fdc8d8SChris Lattner                        bool locals,
78630fdc8d8SChris Lattner                        bool statics,
78730fdc8d8SChris Lattner                        bool in_scope_only)
78830fdc8d8SChris Lattner {
789316d498bSGreg Clayton     SBValueList value_list;
790d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
791d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
792d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
793d9e416c0SGreg Clayton     if (frame && target)
794316d498bSGreg Clayton     {
795d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
796316d498bSGreg Clayton         value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic);
797316d498bSGreg Clayton     }
798316d498bSGreg Clayton     return value_list;
79978a685aaSJim Ingham }
80078a685aaSJim Ingham 
80178a685aaSJim Ingham SBValueList
80278a685aaSJim Ingham SBFrame::GetVariables (bool arguments,
80378a685aaSJim Ingham                        bool locals,
80478a685aaSJim Ingham                        bool statics,
80578a685aaSJim Ingham                        bool in_scope_only,
8062837b766SJim Ingham                        lldb::DynamicValueType  use_dynamic)
80778a685aaSJim Ingham {
80869b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
809ceb6b139SCaroline Tice 
810b9556accSGreg Clayton     SBValueList value_list;
811d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
812d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
813d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
814b9556accSGreg Clayton 
815ceb6b139SCaroline Tice     if (log)
8164838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
817d9e416c0SGreg Clayton                      frame,
8184838131bSGreg Clayton                      arguments,
8194838131bSGreg Clayton                      locals,
8204838131bSGreg Clayton                      statics,
8214838131bSGreg Clayton                      in_scope_only);
822ceb6b139SCaroline Tice 
823d9e416c0SGreg Clayton     if (frame && target)
82430fdc8d8SChris Lattner     {
825af67cecdSGreg Clayton 
82630fdc8d8SChris Lattner         size_t i;
827af67cecdSGreg Clayton         VariableList *variable_list = NULL;
828af67cecdSGreg Clayton         // Scope for locker
829af67cecdSGreg Clayton         {
830d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
831d9e416c0SGreg Clayton             variable_list = frame->GetVariableList(true);
832af67cecdSGreg Clayton         }
83330fdc8d8SChris Lattner         if (variable_list)
83430fdc8d8SChris Lattner         {
83530fdc8d8SChris Lattner             const size_t num_variables = variable_list->GetSize();
83630fdc8d8SChris Lattner             if (num_variables)
83730fdc8d8SChris Lattner             {
83830fdc8d8SChris Lattner                 for (i = 0; i < num_variables; ++i)
83930fdc8d8SChris Lattner                 {
84030fdc8d8SChris Lattner                     VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
84130fdc8d8SChris Lattner                     if (variable_sp)
84230fdc8d8SChris Lattner                     {
84330fdc8d8SChris Lattner                         bool add_variable = false;
84430fdc8d8SChris Lattner                         switch (variable_sp->GetScope())
84530fdc8d8SChris Lattner                         {
84630fdc8d8SChris Lattner                         case eValueTypeVariableGlobal:
84730fdc8d8SChris Lattner                         case eValueTypeVariableStatic:
84830fdc8d8SChris Lattner                             add_variable = statics;
84930fdc8d8SChris Lattner                             break;
85030fdc8d8SChris Lattner 
85130fdc8d8SChris Lattner                         case eValueTypeVariableArgument:
85230fdc8d8SChris Lattner                             add_variable = arguments;
85330fdc8d8SChris Lattner                             break;
85430fdc8d8SChris Lattner 
85530fdc8d8SChris Lattner                         case eValueTypeVariableLocal:
85630fdc8d8SChris Lattner                             add_variable = locals;
85730fdc8d8SChris Lattner                             break;
858c982c768SGreg Clayton 
859c982c768SGreg Clayton                         default:
860c982c768SGreg Clayton                             break;
86130fdc8d8SChris Lattner                         }
86230fdc8d8SChris Lattner                         if (add_variable)
86330fdc8d8SChris Lattner                         {
864d9e416c0SGreg Clayton                             if (in_scope_only && !variable_sp->IsInScope(frame))
86530fdc8d8SChris Lattner                                 continue;
86630fdc8d8SChris Lattner 
867d9e416c0SGreg Clayton                             value_list.Append(frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic));
86830fdc8d8SChris Lattner                         }
86930fdc8d8SChris Lattner                     }
87030fdc8d8SChris Lattner                 }
87130fdc8d8SChris Lattner             }
87230fdc8d8SChris Lattner         }
87330fdc8d8SChris Lattner     }
874ceb6b139SCaroline Tice 
875ceb6b139SCaroline Tice     if (log)
876ceb6b139SCaroline Tice     {
877d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame,
878750cd175SCaroline Tice                      value_list.get());
879ceb6b139SCaroline Tice     }
880ceb6b139SCaroline Tice 
88130fdc8d8SChris Lattner     return value_list;
88230fdc8d8SChris Lattner }
88330fdc8d8SChris Lattner 
88469b582faSGreg Clayton SBValueList
88530fdc8d8SChris Lattner SBFrame::GetRegisters ()
88630fdc8d8SChris Lattner {
88769b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
888ceb6b139SCaroline Tice 
88930fdc8d8SChris Lattner     SBValueList value_list;
890d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
891d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
892d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
893d9e416c0SGreg Clayton     if (frame && target)
89430fdc8d8SChris Lattner     {
895d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
896d9e416c0SGreg Clayton         RegisterContextSP reg_ctx (frame->GetRegisterContext());
89730fdc8d8SChris Lattner         if (reg_ctx)
89830fdc8d8SChris Lattner         {
89930fdc8d8SChris Lattner             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
90030fdc8d8SChris Lattner             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
90130fdc8d8SChris Lattner             {
902d9e416c0SGreg Clayton                 value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
90330fdc8d8SChris Lattner             }
90430fdc8d8SChris Lattner         }
90530fdc8d8SChris Lattner     }
906ceb6b139SCaroline Tice 
907ceb6b139SCaroline Tice     if (log)
908d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::Registers () => SBValueList(%p)", frame, value_list.get());
909ceb6b139SCaroline Tice 
91030fdc8d8SChris Lattner     return value_list;
91130fdc8d8SChris Lattner }
91230fdc8d8SChris Lattner 
913dde9cff3SCaroline Tice bool
914dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
915dde9cff3SCaroline Tice {
916da7bc7d0SGreg Clayton     Stream &strm = description.ref();
917da7bc7d0SGreg Clayton 
918d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
919d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
920d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
921d9e416c0SGreg Clayton     if (frame && target)
922dde9cff3SCaroline Tice     {
923d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
924d9e416c0SGreg Clayton         frame->DumpUsingSettingsFormat (&strm);
925dde9cff3SCaroline Tice     }
926dde9cff3SCaroline Tice     else
927da7bc7d0SGreg Clayton         strm.PutCString ("No value");
928dde9cff3SCaroline Tice 
929dde9cff3SCaroline Tice     return true;
930dde9cff3SCaroline Tice }
9311d3afba3SGreg Clayton 
93269b582faSGreg Clayton SBValue
9331d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
9341d3afba3SGreg Clayton {
935316d498bSGreg Clayton     SBValue result;
936d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
937d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
938d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
939d9e416c0SGreg Clayton     if (frame && target)
940316d498bSGreg Clayton     {
941d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
942316d498bSGreg Clayton         result = EvaluateExpression (expr, use_dynamic);
943316d498bSGreg Clayton     }
944316d498bSGreg Clayton     return result;
94578a685aaSJim Ingham }
94678a685aaSJim Ingham 
94778a685aaSJim Ingham SBValue
9482837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
94978a685aaSJim Ingham {
95069b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
9514838131bSGreg Clayton 
95269b582faSGreg Clayton     LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
953a162ebafSSean Callanan 
95425f3a3cdSJohnny Chen     ExecutionResults exe_results;
95569b582faSGreg Clayton     SBValue expr_result;
95681e871edSGreg Clayton     ValueObjectSP expr_value_sp;
9574838131bSGreg Clayton 
958d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
959d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
960d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
961b9556accSGreg Clayton     if (log)
962d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame, expr);
963b9556accSGreg Clayton 
964d9e416c0SGreg Clayton     if (frame && target)
9651d3afba3SGreg Clayton     {
966d9e416c0SGreg Clayton         Mutex::Locker api_locker (target->GetAPIMutex());
967316d498bSGreg Clayton 
9681ba7c4d0SGreg Clayton 
9691ba7c4d0SGreg Clayton         StreamString frame_description;
970d9e416c0SGreg Clayton         frame->DumpUsingSettingsFormat (&frame_description);
9711ba7c4d0SGreg Clayton 
9721ba7c4d0SGreg Clayton         Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
9731ba7c4d0SGreg Clayton                                              expr, fetch_dynamic_value, frame_description.GetString().c_str());
9741ba7c4d0SGreg Clayton 
97520bb3aa5SSean Callanan         const bool coerce_to_id = false;
9768b2fe6dcSGreg Clayton         const bool unwind_on_error = true;
97792adcac9SSean Callanan         const bool keep_in_memory = false;
978322f529bSSean Callanan 
979d9e416c0SGreg Clayton         exe_results = target->EvaluateExpression (expr,
980d9e416c0SGreg Clayton                                                   frame,
9813bfdaa2aSSean Callanan                                                   eExecutionPolicyOnlyWhenNeeded,
98220bb3aa5SSean Callanan                                                   coerce_to_id,
98378a685aaSJim Ingham                                                   unwind_on_error,
98478a685aaSJim Ingham                                                   keep_in_memory,
9852837b766SJim Ingham                                                   fetch_dynamic_value,
98681e871edSGreg Clayton                                                   expr_value_sp);
98781e871edSGreg Clayton         expr_result.SetSP(expr_value_sp);
988f49e65aeSGreg Clayton         Host::SetCrashDescription (NULL);
9891d3afba3SGreg Clayton     }
9904838131bSGreg Clayton 
991cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
992a162ebafSSean Callanan     if (expr_log)
99378a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
994fe42ac4dSGreg Clayton                          expr_result.GetValue(),
995fe42ac4dSGreg Clayton                          expr_result.GetSummary());
996a162ebafSSean Callanan 
9974838131bSGreg Clayton     if (log)
998d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
999d9e416c0SGreg Clayton                      frame,
100078a685aaSJim Ingham                      expr,
100181e871edSGreg Clayton                      expr_value_sp.get(),
100225f3a3cdSJohnny Chen                      exe_results);
1003cf7e2dc0SJason Molenda #endif
10044838131bSGreg Clayton 
1005cfd1acedSGreg Clayton     return expr_result;
10061d3afba3SGreg Clayton }
1007316d498bSGreg Clayton 
1008316d498bSGreg Clayton bool
1009316d498bSGreg Clayton SBFrame::IsInlined()
1010316d498bSGreg Clayton {
1011d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
1012d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1013d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1014d9e416c0SGreg Clayton     if (frame && target)
1015316d498bSGreg Clayton     {
1016d9e416c0SGreg Clayton         Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1017316d498bSGreg Clayton         if (block)
1018316d498bSGreg Clayton             return block->GetContainingInlinedBlock () != NULL;
1019316d498bSGreg Clayton     }
1020316d498bSGreg Clayton     return false;
1021316d498bSGreg Clayton }
1022316d498bSGreg Clayton 
1023316d498bSGreg Clayton const char *
1024316d498bSGreg Clayton SBFrame::GetFunctionName()
1025316d498bSGreg Clayton {
1026316d498bSGreg Clayton     const char *name = NULL;
1027d9e416c0SGreg Clayton     ExecutionContext exe_ctx(GetFrameSP());
1028d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1029d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1030d9e416c0SGreg Clayton     if (frame && target)
1031316d498bSGreg Clayton     {
1032d9e416c0SGreg Clayton         SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1033316d498bSGreg Clayton         if (sc.block)
1034316d498bSGreg Clayton         {
1035316d498bSGreg Clayton             Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1036316d498bSGreg Clayton             if (inlined_block)
1037316d498bSGreg Clayton             {
1038316d498bSGreg Clayton                 const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1039316d498bSGreg Clayton                 name = inlined_info->GetName().AsCString();
1040316d498bSGreg Clayton             }
1041316d498bSGreg Clayton         }
1042316d498bSGreg Clayton 
1043316d498bSGreg Clayton         if (name == NULL)
1044316d498bSGreg Clayton         {
1045316d498bSGreg Clayton             if (sc.function)
1046316d498bSGreg Clayton                 name = sc.function->GetName().GetCString();
1047316d498bSGreg Clayton         }
1048316d498bSGreg Clayton 
1049316d498bSGreg Clayton         if (name == NULL)
1050316d498bSGreg Clayton         {
1051316d498bSGreg Clayton             if (sc.symbol)
1052316d498bSGreg Clayton                 name = sc.symbol->GetName().GetCString();
1053316d498bSGreg Clayton         }
1054316d498bSGreg Clayton     }
1055316d498bSGreg Clayton     return name;
1056316d498bSGreg Clayton }
1057316d498bSGreg Clayton 
1058