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"
36b57e4a1bSJason Molenda #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 
57b57e4a1bSJason Molenda SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) :
587fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef (lldb_object_sp))
5930fdc8d8SChris Lattner {
605160ce5cSGreg Clayton     Log *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",
67324a1036SSaleem Abdulrasool                      static_cast<void*>(lldb_object_sp.get()),
68324a1036SSaleem Abdulrasool                      static_cast<void*>(lldb_object_sp.get()), sstr.GetData());
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 
89b57e4a1bSJason Molenda StackFrameSP
90b9556accSGreg Clayton SBFrame::GetFrameSP() const
91b9556accSGreg Clayton {
92af2589eaSGreg Clayton     if (m_opaque_sp)
937fdf9ef1SGreg Clayton         return m_opaque_sp->GetFrameSP();
94b57e4a1bSJason Molenda     return StackFrameSP();
95b9556accSGreg Clayton }
9630fdc8d8SChris Lattner 
9730fdc8d8SChris Lattner void
98b57e4a1bSJason Molenda 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 {
1125160ce5cSGreg Clayton     Log *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 
117b57e4a1bSJason Molenda     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)",
145324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), resolve_scope,
146324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_sym_ctx.get()));
147ceb6b139SCaroline Tice 
14830fdc8d8SChris Lattner     return sb_sym_ctx;
14930fdc8d8SChris Lattner }
15030fdc8d8SChris Lattner 
15130fdc8d8SChris Lattner SBModule
15230fdc8d8SChris Lattner SBFrame::GetModule () const
15330fdc8d8SChris Lattner {
1545160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
15572eff18aSGreg Clayton     SBModule sb_module;
156acdbe816SGreg Clayton     ModuleSP module_sp;
1574fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1584fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1594fc6cb9cSJim Ingham 
160b57e4a1bSJason Molenda     StackFrame *frame = NULL;
161d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1627730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
1637730b9a4SJim Ingham     if (target && process)
164af67cecdSGreg Clayton     {
1657fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1667730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
1677730b9a4SJim Ingham         {
1687730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
1697730b9a4SJim Ingham             if (frame)
1707fdf9ef1SGreg Clayton             {
171d9e416c0SGreg Clayton                 module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp;
172acdbe816SGreg Clayton                 sb_module.SetSP (module_sp);
173af67cecdSGreg Clayton             }
174c9858e4dSGreg Clayton             else
175c9858e4dSGreg Clayton             {
176c9858e4dSGreg Clayton                 if (log)
1777730b9a4SJim Ingham                     log->Printf ("SBFrame::GetModule () => error: could not reconstruct frame object for this SBFrame.");
1787730b9a4SJim Ingham             }
1797730b9a4SJim Ingham         }
1807730b9a4SJim Ingham         else
1817730b9a4SJim Ingham         {
1827730b9a4SJim Ingham             if (log)
1837730b9a4SJim Ingham                 log->Printf ("SBFrame::GetModule () => error: process is running");
184c9858e4dSGreg Clayton         }
1857fdf9ef1SGreg Clayton     }
18672eff18aSGreg Clayton 
1874838131bSGreg Clayton     if (log)
1884838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
189324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
190324a1036SSaleem Abdulrasool                      static_cast<void*>(module_sp.get()));
1914838131bSGreg Clayton 
19230fdc8d8SChris Lattner     return sb_module;
19330fdc8d8SChris Lattner }
19430fdc8d8SChris Lattner 
19530fdc8d8SChris Lattner SBCompileUnit
19630fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
19730fdc8d8SChris Lattner {
1985160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
19972eff18aSGreg Clayton     SBCompileUnit sb_comp_unit;
2004fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2014fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2024fc6cb9cSJim Ingham 
203b57e4a1bSJason Molenda     StackFrame *frame = NULL;
204d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
2057730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
2067730b9a4SJim Ingham     if (target && process)
207af67cecdSGreg Clayton     {
2087fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2097730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
2107730b9a4SJim Ingham         {
2117730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
2127730b9a4SJim Ingham             if (frame)
2137fdf9ef1SGreg Clayton             {
214d9e416c0SGreg Clayton                 sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
215af67cecdSGreg Clayton             }
216c9858e4dSGreg Clayton             else
217c9858e4dSGreg Clayton             {
218ceb6b139SCaroline Tice                 if (log)
2197730b9a4SJim Ingham                     log->Printf ("SBFrame::GetCompileUnit () => error: could not reconstruct frame object for this SBFrame.");
2207730b9a4SJim Ingham             }
2217730b9a4SJim Ingham         }
2227730b9a4SJim Ingham         else
2237730b9a4SJim Ingham         {
2247730b9a4SJim Ingham             if (log)
2257730b9a4SJim Ingham                 log->Printf ("SBFrame::GetCompileUnit () => error: process is running");
226c9858e4dSGreg Clayton         }
227c9858e4dSGreg Clayton     }
228c9858e4dSGreg Clayton     if (log)
229c9858e4dSGreg Clayton         log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
230324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
231324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_comp_unit.get()));
232ceb6b139SCaroline Tice 
23330fdc8d8SChris Lattner     return sb_comp_unit;
23430fdc8d8SChris Lattner }
23530fdc8d8SChris Lattner 
23630fdc8d8SChris Lattner SBFunction
23730fdc8d8SChris Lattner SBFrame::GetFunction () const
23830fdc8d8SChris Lattner {
2395160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
24072eff18aSGreg Clayton     SBFunction sb_function;
2414fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2424fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2434fc6cb9cSJim Ingham 
244b57e4a1bSJason Molenda     StackFrame *frame = NULL;
245d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
2467730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
2477730b9a4SJim Ingham     if (target && process)
248af67cecdSGreg Clayton     {
2497fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2507730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
2517730b9a4SJim Ingham         {
2527730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
2537730b9a4SJim Ingham             if (frame)
2547fdf9ef1SGreg Clayton             {
255d9e416c0SGreg Clayton                 sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function);
256af67cecdSGreg Clayton             }
257c9858e4dSGreg Clayton             else
258c9858e4dSGreg Clayton             {
259c9858e4dSGreg Clayton                 if (log)
2607730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFunction () => error: could not reconstruct frame object for this SBFrame.");
2617730b9a4SJim Ingham             }
2627730b9a4SJim Ingham         }
2637730b9a4SJim Ingham         else
2647730b9a4SJim Ingham         {
2657730b9a4SJim Ingham             if (log)
2667730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFunction () => error: process is running");
2677fdf9ef1SGreg Clayton         }
268c9858e4dSGreg Clayton     }
2694838131bSGreg Clayton     if (log)
2704838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
271324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
272324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_function.get()));
2734838131bSGreg Clayton 
27430fdc8d8SChris Lattner     return sb_function;
27530fdc8d8SChris Lattner }
27630fdc8d8SChris Lattner 
2773b06557eSGreg Clayton SBSymbol
2783b06557eSGreg Clayton SBFrame::GetSymbol () const
2793b06557eSGreg Clayton {
2805160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
28172eff18aSGreg Clayton     SBSymbol sb_symbol;
2824fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2834fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2844fc6cb9cSJim Ingham 
285b57e4a1bSJason Molenda     StackFrame *frame = NULL;
286d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
2877730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
2887730b9a4SJim Ingham     if (target && process)
289af67cecdSGreg Clayton     {
2907fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2917730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
2927730b9a4SJim Ingham         {
2937730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
2947730b9a4SJim Ingham             if (frame)
2957fdf9ef1SGreg Clayton             {
296d9e416c0SGreg Clayton                 sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol);
297af67cecdSGreg Clayton             }
298c9858e4dSGreg Clayton             else
299c9858e4dSGreg Clayton             {
300c9858e4dSGreg Clayton                 if (log)
3017730b9a4SJim Ingham                     log->Printf ("SBFrame::GetSymbol () => error: could not reconstruct frame object for this SBFrame.");
3027730b9a4SJim Ingham             }
3037730b9a4SJim Ingham         }
3047730b9a4SJim Ingham         else
3057730b9a4SJim Ingham         {
3067730b9a4SJim Ingham             if (log)
3077730b9a4SJim Ingham                 log->Printf ("SBFrame::GetSymbol () => error: process is running");
3087fdf9ef1SGreg Clayton         }
309c9858e4dSGreg Clayton     }
3104838131bSGreg Clayton     if (log)
3114838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
312324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
313324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_symbol.get()));
3143b06557eSGreg Clayton     return sb_symbol;
3153b06557eSGreg Clayton }
3163b06557eSGreg Clayton 
31730fdc8d8SChris Lattner SBBlock
31830fdc8d8SChris Lattner SBFrame::GetBlock () const
31930fdc8d8SChris Lattner {
3205160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
32172eff18aSGreg Clayton     SBBlock sb_block;
3224fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3234fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3244fc6cb9cSJim Ingham 
325b57e4a1bSJason Molenda     StackFrame *frame = NULL;
326d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
3277730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
3287730b9a4SJim Ingham     if (target && process)
329af67cecdSGreg Clayton     {
3307fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3317730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
3327730b9a4SJim Ingham         {
3337730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
3347730b9a4SJim Ingham             if (frame)
3357fdf9ef1SGreg Clayton             {
336d9e416c0SGreg Clayton                 sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block);
337af67cecdSGreg Clayton             }
338c9858e4dSGreg Clayton             else
339c9858e4dSGreg Clayton             {
340c9858e4dSGreg Clayton                 if (log)
3417730b9a4SJim Ingham                     log->Printf ("SBFrame::GetBlock () => error: could not reconstruct frame object for this SBFrame.");
3427730b9a4SJim Ingham             }
3437730b9a4SJim Ingham         }
3447730b9a4SJim Ingham         else
3457730b9a4SJim Ingham         {
3467730b9a4SJim Ingham             if (log)
347324a1036SSaleem Abdulrasool                 log->Printf ("SBFrame(%p)::GetBlock () => error: process is running",
348324a1036SSaleem Abdulrasool                              static_cast<void*>(frame));
3497fdf9ef1SGreg Clayton         }
350c9858e4dSGreg Clayton     }
3514838131bSGreg Clayton     if (log)
3524838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
353324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
354324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_block.GetPtr()));
35530fdc8d8SChris Lattner     return sb_block;
35630fdc8d8SChris Lattner }
35730fdc8d8SChris Lattner 
35895897c6aSGreg Clayton SBBlock
35995897c6aSGreg Clayton SBFrame::GetFrameBlock () const
36095897c6aSGreg Clayton {
36172eff18aSGreg Clayton     SBBlock sb_block;
3624fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3634fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3644fc6cb9cSJim Ingham 
365b57e4a1bSJason Molenda     StackFrame *frame = NULL;
366d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
3675160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3687730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
3697730b9a4SJim Ingham     if (target && process)
370af67cecdSGreg Clayton     {
3717fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3727730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
3737730b9a4SJim Ingham         {
3747730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
3757730b9a4SJim Ingham             if (frame)
3767fdf9ef1SGreg Clayton             {
377d9e416c0SGreg Clayton                 sb_block.SetPtr(frame->GetFrameBlock ());
378af67cecdSGreg Clayton             }
379c9858e4dSGreg Clayton             else
380c9858e4dSGreg Clayton             {
381c9858e4dSGreg Clayton                 if (log)
3827730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFrameBlock () => error: could not reconstruct frame object for this SBFrame.");
3837730b9a4SJim Ingham             }
3847730b9a4SJim Ingham         }
3857730b9a4SJim Ingham         else
3867730b9a4SJim Ingham         {
3877730b9a4SJim Ingham             if (log)
3887730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFrameBlock () => error: process is running");
3897fdf9ef1SGreg Clayton         }
390c9858e4dSGreg Clayton     }
3914838131bSGreg Clayton     if (log)
3924838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
393324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
394324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_block.GetPtr()));
39595897c6aSGreg Clayton     return sb_block;
39695897c6aSGreg Clayton }
39795897c6aSGreg Clayton 
39830fdc8d8SChris Lattner SBLineEntry
39930fdc8d8SChris Lattner SBFrame::GetLineEntry () const
40030fdc8d8SChris Lattner {
4015160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
40272eff18aSGreg Clayton     SBLineEntry sb_line_entry;
4034fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4044fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4054fc6cb9cSJim Ingham 
406b57e4a1bSJason Molenda     StackFrame *frame = NULL;
407d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
4087730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
4097730b9a4SJim Ingham     if (target && process)
410af67cecdSGreg Clayton     {
4117fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4127730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
4137730b9a4SJim Ingham         {
4147730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
4157730b9a4SJim Ingham             if (frame)
4167fdf9ef1SGreg Clayton             {
417d9e416c0SGreg Clayton                 sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry);
418af67cecdSGreg Clayton             }
419c9858e4dSGreg Clayton             else
420c9858e4dSGreg Clayton             {
421c9858e4dSGreg Clayton                 if (log)
4227730b9a4SJim Ingham                     log->Printf ("SBFrame::GetLineEntry () => error: could not reconstruct frame object for this SBFrame.");
4237730b9a4SJim Ingham             }
4247730b9a4SJim Ingham         }
4257730b9a4SJim Ingham         else
4267730b9a4SJim Ingham         {
4277730b9a4SJim Ingham             if (log)
4287730b9a4SJim Ingham                 log->Printf ("SBFrame::GetLineEntry () => error: process is running");
4297fdf9ef1SGreg Clayton         }
430c9858e4dSGreg Clayton     }
4314838131bSGreg Clayton     if (log)
4324838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
433324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
434324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_line_entry.get()));
43530fdc8d8SChris Lattner     return sb_line_entry;
43630fdc8d8SChris Lattner }
43730fdc8d8SChris Lattner 
43830fdc8d8SChris Lattner uint32_t
43930fdc8d8SChris Lattner SBFrame::GetFrameID () const
44030fdc8d8SChris Lattner {
441b9556accSGreg Clayton     uint32_t frame_idx = UINT32_MAX;
442b9556accSGreg Clayton 
4437fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
444b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
4457fdf9ef1SGreg Clayton     if (frame)
446d9e416c0SGreg Clayton         frame_idx = frame->GetFrameIndex ();
4474838131bSGreg Clayton 
4485160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4494838131bSGreg Clayton     if (log)
4504838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameID () => %u",
451324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), frame_idx);
4524838131bSGreg Clayton     return frame_idx;
45330fdc8d8SChris Lattner }
45430fdc8d8SChris Lattner 
45569b582faSGreg Clayton addr_t
45630fdc8d8SChris Lattner SBFrame::GetPC () const
45730fdc8d8SChris Lattner {
4585160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
45969b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
4604fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4614fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4624fc6cb9cSJim Ingham 
463b57e4a1bSJason Molenda     StackFrame *frame = NULL;
464d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
4657730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
4667730b9a4SJim Ingham     if (target && process)
467af67cecdSGreg Clayton     {
4687fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4697730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
4707730b9a4SJim Ingham         {
4717730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
4727730b9a4SJim Ingham             if (frame)
4737fdf9ef1SGreg Clayton             {
474d9e416c0SGreg Clayton                 addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target);
475af67cecdSGreg Clayton             }
476c9858e4dSGreg Clayton             else
477c9858e4dSGreg Clayton             {
478c9858e4dSGreg Clayton                 if (log)
4797730b9a4SJim Ingham                     log->Printf ("SBFrame::GetPC () => error: could not reconstruct frame object for this SBFrame.");
4807730b9a4SJim Ingham             }
4817730b9a4SJim Ingham         }
4827730b9a4SJim Ingham         else
4837730b9a4SJim Ingham         {
4847730b9a4SJim Ingham             if (log)
4857730b9a4SJim Ingham                 log->Printf ("SBFrame::GetPC () => error: process is running");
486c9858e4dSGreg Clayton         }
4877fdf9ef1SGreg Clayton     }
488ceb6b139SCaroline Tice 
489ceb6b139SCaroline Tice     if (log)
490324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetPC () => 0x%" PRIx64,
491324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), addr);
492ceb6b139SCaroline Tice 
493ceb6b139SCaroline Tice     return addr;
49430fdc8d8SChris Lattner }
49530fdc8d8SChris Lattner 
49630fdc8d8SChris Lattner bool
49769b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc)
49830fdc8d8SChris Lattner {
4995160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
500ceb6b139SCaroline Tice     bool ret_val = false;
5014fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5024fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5034fc6cb9cSJim Ingham 
504b57e4a1bSJason Molenda     StackFrame *frame = NULL;
505d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
5067730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
5077730b9a4SJim Ingham     if (target && process)
508af67cecdSGreg Clayton     {
5097fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5107730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5117730b9a4SJim Ingham         {
5127730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5137730b9a4SJim Ingham             if (frame)
5147fdf9ef1SGreg Clayton             {
515d9e416c0SGreg Clayton                 ret_val = frame->GetRegisterContext()->SetPC (new_pc);
516af67cecdSGreg Clayton             }
517c9858e4dSGreg Clayton             else
518c9858e4dSGreg Clayton             {
519c9858e4dSGreg Clayton                 if (log)
5207730b9a4SJim Ingham                     log->Printf ("SBFrame::SetPC () => error: could not reconstruct frame object for this SBFrame.");
5217730b9a4SJim Ingham             }
5227730b9a4SJim Ingham         }
5237730b9a4SJim Ingham         else
5247730b9a4SJim Ingham         {
5257730b9a4SJim Ingham             if (log)
5267730b9a4SJim Ingham                 log->Printf ("SBFrame::SetPC () => error: process is running");
527c9858e4dSGreg Clayton         }
5287fdf9ef1SGreg Clayton     }
529ceb6b139SCaroline Tice 
530ceb6b139SCaroline Tice     if (log)
531d01b2953SDaniel Malea         log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i",
532324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), new_pc, ret_val);
533ceb6b139SCaroline Tice 
534ceb6b139SCaroline Tice     return ret_val;
53530fdc8d8SChris Lattner }
53630fdc8d8SChris Lattner 
53769b582faSGreg Clayton addr_t
53830fdc8d8SChris Lattner SBFrame::GetSP () const
53930fdc8d8SChris Lattner {
5405160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5414838131bSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
5424fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5434fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5444fc6cb9cSJim Ingham 
545b57e4a1bSJason Molenda     StackFrame *frame = NULL;
546d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
5477730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
5487730b9a4SJim Ingham     if (target && process)
549af67cecdSGreg Clayton     {
5507fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5517730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5527730b9a4SJim Ingham         {
5537730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5547730b9a4SJim Ingham             if (frame)
5557fdf9ef1SGreg Clayton             {
556d9e416c0SGreg Clayton                 addr = frame->GetRegisterContext()->GetSP();
557af67cecdSGreg Clayton             }
558c9858e4dSGreg Clayton             else
559c9858e4dSGreg Clayton             {
560c9858e4dSGreg Clayton                 if (log)
5617730b9a4SJim Ingham                     log->Printf ("SBFrame::GetSP () => error: could not reconstruct frame object for this SBFrame.");
5627730b9a4SJim Ingham             }
5637730b9a4SJim Ingham         }
5647730b9a4SJim Ingham         else
5657730b9a4SJim Ingham         {
5667730b9a4SJim Ingham             if (log)
5677730b9a4SJim Ingham                 log->Printf ("SBFrame::GetSP () => error: process is running");
5687fdf9ef1SGreg Clayton         }
569c9858e4dSGreg Clayton     }
5704838131bSGreg Clayton     if (log)
571324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetSP () => 0x%" PRIx64,
572324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), addr);
5734838131bSGreg Clayton 
5744838131bSGreg Clayton     return addr;
57530fdc8d8SChris Lattner }
57630fdc8d8SChris Lattner 
57730fdc8d8SChris Lattner 
57869b582faSGreg Clayton addr_t
57930fdc8d8SChris Lattner SBFrame::GetFP () const
58030fdc8d8SChris Lattner {
5815160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
58269b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
5834fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5844fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5854fc6cb9cSJim Ingham 
586b57e4a1bSJason Molenda     StackFrame *frame = NULL;
587d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
5887730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
5897730b9a4SJim Ingham     if (target && process)
590af67cecdSGreg Clayton     {
5917fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5927730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5937730b9a4SJim Ingham         {
5947730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5957730b9a4SJim Ingham             if (frame)
5967fdf9ef1SGreg Clayton             {
597d9e416c0SGreg Clayton                 addr = frame->GetRegisterContext()->GetFP();
598af67cecdSGreg Clayton             }
599c9858e4dSGreg Clayton             else
600c9858e4dSGreg Clayton             {
601c9858e4dSGreg Clayton                 if (log)
6027730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFP () => error: could not reconstruct frame object for this SBFrame.");
6037730b9a4SJim Ingham             }
6047730b9a4SJim Ingham         }
6057730b9a4SJim Ingham         else
6067730b9a4SJim Ingham         {
6077730b9a4SJim Ingham             if (log)
6087730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFP () => error: process is running");
609c9858e4dSGreg Clayton         }
6107fdf9ef1SGreg Clayton     }
611ceb6b139SCaroline Tice 
612ceb6b139SCaroline Tice     if (log)
613324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetFP () => 0x%" PRIx64,
614324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), addr);
615ceb6b139SCaroline Tice     return addr;
61630fdc8d8SChris Lattner }
61730fdc8d8SChris Lattner 
61830fdc8d8SChris Lattner 
61930fdc8d8SChris Lattner SBAddress
62030fdc8d8SChris Lattner SBFrame::GetPCAddress () const
62130fdc8d8SChris Lattner {
6225160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
62330fdc8d8SChris Lattner     SBAddress sb_addr;
6244fc6cb9cSJim Ingham     Mutex::Locker api_locker;
6254fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
6264fc6cb9cSJim Ingham 
627b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
628d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
6297730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
6307730b9a4SJim Ingham     if (target && process)
631af67cecdSGreg Clayton     {
6327fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6337730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
6347730b9a4SJim Ingham         {
6357730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
6367730b9a4SJim Ingham             if (frame)
6377fdf9ef1SGreg Clayton             {
638d9e416c0SGreg Clayton                 sb_addr.SetAddress (&frame->GetFrameCodeAddress());
639af67cecdSGreg Clayton             }
640c9858e4dSGreg Clayton             else
641c9858e4dSGreg Clayton             {
642c9858e4dSGreg Clayton                 if (log)
6437730b9a4SJim Ingham                     log->Printf ("SBFrame::GetPCAddress () => error: could not reconstruct frame object for this SBFrame.");
6447730b9a4SJim Ingham             }
6457730b9a4SJim Ingham         }
6467730b9a4SJim Ingham         else
6477730b9a4SJim Ingham         {
6487730b9a4SJim Ingham             if (log)
6497730b9a4SJim Ingham                 log->Printf ("SBFrame::GetPCAddress () => error: process is running");
6507fdf9ef1SGreg Clayton         }
651c9858e4dSGreg Clayton     }
6524838131bSGreg Clayton     if (log)
653324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)",
654324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
655324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_addr.get()));
65630fdc8d8SChris Lattner     return sb_addr;
65730fdc8d8SChris Lattner }
65830fdc8d8SChris Lattner 
65930fdc8d8SChris Lattner void
66030fdc8d8SChris Lattner SBFrame::Clear()
66130fdc8d8SChris Lattner {
662af2589eaSGreg Clayton     m_opaque_sp->Clear();
66330fdc8d8SChris Lattner }
66430fdc8d8SChris Lattner 
6657edbdfc9SGreg Clayton lldb::SBValue
6667edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path)
6677edbdfc9SGreg Clayton {
6687edbdfc9SGreg Clayton     SBValue sb_value;
6697fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
670b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
671d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
672d9e416c0SGreg Clayton     if (frame && target)
6737edbdfc9SGreg Clayton     {
674d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
6757edbdfc9SGreg Clayton         sb_value = GetValueForVariablePath (var_path, use_dynamic);
6767edbdfc9SGreg Clayton     }
6777edbdfc9SGreg Clayton     return sb_value;
6787edbdfc9SGreg Clayton }
6797edbdfc9SGreg Clayton 
6807edbdfc9SGreg Clayton lldb::SBValue
6817edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic)
6827edbdfc9SGreg Clayton {
6837edbdfc9SGreg Clayton     SBValue sb_value;
6844fc6cb9cSJim Ingham     Mutex::Locker api_locker;
6855160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6867730b9a4SJim Ingham     if (var_path == NULL || var_path[0] == '\0')
6877730b9a4SJim Ingham     {
6887730b9a4SJim Ingham         if (log)
6897730b9a4SJim Ingham             log->Printf ("SBFrame::GetValueForVariablePath called with empty variable path.");
6907730b9a4SJim Ingham         return sb_value;
6917730b9a4SJim Ingham     }
6927730b9a4SJim Ingham 
6934fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
6944fc6cb9cSJim Ingham 
695b57e4a1bSJason Molenda     StackFrame *frame = NULL;
696d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
6977730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
6987730b9a4SJim Ingham     if (target && process)
6997edbdfc9SGreg Clayton     {
7007fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
7017730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
7027730b9a4SJim Ingham         {
7037730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
7047730b9a4SJim Ingham             if (frame)
7057fdf9ef1SGreg Clayton             {
7067edbdfc9SGreg Clayton                 VariableSP var_sp;
7077edbdfc9SGreg Clayton                 Error error;
708d9e416c0SGreg Clayton                 ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path,
709e3e91517SEnrico Granata                                                                                   eNoDynamicValues,
710b57e4a1bSJason Molenda                                                                                   StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
7117edbdfc9SGreg Clayton                                                                                   var_sp,
7127edbdfc9SGreg Clayton                                                                                   error));
713e3e91517SEnrico Granata                 sb_value.SetSP(value_sp, use_dynamic);
7147edbdfc9SGreg Clayton             }
715c9858e4dSGreg Clayton             else
716c9858e4dSGreg Clayton             {
717c9858e4dSGreg Clayton                 if (log)
7187730b9a4SJim Ingham                     log->Printf ("SBFrame::GetValueForVariablePath () => error: could not reconstruct frame object for this SBFrame.");
7197730b9a4SJim Ingham             }
7207730b9a4SJim Ingham         }
7217730b9a4SJim Ingham         else
7227730b9a4SJim Ingham         {
7237730b9a4SJim Ingham             if (log)
7247730b9a4SJim Ingham                 log->Printf ("SBFrame::GetValueForVariablePath () => error: process is running");
725c9858e4dSGreg Clayton         }
7267fdf9ef1SGreg Clayton     }
7277edbdfc9SGreg Clayton     return sb_value;
7287edbdfc9SGreg Clayton }
7297edbdfc9SGreg Clayton 
73030fdc8d8SChris Lattner SBValue
73169b582faSGreg Clayton SBFrame::FindVariable (const char *name)
73230fdc8d8SChris Lattner {
733316d498bSGreg Clayton     SBValue value;
7347fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
735b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
736d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
737d9e416c0SGreg Clayton     if (frame && target)
738316d498bSGreg Clayton     {
739d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
740316d498bSGreg Clayton         value = FindVariable (name, use_dynamic);
741316d498bSGreg Clayton     }
742316d498bSGreg Clayton     return value;
74378a685aaSJim Ingham }
74478a685aaSJim Ingham 
74578a685aaSJim Ingham SBValue
7462837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
74778a685aaSJim Ingham {
7485160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
74969b582faSGreg Clayton     VariableSP var_sp;
75058b59f95SJim Ingham     SBValue sb_value;
7517730b9a4SJim Ingham 
7527730b9a4SJim Ingham     if (name == NULL || name[0] == '\0')
7537730b9a4SJim Ingham     {
7547730b9a4SJim Ingham         if (log)
7557730b9a4SJim Ingham             log->Printf ("SBFrame::FindVariable called with empty name");
7567730b9a4SJim Ingham         return sb_value;
7577730b9a4SJim Ingham     }
7587730b9a4SJim Ingham 
75981e871edSGreg Clayton     ValueObjectSP value_sp;
7604fc6cb9cSJim Ingham     Mutex::Locker api_locker;
7614fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
7624fc6cb9cSJim Ingham 
763b57e4a1bSJason Molenda     StackFrame *frame = NULL;
764d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
7657730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
7667730b9a4SJim Ingham     if (target && process)
76730fdc8d8SChris Lattner     {
7687fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
7697730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
7707730b9a4SJim Ingham         {
7717730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
7727730b9a4SJim Ingham             if (frame)
7737fdf9ef1SGreg Clayton             {
77469b582faSGreg Clayton                 VariableList variable_list;
775d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
77630fdc8d8SChris Lattner 
77772eff18aSGreg Clayton                 if (sc.block)
77830fdc8d8SChris Lattner                 {
77972eff18aSGreg Clayton                     const bool can_create = true;
78072eff18aSGreg Clayton                     const bool get_parent_variables = true;
78172eff18aSGreg Clayton                     const bool stop_if_block_is_inlined_function = true;
78272eff18aSGreg Clayton 
78372eff18aSGreg Clayton                     if (sc.block->AppendVariables (can_create,
78472eff18aSGreg Clayton                                                    get_parent_variables,
78572eff18aSGreg Clayton                                                    stop_if_block_is_inlined_function,
78672eff18aSGreg Clayton                                                    &variable_list))
78772eff18aSGreg Clayton                     {
78869b582faSGreg Clayton                         var_sp = variable_list.FindVariable (ConstString(name));
78930fdc8d8SChris Lattner                     }
79072eff18aSGreg Clayton                 }
79130fdc8d8SChris Lattner 
7924838131bSGreg Clayton                 if (var_sp)
79381e871edSGreg Clayton                 {
794e3e91517SEnrico Granata                     value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues);
795e3e91517SEnrico Granata                     sb_value.SetSP(value_sp, use_dynamic);
79681e871edSGreg Clayton                 }
7977fdf9ef1SGreg Clayton             }
798c9858e4dSGreg Clayton             else
799c9858e4dSGreg Clayton             {
800c9858e4dSGreg Clayton                 if (log)
8017730b9a4SJim Ingham                     log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame.");
8027730b9a4SJim Ingham             }
8037730b9a4SJim Ingham         }
8047730b9a4SJim Ingham         else
8057730b9a4SJim Ingham         {
8067730b9a4SJim Ingham             if (log)
8077730b9a4SJim Ingham                 log->Printf ("SBFrame::FindVariable () => error: process is running");
808c9858e4dSGreg Clayton         }
809316d498bSGreg Clayton     }
810316d498bSGreg Clayton 
8114838131bSGreg Clayton     if (log)
81269b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
813324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), name,
814324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
8154838131bSGreg Clayton 
816dde9cff3SCaroline Tice     return sb_value;
817dde9cff3SCaroline Tice }
818dde9cff3SCaroline Tice 
81930fdc8d8SChris Lattner SBValue
82069b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type)
82130fdc8d8SChris Lattner {
822316d498bSGreg Clayton     SBValue value;
8237fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
824b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
825d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
826d9e416c0SGreg Clayton     if (frame && target)
827316d498bSGreg Clayton     {
828d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
829316d498bSGreg Clayton         value = FindValue (name, value_type, use_dynamic);
830316d498bSGreg Clayton     }
831316d498bSGreg Clayton     return value;
83278a685aaSJim Ingham }
83378a685aaSJim Ingham 
83478a685aaSJim Ingham SBValue
8352837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
83678a685aaSJim Ingham {
8375160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
83869b582faSGreg Clayton     SBValue sb_value;
8397730b9a4SJim Ingham 
8407730b9a4SJim Ingham     if (name == NULL || name[0] == '\0')
8417730b9a4SJim Ingham     {
8427730b9a4SJim Ingham         if (log)
8437730b9a4SJim Ingham             log->Printf ("SBFrame::FindValue called with empty name.");
8447730b9a4SJim Ingham         return sb_value;
8457730b9a4SJim Ingham     }
8467730b9a4SJim Ingham 
84781e871edSGreg Clayton     ValueObjectSP value_sp;
8484fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8494fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8504fc6cb9cSJim Ingham 
851b57e4a1bSJason Molenda     StackFrame *frame = NULL;
852d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
8537730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
8547730b9a4SJim Ingham     if (target && process)
85530fdc8d8SChris Lattner     {
8567fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8577730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
8587730b9a4SJim Ingham         {
8597730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
8607730b9a4SJim Ingham             if (frame)
8617fdf9ef1SGreg Clayton             {
8628a2a0dfbSEnrico Granata                 VariableList variable_list;
8638a2a0dfbSEnrico Granata 
86469b582faSGreg Clayton                 switch (value_type)
86530fdc8d8SChris Lattner                 {
86669b582faSGreg Clayton                 case eValueTypeVariableGlobal:      // global variable
86769b582faSGreg Clayton                 case eValueTypeVariableStatic:      // static variable
86869b582faSGreg Clayton                 case eValueTypeVariableArgument:    // function argument variables
86969b582faSGreg Clayton                 case eValueTypeVariableLocal:       // function local variables
87069b582faSGreg Clayton                     {
871d9e416c0SGreg Clayton                         SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
87272eff18aSGreg Clayton 
87372eff18aSGreg Clayton                         const bool can_create = true;
87472eff18aSGreg Clayton                         const bool get_parent_variables = true;
87572eff18aSGreg Clayton                         const bool stop_if_block_is_inlined_function = true;
87672eff18aSGreg Clayton 
87772eff18aSGreg Clayton                         if (sc.block && sc.block->AppendVariables (can_create,
87872eff18aSGreg Clayton                                                                    get_parent_variables,
87972eff18aSGreg Clayton                                                                    stop_if_block_is_inlined_function,
88008a04327SEnrico Granata                                                                    &variable_list))
881beae523aSJohnny Chen                         {
8828a2a0dfbSEnrico Granata                             if (value_type == eValueTypeVariableGlobal)
8838a2a0dfbSEnrico Granata                             {
8848a2a0dfbSEnrico Granata                                 const bool get_file_globals = true;
8858a2a0dfbSEnrico Granata                                 VariableList* frame_vars = frame->GetVariableList(get_file_globals);
8868a2a0dfbSEnrico Granata                                 if (frame_vars)
8878a2a0dfbSEnrico Granata                                     frame_vars->AppendVariablesIfUnique(variable_list);
8888a2a0dfbSEnrico Granata                             }
88969b582faSGreg Clayton                             ConstString const_name(name);
89008a04327SEnrico Granata                             VariableSP variable_sp(variable_list.FindVariable(const_name,value_type));
89108a04327SEnrico Granata                             if (variable_sp)
892beae523aSJohnny Chen                             {
893e3e91517SEnrico Granata                                 value_sp = frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues);
894e3e91517SEnrico Granata                                 sb_value.SetSP (value_sp, use_dynamic);
895beae523aSJohnny Chen                                 break;
896beae523aSJohnny Chen                             }
89730fdc8d8SChris Lattner                         }
89830fdc8d8SChris Lattner                     }
89969b582faSGreg Clayton                     break;
90069b582faSGreg Clayton 
90169b582faSGreg Clayton                 case eValueTypeRegister:            // stack frame register value
90269b582faSGreg Clayton                     {
903d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
90469b582faSGreg Clayton                         if (reg_ctx)
90569b582faSGreg Clayton                         {
90669b582faSGreg Clayton                             const uint32_t num_regs = reg_ctx->GetRegisterCount();
90769b582faSGreg Clayton                             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
90869b582faSGreg Clayton                             {
90969b582faSGreg Clayton                                 const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
91069b582faSGreg Clayton                                 if (reg_info &&
91169b582faSGreg Clayton                                     ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
91269b582faSGreg Clayton                                      (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
91369b582faSGreg Clayton                                 {
914d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
91581e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
91681e871edSGreg Clayton                                     break;
91769b582faSGreg Clayton                                 }
91869b582faSGreg Clayton                             }
91969b582faSGreg Clayton                         }
92069b582faSGreg Clayton                     }
92169b582faSGreg Clayton                     break;
92269b582faSGreg Clayton 
92369b582faSGreg Clayton                 case eValueTypeRegisterSet:         // A collection of stack frame register values
92469b582faSGreg Clayton                     {
925d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
92669b582faSGreg Clayton                         if (reg_ctx)
92769b582faSGreg Clayton                         {
92869b582faSGreg Clayton                             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
92969b582faSGreg Clayton                             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
93069b582faSGreg Clayton                             {
93169b582faSGreg Clayton                                 const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
93269b582faSGreg Clayton                                 if (reg_set &&
93369b582faSGreg Clayton                                     ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
93469b582faSGreg Clayton                                      (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
93569b582faSGreg Clayton                                 {
936d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
93781e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
93881e871edSGreg Clayton                                     break;
93969b582faSGreg Clayton                                 }
94069b582faSGreg Clayton                             }
94169b582faSGreg Clayton                         }
94269b582faSGreg Clayton                     }
94369b582faSGreg Clayton                     break;
94469b582faSGreg Clayton 
94569b582faSGreg Clayton                 case eValueTypeConstResult:         // constant result variables
94669b582faSGreg Clayton                     {
94769b582faSGreg Clayton                         ConstString const_name(name);
948d9e416c0SGreg Clayton                         ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name));
94969b582faSGreg Clayton                         if (expr_var_sp)
95081e871edSGreg Clayton                         {
95181e871edSGreg Clayton                             value_sp = expr_var_sp->GetValueObject();
952e3e91517SEnrico Granata                             sb_value.SetSP (value_sp, use_dynamic);
95381e871edSGreg Clayton                         }
95469b582faSGreg Clayton                     }
95569b582faSGreg Clayton                     break;
95669b582faSGreg Clayton 
95769b582faSGreg Clayton                 default:
95869b582faSGreg Clayton                     break;
95969b582faSGreg Clayton                 }
960beae523aSJohnny Chen             }
961c9858e4dSGreg Clayton             else
962c9858e4dSGreg Clayton             {
963c9858e4dSGreg Clayton                 if (log)
9647730b9a4SJim Ingham                     log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame.");
9657730b9a4SJim Ingham             }
9667730b9a4SJim Ingham         }
9677730b9a4SJim Ingham         else
9687730b9a4SJim Ingham         {
9697730b9a4SJim Ingham             if (log)
9707730b9a4SJim Ingham                 log->Printf ("SBFrame::FindValue () => error: process is running");
971c9858e4dSGreg Clayton         }
9727fdf9ef1SGreg Clayton     }
973dde9cff3SCaroline Tice 
9744838131bSGreg Clayton     if (log)
97569b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
976324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), name, value_type,
977324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
9784838131bSGreg Clayton 
979dde9cff3SCaroline Tice     return sb_value;
980dde9cff3SCaroline Tice }
981dde9cff3SCaroline Tice 
98230fdc8d8SChris Lattner bool
98335e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const
98435e2ab60SJohnny Chen {
985b57e4a1bSJason Molenda     lldb::StackFrameSP this_sp = GetFrameSP();
986b57e4a1bSJason Molenda     lldb::StackFrameSP that_sp = that.GetFrameSP();
98735e2ab60SJohnny Chen     return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
98835e2ab60SJohnny Chen }
98935e2ab60SJohnny Chen 
99035e2ab60SJohnny Chen bool
99130fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
99230fdc8d8SChris Lattner {
99335e2ab60SJohnny Chen     return IsEqual(rhs);
99430fdc8d8SChris Lattner }
99530fdc8d8SChris Lattner 
99630fdc8d8SChris Lattner bool
99730fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
99830fdc8d8SChris Lattner {
99935e2ab60SJohnny Chen     return !IsEqual(rhs);
1000481cef25SGreg Clayton }
100130fdc8d8SChris Lattner 
100230fdc8d8SChris Lattner SBThread
100330fdc8d8SChris Lattner SBFrame::GetThread () const
100430fdc8d8SChris Lattner {
10055160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1006ceb6b139SCaroline Tice 
10077fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1008d9e416c0SGreg Clayton     ThreadSP thread_sp (exe_ctx.GetThreadSP());
1009d9e416c0SGreg Clayton     SBThread sb_thread (thread_sp);
1010ceb6b139SCaroline Tice 
1011ceb6b139SCaroline Tice     if (log)
1012750cd175SCaroline Tice     {
1013750cd175SCaroline Tice         SBStream sstr;
1014750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
1015d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
1016324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetFramePtr()),
1017324a1036SSaleem Abdulrasool                      static_cast<void*>(thread_sp.get()), sstr.GetData());
1018750cd175SCaroline Tice     }
1019ceb6b139SCaroline Tice 
102030fdc8d8SChris Lattner     return sb_thread;
102130fdc8d8SChris Lattner }
102230fdc8d8SChris Lattner 
102330fdc8d8SChris Lattner const char *
102430fdc8d8SChris Lattner SBFrame::Disassemble () const
102530fdc8d8SChris Lattner {
10265160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10274838131bSGreg Clayton     const char *disassembly = NULL;
10284fc6cb9cSJim Ingham     Mutex::Locker api_locker;
10294fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
10304fc6cb9cSJim Ingham 
1031b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1032d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
10337730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
10347730b9a4SJim Ingham     if (target && process)
1035af67cecdSGreg Clayton     {
10367fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10377730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
10387730b9a4SJim Ingham         {
10397730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
10407730b9a4SJim Ingham             if (frame)
10417fdf9ef1SGreg Clayton             {
1042d9e416c0SGreg Clayton                 disassembly = frame->Disassemble();
1043af67cecdSGreg Clayton             }
1044c9858e4dSGreg Clayton             else
1045c9858e4dSGreg Clayton             {
1046c9858e4dSGreg Clayton                 if (log)
10477730b9a4SJim Ingham                     log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame.");
10487730b9a4SJim Ingham             }
10497730b9a4SJim Ingham         }
10507730b9a4SJim Ingham         else
10517730b9a4SJim Ingham         {
10527730b9a4SJim Ingham             if (log)
10537730b9a4SJim Ingham                 log->Printf ("SBFrame::Disassemble () => error: process is running");
10547fdf9ef1SGreg Clayton         }
1055c9858e4dSGreg Clayton     }
10564838131bSGreg Clayton 
10574838131bSGreg Clayton     if (log)
1058324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::Disassemble () => %s",
1059324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), disassembly);
10604838131bSGreg Clayton 
10614838131bSGreg Clayton     return disassembly;
106230fdc8d8SChris Lattner }
106330fdc8d8SChris Lattner 
106430fdc8d8SChris Lattner 
106530fdc8d8SChris Lattner SBValueList
106630fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
106730fdc8d8SChris Lattner                        bool locals,
106830fdc8d8SChris Lattner                        bool statics,
106930fdc8d8SChris Lattner                        bool in_scope_only)
107030fdc8d8SChris Lattner {
1071316d498bSGreg Clayton     SBValueList value_list;
10727fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1073b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
1074d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1075d9e416c0SGreg Clayton     if (frame && target)
1076316d498bSGreg Clayton     {
1077d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
1078316d498bSGreg Clayton         value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic);
1079316d498bSGreg Clayton     }
1080316d498bSGreg Clayton     return value_list;
108178a685aaSJim Ingham }
108278a685aaSJim Ingham 
1083*560558ebSEnrico Granata lldb::SBValueList
1084*560558ebSEnrico Granata SBFrame::GetVariables (bool arguments,
1085*560558ebSEnrico Granata                        bool locals,
1086*560558ebSEnrico Granata                        bool statics,
1087*560558ebSEnrico Granata                        bool in_scope_only,
1088*560558ebSEnrico Granata                        lldb::DynamicValueType  use_dynamic)
1089*560558ebSEnrico Granata {
1090*560558ebSEnrico Granata     ExecutionContext exe_ctx(m_opaque_sp.get());
1091*560558ebSEnrico Granata     Target *target = exe_ctx.GetTargetPtr();
1092*560558ebSEnrico Granata     bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false;
1093*560558ebSEnrico Granata     return GetVariables(arguments,
1094*560558ebSEnrico Granata                         locals,
1095*560558ebSEnrico Granata                         statics,
1096*560558ebSEnrico Granata                         in_scope_only,
1097*560558ebSEnrico Granata                         include_runtime_support_values,
1098*560558ebSEnrico Granata                         use_dynamic);
1099*560558ebSEnrico Granata }
1100*560558ebSEnrico Granata 
110178a685aaSJim Ingham SBValueList
110278a685aaSJim Ingham SBFrame::GetVariables (bool arguments,
110378a685aaSJim Ingham                        bool locals,
110478a685aaSJim Ingham                        bool statics,
110578a685aaSJim Ingham                        bool in_scope_only,
1106*560558ebSEnrico Granata                        bool include_runtime_support_values,
11072837b766SJim Ingham                        lldb::DynamicValueType  use_dynamic)
110878a685aaSJim Ingham {
11095160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1110ceb6b139SCaroline Tice 
1111b9556accSGreg Clayton     SBValueList value_list;
11124fc6cb9cSJim Ingham     Mutex::Locker api_locker;
11134fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
11144fc6cb9cSJim Ingham 
1115b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1116d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1117b9556accSGreg Clayton 
1118ceb6b139SCaroline Tice     if (log)
11197730b9a4SJim Ingham         log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
1120324a1036SSaleem Abdulrasool                      arguments, locals, statics, in_scope_only);
1121ceb6b139SCaroline Tice 
11227730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
11237730b9a4SJim Ingham     if (target && process)
112430fdc8d8SChris Lattner     {
11257fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11267730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
11277fdf9ef1SGreg Clayton         {
11287730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
11297730b9a4SJim Ingham             if (frame)
11307730b9a4SJim Ingham             {
113130fdc8d8SChris Lattner                 size_t i;
1132af67cecdSGreg Clayton                 VariableList *variable_list = NULL;
1133d9e416c0SGreg Clayton                 variable_list = frame->GetVariableList(true);
113430fdc8d8SChris Lattner                 if (variable_list)
113530fdc8d8SChris Lattner                 {
113630fdc8d8SChris Lattner                     const size_t num_variables = variable_list->GetSize();
113730fdc8d8SChris Lattner                     if (num_variables)
113830fdc8d8SChris Lattner                     {
113930fdc8d8SChris Lattner                         for (i = 0; i < num_variables; ++i)
114030fdc8d8SChris Lattner                         {
114130fdc8d8SChris Lattner                             VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
114230fdc8d8SChris Lattner                             if (variable_sp)
114330fdc8d8SChris Lattner                             {
114430fdc8d8SChris Lattner                                 bool add_variable = false;
114530fdc8d8SChris Lattner                                 switch (variable_sp->GetScope())
114630fdc8d8SChris Lattner                                 {
114730fdc8d8SChris Lattner                                 case eValueTypeVariableGlobal:
114830fdc8d8SChris Lattner                                 case eValueTypeVariableStatic:
114930fdc8d8SChris Lattner                                     add_variable = statics;
115030fdc8d8SChris Lattner                                     break;
115130fdc8d8SChris Lattner 
115230fdc8d8SChris Lattner                                 case eValueTypeVariableArgument:
115330fdc8d8SChris Lattner                                     add_variable = arguments;
115430fdc8d8SChris Lattner                                     break;
115530fdc8d8SChris Lattner 
115630fdc8d8SChris Lattner                                 case eValueTypeVariableLocal:
115730fdc8d8SChris Lattner                                     add_variable = locals;
115830fdc8d8SChris Lattner                                     break;
1159c982c768SGreg Clayton 
1160c982c768SGreg Clayton                                 default:
1161c982c768SGreg Clayton                                     break;
116230fdc8d8SChris Lattner                                 }
116330fdc8d8SChris Lattner                                 if (add_variable)
116430fdc8d8SChris Lattner                                 {
1165d9e416c0SGreg Clayton                                     if (in_scope_only && !variable_sp->IsInScope(frame))
116630fdc8d8SChris Lattner                                         continue;
116730fdc8d8SChris Lattner 
1168e3e91517SEnrico Granata                                     ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues));
1169*560558ebSEnrico Granata 
1170*560558ebSEnrico Granata                                     if (false == include_runtime_support_values &&
1171*560558ebSEnrico Granata                                         valobj_sp &&
1172*560558ebSEnrico Granata                                         true == valobj_sp->IsRuntimeSupportValue())
1173*560558ebSEnrico Granata                                         continue;
1174*560558ebSEnrico Granata 
1175e3e91517SEnrico Granata                                     SBValue value_sb;
1176e3e91517SEnrico Granata                                     value_sb.SetSP(valobj_sp,use_dynamic);
1177e3e91517SEnrico Granata                                     value_list.Append(value_sb);
117830fdc8d8SChris Lattner                                 }
117930fdc8d8SChris Lattner                             }
118030fdc8d8SChris Lattner                         }
118130fdc8d8SChris Lattner                     }
118230fdc8d8SChris Lattner                 }
118330fdc8d8SChris Lattner             }
1184c9858e4dSGreg Clayton             else
1185c9858e4dSGreg Clayton             {
1186c9858e4dSGreg Clayton                 if (log)
11877730b9a4SJim Ingham                     log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
11887730b9a4SJim Ingham             }
11897730b9a4SJim Ingham         }
11907730b9a4SJim Ingham         else
11917730b9a4SJim Ingham         {
11927730b9a4SJim Ingham             if (log)
11937730b9a4SJim Ingham                 log->Printf ("SBFrame::GetVariables () => error: process is running");
1194c9858e4dSGreg Clayton         }
11957fdf9ef1SGreg Clayton     }
1196ceb6b139SCaroline Tice 
1197ceb6b139SCaroline Tice     if (log)
1198324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)",
1199324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1200324a1036SSaleem Abdulrasool                      static_cast<void*>(value_list.opaque_ptr()));
1201ceb6b139SCaroline Tice 
120230fdc8d8SChris Lattner     return value_list;
120330fdc8d8SChris Lattner }
120430fdc8d8SChris Lattner 
120569b582faSGreg Clayton SBValueList
120630fdc8d8SChris Lattner SBFrame::GetRegisters ()
120730fdc8d8SChris Lattner {
12085160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1209ceb6b139SCaroline Tice 
121030fdc8d8SChris Lattner     SBValueList value_list;
12114fc6cb9cSJim Ingham     Mutex::Locker api_locker;
12124fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
12134fc6cb9cSJim Ingham 
1214b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1215d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
12167730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
12177730b9a4SJim Ingham     if (target && process)
121830fdc8d8SChris Lattner     {
12197fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
12207730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
12217730b9a4SJim Ingham         {
12227730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
12237730b9a4SJim Ingham             if (frame)
12247fdf9ef1SGreg Clayton             {
1225d9e416c0SGreg Clayton                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
122630fdc8d8SChris Lattner                 if (reg_ctx)
122730fdc8d8SChris Lattner                 {
122830fdc8d8SChris Lattner                     const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
122930fdc8d8SChris Lattner                     for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
123030fdc8d8SChris Lattner                     {
1231d9e416c0SGreg Clayton                         value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
123230fdc8d8SChris Lattner                     }
123330fdc8d8SChris Lattner                 }
123430fdc8d8SChris Lattner             }
1235c9858e4dSGreg Clayton             else
1236c9858e4dSGreg Clayton             {
1237c9858e4dSGreg Clayton                 if (log)
12387730b9a4SJim Ingham                     log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame.");
12397730b9a4SJim Ingham             }
12407730b9a4SJim Ingham         }
12417730b9a4SJim Ingham         else
12427730b9a4SJim Ingham         {
12437730b9a4SJim Ingham             if (log)
12447730b9a4SJim Ingham                 log->Printf ("SBFrame::GetRegisters () => error: process is running");
1245c9858e4dSGreg Clayton         }
12467fdf9ef1SGreg Clayton     }
1247ceb6b139SCaroline Tice 
1248ceb6b139SCaroline Tice     if (log)
1249324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)",
1250324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1251324a1036SSaleem Abdulrasool                      static_cast<void*>(value_list.opaque_ptr()));
1252ceb6b139SCaroline Tice 
125330fdc8d8SChris Lattner     return value_list;
125430fdc8d8SChris Lattner }
125530fdc8d8SChris Lattner 
1256ad9a53c5SJason Molenda SBValue
1257ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name)
1258ad9a53c5SJason Molenda {
1259ad9a53c5SJason Molenda     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1260ad9a53c5SJason Molenda 
1261ad9a53c5SJason Molenda     SBValue result;
1262ad9a53c5SJason Molenda     ValueObjectSP value_sp;
1263ad9a53c5SJason Molenda     Mutex::Locker api_locker;
1264ad9a53c5SJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1265ad9a53c5SJason Molenda 
1266b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1267ad9a53c5SJason Molenda     Target *target = exe_ctx.GetTargetPtr();
1268ad9a53c5SJason Molenda     Process *process = exe_ctx.GetProcessPtr();
1269ad9a53c5SJason Molenda     if (target && process)
1270ad9a53c5SJason Molenda     {
1271ad9a53c5SJason Molenda         Process::StopLocker stop_locker;
1272ad9a53c5SJason Molenda         if (stop_locker.TryLock(&process->GetRunLock()))
1273ad9a53c5SJason Molenda         {
1274ad9a53c5SJason Molenda             frame = exe_ctx.GetFramePtr();
1275ad9a53c5SJason Molenda             if (frame)
1276ad9a53c5SJason Molenda             {
1277ad9a53c5SJason Molenda                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
1278ad9a53c5SJason Molenda                 if (reg_ctx)
1279ad9a53c5SJason Molenda                 {
1280ad9a53c5SJason Molenda                     const uint32_t num_regs = reg_ctx->GetRegisterCount();
1281ad9a53c5SJason Molenda                     for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
1282ad9a53c5SJason Molenda                     {
1283ad9a53c5SJason Molenda                         const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
1284ad9a53c5SJason Molenda                         if (reg_info &&
1285ad9a53c5SJason Molenda                             ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
1286ad9a53c5SJason Molenda                              (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
1287ad9a53c5SJason Molenda                         {
1288ad9a53c5SJason Molenda                             value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
1289ad9a53c5SJason Molenda                             result.SetSP (value_sp);
1290ad9a53c5SJason Molenda                             break;
1291ad9a53c5SJason Molenda                         }
1292ad9a53c5SJason Molenda                     }
1293ad9a53c5SJason Molenda                 }
1294ad9a53c5SJason Molenda             }
1295ad9a53c5SJason Molenda             else
1296ad9a53c5SJason Molenda             {
1297ad9a53c5SJason Molenda                 if (log)
12985d353842SJason Molenda                     log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame.");
1299ad9a53c5SJason Molenda             }
1300ad9a53c5SJason Molenda         }
1301ad9a53c5SJason Molenda         else
1302ad9a53c5SJason Molenda         {
1303ad9a53c5SJason Molenda             if (log)
13045d353842SJason Molenda                 log->Printf ("SBFrame::FindRegister () => error: process is running");
1305ad9a53c5SJason Molenda         }
1306ad9a53c5SJason Molenda     }
1307ad9a53c5SJason Molenda 
1308ad9a53c5SJason Molenda     if (log)
1309324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)",
1310324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1311324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
1312ad9a53c5SJason Molenda 
1313ad9a53c5SJason Molenda     return result;
1314ad9a53c5SJason Molenda }
1315ad9a53c5SJason Molenda 
1316dde9cff3SCaroline Tice bool
1317dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
1318dde9cff3SCaroline Tice {
13195160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1320da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1321da7bc7d0SGreg Clayton 
13224fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13234fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13244fc6cb9cSJim Ingham 
1325b57e4a1bSJason Molenda     StackFrame *frame;
1326d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
13277730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
13287730b9a4SJim Ingham     if (target && process)
1329dde9cff3SCaroline Tice     {
13307fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13317730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
13327730b9a4SJim Ingham         {
13337730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
13347730b9a4SJim Ingham             if (frame)
13357fdf9ef1SGreg Clayton             {
1336d9e416c0SGreg Clayton                 frame->DumpUsingSettingsFormat (&strm);
1337dde9cff3SCaroline Tice             }
1338c9858e4dSGreg Clayton             else
1339c9858e4dSGreg Clayton             {
1340c9858e4dSGreg Clayton                 if (log)
13417730b9a4SJim Ingham                     log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame.");
13427730b9a4SJim Ingham             }
13437730b9a4SJim Ingham         }
13447730b9a4SJim Ingham         else
13457730b9a4SJim Ingham         {
13467730b9a4SJim Ingham             if (log)
13477730b9a4SJim Ingham                 log->Printf ("SBFrame::GetDescription () => error: process is running");
1348c9858e4dSGreg Clayton         }
1349c9858e4dSGreg Clayton 
13507fdf9ef1SGreg Clayton     }
1351dde9cff3SCaroline Tice     else
1352da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1353dde9cff3SCaroline Tice 
1354dde9cff3SCaroline Tice     return true;
1355dde9cff3SCaroline Tice }
13561d3afba3SGreg Clayton 
135769b582faSGreg Clayton SBValue
13581d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
13591d3afba3SGreg Clayton {
1360316d498bSGreg Clayton     SBValue result;
13617fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1362b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
1363d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1364d9e416c0SGreg Clayton     if (frame && target)
1365316d498bSGreg Clayton     {
136635e1bda6SJim Ingham         SBExpressionOptions options;
136735e1bda6SJim Ingham         lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue();
1368cced1566SGreg Clayton         options.SetFetchDynamicValue (fetch_dynamic_value);
136935e1bda6SJim Ingham         options.SetUnwindOnError (true);
137035e1bda6SJim Ingham         return EvaluateExpression (expr, options);
1371316d498bSGreg Clayton     }
1372316d498bSGreg Clayton     return result;
137378a685aaSJim Ingham }
137478a685aaSJim Ingham 
137578a685aaSJim Ingham SBValue
13762837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
137778a685aaSJim Ingham {
137835e1bda6SJim Ingham     SBExpressionOptions options;
1379cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
138035e1bda6SJim Ingham     options.SetUnwindOnError (true);
138135e1bda6SJim Ingham     return EvaluateExpression (expr, options);
13827ba6e991SJim Ingham }
13837ba6e991SJim Ingham 
13847ba6e991SJim Ingham SBValue
13857ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error)
13867ba6e991SJim Ingham {
138735e1bda6SJim Ingham     SBExpressionOptions options;
1388cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
138935e1bda6SJim Ingham     options.SetUnwindOnError (unwind_on_error);
139035e1bda6SJim Ingham     return EvaluateExpression (expr, options);
139135e1bda6SJim Ingham }
139235e1bda6SJim Ingham 
139335e1bda6SJim Ingham lldb::SBValue
139435e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options)
139535e1bda6SJim Ingham {
13965160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
13974838131bSGreg Clayton 
13985160ce5cSGreg Clayton     Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1399a162ebafSSean Callanan 
14008646d3c1SJim Ingham     ExpressionResults exe_results = eExpressionSetupError;
140169b582faSGreg Clayton     SBValue expr_result;
14027730b9a4SJim Ingham 
14037730b9a4SJim Ingham     if (expr == NULL || expr[0] == '\0')
14047730b9a4SJim Ingham     {
14057730b9a4SJim Ingham         if (log)
14067730b9a4SJim Ingham             log->Printf ("SBFrame::EvaluateExpression called with an empty expression");
14077730b9a4SJim Ingham         return expr_result;
14087730b9a4SJim Ingham     }
14097730b9a4SJim Ingham 
141081e871edSGreg Clayton     ValueObjectSP expr_value_sp;
14114838131bSGreg Clayton 
14124fc6cb9cSJim Ingham     Mutex::Locker api_locker;
14134fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
14144fc6cb9cSJim Ingham 
1415b9556accSGreg Clayton     if (log)
14167730b9a4SJim Ingham         log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
1417b9556accSGreg Clayton 
1418b57e4a1bSJason Molenda     StackFrame *frame = NULL;
14197730b9a4SJim Ingham     Target *target = exe_ctx.GetTargetPtr();
14207730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
14217730b9a4SJim Ingham 
14227730b9a4SJim Ingham     if (target && process)
14231d3afba3SGreg 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             {
1430fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1431fb6621efSGreg Clayton                 {
14321ba7c4d0SGreg Clayton                     StreamString frame_description;
1433d9e416c0SGreg Clayton                     frame->DumpUsingSettingsFormat (&frame_description);
14341ba7c4d0SGreg Clayton                     Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
1435cced1566SGreg Clayton                                                          expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str());
1436fb6621efSGreg Clayton                 }
1437fb6621efSGreg Clayton 
1438d9e416c0SGreg Clayton                 exe_results = target->EvaluateExpression (expr,
1439d9e416c0SGreg Clayton                                                           frame,
1440d4439aa9SEnrico Granata                                                           expr_value_sp,
144135e1bda6SJim Ingham                                                           options.ref());
1442e3e91517SEnrico Granata                 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1443fb6621efSGreg Clayton 
1444fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1445f49e65aeSGreg Clayton                     Host::SetCrashDescription (NULL);
14461d3afba3SGreg Clayton             }
1447c9858e4dSGreg Clayton             else
1448c9858e4dSGreg Clayton             {
1449c9858e4dSGreg Clayton                 if (log)
14507730b9a4SJim Ingham                     log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame.");
14517730b9a4SJim Ingham             }
14527730b9a4SJim Ingham         }
14537730b9a4SJim Ingham         else
14547730b9a4SJim Ingham         {
14557730b9a4SJim Ingham             if (log)
14567730b9a4SJim Ingham                 log->Printf ("SBFrame::EvaluateExpression () => error: process is running");
1457c9858e4dSGreg Clayton         }
14587fdf9ef1SGreg Clayton     }
14594838131bSGreg Clayton 
1460cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1461a162ebafSSean Callanan     if (expr_log)
146278a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
1463324a1036SSaleem Abdulrasool                          expr_result.GetValue(), expr_result.GetSummary());
1464a162ebafSSean Callanan 
14654838131bSGreg Clayton     if (log)
1466d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1467324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), expr,
1468324a1036SSaleem Abdulrasool                      static_cast<void*>(expr_value_sp.get()), exe_results);
1469cf7e2dc0SJason Molenda #endif
14704838131bSGreg Clayton 
1471cfd1acedSGreg Clayton     return expr_result;
14721d3afba3SGreg Clayton }
1473316d498bSGreg Clayton 
1474316d498bSGreg Clayton bool
1475316d498bSGreg Clayton SBFrame::IsInlined()
1476316d498bSGreg Clayton {
14775160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14787fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1479b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1480d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
14817730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
14827730b9a4SJim Ingham     if (target && process)
1483316d498bSGreg Clayton     {
14847fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
14857730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
14867730b9a4SJim Ingham         {
14877730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
14887730b9a4SJim Ingham             if (frame)
14897fdf9ef1SGreg Clayton             {
14907fdf9ef1SGreg Clayton 
1491d9e416c0SGreg Clayton                 Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1492316d498bSGreg Clayton                 if (block)
1493316d498bSGreg Clayton                     return block->GetContainingInlinedBlock () != NULL;
1494316d498bSGreg Clayton             }
1495c9858e4dSGreg Clayton             else
1496c9858e4dSGreg Clayton             {
1497c9858e4dSGreg Clayton                 if (log)
14987730b9a4SJim Ingham                     log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame.");
14997730b9a4SJim Ingham             }
15007730b9a4SJim Ingham         }
15017730b9a4SJim Ingham         else
15027730b9a4SJim Ingham         {
15037730b9a4SJim Ingham             if (log)
15047730b9a4SJim Ingham                 log->Printf ("SBFrame::IsInlined () => error: process is running");
1505c9858e4dSGreg Clayton         }
1506c9858e4dSGreg Clayton 
15077fdf9ef1SGreg Clayton     }
1508316d498bSGreg Clayton     return false;
1509316d498bSGreg Clayton }
1510316d498bSGreg Clayton 
1511316d498bSGreg Clayton const char *
1512316d498bSGreg Clayton SBFrame::GetFunctionName()
1513316d498bSGreg Clayton {
15145160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1515316d498bSGreg Clayton     const char *name = NULL;
15167fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1517b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1518d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
15197730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
15207730b9a4SJim Ingham     if (target && process)
1521316d498bSGreg Clayton     {
15227fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
15237730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
15247730b9a4SJim Ingham         {
15257730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
15267730b9a4SJim Ingham             if (frame)
15277fdf9ef1SGreg Clayton             {
1528d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1529316d498bSGreg Clayton                 if (sc.block)
1530316d498bSGreg Clayton                 {
1531316d498bSGreg Clayton                     Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1532316d498bSGreg Clayton                     if (inlined_block)
1533316d498bSGreg Clayton                     {
1534316d498bSGreg Clayton                         const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1535316d498bSGreg Clayton                         name = inlined_info->GetName().AsCString();
1536316d498bSGreg Clayton                     }
1537316d498bSGreg Clayton                 }
1538316d498bSGreg Clayton 
1539316d498bSGreg Clayton                 if (name == NULL)
1540316d498bSGreg Clayton                 {
1541316d498bSGreg Clayton                     if (sc.function)
1542316d498bSGreg Clayton                         name = sc.function->GetName().GetCString();
1543316d498bSGreg Clayton                 }
1544316d498bSGreg Clayton 
1545316d498bSGreg Clayton                 if (name == NULL)
1546316d498bSGreg Clayton                 {
1547316d498bSGreg Clayton                     if (sc.symbol)
1548316d498bSGreg Clayton                         name = sc.symbol->GetName().GetCString();
1549316d498bSGreg Clayton                 }
1550316d498bSGreg Clayton             }
1551c9858e4dSGreg Clayton             else
1552c9858e4dSGreg Clayton             {
1553c9858e4dSGreg Clayton                 if (log)
15547730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame.");
15557730b9a4SJim Ingham             }
15567730b9a4SJim Ingham         }
15577730b9a4SJim Ingham         else
15587730b9a4SJim Ingham         {
15597730b9a4SJim Ingham             if (log)
15607730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFunctionName() => error: process is running");
1561c9858e4dSGreg Clayton 
1562c9858e4dSGreg Clayton         }
15637fdf9ef1SGreg Clayton     }
1564316d498bSGreg Clayton     return name;
1565316d498bSGreg Clayton }
1566316d498bSGreg Clayton 
1567