130fdc8d8SChris Lattner //===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
104c5de699SEli Friedman #include "lldb/API/SBFrame.h"
1130fdc8d8SChris Lattner 
1230fdc8d8SChris Lattner #include <string>
1330fdc8d8SChris Lattner #include <algorithm>
1430fdc8d8SChris Lattner 
1530fdc8d8SChris Lattner #include "lldb/lldb-types.h"
1630fdc8d8SChris Lattner 
1730fdc8d8SChris Lattner #include "lldb/Core/Address.h"
1830fdc8d8SChris Lattner #include "lldb/Core/ConstString.h"
19ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
2030fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h"
2330fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h"
24b71f3844SGreg Clayton #include "lldb/Expression/ClangUserExpression.h"
251ba7c4d0SGreg Clayton #include "lldb/Host/Host.h"
2630fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
2730fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
2830fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h"
2930fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
3030fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
3130fdc8d8SChris Lattner #include "lldb/Target/Target.h"
3230fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
3430fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h"
35b9556accSGreg Clayton #include "lldb/Target/StackID.h"
3630fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
3730fdc8d8SChris Lattner 
384c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
394c5de699SEli Friedman #include "lldb/API/SBValue.h"
404c5de699SEli Friedman #include "lldb/API/SBAddress.h"
41dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
424c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h"
434c5de699SEli Friedman #include "lldb/API/SBThread.h"
4430fdc8d8SChris Lattner 
45b9556accSGreg Clayton namespace lldb_private {
46b9556accSGreg Clayton 
47b9556accSGreg Clayton     class StackFrameImpl
48b9556accSGreg Clayton     {
49b9556accSGreg Clayton     public:
50b9556accSGreg Clayton         StackFrameImpl (const lldb::StackFrameSP &frame_sp) :
51b9556accSGreg Clayton             m_frame_wp (frame_sp),
52b9556accSGreg Clayton             m_thread_wp (),
53b9556accSGreg Clayton             m_stack_id ()
54b9556accSGreg Clayton         {
55b9556accSGreg Clayton             if (frame_sp)
56b9556accSGreg Clayton             {
57b9556accSGreg Clayton                 m_thread_wp = frame_sp->GetThread().shared_from_this();
58b9556accSGreg Clayton                 m_stack_id = frame_sp->GetStackID();
59b9556accSGreg Clayton             }
60b9556accSGreg Clayton         }
61b9556accSGreg Clayton 
62b9556accSGreg Clayton         ~StackFrameImpl()
63b9556accSGreg Clayton         {
64b9556accSGreg Clayton         }
65b9556accSGreg Clayton 
66b9556accSGreg Clayton         lldb::StackFrameSP
67b9556accSGreg Clayton         GetFrameSP ()
68b9556accSGreg Clayton         {
69b9556accSGreg Clayton             lldb::StackFrameSP frame_sp;
70b9556accSGreg Clayton             // We have a weak pointer to our thread, which might
71b9556accSGreg Clayton             // be NULL'ed out if the thread went away, so first
72b9556accSGreg Clayton             // make sure our thread is still alive.
73b9556accSGreg Clayton             lldb::ThreadSP thread_sp (m_thread_wp.lock());
74b9556accSGreg Clayton             if (thread_sp)
75b9556accSGreg Clayton             {
76b9556accSGreg Clayton                 // Our thread is still here, check if our frame
77b9556accSGreg Clayton                 // is still alive as well.
78b9556accSGreg Clayton                 frame_sp = m_frame_wp.lock();
79b9556accSGreg Clayton                 if (frame_sp)
80b9556accSGreg Clayton                 {
81b9556accSGreg Clayton                     // Our frame is still alive, make sure that our thread
82b9556accSGreg Clayton                     // still has this exact frame...
83b9556accSGreg Clayton                     lldb::StackFrameSP tmp_frame_sp (thread_sp->GetStackFrameAtIndex (frame_sp->GetFrameIndex()));
84b9556accSGreg Clayton                     if (tmp_frame_sp.get() == frame_sp.get())
85b9556accSGreg Clayton                         return frame_sp;
86b9556accSGreg Clayton                 }
87b9556accSGreg Clayton                 // The original stack frame might have gone away,
88b9556accSGreg Clayton                 // we need to check for the stac
89b9556accSGreg Clayton                 frame_sp = thread_sp->GetFrameWithStackID (m_stack_id);
90b9556accSGreg Clayton                 m_frame_wp = frame_sp;
91b9556accSGreg Clayton             }
92b9556accSGreg Clayton             return frame_sp;
93b9556accSGreg Clayton         }
94b9556accSGreg Clayton 
95b9556accSGreg Clayton         void
96b9556accSGreg Clayton         SetFrameSP (const lldb::StackFrameSP &frame_sp)
97b9556accSGreg Clayton         {
98b9556accSGreg Clayton             if (frame_sp)
99b9556accSGreg Clayton             {
100b9556accSGreg Clayton                 m_frame_wp = frame_sp;
101b9556accSGreg Clayton                 m_thread_wp = frame_sp->GetThread().shared_from_this();
102b9556accSGreg Clayton                 m_stack_id = frame_sp->GetStackID();
103b9556accSGreg Clayton             }
104b9556accSGreg Clayton             else
105b9556accSGreg Clayton             {
106b9556accSGreg Clayton                 m_frame_wp.reset();
107b9556accSGreg Clayton                 m_thread_wp.reset();
108b9556accSGreg Clayton                 m_stack_id.Clear();
109b9556accSGreg Clayton             }
110b9556accSGreg Clayton         }
111b9556accSGreg Clayton 
112b9556accSGreg Clayton     protected:
113b9556accSGreg Clayton         lldb::StackFrameWP m_frame_wp;
114b9556accSGreg Clayton         lldb::ThreadWP m_thread_wp;
115b9556accSGreg Clayton         StackID m_stack_id;
116b9556accSGreg Clayton     };
117b9556accSGreg Clayton } // namespace lldb_private
118b9556accSGreg Clayton 
11930fdc8d8SChris Lattner using namespace lldb;
12030fdc8d8SChris Lattner using namespace lldb_private;
12130fdc8d8SChris Lattner 
122b9556accSGreg Clayton 
12330fdc8d8SChris Lattner SBFrame::SBFrame () :
1246611103cSGreg Clayton     m_opaque_sp ()
12530fdc8d8SChris Lattner {
12630fdc8d8SChris Lattner }
12730fdc8d8SChris Lattner 
12869b582faSGreg Clayton SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) :
129b9556accSGreg Clayton     m_opaque_sp (new StackFrameImpl (lldb_object_sp))
13030fdc8d8SChris Lattner {
13169b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
132ceb6b139SCaroline Tice 
133ceb6b139SCaroline Tice     if (log)
134ceb6b139SCaroline Tice     {
135ceb6b139SCaroline Tice         SBStream sstr;
136ceb6b139SCaroline Tice         GetDescription (sstr);
1374838131bSGreg Clayton         log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s",
138b9556accSGreg Clayton                      lldb_object_sp.get(), lldb_object_sp.get(), sstr.GetData());
139750cd175SCaroline Tice 
140ceb6b139SCaroline Tice     }
14130fdc8d8SChris Lattner }
14230fdc8d8SChris Lattner 
143efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) :
144efabb123SGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
145efabb123SGreg Clayton {
146efabb123SGreg Clayton }
147efabb123SGreg Clayton 
148efabb123SGreg Clayton const SBFrame &
149efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs)
150efabb123SGreg Clayton {
151efabb123SGreg Clayton     if (this != &rhs)
152efabb123SGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
153efabb123SGreg Clayton     return *this;
154efabb123SGreg Clayton }
155efabb123SGreg Clayton 
15630fdc8d8SChris Lattner SBFrame::~SBFrame()
15730fdc8d8SChris Lattner {
15830fdc8d8SChris Lattner }
15930fdc8d8SChris Lattner 
160b9556accSGreg Clayton StackFrameSP
161b9556accSGreg Clayton SBFrame::GetFrameSP() const
162b9556accSGreg Clayton {
163b9556accSGreg Clayton     StackFrameImplSP impl_sp (m_opaque_sp);
164b9556accSGreg Clayton     StackFrameSP frame_sp;
165b9556accSGreg Clayton     if (impl_sp)
166b9556accSGreg Clayton         frame_sp = impl_sp->GetFrameSP();
167b9556accSGreg Clayton     return frame_sp;
168b9556accSGreg Clayton }
16930fdc8d8SChris Lattner 
17030fdc8d8SChris Lattner void
171b9556accSGreg Clayton SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp)
17230fdc8d8SChris Lattner {
173b9556accSGreg Clayton     if (lldb_object_sp)
1744838131bSGreg Clayton     {
175b9556accSGreg Clayton         if (m_opaque_sp)
176b9556accSGreg Clayton         {
177b9556accSGreg Clayton             StackFrameImplSP impl_sp (m_opaque_sp);
178b9556accSGreg Clayton             if (impl_sp)
179b9556accSGreg Clayton                 impl_sp->SetFrameSP (lldb_object_sp);
1804838131bSGreg Clayton         }
181b9556accSGreg Clayton         else
182b9556accSGreg Clayton         {
183b9556accSGreg Clayton             m_opaque_sp = StackFrameImplSP (new StackFrameImpl(lldb_object_sp));
18430fdc8d8SChris Lattner         }
185b9556accSGreg Clayton     }
186b9556accSGreg Clayton     else
187b9556accSGreg Clayton     {
188b9556accSGreg Clayton         m_opaque_sp.reset();
189b9556accSGreg Clayton     }
190b9556accSGreg Clayton }
19130fdc8d8SChris Lattner 
19230fdc8d8SChris Lattner bool
19330fdc8d8SChris Lattner SBFrame::IsValid() const
19430fdc8d8SChris Lattner {
195b9556accSGreg Clayton     StackFrameImplSP impl_sp (m_opaque_sp);
196b9556accSGreg Clayton     if (impl_sp)
197b9556accSGreg Clayton         return (impl_sp->GetFrameSP().get() != NULL);
198b9556accSGreg Clayton     return false;
19930fdc8d8SChris Lattner }
20030fdc8d8SChris Lattner 
20130fdc8d8SChris Lattner SBSymbolContext
20230fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const
20330fdc8d8SChris Lattner {
204ceb6b139SCaroline Tice 
20530fdc8d8SChris Lattner     SBSymbolContext sb_sym_ctx;
206b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
207b9556accSGreg Clayton     if (frame_sp)
208af67cecdSGreg Clayton     {
209b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
210b9556accSGreg Clayton         sb_sym_ctx.SetSymbolContext(&frame_sp->GetSymbolContext (resolve_scope));
211af67cecdSGreg Clayton     }
212ceb6b139SCaroline Tice 
21369b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
214ceb6b139SCaroline Tice     if (log)
2154838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)",
216b9556accSGreg Clayton                      frame_sp.get(), resolve_scope, sb_sym_ctx.get());
217ceb6b139SCaroline Tice 
21830fdc8d8SChris Lattner     return sb_sym_ctx;
21930fdc8d8SChris Lattner }
22030fdc8d8SChris Lattner 
22130fdc8d8SChris Lattner SBModule
22230fdc8d8SChris Lattner SBFrame::GetModule () const
22330fdc8d8SChris Lattner {
22472eff18aSGreg Clayton     SBModule sb_module;
225*acdbe816SGreg Clayton     ModuleSP module_sp;
226b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
227b9556accSGreg Clayton     if (frame_sp)
228af67cecdSGreg Clayton     {
229b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
230*acdbe816SGreg Clayton         module_sp = frame_sp->GetSymbolContext (eSymbolContextModule).module_sp;
231*acdbe816SGreg Clayton         sb_module.SetSP (module_sp);
232af67cecdSGreg Clayton     }
23372eff18aSGreg Clayton 
23469b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2354838131bSGreg Clayton     if (log)
2364838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
237*acdbe816SGreg Clayton                      frame_sp.get(), module_sp.get());
2384838131bSGreg Clayton 
23930fdc8d8SChris Lattner     return sb_module;
24030fdc8d8SChris Lattner }
24130fdc8d8SChris Lattner 
24230fdc8d8SChris Lattner SBCompileUnit
24330fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
24430fdc8d8SChris Lattner {
24572eff18aSGreg Clayton     SBCompileUnit sb_comp_unit;
246b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
247b9556accSGreg Clayton     if (frame_sp)
248af67cecdSGreg Clayton     {
249b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
250b9556accSGreg Clayton         sb_comp_unit.reset (frame_sp->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
251af67cecdSGreg Clayton     }
25269b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
253ceb6b139SCaroline Tice     if (log)
2544838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBCompileUnit(%p)",
255b9556accSGreg Clayton                      frame_sp.get(), sb_comp_unit.get());
256ceb6b139SCaroline Tice 
25730fdc8d8SChris Lattner     return sb_comp_unit;
25830fdc8d8SChris Lattner }
25930fdc8d8SChris Lattner 
26030fdc8d8SChris Lattner SBFunction
26130fdc8d8SChris Lattner SBFrame::GetFunction () const
26230fdc8d8SChris Lattner {
26372eff18aSGreg Clayton     SBFunction sb_function;
264b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
265b9556accSGreg Clayton     if (frame_sp)
266af67cecdSGreg Clayton     {
267b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
268b9556accSGreg Clayton         sb_function.reset(frame_sp->GetSymbolContext (eSymbolContextFunction).function);
269af67cecdSGreg Clayton     }
27069b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2714838131bSGreg Clayton     if (log)
2724838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
273b9556accSGreg Clayton                      frame_sp.get(), sb_function.get());
2744838131bSGreg Clayton 
27530fdc8d8SChris Lattner     return sb_function;
27630fdc8d8SChris Lattner }
27730fdc8d8SChris Lattner 
2783b06557eSGreg Clayton SBSymbol
2793b06557eSGreg Clayton SBFrame::GetSymbol () const
2803b06557eSGreg Clayton {
28172eff18aSGreg Clayton     SBSymbol sb_symbol;
282b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
283b9556accSGreg Clayton     if (frame_sp)
284af67cecdSGreg Clayton     {
285b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
286b9556accSGreg Clayton         sb_symbol.reset(frame_sp->GetSymbolContext (eSymbolContextSymbol).symbol);
287af67cecdSGreg Clayton     }
28869b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2894838131bSGreg Clayton     if (log)
2904838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
291b9556accSGreg Clayton                      frame_sp.get(), sb_symbol.get());
2923b06557eSGreg Clayton     return sb_symbol;
2933b06557eSGreg Clayton }
2943b06557eSGreg Clayton 
29530fdc8d8SChris Lattner SBBlock
29630fdc8d8SChris Lattner SBFrame::GetBlock () const
29730fdc8d8SChris Lattner {
29872eff18aSGreg Clayton     SBBlock sb_block;
299b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
300b9556accSGreg Clayton     if (frame_sp)
301af67cecdSGreg Clayton     {
302b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
303b9556accSGreg Clayton         sb_block.reset (frame_sp->GetSymbolContext (eSymbolContextBlock).block);
304af67cecdSGreg Clayton     }
30569b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3064838131bSGreg Clayton     if (log)
3074838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
308b9556accSGreg Clayton                      frame_sp.get(), sb_block.get());
30930fdc8d8SChris Lattner     return sb_block;
31030fdc8d8SChris Lattner }
31130fdc8d8SChris Lattner 
31295897c6aSGreg Clayton SBBlock
31395897c6aSGreg Clayton SBFrame::GetFrameBlock () const
31495897c6aSGreg Clayton {
31572eff18aSGreg Clayton     SBBlock sb_block;
316b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
317b9556accSGreg Clayton     if (frame_sp)
318af67cecdSGreg Clayton     {
319b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
320b9556accSGreg Clayton         sb_block.reset(frame_sp->GetFrameBlock ());
321af67cecdSGreg Clayton     }
32269b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3234838131bSGreg Clayton     if (log)
3244838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
325b9556accSGreg Clayton                      frame_sp.get(), sb_block.get());
32695897c6aSGreg Clayton     return sb_block;
32795897c6aSGreg Clayton }
32895897c6aSGreg Clayton 
32930fdc8d8SChris Lattner SBLineEntry
33030fdc8d8SChris Lattner SBFrame::GetLineEntry () const
33130fdc8d8SChris Lattner {
33272eff18aSGreg Clayton     SBLineEntry sb_line_entry;
333b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
334b9556accSGreg Clayton     if (frame_sp)
335af67cecdSGreg Clayton     {
336b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
337b9556accSGreg Clayton         sb_line_entry.SetLineEntry (frame_sp->GetSymbolContext (eSymbolContextLineEntry).line_entry);
338af67cecdSGreg Clayton     }
33969b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3404838131bSGreg Clayton     if (log)
3414838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
342b9556accSGreg Clayton                      frame_sp.get(), sb_line_entry.get());
34330fdc8d8SChris Lattner     return sb_line_entry;
34430fdc8d8SChris Lattner }
34530fdc8d8SChris Lattner 
34630fdc8d8SChris Lattner uint32_t
34730fdc8d8SChris Lattner SBFrame::GetFrameID () const
34830fdc8d8SChris Lattner {
349b9556accSGreg Clayton     uint32_t frame_idx = UINT32_MAX;
350b9556accSGreg Clayton 
351b9556accSGreg Clayton 
352b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
353b9556accSGreg Clayton     if (frame_sp)
354b9556accSGreg Clayton         frame_idx = frame_sp->GetFrameIndex ();
3554838131bSGreg Clayton 
35669b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3574838131bSGreg Clayton     if (log)
3584838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameID () => %u",
359b9556accSGreg Clayton                      frame_sp.get(), frame_idx);
3604838131bSGreg Clayton     return frame_idx;
36130fdc8d8SChris Lattner }
36230fdc8d8SChris Lattner 
36369b582faSGreg Clayton addr_t
36430fdc8d8SChris Lattner SBFrame::GetPC () const
36530fdc8d8SChris Lattner {
36669b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
367b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
368b9556accSGreg Clayton     if (frame_sp)
369af67cecdSGreg Clayton     {
370b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
371b9556accSGreg Clayton         addr = frame_sp->GetFrameCodeAddress().GetOpcodeLoadAddress (&frame_sp->GetThread().GetProcess().GetTarget());
372af67cecdSGreg Clayton     }
373ceb6b139SCaroline Tice 
37469b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
375ceb6b139SCaroline Tice     if (log)
376b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", frame_sp.get(), addr);
377ceb6b139SCaroline Tice 
378ceb6b139SCaroline Tice     return addr;
37930fdc8d8SChris Lattner }
38030fdc8d8SChris Lattner 
38130fdc8d8SChris Lattner bool
38269b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc)
38330fdc8d8SChris Lattner {
384ceb6b139SCaroline Tice     bool ret_val = false;
385b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
386b9556accSGreg Clayton     if (frame_sp)
387af67cecdSGreg Clayton     {
388b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
389b9556accSGreg Clayton         ret_val = frame_sp->GetRegisterContext()->SetPC (new_pc);
390af67cecdSGreg Clayton     }
391ceb6b139SCaroline Tice 
39269b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
393ceb6b139SCaroline Tice     if (log)
3944838131bSGreg Clayton         log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i",
395b9556accSGreg Clayton                      frame_sp.get(), new_pc, ret_val);
396ceb6b139SCaroline Tice 
397ceb6b139SCaroline Tice     return ret_val;
39830fdc8d8SChris Lattner }
39930fdc8d8SChris Lattner 
40069b582faSGreg Clayton addr_t
40130fdc8d8SChris Lattner SBFrame::GetSP () const
40230fdc8d8SChris Lattner {
4034838131bSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
404b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
405b9556accSGreg Clayton     if (frame_sp)
406af67cecdSGreg Clayton     {
407b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
408b9556accSGreg Clayton         addr = frame_sp->GetRegisterContext()->GetSP();
409af67cecdSGreg Clayton     }
41069b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4114838131bSGreg Clayton     if (log)
412b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", frame_sp.get(), addr);
4134838131bSGreg Clayton 
4144838131bSGreg Clayton     return addr;
41530fdc8d8SChris Lattner }
41630fdc8d8SChris Lattner 
41730fdc8d8SChris Lattner 
41869b582faSGreg Clayton addr_t
41930fdc8d8SChris Lattner SBFrame::GetFP () const
42030fdc8d8SChris Lattner {
42169b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
422b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
423b9556accSGreg Clayton     if (frame_sp)
424af67cecdSGreg Clayton     {
425b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
426b9556accSGreg Clayton         addr = frame_sp->GetRegisterContext()->GetFP();
427af67cecdSGreg Clayton     }
428ceb6b139SCaroline Tice 
42969b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
430ceb6b139SCaroline Tice     if (log)
431b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", frame_sp.get(), addr);
432ceb6b139SCaroline Tice     return addr;
43330fdc8d8SChris Lattner }
43430fdc8d8SChris Lattner 
43530fdc8d8SChris Lattner 
43630fdc8d8SChris Lattner SBAddress
43730fdc8d8SChris Lattner SBFrame::GetPCAddress () const
43830fdc8d8SChris Lattner {
43930fdc8d8SChris Lattner     SBAddress sb_addr;
440b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
441b9556accSGreg Clayton     if (frame_sp)
442af67cecdSGreg Clayton     {
443b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
444b9556accSGreg Clayton         sb_addr.SetAddress (&frame_sp->GetFrameCodeAddress());
445af67cecdSGreg Clayton     }
44669b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4474838131bSGreg Clayton     if (log)
448b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame_sp.get(), sb_addr.get());
44930fdc8d8SChris Lattner     return sb_addr;
45030fdc8d8SChris Lattner }
45130fdc8d8SChris Lattner 
45230fdc8d8SChris Lattner void
45330fdc8d8SChris Lattner SBFrame::Clear()
45430fdc8d8SChris Lattner {
4556611103cSGreg Clayton     m_opaque_sp.reset();
45630fdc8d8SChris Lattner }
45730fdc8d8SChris Lattner 
45830fdc8d8SChris Lattner SBValue
45969b582faSGreg Clayton SBFrame::FindVariable (const char *name)
46030fdc8d8SChris Lattner {
461316d498bSGreg Clayton     SBValue value;
462b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
463b9556accSGreg Clayton     if (frame_sp)
464316d498bSGreg Clayton     {
465b9556accSGreg Clayton         lldb::DynamicValueType  use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue();
466316d498bSGreg Clayton         value = FindVariable (name, use_dynamic);
467316d498bSGreg Clayton     }
468316d498bSGreg Clayton     return value;
46978a685aaSJim Ingham }
47078a685aaSJim Ingham 
47178a685aaSJim Ingham SBValue
4722837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
47378a685aaSJim Ingham {
47469b582faSGreg Clayton     VariableSP var_sp;
47558b59f95SJim Ingham     SBValue sb_value;
476b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
477b9556accSGreg Clayton     if (frame_sp && name && name[0])
47830fdc8d8SChris Lattner     {
47969b582faSGreg Clayton         VariableList variable_list;
480b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
481b9556accSGreg Clayton         SymbolContext sc (frame_sp->GetSymbolContext (eSymbolContextBlock));
48230fdc8d8SChris Lattner 
48372eff18aSGreg Clayton         if (sc.block)
48430fdc8d8SChris Lattner         {
48572eff18aSGreg Clayton             const bool can_create = true;
48672eff18aSGreg Clayton             const bool get_parent_variables = true;
48772eff18aSGreg Clayton             const bool stop_if_block_is_inlined_function = true;
48872eff18aSGreg Clayton 
48972eff18aSGreg Clayton             if (sc.block->AppendVariables (can_create,
49072eff18aSGreg Clayton                                            get_parent_variables,
49172eff18aSGreg Clayton                                            stop_if_block_is_inlined_function,
49272eff18aSGreg Clayton                                            &variable_list))
49372eff18aSGreg Clayton             {
49469b582faSGreg Clayton                 var_sp = variable_list.FindVariable (ConstString(name));
49530fdc8d8SChris Lattner             }
49672eff18aSGreg Clayton         }
49730fdc8d8SChris Lattner 
4984838131bSGreg Clayton         if (var_sp)
499b9556accSGreg Clayton             *sb_value = ValueObjectSP (frame_sp->GetValueObjectForFrameVariable(var_sp, use_dynamic));
5004838131bSGreg Clayton 
501316d498bSGreg Clayton     }
502316d498bSGreg Clayton 
50369b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5044838131bSGreg Clayton     if (log)
50569b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
506b9556accSGreg Clayton                      frame_sp.get(), name, sb_value.get());
5074838131bSGreg Clayton 
508dde9cff3SCaroline Tice     return sb_value;
509dde9cff3SCaroline Tice }
510dde9cff3SCaroline Tice 
51130fdc8d8SChris Lattner SBValue
51269b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type)
51330fdc8d8SChris Lattner {
514316d498bSGreg Clayton     SBValue value;
515b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
516b9556accSGreg Clayton     if (frame_sp)
517316d498bSGreg Clayton     {
518b9556accSGreg Clayton         lldb::DynamicValueType use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue();
519316d498bSGreg Clayton         value = FindValue (name, value_type, use_dynamic);
520316d498bSGreg Clayton     }
521316d498bSGreg Clayton     return value;
52278a685aaSJim Ingham }
52378a685aaSJim Ingham 
52478a685aaSJim Ingham SBValue
5252837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
52678a685aaSJim Ingham {
52769b582faSGreg Clayton     SBValue sb_value;
528b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
529b9556accSGreg Clayton     if (frame_sp && name && name[0])
53030fdc8d8SChris Lattner     {
531b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
53230fdc8d8SChris Lattner 
53369b582faSGreg Clayton         switch (value_type)
53430fdc8d8SChris Lattner         {
53569b582faSGreg Clayton         case eValueTypeVariableGlobal:      // global variable
53669b582faSGreg Clayton         case eValueTypeVariableStatic:      // static variable
53769b582faSGreg Clayton         case eValueTypeVariableArgument:    // function argument variables
53869b582faSGreg Clayton         case eValueTypeVariableLocal:       // function local variables
53969b582faSGreg Clayton             {
540b9556accSGreg Clayton                 VariableList *variable_list = frame_sp->GetVariableList(true);
54172eff18aSGreg Clayton 
542b9556accSGreg Clayton                 SymbolContext sc (frame_sp->GetSymbolContext (eSymbolContextBlock));
54372eff18aSGreg Clayton 
54472eff18aSGreg Clayton                 const bool can_create = true;
54572eff18aSGreg Clayton                 const bool get_parent_variables = true;
54672eff18aSGreg Clayton                 const bool stop_if_block_is_inlined_function = true;
54772eff18aSGreg Clayton 
54872eff18aSGreg Clayton                 if (sc.block && sc.block->AppendVariables (can_create,
54972eff18aSGreg Clayton                                                            get_parent_variables,
55072eff18aSGreg Clayton                                                            stop_if_block_is_inlined_function,
551e85d9cb8SJohnny Chen                                                            variable_list))
552beae523aSJohnny Chen                 {
55369b582faSGreg Clayton                     ConstString const_name(name);
554e85d9cb8SJohnny Chen                     const uint32_t num_variables = variable_list->GetSize();
55572eff18aSGreg Clayton                     for (uint32_t i = 0; i < num_variables; ++i)
55630fdc8d8SChris Lattner                     {
55769b582faSGreg Clayton                         VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
55869b582faSGreg Clayton                         if (variable_sp &&
55969b582faSGreg Clayton                             variable_sp->GetScope() == value_type &&
56069b582faSGreg Clayton                             variable_sp->GetName() == const_name)
561beae523aSJohnny Chen                         {
562b9556accSGreg Clayton                             *sb_value = ValueObjectSP (frame_sp->GetValueObjectForFrameVariable(variable_sp,
56378a685aaSJim Ingham                                                                                                    use_dynamic));
564beae523aSJohnny Chen                             break;
565beae523aSJohnny Chen                         }
56630fdc8d8SChris Lattner                     }
56730fdc8d8SChris Lattner                 }
56830fdc8d8SChris Lattner             }
56969b582faSGreg Clayton             break;
57069b582faSGreg Clayton 
57169b582faSGreg Clayton         case eValueTypeRegister:            // stack frame register value
57269b582faSGreg Clayton             {
573b9556accSGreg Clayton                 RegisterContextSP reg_ctx (frame_sp->GetRegisterContext());
57469b582faSGreg Clayton                 if (reg_ctx)
57569b582faSGreg Clayton                 {
57669b582faSGreg Clayton                     const uint32_t num_regs = reg_ctx->GetRegisterCount();
57769b582faSGreg Clayton                     for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
57869b582faSGreg Clayton                     {
57969b582faSGreg Clayton                         const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
58069b582faSGreg Clayton                         if (reg_info &&
58169b582faSGreg Clayton                             ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
58269b582faSGreg Clayton                              (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
58369b582faSGreg Clayton                         {
584b9556accSGreg Clayton                             *sb_value = ValueObjectRegister::Create (frame_sp.get(), reg_ctx, reg_idx);
58569b582faSGreg Clayton                         }
58669b582faSGreg Clayton                     }
58769b582faSGreg Clayton                 }
58869b582faSGreg Clayton             }
58969b582faSGreg Clayton             break;
59069b582faSGreg Clayton 
59169b582faSGreg Clayton         case eValueTypeRegisterSet:         // A collection of stack frame register values
59269b582faSGreg Clayton             {
593b9556accSGreg Clayton                 RegisterContextSP reg_ctx (frame_sp->GetRegisterContext());
59469b582faSGreg Clayton                 if (reg_ctx)
59569b582faSGreg Clayton                 {
59669b582faSGreg Clayton                     const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
59769b582faSGreg Clayton                     for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
59869b582faSGreg Clayton                     {
59969b582faSGreg Clayton                         const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
60069b582faSGreg Clayton                         if (reg_set &&
60169b582faSGreg Clayton                             ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
60269b582faSGreg Clayton                              (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
60369b582faSGreg Clayton                         {
604b9556accSGreg Clayton                             *sb_value = ValueObjectRegisterSet::Create (frame_sp.get(), reg_ctx, set_idx);
60569b582faSGreg Clayton                         }
60669b582faSGreg Clayton                     }
60769b582faSGreg Clayton                 }
60869b582faSGreg Clayton             }
60969b582faSGreg Clayton             break;
61069b582faSGreg Clayton 
61169b582faSGreg Clayton         case eValueTypeConstResult:         // constant result variables
61269b582faSGreg Clayton             {
61369b582faSGreg Clayton                 ConstString const_name(name);
614b9556accSGreg Clayton                 ClangExpressionVariableSP expr_var_sp (frame_sp->GetThread().GetProcess().GetTarget().GetPersistentVariables().GetVariable (const_name));
61569b582faSGreg Clayton                 if (expr_var_sp)
61669b582faSGreg Clayton                     *sb_value = expr_var_sp->GetValueObject();
61769b582faSGreg Clayton             }
61869b582faSGreg Clayton             break;
61969b582faSGreg Clayton 
62069b582faSGreg Clayton         default:
62169b582faSGreg Clayton             break;
62269b582faSGreg Clayton         }
623beae523aSJohnny Chen     }
624dde9cff3SCaroline Tice 
62569b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6264838131bSGreg Clayton     if (log)
62769b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
628b9556accSGreg Clayton                      frame_sp.get(), name, value_type, sb_value.get());
6294838131bSGreg Clayton 
6304838131bSGreg Clayton 
631dde9cff3SCaroline Tice     return sb_value;
632dde9cff3SCaroline Tice }
633dde9cff3SCaroline Tice 
63430fdc8d8SChris Lattner bool
63530fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
63630fdc8d8SChris Lattner {
637b9556accSGreg Clayton     return GetFrameSP().get() == rhs.GetFrameSP().get();
63830fdc8d8SChris Lattner }
63930fdc8d8SChris Lattner 
64030fdc8d8SChris Lattner bool
64130fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
64230fdc8d8SChris Lattner {
643b9556accSGreg Clayton     return GetFrameSP().get() != rhs.GetFrameSP().get();
644481cef25SGreg Clayton }
64530fdc8d8SChris Lattner 
64630fdc8d8SChris Lattner SBThread
64730fdc8d8SChris Lattner SBFrame::GetThread () const
64830fdc8d8SChris Lattner {
64969b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
650ceb6b139SCaroline Tice 
65172eff18aSGreg Clayton     SBThread sb_thread;
65217a6ad05SGreg Clayton     ThreadSP thread_sp;
653b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
654b9556accSGreg Clayton     if (frame_sp)
655af67cecdSGreg Clayton     {
656b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
657b9556accSGreg Clayton         thread_sp = frame_sp->GetThread().shared_from_this();
65817a6ad05SGreg Clayton         sb_thread.SetThread (thread_sp);
659af67cecdSGreg Clayton     }
660ceb6b139SCaroline Tice 
661ceb6b139SCaroline Tice     if (log)
662750cd175SCaroline Tice     {
663750cd175SCaroline Tice         SBStream sstr;
664750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
665b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", frame_sp.get(),
66617a6ad05SGreg Clayton                      thread_sp.get(), sstr.GetData());
667750cd175SCaroline Tice     }
668ceb6b139SCaroline Tice 
66930fdc8d8SChris Lattner     return sb_thread;
67030fdc8d8SChris Lattner }
67130fdc8d8SChris Lattner 
67230fdc8d8SChris Lattner const char *
67330fdc8d8SChris Lattner SBFrame::Disassemble () const
67430fdc8d8SChris Lattner {
6754838131bSGreg Clayton     const char *disassembly = NULL;
676b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
677b9556accSGreg Clayton     if (frame_sp)
678af67cecdSGreg Clayton     {
679b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
680b9556accSGreg Clayton         disassembly = frame_sp->Disassemble();
681af67cecdSGreg Clayton     }
68269b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6834838131bSGreg Clayton 
6844838131bSGreg Clayton     if (log)
685b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::Disassemble () => %s", frame_sp.get(), disassembly);
6864838131bSGreg Clayton 
6874838131bSGreg Clayton     return disassembly;
68830fdc8d8SChris Lattner }
68930fdc8d8SChris Lattner 
69030fdc8d8SChris Lattner 
69130fdc8d8SChris Lattner SBValueList
69230fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
69330fdc8d8SChris Lattner                        bool locals,
69430fdc8d8SChris Lattner                        bool statics,
69530fdc8d8SChris Lattner                        bool in_scope_only)
69630fdc8d8SChris Lattner {
697316d498bSGreg Clayton     SBValueList value_list;
698b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
699b9556accSGreg Clayton     if (frame_sp)
700316d498bSGreg Clayton     {
701b9556accSGreg Clayton         lldb::DynamicValueType use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue();
702316d498bSGreg Clayton         value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic);
703316d498bSGreg Clayton     }
704316d498bSGreg Clayton     return value_list;
70578a685aaSJim Ingham }
70678a685aaSJim Ingham 
70778a685aaSJim Ingham SBValueList
70878a685aaSJim Ingham SBFrame::GetVariables (bool arguments,
70978a685aaSJim Ingham                        bool locals,
71078a685aaSJim Ingham                        bool statics,
71178a685aaSJim Ingham                        bool in_scope_only,
7122837b766SJim Ingham                        lldb::DynamicValueType  use_dynamic)
71378a685aaSJim Ingham {
71469b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
715ceb6b139SCaroline Tice 
716b9556accSGreg Clayton     SBValueList value_list;
717b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
718b9556accSGreg Clayton 
719ceb6b139SCaroline Tice     if (log)
7204838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
721b9556accSGreg Clayton                      frame_sp.get(),
7224838131bSGreg Clayton                      arguments,
7234838131bSGreg Clayton                      locals,
7244838131bSGreg Clayton                      statics,
7254838131bSGreg Clayton                      in_scope_only);
726ceb6b139SCaroline Tice 
727b9556accSGreg Clayton     if (frame_sp)
72830fdc8d8SChris Lattner     {
729af67cecdSGreg Clayton 
73030fdc8d8SChris Lattner         size_t i;
731af67cecdSGreg Clayton         VariableList *variable_list = NULL;
732af67cecdSGreg Clayton         // Scope for locker
733af67cecdSGreg Clayton         {
734b9556accSGreg Clayton             Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
735b9556accSGreg Clayton             variable_list = frame_sp->GetVariableList(true);
736af67cecdSGreg Clayton         }
73730fdc8d8SChris Lattner         if (variable_list)
73830fdc8d8SChris Lattner         {
73930fdc8d8SChris Lattner             const size_t num_variables = variable_list->GetSize();
74030fdc8d8SChris Lattner             if (num_variables)
74130fdc8d8SChris Lattner             {
74230fdc8d8SChris Lattner                 for (i = 0; i < num_variables; ++i)
74330fdc8d8SChris Lattner                 {
74430fdc8d8SChris Lattner                     VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
74530fdc8d8SChris Lattner                     if (variable_sp)
74630fdc8d8SChris Lattner                     {
74730fdc8d8SChris Lattner                         bool add_variable = false;
74830fdc8d8SChris Lattner                         switch (variable_sp->GetScope())
74930fdc8d8SChris Lattner                         {
75030fdc8d8SChris Lattner                         case eValueTypeVariableGlobal:
75130fdc8d8SChris Lattner                         case eValueTypeVariableStatic:
75230fdc8d8SChris Lattner                             add_variable = statics;
75330fdc8d8SChris Lattner                             break;
75430fdc8d8SChris Lattner 
75530fdc8d8SChris Lattner                         case eValueTypeVariableArgument:
75630fdc8d8SChris Lattner                             add_variable = arguments;
75730fdc8d8SChris Lattner                             break;
75830fdc8d8SChris Lattner 
75930fdc8d8SChris Lattner                         case eValueTypeVariableLocal:
76030fdc8d8SChris Lattner                             add_variable = locals;
76130fdc8d8SChris Lattner                             break;
762c982c768SGreg Clayton 
763c982c768SGreg Clayton                         default:
764c982c768SGreg Clayton                             break;
76530fdc8d8SChris Lattner                         }
76630fdc8d8SChris Lattner                         if (add_variable)
76730fdc8d8SChris Lattner                         {
768b9556accSGreg Clayton                             if (in_scope_only && !variable_sp->IsInScope(frame_sp.get()))
76930fdc8d8SChris Lattner                                 continue;
77030fdc8d8SChris Lattner 
771b9556accSGreg Clayton                             value_list.Append(frame_sp->GetValueObjectForFrameVariable (variable_sp, use_dynamic));
77230fdc8d8SChris Lattner                         }
77330fdc8d8SChris Lattner                     }
77430fdc8d8SChris Lattner                 }
77530fdc8d8SChris Lattner             }
77630fdc8d8SChris Lattner         }
77730fdc8d8SChris Lattner     }
778ceb6b139SCaroline Tice 
779ceb6b139SCaroline Tice     if (log)
780ceb6b139SCaroline Tice     {
781b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame_sp.get(),
782750cd175SCaroline Tice                      value_list.get());
783ceb6b139SCaroline Tice     }
784ceb6b139SCaroline Tice 
78530fdc8d8SChris Lattner     return value_list;
78630fdc8d8SChris Lattner }
78730fdc8d8SChris Lattner 
78869b582faSGreg Clayton SBValueList
78930fdc8d8SChris Lattner SBFrame::GetRegisters ()
79030fdc8d8SChris Lattner {
79169b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
792ceb6b139SCaroline Tice 
79330fdc8d8SChris Lattner     SBValueList value_list;
794b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
795b9556accSGreg Clayton     if (frame_sp)
79630fdc8d8SChris Lattner     {
797b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
798b9556accSGreg Clayton         RegisterContextSP reg_ctx (frame_sp->GetRegisterContext());
79930fdc8d8SChris Lattner         if (reg_ctx)
80030fdc8d8SChris Lattner         {
80130fdc8d8SChris Lattner             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
80230fdc8d8SChris Lattner             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
80330fdc8d8SChris Lattner             {
804b9556accSGreg Clayton                 value_list.Append(ValueObjectRegisterSet::Create (frame_sp.get(), reg_ctx, set_idx));
80530fdc8d8SChris Lattner             }
80630fdc8d8SChris Lattner         }
80730fdc8d8SChris Lattner     }
808ceb6b139SCaroline Tice 
809ceb6b139SCaroline Tice     if (log)
810b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::Registers () => SBValueList(%p)", frame_sp.get(), value_list.get());
811ceb6b139SCaroline Tice 
81230fdc8d8SChris Lattner     return value_list;
81330fdc8d8SChris Lattner }
81430fdc8d8SChris Lattner 
815dde9cff3SCaroline Tice bool
816dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
817dde9cff3SCaroline Tice {
818da7bc7d0SGreg Clayton     Stream &strm = description.ref();
819da7bc7d0SGreg Clayton 
820b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
821b9556accSGreg Clayton     if (frame_sp)
822dde9cff3SCaroline Tice     {
823b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
824b9556accSGreg Clayton         frame_sp->DumpUsingSettingsFormat (&strm);
825dde9cff3SCaroline Tice     }
826dde9cff3SCaroline Tice     else
827da7bc7d0SGreg Clayton         strm.PutCString ("No value");
828dde9cff3SCaroline Tice 
829dde9cff3SCaroline Tice     return true;
830dde9cff3SCaroline Tice }
8311d3afba3SGreg Clayton 
83269b582faSGreg Clayton SBValue
8331d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
8341d3afba3SGreg Clayton {
835316d498bSGreg Clayton     SBValue result;
836b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
837b9556accSGreg Clayton     if (frame_sp)
838316d498bSGreg Clayton     {
839b9556accSGreg Clayton         lldb::DynamicValueType use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue();
840316d498bSGreg Clayton         result = EvaluateExpression (expr, use_dynamic);
841316d498bSGreg Clayton     }
842316d498bSGreg Clayton     return result;
84378a685aaSJim Ingham }
84478a685aaSJim Ingham 
84578a685aaSJim Ingham SBValue
8462837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
84778a685aaSJim Ingham {
84869b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
8494838131bSGreg Clayton 
85069b582faSGreg Clayton     LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
851a162ebafSSean Callanan 
85225f3a3cdSJohnny Chen     ExecutionResults exe_results;
85369b582faSGreg Clayton     SBValue expr_result;
8544838131bSGreg Clayton 
855b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
856b9556accSGreg Clayton     if (log)
857b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame_sp.get(), expr);
858b9556accSGreg Clayton 
859b9556accSGreg Clayton     if (frame_sp)
8601d3afba3SGreg Clayton     {
861b9556accSGreg Clayton         Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex());
862316d498bSGreg Clayton 
8631ba7c4d0SGreg Clayton 
8641ba7c4d0SGreg Clayton         StreamString frame_description;
865b9556accSGreg Clayton         frame_sp->DumpUsingSettingsFormat (&frame_description);
8661ba7c4d0SGreg Clayton 
8671ba7c4d0SGreg Clayton         Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
8681ba7c4d0SGreg Clayton                                              expr, fetch_dynamic_value, frame_description.GetString().c_str());
8691ba7c4d0SGreg Clayton 
87020bb3aa5SSean Callanan         const bool coerce_to_id = false;
8718b2fe6dcSGreg Clayton         const bool unwind_on_error = true;
87292adcac9SSean Callanan         const bool keep_in_memory = false;
873322f529bSSean Callanan 
874b9556accSGreg Clayton         exe_results = frame_sp->GetThread().GetProcess().GetTarget().EvaluateExpression(expr,
875b9556accSGreg Clayton                                                                                         frame_sp.get(),
8763bfdaa2aSSean Callanan                                                                                         eExecutionPolicyOnlyWhenNeeded,
87720bb3aa5SSean Callanan                                                                                         coerce_to_id,
87878a685aaSJim Ingham                                                                                         unwind_on_error,
87978a685aaSJim Ingham                                                                                         keep_in_memory,
8802837b766SJim Ingham                                                                                         fetch_dynamic_value,
88178a685aaSJim Ingham                                                                                         *expr_result);
882f49e65aeSGreg Clayton 
883f49e65aeSGreg Clayton         Host::SetCrashDescription (NULL);
8841d3afba3SGreg Clayton     }
8854838131bSGreg Clayton 
886a162ebafSSean Callanan     if (expr_log)
88778a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
888fe42ac4dSGreg Clayton                          expr_result.GetValue(),
889fe42ac4dSGreg Clayton                          expr_result.GetSummary());
890a162ebafSSean Callanan 
8914838131bSGreg Clayton     if (log)
892b9556accSGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", frame_sp.get(),
89378a685aaSJim Ingham                      expr,
89425f3a3cdSJohnny Chen                      expr_result.get(),
89525f3a3cdSJohnny Chen                      exe_results);
8964838131bSGreg Clayton 
897cfd1acedSGreg Clayton     return expr_result;
8981d3afba3SGreg Clayton }
899316d498bSGreg Clayton 
900316d498bSGreg Clayton bool
901316d498bSGreg Clayton SBFrame::IsInlined()
902316d498bSGreg Clayton {
903b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
904b9556accSGreg Clayton     if (frame_sp)
905316d498bSGreg Clayton     {
906b9556accSGreg Clayton         Block *block = frame_sp->GetSymbolContext(eSymbolContextBlock).block;
907316d498bSGreg Clayton         if (block)
908316d498bSGreg Clayton             return block->GetContainingInlinedBlock () != NULL;
909316d498bSGreg Clayton     }
910316d498bSGreg Clayton     return false;
911316d498bSGreg Clayton }
912316d498bSGreg Clayton 
913316d498bSGreg Clayton const char *
914316d498bSGreg Clayton SBFrame::GetFunctionName()
915316d498bSGreg Clayton {
916316d498bSGreg Clayton     const char *name = NULL;
917b9556accSGreg Clayton     StackFrameSP frame_sp(GetFrameSP());
918b9556accSGreg Clayton     if (frame_sp)
919316d498bSGreg Clayton     {
920b9556accSGreg Clayton         SymbolContext sc (frame_sp->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
921316d498bSGreg Clayton         if (sc.block)
922316d498bSGreg Clayton         {
923316d498bSGreg Clayton             Block *inlined_block = sc.block->GetContainingInlinedBlock ();
924316d498bSGreg Clayton             if (inlined_block)
925316d498bSGreg Clayton             {
926316d498bSGreg Clayton                 const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
927316d498bSGreg Clayton                 name = inlined_info->GetName().AsCString();
928316d498bSGreg Clayton             }
929316d498bSGreg Clayton         }
930316d498bSGreg Clayton 
931316d498bSGreg Clayton         if (name == NULL)
932316d498bSGreg Clayton         {
933316d498bSGreg Clayton             if (sc.function)
934316d498bSGreg Clayton                 name = sc.function->GetName().GetCString();
935316d498bSGreg Clayton         }
936316d498bSGreg Clayton 
937316d498bSGreg Clayton         if (name == NULL)
938316d498bSGreg Clayton         {
939316d498bSGreg Clayton             if (sc.symbol)
940316d498bSGreg Clayton                 name = sc.symbol->GetName().GetCString();
941316d498bSGreg Clayton         }
942316d498bSGreg Clayton     }
943316d498bSGreg Clayton     return name;
944316d498bSGreg Clayton }
945316d498bSGreg Clayton 
946