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"
24af0f45f1SZachary Turner #include "lldb/Expression/ClangPersistentVariables.h"
25b71f3844SGreg Clayton #include "lldb/Expression/ClangUserExpression.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 
45769b582faSGreg Clayton addr_t
45830fdc8d8SChris Lattner SBFrame::GetPC () const
45930fdc8d8SChris Lattner {
4605160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
46169b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
4624fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4634fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4644fc6cb9cSJim Ingham 
465b57e4a1bSJason Molenda     StackFrame *frame = NULL;
466d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
4677730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
4687730b9a4SJim Ingham     if (target && process)
469af67cecdSGreg Clayton     {
4707fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4717730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
4727730b9a4SJim Ingham         {
4737730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
4747730b9a4SJim Ingham             if (frame)
4757fdf9ef1SGreg Clayton             {
476d9e416c0SGreg Clayton                 addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target);
477af67cecdSGreg Clayton             }
478c9858e4dSGreg Clayton             else
479c9858e4dSGreg Clayton             {
480c9858e4dSGreg Clayton                 if (log)
4817730b9a4SJim Ingham                     log->Printf ("SBFrame::GetPC () => error: could not reconstruct frame object for this SBFrame.");
4827730b9a4SJim Ingham             }
4837730b9a4SJim Ingham         }
4847730b9a4SJim Ingham         else
4857730b9a4SJim Ingham         {
4867730b9a4SJim Ingham             if (log)
4877730b9a4SJim Ingham                 log->Printf ("SBFrame::GetPC () => error: process is running");
488c9858e4dSGreg Clayton         }
4897fdf9ef1SGreg Clayton     }
490ceb6b139SCaroline Tice 
491ceb6b139SCaroline Tice     if (log)
492324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetPC () => 0x%" PRIx64,
493324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), addr);
494ceb6b139SCaroline Tice 
495ceb6b139SCaroline Tice     return addr;
49630fdc8d8SChris Lattner }
49730fdc8d8SChris Lattner 
49830fdc8d8SChris Lattner bool
49969b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc)
50030fdc8d8SChris Lattner {
5015160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
502ceb6b139SCaroline Tice     bool ret_val = false;
5034fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5044fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5054fc6cb9cSJim Ingham 
506b57e4a1bSJason Molenda     StackFrame *frame = NULL;
507d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
5087730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
5097730b9a4SJim Ingham     if (target && process)
510af67cecdSGreg Clayton     {
5117fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5127730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5137730b9a4SJim Ingham         {
5147730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5157730b9a4SJim Ingham             if (frame)
5167fdf9ef1SGreg Clayton             {
517d9e416c0SGreg Clayton                 ret_val = frame->GetRegisterContext()->SetPC (new_pc);
518af67cecdSGreg Clayton             }
519c9858e4dSGreg Clayton             else
520c9858e4dSGreg Clayton             {
521c9858e4dSGreg Clayton                 if (log)
5227730b9a4SJim Ingham                     log->Printf ("SBFrame::SetPC () => error: could not reconstruct frame object for this SBFrame.");
5237730b9a4SJim Ingham             }
5247730b9a4SJim Ingham         }
5257730b9a4SJim Ingham         else
5267730b9a4SJim Ingham         {
5277730b9a4SJim Ingham             if (log)
5287730b9a4SJim Ingham                 log->Printf ("SBFrame::SetPC () => error: process is running");
529c9858e4dSGreg Clayton         }
5307fdf9ef1SGreg Clayton     }
531ceb6b139SCaroline Tice 
532ceb6b139SCaroline Tice     if (log)
533d01b2953SDaniel Malea         log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i",
534324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), new_pc, ret_val);
535ceb6b139SCaroline Tice 
536ceb6b139SCaroline Tice     return ret_val;
53730fdc8d8SChris Lattner }
53830fdc8d8SChris Lattner 
53969b582faSGreg Clayton addr_t
54030fdc8d8SChris Lattner SBFrame::GetSP () const
54130fdc8d8SChris Lattner {
5425160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5434838131bSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
5444fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5454fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5464fc6cb9cSJim Ingham 
547b57e4a1bSJason Molenda     StackFrame *frame = NULL;
548d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
5497730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
5507730b9a4SJim Ingham     if (target && process)
551af67cecdSGreg Clayton     {
5527fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5537730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5547730b9a4SJim Ingham         {
5557730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5567730b9a4SJim Ingham             if (frame)
5577fdf9ef1SGreg Clayton             {
558d9e416c0SGreg Clayton                 addr = frame->GetRegisterContext()->GetSP();
559af67cecdSGreg Clayton             }
560c9858e4dSGreg Clayton             else
561c9858e4dSGreg Clayton             {
562c9858e4dSGreg Clayton                 if (log)
5637730b9a4SJim Ingham                     log->Printf ("SBFrame::GetSP () => error: could not reconstruct frame object for this SBFrame.");
5647730b9a4SJim Ingham             }
5657730b9a4SJim Ingham         }
5667730b9a4SJim Ingham         else
5677730b9a4SJim Ingham         {
5687730b9a4SJim Ingham             if (log)
5697730b9a4SJim Ingham                 log->Printf ("SBFrame::GetSP () => error: process is running");
5707fdf9ef1SGreg Clayton         }
571c9858e4dSGreg Clayton     }
5724838131bSGreg Clayton     if (log)
573324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetSP () => 0x%" PRIx64,
574324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), addr);
5754838131bSGreg Clayton 
5764838131bSGreg Clayton     return addr;
57730fdc8d8SChris Lattner }
57830fdc8d8SChris Lattner 
57930fdc8d8SChris Lattner 
58069b582faSGreg Clayton addr_t
58130fdc8d8SChris Lattner SBFrame::GetFP () const
58230fdc8d8SChris Lattner {
5835160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
58469b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
5854fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5864fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5874fc6cb9cSJim Ingham 
588b57e4a1bSJason Molenda     StackFrame *frame = NULL;
589d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
5907730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
5917730b9a4SJim Ingham     if (target && process)
592af67cecdSGreg Clayton     {
5937fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5947730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5957730b9a4SJim Ingham         {
5967730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5977730b9a4SJim Ingham             if (frame)
5987fdf9ef1SGreg Clayton             {
599d9e416c0SGreg Clayton                 addr = frame->GetRegisterContext()->GetFP();
600af67cecdSGreg Clayton             }
601c9858e4dSGreg Clayton             else
602c9858e4dSGreg Clayton             {
603c9858e4dSGreg Clayton                 if (log)
6047730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFP () => error: could not reconstruct frame object for this SBFrame.");
6057730b9a4SJim Ingham             }
6067730b9a4SJim Ingham         }
6077730b9a4SJim Ingham         else
6087730b9a4SJim Ingham         {
6097730b9a4SJim Ingham             if (log)
6107730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFP () => error: process is running");
611c9858e4dSGreg Clayton         }
6127fdf9ef1SGreg Clayton     }
613ceb6b139SCaroline Tice 
614ceb6b139SCaroline Tice     if (log)
615324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetFP () => 0x%" PRIx64,
616324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), addr);
617ceb6b139SCaroline Tice     return addr;
61830fdc8d8SChris Lattner }
61930fdc8d8SChris Lattner 
62030fdc8d8SChris Lattner 
62130fdc8d8SChris Lattner SBAddress
62230fdc8d8SChris Lattner SBFrame::GetPCAddress () const
62330fdc8d8SChris Lattner {
6245160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
62530fdc8d8SChris Lattner     SBAddress sb_addr;
6264fc6cb9cSJim Ingham     Mutex::Locker api_locker;
6274fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
6284fc6cb9cSJim Ingham 
629b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
630d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
6317730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
6327730b9a4SJim Ingham     if (target && process)
633af67cecdSGreg Clayton     {
6347fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6357730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
6367730b9a4SJim Ingham         {
6377730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
6387730b9a4SJim Ingham             if (frame)
6397fdf9ef1SGreg Clayton             {
640d9e416c0SGreg Clayton                 sb_addr.SetAddress (&frame->GetFrameCodeAddress());
641af67cecdSGreg Clayton             }
642c9858e4dSGreg Clayton             else
643c9858e4dSGreg Clayton             {
644c9858e4dSGreg Clayton                 if (log)
6457730b9a4SJim Ingham                     log->Printf ("SBFrame::GetPCAddress () => error: could not reconstruct frame object for this SBFrame.");
6467730b9a4SJim Ingham             }
6477730b9a4SJim Ingham         }
6487730b9a4SJim Ingham         else
6497730b9a4SJim Ingham         {
6507730b9a4SJim Ingham             if (log)
6517730b9a4SJim Ingham                 log->Printf ("SBFrame::GetPCAddress () => error: process is running");
6527fdf9ef1SGreg Clayton         }
653c9858e4dSGreg Clayton     }
6544838131bSGreg Clayton     if (log)
655324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)",
656324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
657324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_addr.get()));
65830fdc8d8SChris Lattner     return sb_addr;
65930fdc8d8SChris Lattner }
66030fdc8d8SChris Lattner 
66130fdc8d8SChris Lattner void
66230fdc8d8SChris Lattner SBFrame::Clear()
66330fdc8d8SChris Lattner {
664af2589eaSGreg Clayton     m_opaque_sp->Clear();
66530fdc8d8SChris Lattner }
66630fdc8d8SChris Lattner 
6677edbdfc9SGreg Clayton lldb::SBValue
6687edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path)
6697edbdfc9SGreg Clayton {
6707edbdfc9SGreg Clayton     SBValue sb_value;
6717fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
672b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
673d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
674d9e416c0SGreg Clayton     if (frame && target)
6757edbdfc9SGreg Clayton     {
676d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
6777edbdfc9SGreg Clayton         sb_value = GetValueForVariablePath (var_path, use_dynamic);
6787edbdfc9SGreg Clayton     }
6797edbdfc9SGreg Clayton     return sb_value;
6807edbdfc9SGreg Clayton }
6817edbdfc9SGreg Clayton 
6827edbdfc9SGreg Clayton lldb::SBValue
6837edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic)
6847edbdfc9SGreg Clayton {
6857edbdfc9SGreg Clayton     SBValue sb_value;
6864fc6cb9cSJim Ingham     Mutex::Locker api_locker;
6875160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6887730b9a4SJim Ingham     if (var_path == NULL || var_path[0] == '\0')
6897730b9a4SJim Ingham     {
6907730b9a4SJim Ingham         if (log)
6917730b9a4SJim Ingham             log->Printf ("SBFrame::GetValueForVariablePath called with empty variable path.");
6927730b9a4SJim Ingham         return sb_value;
6937730b9a4SJim Ingham     }
6947730b9a4SJim Ingham 
6954fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
6964fc6cb9cSJim Ingham 
697b57e4a1bSJason Molenda     StackFrame *frame = NULL;
698d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
6997730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
7007730b9a4SJim Ingham     if (target && process)
7017edbdfc9SGreg Clayton     {
7027fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
7037730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
7047730b9a4SJim Ingham         {
7057730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
7067730b9a4SJim Ingham             if (frame)
7077fdf9ef1SGreg Clayton             {
7087edbdfc9SGreg Clayton                 VariableSP var_sp;
7097edbdfc9SGreg Clayton                 Error error;
710d9e416c0SGreg Clayton                 ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path,
711e3e91517SEnrico Granata                                                                                   eNoDynamicValues,
712b57e4a1bSJason Molenda                                                                                   StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
7137edbdfc9SGreg Clayton                                                                                   var_sp,
7147edbdfc9SGreg Clayton                                                                                   error));
715e3e91517SEnrico Granata                 sb_value.SetSP(value_sp, use_dynamic);
7167edbdfc9SGreg Clayton             }
717c9858e4dSGreg Clayton             else
718c9858e4dSGreg Clayton             {
719c9858e4dSGreg Clayton                 if (log)
7207730b9a4SJim Ingham                     log->Printf ("SBFrame::GetValueForVariablePath () => error: could not reconstruct frame object for this SBFrame.");
7217730b9a4SJim Ingham             }
7227730b9a4SJim Ingham         }
7237730b9a4SJim Ingham         else
7247730b9a4SJim Ingham         {
7257730b9a4SJim Ingham             if (log)
7267730b9a4SJim Ingham                 log->Printf ("SBFrame::GetValueForVariablePath () => error: process is running");
727c9858e4dSGreg Clayton         }
7287fdf9ef1SGreg Clayton     }
7297edbdfc9SGreg Clayton     return sb_value;
7307edbdfc9SGreg Clayton }
7317edbdfc9SGreg Clayton 
73230fdc8d8SChris Lattner SBValue
73369b582faSGreg Clayton SBFrame::FindVariable (const char *name)
73430fdc8d8SChris Lattner {
735316d498bSGreg Clayton     SBValue value;
7367fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
737b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
738d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
739d9e416c0SGreg Clayton     if (frame && target)
740316d498bSGreg Clayton     {
741d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
742316d498bSGreg Clayton         value = FindVariable (name, use_dynamic);
743316d498bSGreg Clayton     }
744316d498bSGreg Clayton     return value;
74578a685aaSJim Ingham }
74678a685aaSJim Ingham 
74778a685aaSJim Ingham SBValue
7482837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
74978a685aaSJim Ingham {
7505160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
75169b582faSGreg Clayton     VariableSP var_sp;
75258b59f95SJim Ingham     SBValue sb_value;
7537730b9a4SJim Ingham 
7547730b9a4SJim Ingham     if (name == NULL || name[0] == '\0')
7557730b9a4SJim Ingham     {
7567730b9a4SJim Ingham         if (log)
7577730b9a4SJim Ingham             log->Printf ("SBFrame::FindVariable called with empty name");
7587730b9a4SJim Ingham         return sb_value;
7597730b9a4SJim Ingham     }
7607730b9a4SJim Ingham 
76181e871edSGreg Clayton     ValueObjectSP value_sp;
7624fc6cb9cSJim Ingham     Mutex::Locker api_locker;
7634fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
7644fc6cb9cSJim Ingham 
765b57e4a1bSJason Molenda     StackFrame *frame = NULL;
766d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
7677730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
7687730b9a4SJim Ingham     if (target && process)
76930fdc8d8SChris Lattner     {
7707fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
7717730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
7727730b9a4SJim Ingham         {
7737730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
7747730b9a4SJim Ingham             if (frame)
7757fdf9ef1SGreg Clayton             {
77669b582faSGreg Clayton                 VariableList variable_list;
777d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
77830fdc8d8SChris Lattner 
77972eff18aSGreg Clayton                 if (sc.block)
78030fdc8d8SChris Lattner                 {
78172eff18aSGreg Clayton                     const bool can_create = true;
78272eff18aSGreg Clayton                     const bool get_parent_variables = true;
78372eff18aSGreg Clayton                     const bool stop_if_block_is_inlined_function = true;
78472eff18aSGreg Clayton 
78572eff18aSGreg Clayton                     if (sc.block->AppendVariables (can_create,
78672eff18aSGreg Clayton                                                    get_parent_variables,
78772eff18aSGreg Clayton                                                    stop_if_block_is_inlined_function,
78872eff18aSGreg Clayton                                                    &variable_list))
78972eff18aSGreg Clayton                     {
79069b582faSGreg Clayton                         var_sp = variable_list.FindVariable (ConstString(name));
79130fdc8d8SChris Lattner                     }
79272eff18aSGreg Clayton                 }
79330fdc8d8SChris Lattner 
7944838131bSGreg Clayton                 if (var_sp)
79581e871edSGreg Clayton                 {
796e3e91517SEnrico Granata                     value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues);
797e3e91517SEnrico Granata                     sb_value.SetSP(value_sp, use_dynamic);
79881e871edSGreg Clayton                 }
7997fdf9ef1SGreg Clayton             }
800c9858e4dSGreg Clayton             else
801c9858e4dSGreg Clayton             {
802c9858e4dSGreg Clayton                 if (log)
8037730b9a4SJim Ingham                     log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame.");
8047730b9a4SJim Ingham             }
8057730b9a4SJim Ingham         }
8067730b9a4SJim Ingham         else
8077730b9a4SJim Ingham         {
8087730b9a4SJim Ingham             if (log)
8097730b9a4SJim Ingham                 log->Printf ("SBFrame::FindVariable () => error: process is running");
810c9858e4dSGreg Clayton         }
811316d498bSGreg Clayton     }
812316d498bSGreg Clayton 
8134838131bSGreg Clayton     if (log)
81469b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
815324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), name,
816324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
8174838131bSGreg Clayton 
818dde9cff3SCaroline Tice     return sb_value;
819dde9cff3SCaroline Tice }
820dde9cff3SCaroline Tice 
82130fdc8d8SChris Lattner SBValue
82269b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type)
82330fdc8d8SChris Lattner {
824316d498bSGreg Clayton     SBValue value;
8257fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
826b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
827d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
828d9e416c0SGreg Clayton     if (frame && target)
829316d498bSGreg Clayton     {
830d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
831316d498bSGreg Clayton         value = FindValue (name, value_type, use_dynamic);
832316d498bSGreg Clayton     }
833316d498bSGreg Clayton     return value;
83478a685aaSJim Ingham }
83578a685aaSJim Ingham 
83678a685aaSJim Ingham SBValue
8372837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
83878a685aaSJim Ingham {
8395160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
84069b582faSGreg Clayton     SBValue sb_value;
8417730b9a4SJim Ingham 
8427730b9a4SJim Ingham     if (name == NULL || name[0] == '\0')
8437730b9a4SJim Ingham     {
8447730b9a4SJim Ingham         if (log)
8457730b9a4SJim Ingham             log->Printf ("SBFrame::FindValue called with empty name.");
8467730b9a4SJim Ingham         return sb_value;
8477730b9a4SJim Ingham     }
8487730b9a4SJim Ingham 
84981e871edSGreg Clayton     ValueObjectSP value_sp;
8504fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8514fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8524fc6cb9cSJim Ingham 
853b57e4a1bSJason Molenda     StackFrame *frame = NULL;
854d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
8557730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
8567730b9a4SJim Ingham     if (target && process)
85730fdc8d8SChris Lattner     {
8587fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8597730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
8607730b9a4SJim Ingham         {
8617730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
8627730b9a4SJim Ingham             if (frame)
8637fdf9ef1SGreg Clayton             {
8648a2a0dfbSEnrico Granata                 VariableList variable_list;
8658a2a0dfbSEnrico Granata 
86669b582faSGreg Clayton                 switch (value_type)
86730fdc8d8SChris Lattner                 {
86869b582faSGreg Clayton                 case eValueTypeVariableGlobal:      // global variable
86969b582faSGreg Clayton                 case eValueTypeVariableStatic:      // static variable
87069b582faSGreg Clayton                 case eValueTypeVariableArgument:    // function argument variables
87169b582faSGreg Clayton                 case eValueTypeVariableLocal:       // function local variables
87269b582faSGreg Clayton                     {
873d9e416c0SGreg Clayton                         SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock));
87472eff18aSGreg Clayton 
87572eff18aSGreg Clayton                         const bool can_create = true;
87672eff18aSGreg Clayton                         const bool get_parent_variables = true;
87772eff18aSGreg Clayton                         const bool stop_if_block_is_inlined_function = true;
87872eff18aSGreg Clayton 
879*0efb51a0SChaoren Lin                         if (sc.block)
880*0efb51a0SChaoren Lin                             sc.block->AppendVariables(can_create,
88172eff18aSGreg Clayton                                                       get_parent_variables,
88272eff18aSGreg Clayton                                                       stop_if_block_is_inlined_function,
883*0efb51a0SChaoren Lin                                                       &variable_list);
8848a2a0dfbSEnrico Granata                         if (value_type == eValueTypeVariableGlobal)
8858a2a0dfbSEnrico Granata                         {
8868a2a0dfbSEnrico Granata                             const bool get_file_globals = true;
8878a2a0dfbSEnrico Granata                             VariableList *frame_vars = frame->GetVariableList(get_file_globals);
8888a2a0dfbSEnrico Granata                             if (frame_vars)
8898a2a0dfbSEnrico Granata                                 frame_vars->AppendVariablesIfUnique(variable_list);
8908a2a0dfbSEnrico Granata                         }
89169b582faSGreg Clayton                         ConstString const_name(name);
89208a04327SEnrico Granata                         VariableSP variable_sp(variable_list.FindVariable(const_name, value_type));
89308a04327SEnrico Granata                         if (variable_sp)
894beae523aSJohnny Chen                         {
895e3e91517SEnrico Granata                             value_sp = frame->GetValueObjectForFrameVariable(variable_sp, eNoDynamicValues);
896e3e91517SEnrico Granata                             sb_value.SetSP(value_sp, use_dynamic);
89730fdc8d8SChris Lattner                         }
89830fdc8d8SChris Lattner                     }
89969b582faSGreg Clayton                     break;
90069b582faSGreg Clayton 
90169b582faSGreg Clayton                 case eValueTypeRegister:            // stack frame register value
90269b582faSGreg Clayton                     {
903d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
90469b582faSGreg Clayton                         if (reg_ctx)
90569b582faSGreg Clayton                         {
90669b582faSGreg Clayton                             const uint32_t num_regs = reg_ctx->GetRegisterCount();
90769b582faSGreg Clayton                             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
90869b582faSGreg Clayton                             {
90969b582faSGreg Clayton                                 const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
91069b582faSGreg Clayton                                 if (reg_info &&
91169b582faSGreg Clayton                                     ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
91269b582faSGreg Clayton                                      (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
91369b582faSGreg Clayton                                 {
914d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
91581e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
91681e871edSGreg Clayton                                     break;
91769b582faSGreg Clayton                                 }
91869b582faSGreg Clayton                             }
91969b582faSGreg Clayton                         }
92069b582faSGreg Clayton                     }
92169b582faSGreg Clayton                     break;
92269b582faSGreg Clayton 
92369b582faSGreg Clayton                 case eValueTypeRegisterSet:         // A collection of stack frame register values
92469b582faSGreg Clayton                     {
925d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
92669b582faSGreg Clayton                         if (reg_ctx)
92769b582faSGreg Clayton                         {
92869b582faSGreg Clayton                             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
92969b582faSGreg Clayton                             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
93069b582faSGreg Clayton                             {
93169b582faSGreg Clayton                                 const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
93269b582faSGreg Clayton                                 if (reg_set &&
93369b582faSGreg Clayton                                     ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
93469b582faSGreg Clayton                                      (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
93569b582faSGreg Clayton                                 {
936d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
93781e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
93881e871edSGreg Clayton                                     break;
93969b582faSGreg Clayton                                 }
94069b582faSGreg Clayton                             }
94169b582faSGreg Clayton                         }
94269b582faSGreg Clayton                     }
94369b582faSGreg Clayton                     break;
94469b582faSGreg Clayton 
94569b582faSGreg Clayton                 case eValueTypeConstResult:         // constant result variables
94669b582faSGreg Clayton                     {
94769b582faSGreg Clayton                         ConstString const_name(name);
948d9e416c0SGreg Clayton                         ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name));
94969b582faSGreg Clayton                         if (expr_var_sp)
95081e871edSGreg Clayton                         {
95181e871edSGreg Clayton                             value_sp = expr_var_sp->GetValueObject();
952e3e91517SEnrico Granata                             sb_value.SetSP (value_sp, use_dynamic);
95381e871edSGreg Clayton                         }
95469b582faSGreg Clayton                     }
95569b582faSGreg Clayton                     break;
95669b582faSGreg Clayton 
95769b582faSGreg Clayton                 default:
95869b582faSGreg Clayton                     break;
95969b582faSGreg Clayton                 }
960beae523aSJohnny Chen             }
961c9858e4dSGreg Clayton             else
962c9858e4dSGreg Clayton             {
963c9858e4dSGreg Clayton                 if (log)
9647730b9a4SJim Ingham                     log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame.");
9657730b9a4SJim Ingham             }
9667730b9a4SJim Ingham         }
9677730b9a4SJim Ingham         else
9687730b9a4SJim Ingham         {
9697730b9a4SJim Ingham             if (log)
9707730b9a4SJim Ingham                 log->Printf ("SBFrame::FindValue () => error: process is running");
971c9858e4dSGreg Clayton         }
9727fdf9ef1SGreg Clayton     }
973dde9cff3SCaroline Tice 
9744838131bSGreg Clayton     if (log)
97569b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
976324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), name, value_type,
977324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
9784838131bSGreg Clayton 
979dde9cff3SCaroline Tice     return sb_value;
980dde9cff3SCaroline Tice }
981dde9cff3SCaroline Tice 
98230fdc8d8SChris Lattner bool
98335e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const
98435e2ab60SJohnny Chen {
985b57e4a1bSJason Molenda     lldb::StackFrameSP this_sp = GetFrameSP();
986b57e4a1bSJason Molenda     lldb::StackFrameSP that_sp = that.GetFrameSP();
98735e2ab60SJohnny Chen     return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
98835e2ab60SJohnny Chen }
98935e2ab60SJohnny Chen 
99035e2ab60SJohnny Chen bool
99130fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
99230fdc8d8SChris Lattner {
99335e2ab60SJohnny Chen     return IsEqual(rhs);
99430fdc8d8SChris Lattner }
99530fdc8d8SChris Lattner 
99630fdc8d8SChris Lattner bool
99730fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
99830fdc8d8SChris Lattner {
99935e2ab60SJohnny Chen     return !IsEqual(rhs);
1000481cef25SGreg Clayton }
100130fdc8d8SChris Lattner 
100230fdc8d8SChris Lattner SBThread
100330fdc8d8SChris Lattner SBFrame::GetThread () const
100430fdc8d8SChris Lattner {
10055160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1006ceb6b139SCaroline Tice 
10077fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1008d9e416c0SGreg Clayton     ThreadSP thread_sp (exe_ctx.GetThreadSP());
1009d9e416c0SGreg Clayton     SBThread sb_thread (thread_sp);
1010ceb6b139SCaroline Tice 
1011ceb6b139SCaroline Tice     if (log)
1012750cd175SCaroline Tice     {
1013750cd175SCaroline Tice         SBStream sstr;
1014750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
1015d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
1016324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetFramePtr()),
1017324a1036SSaleem Abdulrasool                      static_cast<void*>(thread_sp.get()), sstr.GetData());
1018750cd175SCaroline Tice     }
1019ceb6b139SCaroline Tice 
102030fdc8d8SChris Lattner     return sb_thread;
102130fdc8d8SChris Lattner }
102230fdc8d8SChris Lattner 
102330fdc8d8SChris Lattner const char *
102430fdc8d8SChris Lattner SBFrame::Disassemble () const
102530fdc8d8SChris Lattner {
10265160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10274838131bSGreg Clayton     const char *disassembly = NULL;
10284fc6cb9cSJim Ingham     Mutex::Locker api_locker;
10294fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
10304fc6cb9cSJim Ingham 
1031b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1032d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
10337730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
10347730b9a4SJim Ingham     if (target && process)
1035af67cecdSGreg Clayton     {
10367fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10377730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
10387730b9a4SJim Ingham         {
10397730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
10407730b9a4SJim Ingham             if (frame)
10417fdf9ef1SGreg Clayton             {
1042d9e416c0SGreg Clayton                 disassembly = frame->Disassemble();
1043af67cecdSGreg Clayton             }
1044c9858e4dSGreg Clayton             else
1045c9858e4dSGreg Clayton             {
1046c9858e4dSGreg Clayton                 if (log)
10477730b9a4SJim Ingham                     log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame.");
10487730b9a4SJim Ingham             }
10497730b9a4SJim Ingham         }
10507730b9a4SJim Ingham         else
10517730b9a4SJim Ingham         {
10527730b9a4SJim Ingham             if (log)
10537730b9a4SJim Ingham                 log->Printf ("SBFrame::Disassemble () => error: process is running");
10547fdf9ef1SGreg Clayton         }
1055c9858e4dSGreg Clayton     }
10564838131bSGreg Clayton 
10574838131bSGreg Clayton     if (log)
1058324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::Disassemble () => %s",
1059324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), disassembly);
10604838131bSGreg Clayton 
10614838131bSGreg Clayton     return disassembly;
106230fdc8d8SChris Lattner }
106330fdc8d8SChris Lattner 
106430fdc8d8SChris Lattner 
106530fdc8d8SChris Lattner SBValueList
106630fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
106730fdc8d8SChris Lattner                        bool locals,
106830fdc8d8SChris Lattner                        bool statics,
106930fdc8d8SChris Lattner                        bool in_scope_only)
107030fdc8d8SChris Lattner {
1071316d498bSGreg Clayton     SBValueList value_list;
10727fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1073b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
1074d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1075d9e416c0SGreg Clayton     if (frame && target)
1076316d498bSGreg Clayton     {
1077d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
107851f96eebSZachary Turner         const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false;
107951f96eebSZachary Turner 
108051f96eebSZachary Turner         SBVariablesOptions options;
108151f96eebSZachary Turner         options.SetIncludeArguments(arguments);
108251f96eebSZachary Turner         options.SetIncludeLocals(locals);
108351f96eebSZachary Turner         options.SetIncludeStatics(statics);
108451f96eebSZachary Turner         options.SetInScopeOnly(in_scope_only);
108551f96eebSZachary Turner         options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
108651f96eebSZachary Turner         options.SetUseDynamic(use_dynamic);
108751f96eebSZachary Turner 
108851f96eebSZachary Turner         value_list = GetVariables (options);
1089316d498bSGreg Clayton     }
1090316d498bSGreg Clayton     return value_list;
109178a685aaSJim Ingham }
109278a685aaSJim Ingham 
1093560558ebSEnrico Granata lldb::SBValueList
1094560558ebSEnrico Granata SBFrame::GetVariables (bool arguments,
1095560558ebSEnrico Granata                        bool locals,
1096560558ebSEnrico Granata                        bool statics,
1097560558ebSEnrico Granata                        bool in_scope_only,
1098560558ebSEnrico Granata                        lldb::DynamicValueType  use_dynamic)
1099560558ebSEnrico Granata {
1100560558ebSEnrico Granata     ExecutionContext exe_ctx(m_opaque_sp.get());
1101560558ebSEnrico Granata     Target *target = exe_ctx.GetTargetPtr();
110251f96eebSZachary Turner     const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false;
110351f96eebSZachary Turner     SBVariablesOptions options;
110451f96eebSZachary Turner     options.SetIncludeArguments(arguments);
110551f96eebSZachary Turner     options.SetIncludeLocals(locals);
110651f96eebSZachary Turner     options.SetIncludeStatics(statics);
110751f96eebSZachary Turner     options.SetInScopeOnly(in_scope_only);
110851f96eebSZachary Turner     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
110951f96eebSZachary Turner     options.SetUseDynamic(use_dynamic);
111051f96eebSZachary Turner     return GetVariables(options);
1111560558ebSEnrico Granata }
1112560558ebSEnrico Granata 
111378a685aaSJim Ingham SBValueList
111451f96eebSZachary Turner SBFrame::GetVariables (const lldb::SBVariablesOptions& options)
111578a685aaSJim Ingham {
11165160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1117ceb6b139SCaroline Tice 
1118b9556accSGreg Clayton     SBValueList value_list;
11194fc6cb9cSJim Ingham     Mutex::Locker api_locker;
11204fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
11214fc6cb9cSJim Ingham 
1122b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1123d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1124b9556accSGreg Clayton 
112551f96eebSZachary Turner     const bool statics = options.GetIncludeStatics();
112651f96eebSZachary Turner     const bool arguments = options.GetIncludeArguments();
112751f96eebSZachary Turner     const bool locals = options.GetIncludeLocals();
112851f96eebSZachary Turner     const bool in_scope_only = options.GetInScopeOnly();
112951f96eebSZachary Turner     const bool include_runtime_support_values = options.GetIncludeRuntimeSupportValues();
113051f96eebSZachary Turner     const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
113151f96eebSZachary Turner 
1132ceb6b139SCaroline Tice     if (log)
113351f96eebSZachary Turner         log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)",
113451f96eebSZachary Turner                      arguments, locals,
113551f96eebSZachary Turner                      statics, in_scope_only,
113651f96eebSZachary Turner                      include_runtime_support_values, use_dynamic);
1137ceb6b139SCaroline Tice 
11387730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
11397730b9a4SJim Ingham     if (target && process)
114030fdc8d8SChris Lattner     {
11417fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11427730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
11437fdf9ef1SGreg Clayton         {
11447730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
11457730b9a4SJim Ingham             if (frame)
11467730b9a4SJim Ingham             {
114730fdc8d8SChris Lattner                 size_t i;
1148af67cecdSGreg Clayton                 VariableList *variable_list = NULL;
1149d9e416c0SGreg Clayton                 variable_list = frame->GetVariableList(true);
115030fdc8d8SChris Lattner                 if (variable_list)
115130fdc8d8SChris Lattner                 {
115230fdc8d8SChris Lattner                     const size_t num_variables = variable_list->GetSize();
115330fdc8d8SChris Lattner                     if (num_variables)
115430fdc8d8SChris Lattner                     {
115530fdc8d8SChris Lattner                         for (i = 0; i < num_variables; ++i)
115630fdc8d8SChris Lattner                         {
115730fdc8d8SChris Lattner                             VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
115830fdc8d8SChris Lattner                             if (variable_sp)
115930fdc8d8SChris Lattner                             {
116030fdc8d8SChris Lattner                                 bool add_variable = false;
116130fdc8d8SChris Lattner                                 switch (variable_sp->GetScope())
116230fdc8d8SChris Lattner                                 {
116330fdc8d8SChris Lattner                                 case eValueTypeVariableGlobal:
116430fdc8d8SChris Lattner                                 case eValueTypeVariableStatic:
116530fdc8d8SChris Lattner                                     add_variable = statics;
116630fdc8d8SChris Lattner                                     break;
116730fdc8d8SChris Lattner 
116830fdc8d8SChris Lattner                                 case eValueTypeVariableArgument:
116930fdc8d8SChris Lattner                                     add_variable = arguments;
117030fdc8d8SChris Lattner                                     break;
117130fdc8d8SChris Lattner 
117230fdc8d8SChris Lattner                                 case eValueTypeVariableLocal:
117330fdc8d8SChris Lattner                                     add_variable = locals;
117430fdc8d8SChris Lattner                                     break;
1175c982c768SGreg Clayton 
1176c982c768SGreg Clayton                                 default:
1177c982c768SGreg Clayton                                     break;
117830fdc8d8SChris Lattner                                 }
117930fdc8d8SChris Lattner                                 if (add_variable)
118030fdc8d8SChris Lattner                                 {
1181d9e416c0SGreg Clayton                                     if (in_scope_only && !variable_sp->IsInScope(frame))
118230fdc8d8SChris Lattner                                         continue;
118330fdc8d8SChris Lattner 
1184e3e91517SEnrico Granata                                     ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues));
1185560558ebSEnrico Granata 
1186560558ebSEnrico Granata                                     if (false == include_runtime_support_values &&
1187560558ebSEnrico Granata                                         valobj_sp &&
1188560558ebSEnrico Granata                                         true == valobj_sp->IsRuntimeSupportValue())
1189560558ebSEnrico Granata                                         continue;
1190560558ebSEnrico Granata 
1191e3e91517SEnrico Granata                                     SBValue value_sb;
1192e3e91517SEnrico Granata                                     value_sb.SetSP(valobj_sp,use_dynamic);
1193e3e91517SEnrico Granata                                     value_list.Append(value_sb);
119430fdc8d8SChris Lattner                                 }
119530fdc8d8SChris Lattner                             }
119630fdc8d8SChris Lattner                         }
119730fdc8d8SChris Lattner                     }
119830fdc8d8SChris Lattner                 }
119930fdc8d8SChris Lattner             }
1200c9858e4dSGreg Clayton             else
1201c9858e4dSGreg Clayton             {
1202c9858e4dSGreg Clayton                 if (log)
12037730b9a4SJim Ingham                     log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
12047730b9a4SJim Ingham             }
12057730b9a4SJim Ingham         }
12067730b9a4SJim Ingham         else
12077730b9a4SJim Ingham         {
12087730b9a4SJim Ingham             if (log)
12097730b9a4SJim Ingham                 log->Printf ("SBFrame::GetVariables () => error: process is running");
1210c9858e4dSGreg Clayton         }
12117fdf9ef1SGreg Clayton     }
1212ceb6b139SCaroline Tice 
1213ceb6b139SCaroline Tice     if (log)
1214324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)",
1215324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1216324a1036SSaleem Abdulrasool                      static_cast<void*>(value_list.opaque_ptr()));
1217ceb6b139SCaroline Tice 
121830fdc8d8SChris Lattner     return value_list;
121930fdc8d8SChris Lattner }
122030fdc8d8SChris Lattner 
122169b582faSGreg Clayton SBValueList
122230fdc8d8SChris Lattner SBFrame::GetRegisters ()
122330fdc8d8SChris Lattner {
12245160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1225ceb6b139SCaroline Tice 
122630fdc8d8SChris Lattner     SBValueList value_list;
12274fc6cb9cSJim Ingham     Mutex::Locker api_locker;
12284fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
12294fc6cb9cSJim Ingham 
1230b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1231d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
12327730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
12337730b9a4SJim Ingham     if (target && process)
123430fdc8d8SChris Lattner     {
12357fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
12367730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
12377730b9a4SJim Ingham         {
12387730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
12397730b9a4SJim Ingham             if (frame)
12407fdf9ef1SGreg Clayton             {
1241d9e416c0SGreg Clayton                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
124230fdc8d8SChris Lattner                 if (reg_ctx)
124330fdc8d8SChris Lattner                 {
124430fdc8d8SChris Lattner                     const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
124530fdc8d8SChris Lattner                     for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
124630fdc8d8SChris Lattner                     {
1247d9e416c0SGreg Clayton                         value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
124830fdc8d8SChris Lattner                     }
124930fdc8d8SChris Lattner                 }
125030fdc8d8SChris Lattner             }
1251c9858e4dSGreg Clayton             else
1252c9858e4dSGreg Clayton             {
1253c9858e4dSGreg Clayton                 if (log)
12547730b9a4SJim Ingham                     log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame.");
12557730b9a4SJim Ingham             }
12567730b9a4SJim Ingham         }
12577730b9a4SJim Ingham         else
12587730b9a4SJim Ingham         {
12597730b9a4SJim Ingham             if (log)
12607730b9a4SJim Ingham                 log->Printf ("SBFrame::GetRegisters () => error: process is running");
1261c9858e4dSGreg Clayton         }
12627fdf9ef1SGreg Clayton     }
1263ceb6b139SCaroline Tice 
1264ceb6b139SCaroline Tice     if (log)
1265324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)",
1266324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1267324a1036SSaleem Abdulrasool                      static_cast<void*>(value_list.opaque_ptr()));
1268ceb6b139SCaroline Tice 
126930fdc8d8SChris Lattner     return value_list;
127030fdc8d8SChris Lattner }
127130fdc8d8SChris Lattner 
1272ad9a53c5SJason Molenda SBValue
1273ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name)
1274ad9a53c5SJason Molenda {
1275ad9a53c5SJason Molenda     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1276ad9a53c5SJason Molenda 
1277ad9a53c5SJason Molenda     SBValue result;
1278ad9a53c5SJason Molenda     ValueObjectSP value_sp;
1279ad9a53c5SJason Molenda     Mutex::Locker api_locker;
1280ad9a53c5SJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1281ad9a53c5SJason Molenda 
1282b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1283ad9a53c5SJason Molenda     Target *target = exe_ctx.GetTargetPtr();
1284ad9a53c5SJason Molenda     Process *process = exe_ctx.GetProcessPtr();
1285ad9a53c5SJason Molenda     if (target && process)
1286ad9a53c5SJason Molenda     {
1287ad9a53c5SJason Molenda         Process::StopLocker stop_locker;
1288ad9a53c5SJason Molenda         if (stop_locker.TryLock(&process->GetRunLock()))
1289ad9a53c5SJason Molenda         {
1290ad9a53c5SJason Molenda             frame = exe_ctx.GetFramePtr();
1291ad9a53c5SJason Molenda             if (frame)
1292ad9a53c5SJason Molenda             {
1293ad9a53c5SJason Molenda                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
1294ad9a53c5SJason Molenda                 if (reg_ctx)
1295ad9a53c5SJason Molenda                 {
1296ad9a53c5SJason Molenda                     const uint32_t num_regs = reg_ctx->GetRegisterCount();
1297ad9a53c5SJason Molenda                     for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
1298ad9a53c5SJason Molenda                     {
1299ad9a53c5SJason Molenda                         const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
1300ad9a53c5SJason Molenda                         if (reg_info &&
1301ad9a53c5SJason Molenda                             ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
1302ad9a53c5SJason Molenda                              (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
1303ad9a53c5SJason Molenda                         {
1304ad9a53c5SJason Molenda                             value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
1305ad9a53c5SJason Molenda                             result.SetSP (value_sp);
1306ad9a53c5SJason Molenda                             break;
1307ad9a53c5SJason Molenda                         }
1308ad9a53c5SJason Molenda                     }
1309ad9a53c5SJason Molenda                 }
1310ad9a53c5SJason Molenda             }
1311ad9a53c5SJason Molenda             else
1312ad9a53c5SJason Molenda             {
1313ad9a53c5SJason Molenda                 if (log)
13145d353842SJason Molenda                     log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame.");
1315ad9a53c5SJason Molenda             }
1316ad9a53c5SJason Molenda         }
1317ad9a53c5SJason Molenda         else
1318ad9a53c5SJason Molenda         {
1319ad9a53c5SJason Molenda             if (log)
13205d353842SJason Molenda                 log->Printf ("SBFrame::FindRegister () => error: process is running");
1321ad9a53c5SJason Molenda         }
1322ad9a53c5SJason Molenda     }
1323ad9a53c5SJason Molenda 
1324ad9a53c5SJason Molenda     if (log)
1325324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)",
1326324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1327324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
1328ad9a53c5SJason Molenda 
1329ad9a53c5SJason Molenda     return result;
1330ad9a53c5SJason Molenda }
1331ad9a53c5SJason Molenda 
1332dde9cff3SCaroline Tice bool
1333dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
1334dde9cff3SCaroline Tice {
13355160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1336da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1337da7bc7d0SGreg Clayton 
13384fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13394fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13404fc6cb9cSJim Ingham 
1341b57e4a1bSJason Molenda     StackFrame *frame;
1342d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
13437730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
13447730b9a4SJim Ingham     if (target && process)
1345dde9cff3SCaroline Tice     {
13467fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13477730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
13487730b9a4SJim Ingham         {
13497730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
13507730b9a4SJim Ingham             if (frame)
13517fdf9ef1SGreg Clayton             {
1352d9e416c0SGreg Clayton                 frame->DumpUsingSettingsFormat (&strm);
1353dde9cff3SCaroline Tice             }
1354c9858e4dSGreg Clayton             else
1355c9858e4dSGreg Clayton             {
1356c9858e4dSGreg Clayton                 if (log)
13577730b9a4SJim Ingham                     log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame.");
13587730b9a4SJim Ingham             }
13597730b9a4SJim Ingham         }
13607730b9a4SJim Ingham         else
13617730b9a4SJim Ingham         {
13627730b9a4SJim Ingham             if (log)
13637730b9a4SJim Ingham                 log->Printf ("SBFrame::GetDescription () => error: process is running");
1364c9858e4dSGreg Clayton         }
1365c9858e4dSGreg Clayton 
13667fdf9ef1SGreg Clayton     }
1367dde9cff3SCaroline Tice     else
1368da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1369dde9cff3SCaroline Tice 
1370dde9cff3SCaroline Tice     return true;
1371dde9cff3SCaroline Tice }
13721d3afba3SGreg Clayton 
137369b582faSGreg Clayton SBValue
13741d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
13751d3afba3SGreg Clayton {
1376316d498bSGreg Clayton     SBValue result;
13777fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1378b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
1379d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1380d9e416c0SGreg Clayton     if (frame && target)
1381316d498bSGreg Clayton     {
138235e1bda6SJim Ingham         SBExpressionOptions options;
138335e1bda6SJim Ingham         lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue();
1384cced1566SGreg Clayton         options.SetFetchDynamicValue (fetch_dynamic_value);
138535e1bda6SJim Ingham         options.SetUnwindOnError (true);
138635e1bda6SJim Ingham         return EvaluateExpression (expr, options);
1387316d498bSGreg Clayton     }
1388316d498bSGreg Clayton     return result;
138978a685aaSJim Ingham }
139078a685aaSJim Ingham 
139178a685aaSJim Ingham SBValue
13922837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
139378a685aaSJim Ingham {
139435e1bda6SJim Ingham     SBExpressionOptions options;
1395cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
139635e1bda6SJim Ingham     options.SetUnwindOnError (true);
139735e1bda6SJim Ingham     return EvaluateExpression (expr, options);
13987ba6e991SJim Ingham }
13997ba6e991SJim Ingham 
14007ba6e991SJim Ingham SBValue
14017ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error)
14027ba6e991SJim Ingham {
140335e1bda6SJim Ingham     SBExpressionOptions options;
1404cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
140535e1bda6SJim Ingham     options.SetUnwindOnError (unwind_on_error);
140635e1bda6SJim Ingham     return EvaluateExpression (expr, options);
140735e1bda6SJim Ingham }
140835e1bda6SJim Ingham 
140935e1bda6SJim Ingham lldb::SBValue
141035e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options)
141135e1bda6SJim Ingham {
14125160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14134838131bSGreg Clayton 
14145160ce5cSGreg Clayton     Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1415a162ebafSSean Callanan 
14168646d3c1SJim Ingham     ExpressionResults exe_results = eExpressionSetupError;
141769b582faSGreg Clayton     SBValue expr_result;
14187730b9a4SJim Ingham 
14197730b9a4SJim Ingham     if (expr == NULL || expr[0] == '\0')
14207730b9a4SJim Ingham     {
14217730b9a4SJim Ingham         if (log)
14227730b9a4SJim Ingham             log->Printf ("SBFrame::EvaluateExpression called with an empty expression");
14237730b9a4SJim Ingham         return expr_result;
14247730b9a4SJim Ingham     }
14257730b9a4SJim Ingham 
142681e871edSGreg Clayton     ValueObjectSP expr_value_sp;
14274838131bSGreg Clayton 
14284fc6cb9cSJim Ingham     Mutex::Locker api_locker;
14294fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
14304fc6cb9cSJim Ingham 
1431b9556accSGreg Clayton     if (log)
14327730b9a4SJim Ingham         log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
1433b9556accSGreg Clayton 
1434b57e4a1bSJason Molenda     StackFrame *frame = NULL;
14357730b9a4SJim Ingham     Target *target = exe_ctx.GetTargetPtr();
14367730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
14377730b9a4SJim Ingham 
14387730b9a4SJim Ingham     if (target && process)
14391d3afba3SGreg Clayton     {
14407fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
14417730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
14427730b9a4SJim Ingham         {
14437730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
14447730b9a4SJim Ingham             if (frame)
14457fdf9ef1SGreg Clayton             {
1446fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1447fb6621efSGreg Clayton                 {
14481ba7c4d0SGreg Clayton                     StreamString frame_description;
1449d9e416c0SGreg Clayton                     frame->DumpUsingSettingsFormat (&frame_description);
14501ba7c4d0SGreg Clayton                     Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
1451cced1566SGreg Clayton                                                          expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str());
1452fb6621efSGreg Clayton                 }
1453fb6621efSGreg Clayton 
1454d9e416c0SGreg Clayton                 exe_results = target->EvaluateExpression (expr,
1455d9e416c0SGreg Clayton                                                           frame,
1456d4439aa9SEnrico Granata                                                           expr_value_sp,
145735e1bda6SJim Ingham                                                           options.ref());
1458e3e91517SEnrico Granata                 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1459fb6621efSGreg Clayton 
1460fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1461f49e65aeSGreg Clayton                     Host::SetCrashDescription (NULL);
14621d3afba3SGreg Clayton             }
1463c9858e4dSGreg Clayton             else
1464c9858e4dSGreg Clayton             {
1465c9858e4dSGreg Clayton                 if (log)
14667730b9a4SJim Ingham                     log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame.");
14677730b9a4SJim Ingham             }
14687730b9a4SJim Ingham         }
14697730b9a4SJim Ingham         else
14707730b9a4SJim Ingham         {
14717730b9a4SJim Ingham             if (log)
14727730b9a4SJim Ingham                 log->Printf ("SBFrame::EvaluateExpression () => error: process is running");
1473c9858e4dSGreg Clayton         }
14747fdf9ef1SGreg Clayton     }
14754838131bSGreg Clayton 
1476cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1477a162ebafSSean Callanan     if (expr_log)
147878a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
1479324a1036SSaleem Abdulrasool                          expr_result.GetValue(), expr_result.GetSummary());
1480a162ebafSSean Callanan 
14814838131bSGreg Clayton     if (log)
1482d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1483324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), expr,
1484324a1036SSaleem Abdulrasool                      static_cast<void*>(expr_value_sp.get()), exe_results);
1485cf7e2dc0SJason Molenda #endif
14864838131bSGreg Clayton 
1487cfd1acedSGreg Clayton     return expr_result;
14881d3afba3SGreg Clayton }
1489316d498bSGreg Clayton 
1490316d498bSGreg Clayton bool
1491316d498bSGreg Clayton SBFrame::IsInlined()
1492316d498bSGreg Clayton {
14935160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14947fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1495b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1496d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
14977730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
14987730b9a4SJim Ingham     if (target && process)
1499316d498bSGreg Clayton     {
15007fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
15017730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
15027730b9a4SJim Ingham         {
15037730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
15047730b9a4SJim Ingham             if (frame)
15057fdf9ef1SGreg Clayton             {
15067fdf9ef1SGreg Clayton 
1507d9e416c0SGreg Clayton                 Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1508316d498bSGreg Clayton                 if (block)
1509316d498bSGreg Clayton                     return block->GetContainingInlinedBlock () != NULL;
1510316d498bSGreg Clayton             }
1511c9858e4dSGreg Clayton             else
1512c9858e4dSGreg Clayton             {
1513c9858e4dSGreg Clayton                 if (log)
15147730b9a4SJim Ingham                     log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame.");
15157730b9a4SJim Ingham             }
15167730b9a4SJim Ingham         }
15177730b9a4SJim Ingham         else
15187730b9a4SJim Ingham         {
15197730b9a4SJim Ingham             if (log)
15207730b9a4SJim Ingham                 log->Printf ("SBFrame::IsInlined () => error: process is running");
1521c9858e4dSGreg Clayton         }
1522c9858e4dSGreg Clayton 
15237fdf9ef1SGreg Clayton     }
1524316d498bSGreg Clayton     return false;
1525316d498bSGreg Clayton }
1526316d498bSGreg Clayton 
1527316d498bSGreg Clayton const char *
1528316d498bSGreg Clayton SBFrame::GetFunctionName()
1529316d498bSGreg Clayton {
15305160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1531316d498bSGreg Clayton     const char *name = NULL;
15327fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1533b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1534d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
15357730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
15367730b9a4SJim Ingham     if (target && process)
1537316d498bSGreg Clayton     {
15387fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
15397730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
15407730b9a4SJim Ingham         {
15417730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
15427730b9a4SJim Ingham             if (frame)
15437fdf9ef1SGreg Clayton             {
1544d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1545316d498bSGreg Clayton                 if (sc.block)
1546316d498bSGreg Clayton                 {
1547316d498bSGreg Clayton                     Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1548316d498bSGreg Clayton                     if (inlined_block)
1549316d498bSGreg Clayton                     {
1550316d498bSGreg Clayton                         const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1551316d498bSGreg Clayton                         name = inlined_info->GetName().AsCString();
1552316d498bSGreg Clayton                     }
1553316d498bSGreg Clayton                 }
1554316d498bSGreg Clayton 
1555316d498bSGreg Clayton                 if (name == NULL)
1556316d498bSGreg Clayton                 {
1557316d498bSGreg Clayton                     if (sc.function)
1558316d498bSGreg Clayton                         name = sc.function->GetName().GetCString();
1559316d498bSGreg Clayton                 }
1560316d498bSGreg Clayton 
1561316d498bSGreg Clayton                 if (name == NULL)
1562316d498bSGreg Clayton                 {
1563316d498bSGreg Clayton                     if (sc.symbol)
1564316d498bSGreg Clayton                         name = sc.symbol->GetName().GetCString();
1565316d498bSGreg Clayton                 }
1566316d498bSGreg Clayton             }
1567c9858e4dSGreg Clayton             else
1568c9858e4dSGreg Clayton             {
1569c9858e4dSGreg Clayton                 if (log)
15707730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame.");
15717730b9a4SJim Ingham             }
15727730b9a4SJim Ingham         }
15737730b9a4SJim Ingham         else
15747730b9a4SJim Ingham         {
15757730b9a4SJim Ingham             if (log)
15767730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFunctionName() => error: process is running");
1577c9858e4dSGreg Clayton 
1578c9858e4dSGreg Clayton         }
15797fdf9ef1SGreg Clayton     }
1580316d498bSGreg Clayton     return name;
1581316d498bSGreg Clayton }
1582316d498bSGreg Clayton 
1583