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"
271f746071SGreg Clayton #include "lldb/Symbol/Function.h"
281f746071SGreg Clayton #include "lldb/Symbol/Symbol.h"
2930fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
3030fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h"
3130fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
3230fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
3330fdc8d8SChris Lattner #include "lldb/Target/Target.h"
3430fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3530fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
3630fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h"
37b9556accSGreg Clayton #include "lldb/Target/StackID.h"
3830fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
3930fdc8d8SChris Lattner 
404c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
414c5de699SEli Friedman #include "lldb/API/SBValue.h"
424c5de699SEli Friedman #include "lldb/API/SBAddress.h"
4335e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h"
44dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
454c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h"
464c5de699SEli Friedman #include "lldb/API/SBThread.h"
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner using namespace lldb;
4930fdc8d8SChris Lattner using namespace lldb_private;
5030fdc8d8SChris Lattner 
51b9556accSGreg Clayton 
5230fdc8d8SChris Lattner SBFrame::SBFrame () :
537fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef())
5430fdc8d8SChris Lattner {
5530fdc8d8SChris Lattner }
5630fdc8d8SChris Lattner 
5769b582faSGreg Clayton SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) :
587fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef (lldb_object_sp))
5930fdc8d8SChris Lattner {
6069b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
61ceb6b139SCaroline Tice 
62ceb6b139SCaroline Tice     if (log)
63ceb6b139SCaroline Tice     {
64ceb6b139SCaroline Tice         SBStream sstr;
65ceb6b139SCaroline Tice         GetDescription (sstr);
664838131bSGreg Clayton         log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s",
67b9556accSGreg Clayton                      lldb_object_sp.get(), lldb_object_sp.get(), sstr.GetData());
68750cd175SCaroline Tice 
69ceb6b139SCaroline Tice     }
7030fdc8d8SChris Lattner }
7130fdc8d8SChris Lattner 
72efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) :
737fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp))
74efabb123SGreg Clayton {
75efabb123SGreg Clayton }
76efabb123SGreg Clayton 
77efabb123SGreg Clayton const SBFrame &
78efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs)
79efabb123SGreg Clayton {
80efabb123SGreg Clayton     if (this != &rhs)
817fdf9ef1SGreg Clayton         *m_opaque_sp = *rhs.m_opaque_sp;
82efabb123SGreg Clayton     return *this;
83efabb123SGreg Clayton }
84efabb123SGreg Clayton 
8530fdc8d8SChris Lattner SBFrame::~SBFrame()
8630fdc8d8SChris Lattner {
8730fdc8d8SChris Lattner }
8830fdc8d8SChris Lattner 
89b9556accSGreg Clayton StackFrameSP
90b9556accSGreg Clayton SBFrame::GetFrameSP() const
91b9556accSGreg Clayton {
92af2589eaSGreg Clayton     if (m_opaque_sp)
937fdf9ef1SGreg Clayton         return m_opaque_sp->GetFrameSP();
94af2589eaSGreg Clayton     return StackFrameSP();
95b9556accSGreg Clayton }
9630fdc8d8SChris Lattner 
9730fdc8d8SChris Lattner void
98b9556accSGreg Clayton SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp)
9930fdc8d8SChris Lattner {
1007fdf9ef1SGreg Clayton     return m_opaque_sp->SetFrameSP(lldb_object_sp);
101b9556accSGreg Clayton }
10230fdc8d8SChris Lattner 
10330fdc8d8SChris Lattner bool
10430fdc8d8SChris Lattner SBFrame::IsValid() const
10530fdc8d8SChris Lattner {
1067fdf9ef1SGreg Clayton     return GetFrameSP().get() != NULL;
10730fdc8d8SChris Lattner }
10830fdc8d8SChris Lattner 
10930fdc8d8SChris Lattner SBSymbolContext
11030fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const
11130fdc8d8SChris Lattner {
112c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11330fdc8d8SChris Lattner     SBSymbolContext sb_sym_ctx;
1144fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1154fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1164fc6cb9cSJim Ingham 
1177730b9a4SJim Ingham     StackFrame *frame = NULL;
118d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1197730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
1207730b9a4SJim Ingham     if (target && process)
121af67cecdSGreg Clayton     {
1227fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1237730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
1247730b9a4SJim Ingham         {
1257730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
1267730b9a4SJim Ingham             if (frame)
1277fdf9ef1SGreg Clayton             {
128d9e416c0SGreg Clayton                 sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope));
129af67cecdSGreg Clayton             }
130c9858e4dSGreg Clayton             else
131c9858e4dSGreg Clayton             {
132c9858e4dSGreg Clayton                 if (log)
1337730b9a4SJim Ingham                     log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
1347730b9a4SJim Ingham             }
1357730b9a4SJim Ingham         }
1367730b9a4SJim Ingham         else
1377730b9a4SJim Ingham         {
1387730b9a4SJim Ingham             if (log)
1397730b9a4SJim Ingham                 log->Printf ("SBFrame::GetSymbolContext () => error: process is running");
140c9858e4dSGreg Clayton         }
1417fdf9ef1SGreg Clayton     }
142ceb6b139SCaroline Tice 
143ceb6b139SCaroline Tice     if (log)
1444838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)",
145d9e416c0SGreg Clayton                      frame, resolve_scope, sb_sym_ctx.get());
146ceb6b139SCaroline Tice 
14730fdc8d8SChris Lattner     return sb_sym_ctx;
14830fdc8d8SChris Lattner }
14930fdc8d8SChris Lattner 
15030fdc8d8SChris Lattner SBModule
15130fdc8d8SChris Lattner SBFrame::GetModule () const
15230fdc8d8SChris Lattner {
153c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
15472eff18aSGreg Clayton     SBModule sb_module;
155acdbe816SGreg Clayton     ModuleSP module_sp;
1564fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1574fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1584fc6cb9cSJim Ingham 
1597730b9a4SJim Ingham     StackFrame *frame = NULL;
160d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1617730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
1627730b9a4SJim Ingham     if (target && process)
163af67cecdSGreg Clayton     {
1647fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1657730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
1667730b9a4SJim Ingham         {
1677730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
1687730b9a4SJim Ingham             if (frame)
1697fdf9ef1SGreg Clayton             {
170d9e416c0SGreg Clayton                 module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp;
171acdbe816SGreg Clayton                 sb_module.SetSP (module_sp);
172af67cecdSGreg Clayton             }
173c9858e4dSGreg Clayton             else
174c9858e4dSGreg Clayton             {
175c9858e4dSGreg Clayton                 if (log)
1767730b9a4SJim Ingham                     log->Printf ("SBFrame::GetModule () => error: could not reconstruct frame object for this SBFrame.");
1777730b9a4SJim Ingham             }
1787730b9a4SJim Ingham         }
1797730b9a4SJim Ingham         else
1807730b9a4SJim Ingham         {
1817730b9a4SJim Ingham             if (log)
1827730b9a4SJim Ingham                 log->Printf ("SBFrame::GetModule () => error: process is running");
183c9858e4dSGreg Clayton         }
1847fdf9ef1SGreg Clayton     }
18572eff18aSGreg Clayton 
1864838131bSGreg Clayton     if (log)
1874838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
188d9e416c0SGreg Clayton                      frame, module_sp.get());
1894838131bSGreg Clayton 
19030fdc8d8SChris Lattner     return sb_module;
19130fdc8d8SChris Lattner }
19230fdc8d8SChris Lattner 
19330fdc8d8SChris Lattner SBCompileUnit
19430fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
19530fdc8d8SChris Lattner {
196c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
19772eff18aSGreg Clayton     SBCompileUnit sb_comp_unit;
1984fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1994fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2004fc6cb9cSJim Ingham 
2017730b9a4SJim Ingham     StackFrame *frame = NULL;
202d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
2037730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
2047730b9a4SJim Ingham     if (target && process)
205af67cecdSGreg Clayton     {
2067fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2077730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
2087730b9a4SJim Ingham         {
2097730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
2107730b9a4SJim Ingham             if (frame)
2117fdf9ef1SGreg Clayton             {
212d9e416c0SGreg Clayton                 sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
213af67cecdSGreg Clayton             }
214c9858e4dSGreg Clayton             else
215c9858e4dSGreg Clayton             {
216ceb6b139SCaroline Tice                 if (log)
2177730b9a4SJim Ingham                     log->Printf ("SBFrame::GetCompileUnit () => error: could not reconstruct frame object for this SBFrame.");
2187730b9a4SJim Ingham             }
2197730b9a4SJim Ingham         }
2207730b9a4SJim Ingham         else
2217730b9a4SJim Ingham         {
2227730b9a4SJim Ingham             if (log)
2237730b9a4SJim Ingham                 log->Printf ("SBFrame::GetCompileUnit () => error: process is running");
224c9858e4dSGreg Clayton         }
225c9858e4dSGreg Clayton     }
226c9858e4dSGreg Clayton     if (log)
227c9858e4dSGreg Clayton         log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
228d9e416c0SGreg Clayton                      frame, sb_comp_unit.get());
229ceb6b139SCaroline Tice 
23030fdc8d8SChris Lattner     return sb_comp_unit;
23130fdc8d8SChris Lattner }
23230fdc8d8SChris Lattner 
23330fdc8d8SChris Lattner SBFunction
23430fdc8d8SChris Lattner SBFrame::GetFunction () const
23530fdc8d8SChris Lattner {
236c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
23772eff18aSGreg Clayton     SBFunction sb_function;
2384fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2394fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2404fc6cb9cSJim Ingham 
2417730b9a4SJim Ingham     StackFrame *frame = NULL;
242d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
2437730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
2447730b9a4SJim Ingham     if (target && process)
245af67cecdSGreg Clayton     {
2467fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2477730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
2487730b9a4SJim Ingham         {
2497730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
2507730b9a4SJim Ingham             if (frame)
2517fdf9ef1SGreg Clayton             {
252d9e416c0SGreg Clayton                 sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function);
253af67cecdSGreg Clayton             }
254c9858e4dSGreg Clayton             else
255c9858e4dSGreg Clayton             {
256c9858e4dSGreg Clayton                 if (log)
2577730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFunction () => error: could not reconstruct frame object for this SBFrame.");
2587730b9a4SJim Ingham             }
2597730b9a4SJim Ingham         }
2607730b9a4SJim Ingham         else
2617730b9a4SJim Ingham         {
2627730b9a4SJim Ingham             if (log)
2637730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFunction () => error: process is running");
2647fdf9ef1SGreg Clayton         }
265c9858e4dSGreg Clayton     }
2664838131bSGreg Clayton     if (log)
2674838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
268d9e416c0SGreg Clayton                      frame, sb_function.get());
2694838131bSGreg Clayton 
27030fdc8d8SChris Lattner     return sb_function;
27130fdc8d8SChris Lattner }
27230fdc8d8SChris Lattner 
2733b06557eSGreg Clayton SBSymbol
2743b06557eSGreg Clayton SBFrame::GetSymbol () const
2753b06557eSGreg Clayton {
276c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
27772eff18aSGreg Clayton     SBSymbol sb_symbol;
2784fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2794fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2804fc6cb9cSJim Ingham 
2817730b9a4SJim Ingham     StackFrame *frame = NULL;
282d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
2837730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
2847730b9a4SJim Ingham     if (target && process)
285af67cecdSGreg Clayton     {
2867fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2877730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
2887730b9a4SJim Ingham         {
2897730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
2907730b9a4SJim Ingham             if (frame)
2917fdf9ef1SGreg Clayton             {
292d9e416c0SGreg Clayton                 sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol);
293af67cecdSGreg Clayton             }
294c9858e4dSGreg Clayton             else
295c9858e4dSGreg Clayton             {
296c9858e4dSGreg Clayton                 if (log)
2977730b9a4SJim Ingham                     log->Printf ("SBFrame::GetSymbol () => error: could not reconstruct frame object for this SBFrame.");
2987730b9a4SJim Ingham             }
2997730b9a4SJim Ingham         }
3007730b9a4SJim Ingham         else
3017730b9a4SJim Ingham         {
3027730b9a4SJim Ingham             if (log)
3037730b9a4SJim Ingham                 log->Printf ("SBFrame::GetSymbol () => error: process is running");
3047fdf9ef1SGreg Clayton         }
305c9858e4dSGreg Clayton     }
3064838131bSGreg Clayton     if (log)
3074838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
308d9e416c0SGreg Clayton                      frame, sb_symbol.get());
3093b06557eSGreg Clayton     return sb_symbol;
3103b06557eSGreg Clayton }
3113b06557eSGreg Clayton 
31230fdc8d8SChris Lattner SBBlock
31330fdc8d8SChris Lattner SBFrame::GetBlock () const
31430fdc8d8SChris Lattner {
315c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
31672eff18aSGreg Clayton     SBBlock sb_block;
3174fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3184fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3194fc6cb9cSJim Ingham 
3207730b9a4SJim Ingham     StackFrame *frame = NULL;
321d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
3227730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
3237730b9a4SJim Ingham     if (target && process)
324af67cecdSGreg Clayton     {
3257fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3267730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
3277730b9a4SJim Ingham         {
3287730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
3297730b9a4SJim Ingham             if (frame)
3307fdf9ef1SGreg Clayton             {
331d9e416c0SGreg Clayton                 sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block);
332af67cecdSGreg Clayton             }
333c9858e4dSGreg Clayton             else
334c9858e4dSGreg Clayton             {
335c9858e4dSGreg Clayton                 if (log)
3367730b9a4SJim Ingham                     log->Printf ("SBFrame::GetBlock () => error: could not reconstruct frame object for this SBFrame.");
3377730b9a4SJim Ingham             }
3387730b9a4SJim Ingham         }
3397730b9a4SJim Ingham         else
3407730b9a4SJim Ingham         {
3417730b9a4SJim Ingham             if (log)
342c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", frame);
3437fdf9ef1SGreg Clayton         }
344c9858e4dSGreg Clayton     }
3454838131bSGreg Clayton     if (log)
3464838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
347d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
34830fdc8d8SChris Lattner     return sb_block;
34930fdc8d8SChris Lattner }
35030fdc8d8SChris Lattner 
35195897c6aSGreg Clayton SBBlock
35295897c6aSGreg Clayton SBFrame::GetFrameBlock () const
35395897c6aSGreg Clayton {
35472eff18aSGreg Clayton     SBBlock sb_block;
3554fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3564fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3574fc6cb9cSJim Ingham 
3587730b9a4SJim Ingham     StackFrame *frame = NULL;
359d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
360c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3617730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
3627730b9a4SJim Ingham     if (target && process)
363af67cecdSGreg Clayton     {
3647fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3657730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
3667730b9a4SJim Ingham         {
3677730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
3687730b9a4SJim Ingham             if (frame)
3697fdf9ef1SGreg Clayton             {
370d9e416c0SGreg Clayton                 sb_block.SetPtr(frame->GetFrameBlock ());
371af67cecdSGreg Clayton             }
372c9858e4dSGreg Clayton             else
373c9858e4dSGreg Clayton             {
374c9858e4dSGreg Clayton                 if (log)
3757730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFrameBlock () => error: could not reconstruct frame object for this SBFrame.");
3767730b9a4SJim Ingham             }
3777730b9a4SJim Ingham         }
3787730b9a4SJim Ingham         else
3797730b9a4SJim Ingham         {
3807730b9a4SJim Ingham             if (log)
3817730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFrameBlock () => error: process is running");
3827fdf9ef1SGreg Clayton         }
383c9858e4dSGreg Clayton     }
3844838131bSGreg Clayton     if (log)
3854838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
386d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
38795897c6aSGreg Clayton     return sb_block;
38895897c6aSGreg Clayton }
38995897c6aSGreg Clayton 
39030fdc8d8SChris Lattner SBLineEntry
39130fdc8d8SChris Lattner SBFrame::GetLineEntry () const
39230fdc8d8SChris Lattner {
393c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
39472eff18aSGreg Clayton     SBLineEntry sb_line_entry;
3954fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3964fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3974fc6cb9cSJim Ingham 
3987730b9a4SJim Ingham     StackFrame *frame = NULL;
399d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
4007730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
4017730b9a4SJim Ingham     if (target && process)
402af67cecdSGreg Clayton     {
4037fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4047730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
4057730b9a4SJim Ingham         {
4067730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
4077730b9a4SJim Ingham             if (frame)
4087fdf9ef1SGreg Clayton             {
409d9e416c0SGreg Clayton                 sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry);
410af67cecdSGreg Clayton             }
411c9858e4dSGreg Clayton             else
412c9858e4dSGreg Clayton             {
413c9858e4dSGreg Clayton                 if (log)
4147730b9a4SJim Ingham                     log->Printf ("SBFrame::GetLineEntry () => error: could not reconstruct frame object for this SBFrame.");
4157730b9a4SJim Ingham             }
4167730b9a4SJim Ingham         }
4177730b9a4SJim Ingham         else
4187730b9a4SJim Ingham         {
4197730b9a4SJim Ingham             if (log)
4207730b9a4SJim Ingham                 log->Printf ("SBFrame::GetLineEntry () => error: process is running");
4217fdf9ef1SGreg Clayton         }
422c9858e4dSGreg Clayton     }
4234838131bSGreg Clayton     if (log)
4244838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
425d9e416c0SGreg Clayton                      frame, sb_line_entry.get());
42630fdc8d8SChris Lattner     return sb_line_entry;
42730fdc8d8SChris Lattner }
42830fdc8d8SChris Lattner 
42930fdc8d8SChris Lattner uint32_t
43030fdc8d8SChris Lattner SBFrame::GetFrameID () const
43130fdc8d8SChris Lattner {
432b9556accSGreg Clayton     uint32_t frame_idx = UINT32_MAX;
433b9556accSGreg Clayton 
4347fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
435d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
4367fdf9ef1SGreg Clayton     if (frame)
437d9e416c0SGreg Clayton         frame_idx = frame->GetFrameIndex ();
4384838131bSGreg Clayton 
43969b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4404838131bSGreg Clayton     if (log)
4414838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameID () => %u",
442d9e416c0SGreg Clayton                      frame, frame_idx);
4434838131bSGreg Clayton     return frame_idx;
44430fdc8d8SChris Lattner }
44530fdc8d8SChris Lattner 
44669b582faSGreg Clayton addr_t
44730fdc8d8SChris Lattner SBFrame::GetPC () const
44830fdc8d8SChris Lattner {
449c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
45069b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
4514fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4524fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4534fc6cb9cSJim Ingham 
4547730b9a4SJim Ingham     StackFrame *frame = NULL;
455d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
4567730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
4577730b9a4SJim Ingham     if (target && process)
458af67cecdSGreg Clayton     {
4597fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4607730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
4617730b9a4SJim Ingham         {
4627730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
4637730b9a4SJim Ingham             if (frame)
4647fdf9ef1SGreg Clayton             {
465d9e416c0SGreg Clayton                 addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target);
466af67cecdSGreg Clayton             }
467c9858e4dSGreg Clayton             else
468c9858e4dSGreg Clayton             {
469c9858e4dSGreg Clayton                 if (log)
4707730b9a4SJim Ingham                     log->Printf ("SBFrame::GetPC () => error: could not reconstruct frame object for this SBFrame.");
4717730b9a4SJim Ingham             }
4727730b9a4SJim Ingham         }
4737730b9a4SJim Ingham         else
4747730b9a4SJim Ingham         {
4757730b9a4SJim Ingham             if (log)
4767730b9a4SJim Ingham                 log->Printf ("SBFrame::GetPC () => error: process is running");
477c9858e4dSGreg Clayton         }
4787fdf9ef1SGreg Clayton     }
479ceb6b139SCaroline Tice 
480ceb6b139SCaroline Tice     if (log)
481d01b2953SDaniel Malea         log->Printf ("SBFrame(%p)::GetPC () => 0x%" PRIx64, frame, addr);
482ceb6b139SCaroline Tice 
483ceb6b139SCaroline Tice     return addr;
48430fdc8d8SChris Lattner }
48530fdc8d8SChris Lattner 
48630fdc8d8SChris Lattner bool
48769b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc)
48830fdc8d8SChris Lattner {
489c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
490ceb6b139SCaroline Tice     bool ret_val = false;
4914fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4924fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4934fc6cb9cSJim Ingham 
4947730b9a4SJim Ingham     StackFrame *frame = NULL;
495d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
4967730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
4977730b9a4SJim Ingham     if (target && process)
498af67cecdSGreg Clayton     {
4997fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5007730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5017730b9a4SJim Ingham         {
5027730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5037730b9a4SJim Ingham             if (frame)
5047fdf9ef1SGreg Clayton             {
505d9e416c0SGreg Clayton                 ret_val = frame->GetRegisterContext()->SetPC (new_pc);
506af67cecdSGreg Clayton             }
507c9858e4dSGreg Clayton             else
508c9858e4dSGreg Clayton             {
509c9858e4dSGreg Clayton                 if (log)
5107730b9a4SJim Ingham                     log->Printf ("SBFrame::SetPC () => error: could not reconstruct frame object for this SBFrame.");
5117730b9a4SJim Ingham             }
5127730b9a4SJim Ingham         }
5137730b9a4SJim Ingham         else
5147730b9a4SJim Ingham         {
5157730b9a4SJim Ingham             if (log)
5167730b9a4SJim Ingham                 log->Printf ("SBFrame::SetPC () => error: process is running");
517c9858e4dSGreg Clayton         }
5187fdf9ef1SGreg Clayton     }
519ceb6b139SCaroline Tice 
520ceb6b139SCaroline Tice     if (log)
521d01b2953SDaniel Malea         log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i",
522d9e416c0SGreg Clayton                      frame, new_pc, ret_val);
523ceb6b139SCaroline Tice 
524ceb6b139SCaroline Tice     return ret_val;
52530fdc8d8SChris Lattner }
52630fdc8d8SChris Lattner 
52769b582faSGreg Clayton addr_t
52830fdc8d8SChris Lattner SBFrame::GetSP () const
52930fdc8d8SChris Lattner {
530c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5314838131bSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
5324fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5334fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5344fc6cb9cSJim Ingham 
5357730b9a4SJim Ingham     StackFrame *frame = NULL;
536d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
5377730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
5387730b9a4SJim Ingham     if (target && process)
539af67cecdSGreg Clayton     {
5407fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5417730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5427730b9a4SJim Ingham         {
5437730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5447730b9a4SJim Ingham             if (frame)
5457fdf9ef1SGreg Clayton             {
546d9e416c0SGreg Clayton                 addr = frame->GetRegisterContext()->GetSP();
547af67cecdSGreg Clayton             }
548c9858e4dSGreg Clayton             else
549c9858e4dSGreg Clayton             {
550c9858e4dSGreg Clayton                 if (log)
5517730b9a4SJim Ingham                     log->Printf ("SBFrame::GetSP () => error: could not reconstruct frame object for this SBFrame.");
5527730b9a4SJim Ingham             }
5537730b9a4SJim Ingham         }
5547730b9a4SJim Ingham         else
5557730b9a4SJim Ingham         {
5567730b9a4SJim Ingham             if (log)
5577730b9a4SJim Ingham                 log->Printf ("SBFrame::GetSP () => error: process is running");
5587fdf9ef1SGreg Clayton         }
559c9858e4dSGreg Clayton     }
5604838131bSGreg Clayton     if (log)
561d01b2953SDaniel Malea         log->Printf ("SBFrame(%p)::GetSP () => 0x%" PRIx64, frame, addr);
5624838131bSGreg Clayton 
5634838131bSGreg Clayton     return addr;
56430fdc8d8SChris Lattner }
56530fdc8d8SChris Lattner 
56630fdc8d8SChris Lattner 
56769b582faSGreg Clayton addr_t
56830fdc8d8SChris Lattner SBFrame::GetFP () const
56930fdc8d8SChris Lattner {
570c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
57169b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
5724fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5734fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5744fc6cb9cSJim Ingham 
5757730b9a4SJim Ingham     StackFrame *frame = NULL;
576d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
5777730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
5787730b9a4SJim Ingham     if (target && process)
579af67cecdSGreg Clayton     {
5807fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5817730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5827730b9a4SJim Ingham         {
5837730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5847730b9a4SJim Ingham             if (frame)
5857fdf9ef1SGreg Clayton             {
586d9e416c0SGreg Clayton                 addr = frame->GetRegisterContext()->GetFP();
587af67cecdSGreg Clayton             }
588c9858e4dSGreg Clayton             else
589c9858e4dSGreg Clayton             {
590c9858e4dSGreg Clayton                 if (log)
5917730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFP () => error: could not reconstruct frame object for this SBFrame.");
5927730b9a4SJim Ingham             }
5937730b9a4SJim Ingham         }
5947730b9a4SJim Ingham         else
5957730b9a4SJim Ingham         {
5967730b9a4SJim Ingham             if (log)
5977730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFP () => error: process is running");
598c9858e4dSGreg Clayton         }
5997fdf9ef1SGreg Clayton     }
600ceb6b139SCaroline Tice 
601ceb6b139SCaroline Tice     if (log)
602d01b2953SDaniel Malea         log->Printf ("SBFrame(%p)::GetFP () => 0x%" PRIx64, frame, addr);
603ceb6b139SCaroline Tice     return addr;
60430fdc8d8SChris Lattner }
60530fdc8d8SChris Lattner 
60630fdc8d8SChris Lattner 
60730fdc8d8SChris Lattner SBAddress
60830fdc8d8SChris Lattner SBFrame::GetPCAddress () const
60930fdc8d8SChris Lattner {
610c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
61130fdc8d8SChris Lattner     SBAddress sb_addr;
6124fc6cb9cSJim Ingham     Mutex::Locker api_locker;
6134fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
6144fc6cb9cSJim Ingham 
615d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
616d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
6177730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
6187730b9a4SJim Ingham     if (target && process)
619af67cecdSGreg Clayton     {
6207fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6217730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
6227730b9a4SJim Ingham         {
6237730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
6247730b9a4SJim Ingham             if (frame)
6257fdf9ef1SGreg Clayton             {
626d9e416c0SGreg Clayton                 sb_addr.SetAddress (&frame->GetFrameCodeAddress());
627af67cecdSGreg Clayton             }
628c9858e4dSGreg Clayton             else
629c9858e4dSGreg Clayton             {
630c9858e4dSGreg Clayton                 if (log)
6317730b9a4SJim Ingham                     log->Printf ("SBFrame::GetPCAddress () => error: could not reconstruct frame object for this SBFrame.");
6327730b9a4SJim Ingham             }
6337730b9a4SJim Ingham         }
6347730b9a4SJim Ingham         else
6357730b9a4SJim Ingham         {
6367730b9a4SJim Ingham             if (log)
6377730b9a4SJim Ingham                 log->Printf ("SBFrame::GetPCAddress () => error: process is running");
6387fdf9ef1SGreg Clayton         }
639c9858e4dSGreg Clayton     }
6404838131bSGreg Clayton     if (log)
641d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get());
64230fdc8d8SChris Lattner     return sb_addr;
64330fdc8d8SChris Lattner }
64430fdc8d8SChris Lattner 
64530fdc8d8SChris Lattner void
64630fdc8d8SChris Lattner SBFrame::Clear()
64730fdc8d8SChris Lattner {
648af2589eaSGreg Clayton     m_opaque_sp->Clear();
64930fdc8d8SChris Lattner }
65030fdc8d8SChris Lattner 
6517edbdfc9SGreg Clayton lldb::SBValue
6527edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path)
6537edbdfc9SGreg Clayton {
6547edbdfc9SGreg Clayton     SBValue sb_value;
6557fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
656d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
657d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
658d9e416c0SGreg Clayton     if (frame && target)
6597edbdfc9SGreg Clayton     {
660d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
6617edbdfc9SGreg Clayton         sb_value = GetValueForVariablePath (var_path, use_dynamic);
6627edbdfc9SGreg Clayton     }
6637edbdfc9SGreg Clayton     return sb_value;
6647edbdfc9SGreg Clayton }
6657edbdfc9SGreg Clayton 
6667edbdfc9SGreg Clayton lldb::SBValue
6677edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic)
6687edbdfc9SGreg Clayton {
6697edbdfc9SGreg Clayton     SBValue sb_value;
6704fc6cb9cSJim Ingham     Mutex::Locker api_locker;
6717730b9a4SJim Ingham     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6727730b9a4SJim Ingham     if (var_path == NULL || var_path[0] == '\0')
6737730b9a4SJim Ingham     {
6747730b9a4SJim Ingham         if (log)
6757730b9a4SJim Ingham             log->Printf ("SBFrame::GetValueForVariablePath called with empty variable path.");
6767730b9a4SJim Ingham         return sb_value;
6777730b9a4SJim Ingham     }
6787730b9a4SJim Ingham 
6794fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
6804fc6cb9cSJim Ingham 
681d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
682d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
6837730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
6847730b9a4SJim Ingham     if (target && process)
6857edbdfc9SGreg Clayton     {
6867fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6877730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
6887730b9a4SJim Ingham         {
6897730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
6907730b9a4SJim Ingham             if (frame)
6917fdf9ef1SGreg Clayton             {
6927edbdfc9SGreg Clayton                 VariableSP var_sp;
6937edbdfc9SGreg Clayton                 Error error;
694d9e416c0SGreg Clayton                 ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path,
695e3e91517SEnrico Granata                                                                                   eNoDynamicValues,
696685c88c5SGreg Clayton                                                                                   StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
6977edbdfc9SGreg Clayton                                                                                   var_sp,
6987edbdfc9SGreg Clayton                                                                                   error));
699e3e91517SEnrico Granata                 sb_value.SetSP(value_sp, use_dynamic);
7007edbdfc9SGreg Clayton             }
701c9858e4dSGreg Clayton             else
702c9858e4dSGreg Clayton             {
703c9858e4dSGreg Clayton                 if (log)
7047730b9a4SJim Ingham                     log->Printf ("SBFrame::GetValueForVariablePath () => error: could not reconstruct frame object for this SBFrame.");
7057730b9a4SJim Ingham             }
7067730b9a4SJim Ingham         }
7077730b9a4SJim Ingham         else
7087730b9a4SJim Ingham         {
7097730b9a4SJim Ingham             if (log)
7107730b9a4SJim Ingham                 log->Printf ("SBFrame::GetValueForVariablePath () => error: process is running");
711c9858e4dSGreg Clayton         }
7127fdf9ef1SGreg Clayton     }
7137edbdfc9SGreg Clayton     return sb_value;
7147edbdfc9SGreg Clayton }
7157edbdfc9SGreg Clayton 
71630fdc8d8SChris Lattner SBValue
71769b582faSGreg Clayton SBFrame::FindVariable (const char *name)
71830fdc8d8SChris Lattner {
719316d498bSGreg Clayton     SBValue value;
7207fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
721d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
722d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
723d9e416c0SGreg Clayton     if (frame && target)
724316d498bSGreg Clayton     {
725d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
726316d498bSGreg Clayton         value = FindVariable (name, use_dynamic);
727316d498bSGreg Clayton     }
728316d498bSGreg Clayton     return value;
72978a685aaSJim Ingham }
73078a685aaSJim Ingham 
7317edbdfc9SGreg Clayton 
73278a685aaSJim Ingham SBValue
7332837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
73478a685aaSJim Ingham {
735c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
73669b582faSGreg Clayton     VariableSP var_sp;
73758b59f95SJim Ingham     SBValue sb_value;
7387730b9a4SJim Ingham 
7397730b9a4SJim Ingham     if (name == NULL || name[0] == '\0')
7407730b9a4SJim Ingham     {
7417730b9a4SJim Ingham         if (log)
7427730b9a4SJim Ingham             log->Printf ("SBFrame::FindVariable called with empty name");
7437730b9a4SJim Ingham         return sb_value;
7447730b9a4SJim Ingham     }
7457730b9a4SJim Ingham 
74681e871edSGreg Clayton     ValueObjectSP value_sp;
7474fc6cb9cSJim Ingham     Mutex::Locker api_locker;
7484fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
7494fc6cb9cSJim Ingham 
7507730b9a4SJim Ingham     StackFrame *frame = NULL;
751d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
7527730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
7537730b9a4SJim Ingham     if (target && process)
75430fdc8d8SChris Lattner     {
7557fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
7567730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
7577730b9a4SJim Ingham         {
7587730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
7597730b9a4SJim Ingham             if (frame)
7607fdf9ef1SGreg Clayton             {
76169b582faSGreg Clayton                 VariableList variable_list;
762d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
76330fdc8d8SChris Lattner 
76472eff18aSGreg Clayton                 if (sc.block)
76530fdc8d8SChris Lattner                 {
76672eff18aSGreg Clayton                     const bool can_create = true;
76772eff18aSGreg Clayton                     const bool get_parent_variables = true;
76872eff18aSGreg Clayton                     const bool stop_if_block_is_inlined_function = true;
76972eff18aSGreg Clayton 
77072eff18aSGreg Clayton                     if (sc.block->AppendVariables (can_create,
77172eff18aSGreg Clayton                                                    get_parent_variables,
77272eff18aSGreg Clayton                                                    stop_if_block_is_inlined_function,
77372eff18aSGreg Clayton                                                    &variable_list))
77472eff18aSGreg Clayton                     {
77569b582faSGreg Clayton                         var_sp = variable_list.FindVariable (ConstString(name));
77630fdc8d8SChris Lattner                     }
77772eff18aSGreg Clayton                 }
77830fdc8d8SChris Lattner 
7794838131bSGreg Clayton                 if (var_sp)
78081e871edSGreg Clayton                 {
781e3e91517SEnrico Granata                     value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues);
782e3e91517SEnrico Granata                     sb_value.SetSP(value_sp, use_dynamic);
78381e871edSGreg Clayton                 }
7847fdf9ef1SGreg Clayton             }
785c9858e4dSGreg Clayton             else
786c9858e4dSGreg Clayton             {
787c9858e4dSGreg Clayton                 if (log)
7887730b9a4SJim Ingham                     log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame.");
7897730b9a4SJim Ingham             }
7907730b9a4SJim Ingham         }
7917730b9a4SJim Ingham         else
7927730b9a4SJim Ingham         {
7937730b9a4SJim Ingham             if (log)
7947730b9a4SJim Ingham                 log->Printf ("SBFrame::FindVariable () => error: process is running");
795c9858e4dSGreg Clayton         }
796316d498bSGreg Clayton     }
797316d498bSGreg Clayton 
7984838131bSGreg Clayton     if (log)
79969b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
800d9e416c0SGreg Clayton                      frame, name, value_sp.get());
8014838131bSGreg Clayton 
802dde9cff3SCaroline Tice     return sb_value;
803dde9cff3SCaroline Tice }
804dde9cff3SCaroline Tice 
80530fdc8d8SChris Lattner SBValue
80669b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type)
80730fdc8d8SChris Lattner {
808316d498bSGreg Clayton     SBValue value;
8097fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
810d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
811d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
812d9e416c0SGreg Clayton     if (frame && target)
813316d498bSGreg Clayton     {
814d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
815316d498bSGreg Clayton         value = FindValue (name, value_type, use_dynamic);
816316d498bSGreg Clayton     }
817316d498bSGreg Clayton     return value;
81878a685aaSJim Ingham }
81978a685aaSJim Ingham 
82078a685aaSJim Ingham SBValue
8212837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
82278a685aaSJim Ingham {
823c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
82469b582faSGreg Clayton     SBValue sb_value;
8257730b9a4SJim Ingham 
8267730b9a4SJim Ingham     if (name == NULL || name[0] == '\0')
8277730b9a4SJim Ingham     {
8287730b9a4SJim Ingham         if (log)
8297730b9a4SJim Ingham             log->Printf ("SBFrame::FindValue called with empty name.");
8307730b9a4SJim Ingham         return sb_value;
8317730b9a4SJim Ingham     }
8327730b9a4SJim Ingham 
83381e871edSGreg Clayton     ValueObjectSP value_sp;
8344fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8354fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8364fc6cb9cSJim Ingham 
8377730b9a4SJim Ingham     StackFrame *frame = NULL;
838d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
8397730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
8407730b9a4SJim Ingham     if (target && process)
84130fdc8d8SChris Lattner     {
8427fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8437730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
8447730b9a4SJim Ingham         {
8457730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
8467730b9a4SJim Ingham             if (frame)
8477fdf9ef1SGreg Clayton             {
84869b582faSGreg Clayton                 switch (value_type)
84930fdc8d8SChris Lattner                 {
85069b582faSGreg Clayton                 case eValueTypeVariableGlobal:      // global variable
85169b582faSGreg Clayton                 case eValueTypeVariableStatic:      // static variable
85269b582faSGreg Clayton                 case eValueTypeVariableArgument:    // function argument variables
85369b582faSGreg Clayton                 case eValueTypeVariableLocal:       // function local variables
85469b582faSGreg Clayton                     {
855d9e416c0SGreg Clayton                         VariableList *variable_list = frame->GetVariableList(true);
85672eff18aSGreg Clayton 
857d9e416c0SGreg Clayton                         SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
85872eff18aSGreg Clayton 
85972eff18aSGreg Clayton                         const bool can_create = true;
86072eff18aSGreg Clayton                         const bool get_parent_variables = true;
86172eff18aSGreg Clayton                         const bool stop_if_block_is_inlined_function = true;
86272eff18aSGreg Clayton 
86372eff18aSGreg Clayton                         if (sc.block && sc.block->AppendVariables (can_create,
86472eff18aSGreg Clayton                                                                    get_parent_variables,
86572eff18aSGreg Clayton                                                                    stop_if_block_is_inlined_function,
866e85d9cb8SJohnny Chen                                                                    variable_list))
867beae523aSJohnny Chen                         {
86869b582faSGreg Clayton                             ConstString const_name(name);
869e85d9cb8SJohnny Chen                             const uint32_t num_variables = variable_list->GetSize();
87072eff18aSGreg Clayton                             for (uint32_t i = 0; i < num_variables; ++i)
87130fdc8d8SChris Lattner                             {
87269b582faSGreg Clayton                                 VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
87369b582faSGreg Clayton                                 if (variable_sp &&
87469b582faSGreg Clayton                                     variable_sp->GetScope() == value_type &&
87569b582faSGreg Clayton                                     variable_sp->GetName() == const_name)
876beae523aSJohnny Chen                                 {
877e3e91517SEnrico Granata                                     value_sp = frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues);
878e3e91517SEnrico Granata                                     sb_value.SetSP (value_sp, use_dynamic);
879beae523aSJohnny Chen                                     break;
880beae523aSJohnny Chen                                 }
88130fdc8d8SChris Lattner                             }
88230fdc8d8SChris Lattner                         }
88330fdc8d8SChris Lattner                     }
88469b582faSGreg Clayton                     break;
88569b582faSGreg Clayton 
88669b582faSGreg Clayton                 case eValueTypeRegister:            // stack frame register value
88769b582faSGreg Clayton                     {
888d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
88969b582faSGreg Clayton                         if (reg_ctx)
89069b582faSGreg Clayton                         {
89169b582faSGreg Clayton                             const uint32_t num_regs = reg_ctx->GetRegisterCount();
89269b582faSGreg Clayton                             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
89369b582faSGreg Clayton                             {
89469b582faSGreg Clayton                                 const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
89569b582faSGreg Clayton                                 if (reg_info &&
89669b582faSGreg Clayton                                     ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
89769b582faSGreg Clayton                                      (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
89869b582faSGreg Clayton                                 {
899d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
90081e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
90181e871edSGreg Clayton                                     break;
90269b582faSGreg Clayton                                 }
90369b582faSGreg Clayton                             }
90469b582faSGreg Clayton                         }
90569b582faSGreg Clayton                     }
90669b582faSGreg Clayton                     break;
90769b582faSGreg Clayton 
90869b582faSGreg Clayton                 case eValueTypeRegisterSet:         // A collection of stack frame register values
90969b582faSGreg Clayton                     {
910d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
91169b582faSGreg Clayton                         if (reg_ctx)
91269b582faSGreg Clayton                         {
91369b582faSGreg Clayton                             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
91469b582faSGreg Clayton                             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
91569b582faSGreg Clayton                             {
91669b582faSGreg Clayton                                 const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
91769b582faSGreg Clayton                                 if (reg_set &&
91869b582faSGreg Clayton                                     ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
91969b582faSGreg Clayton                                      (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
92069b582faSGreg Clayton                                 {
921d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
92281e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
92381e871edSGreg Clayton                                     break;
92469b582faSGreg Clayton                                 }
92569b582faSGreg Clayton                             }
92669b582faSGreg Clayton                         }
92769b582faSGreg Clayton                     }
92869b582faSGreg Clayton                     break;
92969b582faSGreg Clayton 
93069b582faSGreg Clayton                 case eValueTypeConstResult:         // constant result variables
93169b582faSGreg Clayton                     {
93269b582faSGreg Clayton                         ConstString const_name(name);
933d9e416c0SGreg Clayton                         ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name));
93469b582faSGreg Clayton                         if (expr_var_sp)
93581e871edSGreg Clayton                         {
93681e871edSGreg Clayton                             value_sp = expr_var_sp->GetValueObject();
937e3e91517SEnrico Granata                             sb_value.SetSP (value_sp, use_dynamic);
93881e871edSGreg Clayton                         }
93969b582faSGreg Clayton                     }
94069b582faSGreg Clayton                     break;
94169b582faSGreg Clayton 
94269b582faSGreg Clayton                 default:
94369b582faSGreg Clayton                     break;
94469b582faSGreg Clayton                 }
945beae523aSJohnny Chen             }
946c9858e4dSGreg Clayton             else
947c9858e4dSGreg Clayton             {
948c9858e4dSGreg Clayton                 if (log)
9497730b9a4SJim Ingham                     log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame.");
9507730b9a4SJim Ingham             }
9517730b9a4SJim Ingham         }
9527730b9a4SJim Ingham         else
9537730b9a4SJim Ingham         {
9547730b9a4SJim Ingham             if (log)
9557730b9a4SJim Ingham                 log->Printf ("SBFrame::FindValue () => error: process is running");
956c9858e4dSGreg Clayton         }
9577fdf9ef1SGreg Clayton     }
958dde9cff3SCaroline Tice 
9594838131bSGreg Clayton     if (log)
96069b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
961d9e416c0SGreg Clayton                      frame, name, value_type, value_sp.get());
9624838131bSGreg Clayton 
9634838131bSGreg Clayton 
964dde9cff3SCaroline Tice     return sb_value;
965dde9cff3SCaroline Tice }
966dde9cff3SCaroline Tice 
96730fdc8d8SChris Lattner bool
96835e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const
96935e2ab60SJohnny Chen {
97035e2ab60SJohnny Chen     lldb::StackFrameSP this_sp = GetFrameSP();
97135e2ab60SJohnny Chen     lldb::StackFrameSP that_sp = that.GetFrameSP();
97235e2ab60SJohnny Chen     return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
97335e2ab60SJohnny Chen }
97435e2ab60SJohnny Chen 
97535e2ab60SJohnny Chen bool
97630fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
97730fdc8d8SChris Lattner {
97835e2ab60SJohnny Chen     return IsEqual(rhs);
97930fdc8d8SChris Lattner }
98030fdc8d8SChris Lattner 
98130fdc8d8SChris Lattner bool
98230fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
98330fdc8d8SChris Lattner {
98435e2ab60SJohnny Chen     return !IsEqual(rhs);
985481cef25SGreg Clayton }
98630fdc8d8SChris Lattner 
98730fdc8d8SChris Lattner SBThread
98830fdc8d8SChris Lattner SBFrame::GetThread () const
98930fdc8d8SChris Lattner {
99069b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
991ceb6b139SCaroline Tice 
9927fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
993d9e416c0SGreg Clayton     ThreadSP thread_sp (exe_ctx.GetThreadSP());
994d9e416c0SGreg Clayton     SBThread sb_thread (thread_sp);
995ceb6b139SCaroline Tice 
996ceb6b139SCaroline Tice     if (log)
997750cd175SCaroline Tice     {
998750cd175SCaroline Tice         SBStream sstr;
999750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
1000d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
1001d9e416c0SGreg Clayton                      exe_ctx.GetFramePtr(),
1002d9e416c0SGreg Clayton                      thread_sp.get(),
1003d9e416c0SGreg Clayton                      sstr.GetData());
1004750cd175SCaroline Tice     }
1005ceb6b139SCaroline Tice 
100630fdc8d8SChris Lattner     return sb_thread;
100730fdc8d8SChris Lattner }
100830fdc8d8SChris Lattner 
100930fdc8d8SChris Lattner const char *
101030fdc8d8SChris Lattner SBFrame::Disassemble () const
101130fdc8d8SChris Lattner {
1012c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10134838131bSGreg Clayton     const char *disassembly = NULL;
10144fc6cb9cSJim Ingham     Mutex::Locker api_locker;
10154fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
10164fc6cb9cSJim Ingham 
10177730b9a4SJim Ingham     StackFrame *frame = NULL;
1018d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
10197730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
10207730b9a4SJim Ingham     if (target && process)
1021af67cecdSGreg Clayton     {
10227fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10237730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
10247730b9a4SJim Ingham         {
10257730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
10267730b9a4SJim Ingham             if (frame)
10277fdf9ef1SGreg Clayton             {
1028d9e416c0SGreg Clayton                 disassembly = frame->Disassemble();
1029af67cecdSGreg Clayton             }
1030c9858e4dSGreg Clayton             else
1031c9858e4dSGreg Clayton             {
1032c9858e4dSGreg Clayton                 if (log)
10337730b9a4SJim Ingham                     log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame.");
10347730b9a4SJim Ingham             }
10357730b9a4SJim Ingham         }
10367730b9a4SJim Ingham         else
10377730b9a4SJim Ingham         {
10387730b9a4SJim Ingham             if (log)
10397730b9a4SJim Ingham                 log->Printf ("SBFrame::Disassemble () => error: process is running");
10407fdf9ef1SGreg Clayton         }
1041c9858e4dSGreg Clayton     }
10424838131bSGreg Clayton 
10434838131bSGreg Clayton     if (log)
1044d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly);
10454838131bSGreg Clayton 
10464838131bSGreg Clayton     return disassembly;
104730fdc8d8SChris Lattner }
104830fdc8d8SChris Lattner 
104930fdc8d8SChris Lattner 
105030fdc8d8SChris Lattner SBValueList
105130fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
105230fdc8d8SChris Lattner                        bool locals,
105330fdc8d8SChris Lattner                        bool statics,
105430fdc8d8SChris Lattner                        bool in_scope_only)
105530fdc8d8SChris Lattner {
1056316d498bSGreg Clayton     SBValueList value_list;
10577fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1058d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1059d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1060d9e416c0SGreg Clayton     if (frame && target)
1061316d498bSGreg Clayton     {
1062d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
1063316d498bSGreg Clayton         value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic);
1064316d498bSGreg Clayton     }
1065316d498bSGreg Clayton     return value_list;
106678a685aaSJim Ingham }
106778a685aaSJim Ingham 
106878a685aaSJim Ingham SBValueList
106978a685aaSJim Ingham SBFrame::GetVariables (bool arguments,
107078a685aaSJim Ingham                        bool locals,
107178a685aaSJim Ingham                        bool statics,
107278a685aaSJim Ingham                        bool in_scope_only,
10732837b766SJim Ingham                        lldb::DynamicValueType  use_dynamic)
107478a685aaSJim Ingham {
107569b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1076ceb6b139SCaroline Tice 
1077b9556accSGreg Clayton     SBValueList value_list;
10784fc6cb9cSJim Ingham     Mutex::Locker api_locker;
10794fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
10804fc6cb9cSJim Ingham 
10817730b9a4SJim Ingham     StackFrame *frame = NULL;
1082d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1083b9556accSGreg Clayton 
1084ceb6b139SCaroline Tice     if (log)
10857730b9a4SJim Ingham         log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
10864838131bSGreg Clayton                      arguments,
10874838131bSGreg Clayton                      locals,
10884838131bSGreg Clayton                      statics,
10894838131bSGreg Clayton                      in_scope_only);
1090ceb6b139SCaroline Tice 
10917730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
10927730b9a4SJim Ingham     if (target && process)
109330fdc8d8SChris Lattner     {
10947fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10957730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
10967fdf9ef1SGreg Clayton         {
10977730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
10987730b9a4SJim Ingham             if (frame)
10997730b9a4SJim Ingham             {
110030fdc8d8SChris Lattner                 size_t i;
1101af67cecdSGreg Clayton                 VariableList *variable_list = NULL;
1102d9e416c0SGreg Clayton                 variable_list = frame->GetVariableList(true);
110330fdc8d8SChris Lattner                 if (variable_list)
110430fdc8d8SChris Lattner                 {
110530fdc8d8SChris Lattner                     const size_t num_variables = variable_list->GetSize();
110630fdc8d8SChris Lattner                     if (num_variables)
110730fdc8d8SChris Lattner                     {
110830fdc8d8SChris Lattner                         for (i = 0; i < num_variables; ++i)
110930fdc8d8SChris Lattner                         {
111030fdc8d8SChris Lattner                             VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
111130fdc8d8SChris Lattner                             if (variable_sp)
111230fdc8d8SChris Lattner                             {
111330fdc8d8SChris Lattner                                 bool add_variable = false;
111430fdc8d8SChris Lattner                                 switch (variable_sp->GetScope())
111530fdc8d8SChris Lattner                                 {
111630fdc8d8SChris Lattner                                 case eValueTypeVariableGlobal:
111730fdc8d8SChris Lattner                                 case eValueTypeVariableStatic:
111830fdc8d8SChris Lattner                                     add_variable = statics;
111930fdc8d8SChris Lattner                                     break;
112030fdc8d8SChris Lattner 
112130fdc8d8SChris Lattner                                 case eValueTypeVariableArgument:
112230fdc8d8SChris Lattner                                     add_variable = arguments;
112330fdc8d8SChris Lattner                                     break;
112430fdc8d8SChris Lattner 
112530fdc8d8SChris Lattner                                 case eValueTypeVariableLocal:
112630fdc8d8SChris Lattner                                     add_variable = locals;
112730fdc8d8SChris Lattner                                     break;
1128c982c768SGreg Clayton 
1129c982c768SGreg Clayton                                 default:
1130c982c768SGreg Clayton                                     break;
113130fdc8d8SChris Lattner                                 }
113230fdc8d8SChris Lattner                                 if (add_variable)
113330fdc8d8SChris Lattner                                 {
1134d9e416c0SGreg Clayton                                     if (in_scope_only && !variable_sp->IsInScope(frame))
113530fdc8d8SChris Lattner                                         continue;
113630fdc8d8SChris Lattner 
1137e3e91517SEnrico Granata                                     ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues));
1138e3e91517SEnrico Granata                                     SBValue value_sb;
1139e3e91517SEnrico Granata                                     value_sb.SetSP(valobj_sp,use_dynamic);
1140e3e91517SEnrico Granata                                     value_list.Append(value_sb);
114130fdc8d8SChris Lattner                                 }
114230fdc8d8SChris Lattner                             }
114330fdc8d8SChris Lattner                         }
114430fdc8d8SChris Lattner                     }
114530fdc8d8SChris Lattner                 }
114630fdc8d8SChris Lattner             }
1147c9858e4dSGreg Clayton             else
1148c9858e4dSGreg Clayton             {
1149c9858e4dSGreg Clayton                 if (log)
11507730b9a4SJim Ingham                     log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
11517730b9a4SJim Ingham             }
11527730b9a4SJim Ingham         }
11537730b9a4SJim Ingham         else
11547730b9a4SJim Ingham         {
11557730b9a4SJim Ingham             if (log)
11567730b9a4SJim Ingham                 log->Printf ("SBFrame::GetVariables () => error: process is running");
1157c9858e4dSGreg Clayton         }
11587fdf9ef1SGreg Clayton     }
1159ceb6b139SCaroline Tice 
1160ceb6b139SCaroline Tice     if (log)
1161ceb6b139SCaroline Tice     {
1162*08ec0b61SEnrico Granata         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame, value_list.opaque_ptr());
1163ceb6b139SCaroline Tice     }
1164ceb6b139SCaroline Tice 
116530fdc8d8SChris Lattner     return value_list;
116630fdc8d8SChris Lattner }
116730fdc8d8SChris Lattner 
116869b582faSGreg Clayton SBValueList
116930fdc8d8SChris Lattner SBFrame::GetRegisters ()
117030fdc8d8SChris Lattner {
117169b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1172ceb6b139SCaroline Tice 
117330fdc8d8SChris Lattner     SBValueList value_list;
11744fc6cb9cSJim Ingham     Mutex::Locker api_locker;
11754fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
11764fc6cb9cSJim Ingham 
11777730b9a4SJim Ingham     StackFrame *frame = NULL;
1178d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
11797730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
11807730b9a4SJim Ingham     if (target && process)
118130fdc8d8SChris Lattner     {
11827fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11837730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
11847730b9a4SJim Ingham         {
11857730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
11867730b9a4SJim Ingham             if (frame)
11877fdf9ef1SGreg Clayton             {
1188d9e416c0SGreg Clayton                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
118930fdc8d8SChris Lattner                 if (reg_ctx)
119030fdc8d8SChris Lattner                 {
119130fdc8d8SChris Lattner                     const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
119230fdc8d8SChris Lattner                     for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
119330fdc8d8SChris Lattner                     {
1194d9e416c0SGreg Clayton                         value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
119530fdc8d8SChris Lattner                     }
119630fdc8d8SChris Lattner                 }
119730fdc8d8SChris Lattner             }
1198c9858e4dSGreg Clayton             else
1199c9858e4dSGreg Clayton             {
1200c9858e4dSGreg Clayton                 if (log)
12017730b9a4SJim Ingham                     log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame.");
12027730b9a4SJim Ingham             }
12037730b9a4SJim Ingham         }
12047730b9a4SJim Ingham         else
12057730b9a4SJim Ingham         {
12067730b9a4SJim Ingham             if (log)
12077730b9a4SJim Ingham                 log->Printf ("SBFrame::GetRegisters () => error: process is running");
1208c9858e4dSGreg Clayton         }
12097fdf9ef1SGreg Clayton     }
1210ceb6b139SCaroline Tice 
1211ceb6b139SCaroline Tice     if (log)
1212*08ec0b61SEnrico Granata         log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.opaque_ptr());
1213ceb6b139SCaroline Tice 
121430fdc8d8SChris Lattner     return value_list;
121530fdc8d8SChris Lattner }
121630fdc8d8SChris Lattner 
1217dde9cff3SCaroline Tice bool
1218dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
1219dde9cff3SCaroline Tice {
12207730b9a4SJim Ingham     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1221da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1222da7bc7d0SGreg Clayton 
12234fc6cb9cSJim Ingham     Mutex::Locker api_locker;
12244fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
12254fc6cb9cSJim Ingham 
12267730b9a4SJim Ingham     StackFrame *frame;
1227d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
12287730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
12297730b9a4SJim Ingham     if (target && process)
1230dde9cff3SCaroline Tice     {
12317fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
12327730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
12337730b9a4SJim Ingham         {
12347730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
12357730b9a4SJim Ingham             if (frame)
12367fdf9ef1SGreg Clayton             {
1237d9e416c0SGreg Clayton                 frame->DumpUsingSettingsFormat (&strm);
1238dde9cff3SCaroline Tice             }
1239c9858e4dSGreg Clayton             else
1240c9858e4dSGreg Clayton             {
1241c9858e4dSGreg Clayton                 if (log)
12427730b9a4SJim Ingham                     log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame.");
12437730b9a4SJim Ingham             }
12447730b9a4SJim Ingham         }
12457730b9a4SJim Ingham         else
12467730b9a4SJim Ingham         {
12477730b9a4SJim Ingham             if (log)
12487730b9a4SJim Ingham                 log->Printf ("SBFrame::GetDescription () => error: process is running");
1249c9858e4dSGreg Clayton         }
1250c9858e4dSGreg Clayton 
12517fdf9ef1SGreg Clayton     }
1252dde9cff3SCaroline Tice     else
1253da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1254dde9cff3SCaroline Tice 
1255dde9cff3SCaroline Tice     return true;
1256dde9cff3SCaroline Tice }
12571d3afba3SGreg Clayton 
125869b582faSGreg Clayton SBValue
12591d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
12601d3afba3SGreg Clayton {
1261316d498bSGreg Clayton     SBValue result;
12627fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1263d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1264d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1265d9e416c0SGreg Clayton     if (frame && target)
1266316d498bSGreg Clayton     {
126735e1bda6SJim Ingham         SBExpressionOptions options;
126835e1bda6SJim Ingham         lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue();
1269cced1566SGreg Clayton         options.SetFetchDynamicValue (fetch_dynamic_value);
127035e1bda6SJim Ingham         options.SetUnwindOnError (true);
127135e1bda6SJim Ingham         return EvaluateExpression (expr, options);
1272316d498bSGreg Clayton     }
1273316d498bSGreg Clayton     return result;
127478a685aaSJim Ingham }
127578a685aaSJim Ingham 
127678a685aaSJim Ingham SBValue
12772837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
127878a685aaSJim Ingham {
127935e1bda6SJim Ingham     SBExpressionOptions options;
1280cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
128135e1bda6SJim Ingham     options.SetUnwindOnError (true);
128235e1bda6SJim Ingham     return EvaluateExpression (expr, options);
12837ba6e991SJim Ingham }
12847ba6e991SJim Ingham 
12857ba6e991SJim Ingham SBValue
12867ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error)
12877ba6e991SJim Ingham {
128835e1bda6SJim Ingham     SBExpressionOptions options;
1289cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
129035e1bda6SJim Ingham     options.SetUnwindOnError (unwind_on_error);
129135e1bda6SJim Ingham     return EvaluateExpression (expr, options);
129235e1bda6SJim Ingham }
129335e1bda6SJim Ingham 
129435e1bda6SJim Ingham lldb::SBValue
129535e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options)
129635e1bda6SJim Ingham {
129769b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
12984838131bSGreg Clayton 
129969b582faSGreg Clayton     LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1300a162ebafSSean Callanan 
130123f59509SGreg Clayton     ExecutionResults exe_results = eExecutionSetupError;
130269b582faSGreg Clayton     SBValue expr_result;
13037730b9a4SJim Ingham 
13047730b9a4SJim Ingham     if (expr == NULL || expr[0] == '\0')
13057730b9a4SJim Ingham     {
13067730b9a4SJim Ingham         if (log)
13077730b9a4SJim Ingham             log->Printf ("SBFrame::EvaluateExpression called with an empty expression");
13087730b9a4SJim Ingham         return expr_result;
13097730b9a4SJim Ingham     }
13107730b9a4SJim Ingham 
131181e871edSGreg Clayton     ValueObjectSP expr_value_sp;
13124838131bSGreg Clayton 
13134fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13144fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13154fc6cb9cSJim Ingham 
1316b9556accSGreg Clayton     if (log)
13177730b9a4SJim Ingham         log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
1318b9556accSGreg Clayton 
13197730b9a4SJim Ingham     StackFrame *frame = NULL;
13207730b9a4SJim Ingham     Target *target = exe_ctx.GetTargetPtr();
13217730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
13227730b9a4SJim Ingham 
13237730b9a4SJim Ingham     if (target && process)
13241d3afba3SGreg Clayton     {
13257fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13267730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
13277730b9a4SJim Ingham         {
13287730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
13297730b9a4SJim Ingham             if (frame)
13307fdf9ef1SGreg Clayton             {
1331de4ca5b7SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
13321ba7c4d0SGreg Clayton                 StreamString frame_description;
1333d9e416c0SGreg Clayton                 frame->DumpUsingSettingsFormat (&frame_description);
13341ba7c4d0SGreg Clayton                 Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
1335cced1566SGreg Clayton                                                      expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str());
1336de4ca5b7SEnrico Granata #endif
1337d9e416c0SGreg Clayton                 exe_results = target->EvaluateExpression (expr,
1338d9e416c0SGreg Clayton                                                           frame,
1339d4439aa9SEnrico Granata                                                           expr_value_sp,
134035e1bda6SJim Ingham                                                           options.ref());
1341e3e91517SEnrico Granata                 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1342de4ca5b7SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1343f49e65aeSGreg Clayton                 Host::SetCrashDescription (NULL);
1344de4ca5b7SEnrico Granata #endif
13451d3afba3SGreg Clayton             }
1346c9858e4dSGreg Clayton             else
1347c9858e4dSGreg Clayton             {
1348c9858e4dSGreg Clayton                 if (log)
13497730b9a4SJim Ingham                     log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame.");
13507730b9a4SJim Ingham             }
13517730b9a4SJim Ingham         }
13527730b9a4SJim Ingham         else
13537730b9a4SJim Ingham         {
13547730b9a4SJim Ingham             if (log)
13557730b9a4SJim Ingham                 log->Printf ("SBFrame::EvaluateExpression () => error: process is running");
1356c9858e4dSGreg Clayton         }
13577fdf9ef1SGreg Clayton     }
13584838131bSGreg Clayton 
1359cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1360a162ebafSSean Callanan     if (expr_log)
136178a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
1362fe42ac4dSGreg Clayton                          expr_result.GetValue(),
1363fe42ac4dSGreg Clayton                          expr_result.GetSummary());
1364a162ebafSSean Callanan 
13654838131bSGreg Clayton     if (log)
1366d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1367d9e416c0SGreg Clayton                      frame,
136878a685aaSJim Ingham                      expr,
136981e871edSGreg Clayton                      expr_value_sp.get(),
137025f3a3cdSJohnny Chen                      exe_results);
1371cf7e2dc0SJason Molenda #endif
13724838131bSGreg Clayton 
1373cfd1acedSGreg Clayton     return expr_result;
13741d3afba3SGreg Clayton }
1375316d498bSGreg Clayton 
1376316d498bSGreg Clayton bool
1377316d498bSGreg Clayton SBFrame::IsInlined()
1378316d498bSGreg Clayton {
13797730b9a4SJim Ingham     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
13807fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
13817730b9a4SJim Ingham     StackFrame *frame = NULL;
1382d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
13837730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
13847730b9a4SJim Ingham     if (target && process)
1385316d498bSGreg Clayton     {
13867fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13877730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
13887730b9a4SJim Ingham         {
13897730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
13907730b9a4SJim Ingham             if (frame)
13917fdf9ef1SGreg Clayton             {
13927fdf9ef1SGreg Clayton 
1393d9e416c0SGreg Clayton                 Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1394316d498bSGreg Clayton                 if (block)
1395316d498bSGreg Clayton                     return block->GetContainingInlinedBlock () != NULL;
1396316d498bSGreg Clayton             }
1397c9858e4dSGreg Clayton             else
1398c9858e4dSGreg Clayton             {
1399c9858e4dSGreg Clayton                 if (log)
14007730b9a4SJim Ingham                     log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame.");
14017730b9a4SJim Ingham             }
14027730b9a4SJim Ingham         }
14037730b9a4SJim Ingham         else
14047730b9a4SJim Ingham         {
14057730b9a4SJim Ingham             if (log)
14067730b9a4SJim Ingham                 log->Printf ("SBFrame::IsInlined () => error: process is running");
1407c9858e4dSGreg Clayton         }
1408c9858e4dSGreg Clayton 
14097fdf9ef1SGreg Clayton     }
1410316d498bSGreg Clayton     return false;
1411316d498bSGreg Clayton }
1412316d498bSGreg Clayton 
1413316d498bSGreg Clayton const char *
1414316d498bSGreg Clayton SBFrame::GetFunctionName()
1415316d498bSGreg Clayton {
14167730b9a4SJim Ingham     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1417316d498bSGreg Clayton     const char *name = NULL;
14187fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
14197730b9a4SJim Ingham     StackFrame *frame = NULL;
1420d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
14217730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
14227730b9a4SJim Ingham     if (target && process)
1423316d498bSGreg Clayton     {
14247fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
14257730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
14267730b9a4SJim Ingham         {
14277730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
14287730b9a4SJim Ingham             if (frame)
14297fdf9ef1SGreg Clayton             {
1430d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1431316d498bSGreg Clayton                 if (sc.block)
1432316d498bSGreg Clayton                 {
1433316d498bSGreg Clayton                     Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1434316d498bSGreg Clayton                     if (inlined_block)
1435316d498bSGreg Clayton                     {
1436316d498bSGreg Clayton                         const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1437316d498bSGreg Clayton                         name = inlined_info->GetName().AsCString();
1438316d498bSGreg Clayton                     }
1439316d498bSGreg Clayton                 }
1440316d498bSGreg Clayton 
1441316d498bSGreg Clayton                 if (name == NULL)
1442316d498bSGreg Clayton                 {
1443316d498bSGreg Clayton                     if (sc.function)
1444316d498bSGreg Clayton                         name = sc.function->GetName().GetCString();
1445316d498bSGreg Clayton                 }
1446316d498bSGreg Clayton 
1447316d498bSGreg Clayton                 if (name == NULL)
1448316d498bSGreg Clayton                 {
1449316d498bSGreg Clayton                     if (sc.symbol)
1450316d498bSGreg Clayton                         name = sc.symbol->GetName().GetCString();
1451316d498bSGreg Clayton                 }
1452316d498bSGreg Clayton             }
1453c9858e4dSGreg Clayton             else
1454c9858e4dSGreg Clayton             {
1455c9858e4dSGreg Clayton                 if (log)
14567730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame.");
14577730b9a4SJim Ingham             }
14587730b9a4SJim Ingham         }
14597730b9a4SJim Ingham         else
14607730b9a4SJim Ingham         {
14617730b9a4SJim Ingham             if (log)
14627730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFunctionName() => error: process is running");
1463c9858e4dSGreg Clayton 
1464c9858e4dSGreg Clayton         }
14657fdf9ef1SGreg Clayton     }
1466316d498bSGreg Clayton     return name;
1467316d498bSGreg Clayton }
1468316d498bSGreg Clayton 
1469