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 
10*dbb0abbfSEugene Zelenko // C Includes
11*dbb0abbfSEugene Zelenko // C++ Includes
1230fdc8d8SChris Lattner #include <algorithm>
13*dbb0abbfSEugene Zelenko #include <string>
14*dbb0abbfSEugene Zelenko 
15*dbb0abbfSEugene Zelenko // Other libraries and framework includes
16*dbb0abbfSEugene Zelenko // Project includes
17*dbb0abbfSEugene Zelenko #include "lldb/API/SBFrame.h"
1830fdc8d8SChris Lattner 
1930fdc8d8SChris Lattner #include "lldb/lldb-types.h"
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner #include "lldb/Core/Address.h"
2230fdc8d8SChris Lattner #include "lldb/Core/ConstString.h"
23ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
2430fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2530fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2630fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h"
2730fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h"
284dbb271fSSean Callanan #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h"
29151c032cSJim Ingham #include "lldb/Expression/UserExpression.h"
301ba7c4d0SGreg Clayton #include "lldb/Host/Host.h"
3130fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
321f746071SGreg Clayton #include "lldb/Symbol/Function.h"
331f746071SGreg Clayton #include "lldb/Symbol/Symbol.h"
3430fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
3530fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h"
3630fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
3730fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
3830fdc8d8SChris Lattner #include "lldb/Target/Target.h"
3930fdc8d8SChris Lattner #include "lldb/Target/Process.h"
4030fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
41b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h"
42b9556accSGreg Clayton #include "lldb/Target/StackID.h"
4330fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
4430fdc8d8SChris Lattner 
454c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
464c5de699SEli Friedman #include "lldb/API/SBValue.h"
474c5de699SEli Friedman #include "lldb/API/SBAddress.h"
4835e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h"
49dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
504c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h"
514c5de699SEli Friedman #include "lldb/API/SBThread.h"
5251f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h"
5330fdc8d8SChris Lattner 
5430fdc8d8SChris Lattner using namespace lldb;
5530fdc8d8SChris Lattner using namespace lldb_private;
5630fdc8d8SChris Lattner 
5730fdc8d8SChris Lattner SBFrame::SBFrame () :
587fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef())
5930fdc8d8SChris Lattner {
6030fdc8d8SChris Lattner }
6130fdc8d8SChris Lattner 
62b57e4a1bSJason Molenda SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) :
637fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef (lldb_object_sp))
6430fdc8d8SChris Lattner {
655160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
66ceb6b139SCaroline Tice 
67ceb6b139SCaroline Tice     if (log)
68ceb6b139SCaroline Tice     {
69ceb6b139SCaroline Tice         SBStream sstr;
70ceb6b139SCaroline Tice         GetDescription (sstr);
714838131bSGreg Clayton         log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s",
72324a1036SSaleem Abdulrasool                      static_cast<void*>(lldb_object_sp.get()),
73324a1036SSaleem Abdulrasool                      static_cast<void*>(lldb_object_sp.get()), sstr.GetData());
74ceb6b139SCaroline Tice     }
7530fdc8d8SChris Lattner }
7630fdc8d8SChris Lattner 
77efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) :
787fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp))
79efabb123SGreg Clayton {
80efabb123SGreg Clayton }
81efabb123SGreg Clayton 
82*dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default;
83*dbb0abbfSEugene Zelenko 
84efabb123SGreg Clayton const SBFrame &
85efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs)
86efabb123SGreg Clayton {
87efabb123SGreg Clayton     if (this != &rhs)
887fdf9ef1SGreg Clayton         *m_opaque_sp = *rhs.m_opaque_sp;
89efabb123SGreg Clayton     return *this;
90efabb123SGreg Clayton }
91efabb123SGreg Clayton 
92b57e4a1bSJason Molenda StackFrameSP
93b9556accSGreg Clayton SBFrame::GetFrameSP() const
94b9556accSGreg Clayton {
95*dbb0abbfSEugene Zelenko     return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP());
96b9556accSGreg Clayton }
9730fdc8d8SChris Lattner 
9830fdc8d8SChris Lattner void
99b57e4a1bSJason Molenda SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp)
10030fdc8d8SChris Lattner {
1017fdf9ef1SGreg Clayton     return m_opaque_sp->SetFrameSP(lldb_object_sp);
102b9556accSGreg Clayton }
10330fdc8d8SChris Lattner 
10430fdc8d8SChris Lattner bool
10530fdc8d8SChris Lattner SBFrame::IsValid() const
10630fdc8d8SChris Lattner {
107*dbb0abbfSEugene Zelenko     return GetFrameSP().get() != nullptr;
10830fdc8d8SChris Lattner }
10930fdc8d8SChris Lattner 
11030fdc8d8SChris Lattner SBSymbolContext
11130fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const
11230fdc8d8SChris Lattner {
1135160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11430fdc8d8SChris Lattner     SBSymbolContext sb_sym_ctx;
1154fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1164fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1174fc6cb9cSJim Ingham 
118*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
119d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1207730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
1217730b9a4SJim Ingham     if (target && process)
122af67cecdSGreg Clayton     {
1237fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1247730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
1257730b9a4SJim Ingham         {
1267730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
1277730b9a4SJim Ingham             if (frame)
1287fdf9ef1SGreg Clayton             {
129d9e416c0SGreg Clayton                 sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope));
130af67cecdSGreg Clayton             }
131c9858e4dSGreg Clayton             else
132c9858e4dSGreg Clayton             {
133c9858e4dSGreg Clayton                 if (log)
1347730b9a4SJim Ingham                     log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
1357730b9a4SJim Ingham             }
1367730b9a4SJim Ingham         }
1377730b9a4SJim Ingham         else
1387730b9a4SJim Ingham         {
1397730b9a4SJim Ingham             if (log)
1407730b9a4SJim Ingham                 log->Printf ("SBFrame::GetSymbolContext () => error: process is running");
141c9858e4dSGreg Clayton         }
1427fdf9ef1SGreg Clayton     }
143ceb6b139SCaroline Tice 
144ceb6b139SCaroline Tice     if (log)
1454838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)",
146324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), resolve_scope,
147324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_sym_ctx.get()));
148ceb6b139SCaroline Tice 
14930fdc8d8SChris Lattner     return sb_sym_ctx;
15030fdc8d8SChris Lattner }
15130fdc8d8SChris Lattner 
15230fdc8d8SChris Lattner SBModule
15330fdc8d8SChris Lattner SBFrame::GetModule () const
15430fdc8d8SChris Lattner {
1555160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
15672eff18aSGreg Clayton     SBModule sb_module;
157acdbe816SGreg Clayton     ModuleSP module_sp;
1584fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1594fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1604fc6cb9cSJim Ingham 
161*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
162d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1637730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
1647730b9a4SJim Ingham     if (target && process)
165af67cecdSGreg Clayton     {
1667fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1677730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
1687730b9a4SJim Ingham         {
1697730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
1707730b9a4SJim Ingham             if (frame)
1717fdf9ef1SGreg Clayton             {
172d9e416c0SGreg Clayton                 module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp;
173acdbe816SGreg Clayton                 sb_module.SetSP (module_sp);
174af67cecdSGreg Clayton             }
175c9858e4dSGreg Clayton             else
176c9858e4dSGreg Clayton             {
177c9858e4dSGreg Clayton                 if (log)
1787730b9a4SJim Ingham                     log->Printf ("SBFrame::GetModule () => error: could not reconstruct frame object for this SBFrame.");
1797730b9a4SJim Ingham             }
1807730b9a4SJim Ingham         }
1817730b9a4SJim Ingham         else
1827730b9a4SJim Ingham         {
1837730b9a4SJim Ingham             if (log)
1847730b9a4SJim Ingham                 log->Printf ("SBFrame::GetModule () => error: process is running");
185c9858e4dSGreg Clayton         }
1867fdf9ef1SGreg Clayton     }
18772eff18aSGreg Clayton 
1884838131bSGreg Clayton     if (log)
1894838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
190324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
191324a1036SSaleem Abdulrasool                      static_cast<void*>(module_sp.get()));
1924838131bSGreg Clayton 
19330fdc8d8SChris Lattner     return sb_module;
19430fdc8d8SChris Lattner }
19530fdc8d8SChris Lattner 
19630fdc8d8SChris Lattner SBCompileUnit
19730fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
19830fdc8d8SChris Lattner {
1995160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
20072eff18aSGreg Clayton     SBCompileUnit sb_comp_unit;
2014fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2024fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2034fc6cb9cSJim Ingham 
204*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
205d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
2067730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
2077730b9a4SJim Ingham     if (target && process)
208af67cecdSGreg Clayton     {
2097fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2107730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
2117730b9a4SJim Ingham         {
2127730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
2137730b9a4SJim Ingham             if (frame)
2147fdf9ef1SGreg Clayton             {
215d9e416c0SGreg Clayton                 sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
216af67cecdSGreg Clayton             }
217c9858e4dSGreg Clayton             else
218c9858e4dSGreg Clayton             {
219ceb6b139SCaroline Tice                 if (log)
2207730b9a4SJim Ingham                     log->Printf ("SBFrame::GetCompileUnit () => error: could not reconstruct frame object for this SBFrame.");
2217730b9a4SJim Ingham             }
2227730b9a4SJim Ingham         }
2237730b9a4SJim Ingham         else
2247730b9a4SJim Ingham         {
2257730b9a4SJim Ingham             if (log)
2267730b9a4SJim Ingham                 log->Printf ("SBFrame::GetCompileUnit () => error: process is running");
227c9858e4dSGreg Clayton         }
228c9858e4dSGreg Clayton     }
229c9858e4dSGreg Clayton     if (log)
230c9858e4dSGreg Clayton         log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
231324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
232324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_comp_unit.get()));
233ceb6b139SCaroline Tice 
23430fdc8d8SChris Lattner     return sb_comp_unit;
23530fdc8d8SChris Lattner }
23630fdc8d8SChris Lattner 
23730fdc8d8SChris Lattner SBFunction
23830fdc8d8SChris Lattner SBFrame::GetFunction () const
23930fdc8d8SChris Lattner {
2405160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
24172eff18aSGreg Clayton     SBFunction sb_function;
2424fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2434fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2444fc6cb9cSJim Ingham 
245*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
246d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
2477730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
2487730b9a4SJim Ingham     if (target && process)
249af67cecdSGreg Clayton     {
2507fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2517730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
2527730b9a4SJim Ingham         {
2537730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
2547730b9a4SJim Ingham             if (frame)
2557fdf9ef1SGreg Clayton             {
256d9e416c0SGreg Clayton                 sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function);
257af67cecdSGreg Clayton             }
258c9858e4dSGreg Clayton             else
259c9858e4dSGreg Clayton             {
260c9858e4dSGreg Clayton                 if (log)
2617730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFunction () => error: could not reconstruct frame object for this SBFrame.");
2627730b9a4SJim Ingham             }
2637730b9a4SJim Ingham         }
2647730b9a4SJim Ingham         else
2657730b9a4SJim Ingham         {
2667730b9a4SJim Ingham             if (log)
2677730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFunction () => error: process is running");
2687fdf9ef1SGreg Clayton         }
269c9858e4dSGreg Clayton     }
2704838131bSGreg Clayton     if (log)
2714838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
272324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
273324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_function.get()));
2744838131bSGreg Clayton 
27530fdc8d8SChris Lattner     return sb_function;
27630fdc8d8SChris Lattner }
27730fdc8d8SChris Lattner 
2783b06557eSGreg Clayton SBSymbol
2793b06557eSGreg Clayton SBFrame::GetSymbol () const
2803b06557eSGreg Clayton {
2815160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
28272eff18aSGreg Clayton     SBSymbol sb_symbol;
2834fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2844fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2854fc6cb9cSJim Ingham 
286*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
287d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
2887730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
2897730b9a4SJim Ingham     if (target && process)
290af67cecdSGreg Clayton     {
2917fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2927730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
2937730b9a4SJim Ingham         {
2947730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
2957730b9a4SJim Ingham             if (frame)
2967fdf9ef1SGreg Clayton             {
297d9e416c0SGreg Clayton                 sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol);
298af67cecdSGreg Clayton             }
299c9858e4dSGreg Clayton             else
300c9858e4dSGreg Clayton             {
301c9858e4dSGreg Clayton                 if (log)
3027730b9a4SJim Ingham                     log->Printf ("SBFrame::GetSymbol () => error: could not reconstruct frame object for this SBFrame.");
3037730b9a4SJim Ingham             }
3047730b9a4SJim Ingham         }
3057730b9a4SJim Ingham         else
3067730b9a4SJim Ingham         {
3077730b9a4SJim Ingham             if (log)
3087730b9a4SJim Ingham                 log->Printf ("SBFrame::GetSymbol () => error: process is running");
3097fdf9ef1SGreg Clayton         }
310c9858e4dSGreg Clayton     }
3114838131bSGreg Clayton     if (log)
3124838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
313324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
314324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_symbol.get()));
3153b06557eSGreg Clayton     return sb_symbol;
3163b06557eSGreg Clayton }
3173b06557eSGreg Clayton 
31830fdc8d8SChris Lattner SBBlock
31930fdc8d8SChris Lattner SBFrame::GetBlock () const
32030fdc8d8SChris Lattner {
3215160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
32272eff18aSGreg Clayton     SBBlock sb_block;
3234fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3244fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3254fc6cb9cSJim Ingham 
326*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
327d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
3287730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
3297730b9a4SJim Ingham     if (target && process)
330af67cecdSGreg Clayton     {
3317fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3327730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
3337730b9a4SJim Ingham         {
3347730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
3357730b9a4SJim Ingham             if (frame)
3367fdf9ef1SGreg Clayton             {
337d9e416c0SGreg Clayton                 sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block);
338af67cecdSGreg Clayton             }
339c9858e4dSGreg Clayton             else
340c9858e4dSGreg Clayton             {
341c9858e4dSGreg Clayton                 if (log)
3427730b9a4SJim Ingham                     log->Printf ("SBFrame::GetBlock () => error: could not reconstruct frame object for this SBFrame.");
3437730b9a4SJim Ingham             }
3447730b9a4SJim Ingham         }
3457730b9a4SJim Ingham         else
3467730b9a4SJim Ingham         {
3477730b9a4SJim Ingham             if (log)
348324a1036SSaleem Abdulrasool                 log->Printf ("SBFrame(%p)::GetBlock () => error: process is running",
349324a1036SSaleem Abdulrasool                              static_cast<void*>(frame));
3507fdf9ef1SGreg Clayton         }
351c9858e4dSGreg Clayton     }
3524838131bSGreg Clayton     if (log)
3534838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
354324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
355324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_block.GetPtr()));
35630fdc8d8SChris Lattner     return sb_block;
35730fdc8d8SChris Lattner }
35830fdc8d8SChris Lattner 
35995897c6aSGreg Clayton SBBlock
36095897c6aSGreg Clayton SBFrame::GetFrameBlock () const
36195897c6aSGreg Clayton {
36272eff18aSGreg Clayton     SBBlock sb_block;
3634fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3644fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3654fc6cb9cSJim Ingham 
366*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
367d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
3685160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3697730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
3707730b9a4SJim Ingham     if (target && process)
371af67cecdSGreg Clayton     {
3727fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3737730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
3747730b9a4SJim Ingham         {
3757730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
3767730b9a4SJim Ingham             if (frame)
3777fdf9ef1SGreg Clayton             {
378d9e416c0SGreg Clayton                 sb_block.SetPtr(frame->GetFrameBlock ());
379af67cecdSGreg Clayton             }
380c9858e4dSGreg Clayton             else
381c9858e4dSGreg Clayton             {
382c9858e4dSGreg Clayton                 if (log)
3837730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFrameBlock () => error: could not reconstruct frame object for this SBFrame.");
3847730b9a4SJim Ingham             }
3857730b9a4SJim Ingham         }
3867730b9a4SJim Ingham         else
3877730b9a4SJim Ingham         {
3887730b9a4SJim Ingham             if (log)
3897730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFrameBlock () => error: process is running");
3907fdf9ef1SGreg Clayton         }
391c9858e4dSGreg Clayton     }
3924838131bSGreg Clayton     if (log)
3934838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
394324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
395324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_block.GetPtr()));
39695897c6aSGreg Clayton     return sb_block;
39795897c6aSGreg Clayton }
39895897c6aSGreg Clayton 
39930fdc8d8SChris Lattner SBLineEntry
40030fdc8d8SChris Lattner SBFrame::GetLineEntry () const
40130fdc8d8SChris Lattner {
4025160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
40372eff18aSGreg Clayton     SBLineEntry sb_line_entry;
4044fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4054fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4064fc6cb9cSJim Ingham 
407*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
408d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
4097730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
4107730b9a4SJim Ingham     if (target && process)
411af67cecdSGreg Clayton     {
4127fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4137730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
4147730b9a4SJim Ingham         {
4157730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
4167730b9a4SJim Ingham             if (frame)
4177fdf9ef1SGreg Clayton             {
418d9e416c0SGreg Clayton                 sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry);
419af67cecdSGreg Clayton             }
420c9858e4dSGreg Clayton             else
421c9858e4dSGreg Clayton             {
422c9858e4dSGreg Clayton                 if (log)
4237730b9a4SJim Ingham                     log->Printf ("SBFrame::GetLineEntry () => error: could not reconstruct frame object for this SBFrame.");
4247730b9a4SJim Ingham             }
4257730b9a4SJim Ingham         }
4267730b9a4SJim Ingham         else
4277730b9a4SJim Ingham         {
4287730b9a4SJim Ingham             if (log)
4297730b9a4SJim Ingham                 log->Printf ("SBFrame::GetLineEntry () => error: process is running");
4307fdf9ef1SGreg Clayton         }
431c9858e4dSGreg Clayton     }
4324838131bSGreg Clayton     if (log)
4334838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
434324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
435324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_line_entry.get()));
43630fdc8d8SChris Lattner     return sb_line_entry;
43730fdc8d8SChris Lattner }
43830fdc8d8SChris Lattner 
43930fdc8d8SChris Lattner uint32_t
44030fdc8d8SChris Lattner SBFrame::GetFrameID () const
44130fdc8d8SChris Lattner {
442b9556accSGreg Clayton     uint32_t frame_idx = UINT32_MAX;
443b9556accSGreg Clayton 
4447fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
445b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
4467fdf9ef1SGreg Clayton     if (frame)
447d9e416c0SGreg Clayton         frame_idx = frame->GetFrameIndex ();
4484838131bSGreg Clayton 
4495160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4504838131bSGreg Clayton     if (log)
4514838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameID () => %u",
452324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), frame_idx);
4534838131bSGreg Clayton     return frame_idx;
45430fdc8d8SChris Lattner }
45530fdc8d8SChris Lattner 
456424a5dbcSGreg Clayton lldb::addr_t
457424a5dbcSGreg Clayton SBFrame::GetCFA () const
458424a5dbcSGreg Clayton {
459424a5dbcSGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
460424a5dbcSGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
461424a5dbcSGreg Clayton     if (frame)
462424a5dbcSGreg Clayton         return frame->GetStackID().GetCallFrameAddress();
463424a5dbcSGreg Clayton     return LLDB_INVALID_ADDRESS;
464424a5dbcSGreg Clayton }
465424a5dbcSGreg Clayton 
46669b582faSGreg Clayton addr_t
46730fdc8d8SChris Lattner SBFrame::GetPC () const
46830fdc8d8SChris Lattner {
4695160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
47069b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
4714fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4724fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4734fc6cb9cSJim Ingham 
474*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
475d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
4767730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
4777730b9a4SJim Ingham     if (target && process)
478af67cecdSGreg Clayton     {
4797fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4807730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
4817730b9a4SJim Ingham         {
4827730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
4837730b9a4SJim Ingham             if (frame)
4847fdf9ef1SGreg Clayton             {
48525b9f7ebSTamas Berghammer                 addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target, eAddressClassCode);
486af67cecdSGreg Clayton             }
487c9858e4dSGreg Clayton             else
488c9858e4dSGreg Clayton             {
489c9858e4dSGreg Clayton                 if (log)
4907730b9a4SJim Ingham                     log->Printf ("SBFrame::GetPC () => error: could not reconstruct frame object for this SBFrame.");
4917730b9a4SJim Ingham             }
4927730b9a4SJim Ingham         }
4937730b9a4SJim Ingham         else
4947730b9a4SJim Ingham         {
4957730b9a4SJim Ingham             if (log)
4967730b9a4SJim Ingham                 log->Printf ("SBFrame::GetPC () => error: process is running");
497c9858e4dSGreg Clayton         }
4987fdf9ef1SGreg Clayton     }
499ceb6b139SCaroline Tice 
500ceb6b139SCaroline Tice     if (log)
501324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetPC () => 0x%" PRIx64,
502324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), addr);
503ceb6b139SCaroline Tice 
504ceb6b139SCaroline Tice     return addr;
50530fdc8d8SChris Lattner }
50630fdc8d8SChris Lattner 
50730fdc8d8SChris Lattner bool
50869b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc)
50930fdc8d8SChris Lattner {
5105160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
511ceb6b139SCaroline Tice     bool ret_val = false;
5124fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5134fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5144fc6cb9cSJim Ingham 
515*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
516d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
5177730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
5187730b9a4SJim Ingham     if (target && process)
519af67cecdSGreg Clayton     {
5207fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5217730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5227730b9a4SJim Ingham         {
5237730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5247730b9a4SJim Ingham             if (frame)
5257fdf9ef1SGreg Clayton             {
526d9e416c0SGreg Clayton                 ret_val = frame->GetRegisterContext()->SetPC (new_pc);
527af67cecdSGreg Clayton             }
528c9858e4dSGreg Clayton             else
529c9858e4dSGreg Clayton             {
530c9858e4dSGreg Clayton                 if (log)
5317730b9a4SJim Ingham                     log->Printf ("SBFrame::SetPC () => error: could not reconstruct frame object for this SBFrame.");
5327730b9a4SJim Ingham             }
5337730b9a4SJim Ingham         }
5347730b9a4SJim Ingham         else
5357730b9a4SJim Ingham         {
5367730b9a4SJim Ingham             if (log)
5377730b9a4SJim Ingham                 log->Printf ("SBFrame::SetPC () => error: process is running");
538c9858e4dSGreg Clayton         }
5397fdf9ef1SGreg Clayton     }
540ceb6b139SCaroline Tice 
541ceb6b139SCaroline Tice     if (log)
542d01b2953SDaniel Malea         log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i",
543324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), new_pc, ret_val);
544ceb6b139SCaroline Tice 
545ceb6b139SCaroline Tice     return ret_val;
54630fdc8d8SChris Lattner }
54730fdc8d8SChris Lattner 
54869b582faSGreg Clayton addr_t
54930fdc8d8SChris Lattner SBFrame::GetSP () const
55030fdc8d8SChris Lattner {
5515160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5524838131bSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
5534fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5544fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5554fc6cb9cSJim Ingham 
556*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
557d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
5587730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
5597730b9a4SJim Ingham     if (target && process)
560af67cecdSGreg Clayton     {
5617fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5627730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5637730b9a4SJim Ingham         {
5647730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5657730b9a4SJim Ingham             if (frame)
5667fdf9ef1SGreg Clayton             {
567d9e416c0SGreg Clayton                 addr = frame->GetRegisterContext()->GetSP();
568af67cecdSGreg Clayton             }
569c9858e4dSGreg Clayton             else
570c9858e4dSGreg Clayton             {
571c9858e4dSGreg Clayton                 if (log)
5727730b9a4SJim Ingham                     log->Printf ("SBFrame::GetSP () => error: could not reconstruct frame object for this SBFrame.");
5737730b9a4SJim Ingham             }
5747730b9a4SJim Ingham         }
5757730b9a4SJim Ingham         else
5767730b9a4SJim Ingham         {
5777730b9a4SJim Ingham             if (log)
5787730b9a4SJim Ingham                 log->Printf ("SBFrame::GetSP () => error: process is running");
5797fdf9ef1SGreg Clayton         }
580c9858e4dSGreg Clayton     }
5814838131bSGreg Clayton     if (log)
582324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetSP () => 0x%" PRIx64,
583324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), addr);
5844838131bSGreg Clayton 
5854838131bSGreg Clayton     return addr;
58630fdc8d8SChris Lattner }
58730fdc8d8SChris Lattner 
58869b582faSGreg Clayton addr_t
58930fdc8d8SChris Lattner SBFrame::GetFP () const
59030fdc8d8SChris Lattner {
5915160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
59269b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
5934fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5944fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5954fc6cb9cSJim Ingham 
596*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
597d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
5987730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
5997730b9a4SJim Ingham     if (target && process)
600af67cecdSGreg Clayton     {
6017fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6027730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
6037730b9a4SJim Ingham         {
6047730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
6057730b9a4SJim Ingham             if (frame)
6067fdf9ef1SGreg Clayton             {
607d9e416c0SGreg Clayton                 addr = frame->GetRegisterContext()->GetFP();
608af67cecdSGreg Clayton             }
609c9858e4dSGreg Clayton             else
610c9858e4dSGreg Clayton             {
611c9858e4dSGreg Clayton                 if (log)
6127730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFP () => error: could not reconstruct frame object for this SBFrame.");
6137730b9a4SJim Ingham             }
6147730b9a4SJim Ingham         }
6157730b9a4SJim Ingham         else
6167730b9a4SJim Ingham         {
6177730b9a4SJim Ingham             if (log)
6187730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFP () => error: process is running");
619c9858e4dSGreg Clayton         }
6207fdf9ef1SGreg Clayton     }
621ceb6b139SCaroline Tice 
622ceb6b139SCaroline Tice     if (log)
623324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetFP () => 0x%" PRIx64,
624324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), addr);
625ceb6b139SCaroline Tice     return addr;
62630fdc8d8SChris Lattner }
62730fdc8d8SChris Lattner 
62830fdc8d8SChris Lattner SBAddress
62930fdc8d8SChris Lattner SBFrame::GetPCAddress () const
63030fdc8d8SChris Lattner {
6315160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
63230fdc8d8SChris Lattner     SBAddress sb_addr;
6334fc6cb9cSJim Ingham     Mutex::Locker api_locker;
6344fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
6354fc6cb9cSJim Ingham 
636b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
637d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
6387730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
6397730b9a4SJim Ingham     if (target && process)
640af67cecdSGreg Clayton     {
6417fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6427730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
6437730b9a4SJim Ingham         {
6447730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
6457730b9a4SJim Ingham             if (frame)
6467fdf9ef1SGreg Clayton             {
647d9e416c0SGreg Clayton                 sb_addr.SetAddress (&frame->GetFrameCodeAddress());
648af67cecdSGreg Clayton             }
649c9858e4dSGreg Clayton             else
650c9858e4dSGreg Clayton             {
651c9858e4dSGreg Clayton                 if (log)
6527730b9a4SJim Ingham                     log->Printf ("SBFrame::GetPCAddress () => error: could not reconstruct frame object for this SBFrame.");
6537730b9a4SJim Ingham             }
6547730b9a4SJim Ingham         }
6557730b9a4SJim Ingham         else
6567730b9a4SJim Ingham         {
6577730b9a4SJim Ingham             if (log)
6587730b9a4SJim Ingham                 log->Printf ("SBFrame::GetPCAddress () => error: process is running");
6597fdf9ef1SGreg Clayton         }
660c9858e4dSGreg Clayton     }
6614838131bSGreg Clayton     if (log)
662324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)",
663324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
664324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_addr.get()));
66530fdc8d8SChris Lattner     return sb_addr;
66630fdc8d8SChris Lattner }
66730fdc8d8SChris Lattner 
66830fdc8d8SChris Lattner void
66930fdc8d8SChris Lattner SBFrame::Clear()
67030fdc8d8SChris Lattner {
671af2589eaSGreg Clayton     m_opaque_sp->Clear();
67230fdc8d8SChris Lattner }
67330fdc8d8SChris Lattner 
6747edbdfc9SGreg Clayton lldb::SBValue
6757edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path)
6767edbdfc9SGreg Clayton {
6777edbdfc9SGreg Clayton     SBValue sb_value;
6787fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
679b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
680d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
681d9e416c0SGreg Clayton     if (frame && target)
6827edbdfc9SGreg Clayton     {
683d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
6847edbdfc9SGreg Clayton         sb_value = GetValueForVariablePath (var_path, use_dynamic);
6857edbdfc9SGreg Clayton     }
6867edbdfc9SGreg Clayton     return sb_value;
6877edbdfc9SGreg Clayton }
6887edbdfc9SGreg Clayton 
6897edbdfc9SGreg Clayton lldb::SBValue
6907edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic)
6917edbdfc9SGreg Clayton {
6927edbdfc9SGreg Clayton     SBValue sb_value;
6934fc6cb9cSJim Ingham     Mutex::Locker api_locker;
6945160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
695*dbb0abbfSEugene Zelenko     if (var_path == nullptr || var_path[0] == '\0')
6967730b9a4SJim Ingham     {
6977730b9a4SJim Ingham         if (log)
6987730b9a4SJim Ingham             log->Printf ("SBFrame::GetValueForVariablePath called with empty variable path.");
6997730b9a4SJim Ingham         return sb_value;
7007730b9a4SJim Ingham     }
7017730b9a4SJim Ingham 
7024fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
7034fc6cb9cSJim Ingham 
704*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
705d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
7067730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
7077730b9a4SJim Ingham     if (target && process)
7087edbdfc9SGreg Clayton     {
7097fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
7107730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
7117730b9a4SJim Ingham         {
7127730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
7137730b9a4SJim Ingham             if (frame)
7147fdf9ef1SGreg Clayton             {
7157edbdfc9SGreg Clayton                 VariableSP var_sp;
7167edbdfc9SGreg Clayton                 Error error;
717d9e416c0SGreg Clayton                 ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path,
718e3e91517SEnrico Granata                                                                                   eNoDynamicValues,
719b57e4a1bSJason Molenda                                                                                   StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
7207edbdfc9SGreg Clayton                                                                                   var_sp,
7217edbdfc9SGreg Clayton                                                                                   error));
722e3e91517SEnrico Granata                 sb_value.SetSP(value_sp, use_dynamic);
7237edbdfc9SGreg Clayton             }
724c9858e4dSGreg Clayton             else
725c9858e4dSGreg Clayton             {
726c9858e4dSGreg Clayton                 if (log)
7277730b9a4SJim Ingham                     log->Printf ("SBFrame::GetValueForVariablePath () => error: could not reconstruct frame object for this SBFrame.");
7287730b9a4SJim Ingham             }
7297730b9a4SJim Ingham         }
7307730b9a4SJim Ingham         else
7317730b9a4SJim Ingham         {
7327730b9a4SJim Ingham             if (log)
7337730b9a4SJim Ingham                 log->Printf ("SBFrame::GetValueForVariablePath () => error: process is running");
734c9858e4dSGreg Clayton         }
7357fdf9ef1SGreg Clayton     }
7367edbdfc9SGreg Clayton     return sb_value;
7377edbdfc9SGreg Clayton }
7387edbdfc9SGreg Clayton 
73930fdc8d8SChris Lattner SBValue
74069b582faSGreg Clayton SBFrame::FindVariable (const char *name)
74130fdc8d8SChris Lattner {
742316d498bSGreg Clayton     SBValue value;
7437fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
744b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
745d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
746d9e416c0SGreg Clayton     if (frame && target)
747316d498bSGreg Clayton     {
748d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
749316d498bSGreg Clayton         value = FindVariable (name, use_dynamic);
750316d498bSGreg Clayton     }
751316d498bSGreg Clayton     return value;
75278a685aaSJim Ingham }
75378a685aaSJim Ingham 
75478a685aaSJim Ingham SBValue
7552837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
75678a685aaSJim Ingham {
7575160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
75869b582faSGreg Clayton     VariableSP var_sp;
75958b59f95SJim Ingham     SBValue sb_value;
7607730b9a4SJim Ingham 
761*dbb0abbfSEugene Zelenko     if (name == nullptr || name[0] == '\0')
7627730b9a4SJim Ingham     {
7637730b9a4SJim Ingham         if (log)
7647730b9a4SJim Ingham             log->Printf ("SBFrame::FindVariable called with empty name");
7657730b9a4SJim Ingham         return sb_value;
7667730b9a4SJim Ingham     }
7677730b9a4SJim Ingham 
76881e871edSGreg Clayton     ValueObjectSP value_sp;
7694fc6cb9cSJim Ingham     Mutex::Locker api_locker;
7704fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
7714fc6cb9cSJim Ingham 
772*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
773d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
7747730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
7757730b9a4SJim Ingham     if (target && process)
77630fdc8d8SChris Lattner     {
7777fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
7787730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
7797730b9a4SJim Ingham         {
7807730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
7817730b9a4SJim Ingham             if (frame)
7827fdf9ef1SGreg Clayton             {
78369b582faSGreg Clayton                 VariableList variable_list;
784d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
78530fdc8d8SChris Lattner 
78672eff18aSGreg Clayton                 if (sc.block)
78730fdc8d8SChris Lattner                 {
78872eff18aSGreg Clayton                     const bool can_create = true;
78972eff18aSGreg Clayton                     const bool get_parent_variables = true;
79072eff18aSGreg Clayton                     const bool stop_if_block_is_inlined_function = true;
79172eff18aSGreg Clayton 
79272eff18aSGreg Clayton                     if (sc.block->AppendVariables (can_create,
79372eff18aSGreg Clayton                                                    get_parent_variables,
79472eff18aSGreg Clayton                                                    stop_if_block_is_inlined_function,
79572eff18aSGreg Clayton                                                    &variable_list))
79672eff18aSGreg Clayton                     {
79769b582faSGreg Clayton                         var_sp = variable_list.FindVariable (ConstString(name));
79830fdc8d8SChris Lattner                     }
79972eff18aSGreg Clayton                 }
80030fdc8d8SChris Lattner 
8014838131bSGreg Clayton                 if (var_sp)
80281e871edSGreg Clayton                 {
803e3e91517SEnrico Granata                     value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues);
804e3e91517SEnrico Granata                     sb_value.SetSP(value_sp, use_dynamic);
80581e871edSGreg Clayton                 }
8067fdf9ef1SGreg Clayton             }
807c9858e4dSGreg Clayton             else
808c9858e4dSGreg Clayton             {
809c9858e4dSGreg Clayton                 if (log)
8107730b9a4SJim Ingham                     log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame.");
8117730b9a4SJim Ingham             }
8127730b9a4SJim Ingham         }
8137730b9a4SJim Ingham         else
8147730b9a4SJim Ingham         {
8157730b9a4SJim Ingham             if (log)
8167730b9a4SJim Ingham                 log->Printf ("SBFrame::FindVariable () => error: process is running");
817c9858e4dSGreg Clayton         }
818316d498bSGreg Clayton     }
819316d498bSGreg Clayton 
8204838131bSGreg Clayton     if (log)
82169b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
822324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), name,
823324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
8244838131bSGreg Clayton 
825dde9cff3SCaroline Tice     return sb_value;
826dde9cff3SCaroline Tice }
827dde9cff3SCaroline Tice 
82830fdc8d8SChris Lattner SBValue
82969b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type)
83030fdc8d8SChris Lattner {
831316d498bSGreg Clayton     SBValue value;
8327fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
833b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
834d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
835d9e416c0SGreg Clayton     if (frame && target)
836316d498bSGreg Clayton     {
837d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
838316d498bSGreg Clayton         value = FindValue (name, value_type, use_dynamic);
839316d498bSGreg Clayton     }
840316d498bSGreg Clayton     return value;
84178a685aaSJim Ingham }
84278a685aaSJim Ingham 
84378a685aaSJim Ingham SBValue
8442837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
84578a685aaSJim Ingham {
8465160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
84769b582faSGreg Clayton     SBValue sb_value;
8487730b9a4SJim Ingham 
849*dbb0abbfSEugene Zelenko     if (name == nullptr || name[0] == '\0')
8507730b9a4SJim Ingham     {
8517730b9a4SJim Ingham         if (log)
8527730b9a4SJim Ingham             log->Printf ("SBFrame::FindValue called with empty name.");
8537730b9a4SJim Ingham         return sb_value;
8547730b9a4SJim Ingham     }
8557730b9a4SJim Ingham 
85681e871edSGreg Clayton     ValueObjectSP value_sp;
8574fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8584fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8594fc6cb9cSJim Ingham 
860*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
861d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
8627730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
8637730b9a4SJim Ingham     if (target && process)
86430fdc8d8SChris Lattner     {
8657fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8667730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
8677730b9a4SJim Ingham         {
8687730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
8697730b9a4SJim Ingham             if (frame)
8707fdf9ef1SGreg Clayton             {
8718a2a0dfbSEnrico Granata                 VariableList variable_list;
8728a2a0dfbSEnrico Granata 
87369b582faSGreg Clayton                 switch (value_type)
87430fdc8d8SChris Lattner                 {
87569b582faSGreg Clayton                 case eValueTypeVariableGlobal:      // global variable
87669b582faSGreg Clayton                 case eValueTypeVariableStatic:      // static variable
87769b582faSGreg Clayton                 case eValueTypeVariableArgument:    // function argument variables
87869b582faSGreg Clayton                 case eValueTypeVariableLocal:       // function local variables
87969b582faSGreg Clayton                     {
880d9e416c0SGreg Clayton                         SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
88172eff18aSGreg Clayton 
88272eff18aSGreg Clayton                         const bool can_create = true;
88372eff18aSGreg Clayton                         const bool get_parent_variables = true;
88472eff18aSGreg Clayton                         const bool stop_if_block_is_inlined_function = true;
88572eff18aSGreg Clayton 
8860efb51a0SChaoren Lin                         if (sc.block)
8870efb51a0SChaoren Lin                             sc.block->AppendVariables(can_create,
88872eff18aSGreg Clayton                                                       get_parent_variables,
88972eff18aSGreg Clayton                                                       stop_if_block_is_inlined_function,
8900efb51a0SChaoren Lin                                                       &variable_list);
8918a2a0dfbSEnrico Granata                         if (value_type == eValueTypeVariableGlobal)
8928a2a0dfbSEnrico Granata                         {
8938a2a0dfbSEnrico Granata                             const bool get_file_globals = true;
8948a2a0dfbSEnrico Granata                             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
8958a2a0dfbSEnrico Granata                             if (frame_vars)
8968a2a0dfbSEnrico Granata                                 frame_vars->AppendVariablesIfUnique(variable_list);
8978a2a0dfbSEnrico Granata                         }
89869b582faSGreg Clayton                         ConstString const_name(name);
89908a04327SEnrico Granata                         VariableSP variable_sp(variable_list.FindVariable(const_name, value_type));
90008a04327SEnrico Granata                         if (variable_sp)
901beae523aSJohnny Chen                         {
902e3e91517SEnrico Granata                             value_sp = frame->GetValueObjectForFrameVariable(variable_sp, eNoDynamicValues);
903e3e91517SEnrico Granata                             sb_value.SetSP(value_sp, use_dynamic);
90430fdc8d8SChris Lattner                         }
90530fdc8d8SChris Lattner                     }
90669b582faSGreg Clayton                     break;
90769b582faSGreg Clayton 
90869b582faSGreg Clayton                 case eValueTypeRegister:            // stack frame register value
90969b582faSGreg Clayton                     {
910d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
91169b582faSGreg Clayton                         if (reg_ctx)
91269b582faSGreg Clayton                         {
91369b582faSGreg Clayton                             const uint32_t num_regs = reg_ctx->GetRegisterCount();
91469b582faSGreg Clayton                             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
91569b582faSGreg Clayton                             {
91669b582faSGreg Clayton                                 const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
91769b582faSGreg Clayton                                 if (reg_info &&
91869b582faSGreg Clayton                                     ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
91969b582faSGreg Clayton                                      (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
92069b582faSGreg Clayton                                 {
921d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
92281e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
92381e871edSGreg Clayton                                     break;
92469b582faSGreg Clayton                                 }
92569b582faSGreg Clayton                             }
92669b582faSGreg Clayton                         }
92769b582faSGreg Clayton                     }
92869b582faSGreg Clayton                     break;
92969b582faSGreg Clayton 
93069b582faSGreg Clayton                 case eValueTypeRegisterSet:         // A collection of stack frame register values
93169b582faSGreg Clayton                     {
932d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
93369b582faSGreg Clayton                         if (reg_ctx)
93469b582faSGreg Clayton                         {
93569b582faSGreg Clayton                             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
93669b582faSGreg Clayton                             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
93769b582faSGreg Clayton                             {
93869b582faSGreg Clayton                                 const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
93969b582faSGreg Clayton                                 if (reg_set &&
94069b582faSGreg Clayton                                     ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
94169b582faSGreg Clayton                                      (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
94269b582faSGreg Clayton                                 {
943d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
94481e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
94581e871edSGreg Clayton                                     break;
94669b582faSGreg Clayton                                 }
94769b582faSGreg Clayton                             }
94869b582faSGreg Clayton                         }
94969b582faSGreg Clayton                     }
95069b582faSGreg Clayton                     break;
95169b582faSGreg Clayton 
95269b582faSGreg Clayton                 case eValueTypeConstResult:         // constant result variables
95369b582faSGreg Clayton                     {
95469b582faSGreg Clayton                         ConstString const_name(name);
9558f1f9a1bSSean Callanan                         ExpressionVariableSP expr_var_sp (target->GetPersistentVariable (const_name));
95669b582faSGreg Clayton                         if (expr_var_sp)
95781e871edSGreg Clayton                         {
95881e871edSGreg Clayton                             value_sp = expr_var_sp->GetValueObject();
959e3e91517SEnrico Granata                             sb_value.SetSP (value_sp, use_dynamic);
96081e871edSGreg Clayton                         }
96169b582faSGreg Clayton                     }
96269b582faSGreg Clayton                     break;
96369b582faSGreg Clayton 
96469b582faSGreg Clayton                 default:
96569b582faSGreg Clayton                     break;
96669b582faSGreg Clayton                 }
967beae523aSJohnny Chen             }
968c9858e4dSGreg Clayton             else
969c9858e4dSGreg Clayton             {
970c9858e4dSGreg Clayton                 if (log)
9717730b9a4SJim Ingham                     log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame.");
9727730b9a4SJim Ingham             }
9737730b9a4SJim Ingham         }
9747730b9a4SJim Ingham         else
9757730b9a4SJim Ingham         {
9767730b9a4SJim Ingham             if (log)
9777730b9a4SJim Ingham                 log->Printf ("SBFrame::FindValue () => error: process is running");
978c9858e4dSGreg Clayton         }
9797fdf9ef1SGreg Clayton     }
980dde9cff3SCaroline Tice 
9814838131bSGreg Clayton     if (log)
98269b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
983324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), name, value_type,
984324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
9854838131bSGreg Clayton 
986dde9cff3SCaroline Tice     return sb_value;
987dde9cff3SCaroline Tice }
988dde9cff3SCaroline Tice 
98930fdc8d8SChris Lattner bool
99035e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const
99135e2ab60SJohnny Chen {
992b57e4a1bSJason Molenda     lldb::StackFrameSP this_sp = GetFrameSP();
993b57e4a1bSJason Molenda     lldb::StackFrameSP that_sp = that.GetFrameSP();
99435e2ab60SJohnny Chen     return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
99535e2ab60SJohnny Chen }
99635e2ab60SJohnny Chen 
99735e2ab60SJohnny Chen bool
99830fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
99930fdc8d8SChris Lattner {
100035e2ab60SJohnny Chen     return IsEqual(rhs);
100130fdc8d8SChris Lattner }
100230fdc8d8SChris Lattner 
100330fdc8d8SChris Lattner bool
100430fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
100530fdc8d8SChris Lattner {
100635e2ab60SJohnny Chen     return !IsEqual(rhs);
1007481cef25SGreg Clayton }
100830fdc8d8SChris Lattner 
100930fdc8d8SChris Lattner SBThread
101030fdc8d8SChris Lattner SBFrame::GetThread () const
101130fdc8d8SChris Lattner {
10125160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1013ceb6b139SCaroline Tice 
10147fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1015d9e416c0SGreg Clayton     ThreadSP thread_sp (exe_ctx.GetThreadSP());
1016d9e416c0SGreg Clayton     SBThread sb_thread (thread_sp);
1017ceb6b139SCaroline Tice 
1018ceb6b139SCaroline Tice     if (log)
1019750cd175SCaroline Tice     {
1020750cd175SCaroline Tice         SBStream sstr;
1021750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
1022d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
1023324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetFramePtr()),
1024324a1036SSaleem Abdulrasool                      static_cast<void*>(thread_sp.get()), sstr.GetData());
1025750cd175SCaroline Tice     }
1026ceb6b139SCaroline Tice 
102730fdc8d8SChris Lattner     return sb_thread;
102830fdc8d8SChris Lattner }
102930fdc8d8SChris Lattner 
103030fdc8d8SChris Lattner const char *
103130fdc8d8SChris Lattner SBFrame::Disassemble () const
103230fdc8d8SChris Lattner {
10335160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1034*dbb0abbfSEugene Zelenko     const char *disassembly = nullptr;
10354fc6cb9cSJim Ingham     Mutex::Locker api_locker;
10364fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
10374fc6cb9cSJim Ingham 
1038*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
1039d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
10407730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
10417730b9a4SJim Ingham     if (target && process)
1042af67cecdSGreg Clayton     {
10437fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10447730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
10457730b9a4SJim Ingham         {
10467730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
10477730b9a4SJim Ingham             if (frame)
10487fdf9ef1SGreg Clayton             {
1049d9e416c0SGreg Clayton                 disassembly = frame->Disassemble();
1050af67cecdSGreg Clayton             }
1051c9858e4dSGreg Clayton             else
1052c9858e4dSGreg Clayton             {
1053c9858e4dSGreg Clayton                 if (log)
10547730b9a4SJim Ingham                     log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame.");
10557730b9a4SJim Ingham             }
10567730b9a4SJim Ingham         }
10577730b9a4SJim Ingham         else
10587730b9a4SJim Ingham         {
10597730b9a4SJim Ingham             if (log)
10607730b9a4SJim Ingham                 log->Printf ("SBFrame::Disassemble () => error: process is running");
10617fdf9ef1SGreg Clayton         }
1062c9858e4dSGreg Clayton     }
10634838131bSGreg Clayton 
10644838131bSGreg Clayton     if (log)
1065324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::Disassemble () => %s",
1066324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), disassembly);
10674838131bSGreg Clayton 
10684838131bSGreg Clayton     return disassembly;
106930fdc8d8SChris Lattner }
107030fdc8d8SChris Lattner 
107130fdc8d8SChris Lattner SBValueList
107230fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
107330fdc8d8SChris Lattner                        bool locals,
107430fdc8d8SChris Lattner                        bool statics,
107530fdc8d8SChris Lattner                        bool in_scope_only)
107630fdc8d8SChris Lattner {
1077316d498bSGreg Clayton     SBValueList value_list;
10787fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1079b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
1080d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1081d9e416c0SGreg Clayton     if (frame && target)
1082316d498bSGreg Clayton     {
1083d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
108451f96eebSZachary Turner         const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false;
108551f96eebSZachary Turner 
108651f96eebSZachary Turner         SBVariablesOptions options;
108751f96eebSZachary Turner         options.SetIncludeArguments(arguments);
108851f96eebSZachary Turner         options.SetIncludeLocals(locals);
108951f96eebSZachary Turner         options.SetIncludeStatics(statics);
109051f96eebSZachary Turner         options.SetInScopeOnly(in_scope_only);
109151f96eebSZachary Turner         options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
109251f96eebSZachary Turner         options.SetUseDynamic(use_dynamic);
109351f96eebSZachary Turner 
109451f96eebSZachary Turner         value_list = GetVariables (options);
1095316d498bSGreg Clayton     }
1096316d498bSGreg Clayton     return value_list;
109778a685aaSJim Ingham }
109878a685aaSJim Ingham 
1099560558ebSEnrico Granata lldb::SBValueList
1100560558ebSEnrico Granata SBFrame::GetVariables (bool arguments,
1101560558ebSEnrico Granata                        bool locals,
1102560558ebSEnrico Granata                        bool statics,
1103560558ebSEnrico Granata                        bool in_scope_only,
1104560558ebSEnrico Granata                        lldb::DynamicValueType  use_dynamic)
1105560558ebSEnrico Granata {
1106560558ebSEnrico Granata     ExecutionContext exe_ctx(m_opaque_sp.get());
1107560558ebSEnrico Granata     Target *target = exe_ctx.GetTargetPtr();
110851f96eebSZachary Turner     const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false;
110951f96eebSZachary Turner     SBVariablesOptions options;
111051f96eebSZachary Turner     options.SetIncludeArguments(arguments);
111151f96eebSZachary Turner     options.SetIncludeLocals(locals);
111251f96eebSZachary Turner     options.SetIncludeStatics(statics);
111351f96eebSZachary Turner     options.SetInScopeOnly(in_scope_only);
111451f96eebSZachary Turner     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
111551f96eebSZachary Turner     options.SetUseDynamic(use_dynamic);
111651f96eebSZachary Turner     return GetVariables(options);
1117560558ebSEnrico Granata }
1118560558ebSEnrico Granata 
111978a685aaSJim Ingham SBValueList
112051f96eebSZachary Turner SBFrame::GetVariables (const lldb::SBVariablesOptions& options)
112178a685aaSJim Ingham {
11225160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1123ceb6b139SCaroline Tice 
1124b9556accSGreg Clayton     SBValueList value_list;
11254fc6cb9cSJim Ingham     Mutex::Locker api_locker;
11264fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
11274fc6cb9cSJim Ingham 
1128*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
1129d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1130b9556accSGreg Clayton 
113151f96eebSZachary Turner     const bool statics = options.GetIncludeStatics();
113251f96eebSZachary Turner     const bool arguments = options.GetIncludeArguments();
113351f96eebSZachary Turner     const bool locals = options.GetIncludeLocals();
113451f96eebSZachary Turner     const bool in_scope_only = options.GetInScopeOnly();
113551f96eebSZachary Turner     const bool include_runtime_support_values = options.GetIncludeRuntimeSupportValues();
113651f96eebSZachary Turner     const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
113751f96eebSZachary Turner 
1138ceb6b139SCaroline Tice     if (log)
113951f96eebSZachary Turner         log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)",
114051f96eebSZachary Turner                      arguments, locals,
114151f96eebSZachary Turner                      statics, in_scope_only,
114251f96eebSZachary Turner                      include_runtime_support_values, use_dynamic);
1143ceb6b139SCaroline Tice 
11447730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
11457730b9a4SJim Ingham     if (target && process)
114630fdc8d8SChris Lattner     {
11477fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11487730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
11497fdf9ef1SGreg Clayton         {
11507730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
11517730b9a4SJim Ingham             if (frame)
11527730b9a4SJim Ingham             {
115330fdc8d8SChris Lattner                 size_t i;
1154*dbb0abbfSEugene Zelenko                 VariableList *variable_list = nullptr;
1155d9e416c0SGreg Clayton                 variable_list = frame->GetVariableList(true);
115630fdc8d8SChris Lattner                 if (variable_list)
115730fdc8d8SChris Lattner                 {
115830fdc8d8SChris Lattner                     const size_t num_variables = variable_list->GetSize();
115930fdc8d8SChris Lattner                     if (num_variables)
116030fdc8d8SChris Lattner                     {
116130fdc8d8SChris Lattner                         for (i = 0; i < num_variables; ++i)
116230fdc8d8SChris Lattner                         {
116330fdc8d8SChris Lattner                             VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
116430fdc8d8SChris Lattner                             if (variable_sp)
116530fdc8d8SChris Lattner                             {
116630fdc8d8SChris Lattner                                 bool add_variable = false;
116730fdc8d8SChris Lattner                                 switch (variable_sp->GetScope())
116830fdc8d8SChris Lattner                                 {
116930fdc8d8SChris Lattner                                 case eValueTypeVariableGlobal:
117030fdc8d8SChris Lattner                                 case eValueTypeVariableStatic:
117130fdc8d8SChris Lattner                                     add_variable = statics;
117230fdc8d8SChris Lattner                                     break;
117330fdc8d8SChris Lattner 
117430fdc8d8SChris Lattner                                 case eValueTypeVariableArgument:
117530fdc8d8SChris Lattner                                     add_variable = arguments;
117630fdc8d8SChris Lattner                                     break;
117730fdc8d8SChris Lattner 
117830fdc8d8SChris Lattner                                 case eValueTypeVariableLocal:
117930fdc8d8SChris Lattner                                     add_variable = locals;
118030fdc8d8SChris Lattner                                     break;
1181c982c768SGreg Clayton 
1182c982c768SGreg Clayton                                 default:
1183c982c768SGreg Clayton                                     break;
118430fdc8d8SChris Lattner                                 }
118530fdc8d8SChris Lattner                                 if (add_variable)
118630fdc8d8SChris Lattner                                 {
1187d9e416c0SGreg Clayton                                     if (in_scope_only && !variable_sp->IsInScope(frame))
118830fdc8d8SChris Lattner                                         continue;
118930fdc8d8SChris Lattner 
1190e3e91517SEnrico Granata                                     ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues));
1191560558ebSEnrico Granata 
1192*dbb0abbfSEugene Zelenko                                     if (!include_runtime_support_values &&
1193*dbb0abbfSEugene Zelenko                                         valobj_sp != nullptr &&
1194*dbb0abbfSEugene Zelenko                                         valobj_sp->IsRuntimeSupportValue())
1195560558ebSEnrico Granata                                         continue;
1196560558ebSEnrico Granata 
1197e3e91517SEnrico Granata                                     SBValue value_sb;
1198e3e91517SEnrico Granata                                     value_sb.SetSP(valobj_sp,use_dynamic);
1199e3e91517SEnrico Granata                                     value_list.Append(value_sb);
120030fdc8d8SChris Lattner                                 }
120130fdc8d8SChris Lattner                             }
120230fdc8d8SChris Lattner                         }
120330fdc8d8SChris Lattner                     }
120430fdc8d8SChris Lattner                 }
120530fdc8d8SChris Lattner             }
1206c9858e4dSGreg Clayton             else
1207c9858e4dSGreg Clayton             {
1208c9858e4dSGreg Clayton                 if (log)
12097730b9a4SJim Ingham                     log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
12107730b9a4SJim Ingham             }
12117730b9a4SJim Ingham         }
12127730b9a4SJim Ingham         else
12137730b9a4SJim Ingham         {
12147730b9a4SJim Ingham             if (log)
12157730b9a4SJim Ingham                 log->Printf ("SBFrame::GetVariables () => error: process is running");
1216c9858e4dSGreg Clayton         }
12177fdf9ef1SGreg Clayton     }
1218ceb6b139SCaroline Tice 
1219ceb6b139SCaroline Tice     if (log)
1220324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)",
1221324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1222324a1036SSaleem Abdulrasool                      static_cast<void*>(value_list.opaque_ptr()));
1223ceb6b139SCaroline Tice 
122430fdc8d8SChris Lattner     return value_list;
122530fdc8d8SChris Lattner }
122630fdc8d8SChris Lattner 
122769b582faSGreg Clayton SBValueList
122830fdc8d8SChris Lattner SBFrame::GetRegisters ()
122930fdc8d8SChris Lattner {
12305160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1231ceb6b139SCaroline Tice 
123230fdc8d8SChris Lattner     SBValueList value_list;
12334fc6cb9cSJim Ingham     Mutex::Locker api_locker;
12344fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
12354fc6cb9cSJim Ingham 
1236*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
1237d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
12387730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
12397730b9a4SJim Ingham     if (target && process)
124030fdc8d8SChris Lattner     {
12417fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
12427730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
12437730b9a4SJim Ingham         {
12447730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
12457730b9a4SJim Ingham             if (frame)
12467fdf9ef1SGreg Clayton             {
1247d9e416c0SGreg Clayton                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
124830fdc8d8SChris Lattner                 if (reg_ctx)
124930fdc8d8SChris Lattner                 {
125030fdc8d8SChris Lattner                     const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
125130fdc8d8SChris Lattner                     for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
125230fdc8d8SChris Lattner                     {
1253d9e416c0SGreg Clayton                         value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
125430fdc8d8SChris Lattner                     }
125530fdc8d8SChris Lattner                 }
125630fdc8d8SChris Lattner             }
1257c9858e4dSGreg Clayton             else
1258c9858e4dSGreg Clayton             {
1259c9858e4dSGreg Clayton                 if (log)
12607730b9a4SJim Ingham                     log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame.");
12617730b9a4SJim Ingham             }
12627730b9a4SJim Ingham         }
12637730b9a4SJim Ingham         else
12647730b9a4SJim Ingham         {
12657730b9a4SJim Ingham             if (log)
12667730b9a4SJim Ingham                 log->Printf ("SBFrame::GetRegisters () => error: process is running");
1267c9858e4dSGreg Clayton         }
12687fdf9ef1SGreg Clayton     }
1269ceb6b139SCaroline Tice 
1270ceb6b139SCaroline Tice     if (log)
1271324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)",
1272324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1273324a1036SSaleem Abdulrasool                      static_cast<void*>(value_list.opaque_ptr()));
1274ceb6b139SCaroline Tice 
127530fdc8d8SChris Lattner     return value_list;
127630fdc8d8SChris Lattner }
127730fdc8d8SChris Lattner 
1278ad9a53c5SJason Molenda SBValue
1279ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name)
1280ad9a53c5SJason Molenda {
1281ad9a53c5SJason Molenda     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1282ad9a53c5SJason Molenda 
1283ad9a53c5SJason Molenda     SBValue result;
1284ad9a53c5SJason Molenda     ValueObjectSP value_sp;
1285ad9a53c5SJason Molenda     Mutex::Locker api_locker;
1286ad9a53c5SJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1287ad9a53c5SJason Molenda 
1288*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
1289ad9a53c5SJason Molenda     Target *target = exe_ctx.GetTargetPtr();
1290ad9a53c5SJason Molenda     Process *process = exe_ctx.GetProcessPtr();
1291ad9a53c5SJason Molenda     if (target && process)
1292ad9a53c5SJason Molenda     {
1293ad9a53c5SJason Molenda         Process::StopLocker stop_locker;
1294ad9a53c5SJason Molenda         if (stop_locker.TryLock(&process->GetRunLock()))
1295ad9a53c5SJason Molenda         {
1296ad9a53c5SJason Molenda             frame = exe_ctx.GetFramePtr();
1297ad9a53c5SJason Molenda             if (frame)
1298ad9a53c5SJason Molenda             {
1299ad9a53c5SJason Molenda                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
1300ad9a53c5SJason Molenda                 if (reg_ctx)
1301ad9a53c5SJason Molenda                 {
1302ad9a53c5SJason Molenda                     const uint32_t num_regs = reg_ctx->GetRegisterCount();
1303ad9a53c5SJason Molenda                     for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
1304ad9a53c5SJason Molenda                     {
1305ad9a53c5SJason Molenda                         const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
1306ad9a53c5SJason Molenda                         if (reg_info &&
1307ad9a53c5SJason Molenda                             ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
1308ad9a53c5SJason Molenda                              (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
1309ad9a53c5SJason Molenda                         {
1310ad9a53c5SJason Molenda                             value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
1311ad9a53c5SJason Molenda                             result.SetSP (value_sp);
1312ad9a53c5SJason Molenda                             break;
1313ad9a53c5SJason Molenda                         }
1314ad9a53c5SJason Molenda                     }
1315ad9a53c5SJason Molenda                 }
1316ad9a53c5SJason Molenda             }
1317ad9a53c5SJason Molenda             else
1318ad9a53c5SJason Molenda             {
1319ad9a53c5SJason Molenda                 if (log)
13205d353842SJason Molenda                     log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame.");
1321ad9a53c5SJason Molenda             }
1322ad9a53c5SJason Molenda         }
1323ad9a53c5SJason Molenda         else
1324ad9a53c5SJason Molenda         {
1325ad9a53c5SJason Molenda             if (log)
13265d353842SJason Molenda                 log->Printf ("SBFrame::FindRegister () => error: process is running");
1327ad9a53c5SJason Molenda         }
1328ad9a53c5SJason Molenda     }
1329ad9a53c5SJason Molenda 
1330ad9a53c5SJason Molenda     if (log)
1331324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)",
1332324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1333324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
1334ad9a53c5SJason Molenda 
1335ad9a53c5SJason Molenda     return result;
1336ad9a53c5SJason Molenda }
1337ad9a53c5SJason Molenda 
1338dde9cff3SCaroline Tice bool
1339dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
1340dde9cff3SCaroline Tice {
13415160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1342da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1343da7bc7d0SGreg Clayton 
13444fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13454fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13464fc6cb9cSJim Ingham 
1347b57e4a1bSJason Molenda     StackFrame *frame;
1348d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
13497730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
13507730b9a4SJim Ingham     if (target && process)
1351dde9cff3SCaroline Tice     {
13527fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13537730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
13547730b9a4SJim Ingham         {
13557730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
13567730b9a4SJim Ingham             if (frame)
13577fdf9ef1SGreg Clayton             {
1358d9e416c0SGreg Clayton                 frame->DumpUsingSettingsFormat (&strm);
1359dde9cff3SCaroline Tice             }
1360c9858e4dSGreg Clayton             else
1361c9858e4dSGreg Clayton             {
1362c9858e4dSGreg Clayton                 if (log)
13637730b9a4SJim Ingham                     log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame.");
13647730b9a4SJim Ingham             }
13657730b9a4SJim Ingham         }
13667730b9a4SJim Ingham         else
13677730b9a4SJim Ingham         {
13687730b9a4SJim Ingham             if (log)
13697730b9a4SJim Ingham                 log->Printf ("SBFrame::GetDescription () => error: process is running");
1370c9858e4dSGreg Clayton         }
1371c9858e4dSGreg Clayton 
13727fdf9ef1SGreg Clayton     }
1373dde9cff3SCaroline Tice     else
1374da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1375dde9cff3SCaroline Tice 
1376dde9cff3SCaroline Tice     return true;
1377dde9cff3SCaroline Tice }
13781d3afba3SGreg Clayton 
137969b582faSGreg Clayton SBValue
13801d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
13811d3afba3SGreg Clayton {
1382316d498bSGreg Clayton     SBValue result;
13837fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1384b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
1385d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1386d9e416c0SGreg Clayton     if (frame && target)
1387316d498bSGreg Clayton     {
138835e1bda6SJim Ingham         SBExpressionOptions options;
138935e1bda6SJim Ingham         lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue();
1390cced1566SGreg Clayton         options.SetFetchDynamicValue (fetch_dynamic_value);
139135e1bda6SJim Ingham         options.SetUnwindOnError (true);
139235e1bda6SJim Ingham         return EvaluateExpression (expr, options);
1393316d498bSGreg Clayton     }
1394316d498bSGreg Clayton     return result;
139578a685aaSJim Ingham }
139678a685aaSJim Ingham 
139778a685aaSJim Ingham SBValue
13982837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
139978a685aaSJim Ingham {
140035e1bda6SJim Ingham     SBExpressionOptions options;
1401cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
140235e1bda6SJim Ingham     options.SetUnwindOnError (true);
140335e1bda6SJim Ingham     return EvaluateExpression (expr, options);
14047ba6e991SJim Ingham }
14057ba6e991SJim Ingham 
14067ba6e991SJim Ingham SBValue
14077ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error)
14087ba6e991SJim Ingham {
140935e1bda6SJim Ingham     SBExpressionOptions options;
1410cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
141135e1bda6SJim Ingham     options.SetUnwindOnError (unwind_on_error);
141235e1bda6SJim Ingham     return EvaluateExpression (expr, options);
141335e1bda6SJim Ingham }
141435e1bda6SJim Ingham 
141535e1bda6SJim Ingham lldb::SBValue
141635e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options)
141735e1bda6SJim Ingham {
14185160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14194838131bSGreg Clayton 
14205160ce5cSGreg Clayton     Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1421a162ebafSSean Callanan 
14228646d3c1SJim Ingham     ExpressionResults exe_results = eExpressionSetupError;
142369b582faSGreg Clayton     SBValue expr_result;
14247730b9a4SJim Ingham 
1425*dbb0abbfSEugene Zelenko     if (expr == nullptr || expr[0] == '\0')
14267730b9a4SJim Ingham     {
14277730b9a4SJim Ingham         if (log)
14287730b9a4SJim Ingham             log->Printf ("SBFrame::EvaluateExpression called with an empty expression");
14297730b9a4SJim Ingham         return expr_result;
14307730b9a4SJim Ingham     }
14317730b9a4SJim Ingham 
143281e871edSGreg Clayton     ValueObjectSP expr_value_sp;
14334838131bSGreg Clayton 
14344fc6cb9cSJim Ingham     Mutex::Locker api_locker;
14354fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
14364fc6cb9cSJim Ingham 
1437b9556accSGreg Clayton     if (log)
14387730b9a4SJim Ingham         log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
1439b9556accSGreg Clayton 
1440*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
14417730b9a4SJim Ingham     Target *target = exe_ctx.GetTargetPtr();
14427730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
14437730b9a4SJim Ingham 
14447730b9a4SJim Ingham     if (target && process)
14451d3afba3SGreg Clayton     {
14467fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
14477730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
14487730b9a4SJim Ingham         {
14497730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
14507730b9a4SJim Ingham             if (frame)
14517fdf9ef1SGreg Clayton             {
1452fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1453fb6621efSGreg Clayton                 {
14541ba7c4d0SGreg Clayton                     StreamString frame_description;
1455d9e416c0SGreg Clayton                     frame->DumpUsingSettingsFormat (&frame_description);
14561ba7c4d0SGreg Clayton                     Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
1457cced1566SGreg Clayton                                                          expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str());
1458fb6621efSGreg Clayton                 }
1459fb6621efSGreg Clayton 
1460d9e416c0SGreg Clayton                 exe_results = target->EvaluateExpression (expr,
1461d9e416c0SGreg Clayton                                                           frame,
1462d4439aa9SEnrico Granata                                                           expr_value_sp,
146335e1bda6SJim Ingham                                                           options.ref());
1464e3e91517SEnrico Granata                 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1465fb6621efSGreg Clayton 
1466fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1467*dbb0abbfSEugene Zelenko                     Host::SetCrashDescription(nullptr);
14681d3afba3SGreg Clayton             }
1469c9858e4dSGreg Clayton             else
1470c9858e4dSGreg Clayton             {
1471c9858e4dSGreg Clayton                 if (log)
14727730b9a4SJim Ingham                     log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame.");
14737730b9a4SJim Ingham             }
14747730b9a4SJim Ingham         }
14757730b9a4SJim Ingham         else
14767730b9a4SJim Ingham         {
14777730b9a4SJim Ingham             if (log)
14787730b9a4SJim Ingham                 log->Printf ("SBFrame::EvaluateExpression () => error: process is running");
1479c9858e4dSGreg Clayton         }
14807fdf9ef1SGreg Clayton     }
14814838131bSGreg Clayton 
1482cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1483a162ebafSSean Callanan     if (expr_log)
148478a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
1485324a1036SSaleem Abdulrasool                          expr_result.GetValue(), expr_result.GetSummary());
1486a162ebafSSean Callanan 
14874838131bSGreg Clayton     if (log)
1488d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1489324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), expr,
1490324a1036SSaleem Abdulrasool                      static_cast<void*>(expr_value_sp.get()), exe_results);
1491cf7e2dc0SJason Molenda #endif
14924838131bSGreg Clayton 
1493cfd1acedSGreg Clayton     return expr_result;
14941d3afba3SGreg Clayton }
1495316d498bSGreg Clayton 
1496316d498bSGreg Clayton bool
14976345fe3eSOleksiy Vyalov SBFrame::IsInlined()
1498316d498bSGreg Clayton {
149905f75e9fSOleksiy Vyalov     return static_cast<const SBFrame*>(this)->IsInlined();
150005f75e9fSOleksiy Vyalov }
150105f75e9fSOleksiy Vyalov 
150205f75e9fSOleksiy Vyalov bool
150305f75e9fSOleksiy Vyalov SBFrame::IsInlined() const
150405f75e9fSOleksiy Vyalov {
15055160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
15067fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1507*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
1508d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
15097730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
15107730b9a4SJim Ingham     if (target && process)
1511316d498bSGreg Clayton     {
15127fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
15137730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
15147730b9a4SJim Ingham         {
15157730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
15167730b9a4SJim Ingham             if (frame)
15177fdf9ef1SGreg Clayton             {
15187fdf9ef1SGreg Clayton 
1519d9e416c0SGreg Clayton                 Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1520316d498bSGreg Clayton                 if (block)
1521*dbb0abbfSEugene Zelenko                     return block->GetContainingInlinedBlock() != nullptr;
1522316d498bSGreg Clayton             }
1523c9858e4dSGreg Clayton             else
1524c9858e4dSGreg Clayton             {
1525c9858e4dSGreg Clayton                 if (log)
15267730b9a4SJim Ingham                     log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame.");
15277730b9a4SJim Ingham             }
15287730b9a4SJim Ingham         }
15297730b9a4SJim Ingham         else
15307730b9a4SJim Ingham         {
15317730b9a4SJim Ingham             if (log)
15327730b9a4SJim Ingham                 log->Printf ("SBFrame::IsInlined () => error: process is running");
1533c9858e4dSGreg Clayton         }
1534c9858e4dSGreg Clayton 
15357fdf9ef1SGreg Clayton     }
1536316d498bSGreg Clayton     return false;
1537316d498bSGreg Clayton }
1538316d498bSGreg Clayton 
1539316d498bSGreg Clayton const char *
15406345fe3eSOleksiy Vyalov SBFrame::GetFunctionName()
1541316d498bSGreg Clayton {
154205f75e9fSOleksiy Vyalov     return static_cast<const SBFrame*>(this)->GetFunctionName();
154305f75e9fSOleksiy Vyalov }
154405f75e9fSOleksiy Vyalov 
154505f75e9fSOleksiy Vyalov const char *
154605f75e9fSOleksiy Vyalov SBFrame::GetFunctionName() const
154705f75e9fSOleksiy Vyalov {
15485160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1549*dbb0abbfSEugene Zelenko     const char *name = nullptr;
15507fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1551*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
1552d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
15537730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
15547730b9a4SJim Ingham     if (target && process)
1555316d498bSGreg Clayton     {
15567fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
15577730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
15587730b9a4SJim Ingham         {
15597730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
15607730b9a4SJim Ingham             if (frame)
15617fdf9ef1SGreg Clayton             {
1562d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1563316d498bSGreg Clayton                 if (sc.block)
1564316d498bSGreg Clayton                 {
1565316d498bSGreg Clayton                     Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1566316d498bSGreg Clayton                     if (inlined_block)
1567316d498bSGreg Clayton                     {
1568316d498bSGreg Clayton                         const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1569ddaf6a72SGreg Clayton                         name = inlined_info->GetName(sc.function->GetLanguage()).AsCString();
1570316d498bSGreg Clayton                     }
1571316d498bSGreg Clayton                 }
1572316d498bSGreg Clayton 
1573*dbb0abbfSEugene Zelenko                 if (name == nullptr)
1574316d498bSGreg Clayton                 {
1575316d498bSGreg Clayton                     if (sc.function)
1576316d498bSGreg Clayton                         name = sc.function->GetName().GetCString();
1577316d498bSGreg Clayton                 }
1578316d498bSGreg Clayton 
1579*dbb0abbfSEugene Zelenko                 if (name == nullptr)
1580316d498bSGreg Clayton                 {
1581316d498bSGreg Clayton                     if (sc.symbol)
1582316d498bSGreg Clayton                         name = sc.symbol->GetName().GetCString();
1583316d498bSGreg Clayton                 }
1584316d498bSGreg Clayton             }
1585c9858e4dSGreg Clayton             else
1586c9858e4dSGreg Clayton             {
1587c9858e4dSGreg Clayton                 if (log)
15887730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame.");
15897730b9a4SJim Ingham             }
15907730b9a4SJim Ingham         }
15917730b9a4SJim Ingham         else
15927730b9a4SJim Ingham         {
15937730b9a4SJim Ingham             if (log)
15947730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFunctionName() => error: process is running");
1595c9858e4dSGreg Clayton 
1596c9858e4dSGreg Clayton         }
15977fdf9ef1SGreg Clayton     }
1598316d498bSGreg Clayton     return name;
1599316d498bSGreg Clayton }
1600c1f705c2SEnrico Granata 
1601c1f705c2SEnrico Granata const char *
1602c1f705c2SEnrico Granata SBFrame::GetDisplayFunctionName()
1603c1f705c2SEnrico Granata {
1604c1f705c2SEnrico Granata     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1605*dbb0abbfSEugene Zelenko     const char *name = nullptr;
1606c1f705c2SEnrico Granata     ExecutionContext exe_ctx(m_opaque_sp.get());
1607*dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
1608c1f705c2SEnrico Granata     Target *target = exe_ctx.GetTargetPtr();
1609c1f705c2SEnrico Granata     Process *process = exe_ctx.GetProcessPtr();
1610c1f705c2SEnrico Granata     if (target && process)
1611c1f705c2SEnrico Granata     {
1612c1f705c2SEnrico Granata         Process::StopLocker stop_locker;
1613c1f705c2SEnrico Granata         if (stop_locker.TryLock(&process->GetRunLock()))
1614c1f705c2SEnrico Granata         {
1615c1f705c2SEnrico Granata             frame = exe_ctx.GetFramePtr();
1616c1f705c2SEnrico Granata             if (frame)
1617c1f705c2SEnrico Granata             {
1618c1f705c2SEnrico Granata                 SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1619c1f705c2SEnrico Granata                 if (sc.block)
1620c1f705c2SEnrico Granata                 {
1621c1f705c2SEnrico Granata                     Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1622c1f705c2SEnrico Granata                     if (inlined_block)
1623c1f705c2SEnrico Granata                     {
1624c1f705c2SEnrico Granata                         const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1625ddaf6a72SGreg Clayton                         name = inlined_info->GetDisplayName(sc.function->GetLanguage()).AsCString();
1626c1f705c2SEnrico Granata                     }
1627c1f705c2SEnrico Granata                 }
1628c1f705c2SEnrico Granata 
1629*dbb0abbfSEugene Zelenko                 if (name == nullptr)
1630c1f705c2SEnrico Granata                 {
1631c1f705c2SEnrico Granata                     if (sc.function)
1632c1f705c2SEnrico Granata                         name = sc.function->GetDisplayName().GetCString();
1633c1f705c2SEnrico Granata                 }
1634c1f705c2SEnrico Granata 
1635*dbb0abbfSEugene Zelenko                 if (name == nullptr)
1636c1f705c2SEnrico Granata                 {
1637c1f705c2SEnrico Granata                     if (sc.symbol)
1638c1f705c2SEnrico Granata                         name = sc.symbol->GetDisplayName().GetCString();
1639c1f705c2SEnrico Granata                 }
1640c1f705c2SEnrico Granata             }
1641c1f705c2SEnrico Granata             else
1642c1f705c2SEnrico Granata             {
1643c1f705c2SEnrico Granata                 if (log)
1644c1f705c2SEnrico Granata                     log->Printf ("SBFrame::GetDisplayFunctionName () => error: could not reconstruct frame object for this SBFrame.");
1645c1f705c2SEnrico Granata             }
1646c1f705c2SEnrico Granata         }
1647c1f705c2SEnrico Granata         else
1648c1f705c2SEnrico Granata         {
1649c1f705c2SEnrico Granata             if (log)
1650c1f705c2SEnrico Granata                 log->Printf ("SBFrame::GetDisplayFunctionName() => error: process is running");
1651c1f705c2SEnrico Granata 
1652c1f705c2SEnrico Granata         }
1653c1f705c2SEnrico Granata     }
1654c1f705c2SEnrico Granata     return name;
1655c1f705c2SEnrico Granata }
1656