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*af0f45f1SZachary 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 
87972eff18aSGreg Clayton                         if (sc.block && sc.block->AppendVariables (can_create,
88072eff18aSGreg Clayton                                                                    get_parent_variables,
88172eff18aSGreg Clayton                                                                    stop_if_block_is_inlined_function,
88208a04327SEnrico Granata                                                                    &variable_list))
883beae523aSJohnny Chen                         {
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);
897beae523aSJohnny Chen                                 break;
898beae523aSJohnny Chen                             }
89930fdc8d8SChris Lattner                         }
90030fdc8d8SChris Lattner                     }
90169b582faSGreg Clayton                     break;
90269b582faSGreg Clayton 
90369b582faSGreg Clayton                 case eValueTypeRegister:            // stack frame register value
90469b582faSGreg Clayton                     {
905d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
90669b582faSGreg Clayton                         if (reg_ctx)
90769b582faSGreg Clayton                         {
90869b582faSGreg Clayton                             const uint32_t num_regs = reg_ctx->GetRegisterCount();
90969b582faSGreg Clayton                             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
91069b582faSGreg Clayton                             {
91169b582faSGreg Clayton                                 const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
91269b582faSGreg Clayton                                 if (reg_info &&
91369b582faSGreg Clayton                                     ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
91469b582faSGreg Clayton                                      (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
91569b582faSGreg Clayton                                 {
916d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
91781e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
91881e871edSGreg Clayton                                     break;
91969b582faSGreg Clayton                                 }
92069b582faSGreg Clayton                             }
92169b582faSGreg Clayton                         }
92269b582faSGreg Clayton                     }
92369b582faSGreg Clayton                     break;
92469b582faSGreg Clayton 
92569b582faSGreg Clayton                 case eValueTypeRegisterSet:         // A collection of stack frame register values
92669b582faSGreg Clayton                     {
927d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
92869b582faSGreg Clayton                         if (reg_ctx)
92969b582faSGreg Clayton                         {
93069b582faSGreg Clayton                             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
93169b582faSGreg Clayton                             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
93269b582faSGreg Clayton                             {
93369b582faSGreg Clayton                                 const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
93469b582faSGreg Clayton                                 if (reg_set &&
93569b582faSGreg Clayton                                     ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
93669b582faSGreg Clayton                                      (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
93769b582faSGreg Clayton                                 {
938d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
93981e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
94081e871edSGreg Clayton                                     break;
94169b582faSGreg Clayton                                 }
94269b582faSGreg Clayton                             }
94369b582faSGreg Clayton                         }
94469b582faSGreg Clayton                     }
94569b582faSGreg Clayton                     break;
94669b582faSGreg Clayton 
94769b582faSGreg Clayton                 case eValueTypeConstResult:         // constant result variables
94869b582faSGreg Clayton                     {
94969b582faSGreg Clayton                         ConstString const_name(name);
950d9e416c0SGreg Clayton                         ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name));
95169b582faSGreg Clayton                         if (expr_var_sp)
95281e871edSGreg Clayton                         {
95381e871edSGreg Clayton                             value_sp = expr_var_sp->GetValueObject();
954e3e91517SEnrico Granata                             sb_value.SetSP (value_sp, use_dynamic);
95581e871edSGreg Clayton                         }
95669b582faSGreg Clayton                     }
95769b582faSGreg Clayton                     break;
95869b582faSGreg Clayton 
95969b582faSGreg Clayton                 default:
96069b582faSGreg Clayton                     break;
96169b582faSGreg Clayton                 }
962beae523aSJohnny Chen             }
963c9858e4dSGreg Clayton             else
964c9858e4dSGreg Clayton             {
965c9858e4dSGreg Clayton                 if (log)
9667730b9a4SJim Ingham                     log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame.");
9677730b9a4SJim Ingham             }
9687730b9a4SJim Ingham         }
9697730b9a4SJim Ingham         else
9707730b9a4SJim Ingham         {
9717730b9a4SJim Ingham             if (log)
9727730b9a4SJim Ingham                 log->Printf ("SBFrame::FindValue () => error: process is running");
973c9858e4dSGreg Clayton         }
9747fdf9ef1SGreg Clayton     }
975dde9cff3SCaroline Tice 
9764838131bSGreg Clayton     if (log)
97769b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
978324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), name, value_type,
979324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
9804838131bSGreg Clayton 
981dde9cff3SCaroline Tice     return sb_value;
982dde9cff3SCaroline Tice }
983dde9cff3SCaroline Tice 
98430fdc8d8SChris Lattner bool
98535e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const
98635e2ab60SJohnny Chen {
987b57e4a1bSJason Molenda     lldb::StackFrameSP this_sp = GetFrameSP();
988b57e4a1bSJason Molenda     lldb::StackFrameSP that_sp = that.GetFrameSP();
98935e2ab60SJohnny Chen     return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
99035e2ab60SJohnny Chen }
99135e2ab60SJohnny Chen 
99235e2ab60SJohnny Chen bool
99330fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
99430fdc8d8SChris Lattner {
99535e2ab60SJohnny Chen     return IsEqual(rhs);
99630fdc8d8SChris Lattner }
99730fdc8d8SChris Lattner 
99830fdc8d8SChris Lattner bool
99930fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
100030fdc8d8SChris Lattner {
100135e2ab60SJohnny Chen     return !IsEqual(rhs);
1002481cef25SGreg Clayton }
100330fdc8d8SChris Lattner 
100430fdc8d8SChris Lattner SBThread
100530fdc8d8SChris Lattner SBFrame::GetThread () const
100630fdc8d8SChris Lattner {
10075160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1008ceb6b139SCaroline Tice 
10097fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1010d9e416c0SGreg Clayton     ThreadSP thread_sp (exe_ctx.GetThreadSP());
1011d9e416c0SGreg Clayton     SBThread sb_thread (thread_sp);
1012ceb6b139SCaroline Tice 
1013ceb6b139SCaroline Tice     if (log)
1014750cd175SCaroline Tice     {
1015750cd175SCaroline Tice         SBStream sstr;
1016750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
1017d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
1018324a1036SSaleem Abdulrasool                      static_cast<void*>(exe_ctx.GetFramePtr()),
1019324a1036SSaleem Abdulrasool                      static_cast<void*>(thread_sp.get()), sstr.GetData());
1020750cd175SCaroline Tice     }
1021ceb6b139SCaroline Tice 
102230fdc8d8SChris Lattner     return sb_thread;
102330fdc8d8SChris Lattner }
102430fdc8d8SChris Lattner 
102530fdc8d8SChris Lattner const char *
102630fdc8d8SChris Lattner SBFrame::Disassemble () const
102730fdc8d8SChris Lattner {
10285160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10294838131bSGreg Clayton     const char *disassembly = NULL;
10304fc6cb9cSJim Ingham     Mutex::Locker api_locker;
10314fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
10324fc6cb9cSJim Ingham 
1033b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1034d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
10357730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
10367730b9a4SJim Ingham     if (target && process)
1037af67cecdSGreg Clayton     {
10387fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10397730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
10407730b9a4SJim Ingham         {
10417730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
10427730b9a4SJim Ingham             if (frame)
10437fdf9ef1SGreg Clayton             {
1044d9e416c0SGreg Clayton                 disassembly = frame->Disassemble();
1045af67cecdSGreg Clayton             }
1046c9858e4dSGreg Clayton             else
1047c9858e4dSGreg Clayton             {
1048c9858e4dSGreg Clayton                 if (log)
10497730b9a4SJim Ingham                     log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame.");
10507730b9a4SJim Ingham             }
10517730b9a4SJim Ingham         }
10527730b9a4SJim Ingham         else
10537730b9a4SJim Ingham         {
10547730b9a4SJim Ingham             if (log)
10557730b9a4SJim Ingham                 log->Printf ("SBFrame::Disassemble () => error: process is running");
10567fdf9ef1SGreg Clayton         }
1057c9858e4dSGreg Clayton     }
10584838131bSGreg Clayton 
10594838131bSGreg Clayton     if (log)
1060324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::Disassemble () => %s",
1061324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), disassembly);
10624838131bSGreg Clayton 
10634838131bSGreg Clayton     return disassembly;
106430fdc8d8SChris Lattner }
106530fdc8d8SChris Lattner 
106630fdc8d8SChris Lattner 
106730fdc8d8SChris Lattner SBValueList
106830fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
106930fdc8d8SChris Lattner                        bool locals,
107030fdc8d8SChris Lattner                        bool statics,
107130fdc8d8SChris Lattner                        bool in_scope_only)
107230fdc8d8SChris Lattner {
1073316d498bSGreg Clayton     SBValueList value_list;
10747fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1075b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
1076d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1077d9e416c0SGreg Clayton     if (frame && target)
1078316d498bSGreg Clayton     {
1079d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
108051f96eebSZachary Turner         const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false;
108151f96eebSZachary Turner 
108251f96eebSZachary Turner         SBVariablesOptions options;
108351f96eebSZachary Turner         options.SetIncludeArguments(arguments);
108451f96eebSZachary Turner         options.SetIncludeLocals(locals);
108551f96eebSZachary Turner         options.SetIncludeStatics(statics);
108651f96eebSZachary Turner         options.SetInScopeOnly(in_scope_only);
108751f96eebSZachary Turner         options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
108851f96eebSZachary Turner         options.SetUseDynamic(use_dynamic);
108951f96eebSZachary Turner 
109051f96eebSZachary Turner         value_list = GetVariables (options);
1091316d498bSGreg Clayton     }
1092316d498bSGreg Clayton     return value_list;
109378a685aaSJim Ingham }
109478a685aaSJim Ingham 
1095560558ebSEnrico Granata lldb::SBValueList
1096560558ebSEnrico Granata SBFrame::GetVariables (bool arguments,
1097560558ebSEnrico Granata                        bool locals,
1098560558ebSEnrico Granata                        bool statics,
1099560558ebSEnrico Granata                        bool in_scope_only,
1100560558ebSEnrico Granata                        lldb::DynamicValueType  use_dynamic)
1101560558ebSEnrico Granata {
1102560558ebSEnrico Granata     ExecutionContext exe_ctx(m_opaque_sp.get());
1103560558ebSEnrico Granata     Target *target = exe_ctx.GetTargetPtr();
110451f96eebSZachary Turner     const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false;
110551f96eebSZachary Turner     SBVariablesOptions options;
110651f96eebSZachary Turner     options.SetIncludeArguments(arguments);
110751f96eebSZachary Turner     options.SetIncludeLocals(locals);
110851f96eebSZachary Turner     options.SetIncludeStatics(statics);
110951f96eebSZachary Turner     options.SetInScopeOnly(in_scope_only);
111051f96eebSZachary Turner     options.SetIncludeRuntimeSupportValues(include_runtime_support_values);
111151f96eebSZachary Turner     options.SetUseDynamic(use_dynamic);
111251f96eebSZachary Turner     return GetVariables(options);
1113560558ebSEnrico Granata }
1114560558ebSEnrico Granata 
111578a685aaSJim Ingham SBValueList
111651f96eebSZachary Turner SBFrame::GetVariables (const lldb::SBVariablesOptions& options)
111778a685aaSJim Ingham {
11185160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1119ceb6b139SCaroline Tice 
1120b9556accSGreg Clayton     SBValueList value_list;
11214fc6cb9cSJim Ingham     Mutex::Locker api_locker;
11224fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
11234fc6cb9cSJim Ingham 
1124b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1125d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1126b9556accSGreg Clayton 
112751f96eebSZachary Turner     const bool statics = options.GetIncludeStatics();
112851f96eebSZachary Turner     const bool arguments = options.GetIncludeArguments();
112951f96eebSZachary Turner     const bool locals = options.GetIncludeLocals();
113051f96eebSZachary Turner     const bool in_scope_only = options.GetInScopeOnly();
113151f96eebSZachary Turner     const bool include_runtime_support_values = options.GetIncludeRuntimeSupportValues();
113251f96eebSZachary Turner     const lldb::DynamicValueType use_dynamic = options.GetUseDynamic();
113351f96eebSZachary Turner 
1134ceb6b139SCaroline Tice     if (log)
113551f96eebSZachary Turner         log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)",
113651f96eebSZachary Turner                      arguments, locals,
113751f96eebSZachary Turner                      statics, in_scope_only,
113851f96eebSZachary Turner                      include_runtime_support_values, use_dynamic);
1139ceb6b139SCaroline Tice 
11407730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
11417730b9a4SJim Ingham     if (target && process)
114230fdc8d8SChris Lattner     {
11437fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11447730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
11457fdf9ef1SGreg Clayton         {
11467730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
11477730b9a4SJim Ingham             if (frame)
11487730b9a4SJim Ingham             {
114930fdc8d8SChris Lattner                 size_t i;
1150af67cecdSGreg Clayton                 VariableList *variable_list = NULL;
1151d9e416c0SGreg Clayton                 variable_list = frame->GetVariableList(true);
115230fdc8d8SChris Lattner                 if (variable_list)
115330fdc8d8SChris Lattner                 {
115430fdc8d8SChris Lattner                     const size_t num_variables = variable_list->GetSize();
115530fdc8d8SChris Lattner                     if (num_variables)
115630fdc8d8SChris Lattner                     {
115730fdc8d8SChris Lattner                         for (i = 0; i < num_variables; ++i)
115830fdc8d8SChris Lattner                         {
115930fdc8d8SChris Lattner                             VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
116030fdc8d8SChris Lattner                             if (variable_sp)
116130fdc8d8SChris Lattner                             {
116230fdc8d8SChris Lattner                                 bool add_variable = false;
116330fdc8d8SChris Lattner                                 switch (variable_sp->GetScope())
116430fdc8d8SChris Lattner                                 {
116530fdc8d8SChris Lattner                                 case eValueTypeVariableGlobal:
116630fdc8d8SChris Lattner                                 case eValueTypeVariableStatic:
116730fdc8d8SChris Lattner                                     add_variable = statics;
116830fdc8d8SChris Lattner                                     break;
116930fdc8d8SChris Lattner 
117030fdc8d8SChris Lattner                                 case eValueTypeVariableArgument:
117130fdc8d8SChris Lattner                                     add_variable = arguments;
117230fdc8d8SChris Lattner                                     break;
117330fdc8d8SChris Lattner 
117430fdc8d8SChris Lattner                                 case eValueTypeVariableLocal:
117530fdc8d8SChris Lattner                                     add_variable = locals;
117630fdc8d8SChris Lattner                                     break;
1177c982c768SGreg Clayton 
1178c982c768SGreg Clayton                                 default:
1179c982c768SGreg Clayton                                     break;
118030fdc8d8SChris Lattner                                 }
118130fdc8d8SChris Lattner                                 if (add_variable)
118230fdc8d8SChris Lattner                                 {
1183d9e416c0SGreg Clayton                                     if (in_scope_only && !variable_sp->IsInScope(frame))
118430fdc8d8SChris Lattner                                         continue;
118530fdc8d8SChris Lattner 
1186e3e91517SEnrico Granata                                     ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues));
1187560558ebSEnrico Granata 
1188560558ebSEnrico Granata                                     if (false == include_runtime_support_values &&
1189560558ebSEnrico Granata                                         valobj_sp &&
1190560558ebSEnrico Granata                                         true == valobj_sp->IsRuntimeSupportValue())
1191560558ebSEnrico Granata                                         continue;
1192560558ebSEnrico Granata 
1193e3e91517SEnrico Granata                                     SBValue value_sb;
1194e3e91517SEnrico Granata                                     value_sb.SetSP(valobj_sp,use_dynamic);
1195e3e91517SEnrico Granata                                     value_list.Append(value_sb);
119630fdc8d8SChris Lattner                                 }
119730fdc8d8SChris Lattner                             }
119830fdc8d8SChris Lattner                         }
119930fdc8d8SChris Lattner                     }
120030fdc8d8SChris Lattner                 }
120130fdc8d8SChris Lattner             }
1202c9858e4dSGreg Clayton             else
1203c9858e4dSGreg Clayton             {
1204c9858e4dSGreg Clayton                 if (log)
12057730b9a4SJim Ingham                     log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
12067730b9a4SJim Ingham             }
12077730b9a4SJim Ingham         }
12087730b9a4SJim Ingham         else
12097730b9a4SJim Ingham         {
12107730b9a4SJim Ingham             if (log)
12117730b9a4SJim Ingham                 log->Printf ("SBFrame::GetVariables () => error: process is running");
1212c9858e4dSGreg Clayton         }
12137fdf9ef1SGreg Clayton     }
1214ceb6b139SCaroline Tice 
1215ceb6b139SCaroline Tice     if (log)
1216324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)",
1217324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1218324a1036SSaleem Abdulrasool                      static_cast<void*>(value_list.opaque_ptr()));
1219ceb6b139SCaroline Tice 
122030fdc8d8SChris Lattner     return value_list;
122130fdc8d8SChris Lattner }
122230fdc8d8SChris Lattner 
122369b582faSGreg Clayton SBValueList
122430fdc8d8SChris Lattner SBFrame::GetRegisters ()
122530fdc8d8SChris Lattner {
12265160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1227ceb6b139SCaroline Tice 
122830fdc8d8SChris Lattner     SBValueList value_list;
12294fc6cb9cSJim Ingham     Mutex::Locker api_locker;
12304fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
12314fc6cb9cSJim Ingham 
1232b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1233d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
12347730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
12357730b9a4SJim Ingham     if (target && process)
123630fdc8d8SChris Lattner     {
12377fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
12387730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
12397730b9a4SJim Ingham         {
12407730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
12417730b9a4SJim Ingham             if (frame)
12427fdf9ef1SGreg Clayton             {
1243d9e416c0SGreg Clayton                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
124430fdc8d8SChris Lattner                 if (reg_ctx)
124530fdc8d8SChris Lattner                 {
124630fdc8d8SChris Lattner                     const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
124730fdc8d8SChris Lattner                     for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
124830fdc8d8SChris Lattner                     {
1249d9e416c0SGreg Clayton                         value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
125030fdc8d8SChris Lattner                     }
125130fdc8d8SChris Lattner                 }
125230fdc8d8SChris Lattner             }
1253c9858e4dSGreg Clayton             else
1254c9858e4dSGreg Clayton             {
1255c9858e4dSGreg Clayton                 if (log)
12567730b9a4SJim Ingham                     log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame.");
12577730b9a4SJim Ingham             }
12587730b9a4SJim Ingham         }
12597730b9a4SJim Ingham         else
12607730b9a4SJim Ingham         {
12617730b9a4SJim Ingham             if (log)
12627730b9a4SJim Ingham                 log->Printf ("SBFrame::GetRegisters () => error: process is running");
1263c9858e4dSGreg Clayton         }
12647fdf9ef1SGreg Clayton     }
1265ceb6b139SCaroline Tice 
1266ceb6b139SCaroline Tice     if (log)
1267324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)",
1268324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1269324a1036SSaleem Abdulrasool                      static_cast<void*>(value_list.opaque_ptr()));
1270ceb6b139SCaroline Tice 
127130fdc8d8SChris Lattner     return value_list;
127230fdc8d8SChris Lattner }
127330fdc8d8SChris Lattner 
1274ad9a53c5SJason Molenda SBValue
1275ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name)
1276ad9a53c5SJason Molenda {
1277ad9a53c5SJason Molenda     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1278ad9a53c5SJason Molenda 
1279ad9a53c5SJason Molenda     SBValue result;
1280ad9a53c5SJason Molenda     ValueObjectSP value_sp;
1281ad9a53c5SJason Molenda     Mutex::Locker api_locker;
1282ad9a53c5SJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1283ad9a53c5SJason Molenda 
1284b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1285ad9a53c5SJason Molenda     Target *target = exe_ctx.GetTargetPtr();
1286ad9a53c5SJason Molenda     Process *process = exe_ctx.GetProcessPtr();
1287ad9a53c5SJason Molenda     if (target && process)
1288ad9a53c5SJason Molenda     {
1289ad9a53c5SJason Molenda         Process::StopLocker stop_locker;
1290ad9a53c5SJason Molenda         if (stop_locker.TryLock(&process->GetRunLock()))
1291ad9a53c5SJason Molenda         {
1292ad9a53c5SJason Molenda             frame = exe_ctx.GetFramePtr();
1293ad9a53c5SJason Molenda             if (frame)
1294ad9a53c5SJason Molenda             {
1295ad9a53c5SJason Molenda                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
1296ad9a53c5SJason Molenda                 if (reg_ctx)
1297ad9a53c5SJason Molenda                 {
1298ad9a53c5SJason Molenda                     const uint32_t num_regs = reg_ctx->GetRegisterCount();
1299ad9a53c5SJason Molenda                     for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
1300ad9a53c5SJason Molenda                     {
1301ad9a53c5SJason Molenda                         const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
1302ad9a53c5SJason Molenda                         if (reg_info &&
1303ad9a53c5SJason Molenda                             ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
1304ad9a53c5SJason Molenda                              (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
1305ad9a53c5SJason Molenda                         {
1306ad9a53c5SJason Molenda                             value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
1307ad9a53c5SJason Molenda                             result.SetSP (value_sp);
1308ad9a53c5SJason Molenda                             break;
1309ad9a53c5SJason Molenda                         }
1310ad9a53c5SJason Molenda                     }
1311ad9a53c5SJason Molenda                 }
1312ad9a53c5SJason Molenda             }
1313ad9a53c5SJason Molenda             else
1314ad9a53c5SJason Molenda             {
1315ad9a53c5SJason Molenda                 if (log)
13165d353842SJason Molenda                     log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame.");
1317ad9a53c5SJason Molenda             }
1318ad9a53c5SJason Molenda         }
1319ad9a53c5SJason Molenda         else
1320ad9a53c5SJason Molenda         {
1321ad9a53c5SJason Molenda             if (log)
13225d353842SJason Molenda                 log->Printf ("SBFrame::FindRegister () => error: process is running");
1323ad9a53c5SJason Molenda         }
1324ad9a53c5SJason Molenda     }
1325ad9a53c5SJason Molenda 
1326ad9a53c5SJason Molenda     if (log)
1327324a1036SSaleem Abdulrasool         log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)",
1328324a1036SSaleem Abdulrasool                      static_cast<void*>(frame),
1329324a1036SSaleem Abdulrasool                      static_cast<void*>(value_sp.get()));
1330ad9a53c5SJason Molenda 
1331ad9a53c5SJason Molenda     return result;
1332ad9a53c5SJason Molenda }
1333ad9a53c5SJason Molenda 
1334dde9cff3SCaroline Tice bool
1335dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
1336dde9cff3SCaroline Tice {
13375160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1338da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1339da7bc7d0SGreg Clayton 
13404fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13414fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13424fc6cb9cSJim Ingham 
1343b57e4a1bSJason Molenda     StackFrame *frame;
1344d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
13457730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
13467730b9a4SJim Ingham     if (target && process)
1347dde9cff3SCaroline Tice     {
13487fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13497730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
13507730b9a4SJim Ingham         {
13517730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
13527730b9a4SJim Ingham             if (frame)
13537fdf9ef1SGreg Clayton             {
1354d9e416c0SGreg Clayton                 frame->DumpUsingSettingsFormat (&strm);
1355dde9cff3SCaroline Tice             }
1356c9858e4dSGreg Clayton             else
1357c9858e4dSGreg Clayton             {
1358c9858e4dSGreg Clayton                 if (log)
13597730b9a4SJim Ingham                     log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame.");
13607730b9a4SJim Ingham             }
13617730b9a4SJim Ingham         }
13627730b9a4SJim Ingham         else
13637730b9a4SJim Ingham         {
13647730b9a4SJim Ingham             if (log)
13657730b9a4SJim Ingham                 log->Printf ("SBFrame::GetDescription () => error: process is running");
1366c9858e4dSGreg Clayton         }
1367c9858e4dSGreg Clayton 
13687fdf9ef1SGreg Clayton     }
1369dde9cff3SCaroline Tice     else
1370da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1371dde9cff3SCaroline Tice 
1372dde9cff3SCaroline Tice     return true;
1373dde9cff3SCaroline Tice }
13741d3afba3SGreg Clayton 
137569b582faSGreg Clayton SBValue
13761d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
13771d3afba3SGreg Clayton {
1378316d498bSGreg Clayton     SBValue result;
13797fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1380b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
1381d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1382d9e416c0SGreg Clayton     if (frame && target)
1383316d498bSGreg Clayton     {
138435e1bda6SJim Ingham         SBExpressionOptions options;
138535e1bda6SJim Ingham         lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue();
1386cced1566SGreg Clayton         options.SetFetchDynamicValue (fetch_dynamic_value);
138735e1bda6SJim Ingham         options.SetUnwindOnError (true);
138835e1bda6SJim Ingham         return EvaluateExpression (expr, options);
1389316d498bSGreg Clayton     }
1390316d498bSGreg Clayton     return result;
139178a685aaSJim Ingham }
139278a685aaSJim Ingham 
139378a685aaSJim Ingham SBValue
13942837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
139578a685aaSJim Ingham {
139635e1bda6SJim Ingham     SBExpressionOptions options;
1397cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
139835e1bda6SJim Ingham     options.SetUnwindOnError (true);
139935e1bda6SJim Ingham     return EvaluateExpression (expr, options);
14007ba6e991SJim Ingham }
14017ba6e991SJim Ingham 
14027ba6e991SJim Ingham SBValue
14037ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error)
14047ba6e991SJim Ingham {
140535e1bda6SJim Ingham     SBExpressionOptions options;
1406cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
140735e1bda6SJim Ingham     options.SetUnwindOnError (unwind_on_error);
140835e1bda6SJim Ingham     return EvaluateExpression (expr, options);
140935e1bda6SJim Ingham }
141035e1bda6SJim Ingham 
141135e1bda6SJim Ingham lldb::SBValue
141235e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options)
141335e1bda6SJim Ingham {
14145160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14154838131bSGreg Clayton 
14165160ce5cSGreg Clayton     Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1417a162ebafSSean Callanan 
14188646d3c1SJim Ingham     ExpressionResults exe_results = eExpressionSetupError;
141969b582faSGreg Clayton     SBValue expr_result;
14207730b9a4SJim Ingham 
14217730b9a4SJim Ingham     if (expr == NULL || expr[0] == '\0')
14227730b9a4SJim Ingham     {
14237730b9a4SJim Ingham         if (log)
14247730b9a4SJim Ingham             log->Printf ("SBFrame::EvaluateExpression called with an empty expression");
14257730b9a4SJim Ingham         return expr_result;
14267730b9a4SJim Ingham     }
14277730b9a4SJim Ingham 
142881e871edSGreg Clayton     ValueObjectSP expr_value_sp;
14294838131bSGreg Clayton 
14304fc6cb9cSJim Ingham     Mutex::Locker api_locker;
14314fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
14324fc6cb9cSJim Ingham 
1433b9556accSGreg Clayton     if (log)
14347730b9a4SJim Ingham         log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
1435b9556accSGreg Clayton 
1436b57e4a1bSJason Molenda     StackFrame *frame = NULL;
14377730b9a4SJim Ingham     Target *target = exe_ctx.GetTargetPtr();
14387730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
14397730b9a4SJim Ingham 
14407730b9a4SJim Ingham     if (target && process)
14411d3afba3SGreg Clayton     {
14427fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
14437730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
14447730b9a4SJim Ingham         {
14457730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
14467730b9a4SJim Ingham             if (frame)
14477fdf9ef1SGreg Clayton             {
1448fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1449fb6621efSGreg Clayton                 {
14501ba7c4d0SGreg Clayton                     StreamString frame_description;
1451d9e416c0SGreg Clayton                     frame->DumpUsingSettingsFormat (&frame_description);
14521ba7c4d0SGreg Clayton                     Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
1453cced1566SGreg Clayton                                                          expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str());
1454fb6621efSGreg Clayton                 }
1455fb6621efSGreg Clayton 
1456d9e416c0SGreg Clayton                 exe_results = target->EvaluateExpression (expr,
1457d9e416c0SGreg Clayton                                                           frame,
1458d4439aa9SEnrico Granata                                                           expr_value_sp,
145935e1bda6SJim Ingham                                                           options.ref());
1460e3e91517SEnrico Granata                 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1461fb6621efSGreg Clayton 
1462fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1463f49e65aeSGreg Clayton                     Host::SetCrashDescription (NULL);
14641d3afba3SGreg Clayton             }
1465c9858e4dSGreg Clayton             else
1466c9858e4dSGreg Clayton             {
1467c9858e4dSGreg Clayton                 if (log)
14687730b9a4SJim Ingham                     log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame.");
14697730b9a4SJim Ingham             }
14707730b9a4SJim Ingham         }
14717730b9a4SJim Ingham         else
14727730b9a4SJim Ingham         {
14737730b9a4SJim Ingham             if (log)
14747730b9a4SJim Ingham                 log->Printf ("SBFrame::EvaluateExpression () => error: process is running");
1475c9858e4dSGreg Clayton         }
14767fdf9ef1SGreg Clayton     }
14774838131bSGreg Clayton 
1478cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1479a162ebafSSean Callanan     if (expr_log)
148078a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
1481324a1036SSaleem Abdulrasool                          expr_result.GetValue(), expr_result.GetSummary());
1482a162ebafSSean Callanan 
14834838131bSGreg Clayton     if (log)
1484d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1485324a1036SSaleem Abdulrasool                      static_cast<void*>(frame), expr,
1486324a1036SSaleem Abdulrasool                      static_cast<void*>(expr_value_sp.get()), exe_results);
1487cf7e2dc0SJason Molenda #endif
14884838131bSGreg Clayton 
1489cfd1acedSGreg Clayton     return expr_result;
14901d3afba3SGreg Clayton }
1491316d498bSGreg Clayton 
1492316d498bSGreg Clayton bool
1493316d498bSGreg Clayton SBFrame::IsInlined()
1494316d498bSGreg Clayton {
14955160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14967fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1497b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1498d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
14997730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
15007730b9a4SJim Ingham     if (target && process)
1501316d498bSGreg Clayton     {
15027fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
15037730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
15047730b9a4SJim Ingham         {
15057730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
15067730b9a4SJim Ingham             if (frame)
15077fdf9ef1SGreg Clayton             {
15087fdf9ef1SGreg Clayton 
1509d9e416c0SGreg Clayton                 Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1510316d498bSGreg Clayton                 if (block)
1511316d498bSGreg Clayton                     return block->GetContainingInlinedBlock () != NULL;
1512316d498bSGreg Clayton             }
1513c9858e4dSGreg Clayton             else
1514c9858e4dSGreg Clayton             {
1515c9858e4dSGreg Clayton                 if (log)
15167730b9a4SJim Ingham                     log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame.");
15177730b9a4SJim Ingham             }
15187730b9a4SJim Ingham         }
15197730b9a4SJim Ingham         else
15207730b9a4SJim Ingham         {
15217730b9a4SJim Ingham             if (log)
15227730b9a4SJim Ingham                 log->Printf ("SBFrame::IsInlined () => error: process is running");
1523c9858e4dSGreg Clayton         }
1524c9858e4dSGreg Clayton 
15257fdf9ef1SGreg Clayton     }
1526316d498bSGreg Clayton     return false;
1527316d498bSGreg Clayton }
1528316d498bSGreg Clayton 
1529316d498bSGreg Clayton const char *
1530316d498bSGreg Clayton SBFrame::GetFunctionName()
1531316d498bSGreg Clayton {
15325160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1533316d498bSGreg Clayton     const char *name = NULL;
15347fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1535b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1536d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
15377730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
15387730b9a4SJim Ingham     if (target && process)
1539316d498bSGreg Clayton     {
15407fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
15417730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
15427730b9a4SJim Ingham         {
15437730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
15447730b9a4SJim Ingham             if (frame)
15457fdf9ef1SGreg Clayton             {
1546d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1547316d498bSGreg Clayton                 if (sc.block)
1548316d498bSGreg Clayton                 {
1549316d498bSGreg Clayton                     Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1550316d498bSGreg Clayton                     if (inlined_block)
1551316d498bSGreg Clayton                     {
1552316d498bSGreg Clayton                         const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1553316d498bSGreg Clayton                         name = inlined_info->GetName().AsCString();
1554316d498bSGreg Clayton                     }
1555316d498bSGreg Clayton                 }
1556316d498bSGreg Clayton 
1557316d498bSGreg Clayton                 if (name == NULL)
1558316d498bSGreg Clayton                 {
1559316d498bSGreg Clayton                     if (sc.function)
1560316d498bSGreg Clayton                         name = sc.function->GetName().GetCString();
1561316d498bSGreg Clayton                 }
1562316d498bSGreg Clayton 
1563316d498bSGreg Clayton                 if (name == NULL)
1564316d498bSGreg Clayton                 {
1565316d498bSGreg Clayton                     if (sc.symbol)
1566316d498bSGreg Clayton                         name = sc.symbol->GetName().GetCString();
1567316d498bSGreg Clayton                 }
1568316d498bSGreg Clayton             }
1569c9858e4dSGreg Clayton             else
1570c9858e4dSGreg Clayton             {
1571c9858e4dSGreg Clayton                 if (log)
15727730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame.");
15737730b9a4SJim Ingham             }
15747730b9a4SJim Ingham         }
15757730b9a4SJim Ingham         else
15767730b9a4SJim Ingham         {
15777730b9a4SJim Ingham             if (log)
15787730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFunctionName() => error: process is running");
1579c9858e4dSGreg Clayton 
1580c9858e4dSGreg Clayton         }
15817fdf9ef1SGreg Clayton     }
1582316d498bSGreg Clayton     return name;
1583316d498bSGreg Clayton }
1584316d498bSGreg Clayton 
1585