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 
108378a685aaSJim Ingham SBValueList
108478a685aaSJim Ingham SBFrame::GetVariables (bool arguments,
108578a685aaSJim Ingham                        bool locals,
108678a685aaSJim Ingham                        bool statics,
108778a685aaSJim Ingham                        bool in_scope_only,
10882837b766SJim Ingham                        lldb::DynamicValueType  use_dynamic)
108978a685aaSJim Ingham {
10905160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1091ceb6b139SCaroline Tice 
1092b9556accSGreg Clayton     SBValueList value_list;
10934fc6cb9cSJim Ingham     Mutex::Locker api_locker;
10944fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
10954fc6cb9cSJim Ingham 
1096b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1097d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1098b9556accSGreg Clayton 
1099ceb6b139SCaroline Tice     if (log)
11007730b9a4SJim Ingham         log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
1101324a1036SSaleem Abdulrasool                      arguments, locals, statics, in_scope_only);
1102ceb6b139SCaroline Tice 
11037730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
11047730b9a4SJim Ingham     if (target && process)
110530fdc8d8SChris Lattner     {
11067fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11077730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
11087fdf9ef1SGreg Clayton         {
11097730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
11107730b9a4SJim Ingham             if (frame)
11117730b9a4SJim Ingham             {
111230fdc8d8SChris Lattner                 size_t i;
1113af67cecdSGreg Clayton                 VariableList *variable_list = NULL;
1114d9e416c0SGreg Clayton                 variable_list = frame->GetVariableList(true);
111530fdc8d8SChris Lattner                 if (variable_list)
111630fdc8d8SChris Lattner                 {
111730fdc8d8SChris Lattner                     const size_t num_variables = variable_list->GetSize();
111830fdc8d8SChris Lattner                     if (num_variables)
111930fdc8d8SChris Lattner                     {
112030fdc8d8SChris Lattner                         for (i = 0; i < num_variables; ++i)
112130fdc8d8SChris Lattner                         {
112230fdc8d8SChris Lattner                             VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
112330fdc8d8SChris Lattner                             if (variable_sp)
112430fdc8d8SChris Lattner                             {
112530fdc8d8SChris Lattner                                 bool add_variable = false;
112630fdc8d8SChris Lattner                                 switch (variable_sp->GetScope())
112730fdc8d8SChris Lattner                                 {
112830fdc8d8SChris Lattner                                 case eValueTypeVariableGlobal:
112930fdc8d8SChris Lattner                                 case eValueTypeVariableStatic:
113030fdc8d8SChris Lattner                                     add_variable = statics;
113130fdc8d8SChris Lattner                                     break;
113230fdc8d8SChris Lattner 
113330fdc8d8SChris Lattner                                 case eValueTypeVariableArgument:
113430fdc8d8SChris Lattner                                     add_variable = arguments;
113530fdc8d8SChris Lattner                                     break;
113630fdc8d8SChris Lattner 
113730fdc8d8SChris Lattner                                 case eValueTypeVariableLocal:
113830fdc8d8SChris Lattner                                     add_variable = locals;
113930fdc8d8SChris Lattner                                     break;
1140c982c768SGreg Clayton 
1141c982c768SGreg Clayton                                 default:
1142c982c768SGreg Clayton                                     break;
114330fdc8d8SChris Lattner                                 }
114430fdc8d8SChris Lattner                                 if (add_variable)
114530fdc8d8SChris Lattner                                 {
1146d9e416c0SGreg Clayton                                     if (in_scope_only && !variable_sp->IsInScope(frame))
114730fdc8d8SChris Lattner                                         continue;
114830fdc8d8SChris Lattner 
1149e3e91517SEnrico Granata                                     ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues));
1150e3e91517SEnrico Granata                                     SBValue value_sb;
1151e3e91517SEnrico Granata                                     value_sb.SetSP(valobj_sp,use_dynamic);
1152e3e91517SEnrico Granata                                     value_list.Append(value_sb);
115330fdc8d8SChris Lattner                                 }
115430fdc8d8SChris Lattner                             }
115530fdc8d8SChris Lattner                         }
115630fdc8d8SChris Lattner                     }
115730fdc8d8SChris Lattner                 }
115830fdc8d8SChris Lattner             }
1159c9858e4dSGreg Clayton             else
1160c9858e4dSGreg Clayton             {
1161c9858e4dSGreg Clayton                 if (log)
11627730b9a4SJim Ingham                     log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
11637730b9a4SJim Ingham             }
11647730b9a4SJim Ingham         }
11657730b9a4SJim Ingham         else
11667730b9a4SJim Ingham         {
11677730b9a4SJim Ingham             if (log)
11687730b9a4SJim Ingham                 log->Printf ("SBFrame::GetVariables () => error: process is running");
1169c9858e4dSGreg Clayton         }
11707fdf9ef1SGreg Clayton     }
1171ceb6b139SCaroline Tice 
1172ceb6b139SCaroline Tice     if (log)
1173324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)",
1174324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1175324a1036SSaleem Abdulrasool                      static_cast<void*>(value_list.opaque_ptr()));
1176ceb6b139SCaroline Tice 
117730fdc8d8SChris Lattner     return value_list;
117830fdc8d8SChris Lattner }
117930fdc8d8SChris Lattner 
118069b582faSGreg Clayton SBValueList
118130fdc8d8SChris Lattner SBFrame::GetRegisters ()
118230fdc8d8SChris Lattner {
11835160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1184ceb6b139SCaroline Tice 
118530fdc8d8SChris Lattner     SBValueList value_list;
11864fc6cb9cSJim Ingham     Mutex::Locker api_locker;
11874fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
11884fc6cb9cSJim Ingham 
1189b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1190d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
11917730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
11927730b9a4SJim Ingham     if (target && process)
119330fdc8d8SChris Lattner     {
11947fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11957730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
11967730b9a4SJim Ingham         {
11977730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
11987730b9a4SJim Ingham             if (frame)
11997fdf9ef1SGreg Clayton             {
1200d9e416c0SGreg Clayton                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
120130fdc8d8SChris Lattner                 if (reg_ctx)
120230fdc8d8SChris Lattner                 {
120330fdc8d8SChris Lattner                     const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
120430fdc8d8SChris Lattner                     for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
120530fdc8d8SChris Lattner                     {
1206d9e416c0SGreg Clayton                         value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
120730fdc8d8SChris Lattner                     }
120830fdc8d8SChris Lattner                 }
120930fdc8d8SChris Lattner             }
1210c9858e4dSGreg Clayton             else
1211c9858e4dSGreg Clayton             {
1212c9858e4dSGreg Clayton                 if (log)
12137730b9a4SJim Ingham                     log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame.");
12147730b9a4SJim Ingham             }
12157730b9a4SJim Ingham         }
12167730b9a4SJim Ingham         else
12177730b9a4SJim Ingham         {
12187730b9a4SJim Ingham             if (log)
12197730b9a4SJim Ingham                 log->Printf ("SBFrame::GetRegisters () => error: process is running");
1220c9858e4dSGreg Clayton         }
12217fdf9ef1SGreg Clayton     }
1222ceb6b139SCaroline Tice 
1223ceb6b139SCaroline Tice     if (log)
1224324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)",
1225324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1226324a1036SSaleem Abdulrasool                      static_cast<void*>(value_list.opaque_ptr()));
1227ceb6b139SCaroline Tice 
122830fdc8d8SChris Lattner     return value_list;
122930fdc8d8SChris Lattner }
123030fdc8d8SChris Lattner 
1231ad9a53c5SJason Molenda SBValue
1232ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name)
1233ad9a53c5SJason Molenda {
1234ad9a53c5SJason Molenda     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1235ad9a53c5SJason Molenda 
1236ad9a53c5SJason Molenda     SBValue result;
1237ad9a53c5SJason Molenda     ValueObjectSP value_sp;
1238ad9a53c5SJason Molenda     Mutex::Locker api_locker;
1239ad9a53c5SJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1240ad9a53c5SJason Molenda 
1241b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1242ad9a53c5SJason Molenda     Target *target = exe_ctx.GetTargetPtr();
1243ad9a53c5SJason Molenda     Process *process = exe_ctx.GetProcessPtr();
1244ad9a53c5SJason Molenda     if (target && process)
1245ad9a53c5SJason Molenda     {
1246ad9a53c5SJason Molenda         Process::StopLocker stop_locker;
1247ad9a53c5SJason Molenda         if (stop_locker.TryLock(&process->GetRunLock()))
1248ad9a53c5SJason Molenda         {
1249ad9a53c5SJason Molenda             frame = exe_ctx.GetFramePtr();
1250ad9a53c5SJason Molenda             if (frame)
1251ad9a53c5SJason Molenda             {
1252ad9a53c5SJason Molenda                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
1253ad9a53c5SJason Molenda                 if (reg_ctx)
1254ad9a53c5SJason Molenda                 {
1255ad9a53c5SJason Molenda                     const uint32_t num_regs = reg_ctx->GetRegisterCount();
1256ad9a53c5SJason Molenda                     for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
1257ad9a53c5SJason Molenda                     {
1258ad9a53c5SJason Molenda                         const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
1259ad9a53c5SJason Molenda                         if (reg_info &&
1260ad9a53c5SJason Molenda                             ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
1261ad9a53c5SJason Molenda                              (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
1262ad9a53c5SJason Molenda                         {
1263ad9a53c5SJason Molenda                             value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
1264ad9a53c5SJason Molenda                             result.SetSP (value_sp);
1265ad9a53c5SJason Molenda                             break;
1266ad9a53c5SJason Molenda                         }
1267ad9a53c5SJason Molenda                     }
1268ad9a53c5SJason Molenda                 }
1269ad9a53c5SJason Molenda             }
1270ad9a53c5SJason Molenda             else
1271ad9a53c5SJason Molenda             {
1272ad9a53c5SJason Molenda                 if (log)
12735d353842SJason Molenda                     log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame.");
1274ad9a53c5SJason Molenda             }
1275ad9a53c5SJason Molenda         }
1276ad9a53c5SJason Molenda         else
1277ad9a53c5SJason Molenda         {
1278ad9a53c5SJason Molenda             if (log)
12795d353842SJason Molenda                 log->Printf ("SBFrame::FindRegister () => error: process is running");
1280ad9a53c5SJason Molenda         }
1281ad9a53c5SJason Molenda     }
1282ad9a53c5SJason Molenda 
1283ad9a53c5SJason Molenda     if (log)
1284324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)",
1285324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1286324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
1287ad9a53c5SJason Molenda 
1288ad9a53c5SJason Molenda     return result;
1289ad9a53c5SJason Molenda }
1290ad9a53c5SJason Molenda 
1291dde9cff3SCaroline Tice bool
1292dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
1293dde9cff3SCaroline Tice {
12945160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1295da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1296da7bc7d0SGreg Clayton 
12974fc6cb9cSJim Ingham     Mutex::Locker api_locker;
12984fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
12994fc6cb9cSJim Ingham 
1300b57e4a1bSJason Molenda     StackFrame *frame;
1301d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
13027730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
13037730b9a4SJim Ingham     if (target && process)
1304dde9cff3SCaroline Tice     {
13057fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13067730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
13077730b9a4SJim Ingham         {
13087730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
13097730b9a4SJim Ingham             if (frame)
13107fdf9ef1SGreg Clayton             {
1311d9e416c0SGreg Clayton                 frame->DumpUsingSettingsFormat (&strm);
1312dde9cff3SCaroline Tice             }
1313c9858e4dSGreg Clayton             else
1314c9858e4dSGreg Clayton             {
1315c9858e4dSGreg Clayton                 if (log)
13167730b9a4SJim Ingham                     log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame.");
13177730b9a4SJim Ingham             }
13187730b9a4SJim Ingham         }
13197730b9a4SJim Ingham         else
13207730b9a4SJim Ingham         {
13217730b9a4SJim Ingham             if (log)
13227730b9a4SJim Ingham                 log->Printf ("SBFrame::GetDescription () => error: process is running");
1323c9858e4dSGreg Clayton         }
1324c9858e4dSGreg Clayton 
13257fdf9ef1SGreg Clayton     }
1326dde9cff3SCaroline Tice     else
1327da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1328dde9cff3SCaroline Tice 
1329dde9cff3SCaroline Tice     return true;
1330dde9cff3SCaroline Tice }
13311d3afba3SGreg Clayton 
133269b582faSGreg Clayton SBValue
13331d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
13341d3afba3SGreg Clayton {
1335316d498bSGreg Clayton     SBValue result;
13367fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1337b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
1338d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1339d9e416c0SGreg Clayton     if (frame && target)
1340316d498bSGreg Clayton     {
134135e1bda6SJim Ingham         SBExpressionOptions options;
134235e1bda6SJim Ingham         lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue();
1343cced1566SGreg Clayton         options.SetFetchDynamicValue (fetch_dynamic_value);
134435e1bda6SJim Ingham         options.SetUnwindOnError (true);
134535e1bda6SJim Ingham         return EvaluateExpression (expr, options);
1346316d498bSGreg Clayton     }
1347316d498bSGreg Clayton     return result;
134878a685aaSJim Ingham }
134978a685aaSJim Ingham 
135078a685aaSJim Ingham SBValue
13512837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
135278a685aaSJim Ingham {
135335e1bda6SJim Ingham     SBExpressionOptions options;
1354cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
135535e1bda6SJim Ingham     options.SetUnwindOnError (true);
135635e1bda6SJim Ingham     return EvaluateExpression (expr, options);
13577ba6e991SJim Ingham }
13587ba6e991SJim Ingham 
13597ba6e991SJim Ingham SBValue
13607ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error)
13617ba6e991SJim Ingham {
136235e1bda6SJim Ingham     SBExpressionOptions options;
1363cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
136435e1bda6SJim Ingham     options.SetUnwindOnError (unwind_on_error);
136535e1bda6SJim Ingham     return EvaluateExpression (expr, options);
136635e1bda6SJim Ingham }
136735e1bda6SJim Ingham 
136835e1bda6SJim Ingham lldb::SBValue
136935e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options)
137035e1bda6SJim Ingham {
13715160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
13724838131bSGreg Clayton 
13735160ce5cSGreg Clayton     Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1374a162ebafSSean Callanan 
1375*8646d3c1SJim Ingham     ExpressionResults exe_results = eExpressionSetupError;
137669b582faSGreg Clayton     SBValue expr_result;
13777730b9a4SJim Ingham 
13787730b9a4SJim Ingham     if (expr == NULL || expr[0] == '\0')
13797730b9a4SJim Ingham     {
13807730b9a4SJim Ingham         if (log)
13817730b9a4SJim Ingham             log->Printf ("SBFrame::EvaluateExpression called with an empty expression");
13827730b9a4SJim Ingham         return expr_result;
13837730b9a4SJim Ingham     }
13847730b9a4SJim Ingham 
138581e871edSGreg Clayton     ValueObjectSP expr_value_sp;
13864838131bSGreg Clayton 
13874fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13884fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13894fc6cb9cSJim Ingham 
1390b9556accSGreg Clayton     if (log)
13917730b9a4SJim Ingham         log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
1392b9556accSGreg Clayton 
1393b57e4a1bSJason Molenda     StackFrame *frame = NULL;
13947730b9a4SJim Ingham     Target *target = exe_ctx.GetTargetPtr();
13957730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
13967730b9a4SJim Ingham 
13977730b9a4SJim Ingham     if (target && process)
13981d3afba3SGreg Clayton     {
13997fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
14007730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
14017730b9a4SJim Ingham         {
14027730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
14037730b9a4SJim Ingham             if (frame)
14047fdf9ef1SGreg Clayton             {
1405fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1406fb6621efSGreg Clayton                 {
14071ba7c4d0SGreg Clayton                     StreamString frame_description;
1408d9e416c0SGreg Clayton                     frame->DumpUsingSettingsFormat (&frame_description);
14091ba7c4d0SGreg Clayton                     Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
1410cced1566SGreg Clayton                                                          expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str());
1411fb6621efSGreg Clayton                 }
1412fb6621efSGreg Clayton 
1413d9e416c0SGreg Clayton                 exe_results = target->EvaluateExpression (expr,
1414d9e416c0SGreg Clayton                                                           frame,
1415d4439aa9SEnrico Granata                                                           expr_value_sp,
141635e1bda6SJim Ingham                                                           options.ref());
1417e3e91517SEnrico Granata                 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1418fb6621efSGreg Clayton 
1419fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1420f49e65aeSGreg Clayton                     Host::SetCrashDescription (NULL);
14211d3afba3SGreg Clayton             }
1422c9858e4dSGreg Clayton             else
1423c9858e4dSGreg Clayton             {
1424c9858e4dSGreg Clayton                 if (log)
14257730b9a4SJim Ingham                     log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame.");
14267730b9a4SJim Ingham             }
14277730b9a4SJim Ingham         }
14287730b9a4SJim Ingham         else
14297730b9a4SJim Ingham         {
14307730b9a4SJim Ingham             if (log)
14317730b9a4SJim Ingham                 log->Printf ("SBFrame::EvaluateExpression () => error: process is running");
1432c9858e4dSGreg Clayton         }
14337fdf9ef1SGreg Clayton     }
14344838131bSGreg Clayton 
1435cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1436a162ebafSSean Callanan     if (expr_log)
143778a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
1438324a1036SSaleem Abdulrasool                          expr_result.GetValue(), expr_result.GetSummary());
1439a162ebafSSean Callanan 
14404838131bSGreg Clayton     if (log)
1441d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1442324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), expr,
1443324a1036SSaleem Abdulrasool                      static_cast<void*>(expr_value_sp.get()), exe_results);
1444cf7e2dc0SJason Molenda #endif
14454838131bSGreg Clayton 
1446cfd1acedSGreg Clayton     return expr_result;
14471d3afba3SGreg Clayton }
1448316d498bSGreg Clayton 
1449316d498bSGreg Clayton bool
1450316d498bSGreg Clayton SBFrame::IsInlined()
1451316d498bSGreg Clayton {
14525160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14537fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1454b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1455d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
14567730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
14577730b9a4SJim Ingham     if (target && process)
1458316d498bSGreg Clayton     {
14597fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
14607730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
14617730b9a4SJim Ingham         {
14627730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
14637730b9a4SJim Ingham             if (frame)
14647fdf9ef1SGreg Clayton             {
14657fdf9ef1SGreg Clayton 
1466d9e416c0SGreg Clayton                 Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1467316d498bSGreg Clayton                 if (block)
1468316d498bSGreg Clayton                     return block->GetContainingInlinedBlock () != NULL;
1469316d498bSGreg Clayton             }
1470c9858e4dSGreg Clayton             else
1471c9858e4dSGreg Clayton             {
1472c9858e4dSGreg Clayton                 if (log)
14737730b9a4SJim Ingham                     log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame.");
14747730b9a4SJim Ingham             }
14757730b9a4SJim Ingham         }
14767730b9a4SJim Ingham         else
14777730b9a4SJim Ingham         {
14787730b9a4SJim Ingham             if (log)
14797730b9a4SJim Ingham                 log->Printf ("SBFrame::IsInlined () => error: process is running");
1480c9858e4dSGreg Clayton         }
1481c9858e4dSGreg Clayton 
14827fdf9ef1SGreg Clayton     }
1483316d498bSGreg Clayton     return false;
1484316d498bSGreg Clayton }
1485316d498bSGreg Clayton 
1486316d498bSGreg Clayton const char *
1487316d498bSGreg Clayton SBFrame::GetFunctionName()
1488316d498bSGreg Clayton {
14895160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1490316d498bSGreg Clayton     const char *name = NULL;
14917fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1492b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1493d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
14947730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
14957730b9a4SJim Ingham     if (target && process)
1496316d498bSGreg Clayton     {
14977fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
14987730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
14997730b9a4SJim Ingham         {
15007730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
15017730b9a4SJim Ingham             if (frame)
15027fdf9ef1SGreg Clayton             {
1503d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1504316d498bSGreg Clayton                 if (sc.block)
1505316d498bSGreg Clayton                 {
1506316d498bSGreg Clayton                     Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1507316d498bSGreg Clayton                     if (inlined_block)
1508316d498bSGreg Clayton                     {
1509316d498bSGreg Clayton                         const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1510316d498bSGreg Clayton                         name = inlined_info->GetName().AsCString();
1511316d498bSGreg Clayton                     }
1512316d498bSGreg Clayton                 }
1513316d498bSGreg Clayton 
1514316d498bSGreg Clayton                 if (name == NULL)
1515316d498bSGreg Clayton                 {
1516316d498bSGreg Clayton                     if (sc.function)
1517316d498bSGreg Clayton                         name = sc.function->GetName().GetCString();
1518316d498bSGreg Clayton                 }
1519316d498bSGreg Clayton 
1520316d498bSGreg Clayton                 if (name == NULL)
1521316d498bSGreg Clayton                 {
1522316d498bSGreg Clayton                     if (sc.symbol)
1523316d498bSGreg Clayton                         name = sc.symbol->GetName().GetCString();
1524316d498bSGreg Clayton                 }
1525316d498bSGreg Clayton             }
1526c9858e4dSGreg Clayton             else
1527c9858e4dSGreg Clayton             {
1528c9858e4dSGreg Clayton                 if (log)
15297730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame.");
15307730b9a4SJim Ingham             }
15317730b9a4SJim Ingham         }
15327730b9a4SJim Ingham         else
15337730b9a4SJim Ingham         {
15347730b9a4SJim Ingham             if (log)
15357730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFunctionName() => error: process is running");
1536c9858e4dSGreg Clayton 
1537c9858e4dSGreg Clayton         }
15387fdf9ef1SGreg Clayton     }
1539316d498bSGreg Clayton     return name;
1540316d498bSGreg Clayton }
1541316d498bSGreg Clayton 
1542