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 
10dbb0abbfSEugene Zelenko // C Includes
11dbb0abbfSEugene Zelenko // C++ Includes
1230fdc8d8SChris Lattner #include <algorithm>
13dbb0abbfSEugene Zelenko #include <string>
14dbb0abbfSEugene Zelenko 
15dbb0abbfSEugene Zelenko // Other libraries and framework includes
16dbb0abbfSEugene Zelenko // Project includes
17dbb0abbfSEugene 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 
82dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default;
83dbb0abbfSEugene 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 {
95dbb0abbfSEugene 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 {
107dbb0abbfSEugene 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 
118dbb0abbfSEugene 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 
161dbb0abbfSEugene 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 
204dbb0abbfSEugene 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 
245dbb0abbfSEugene 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 
286dbb0abbfSEugene 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 
326dbb0abbfSEugene 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 
366dbb0abbfSEugene 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 
407dbb0abbfSEugene 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 
474dbb0abbfSEugene 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 
515dbb0abbfSEugene 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 
556dbb0abbfSEugene 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 
596dbb0abbfSEugene 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));
695dbb0abbfSEugene 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 
704dbb0abbfSEugene 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 
761dbb0abbfSEugene 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 
772dbb0abbfSEugene 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,
795*72ac8a84STamas Berghammer                                                    [frame](Variable* v) { return v->IsInScope(frame); },
79672eff18aSGreg Clayton                                                    &variable_list))
79772eff18aSGreg Clayton                     {
79869b582faSGreg Clayton                         var_sp = variable_list.FindVariable (ConstString(name));
79930fdc8d8SChris Lattner                     }
80072eff18aSGreg Clayton                 }
80130fdc8d8SChris Lattner 
8024838131bSGreg Clayton                 if (var_sp)
80381e871edSGreg Clayton                 {
804e3e91517SEnrico Granata                     value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues);
805e3e91517SEnrico Granata                     sb_value.SetSP(value_sp, use_dynamic);
80681e871edSGreg Clayton                 }
8077fdf9ef1SGreg Clayton             }
808c9858e4dSGreg Clayton             else
809c9858e4dSGreg Clayton             {
810c9858e4dSGreg Clayton                 if (log)
8117730b9a4SJim Ingham                     log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame.");
8127730b9a4SJim Ingham             }
8137730b9a4SJim Ingham         }
8147730b9a4SJim Ingham         else
8157730b9a4SJim Ingham         {
8167730b9a4SJim Ingham             if (log)
8177730b9a4SJim Ingham                 log->Printf ("SBFrame::FindVariable () => error: process is running");
818c9858e4dSGreg Clayton         }
819316d498bSGreg Clayton     }
820316d498bSGreg Clayton 
8214838131bSGreg Clayton     if (log)
82269b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
823324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), name,
824324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
8254838131bSGreg Clayton 
826dde9cff3SCaroline Tice     return sb_value;
827dde9cff3SCaroline Tice }
828dde9cff3SCaroline Tice 
82930fdc8d8SChris Lattner SBValue
83069b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type)
83130fdc8d8SChris Lattner {
832316d498bSGreg Clayton     SBValue value;
8337fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
834b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
835d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
836d9e416c0SGreg Clayton     if (frame && target)
837316d498bSGreg Clayton     {
838d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
839316d498bSGreg Clayton         value = FindValue (name, value_type, use_dynamic);
840316d498bSGreg Clayton     }
841316d498bSGreg Clayton     return value;
84278a685aaSJim Ingham }
84378a685aaSJim Ingham 
84478a685aaSJim Ingham SBValue
8452837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
84678a685aaSJim Ingham {
8475160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
84869b582faSGreg Clayton     SBValue sb_value;
8497730b9a4SJim Ingham 
850dbb0abbfSEugene Zelenko     if (name == nullptr || name[0] == '\0')
8517730b9a4SJim Ingham     {
8527730b9a4SJim Ingham         if (log)
8537730b9a4SJim Ingham             log->Printf ("SBFrame::FindValue called with empty name.");
8547730b9a4SJim Ingham         return sb_value;
8557730b9a4SJim Ingham     }
8567730b9a4SJim Ingham 
85781e871edSGreg Clayton     ValueObjectSP value_sp;
8584fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8594fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8604fc6cb9cSJim Ingham 
861dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
862d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
8637730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
8647730b9a4SJim Ingham     if (target && process)
86530fdc8d8SChris Lattner     {
8667fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8677730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
8687730b9a4SJim Ingham         {
8697730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
8707730b9a4SJim Ingham             if (frame)
8717fdf9ef1SGreg Clayton             {
8728a2a0dfbSEnrico Granata                 VariableList variable_list;
8738a2a0dfbSEnrico Granata 
87469b582faSGreg Clayton                 switch (value_type)
87530fdc8d8SChris Lattner                 {
87669b582faSGreg Clayton                 case eValueTypeVariableGlobal:      // global variable
87769b582faSGreg Clayton                 case eValueTypeVariableStatic:      // static variable
87869b582faSGreg Clayton                 case eValueTypeVariableArgument:    // function argument variables
87969b582faSGreg Clayton                 case eValueTypeVariableLocal:       // function local variables
88069b582faSGreg Clayton                     {
881d9e416c0SGreg Clayton                         SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
88272eff18aSGreg Clayton 
88372eff18aSGreg Clayton                         const bool can_create = true;
88472eff18aSGreg Clayton                         const bool get_parent_variables = true;
88572eff18aSGreg Clayton                         const bool stop_if_block_is_inlined_function = true;
88672eff18aSGreg Clayton 
8870efb51a0SChaoren Lin                         if (sc.block)
8880efb51a0SChaoren Lin                             sc.block->AppendVariables(can_create,
88972eff18aSGreg Clayton                                                       get_parent_variables,
89072eff18aSGreg Clayton                                                       stop_if_block_is_inlined_function,
891*72ac8a84STamas Berghammer                                                       [frame](Variable* v) { return v->IsInScope(frame); },
8920efb51a0SChaoren Lin                                                       &variable_list);
8938a2a0dfbSEnrico Granata                         if (value_type == eValueTypeVariableGlobal)
8948a2a0dfbSEnrico Granata                         {
8958a2a0dfbSEnrico Granata                             const bool get_file_globals = true;
8968a2a0dfbSEnrico Granata                             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
8978a2a0dfbSEnrico Granata                             if (frame_vars)
8988a2a0dfbSEnrico Granata                                 frame_vars->AppendVariablesIfUnique(variable_list);
8998a2a0dfbSEnrico Granata                         }
90069b582faSGreg Clayton                         ConstString const_name(name);
90108a04327SEnrico Granata                         VariableSP variable_sp(variable_list.FindVariable(const_name, value_type));
90208a04327SEnrico Granata                         if (variable_sp)
903beae523aSJohnny Chen                         {
904e3e91517SEnrico Granata                             value_sp = frame->GetValueObjectForFrameVariable(variable_sp, eNoDynamicValues);
905e3e91517SEnrico Granata                             sb_value.SetSP(value_sp, use_dynamic);
90630fdc8d8SChris Lattner                         }
90730fdc8d8SChris Lattner                     }
90869b582faSGreg Clayton                     break;
90969b582faSGreg Clayton 
91069b582faSGreg Clayton                 case eValueTypeRegister:            // stack frame register value
91169b582faSGreg Clayton                     {
912d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
91369b582faSGreg Clayton                         if (reg_ctx)
91469b582faSGreg Clayton                         {
91569b582faSGreg Clayton                             const uint32_t num_regs = reg_ctx->GetRegisterCount();
91669b582faSGreg Clayton                             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
91769b582faSGreg Clayton                             {
91869b582faSGreg Clayton                                 const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
91969b582faSGreg Clayton                                 if (reg_info &&
92069b582faSGreg Clayton                                     ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
92169b582faSGreg Clayton                                      (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
92269b582faSGreg Clayton                                 {
923d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
92481e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
92581e871edSGreg Clayton                                     break;
92669b582faSGreg Clayton                                 }
92769b582faSGreg Clayton                             }
92869b582faSGreg Clayton                         }
92969b582faSGreg Clayton                     }
93069b582faSGreg Clayton                     break;
93169b582faSGreg Clayton 
93269b582faSGreg Clayton                 case eValueTypeRegisterSet:         // A collection of stack frame register values
93369b582faSGreg Clayton                     {
934d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
93569b582faSGreg Clayton                         if (reg_ctx)
93669b582faSGreg Clayton                         {
93769b582faSGreg Clayton                             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
93869b582faSGreg Clayton                             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
93969b582faSGreg Clayton                             {
94069b582faSGreg Clayton                                 const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
94169b582faSGreg Clayton                                 if (reg_set &&
94269b582faSGreg Clayton                                     ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
94369b582faSGreg Clayton                                      (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
94469b582faSGreg Clayton                                 {
945d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
94681e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
94781e871edSGreg Clayton                                     break;
94869b582faSGreg Clayton                                 }
94969b582faSGreg Clayton                             }
95069b582faSGreg Clayton                         }
95169b582faSGreg Clayton                     }
95269b582faSGreg Clayton                     break;
95369b582faSGreg Clayton 
95469b582faSGreg Clayton                 case eValueTypeConstResult:         // constant result variables
95569b582faSGreg Clayton                     {
95669b582faSGreg Clayton                         ConstString const_name(name);
9578f1f9a1bSSean Callanan                         ExpressionVariableSP expr_var_sp (target->GetPersistentVariable (const_name));
95869b582faSGreg Clayton                         if (expr_var_sp)
95981e871edSGreg Clayton                         {
96081e871edSGreg Clayton                             value_sp = expr_var_sp->GetValueObject();
961e3e91517SEnrico Granata                             sb_value.SetSP (value_sp, use_dynamic);
96281e871edSGreg Clayton                         }
96369b582faSGreg Clayton                     }
96469b582faSGreg Clayton                     break;
96569b582faSGreg Clayton 
96669b582faSGreg Clayton                 default:
96769b582faSGreg Clayton                     break;
96869b582faSGreg Clayton                 }
969beae523aSJohnny Chen             }
970c9858e4dSGreg Clayton             else
971c9858e4dSGreg Clayton             {
972c9858e4dSGreg Clayton                 if (log)
9737730b9a4SJim Ingham                     log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame.");
9747730b9a4SJim Ingham             }
9757730b9a4SJim Ingham         }
9767730b9a4SJim Ingham         else
9777730b9a4SJim Ingham         {
9787730b9a4SJim Ingham             if (log)
9797730b9a4SJim Ingham                 log->Printf ("SBFrame::FindValue () => error: process is running");
980c9858e4dSGreg Clayton         }
9817fdf9ef1SGreg Clayton     }
982dde9cff3SCaroline Tice 
9834838131bSGreg Clayton     if (log)
98469b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
985324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), name, value_type,
986324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
9874838131bSGreg Clayton 
988dde9cff3SCaroline Tice     return sb_value;
989dde9cff3SCaroline Tice }
990dde9cff3SCaroline Tice 
99130fdc8d8SChris Lattner bool
99235e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const
99335e2ab60SJohnny Chen {
994b57e4a1bSJason Molenda     lldb::StackFrameSP this_sp = GetFrameSP();
995b57e4a1bSJason Molenda     lldb::StackFrameSP that_sp = that.GetFrameSP();
99635e2ab60SJohnny Chen     return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
99735e2ab60SJohnny Chen }
99835e2ab60SJohnny Chen 
99935e2ab60SJohnny Chen bool
100030fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
100130fdc8d8SChris Lattner {
100235e2ab60SJohnny Chen     return IsEqual(rhs);
100330fdc8d8SChris Lattner }
100430fdc8d8SChris Lattner 
100530fdc8d8SChris Lattner bool
100630fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
100730fdc8d8SChris Lattner {
100835e2ab60SJohnny Chen     return !IsEqual(rhs);
1009481cef25SGreg Clayton }
101030fdc8d8SChris Lattner 
101130fdc8d8SChris Lattner SBThread
101230fdc8d8SChris Lattner SBFrame::GetThread () const
101330fdc8d8SChris Lattner {
10145160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1015ceb6b139SCaroline Tice 
10167fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1017d9e416c0SGreg Clayton     ThreadSP thread_sp (exe_ctx.GetThreadSP());
1018d9e416c0SGreg Clayton     SBThread sb_thread (thread_sp);
1019ceb6b139SCaroline Tice 
1020ceb6b139SCaroline Tice     if (log)
1021750cd175SCaroline Tice     {
1022750cd175SCaroline Tice         SBStream sstr;
1023750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
1024d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
1025324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetFramePtr()),
1026324a1036SSaleem Abdulrasool                      static_cast<void*>(thread_sp.get()), sstr.GetData());
1027750cd175SCaroline Tice     }
1028ceb6b139SCaroline Tice 
102930fdc8d8SChris Lattner     return sb_thread;
103030fdc8d8SChris Lattner }
103130fdc8d8SChris Lattner 
103230fdc8d8SChris Lattner const char *
103330fdc8d8SChris Lattner SBFrame::Disassemble () const
103430fdc8d8SChris Lattner {
10355160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1036dbb0abbfSEugene Zelenko     const char *disassembly = nullptr;
10374fc6cb9cSJim Ingham     Mutex::Locker api_locker;
10384fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
10394fc6cb9cSJim Ingham 
1040dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
1041d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
10427730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
10437730b9a4SJim Ingham     if (target && process)
1044af67cecdSGreg Clayton     {
10457fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10467730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
10477730b9a4SJim Ingham         {
10487730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
10497730b9a4SJim Ingham             if (frame)
10507fdf9ef1SGreg Clayton             {
1051d9e416c0SGreg Clayton                 disassembly = frame->Disassemble();
1052af67cecdSGreg Clayton             }
1053c9858e4dSGreg Clayton             else
1054c9858e4dSGreg Clayton             {
1055c9858e4dSGreg Clayton                 if (log)
10567730b9a4SJim Ingham                     log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame.");
10577730b9a4SJim Ingham             }
10587730b9a4SJim Ingham         }
10597730b9a4SJim Ingham         else
10607730b9a4SJim Ingham         {
10617730b9a4SJim Ingham             if (log)
10627730b9a4SJim Ingham                 log->Printf ("SBFrame::Disassemble () => error: process is running");
10637fdf9ef1SGreg Clayton         }
1064c9858e4dSGreg Clayton     }
10654838131bSGreg Clayton 
10664838131bSGreg Clayton     if (log)
1067324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::Disassemble () => %s",
1068324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), disassembly);
10694838131bSGreg Clayton 
10704838131bSGreg Clayton     return disassembly;
107130fdc8d8SChris Lattner }
107230fdc8d8SChris Lattner 
107330fdc8d8SChris Lattner SBValueList
107430fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
107530fdc8d8SChris Lattner                        bool locals,
107630fdc8d8SChris Lattner                        bool statics,
107730fdc8d8SChris Lattner                        bool in_scope_only)
107830fdc8d8SChris Lattner {
1079316d498bSGreg Clayton     SBValueList value_list;
10807fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1081b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
1082d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1083d9e416c0SGreg Clayton     if (frame && target)
1084316d498bSGreg Clayton     {
1085d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
108651f96eebSZachary Turner         const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false;
108751f96eebSZachary Turner 
108851f96eebSZachary Turner         SBVariablesOptions options;
108951f96eebSZachary Turner         options.SetIncludeArguments(arguments);
109051f96eebSZachary Turner         options.SetIncludeLocals(locals);
109151f96eebSZachary Turner         options.SetIncludeStatics(statics);
109251f96eebSZachary Turner         options.SetInScopeOnly(in_scope_only);
109351f96eebSZachary Turner         options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
109451f96eebSZachary Turner         options.SetUseDynamic(use_dynamic);
109551f96eebSZachary Turner 
109651f96eebSZachary Turner         value_list = GetVariables (options);
1097316d498bSGreg Clayton     }
1098316d498bSGreg Clayton     return value_list;
109978a685aaSJim Ingham }
110078a685aaSJim Ingham 
1101560558ebSEnrico Granata lldb::SBValueList
1102560558ebSEnrico Granata SBFrame::GetVariables (bool arguments,
1103560558ebSEnrico Granata                        bool locals,
1104560558ebSEnrico Granata                        bool statics,
1105560558ebSEnrico Granata                        bool in_scope_only,
1106560558ebSEnrico Granata                        lldb::DynamicValueType  use_dynamic)
1107560558ebSEnrico Granata {
1108560558ebSEnrico Granata     ExecutionContext exe_ctx(m_opaque_sp.get());
1109560558ebSEnrico Granata     Target *target = exe_ctx.GetTargetPtr();
111051f96eebSZachary Turner     const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false;
111151f96eebSZachary Turner     SBVariablesOptions options;
111251f96eebSZachary Turner     options.SetIncludeArguments(arguments);
111351f96eebSZachary Turner     options.SetIncludeLocals(locals);
111451f96eebSZachary Turner     options.SetIncludeStatics(statics);
111551f96eebSZachary Turner     options.SetInScopeOnly(in_scope_only);
111651f96eebSZachary Turner     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
111751f96eebSZachary Turner     options.SetUseDynamic(use_dynamic);
111851f96eebSZachary Turner     return GetVariables(options);
1119560558ebSEnrico Granata }
1120560558ebSEnrico Granata 
112178a685aaSJim Ingham SBValueList
112251f96eebSZachary Turner SBFrame::GetVariables (const lldb::SBVariablesOptions& options)
112378a685aaSJim Ingham {
11245160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1125ceb6b139SCaroline Tice 
1126b9556accSGreg Clayton     SBValueList value_list;
11274fc6cb9cSJim Ingham     Mutex::Locker api_locker;
11284fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
11294fc6cb9cSJim Ingham 
1130dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
1131d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1132b9556accSGreg Clayton 
113351f96eebSZachary Turner     const bool statics = options.GetIncludeStatics();
113451f96eebSZachary Turner     const bool arguments = options.GetIncludeArguments();
113551f96eebSZachary Turner     const bool locals = options.GetIncludeLocals();
113651f96eebSZachary Turner     const bool in_scope_only = options.GetInScopeOnly();
113751f96eebSZachary Turner     const bool include_runtime_support_values = options.GetIncludeRuntimeSupportValues();
113851f96eebSZachary Turner     const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
113951f96eebSZachary Turner 
1140ceb6b139SCaroline Tice     if (log)
114151f96eebSZachary Turner         log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)",
114251f96eebSZachary Turner                      arguments, locals,
114351f96eebSZachary Turner                      statics, in_scope_only,
114451f96eebSZachary Turner                      include_runtime_support_values, use_dynamic);
1145ceb6b139SCaroline Tice 
11467730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
11477730b9a4SJim Ingham     if (target && process)
114830fdc8d8SChris Lattner     {
11497fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11507730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
11517fdf9ef1SGreg Clayton         {
11527730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
11537730b9a4SJim Ingham             if (frame)
11547730b9a4SJim Ingham             {
115530fdc8d8SChris Lattner                 size_t i;
1156dbb0abbfSEugene Zelenko                 VariableList *variable_list = nullptr;
1157d9e416c0SGreg Clayton                 variable_list = frame->GetVariableList(true);
115830fdc8d8SChris Lattner                 if (variable_list)
115930fdc8d8SChris Lattner                 {
116030fdc8d8SChris Lattner                     const size_t num_variables = variable_list->GetSize();
116130fdc8d8SChris Lattner                     if (num_variables)
116230fdc8d8SChris Lattner                     {
116330fdc8d8SChris Lattner                         for (i = 0; i < num_variables; ++i)
116430fdc8d8SChris Lattner                         {
116530fdc8d8SChris Lattner                             VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
116630fdc8d8SChris Lattner                             if (variable_sp)
116730fdc8d8SChris Lattner                             {
116830fdc8d8SChris Lattner                                 bool add_variable = false;
116930fdc8d8SChris Lattner                                 switch (variable_sp->GetScope())
117030fdc8d8SChris Lattner                                 {
117130fdc8d8SChris Lattner                                 case eValueTypeVariableGlobal:
117230fdc8d8SChris Lattner                                 case eValueTypeVariableStatic:
117330fdc8d8SChris Lattner                                     add_variable = statics;
117430fdc8d8SChris Lattner                                     break;
117530fdc8d8SChris Lattner 
117630fdc8d8SChris Lattner                                 case eValueTypeVariableArgument:
117730fdc8d8SChris Lattner                                     add_variable = arguments;
117830fdc8d8SChris Lattner                                     break;
117930fdc8d8SChris Lattner 
118030fdc8d8SChris Lattner                                 case eValueTypeVariableLocal:
118130fdc8d8SChris Lattner                                     add_variable = locals;
118230fdc8d8SChris Lattner                                     break;
1183c982c768SGreg Clayton 
1184c982c768SGreg Clayton                                 default:
1185c982c768SGreg Clayton                                     break;
118630fdc8d8SChris Lattner                                 }
118730fdc8d8SChris Lattner                                 if (add_variable)
118830fdc8d8SChris Lattner                                 {
1189d9e416c0SGreg Clayton                                     if (in_scope_only && !variable_sp->IsInScope(frame))
119030fdc8d8SChris Lattner                                         continue;
119130fdc8d8SChris Lattner 
1192e3e91517SEnrico Granata                                     ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues));
1193560558ebSEnrico Granata 
1194dbb0abbfSEugene Zelenko                                     if (!include_runtime_support_values &&
1195dbb0abbfSEugene Zelenko                                         valobj_sp != nullptr &&
1196dbb0abbfSEugene Zelenko                                         valobj_sp->IsRuntimeSupportValue())
1197560558ebSEnrico Granata                                         continue;
1198560558ebSEnrico Granata 
1199e3e91517SEnrico Granata                                     SBValue value_sb;
1200e3e91517SEnrico Granata                                     value_sb.SetSP(valobj_sp,use_dynamic);
1201e3e91517SEnrico Granata                                     value_list.Append(value_sb);
120230fdc8d8SChris Lattner                                 }
120330fdc8d8SChris Lattner                             }
120430fdc8d8SChris Lattner                         }
120530fdc8d8SChris Lattner                     }
120630fdc8d8SChris Lattner                 }
120730fdc8d8SChris Lattner             }
1208c9858e4dSGreg Clayton             else
1209c9858e4dSGreg Clayton             {
1210c9858e4dSGreg Clayton                 if (log)
12117730b9a4SJim Ingham                     log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
12127730b9a4SJim Ingham             }
12137730b9a4SJim Ingham         }
12147730b9a4SJim Ingham         else
12157730b9a4SJim Ingham         {
12167730b9a4SJim Ingham             if (log)
12177730b9a4SJim Ingham                 log->Printf ("SBFrame::GetVariables () => error: process is running");
1218c9858e4dSGreg Clayton         }
12197fdf9ef1SGreg Clayton     }
1220ceb6b139SCaroline Tice 
1221ceb6b139SCaroline Tice     if (log)
1222324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)",
1223324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1224324a1036SSaleem Abdulrasool                      static_cast<void*>(value_list.opaque_ptr()));
1225ceb6b139SCaroline Tice 
122630fdc8d8SChris Lattner     return value_list;
122730fdc8d8SChris Lattner }
122830fdc8d8SChris Lattner 
122969b582faSGreg Clayton SBValueList
123030fdc8d8SChris Lattner SBFrame::GetRegisters ()
123130fdc8d8SChris Lattner {
12325160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1233ceb6b139SCaroline Tice 
123430fdc8d8SChris Lattner     SBValueList value_list;
12354fc6cb9cSJim Ingham     Mutex::Locker api_locker;
12364fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
12374fc6cb9cSJim Ingham 
1238dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
1239d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
12407730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
12417730b9a4SJim Ingham     if (target && process)
124230fdc8d8SChris Lattner     {
12437fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
12447730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
12457730b9a4SJim Ingham         {
12467730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
12477730b9a4SJim Ingham             if (frame)
12487fdf9ef1SGreg Clayton             {
1249d9e416c0SGreg Clayton                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
125030fdc8d8SChris Lattner                 if (reg_ctx)
125130fdc8d8SChris Lattner                 {
125230fdc8d8SChris Lattner                     const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
125330fdc8d8SChris Lattner                     for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
125430fdc8d8SChris Lattner                     {
1255d9e416c0SGreg Clayton                         value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
125630fdc8d8SChris Lattner                     }
125730fdc8d8SChris Lattner                 }
125830fdc8d8SChris Lattner             }
1259c9858e4dSGreg Clayton             else
1260c9858e4dSGreg Clayton             {
1261c9858e4dSGreg Clayton                 if (log)
12627730b9a4SJim Ingham                     log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame.");
12637730b9a4SJim Ingham             }
12647730b9a4SJim Ingham         }
12657730b9a4SJim Ingham         else
12667730b9a4SJim Ingham         {
12677730b9a4SJim Ingham             if (log)
12687730b9a4SJim Ingham                 log->Printf ("SBFrame::GetRegisters () => error: process is running");
1269c9858e4dSGreg Clayton         }
12707fdf9ef1SGreg Clayton     }
1271ceb6b139SCaroline Tice 
1272ceb6b139SCaroline Tice     if (log)
1273324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)",
1274324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1275324a1036SSaleem Abdulrasool                      static_cast<void*>(value_list.opaque_ptr()));
1276ceb6b139SCaroline Tice 
127730fdc8d8SChris Lattner     return value_list;
127830fdc8d8SChris Lattner }
127930fdc8d8SChris Lattner 
1280ad9a53c5SJason Molenda SBValue
1281ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name)
1282ad9a53c5SJason Molenda {
1283ad9a53c5SJason Molenda     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1284ad9a53c5SJason Molenda 
1285ad9a53c5SJason Molenda     SBValue result;
1286ad9a53c5SJason Molenda     ValueObjectSP value_sp;
1287ad9a53c5SJason Molenda     Mutex::Locker api_locker;
1288ad9a53c5SJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1289ad9a53c5SJason Molenda 
1290dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
1291ad9a53c5SJason Molenda     Target *target = exe_ctx.GetTargetPtr();
1292ad9a53c5SJason Molenda     Process *process = exe_ctx.GetProcessPtr();
1293ad9a53c5SJason Molenda     if (target && process)
1294ad9a53c5SJason Molenda     {
1295ad9a53c5SJason Molenda         Process::StopLocker stop_locker;
1296ad9a53c5SJason Molenda         if (stop_locker.TryLock(&process->GetRunLock()))
1297ad9a53c5SJason Molenda         {
1298ad9a53c5SJason Molenda             frame = exe_ctx.GetFramePtr();
1299ad9a53c5SJason Molenda             if (frame)
1300ad9a53c5SJason Molenda             {
1301ad9a53c5SJason Molenda                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
1302ad9a53c5SJason Molenda                 if (reg_ctx)
1303ad9a53c5SJason Molenda                 {
1304ad9a53c5SJason Molenda                     const uint32_t num_regs = reg_ctx->GetRegisterCount();
1305ad9a53c5SJason Molenda                     for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
1306ad9a53c5SJason Molenda                     {
1307ad9a53c5SJason Molenda                         const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
1308ad9a53c5SJason Molenda                         if (reg_info &&
1309ad9a53c5SJason Molenda                             ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
1310ad9a53c5SJason Molenda                              (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
1311ad9a53c5SJason Molenda                         {
1312ad9a53c5SJason Molenda                             value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
1313ad9a53c5SJason Molenda                             result.SetSP (value_sp);
1314ad9a53c5SJason Molenda                             break;
1315ad9a53c5SJason Molenda                         }
1316ad9a53c5SJason Molenda                     }
1317ad9a53c5SJason Molenda                 }
1318ad9a53c5SJason Molenda             }
1319ad9a53c5SJason Molenda             else
1320ad9a53c5SJason Molenda             {
1321ad9a53c5SJason Molenda                 if (log)
13225d353842SJason Molenda                     log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame.");
1323ad9a53c5SJason Molenda             }
1324ad9a53c5SJason Molenda         }
1325ad9a53c5SJason Molenda         else
1326ad9a53c5SJason Molenda         {
1327ad9a53c5SJason Molenda             if (log)
13285d353842SJason Molenda                 log->Printf ("SBFrame::FindRegister () => error: process is running");
1329ad9a53c5SJason Molenda         }
1330ad9a53c5SJason Molenda     }
1331ad9a53c5SJason Molenda 
1332ad9a53c5SJason Molenda     if (log)
1333324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)",
1334324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1335324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
1336ad9a53c5SJason Molenda 
1337ad9a53c5SJason Molenda     return result;
1338ad9a53c5SJason Molenda }
1339ad9a53c5SJason Molenda 
1340dde9cff3SCaroline Tice bool
1341dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
1342dde9cff3SCaroline Tice {
13435160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1344da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1345da7bc7d0SGreg Clayton 
13464fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13474fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13484fc6cb9cSJim Ingham 
1349b57e4a1bSJason Molenda     StackFrame *frame;
1350d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
13517730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
13527730b9a4SJim Ingham     if (target && process)
1353dde9cff3SCaroline Tice     {
13547fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13557730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
13567730b9a4SJim Ingham         {
13577730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
13587730b9a4SJim Ingham             if (frame)
13597fdf9ef1SGreg Clayton             {
1360d9e416c0SGreg Clayton                 frame->DumpUsingSettingsFormat (&strm);
1361dde9cff3SCaroline Tice             }
1362c9858e4dSGreg Clayton             else
1363c9858e4dSGreg Clayton             {
1364c9858e4dSGreg Clayton                 if (log)
13657730b9a4SJim Ingham                     log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame.");
13667730b9a4SJim Ingham             }
13677730b9a4SJim Ingham         }
13687730b9a4SJim Ingham         else
13697730b9a4SJim Ingham         {
13707730b9a4SJim Ingham             if (log)
13717730b9a4SJim Ingham                 log->Printf ("SBFrame::GetDescription () => error: process is running");
1372c9858e4dSGreg Clayton         }
1373c9858e4dSGreg Clayton 
13747fdf9ef1SGreg Clayton     }
1375dde9cff3SCaroline Tice     else
1376da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1377dde9cff3SCaroline Tice 
1378dde9cff3SCaroline Tice     return true;
1379dde9cff3SCaroline Tice }
13801d3afba3SGreg Clayton 
138169b582faSGreg Clayton SBValue
13821d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
13831d3afba3SGreg Clayton {
1384316d498bSGreg Clayton     SBValue result;
13857fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1386b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
1387d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1388d9e416c0SGreg Clayton     if (frame && target)
1389316d498bSGreg Clayton     {
139035e1bda6SJim Ingham         SBExpressionOptions options;
139135e1bda6SJim Ingham         lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue();
1392cced1566SGreg Clayton         options.SetFetchDynamicValue (fetch_dynamic_value);
139335e1bda6SJim Ingham         options.SetUnwindOnError (true);
139424785bd0SEugene Leviant         options.SetIgnoreBreakpoints (true);
1395998c8a1cSRyan Brown         if (target->GetLanguage() != eLanguageTypeUnknown)
1396998c8a1cSRyan Brown             options.SetLanguage(target->GetLanguage());
1397998c8a1cSRyan Brown         else
1398998c8a1cSRyan Brown             options.SetLanguage(frame->GetLanguage());
139935e1bda6SJim Ingham         return EvaluateExpression (expr, options);
1400316d498bSGreg Clayton     }
1401316d498bSGreg Clayton     return result;
140278a685aaSJim Ingham }
140378a685aaSJim Ingham 
140478a685aaSJim Ingham SBValue
14052837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
140678a685aaSJim Ingham {
140735e1bda6SJim Ingham     SBExpressionOptions options;
1408cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
140935e1bda6SJim Ingham     options.SetUnwindOnError (true);
141024785bd0SEugene Leviant     options.SetIgnoreBreakpoints (true);
1411998c8a1cSRyan Brown     ExecutionContext exe_ctx(m_opaque_sp.get());
1412998c8a1cSRyan Brown     StackFrame *frame = exe_ctx.GetFramePtr();
1413998c8a1cSRyan Brown     Target *target = exe_ctx.GetTargetPtr();
1414998c8a1cSRyan Brown     if (target && target->GetLanguage() != eLanguageTypeUnknown)
1415998c8a1cSRyan Brown         options.SetLanguage(target->GetLanguage());
1416998c8a1cSRyan Brown     else if (frame)
1417998c8a1cSRyan Brown         options.SetLanguage(frame->GetLanguage());
141835e1bda6SJim Ingham     return EvaluateExpression (expr, options);
14197ba6e991SJim Ingham }
14207ba6e991SJim Ingham 
14217ba6e991SJim Ingham SBValue
14227ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error)
14237ba6e991SJim Ingham {
142435e1bda6SJim Ingham     SBExpressionOptions options;
1425998c8a1cSRyan Brown     ExecutionContext exe_ctx(m_opaque_sp.get());
1426cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
142735e1bda6SJim Ingham     options.SetUnwindOnError (unwind_on_error);
142824785bd0SEugene Leviant     options.SetIgnoreBreakpoints (true);
1429998c8a1cSRyan Brown     StackFrame *frame = exe_ctx.GetFramePtr();
1430998c8a1cSRyan Brown     Target *target = exe_ctx.GetTargetPtr();
1431998c8a1cSRyan Brown     if (target && target->GetLanguage() != eLanguageTypeUnknown)
1432998c8a1cSRyan Brown         options.SetLanguage(target->GetLanguage());
1433998c8a1cSRyan Brown     else if (frame)
1434998c8a1cSRyan Brown         options.SetLanguage(frame->GetLanguage());
143535e1bda6SJim Ingham     return EvaluateExpression (expr, options);
143635e1bda6SJim Ingham }
143735e1bda6SJim Ingham 
143835e1bda6SJim Ingham lldb::SBValue
143935e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options)
144035e1bda6SJim Ingham {
14415160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14424838131bSGreg Clayton 
14435160ce5cSGreg Clayton     Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1444a162ebafSSean Callanan 
14458646d3c1SJim Ingham     ExpressionResults exe_results = eExpressionSetupError;
144669b582faSGreg Clayton     SBValue expr_result;
14477730b9a4SJim Ingham 
1448dbb0abbfSEugene Zelenko     if (expr == nullptr || expr[0] == '\0')
14497730b9a4SJim Ingham     {
14507730b9a4SJim Ingham         if (log)
14517730b9a4SJim Ingham             log->Printf ("SBFrame::EvaluateExpression called with an empty expression");
14527730b9a4SJim Ingham         return expr_result;
14537730b9a4SJim Ingham     }
14547730b9a4SJim Ingham 
145581e871edSGreg Clayton     ValueObjectSP expr_value_sp;
14564838131bSGreg Clayton 
14574fc6cb9cSJim Ingham     Mutex::Locker api_locker;
14584fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
14594fc6cb9cSJim Ingham 
1460b9556accSGreg Clayton     if (log)
14617730b9a4SJim Ingham         log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
1462b9556accSGreg Clayton 
1463dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
14647730b9a4SJim Ingham     Target *target = exe_ctx.GetTargetPtr();
14657730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
14667730b9a4SJim Ingham 
14677730b9a4SJim Ingham     if (target && process)
14681d3afba3SGreg Clayton     {
14697fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
14707730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
14717730b9a4SJim Ingham         {
14727730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
14737730b9a4SJim Ingham             if (frame)
14747fdf9ef1SGreg Clayton             {
1475fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1476fb6621efSGreg Clayton                 {
14771ba7c4d0SGreg Clayton                     StreamString frame_description;
1478d9e416c0SGreg Clayton                     frame->DumpUsingSettingsFormat (&frame_description);
14791ba7c4d0SGreg Clayton                     Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
1480cced1566SGreg Clayton                                                          expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str());
1481fb6621efSGreg Clayton                 }
1482fb6621efSGreg Clayton 
1483d9e416c0SGreg Clayton                 exe_results = target->EvaluateExpression (expr,
1484d9e416c0SGreg Clayton                                                           frame,
1485d4439aa9SEnrico Granata                                                           expr_value_sp,
148635e1bda6SJim Ingham                                                           options.ref());
1487e3e91517SEnrico Granata                 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1488fb6621efSGreg Clayton 
1489fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1490dbb0abbfSEugene Zelenko                     Host::SetCrashDescription(nullptr);
14911d3afba3SGreg Clayton             }
1492c9858e4dSGreg Clayton             else
1493c9858e4dSGreg Clayton             {
1494c9858e4dSGreg Clayton                 if (log)
14957730b9a4SJim Ingham                     log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame.");
14967730b9a4SJim Ingham             }
14977730b9a4SJim Ingham         }
14987730b9a4SJim Ingham         else
14997730b9a4SJim Ingham         {
15007730b9a4SJim Ingham             if (log)
15017730b9a4SJim Ingham                 log->Printf ("SBFrame::EvaluateExpression () => error: process is running");
1502c9858e4dSGreg Clayton         }
15037fdf9ef1SGreg Clayton     }
15044838131bSGreg Clayton 
1505cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1506a162ebafSSean Callanan     if (expr_log)
150778a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
1508324a1036SSaleem Abdulrasool                          expr_result.GetValue(), expr_result.GetSummary());
1509a162ebafSSean Callanan 
15104838131bSGreg Clayton     if (log)
1511d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1512324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), expr,
1513324a1036SSaleem Abdulrasool                      static_cast<void*>(expr_value_sp.get()), exe_results);
1514cf7e2dc0SJason Molenda #endif
15154838131bSGreg Clayton 
1516cfd1acedSGreg Clayton     return expr_result;
15171d3afba3SGreg Clayton }
1518316d498bSGreg Clayton 
1519316d498bSGreg Clayton bool
15206345fe3eSOleksiy Vyalov SBFrame::IsInlined()
1521316d498bSGreg Clayton {
152205f75e9fSOleksiy Vyalov     return static_cast<const SBFrame*>(this)->IsInlined();
152305f75e9fSOleksiy Vyalov }
152405f75e9fSOleksiy Vyalov 
152505f75e9fSOleksiy Vyalov bool
152605f75e9fSOleksiy Vyalov SBFrame::IsInlined() const
152705f75e9fSOleksiy Vyalov {
15285160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
15297fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1530dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
1531d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
15327730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
15337730b9a4SJim Ingham     if (target && process)
1534316d498bSGreg Clayton     {
15357fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
15367730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
15377730b9a4SJim Ingham         {
15387730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
15397730b9a4SJim Ingham             if (frame)
15407fdf9ef1SGreg Clayton             {
15417fdf9ef1SGreg Clayton 
1542d9e416c0SGreg Clayton                 Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1543316d498bSGreg Clayton                 if (block)
1544dbb0abbfSEugene Zelenko                     return block->GetContainingInlinedBlock() != nullptr;
1545316d498bSGreg Clayton             }
1546c9858e4dSGreg Clayton             else
1547c9858e4dSGreg Clayton             {
1548c9858e4dSGreg Clayton                 if (log)
15497730b9a4SJim Ingham                     log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame.");
15507730b9a4SJim Ingham             }
15517730b9a4SJim Ingham         }
15527730b9a4SJim Ingham         else
15537730b9a4SJim Ingham         {
15547730b9a4SJim Ingham             if (log)
15557730b9a4SJim Ingham                 log->Printf ("SBFrame::IsInlined () => error: process is running");
1556c9858e4dSGreg Clayton         }
1557c9858e4dSGreg Clayton 
15587fdf9ef1SGreg Clayton     }
1559316d498bSGreg Clayton     return false;
1560316d498bSGreg Clayton }
1561316d498bSGreg Clayton 
1562316d498bSGreg Clayton const char *
15636345fe3eSOleksiy Vyalov SBFrame::GetFunctionName()
1564316d498bSGreg Clayton {
156505f75e9fSOleksiy Vyalov     return static_cast<const SBFrame*>(this)->GetFunctionName();
156605f75e9fSOleksiy Vyalov }
156705f75e9fSOleksiy Vyalov 
156805f75e9fSOleksiy Vyalov const char *
156905f75e9fSOleksiy Vyalov SBFrame::GetFunctionName() const
157005f75e9fSOleksiy Vyalov {
15715160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1572dbb0abbfSEugene Zelenko     const char *name = nullptr;
15737fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1574dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
1575d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
15767730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
15777730b9a4SJim Ingham     if (target && process)
1578316d498bSGreg Clayton     {
15797fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
15807730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
15817730b9a4SJim Ingham         {
15827730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
15837730b9a4SJim Ingham             if (frame)
15847fdf9ef1SGreg Clayton             {
1585d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1586316d498bSGreg Clayton                 if (sc.block)
1587316d498bSGreg Clayton                 {
1588316d498bSGreg Clayton                     Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1589316d498bSGreg Clayton                     if (inlined_block)
1590316d498bSGreg Clayton                     {
1591316d498bSGreg Clayton                         const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1592ddaf6a72SGreg Clayton                         name = inlined_info->GetName(sc.function->GetLanguage()).AsCString();
1593316d498bSGreg Clayton                     }
1594316d498bSGreg Clayton                 }
1595316d498bSGreg Clayton 
1596dbb0abbfSEugene Zelenko                 if (name == nullptr)
1597316d498bSGreg Clayton                 {
1598316d498bSGreg Clayton                     if (sc.function)
1599316d498bSGreg Clayton                         name = sc.function->GetName().GetCString();
1600316d498bSGreg Clayton                 }
1601316d498bSGreg Clayton 
1602dbb0abbfSEugene Zelenko                 if (name == nullptr)
1603316d498bSGreg Clayton                 {
1604316d498bSGreg Clayton                     if (sc.symbol)
1605316d498bSGreg Clayton                         name = sc.symbol->GetName().GetCString();
1606316d498bSGreg Clayton                 }
1607316d498bSGreg Clayton             }
1608c9858e4dSGreg Clayton             else
1609c9858e4dSGreg Clayton             {
1610c9858e4dSGreg Clayton                 if (log)
16117730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame.");
16127730b9a4SJim Ingham             }
16137730b9a4SJim Ingham         }
16147730b9a4SJim Ingham         else
16157730b9a4SJim Ingham         {
16167730b9a4SJim Ingham             if (log)
16177730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFunctionName() => error: process is running");
1618c9858e4dSGreg Clayton 
1619c9858e4dSGreg Clayton         }
16207fdf9ef1SGreg Clayton     }
1621316d498bSGreg Clayton     return name;
1622316d498bSGreg Clayton }
1623c1f705c2SEnrico Granata 
1624c1f705c2SEnrico Granata const char *
1625c1f705c2SEnrico Granata SBFrame::GetDisplayFunctionName()
1626c1f705c2SEnrico Granata {
1627c1f705c2SEnrico Granata     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1628dbb0abbfSEugene Zelenko     const char *name = nullptr;
1629c1f705c2SEnrico Granata     ExecutionContext exe_ctx(m_opaque_sp.get());
1630dbb0abbfSEugene Zelenko     StackFrame *frame = nullptr;
1631c1f705c2SEnrico Granata     Target *target = exe_ctx.GetTargetPtr();
1632c1f705c2SEnrico Granata     Process *process = exe_ctx.GetProcessPtr();
1633c1f705c2SEnrico Granata     if (target && process)
1634c1f705c2SEnrico Granata     {
1635c1f705c2SEnrico Granata         Process::StopLocker stop_locker;
1636c1f705c2SEnrico Granata         if (stop_locker.TryLock(&process->GetRunLock()))
1637c1f705c2SEnrico Granata         {
1638c1f705c2SEnrico Granata             frame = exe_ctx.GetFramePtr();
1639c1f705c2SEnrico Granata             if (frame)
1640c1f705c2SEnrico Granata             {
1641c1f705c2SEnrico Granata                 SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1642c1f705c2SEnrico Granata                 if (sc.block)
1643c1f705c2SEnrico Granata                 {
1644c1f705c2SEnrico Granata                     Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1645c1f705c2SEnrico Granata                     if (inlined_block)
1646c1f705c2SEnrico Granata                     {
1647c1f705c2SEnrico Granata                         const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1648ddaf6a72SGreg Clayton                         name = inlined_info->GetDisplayName(sc.function->GetLanguage()).AsCString();
1649c1f705c2SEnrico Granata                     }
1650c1f705c2SEnrico Granata                 }
1651c1f705c2SEnrico Granata 
1652dbb0abbfSEugene Zelenko                 if (name == nullptr)
1653c1f705c2SEnrico Granata                 {
1654c1f705c2SEnrico Granata                     if (sc.function)
1655c1f705c2SEnrico Granata                         name = sc.function->GetDisplayName().GetCString();
1656c1f705c2SEnrico Granata                 }
1657c1f705c2SEnrico Granata 
1658dbb0abbfSEugene Zelenko                 if (name == nullptr)
1659c1f705c2SEnrico Granata                 {
1660c1f705c2SEnrico Granata                     if (sc.symbol)
1661c1f705c2SEnrico Granata                         name = sc.symbol->GetDisplayName().GetCString();
1662c1f705c2SEnrico Granata                 }
1663c1f705c2SEnrico Granata             }
1664c1f705c2SEnrico Granata             else
1665c1f705c2SEnrico Granata             {
1666c1f705c2SEnrico Granata                 if (log)
1667c1f705c2SEnrico Granata                     log->Printf ("SBFrame::GetDisplayFunctionName () => error: could not reconstruct frame object for this SBFrame.");
1668c1f705c2SEnrico Granata             }
1669c1f705c2SEnrico Granata         }
1670c1f705c2SEnrico Granata         else
1671c1f705c2SEnrico Granata         {
1672c1f705c2SEnrico Granata             if (log)
1673c1f705c2SEnrico Granata                 log->Printf ("SBFrame::GetDisplayFunctionName() => error: process is running");
1674c1f705c2SEnrico Granata 
1675c1f705c2SEnrico Granata         }
1676c1f705c2SEnrico Granata     }
1677c1f705c2SEnrico Granata     return name;
1678c1f705c2SEnrico Granata }
1679