130fdc8d8SChris Lattner //===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
104c5de699SEli Friedman #include "lldb/API/SBFrame.h"
1130fdc8d8SChris Lattner 
1230fdc8d8SChris Lattner #include <string>
1330fdc8d8SChris Lattner #include <algorithm>
1430fdc8d8SChris Lattner 
1530fdc8d8SChris Lattner #include "lldb/lldb-types.h"
1630fdc8d8SChris Lattner 
1730fdc8d8SChris Lattner #include "lldb/Core/Address.h"
1830fdc8d8SChris Lattner #include "lldb/Core/ConstString.h"
19ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
2030fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h"
2330fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h"
24*4dbb271fSSean Callanan #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h"
25151c032cSJim Ingham #include "lldb/Expression/UserExpression.h"
261ba7c4d0SGreg Clayton #include "lldb/Host/Host.h"
2730fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
281f746071SGreg Clayton #include "lldb/Symbol/Function.h"
291f746071SGreg Clayton #include "lldb/Symbol/Symbol.h"
3030fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
3130fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h"
3230fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
3330fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
3430fdc8d8SChris Lattner #include "lldb/Target/Target.h"
3530fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3630fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
37b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h"
38b9556accSGreg Clayton #include "lldb/Target/StackID.h"
3930fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
4030fdc8d8SChris Lattner 
414c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
424c5de699SEli Friedman #include "lldb/API/SBValue.h"
434c5de699SEli Friedman #include "lldb/API/SBAddress.h"
4435e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h"
45dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
464c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h"
474c5de699SEli Friedman #include "lldb/API/SBThread.h"
4851f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h"
4930fdc8d8SChris Lattner 
5030fdc8d8SChris Lattner using namespace lldb;
5130fdc8d8SChris Lattner using namespace lldb_private;
5230fdc8d8SChris Lattner 
53b9556accSGreg Clayton 
5430fdc8d8SChris Lattner SBFrame::SBFrame () :
557fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef())
5630fdc8d8SChris Lattner {
5730fdc8d8SChris Lattner }
5830fdc8d8SChris Lattner 
59b57e4a1bSJason Molenda SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) :
607fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef (lldb_object_sp))
6130fdc8d8SChris Lattner {
625160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
63ceb6b139SCaroline Tice 
64ceb6b139SCaroline Tice     if (log)
65ceb6b139SCaroline Tice     {
66ceb6b139SCaroline Tice         SBStream sstr;
67ceb6b139SCaroline Tice         GetDescription (sstr);
684838131bSGreg Clayton         log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s",
69324a1036SSaleem Abdulrasool                      static_cast<void*>(lldb_object_sp.get()),
70324a1036SSaleem Abdulrasool                      static_cast<void*>(lldb_object_sp.get()), sstr.GetData());
71ceb6b139SCaroline Tice     }
7230fdc8d8SChris Lattner }
7330fdc8d8SChris Lattner 
74efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) :
757fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp))
76efabb123SGreg Clayton {
77efabb123SGreg Clayton }
78efabb123SGreg Clayton 
79efabb123SGreg Clayton const SBFrame &
80efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs)
81efabb123SGreg Clayton {
82efabb123SGreg Clayton     if (this != &rhs)
837fdf9ef1SGreg Clayton         *m_opaque_sp = *rhs.m_opaque_sp;
84efabb123SGreg Clayton     return *this;
85efabb123SGreg Clayton }
86efabb123SGreg Clayton 
8730fdc8d8SChris Lattner SBFrame::~SBFrame()
8830fdc8d8SChris Lattner {
8930fdc8d8SChris Lattner }
9030fdc8d8SChris Lattner 
91b57e4a1bSJason Molenda StackFrameSP
92b9556accSGreg Clayton SBFrame::GetFrameSP() const
93b9556accSGreg Clayton {
94af2589eaSGreg Clayton     if (m_opaque_sp)
957fdf9ef1SGreg Clayton         return m_opaque_sp->GetFrameSP();
96b57e4a1bSJason Molenda     return StackFrameSP();
97b9556accSGreg Clayton }
9830fdc8d8SChris Lattner 
9930fdc8d8SChris Lattner void
100b57e4a1bSJason Molenda SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp)
10130fdc8d8SChris Lattner {
1027fdf9ef1SGreg Clayton     return m_opaque_sp->SetFrameSP(lldb_object_sp);
103b9556accSGreg Clayton }
10430fdc8d8SChris Lattner 
10530fdc8d8SChris Lattner bool
10630fdc8d8SChris Lattner SBFrame::IsValid() const
10730fdc8d8SChris Lattner {
1087fdf9ef1SGreg Clayton     return GetFrameSP().get() != NULL;
10930fdc8d8SChris Lattner }
11030fdc8d8SChris Lattner 
11130fdc8d8SChris Lattner SBSymbolContext
11230fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const
11330fdc8d8SChris Lattner {
1145160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11530fdc8d8SChris Lattner     SBSymbolContext sb_sym_ctx;
1164fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1174fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1184fc6cb9cSJim Ingham 
119b57e4a1bSJason Molenda     StackFrame *frame = NULL;
120d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1217730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
1227730b9a4SJim Ingham     if (target && process)
123af67cecdSGreg Clayton     {
1247fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1257730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
1267730b9a4SJim Ingham         {
1277730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
1287730b9a4SJim Ingham             if (frame)
1297fdf9ef1SGreg Clayton             {
130d9e416c0SGreg Clayton                 sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope));
131af67cecdSGreg Clayton             }
132c9858e4dSGreg Clayton             else
133c9858e4dSGreg Clayton             {
134c9858e4dSGreg Clayton                 if (log)
1357730b9a4SJim Ingham                     log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
1367730b9a4SJim Ingham             }
1377730b9a4SJim Ingham         }
1387730b9a4SJim Ingham         else
1397730b9a4SJim Ingham         {
1407730b9a4SJim Ingham             if (log)
1417730b9a4SJim Ingham                 log->Printf ("SBFrame::GetSymbolContext () => error: process is running");
142c9858e4dSGreg Clayton         }
1437fdf9ef1SGreg Clayton     }
144ceb6b139SCaroline Tice 
145ceb6b139SCaroline Tice     if (log)
1464838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)",
147324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), resolve_scope,
148324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_sym_ctx.get()));
149ceb6b139SCaroline Tice 
15030fdc8d8SChris Lattner     return sb_sym_ctx;
15130fdc8d8SChris Lattner }
15230fdc8d8SChris Lattner 
15330fdc8d8SChris Lattner SBModule
15430fdc8d8SChris Lattner SBFrame::GetModule () const
15530fdc8d8SChris Lattner {
1565160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
15772eff18aSGreg Clayton     SBModule sb_module;
158acdbe816SGreg Clayton     ModuleSP module_sp;
1594fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1604fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1614fc6cb9cSJim Ingham 
162b57e4a1bSJason Molenda     StackFrame *frame = NULL;
163d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1647730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
1657730b9a4SJim Ingham     if (target && process)
166af67cecdSGreg Clayton     {
1677fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1687730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
1697730b9a4SJim Ingham         {
1707730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
1717730b9a4SJim Ingham             if (frame)
1727fdf9ef1SGreg Clayton             {
173d9e416c0SGreg Clayton                 module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp;
174acdbe816SGreg Clayton                 sb_module.SetSP (module_sp);
175af67cecdSGreg Clayton             }
176c9858e4dSGreg Clayton             else
177c9858e4dSGreg Clayton             {
178c9858e4dSGreg Clayton                 if (log)
1797730b9a4SJim Ingham                     log->Printf ("SBFrame::GetModule () => error: could not reconstruct frame object for this SBFrame.");
1807730b9a4SJim Ingham             }
1817730b9a4SJim Ingham         }
1827730b9a4SJim Ingham         else
1837730b9a4SJim Ingham         {
1847730b9a4SJim Ingham             if (log)
1857730b9a4SJim Ingham                 log->Printf ("SBFrame::GetModule () => error: process is running");
186c9858e4dSGreg Clayton         }
1877fdf9ef1SGreg Clayton     }
18872eff18aSGreg Clayton 
1894838131bSGreg Clayton     if (log)
1904838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
191324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
192324a1036SSaleem Abdulrasool                      static_cast<void*>(module_sp.get()));
1934838131bSGreg Clayton 
19430fdc8d8SChris Lattner     return sb_module;
19530fdc8d8SChris Lattner }
19630fdc8d8SChris Lattner 
19730fdc8d8SChris Lattner SBCompileUnit
19830fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
19930fdc8d8SChris Lattner {
2005160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
20172eff18aSGreg Clayton     SBCompileUnit sb_comp_unit;
2024fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2034fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2044fc6cb9cSJim Ingham 
205b57e4a1bSJason Molenda     StackFrame *frame = NULL;
206d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
2077730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
2087730b9a4SJim Ingham     if (target && process)
209af67cecdSGreg Clayton     {
2107fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2117730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
2127730b9a4SJim Ingham         {
2137730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
2147730b9a4SJim Ingham             if (frame)
2157fdf9ef1SGreg Clayton             {
216d9e416c0SGreg Clayton                 sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
217af67cecdSGreg Clayton             }
218c9858e4dSGreg Clayton             else
219c9858e4dSGreg Clayton             {
220ceb6b139SCaroline Tice                 if (log)
2217730b9a4SJim Ingham                     log->Printf ("SBFrame::GetCompileUnit () => error: could not reconstruct frame object for this SBFrame.");
2227730b9a4SJim Ingham             }
2237730b9a4SJim Ingham         }
2247730b9a4SJim Ingham         else
2257730b9a4SJim Ingham         {
2267730b9a4SJim Ingham             if (log)
2277730b9a4SJim Ingham                 log->Printf ("SBFrame::GetCompileUnit () => error: process is running");
228c9858e4dSGreg Clayton         }
229c9858e4dSGreg Clayton     }
230c9858e4dSGreg Clayton     if (log)
231c9858e4dSGreg Clayton         log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
232324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
233324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_comp_unit.get()));
234ceb6b139SCaroline Tice 
23530fdc8d8SChris Lattner     return sb_comp_unit;
23630fdc8d8SChris Lattner }
23730fdc8d8SChris Lattner 
23830fdc8d8SChris Lattner SBFunction
23930fdc8d8SChris Lattner SBFrame::GetFunction () const
24030fdc8d8SChris Lattner {
2415160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
24272eff18aSGreg Clayton     SBFunction sb_function;
2434fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2444fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2454fc6cb9cSJim Ingham 
246b57e4a1bSJason Molenda     StackFrame *frame = NULL;
247d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
2487730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
2497730b9a4SJim Ingham     if (target && process)
250af67cecdSGreg Clayton     {
2517fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2527730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
2537730b9a4SJim Ingham         {
2547730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
2557730b9a4SJim Ingham             if (frame)
2567fdf9ef1SGreg Clayton             {
257d9e416c0SGreg Clayton                 sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function);
258af67cecdSGreg Clayton             }
259c9858e4dSGreg Clayton             else
260c9858e4dSGreg Clayton             {
261c9858e4dSGreg Clayton                 if (log)
2627730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFunction () => error: could not reconstruct frame object for this SBFrame.");
2637730b9a4SJim Ingham             }
2647730b9a4SJim Ingham         }
2657730b9a4SJim Ingham         else
2667730b9a4SJim Ingham         {
2677730b9a4SJim Ingham             if (log)
2687730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFunction () => error: process is running");
2697fdf9ef1SGreg Clayton         }
270c9858e4dSGreg Clayton     }
2714838131bSGreg Clayton     if (log)
2724838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
273324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
274324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_function.get()));
2754838131bSGreg Clayton 
27630fdc8d8SChris Lattner     return sb_function;
27730fdc8d8SChris Lattner }
27830fdc8d8SChris Lattner 
2793b06557eSGreg Clayton SBSymbol
2803b06557eSGreg Clayton SBFrame::GetSymbol () const
2813b06557eSGreg Clayton {
2825160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
28372eff18aSGreg Clayton     SBSymbol sb_symbol;
2844fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2854fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2864fc6cb9cSJim Ingham 
287b57e4a1bSJason Molenda     StackFrame *frame = NULL;
288d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
2897730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
2907730b9a4SJim Ingham     if (target && process)
291af67cecdSGreg Clayton     {
2927fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2937730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
2947730b9a4SJim Ingham         {
2957730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
2967730b9a4SJim Ingham             if (frame)
2977fdf9ef1SGreg Clayton             {
298d9e416c0SGreg Clayton                 sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol);
299af67cecdSGreg Clayton             }
300c9858e4dSGreg Clayton             else
301c9858e4dSGreg Clayton             {
302c9858e4dSGreg Clayton                 if (log)
3037730b9a4SJim Ingham                     log->Printf ("SBFrame::GetSymbol () => error: could not reconstruct frame object for this SBFrame.");
3047730b9a4SJim Ingham             }
3057730b9a4SJim Ingham         }
3067730b9a4SJim Ingham         else
3077730b9a4SJim Ingham         {
3087730b9a4SJim Ingham             if (log)
3097730b9a4SJim Ingham                 log->Printf ("SBFrame::GetSymbol () => error: process is running");
3107fdf9ef1SGreg Clayton         }
311c9858e4dSGreg Clayton     }
3124838131bSGreg Clayton     if (log)
3134838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
314324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
315324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_symbol.get()));
3163b06557eSGreg Clayton     return sb_symbol;
3173b06557eSGreg Clayton }
3183b06557eSGreg Clayton 
31930fdc8d8SChris Lattner SBBlock
32030fdc8d8SChris Lattner SBFrame::GetBlock () const
32130fdc8d8SChris Lattner {
3225160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
32372eff18aSGreg Clayton     SBBlock sb_block;
3244fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3254fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3264fc6cb9cSJim Ingham 
327b57e4a1bSJason Molenda     StackFrame *frame = NULL;
328d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
3297730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
3307730b9a4SJim Ingham     if (target && process)
331af67cecdSGreg Clayton     {
3327fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3337730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
3347730b9a4SJim Ingham         {
3357730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
3367730b9a4SJim Ingham             if (frame)
3377fdf9ef1SGreg Clayton             {
338d9e416c0SGreg Clayton                 sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block);
339af67cecdSGreg Clayton             }
340c9858e4dSGreg Clayton             else
341c9858e4dSGreg Clayton             {
342c9858e4dSGreg Clayton                 if (log)
3437730b9a4SJim Ingham                     log->Printf ("SBFrame::GetBlock () => error: could not reconstruct frame object for this SBFrame.");
3447730b9a4SJim Ingham             }
3457730b9a4SJim Ingham         }
3467730b9a4SJim Ingham         else
3477730b9a4SJim Ingham         {
3487730b9a4SJim Ingham             if (log)
349324a1036SSaleem Abdulrasool                 log->Printf ("SBFrame(%p)::GetBlock () => error: process is running",
350324a1036SSaleem Abdulrasool                              static_cast<void*>(frame));
3517fdf9ef1SGreg Clayton         }
352c9858e4dSGreg Clayton     }
3534838131bSGreg Clayton     if (log)
3544838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
355324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
356324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_block.GetPtr()));
35730fdc8d8SChris Lattner     return sb_block;
35830fdc8d8SChris Lattner }
35930fdc8d8SChris Lattner 
36095897c6aSGreg Clayton SBBlock
36195897c6aSGreg Clayton SBFrame::GetFrameBlock () const
36295897c6aSGreg Clayton {
36372eff18aSGreg Clayton     SBBlock sb_block;
3644fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3654fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3664fc6cb9cSJim Ingham 
367b57e4a1bSJason Molenda     StackFrame *frame = NULL;
368d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
3695160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3707730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
3717730b9a4SJim Ingham     if (target && process)
372af67cecdSGreg Clayton     {
3737fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3747730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
3757730b9a4SJim Ingham         {
3767730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
3777730b9a4SJim Ingham             if (frame)
3787fdf9ef1SGreg Clayton             {
379d9e416c0SGreg Clayton                 sb_block.SetPtr(frame->GetFrameBlock ());
380af67cecdSGreg Clayton             }
381c9858e4dSGreg Clayton             else
382c9858e4dSGreg Clayton             {
383c9858e4dSGreg Clayton                 if (log)
3847730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFrameBlock () => error: could not reconstruct frame object for this SBFrame.");
3857730b9a4SJim Ingham             }
3867730b9a4SJim Ingham         }
3877730b9a4SJim Ingham         else
3887730b9a4SJim Ingham         {
3897730b9a4SJim Ingham             if (log)
3907730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFrameBlock () => error: process is running");
3917fdf9ef1SGreg Clayton         }
392c9858e4dSGreg Clayton     }
3934838131bSGreg Clayton     if (log)
3944838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
395324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
396324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_block.GetPtr()));
39795897c6aSGreg Clayton     return sb_block;
39895897c6aSGreg Clayton }
39995897c6aSGreg Clayton 
40030fdc8d8SChris Lattner SBLineEntry
40130fdc8d8SChris Lattner SBFrame::GetLineEntry () const
40230fdc8d8SChris Lattner {
4035160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
40472eff18aSGreg Clayton     SBLineEntry sb_line_entry;
4054fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4064fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4074fc6cb9cSJim Ingham 
408b57e4a1bSJason Molenda     StackFrame *frame = NULL;
409d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
4107730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
4117730b9a4SJim Ingham     if (target && process)
412af67cecdSGreg Clayton     {
4137fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4147730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
4157730b9a4SJim Ingham         {
4167730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
4177730b9a4SJim Ingham             if (frame)
4187fdf9ef1SGreg Clayton             {
419d9e416c0SGreg Clayton                 sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry);
420af67cecdSGreg Clayton             }
421c9858e4dSGreg Clayton             else
422c9858e4dSGreg Clayton             {
423c9858e4dSGreg Clayton                 if (log)
4247730b9a4SJim Ingham                     log->Printf ("SBFrame::GetLineEntry () => error: could not reconstruct frame object for this SBFrame.");
4257730b9a4SJim Ingham             }
4267730b9a4SJim Ingham         }
4277730b9a4SJim Ingham         else
4287730b9a4SJim Ingham         {
4297730b9a4SJim Ingham             if (log)
4307730b9a4SJim Ingham                 log->Printf ("SBFrame::GetLineEntry () => error: process is running");
4317fdf9ef1SGreg Clayton         }
432c9858e4dSGreg Clayton     }
4334838131bSGreg Clayton     if (log)
4344838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
435324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
436324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_line_entry.get()));
43730fdc8d8SChris Lattner     return sb_line_entry;
43830fdc8d8SChris Lattner }
43930fdc8d8SChris Lattner 
44030fdc8d8SChris Lattner uint32_t
44130fdc8d8SChris Lattner SBFrame::GetFrameID () const
44230fdc8d8SChris Lattner {
443b9556accSGreg Clayton     uint32_t frame_idx = UINT32_MAX;
444b9556accSGreg Clayton 
4457fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
446b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
4477fdf9ef1SGreg Clayton     if (frame)
448d9e416c0SGreg Clayton         frame_idx = frame->GetFrameIndex ();
4494838131bSGreg Clayton 
4505160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4514838131bSGreg Clayton     if (log)
4524838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameID () => %u",
453324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), frame_idx);
4544838131bSGreg Clayton     return frame_idx;
45530fdc8d8SChris Lattner }
45630fdc8d8SChris Lattner 
457424a5dbcSGreg Clayton lldb::addr_t
458424a5dbcSGreg Clayton SBFrame::GetCFA () const
459424a5dbcSGreg Clayton {
460424a5dbcSGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
461424a5dbcSGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
462424a5dbcSGreg Clayton     if (frame)
463424a5dbcSGreg Clayton         return frame->GetStackID().GetCallFrameAddress();
464424a5dbcSGreg Clayton     return LLDB_INVALID_ADDRESS;
465424a5dbcSGreg Clayton }
466424a5dbcSGreg Clayton 
467424a5dbcSGreg Clayton 
46869b582faSGreg Clayton addr_t
46930fdc8d8SChris Lattner SBFrame::GetPC () const
47030fdc8d8SChris Lattner {
4715160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
47269b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
4734fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4744fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4754fc6cb9cSJim Ingham 
476b57e4a1bSJason Molenda     StackFrame *frame = NULL;
477d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
4787730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
4797730b9a4SJim Ingham     if (target && process)
480af67cecdSGreg Clayton     {
4817fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4827730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
4837730b9a4SJim Ingham         {
4847730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
4857730b9a4SJim Ingham             if (frame)
4867fdf9ef1SGreg Clayton             {
48725b9f7ebSTamas Berghammer                 addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target, eAddressClassCode);
488af67cecdSGreg Clayton             }
489c9858e4dSGreg Clayton             else
490c9858e4dSGreg Clayton             {
491c9858e4dSGreg Clayton                 if (log)
4927730b9a4SJim Ingham                     log->Printf ("SBFrame::GetPC () => error: could not reconstruct frame object for this SBFrame.");
4937730b9a4SJim Ingham             }
4947730b9a4SJim Ingham         }
4957730b9a4SJim Ingham         else
4967730b9a4SJim Ingham         {
4977730b9a4SJim Ingham             if (log)
4987730b9a4SJim Ingham                 log->Printf ("SBFrame::GetPC () => error: process is running");
499c9858e4dSGreg Clayton         }
5007fdf9ef1SGreg Clayton     }
501ceb6b139SCaroline Tice 
502ceb6b139SCaroline Tice     if (log)
503324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetPC () => 0x%" PRIx64,
504324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), addr);
505ceb6b139SCaroline Tice 
506ceb6b139SCaroline Tice     return addr;
50730fdc8d8SChris Lattner }
50830fdc8d8SChris Lattner 
50930fdc8d8SChris Lattner bool
51069b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc)
51130fdc8d8SChris Lattner {
5125160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
513ceb6b139SCaroline Tice     bool ret_val = false;
5144fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5154fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5164fc6cb9cSJim Ingham 
517b57e4a1bSJason Molenda     StackFrame *frame = NULL;
518d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
5197730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
5207730b9a4SJim Ingham     if (target && process)
521af67cecdSGreg Clayton     {
5227fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5237730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5247730b9a4SJim Ingham         {
5257730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5267730b9a4SJim Ingham             if (frame)
5277fdf9ef1SGreg Clayton             {
528d9e416c0SGreg Clayton                 ret_val = frame->GetRegisterContext()->SetPC (new_pc);
529af67cecdSGreg Clayton             }
530c9858e4dSGreg Clayton             else
531c9858e4dSGreg Clayton             {
532c9858e4dSGreg Clayton                 if (log)
5337730b9a4SJim Ingham                     log->Printf ("SBFrame::SetPC () => error: could not reconstruct frame object for this SBFrame.");
5347730b9a4SJim Ingham             }
5357730b9a4SJim Ingham         }
5367730b9a4SJim Ingham         else
5377730b9a4SJim Ingham         {
5387730b9a4SJim Ingham             if (log)
5397730b9a4SJim Ingham                 log->Printf ("SBFrame::SetPC () => error: process is running");
540c9858e4dSGreg Clayton         }
5417fdf9ef1SGreg Clayton     }
542ceb6b139SCaroline Tice 
543ceb6b139SCaroline Tice     if (log)
544d01b2953SDaniel Malea         log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i",
545324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), new_pc, ret_val);
546ceb6b139SCaroline Tice 
547ceb6b139SCaroline Tice     return ret_val;
54830fdc8d8SChris Lattner }
54930fdc8d8SChris Lattner 
55069b582faSGreg Clayton addr_t
55130fdc8d8SChris Lattner SBFrame::GetSP () const
55230fdc8d8SChris Lattner {
5535160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5544838131bSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
5554fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5564fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5574fc6cb9cSJim Ingham 
558b57e4a1bSJason Molenda     StackFrame *frame = NULL;
559d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
5607730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
5617730b9a4SJim Ingham     if (target && process)
562af67cecdSGreg Clayton     {
5637fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5647730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5657730b9a4SJim Ingham         {
5667730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5677730b9a4SJim Ingham             if (frame)
5687fdf9ef1SGreg Clayton             {
569d9e416c0SGreg Clayton                 addr = frame->GetRegisterContext()->GetSP();
570af67cecdSGreg Clayton             }
571c9858e4dSGreg Clayton             else
572c9858e4dSGreg Clayton             {
573c9858e4dSGreg Clayton                 if (log)
5747730b9a4SJim Ingham                     log->Printf ("SBFrame::GetSP () => error: could not reconstruct frame object for this SBFrame.");
5757730b9a4SJim Ingham             }
5767730b9a4SJim Ingham         }
5777730b9a4SJim Ingham         else
5787730b9a4SJim Ingham         {
5797730b9a4SJim Ingham             if (log)
5807730b9a4SJim Ingham                 log->Printf ("SBFrame::GetSP () => error: process is running");
5817fdf9ef1SGreg Clayton         }
582c9858e4dSGreg Clayton     }
5834838131bSGreg Clayton     if (log)
584324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetSP () => 0x%" PRIx64,
585324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), addr);
5864838131bSGreg Clayton 
5874838131bSGreg Clayton     return addr;
58830fdc8d8SChris Lattner }
58930fdc8d8SChris Lattner 
59030fdc8d8SChris Lattner 
59169b582faSGreg Clayton addr_t
59230fdc8d8SChris Lattner SBFrame::GetFP () const
59330fdc8d8SChris Lattner {
5945160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
59569b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
5964fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5974fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5984fc6cb9cSJim Ingham 
599b57e4a1bSJason Molenda     StackFrame *frame = NULL;
600d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
6017730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
6027730b9a4SJim Ingham     if (target && process)
603af67cecdSGreg Clayton     {
6047fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6057730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
6067730b9a4SJim Ingham         {
6077730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
6087730b9a4SJim Ingham             if (frame)
6097fdf9ef1SGreg Clayton             {
610d9e416c0SGreg Clayton                 addr = frame->GetRegisterContext()->GetFP();
611af67cecdSGreg Clayton             }
612c9858e4dSGreg Clayton             else
613c9858e4dSGreg Clayton             {
614c9858e4dSGreg Clayton                 if (log)
6157730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFP () => error: could not reconstruct frame object for this SBFrame.");
6167730b9a4SJim Ingham             }
6177730b9a4SJim Ingham         }
6187730b9a4SJim Ingham         else
6197730b9a4SJim Ingham         {
6207730b9a4SJim Ingham             if (log)
6217730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFP () => error: process is running");
622c9858e4dSGreg Clayton         }
6237fdf9ef1SGreg Clayton     }
624ceb6b139SCaroline Tice 
625ceb6b139SCaroline Tice     if (log)
626324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetFP () => 0x%" PRIx64,
627324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), addr);
628ceb6b139SCaroline Tice     return addr;
62930fdc8d8SChris Lattner }
63030fdc8d8SChris Lattner 
63130fdc8d8SChris Lattner 
63230fdc8d8SChris Lattner SBAddress
63330fdc8d8SChris Lattner SBFrame::GetPCAddress () const
63430fdc8d8SChris Lattner {
6355160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
63630fdc8d8SChris Lattner     SBAddress sb_addr;
6374fc6cb9cSJim Ingham     Mutex::Locker api_locker;
6384fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
6394fc6cb9cSJim Ingham 
640b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
641d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
6427730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
6437730b9a4SJim Ingham     if (target && process)
644af67cecdSGreg Clayton     {
6457fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6467730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
6477730b9a4SJim Ingham         {
6487730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
6497730b9a4SJim Ingham             if (frame)
6507fdf9ef1SGreg Clayton             {
651d9e416c0SGreg Clayton                 sb_addr.SetAddress (&frame->GetFrameCodeAddress());
652af67cecdSGreg Clayton             }
653c9858e4dSGreg Clayton             else
654c9858e4dSGreg Clayton             {
655c9858e4dSGreg Clayton                 if (log)
6567730b9a4SJim Ingham                     log->Printf ("SBFrame::GetPCAddress () => error: could not reconstruct frame object for this SBFrame.");
6577730b9a4SJim Ingham             }
6587730b9a4SJim Ingham         }
6597730b9a4SJim Ingham         else
6607730b9a4SJim Ingham         {
6617730b9a4SJim Ingham             if (log)
6627730b9a4SJim Ingham                 log->Printf ("SBFrame::GetPCAddress () => error: process is running");
6637fdf9ef1SGreg Clayton         }
664c9858e4dSGreg Clayton     }
6654838131bSGreg Clayton     if (log)
666324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)",
667324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
668324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_addr.get()));
66930fdc8d8SChris Lattner     return sb_addr;
67030fdc8d8SChris Lattner }
67130fdc8d8SChris Lattner 
67230fdc8d8SChris Lattner void
67330fdc8d8SChris Lattner SBFrame::Clear()
67430fdc8d8SChris Lattner {
675af2589eaSGreg Clayton     m_opaque_sp->Clear();
67630fdc8d8SChris Lattner }
67730fdc8d8SChris Lattner 
6787edbdfc9SGreg Clayton lldb::SBValue
6797edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path)
6807edbdfc9SGreg Clayton {
6817edbdfc9SGreg Clayton     SBValue sb_value;
6827fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
683b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
684d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
685d9e416c0SGreg Clayton     if (frame && target)
6867edbdfc9SGreg Clayton     {
687d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
6887edbdfc9SGreg Clayton         sb_value = GetValueForVariablePath (var_path, use_dynamic);
6897edbdfc9SGreg Clayton     }
6907edbdfc9SGreg Clayton     return sb_value;
6917edbdfc9SGreg Clayton }
6927edbdfc9SGreg Clayton 
6937edbdfc9SGreg Clayton lldb::SBValue
6947edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic)
6957edbdfc9SGreg Clayton {
6967edbdfc9SGreg Clayton     SBValue sb_value;
6974fc6cb9cSJim Ingham     Mutex::Locker api_locker;
6985160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6997730b9a4SJim Ingham     if (var_path == NULL || var_path[0] == '\0')
7007730b9a4SJim Ingham     {
7017730b9a4SJim Ingham         if (log)
7027730b9a4SJim Ingham             log->Printf ("SBFrame::GetValueForVariablePath called with empty variable path.");
7037730b9a4SJim Ingham         return sb_value;
7047730b9a4SJim Ingham     }
7057730b9a4SJim Ingham 
7064fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
7074fc6cb9cSJim Ingham 
708b57e4a1bSJason Molenda     StackFrame *frame = NULL;
709d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
7107730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
7117730b9a4SJim Ingham     if (target && process)
7127edbdfc9SGreg Clayton     {
7137fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
7147730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
7157730b9a4SJim Ingham         {
7167730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
7177730b9a4SJim Ingham             if (frame)
7187fdf9ef1SGreg Clayton             {
7197edbdfc9SGreg Clayton                 VariableSP var_sp;
7207edbdfc9SGreg Clayton                 Error error;
721d9e416c0SGreg Clayton                 ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path,
722e3e91517SEnrico Granata                                                                                   eNoDynamicValues,
723b57e4a1bSJason Molenda                                                                                   StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
7247edbdfc9SGreg Clayton                                                                                   var_sp,
7257edbdfc9SGreg Clayton                                                                                   error));
726e3e91517SEnrico Granata                 sb_value.SetSP(value_sp, use_dynamic);
7277edbdfc9SGreg Clayton             }
728c9858e4dSGreg Clayton             else
729c9858e4dSGreg Clayton             {
730c9858e4dSGreg Clayton                 if (log)
7317730b9a4SJim Ingham                     log->Printf ("SBFrame::GetValueForVariablePath () => error: could not reconstruct frame object for this SBFrame.");
7327730b9a4SJim Ingham             }
7337730b9a4SJim Ingham         }
7347730b9a4SJim Ingham         else
7357730b9a4SJim Ingham         {
7367730b9a4SJim Ingham             if (log)
7377730b9a4SJim Ingham                 log->Printf ("SBFrame::GetValueForVariablePath () => error: process is running");
738c9858e4dSGreg Clayton         }
7397fdf9ef1SGreg Clayton     }
7407edbdfc9SGreg Clayton     return sb_value;
7417edbdfc9SGreg Clayton }
7427edbdfc9SGreg Clayton 
74330fdc8d8SChris Lattner SBValue
74469b582faSGreg Clayton SBFrame::FindVariable (const char *name)
74530fdc8d8SChris Lattner {
746316d498bSGreg Clayton     SBValue value;
7477fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
748b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
749d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
750d9e416c0SGreg Clayton     if (frame && target)
751316d498bSGreg Clayton     {
752d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
753316d498bSGreg Clayton         value = FindVariable (name, use_dynamic);
754316d498bSGreg Clayton     }
755316d498bSGreg Clayton     return value;
75678a685aaSJim Ingham }
75778a685aaSJim Ingham 
75878a685aaSJim Ingham SBValue
7592837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
76078a685aaSJim Ingham {
7615160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
76269b582faSGreg Clayton     VariableSP var_sp;
76358b59f95SJim Ingham     SBValue sb_value;
7647730b9a4SJim Ingham 
7657730b9a4SJim Ingham     if (name == NULL || name[0] == '\0')
7667730b9a4SJim Ingham     {
7677730b9a4SJim Ingham         if (log)
7687730b9a4SJim Ingham             log->Printf ("SBFrame::FindVariable called with empty name");
7697730b9a4SJim Ingham         return sb_value;
7707730b9a4SJim Ingham     }
7717730b9a4SJim Ingham 
77281e871edSGreg Clayton     ValueObjectSP value_sp;
7734fc6cb9cSJim Ingham     Mutex::Locker api_locker;
7744fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
7754fc6cb9cSJim Ingham 
776b57e4a1bSJason Molenda     StackFrame *frame = NULL;
777d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
7787730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
7797730b9a4SJim Ingham     if (target && process)
78030fdc8d8SChris Lattner     {
7817fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
7827730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
7837730b9a4SJim Ingham         {
7847730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
7857730b9a4SJim Ingham             if (frame)
7867fdf9ef1SGreg Clayton             {
78769b582faSGreg Clayton                 VariableList variable_list;
788d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
78930fdc8d8SChris Lattner 
79072eff18aSGreg Clayton                 if (sc.block)
79130fdc8d8SChris Lattner                 {
79272eff18aSGreg Clayton                     const bool can_create = true;
79372eff18aSGreg Clayton                     const bool get_parent_variables = true;
79472eff18aSGreg Clayton                     const bool stop_if_block_is_inlined_function = true;
79572eff18aSGreg Clayton 
79672eff18aSGreg Clayton                     if (sc.block->AppendVariables (can_create,
79772eff18aSGreg Clayton                                                    get_parent_variables,
79872eff18aSGreg Clayton                                                    stop_if_block_is_inlined_function,
79972eff18aSGreg Clayton                                                    &variable_list))
80072eff18aSGreg Clayton                     {
80169b582faSGreg Clayton                         var_sp = variable_list.FindVariable (ConstString(name));
80230fdc8d8SChris Lattner                     }
80372eff18aSGreg Clayton                 }
80430fdc8d8SChris Lattner 
8054838131bSGreg Clayton                 if (var_sp)
80681e871edSGreg Clayton                 {
807e3e91517SEnrico Granata                     value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues);
808e3e91517SEnrico Granata                     sb_value.SetSP(value_sp, use_dynamic);
80981e871edSGreg Clayton                 }
8107fdf9ef1SGreg Clayton             }
811c9858e4dSGreg Clayton             else
812c9858e4dSGreg Clayton             {
813c9858e4dSGreg Clayton                 if (log)
8147730b9a4SJim Ingham                     log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame.");
8157730b9a4SJim Ingham             }
8167730b9a4SJim Ingham         }
8177730b9a4SJim Ingham         else
8187730b9a4SJim Ingham         {
8197730b9a4SJim Ingham             if (log)
8207730b9a4SJim Ingham                 log->Printf ("SBFrame::FindVariable () => error: process is running");
821c9858e4dSGreg Clayton         }
822316d498bSGreg Clayton     }
823316d498bSGreg Clayton 
8244838131bSGreg Clayton     if (log)
82569b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
826324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), name,
827324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
8284838131bSGreg Clayton 
829dde9cff3SCaroline Tice     return sb_value;
830dde9cff3SCaroline Tice }
831dde9cff3SCaroline Tice 
83230fdc8d8SChris Lattner SBValue
83369b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type)
83430fdc8d8SChris Lattner {
835316d498bSGreg Clayton     SBValue value;
8367fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
837b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
838d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
839d9e416c0SGreg Clayton     if (frame && target)
840316d498bSGreg Clayton     {
841d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
842316d498bSGreg Clayton         value = FindValue (name, value_type, use_dynamic);
843316d498bSGreg Clayton     }
844316d498bSGreg Clayton     return value;
84578a685aaSJim Ingham }
84678a685aaSJim Ingham 
84778a685aaSJim Ingham SBValue
8482837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
84978a685aaSJim Ingham {
8505160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
85169b582faSGreg Clayton     SBValue sb_value;
8527730b9a4SJim Ingham 
8537730b9a4SJim Ingham     if (name == NULL || name[0] == '\0')
8547730b9a4SJim Ingham     {
8557730b9a4SJim Ingham         if (log)
8567730b9a4SJim Ingham             log->Printf ("SBFrame::FindValue called with empty name.");
8577730b9a4SJim Ingham         return sb_value;
8587730b9a4SJim Ingham     }
8597730b9a4SJim Ingham 
86081e871edSGreg Clayton     ValueObjectSP value_sp;
8614fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8624fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8634fc6cb9cSJim Ingham 
864b57e4a1bSJason Molenda     StackFrame *frame = NULL;
865d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
8667730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
8677730b9a4SJim Ingham     if (target && process)
86830fdc8d8SChris Lattner     {
8697fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8707730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
8717730b9a4SJim Ingham         {
8727730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
8737730b9a4SJim Ingham             if (frame)
8747fdf9ef1SGreg Clayton             {
8758a2a0dfbSEnrico Granata                 VariableList variable_list;
8768a2a0dfbSEnrico Granata 
87769b582faSGreg Clayton                 switch (value_type)
87830fdc8d8SChris Lattner                 {
87969b582faSGreg Clayton                 case eValueTypeVariableGlobal:      // global variable
88069b582faSGreg Clayton                 case eValueTypeVariableStatic:      // static variable
88169b582faSGreg Clayton                 case eValueTypeVariableArgument:    // function argument variables
88269b582faSGreg Clayton                 case eValueTypeVariableLocal:       // function local variables
88369b582faSGreg Clayton                     {
884d9e416c0SGreg Clayton                         SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
88572eff18aSGreg Clayton 
88672eff18aSGreg Clayton                         const bool can_create = true;
88772eff18aSGreg Clayton                         const bool get_parent_variables = true;
88872eff18aSGreg Clayton                         const bool stop_if_block_is_inlined_function = true;
88972eff18aSGreg Clayton 
8900efb51a0SChaoren Lin                         if (sc.block)
8910efb51a0SChaoren Lin                             sc.block->AppendVariables(can_create,
89272eff18aSGreg Clayton                                                       get_parent_variables,
89372eff18aSGreg Clayton                                                       stop_if_block_is_inlined_function,
8940efb51a0SChaoren Lin                                                       &variable_list);
8958a2a0dfbSEnrico Granata                         if (value_type == eValueTypeVariableGlobal)
8968a2a0dfbSEnrico Granata                         {
8978a2a0dfbSEnrico Granata                             const bool get_file_globals = true;
8988a2a0dfbSEnrico Granata                             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
8998a2a0dfbSEnrico Granata                             if (frame_vars)
9008a2a0dfbSEnrico Granata                                 frame_vars->AppendVariablesIfUnique(variable_list);
9018a2a0dfbSEnrico Granata                         }
90269b582faSGreg Clayton                         ConstString const_name(name);
90308a04327SEnrico Granata                         VariableSP variable_sp(variable_list.FindVariable(const_name, value_type));
90408a04327SEnrico Granata                         if (variable_sp)
905beae523aSJohnny Chen                         {
906e3e91517SEnrico Granata                             value_sp = frame->GetValueObjectForFrameVariable(variable_sp, eNoDynamicValues);
907e3e91517SEnrico Granata                             sb_value.SetSP(value_sp, use_dynamic);
90830fdc8d8SChris Lattner                         }
90930fdc8d8SChris Lattner                     }
91069b582faSGreg Clayton                     break;
91169b582faSGreg Clayton 
91269b582faSGreg Clayton                 case eValueTypeRegister:            // stack frame register value
91369b582faSGreg Clayton                     {
914d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
91569b582faSGreg Clayton                         if (reg_ctx)
91669b582faSGreg Clayton                         {
91769b582faSGreg Clayton                             const uint32_t num_regs = reg_ctx->GetRegisterCount();
91869b582faSGreg Clayton                             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
91969b582faSGreg Clayton                             {
92069b582faSGreg Clayton                                 const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
92169b582faSGreg Clayton                                 if (reg_info &&
92269b582faSGreg Clayton                                     ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
92369b582faSGreg Clayton                                      (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
92469b582faSGreg Clayton                                 {
925d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
92681e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
92781e871edSGreg Clayton                                     break;
92869b582faSGreg Clayton                                 }
92969b582faSGreg Clayton                             }
93069b582faSGreg Clayton                         }
93169b582faSGreg Clayton                     }
93269b582faSGreg Clayton                     break;
93369b582faSGreg Clayton 
93469b582faSGreg Clayton                 case eValueTypeRegisterSet:         // A collection of stack frame register values
93569b582faSGreg Clayton                     {
936d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
93769b582faSGreg Clayton                         if (reg_ctx)
93869b582faSGreg Clayton                         {
93969b582faSGreg Clayton                             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
94069b582faSGreg Clayton                             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
94169b582faSGreg Clayton                             {
94269b582faSGreg Clayton                                 const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
94369b582faSGreg Clayton                                 if (reg_set &&
94469b582faSGreg Clayton                                     ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
94569b582faSGreg Clayton                                      (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
94669b582faSGreg Clayton                                 {
947d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
94881e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
94981e871edSGreg Clayton                                     break;
95069b582faSGreg Clayton                                 }
95169b582faSGreg Clayton                             }
95269b582faSGreg Clayton                         }
95369b582faSGreg Clayton                     }
95469b582faSGreg Clayton                     break;
95569b582faSGreg Clayton 
95669b582faSGreg Clayton                 case eValueTypeConstResult:         // constant result variables
95769b582faSGreg Clayton                     {
95869b582faSGreg Clayton                         ConstString const_name(name);
959bc8ac34eSSean Callanan                         ExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name));
96069b582faSGreg Clayton                         if (expr_var_sp)
96181e871edSGreg Clayton                         {
96281e871edSGreg Clayton                             value_sp = expr_var_sp->GetValueObject();
963e3e91517SEnrico Granata                             sb_value.SetSP (value_sp, use_dynamic);
96481e871edSGreg Clayton                         }
96569b582faSGreg Clayton                     }
96669b582faSGreg Clayton                     break;
96769b582faSGreg Clayton 
96869b582faSGreg Clayton                 default:
96969b582faSGreg Clayton                     break;
97069b582faSGreg Clayton                 }
971beae523aSJohnny Chen             }
972c9858e4dSGreg Clayton             else
973c9858e4dSGreg Clayton             {
974c9858e4dSGreg Clayton                 if (log)
9757730b9a4SJim Ingham                     log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame.");
9767730b9a4SJim Ingham             }
9777730b9a4SJim Ingham         }
9787730b9a4SJim Ingham         else
9797730b9a4SJim Ingham         {
9807730b9a4SJim Ingham             if (log)
9817730b9a4SJim Ingham                 log->Printf ("SBFrame::FindValue () => error: process is running");
982c9858e4dSGreg Clayton         }
9837fdf9ef1SGreg Clayton     }
984dde9cff3SCaroline Tice 
9854838131bSGreg Clayton     if (log)
98669b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
987324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), name, value_type,
988324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
9894838131bSGreg Clayton 
990dde9cff3SCaroline Tice     return sb_value;
991dde9cff3SCaroline Tice }
992dde9cff3SCaroline Tice 
99330fdc8d8SChris Lattner bool
99435e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const
99535e2ab60SJohnny Chen {
996b57e4a1bSJason Molenda     lldb::StackFrameSP this_sp = GetFrameSP();
997b57e4a1bSJason Molenda     lldb::StackFrameSP that_sp = that.GetFrameSP();
99835e2ab60SJohnny Chen     return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
99935e2ab60SJohnny Chen }
100035e2ab60SJohnny Chen 
100135e2ab60SJohnny Chen bool
100230fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
100330fdc8d8SChris Lattner {
100435e2ab60SJohnny Chen     return IsEqual(rhs);
100530fdc8d8SChris Lattner }
100630fdc8d8SChris Lattner 
100730fdc8d8SChris Lattner bool
100830fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
100930fdc8d8SChris Lattner {
101035e2ab60SJohnny Chen     return !IsEqual(rhs);
1011481cef25SGreg Clayton }
101230fdc8d8SChris Lattner 
101330fdc8d8SChris Lattner SBThread
101430fdc8d8SChris Lattner SBFrame::GetThread () const
101530fdc8d8SChris Lattner {
10165160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1017ceb6b139SCaroline Tice 
10187fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1019d9e416c0SGreg Clayton     ThreadSP thread_sp (exe_ctx.GetThreadSP());
1020d9e416c0SGreg Clayton     SBThread sb_thread (thread_sp);
1021ceb6b139SCaroline Tice 
1022ceb6b139SCaroline Tice     if (log)
1023750cd175SCaroline Tice     {
1024750cd175SCaroline Tice         SBStream sstr;
1025750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
1026d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
1027324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetFramePtr()),
1028324a1036SSaleem Abdulrasool                      static_cast<void*>(thread_sp.get()), sstr.GetData());
1029750cd175SCaroline Tice     }
1030ceb6b139SCaroline Tice 
103130fdc8d8SChris Lattner     return sb_thread;
103230fdc8d8SChris Lattner }
103330fdc8d8SChris Lattner 
103430fdc8d8SChris Lattner const char *
103530fdc8d8SChris Lattner SBFrame::Disassemble () const
103630fdc8d8SChris Lattner {
10375160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10384838131bSGreg Clayton     const char *disassembly = NULL;
10394fc6cb9cSJim Ingham     Mutex::Locker api_locker;
10404fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
10414fc6cb9cSJim Ingham 
1042b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1043d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
10447730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
10457730b9a4SJim Ingham     if (target && process)
1046af67cecdSGreg Clayton     {
10477fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10487730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
10497730b9a4SJim Ingham         {
10507730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
10517730b9a4SJim Ingham             if (frame)
10527fdf9ef1SGreg Clayton             {
1053d9e416c0SGreg Clayton                 disassembly = frame->Disassemble();
1054af67cecdSGreg Clayton             }
1055c9858e4dSGreg Clayton             else
1056c9858e4dSGreg Clayton             {
1057c9858e4dSGreg Clayton                 if (log)
10587730b9a4SJim Ingham                     log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame.");
10597730b9a4SJim Ingham             }
10607730b9a4SJim Ingham         }
10617730b9a4SJim Ingham         else
10627730b9a4SJim Ingham         {
10637730b9a4SJim Ingham             if (log)
10647730b9a4SJim Ingham                 log->Printf ("SBFrame::Disassemble () => error: process is running");
10657fdf9ef1SGreg Clayton         }
1066c9858e4dSGreg Clayton     }
10674838131bSGreg Clayton 
10684838131bSGreg Clayton     if (log)
1069324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::Disassemble () => %s",
1070324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), disassembly);
10714838131bSGreg Clayton 
10724838131bSGreg Clayton     return disassembly;
107330fdc8d8SChris Lattner }
107430fdc8d8SChris Lattner 
107530fdc8d8SChris Lattner 
107630fdc8d8SChris Lattner SBValueList
107730fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
107830fdc8d8SChris Lattner                        bool locals,
107930fdc8d8SChris Lattner                        bool statics,
108030fdc8d8SChris Lattner                        bool in_scope_only)
108130fdc8d8SChris Lattner {
1082316d498bSGreg Clayton     SBValueList value_list;
10837fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1084b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
1085d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1086d9e416c0SGreg Clayton     if (frame && target)
1087316d498bSGreg Clayton     {
1088d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
108951f96eebSZachary Turner         const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false;
109051f96eebSZachary Turner 
109151f96eebSZachary Turner         SBVariablesOptions options;
109251f96eebSZachary Turner         options.SetIncludeArguments(arguments);
109351f96eebSZachary Turner         options.SetIncludeLocals(locals);
109451f96eebSZachary Turner         options.SetIncludeStatics(statics);
109551f96eebSZachary Turner         options.SetInScopeOnly(in_scope_only);
109651f96eebSZachary Turner         options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
109751f96eebSZachary Turner         options.SetUseDynamic(use_dynamic);
109851f96eebSZachary Turner 
109951f96eebSZachary Turner         value_list = GetVariables (options);
1100316d498bSGreg Clayton     }
1101316d498bSGreg Clayton     return value_list;
110278a685aaSJim Ingham }
110378a685aaSJim Ingham 
1104560558ebSEnrico Granata lldb::SBValueList
1105560558ebSEnrico Granata SBFrame::GetVariables (bool arguments,
1106560558ebSEnrico Granata                        bool locals,
1107560558ebSEnrico Granata                        bool statics,
1108560558ebSEnrico Granata                        bool in_scope_only,
1109560558ebSEnrico Granata                        lldb::DynamicValueType  use_dynamic)
1110560558ebSEnrico Granata {
1111560558ebSEnrico Granata     ExecutionContext exe_ctx(m_opaque_sp.get());
1112560558ebSEnrico Granata     Target *target = exe_ctx.GetTargetPtr();
111351f96eebSZachary Turner     const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false;
111451f96eebSZachary Turner     SBVariablesOptions options;
111551f96eebSZachary Turner     options.SetIncludeArguments(arguments);
111651f96eebSZachary Turner     options.SetIncludeLocals(locals);
111751f96eebSZachary Turner     options.SetIncludeStatics(statics);
111851f96eebSZachary Turner     options.SetInScopeOnly(in_scope_only);
111951f96eebSZachary Turner     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
112051f96eebSZachary Turner     options.SetUseDynamic(use_dynamic);
112151f96eebSZachary Turner     return GetVariables(options);
1122560558ebSEnrico Granata }
1123560558ebSEnrico Granata 
112478a685aaSJim Ingham SBValueList
112551f96eebSZachary Turner SBFrame::GetVariables (const lldb::SBVariablesOptions& options)
112678a685aaSJim Ingham {
11275160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1128ceb6b139SCaroline Tice 
1129b9556accSGreg Clayton     SBValueList value_list;
11304fc6cb9cSJim Ingham     Mutex::Locker api_locker;
11314fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
11324fc6cb9cSJim Ingham 
1133b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1134d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1135b9556accSGreg Clayton 
113651f96eebSZachary Turner     const bool statics = options.GetIncludeStatics();
113751f96eebSZachary Turner     const bool arguments = options.GetIncludeArguments();
113851f96eebSZachary Turner     const bool locals = options.GetIncludeLocals();
113951f96eebSZachary Turner     const bool in_scope_only = options.GetInScopeOnly();
114051f96eebSZachary Turner     const bool include_runtime_support_values = options.GetIncludeRuntimeSupportValues();
114151f96eebSZachary Turner     const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
114251f96eebSZachary Turner 
1143ceb6b139SCaroline Tice     if (log)
114451f96eebSZachary Turner         log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)",
114551f96eebSZachary Turner                      arguments, locals,
114651f96eebSZachary Turner                      statics, in_scope_only,
114751f96eebSZachary Turner                      include_runtime_support_values, use_dynamic);
1148ceb6b139SCaroline Tice 
11497730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
11507730b9a4SJim Ingham     if (target && process)
115130fdc8d8SChris Lattner     {
11527fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11537730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
11547fdf9ef1SGreg Clayton         {
11557730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
11567730b9a4SJim Ingham             if (frame)
11577730b9a4SJim Ingham             {
115830fdc8d8SChris Lattner                 size_t i;
1159af67cecdSGreg Clayton                 VariableList *variable_list = NULL;
1160d9e416c0SGreg Clayton                 variable_list = frame->GetVariableList(true);
116130fdc8d8SChris Lattner                 if (variable_list)
116230fdc8d8SChris Lattner                 {
116330fdc8d8SChris Lattner                     const size_t num_variables = variable_list->GetSize();
116430fdc8d8SChris Lattner                     if (num_variables)
116530fdc8d8SChris Lattner                     {
116630fdc8d8SChris Lattner                         for (i = 0; i < num_variables; ++i)
116730fdc8d8SChris Lattner                         {
116830fdc8d8SChris Lattner                             VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
116930fdc8d8SChris Lattner                             if (variable_sp)
117030fdc8d8SChris Lattner                             {
117130fdc8d8SChris Lattner                                 bool add_variable = false;
117230fdc8d8SChris Lattner                                 switch (variable_sp->GetScope())
117330fdc8d8SChris Lattner                                 {
117430fdc8d8SChris Lattner                                 case eValueTypeVariableGlobal:
117530fdc8d8SChris Lattner                                 case eValueTypeVariableStatic:
117630fdc8d8SChris Lattner                                     add_variable = statics;
117730fdc8d8SChris Lattner                                     break;
117830fdc8d8SChris Lattner 
117930fdc8d8SChris Lattner                                 case eValueTypeVariableArgument:
118030fdc8d8SChris Lattner                                     add_variable = arguments;
118130fdc8d8SChris Lattner                                     break;
118230fdc8d8SChris Lattner 
118330fdc8d8SChris Lattner                                 case eValueTypeVariableLocal:
118430fdc8d8SChris Lattner                                     add_variable = locals;
118530fdc8d8SChris Lattner                                     break;
1186c982c768SGreg Clayton 
1187c982c768SGreg Clayton                                 default:
1188c982c768SGreg Clayton                                     break;
118930fdc8d8SChris Lattner                                 }
119030fdc8d8SChris Lattner                                 if (add_variable)
119130fdc8d8SChris Lattner                                 {
1192d9e416c0SGreg Clayton                                     if (in_scope_only && !variable_sp->IsInScope(frame))
119330fdc8d8SChris Lattner                                         continue;
119430fdc8d8SChris Lattner 
1195e3e91517SEnrico Granata                                     ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues));
1196560558ebSEnrico Granata 
1197560558ebSEnrico Granata                                     if (false == include_runtime_support_values &&
1198560558ebSEnrico Granata                                         valobj_sp &&
1199560558ebSEnrico Granata                                         true == valobj_sp->IsRuntimeSupportValue())
1200560558ebSEnrico Granata                                         continue;
1201560558ebSEnrico Granata 
1202e3e91517SEnrico Granata                                     SBValue value_sb;
1203e3e91517SEnrico Granata                                     value_sb.SetSP(valobj_sp,use_dynamic);
1204e3e91517SEnrico Granata                                     value_list.Append(value_sb);
120530fdc8d8SChris Lattner                                 }
120630fdc8d8SChris Lattner                             }
120730fdc8d8SChris Lattner                         }
120830fdc8d8SChris Lattner                     }
120930fdc8d8SChris Lattner                 }
121030fdc8d8SChris Lattner             }
1211c9858e4dSGreg Clayton             else
1212c9858e4dSGreg Clayton             {
1213c9858e4dSGreg Clayton                 if (log)
12147730b9a4SJim Ingham                     log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
12157730b9a4SJim Ingham             }
12167730b9a4SJim Ingham         }
12177730b9a4SJim Ingham         else
12187730b9a4SJim Ingham         {
12197730b9a4SJim Ingham             if (log)
12207730b9a4SJim Ingham                 log->Printf ("SBFrame::GetVariables () => error: process is running");
1221c9858e4dSGreg Clayton         }
12227fdf9ef1SGreg Clayton     }
1223ceb6b139SCaroline Tice 
1224ceb6b139SCaroline Tice     if (log)
1225324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)",
1226324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1227324a1036SSaleem Abdulrasool                      static_cast<void*>(value_list.opaque_ptr()));
1228ceb6b139SCaroline Tice 
122930fdc8d8SChris Lattner     return value_list;
123030fdc8d8SChris Lattner }
123130fdc8d8SChris Lattner 
123269b582faSGreg Clayton SBValueList
123330fdc8d8SChris Lattner SBFrame::GetRegisters ()
123430fdc8d8SChris Lattner {
12355160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1236ceb6b139SCaroline Tice 
123730fdc8d8SChris Lattner     SBValueList value_list;
12384fc6cb9cSJim Ingham     Mutex::Locker api_locker;
12394fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
12404fc6cb9cSJim Ingham 
1241b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1242d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
12437730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
12447730b9a4SJim Ingham     if (target && process)
124530fdc8d8SChris Lattner     {
12467fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
12477730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
12487730b9a4SJim Ingham         {
12497730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
12507730b9a4SJim Ingham             if (frame)
12517fdf9ef1SGreg Clayton             {
1252d9e416c0SGreg Clayton                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
125330fdc8d8SChris Lattner                 if (reg_ctx)
125430fdc8d8SChris Lattner                 {
125530fdc8d8SChris Lattner                     const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
125630fdc8d8SChris Lattner                     for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
125730fdc8d8SChris Lattner                     {
1258d9e416c0SGreg Clayton                         value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
125930fdc8d8SChris Lattner                     }
126030fdc8d8SChris Lattner                 }
126130fdc8d8SChris Lattner             }
1262c9858e4dSGreg Clayton             else
1263c9858e4dSGreg Clayton             {
1264c9858e4dSGreg Clayton                 if (log)
12657730b9a4SJim Ingham                     log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame.");
12667730b9a4SJim Ingham             }
12677730b9a4SJim Ingham         }
12687730b9a4SJim Ingham         else
12697730b9a4SJim Ingham         {
12707730b9a4SJim Ingham             if (log)
12717730b9a4SJim Ingham                 log->Printf ("SBFrame::GetRegisters () => error: process is running");
1272c9858e4dSGreg Clayton         }
12737fdf9ef1SGreg Clayton     }
1274ceb6b139SCaroline Tice 
1275ceb6b139SCaroline Tice     if (log)
1276324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)",
1277324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1278324a1036SSaleem Abdulrasool                      static_cast<void*>(value_list.opaque_ptr()));
1279ceb6b139SCaroline Tice 
128030fdc8d8SChris Lattner     return value_list;
128130fdc8d8SChris Lattner }
128230fdc8d8SChris Lattner 
1283ad9a53c5SJason Molenda SBValue
1284ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name)
1285ad9a53c5SJason Molenda {
1286ad9a53c5SJason Molenda     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1287ad9a53c5SJason Molenda 
1288ad9a53c5SJason Molenda     SBValue result;
1289ad9a53c5SJason Molenda     ValueObjectSP value_sp;
1290ad9a53c5SJason Molenda     Mutex::Locker api_locker;
1291ad9a53c5SJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1292ad9a53c5SJason Molenda 
1293b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1294ad9a53c5SJason Molenda     Target *target = exe_ctx.GetTargetPtr();
1295ad9a53c5SJason Molenda     Process *process = exe_ctx.GetProcessPtr();
1296ad9a53c5SJason Molenda     if (target && process)
1297ad9a53c5SJason Molenda     {
1298ad9a53c5SJason Molenda         Process::StopLocker stop_locker;
1299ad9a53c5SJason Molenda         if (stop_locker.TryLock(&process->GetRunLock()))
1300ad9a53c5SJason Molenda         {
1301ad9a53c5SJason Molenda             frame = exe_ctx.GetFramePtr();
1302ad9a53c5SJason Molenda             if (frame)
1303ad9a53c5SJason Molenda             {
1304ad9a53c5SJason Molenda                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
1305ad9a53c5SJason Molenda                 if (reg_ctx)
1306ad9a53c5SJason Molenda                 {
1307ad9a53c5SJason Molenda                     const uint32_t num_regs = reg_ctx->GetRegisterCount();
1308ad9a53c5SJason Molenda                     for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
1309ad9a53c5SJason Molenda                     {
1310ad9a53c5SJason Molenda                         const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
1311ad9a53c5SJason Molenda                         if (reg_info &&
1312ad9a53c5SJason Molenda                             ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
1313ad9a53c5SJason Molenda                              (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
1314ad9a53c5SJason Molenda                         {
1315ad9a53c5SJason Molenda                             value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
1316ad9a53c5SJason Molenda                             result.SetSP (value_sp);
1317ad9a53c5SJason Molenda                             break;
1318ad9a53c5SJason Molenda                         }
1319ad9a53c5SJason Molenda                     }
1320ad9a53c5SJason Molenda                 }
1321ad9a53c5SJason Molenda             }
1322ad9a53c5SJason Molenda             else
1323ad9a53c5SJason Molenda             {
1324ad9a53c5SJason Molenda                 if (log)
13255d353842SJason Molenda                     log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame.");
1326ad9a53c5SJason Molenda             }
1327ad9a53c5SJason Molenda         }
1328ad9a53c5SJason Molenda         else
1329ad9a53c5SJason Molenda         {
1330ad9a53c5SJason Molenda             if (log)
13315d353842SJason Molenda                 log->Printf ("SBFrame::FindRegister () => error: process is running");
1332ad9a53c5SJason Molenda         }
1333ad9a53c5SJason Molenda     }
1334ad9a53c5SJason Molenda 
1335ad9a53c5SJason Molenda     if (log)
1336324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)",
1337324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1338324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
1339ad9a53c5SJason Molenda 
1340ad9a53c5SJason Molenda     return result;
1341ad9a53c5SJason Molenda }
1342ad9a53c5SJason Molenda 
1343dde9cff3SCaroline Tice bool
1344dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
1345dde9cff3SCaroline Tice {
13465160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1347da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1348da7bc7d0SGreg Clayton 
13494fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13504fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13514fc6cb9cSJim Ingham 
1352b57e4a1bSJason Molenda     StackFrame *frame;
1353d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
13547730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
13557730b9a4SJim Ingham     if (target && process)
1356dde9cff3SCaroline Tice     {
13577fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13587730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
13597730b9a4SJim Ingham         {
13607730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
13617730b9a4SJim Ingham             if (frame)
13627fdf9ef1SGreg Clayton             {
1363d9e416c0SGreg Clayton                 frame->DumpUsingSettingsFormat (&strm);
1364dde9cff3SCaroline Tice             }
1365c9858e4dSGreg Clayton             else
1366c9858e4dSGreg Clayton             {
1367c9858e4dSGreg Clayton                 if (log)
13687730b9a4SJim Ingham                     log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame.");
13697730b9a4SJim Ingham             }
13707730b9a4SJim Ingham         }
13717730b9a4SJim Ingham         else
13727730b9a4SJim Ingham         {
13737730b9a4SJim Ingham             if (log)
13747730b9a4SJim Ingham                 log->Printf ("SBFrame::GetDescription () => error: process is running");
1375c9858e4dSGreg Clayton         }
1376c9858e4dSGreg Clayton 
13777fdf9ef1SGreg Clayton     }
1378dde9cff3SCaroline Tice     else
1379da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1380dde9cff3SCaroline Tice 
1381dde9cff3SCaroline Tice     return true;
1382dde9cff3SCaroline Tice }
13831d3afba3SGreg Clayton 
138469b582faSGreg Clayton SBValue
13851d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
13861d3afba3SGreg Clayton {
1387316d498bSGreg Clayton     SBValue result;
13887fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1389b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
1390d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1391d9e416c0SGreg Clayton     if (frame && target)
1392316d498bSGreg Clayton     {
139335e1bda6SJim Ingham         SBExpressionOptions options;
139435e1bda6SJim Ingham         lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue();
1395cced1566SGreg Clayton         options.SetFetchDynamicValue (fetch_dynamic_value);
139635e1bda6SJim Ingham         options.SetUnwindOnError (true);
139735e1bda6SJim Ingham         return EvaluateExpression (expr, options);
1398316d498bSGreg Clayton     }
1399316d498bSGreg Clayton     return result;
140078a685aaSJim Ingham }
140178a685aaSJim Ingham 
140278a685aaSJim Ingham SBValue
14032837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
140478a685aaSJim Ingham {
140535e1bda6SJim Ingham     SBExpressionOptions options;
1406cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
140735e1bda6SJim Ingham     options.SetUnwindOnError (true);
140835e1bda6SJim Ingham     return EvaluateExpression (expr, options);
14097ba6e991SJim Ingham }
14107ba6e991SJim Ingham 
14117ba6e991SJim Ingham SBValue
14127ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error)
14137ba6e991SJim Ingham {
141435e1bda6SJim Ingham     SBExpressionOptions options;
1415cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
141635e1bda6SJim Ingham     options.SetUnwindOnError (unwind_on_error);
141735e1bda6SJim Ingham     return EvaluateExpression (expr, options);
141835e1bda6SJim Ingham }
141935e1bda6SJim Ingham 
142035e1bda6SJim Ingham lldb::SBValue
142135e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options)
142235e1bda6SJim Ingham {
14235160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14244838131bSGreg Clayton 
14255160ce5cSGreg Clayton     Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1426a162ebafSSean Callanan 
14278646d3c1SJim Ingham     ExpressionResults exe_results = eExpressionSetupError;
142869b582faSGreg Clayton     SBValue expr_result;
14297730b9a4SJim Ingham 
14307730b9a4SJim Ingham     if (expr == NULL || expr[0] == '\0')
14317730b9a4SJim Ingham     {
14327730b9a4SJim Ingham         if (log)
14337730b9a4SJim Ingham             log->Printf ("SBFrame::EvaluateExpression called with an empty expression");
14347730b9a4SJim Ingham         return expr_result;
14357730b9a4SJim Ingham     }
14367730b9a4SJim Ingham 
143781e871edSGreg Clayton     ValueObjectSP expr_value_sp;
14384838131bSGreg Clayton 
14394fc6cb9cSJim Ingham     Mutex::Locker api_locker;
14404fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
14414fc6cb9cSJim Ingham 
1442b9556accSGreg Clayton     if (log)
14437730b9a4SJim Ingham         log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
1444b9556accSGreg Clayton 
1445b57e4a1bSJason Molenda     StackFrame *frame = NULL;
14467730b9a4SJim Ingham     Target *target = exe_ctx.GetTargetPtr();
14477730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
14487730b9a4SJim Ingham 
14497730b9a4SJim Ingham     if (target && process)
14501d3afba3SGreg Clayton     {
14517fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
14527730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
14537730b9a4SJim Ingham         {
14547730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
14557730b9a4SJim Ingham             if (frame)
14567fdf9ef1SGreg Clayton             {
1457fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1458fb6621efSGreg Clayton                 {
14591ba7c4d0SGreg Clayton                     StreamString frame_description;
1460d9e416c0SGreg Clayton                     frame->DumpUsingSettingsFormat (&frame_description);
14611ba7c4d0SGreg Clayton                     Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
1462cced1566SGreg Clayton                                                          expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str());
1463fb6621efSGreg Clayton                 }
1464fb6621efSGreg Clayton 
1465d9e416c0SGreg Clayton                 exe_results = target->EvaluateExpression (expr,
1466d9e416c0SGreg Clayton                                                           frame,
1467d4439aa9SEnrico Granata                                                           expr_value_sp,
146835e1bda6SJim Ingham                                                           options.ref());
1469e3e91517SEnrico Granata                 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1470fb6621efSGreg Clayton 
1471fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1472f49e65aeSGreg Clayton                     Host::SetCrashDescription (NULL);
14731d3afba3SGreg Clayton             }
1474c9858e4dSGreg Clayton             else
1475c9858e4dSGreg Clayton             {
1476c9858e4dSGreg Clayton                 if (log)
14777730b9a4SJim Ingham                     log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame.");
14787730b9a4SJim Ingham             }
14797730b9a4SJim Ingham         }
14807730b9a4SJim Ingham         else
14817730b9a4SJim Ingham         {
14827730b9a4SJim Ingham             if (log)
14837730b9a4SJim Ingham                 log->Printf ("SBFrame::EvaluateExpression () => error: process is running");
1484c9858e4dSGreg Clayton         }
14857fdf9ef1SGreg Clayton     }
14864838131bSGreg Clayton 
1487cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1488a162ebafSSean Callanan     if (expr_log)
148978a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
1490324a1036SSaleem Abdulrasool                          expr_result.GetValue(), expr_result.GetSummary());
1491a162ebafSSean Callanan 
14924838131bSGreg Clayton     if (log)
1493d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1494324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), expr,
1495324a1036SSaleem Abdulrasool                      static_cast<void*>(expr_value_sp.get()), exe_results);
1496cf7e2dc0SJason Molenda #endif
14974838131bSGreg Clayton 
1498cfd1acedSGreg Clayton     return expr_result;
14991d3afba3SGreg Clayton }
1500316d498bSGreg Clayton 
1501316d498bSGreg Clayton bool
15026345fe3eSOleksiy Vyalov SBFrame::IsInlined()
1503316d498bSGreg Clayton {
150405f75e9fSOleksiy Vyalov     return static_cast<const SBFrame*>(this)->IsInlined();
150505f75e9fSOleksiy Vyalov }
150605f75e9fSOleksiy Vyalov 
150705f75e9fSOleksiy Vyalov bool
150805f75e9fSOleksiy Vyalov SBFrame::IsInlined() const
150905f75e9fSOleksiy Vyalov {
15105160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
15117fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1512b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1513d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
15147730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
15157730b9a4SJim Ingham     if (target && process)
1516316d498bSGreg Clayton     {
15177fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
15187730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
15197730b9a4SJim Ingham         {
15207730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
15217730b9a4SJim Ingham             if (frame)
15227fdf9ef1SGreg Clayton             {
15237fdf9ef1SGreg Clayton 
1524d9e416c0SGreg Clayton                 Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1525316d498bSGreg Clayton                 if (block)
1526316d498bSGreg Clayton                     return block->GetContainingInlinedBlock () != NULL;
1527316d498bSGreg Clayton             }
1528c9858e4dSGreg Clayton             else
1529c9858e4dSGreg Clayton             {
1530c9858e4dSGreg Clayton                 if (log)
15317730b9a4SJim Ingham                     log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame.");
15327730b9a4SJim Ingham             }
15337730b9a4SJim Ingham         }
15347730b9a4SJim Ingham         else
15357730b9a4SJim Ingham         {
15367730b9a4SJim Ingham             if (log)
15377730b9a4SJim Ingham                 log->Printf ("SBFrame::IsInlined () => error: process is running");
1538c9858e4dSGreg Clayton         }
1539c9858e4dSGreg Clayton 
15407fdf9ef1SGreg Clayton     }
1541316d498bSGreg Clayton     return false;
1542316d498bSGreg Clayton }
1543316d498bSGreg Clayton 
1544316d498bSGreg Clayton const char *
15456345fe3eSOleksiy Vyalov SBFrame::GetFunctionName()
1546316d498bSGreg Clayton {
154705f75e9fSOleksiy Vyalov     return static_cast<const SBFrame*>(this)->GetFunctionName();
154805f75e9fSOleksiy Vyalov }
154905f75e9fSOleksiy Vyalov 
155005f75e9fSOleksiy Vyalov const char *
155105f75e9fSOleksiy Vyalov SBFrame::GetFunctionName() const
155205f75e9fSOleksiy Vyalov {
15535160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1554316d498bSGreg Clayton     const char *name = NULL;
15557fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1556b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1557d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
15587730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
15597730b9a4SJim Ingham     if (target && process)
1560316d498bSGreg Clayton     {
15617fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
15627730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
15637730b9a4SJim Ingham         {
15647730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
15657730b9a4SJim Ingham             if (frame)
15667fdf9ef1SGreg Clayton             {
1567d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1568316d498bSGreg Clayton                 if (sc.block)
1569316d498bSGreg Clayton                 {
1570316d498bSGreg Clayton                     Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1571316d498bSGreg Clayton                     if (inlined_block)
1572316d498bSGreg Clayton                     {
1573316d498bSGreg Clayton                         const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1574ddaf6a72SGreg Clayton                         name = inlined_info->GetName(sc.function->GetLanguage()).AsCString();
1575316d498bSGreg Clayton                     }
1576316d498bSGreg Clayton                 }
1577316d498bSGreg Clayton 
1578316d498bSGreg Clayton                 if (name == NULL)
1579316d498bSGreg Clayton                 {
1580316d498bSGreg Clayton                     if (sc.function)
1581316d498bSGreg Clayton                         name = sc.function->GetName().GetCString();
1582316d498bSGreg Clayton                 }
1583316d498bSGreg Clayton 
1584316d498bSGreg Clayton                 if (name == NULL)
1585316d498bSGreg Clayton                 {
1586316d498bSGreg Clayton                     if (sc.symbol)
1587316d498bSGreg Clayton                         name = sc.symbol->GetName().GetCString();
1588316d498bSGreg Clayton                 }
1589316d498bSGreg Clayton             }
1590c9858e4dSGreg Clayton             else
1591c9858e4dSGreg Clayton             {
1592c9858e4dSGreg Clayton                 if (log)
15937730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame.");
15947730b9a4SJim Ingham             }
15957730b9a4SJim Ingham         }
15967730b9a4SJim Ingham         else
15977730b9a4SJim Ingham         {
15987730b9a4SJim Ingham             if (log)
15997730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFunctionName() => error: process is running");
1600c9858e4dSGreg Clayton 
1601c9858e4dSGreg Clayton         }
16027fdf9ef1SGreg Clayton     }
1603316d498bSGreg Clayton     return name;
1604316d498bSGreg Clayton }
1605c1f705c2SEnrico Granata 
1606c1f705c2SEnrico Granata const char *
1607c1f705c2SEnrico Granata SBFrame::GetDisplayFunctionName()
1608c1f705c2SEnrico Granata {
1609c1f705c2SEnrico Granata     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1610c1f705c2SEnrico Granata     const char *name = NULL;
1611c1f705c2SEnrico Granata     ExecutionContext exe_ctx(m_opaque_sp.get());
1612c1f705c2SEnrico Granata     StackFrame *frame = NULL;
1613c1f705c2SEnrico Granata     Target *target = exe_ctx.GetTargetPtr();
1614c1f705c2SEnrico Granata     Process *process = exe_ctx.GetProcessPtr();
1615c1f705c2SEnrico Granata     if (target && process)
1616c1f705c2SEnrico Granata     {
1617c1f705c2SEnrico Granata         Process::StopLocker stop_locker;
1618c1f705c2SEnrico Granata         if (stop_locker.TryLock(&process->GetRunLock()))
1619c1f705c2SEnrico Granata         {
1620c1f705c2SEnrico Granata             frame = exe_ctx.GetFramePtr();
1621c1f705c2SEnrico Granata             if (frame)
1622c1f705c2SEnrico Granata             {
1623c1f705c2SEnrico Granata                 SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1624c1f705c2SEnrico Granata                 if (sc.block)
1625c1f705c2SEnrico Granata                 {
1626c1f705c2SEnrico Granata                     Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1627c1f705c2SEnrico Granata                     if (inlined_block)
1628c1f705c2SEnrico Granata                     {
1629c1f705c2SEnrico Granata                         const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1630ddaf6a72SGreg Clayton                         name = inlined_info->GetDisplayName(sc.function->GetLanguage()).AsCString();
1631c1f705c2SEnrico Granata                     }
1632c1f705c2SEnrico Granata                 }
1633c1f705c2SEnrico Granata 
1634c1f705c2SEnrico Granata                 if (name == NULL)
1635c1f705c2SEnrico Granata                 {
1636c1f705c2SEnrico Granata                     if (sc.function)
1637c1f705c2SEnrico Granata                         name = sc.function->GetDisplayName().GetCString();
1638c1f705c2SEnrico Granata                 }
1639c1f705c2SEnrico Granata 
1640c1f705c2SEnrico Granata                 if (name == NULL)
1641c1f705c2SEnrico Granata                 {
1642c1f705c2SEnrico Granata                     if (sc.symbol)
1643c1f705c2SEnrico Granata                         name = sc.symbol->GetDisplayName().GetCString();
1644c1f705c2SEnrico Granata                 }
1645c1f705c2SEnrico Granata             }
1646c1f705c2SEnrico Granata             else
1647c1f705c2SEnrico Granata             {
1648c1f705c2SEnrico Granata                 if (log)
1649c1f705c2SEnrico Granata                     log->Printf ("SBFrame::GetDisplayFunctionName () => error: could not reconstruct frame object for this SBFrame.");
1650c1f705c2SEnrico Granata             }
1651c1f705c2SEnrico Granata         }
1652c1f705c2SEnrico Granata         else
1653c1f705c2SEnrico Granata         {
1654c1f705c2SEnrico Granata             if (log)
1655c1f705c2SEnrico Granata                 log->Printf ("SBFrame::GetDisplayFunctionName() => error: process is running");
1656c1f705c2SEnrico Granata 
1657c1f705c2SEnrico Granata         }
1658c1f705c2SEnrico Granata     }
1659c1f705c2SEnrico Granata     return name;
1660c1f705c2SEnrico Granata }
1661