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"
24b71f3844SGreg Clayton #include "lldb/Expression/ClangUserExpression.h"
251ba7c4d0SGreg Clayton #include "lldb/Host/Host.h"
2630fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
271f746071SGreg Clayton #include "lldb/Symbol/Function.h"
281f746071SGreg Clayton #include "lldb/Symbol/Symbol.h"
2930fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
3030fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h"
3130fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
3230fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
3330fdc8d8SChris Lattner #include "lldb/Target/Target.h"
3430fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3530fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
36b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h"
37b9556accSGreg Clayton #include "lldb/Target/StackID.h"
3830fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
3930fdc8d8SChris Lattner 
404c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
414c5de699SEli Friedman #include "lldb/API/SBValue.h"
424c5de699SEli Friedman #include "lldb/API/SBAddress.h"
4335e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h"
44dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
454c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h"
464c5de699SEli Friedman #include "lldb/API/SBThread.h"
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner using namespace lldb;
4930fdc8d8SChris Lattner using namespace lldb_private;
5030fdc8d8SChris Lattner 
51b9556accSGreg Clayton 
5230fdc8d8SChris Lattner SBFrame::SBFrame () :
537fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef())
5430fdc8d8SChris Lattner {
5530fdc8d8SChris Lattner }
5630fdc8d8SChris Lattner 
57b57e4a1bSJason Molenda SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) :
587fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef (lldb_object_sp))
5930fdc8d8SChris Lattner {
605160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
61ceb6b139SCaroline Tice 
62ceb6b139SCaroline Tice     if (log)
63ceb6b139SCaroline Tice     {
64ceb6b139SCaroline Tice         SBStream sstr;
65ceb6b139SCaroline Tice         GetDescription (sstr);
664838131bSGreg Clayton         log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s",
67b9556accSGreg Clayton                      lldb_object_sp.get(), lldb_object_sp.get(), sstr.GetData());
68750cd175SCaroline Tice 
69ceb6b139SCaroline Tice     }
7030fdc8d8SChris Lattner }
7130fdc8d8SChris Lattner 
72efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) :
737fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp))
74efabb123SGreg Clayton {
75efabb123SGreg Clayton }
76efabb123SGreg Clayton 
77efabb123SGreg Clayton const SBFrame &
78efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs)
79efabb123SGreg Clayton {
80efabb123SGreg Clayton     if (this != &rhs)
817fdf9ef1SGreg Clayton         *m_opaque_sp = *rhs.m_opaque_sp;
82efabb123SGreg Clayton     return *this;
83efabb123SGreg Clayton }
84efabb123SGreg Clayton 
8530fdc8d8SChris Lattner SBFrame::~SBFrame()
8630fdc8d8SChris Lattner {
8730fdc8d8SChris Lattner }
8830fdc8d8SChris Lattner 
89b57e4a1bSJason Molenda StackFrameSP
90b9556accSGreg Clayton SBFrame::GetFrameSP() const
91b9556accSGreg Clayton {
92af2589eaSGreg Clayton     if (m_opaque_sp)
937fdf9ef1SGreg Clayton         return m_opaque_sp->GetFrameSP();
94b57e4a1bSJason Molenda     return StackFrameSP();
95b9556accSGreg Clayton }
9630fdc8d8SChris Lattner 
9730fdc8d8SChris Lattner void
98b57e4a1bSJason Molenda SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp)
9930fdc8d8SChris Lattner {
1007fdf9ef1SGreg Clayton     return m_opaque_sp->SetFrameSP(lldb_object_sp);
101b9556accSGreg Clayton }
10230fdc8d8SChris Lattner 
10330fdc8d8SChris Lattner bool
10430fdc8d8SChris Lattner SBFrame::IsValid() const
10530fdc8d8SChris Lattner {
1067fdf9ef1SGreg Clayton     return GetFrameSP().get() != NULL;
10730fdc8d8SChris Lattner }
10830fdc8d8SChris Lattner 
10930fdc8d8SChris Lattner SBSymbolContext
11030fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const
11130fdc8d8SChris Lattner {
1125160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11330fdc8d8SChris Lattner     SBSymbolContext sb_sym_ctx;
1144fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1154fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1164fc6cb9cSJim Ingham 
117b57e4a1bSJason Molenda     StackFrame *frame = NULL;
118d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1197730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
1207730b9a4SJim Ingham     if (target && process)
121af67cecdSGreg Clayton     {
1227fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1237730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
1247730b9a4SJim Ingham         {
1257730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
1267730b9a4SJim Ingham             if (frame)
1277fdf9ef1SGreg Clayton             {
128d9e416c0SGreg Clayton                 sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope));
129af67cecdSGreg Clayton             }
130c9858e4dSGreg Clayton             else
131c9858e4dSGreg Clayton             {
132c9858e4dSGreg Clayton                 if (log)
1337730b9a4SJim Ingham                     log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
1347730b9a4SJim Ingham             }
1357730b9a4SJim Ingham         }
1367730b9a4SJim Ingham         else
1377730b9a4SJim Ingham         {
1387730b9a4SJim Ingham             if (log)
1397730b9a4SJim Ingham                 log->Printf ("SBFrame::GetSymbolContext () => error: process is running");
140c9858e4dSGreg Clayton         }
1417fdf9ef1SGreg Clayton     }
142ceb6b139SCaroline Tice 
143ceb6b139SCaroline Tice     if (log)
1444838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)",
145d9e416c0SGreg Clayton                      frame, resolve_scope, sb_sym_ctx.get());
146ceb6b139SCaroline Tice 
14730fdc8d8SChris Lattner     return sb_sym_ctx;
14830fdc8d8SChris Lattner }
14930fdc8d8SChris Lattner 
15030fdc8d8SChris Lattner SBModule
15130fdc8d8SChris Lattner SBFrame::GetModule () const
15230fdc8d8SChris Lattner {
1535160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
15472eff18aSGreg Clayton     SBModule sb_module;
155acdbe816SGreg Clayton     ModuleSP module_sp;
1564fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1574fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1584fc6cb9cSJim Ingham 
159b57e4a1bSJason Molenda     StackFrame *frame = NULL;
160d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1617730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
1627730b9a4SJim Ingham     if (target && process)
163af67cecdSGreg Clayton     {
1647fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1657730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
1667730b9a4SJim Ingham         {
1677730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
1687730b9a4SJim Ingham             if (frame)
1697fdf9ef1SGreg Clayton             {
170d9e416c0SGreg Clayton                 module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp;
171acdbe816SGreg Clayton                 sb_module.SetSP (module_sp);
172af67cecdSGreg Clayton             }
173c9858e4dSGreg Clayton             else
174c9858e4dSGreg Clayton             {
175c9858e4dSGreg Clayton                 if (log)
1767730b9a4SJim Ingham                     log->Printf ("SBFrame::GetModule () => error: could not reconstruct frame object for this SBFrame.");
1777730b9a4SJim Ingham             }
1787730b9a4SJim Ingham         }
1797730b9a4SJim Ingham         else
1807730b9a4SJim Ingham         {
1817730b9a4SJim Ingham             if (log)
1827730b9a4SJim Ingham                 log->Printf ("SBFrame::GetModule () => error: process is running");
183c9858e4dSGreg Clayton         }
1847fdf9ef1SGreg Clayton     }
18572eff18aSGreg Clayton 
1864838131bSGreg Clayton     if (log)
1874838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
188d9e416c0SGreg Clayton                      frame, module_sp.get());
1894838131bSGreg Clayton 
19030fdc8d8SChris Lattner     return sb_module;
19130fdc8d8SChris Lattner }
19230fdc8d8SChris Lattner 
19330fdc8d8SChris Lattner SBCompileUnit
19430fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
19530fdc8d8SChris Lattner {
1965160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
19772eff18aSGreg Clayton     SBCompileUnit sb_comp_unit;
1984fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1994fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2004fc6cb9cSJim Ingham 
201b57e4a1bSJason Molenda     StackFrame *frame = NULL;
202d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
2037730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
2047730b9a4SJim Ingham     if (target && process)
205af67cecdSGreg Clayton     {
2067fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2077730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
2087730b9a4SJim Ingham         {
2097730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
2107730b9a4SJim Ingham             if (frame)
2117fdf9ef1SGreg Clayton             {
212d9e416c0SGreg Clayton                 sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
213af67cecdSGreg Clayton             }
214c9858e4dSGreg Clayton             else
215c9858e4dSGreg Clayton             {
216ceb6b139SCaroline Tice                 if (log)
2177730b9a4SJim Ingham                     log->Printf ("SBFrame::GetCompileUnit () => error: could not reconstruct frame object for this SBFrame.");
2187730b9a4SJim Ingham             }
2197730b9a4SJim Ingham         }
2207730b9a4SJim Ingham         else
2217730b9a4SJim Ingham         {
2227730b9a4SJim Ingham             if (log)
2237730b9a4SJim Ingham                 log->Printf ("SBFrame::GetCompileUnit () => error: process is running");
224c9858e4dSGreg Clayton         }
225c9858e4dSGreg Clayton     }
226c9858e4dSGreg Clayton     if (log)
227c9858e4dSGreg Clayton         log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
228d9e416c0SGreg Clayton                      frame, sb_comp_unit.get());
229ceb6b139SCaroline Tice 
23030fdc8d8SChris Lattner     return sb_comp_unit;
23130fdc8d8SChris Lattner }
23230fdc8d8SChris Lattner 
23330fdc8d8SChris Lattner SBFunction
23430fdc8d8SChris Lattner SBFrame::GetFunction () const
23530fdc8d8SChris Lattner {
2365160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
23772eff18aSGreg Clayton     SBFunction sb_function;
2384fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2394fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2404fc6cb9cSJim Ingham 
241b57e4a1bSJason Molenda     StackFrame *frame = NULL;
242d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
2437730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
2447730b9a4SJim Ingham     if (target && process)
245af67cecdSGreg Clayton     {
2467fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2477730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
2487730b9a4SJim Ingham         {
2497730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
2507730b9a4SJim Ingham             if (frame)
2517fdf9ef1SGreg Clayton             {
252d9e416c0SGreg Clayton                 sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function);
253af67cecdSGreg Clayton             }
254c9858e4dSGreg Clayton             else
255c9858e4dSGreg Clayton             {
256c9858e4dSGreg Clayton                 if (log)
2577730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFunction () => error: could not reconstruct frame object for this SBFrame.");
2587730b9a4SJim Ingham             }
2597730b9a4SJim Ingham         }
2607730b9a4SJim Ingham         else
2617730b9a4SJim Ingham         {
2627730b9a4SJim Ingham             if (log)
2637730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFunction () => error: process is running");
2647fdf9ef1SGreg Clayton         }
265c9858e4dSGreg Clayton     }
2664838131bSGreg Clayton     if (log)
2674838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
268d9e416c0SGreg Clayton                      frame, sb_function.get());
2694838131bSGreg Clayton 
27030fdc8d8SChris Lattner     return sb_function;
27130fdc8d8SChris Lattner }
27230fdc8d8SChris Lattner 
2733b06557eSGreg Clayton SBSymbol
2743b06557eSGreg Clayton SBFrame::GetSymbol () const
2753b06557eSGreg Clayton {
2765160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
27772eff18aSGreg Clayton     SBSymbol sb_symbol;
2784fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2794fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2804fc6cb9cSJim Ingham 
281b57e4a1bSJason Molenda     StackFrame *frame = NULL;
282d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
2837730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
2847730b9a4SJim Ingham     if (target && process)
285af67cecdSGreg Clayton     {
2867fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2877730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
2887730b9a4SJim Ingham         {
2897730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
2907730b9a4SJim Ingham             if (frame)
2917fdf9ef1SGreg Clayton             {
292d9e416c0SGreg Clayton                 sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol);
293af67cecdSGreg Clayton             }
294c9858e4dSGreg Clayton             else
295c9858e4dSGreg Clayton             {
296c9858e4dSGreg Clayton                 if (log)
2977730b9a4SJim Ingham                     log->Printf ("SBFrame::GetSymbol () => error: could not reconstruct frame object for this SBFrame.");
2987730b9a4SJim Ingham             }
2997730b9a4SJim Ingham         }
3007730b9a4SJim Ingham         else
3017730b9a4SJim Ingham         {
3027730b9a4SJim Ingham             if (log)
3037730b9a4SJim Ingham                 log->Printf ("SBFrame::GetSymbol () => error: process is running");
3047fdf9ef1SGreg Clayton         }
305c9858e4dSGreg Clayton     }
3064838131bSGreg Clayton     if (log)
3074838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
308d9e416c0SGreg Clayton                      frame, sb_symbol.get());
3093b06557eSGreg Clayton     return sb_symbol;
3103b06557eSGreg Clayton }
3113b06557eSGreg Clayton 
31230fdc8d8SChris Lattner SBBlock
31330fdc8d8SChris Lattner SBFrame::GetBlock () const
31430fdc8d8SChris Lattner {
3155160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
31672eff18aSGreg Clayton     SBBlock sb_block;
3174fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3184fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3194fc6cb9cSJim Ingham 
320b57e4a1bSJason Molenda     StackFrame *frame = NULL;
321d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
3227730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
3237730b9a4SJim Ingham     if (target && process)
324af67cecdSGreg Clayton     {
3257fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3267730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
3277730b9a4SJim Ingham         {
3287730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
3297730b9a4SJim Ingham             if (frame)
3307fdf9ef1SGreg Clayton             {
331d9e416c0SGreg Clayton                 sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block);
332af67cecdSGreg Clayton             }
333c9858e4dSGreg Clayton             else
334c9858e4dSGreg Clayton             {
335c9858e4dSGreg Clayton                 if (log)
3367730b9a4SJim Ingham                     log->Printf ("SBFrame::GetBlock () => error: could not reconstruct frame object for this SBFrame.");
3377730b9a4SJim Ingham             }
3387730b9a4SJim Ingham         }
3397730b9a4SJim Ingham         else
3407730b9a4SJim Ingham         {
3417730b9a4SJim Ingham             if (log)
342c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", frame);
3437fdf9ef1SGreg Clayton         }
344c9858e4dSGreg Clayton     }
3454838131bSGreg Clayton     if (log)
3464838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
347d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
34830fdc8d8SChris Lattner     return sb_block;
34930fdc8d8SChris Lattner }
35030fdc8d8SChris Lattner 
35195897c6aSGreg Clayton SBBlock
35295897c6aSGreg Clayton SBFrame::GetFrameBlock () const
35395897c6aSGreg Clayton {
35472eff18aSGreg Clayton     SBBlock sb_block;
3554fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3564fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3574fc6cb9cSJim Ingham 
358b57e4a1bSJason Molenda     StackFrame *frame = NULL;
359d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
3605160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3617730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
3627730b9a4SJim Ingham     if (target && process)
363af67cecdSGreg Clayton     {
3647fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3657730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
3667730b9a4SJim Ingham         {
3677730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
3687730b9a4SJim Ingham             if (frame)
3697fdf9ef1SGreg Clayton             {
370d9e416c0SGreg Clayton                 sb_block.SetPtr(frame->GetFrameBlock ());
371af67cecdSGreg Clayton             }
372c9858e4dSGreg Clayton             else
373c9858e4dSGreg Clayton             {
374c9858e4dSGreg Clayton                 if (log)
3757730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFrameBlock () => error: could not reconstruct frame object for this SBFrame.");
3767730b9a4SJim Ingham             }
3777730b9a4SJim Ingham         }
3787730b9a4SJim Ingham         else
3797730b9a4SJim Ingham         {
3807730b9a4SJim Ingham             if (log)
3817730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFrameBlock () => error: process is running");
3827fdf9ef1SGreg Clayton         }
383c9858e4dSGreg Clayton     }
3844838131bSGreg Clayton     if (log)
3854838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
386d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
38795897c6aSGreg Clayton     return sb_block;
38895897c6aSGreg Clayton }
38995897c6aSGreg Clayton 
39030fdc8d8SChris Lattner SBLineEntry
39130fdc8d8SChris Lattner SBFrame::GetLineEntry () const
39230fdc8d8SChris Lattner {
3935160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
39472eff18aSGreg Clayton     SBLineEntry sb_line_entry;
3954fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3964fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3974fc6cb9cSJim Ingham 
398b57e4a1bSJason Molenda     StackFrame *frame = NULL;
399d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
4007730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
4017730b9a4SJim Ingham     if (target && process)
402af67cecdSGreg Clayton     {
4037fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4047730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
4057730b9a4SJim Ingham         {
4067730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
4077730b9a4SJim Ingham             if (frame)
4087fdf9ef1SGreg Clayton             {
409d9e416c0SGreg Clayton                 sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry);
410af67cecdSGreg Clayton             }
411c9858e4dSGreg Clayton             else
412c9858e4dSGreg Clayton             {
413c9858e4dSGreg Clayton                 if (log)
4147730b9a4SJim Ingham                     log->Printf ("SBFrame::GetLineEntry () => error: could not reconstruct frame object for this SBFrame.");
4157730b9a4SJim Ingham             }
4167730b9a4SJim Ingham         }
4177730b9a4SJim Ingham         else
4187730b9a4SJim Ingham         {
4197730b9a4SJim Ingham             if (log)
4207730b9a4SJim Ingham                 log->Printf ("SBFrame::GetLineEntry () => error: process is running");
4217fdf9ef1SGreg Clayton         }
422c9858e4dSGreg Clayton     }
4234838131bSGreg Clayton     if (log)
4244838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
425d9e416c0SGreg Clayton                      frame, sb_line_entry.get());
42630fdc8d8SChris Lattner     return sb_line_entry;
42730fdc8d8SChris Lattner }
42830fdc8d8SChris Lattner 
42930fdc8d8SChris Lattner uint32_t
43030fdc8d8SChris Lattner SBFrame::GetFrameID () const
43130fdc8d8SChris Lattner {
432b9556accSGreg Clayton     uint32_t frame_idx = UINT32_MAX;
433b9556accSGreg Clayton 
4347fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
435b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
4367fdf9ef1SGreg Clayton     if (frame)
437d9e416c0SGreg Clayton         frame_idx = frame->GetFrameIndex ();
4384838131bSGreg Clayton 
4395160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4404838131bSGreg Clayton     if (log)
4414838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameID () => %u",
442d9e416c0SGreg Clayton                      frame, frame_idx);
4434838131bSGreg Clayton     return frame_idx;
44430fdc8d8SChris Lattner }
44530fdc8d8SChris Lattner 
44669b582faSGreg Clayton addr_t
44730fdc8d8SChris Lattner SBFrame::GetPC () const
44830fdc8d8SChris Lattner {
4495160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
45069b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
4514fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4524fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4534fc6cb9cSJim Ingham 
454b57e4a1bSJason Molenda     StackFrame *frame = NULL;
455d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
4567730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
4577730b9a4SJim Ingham     if (target && process)
458af67cecdSGreg Clayton     {
4597fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4607730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
4617730b9a4SJim Ingham         {
4627730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
4637730b9a4SJim Ingham             if (frame)
4647fdf9ef1SGreg Clayton             {
465d9e416c0SGreg Clayton                 addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target);
466af67cecdSGreg Clayton             }
467c9858e4dSGreg Clayton             else
468c9858e4dSGreg Clayton             {
469c9858e4dSGreg Clayton                 if (log)
4707730b9a4SJim Ingham                     log->Printf ("SBFrame::GetPC () => error: could not reconstruct frame object for this SBFrame.");
4717730b9a4SJim Ingham             }
4727730b9a4SJim Ingham         }
4737730b9a4SJim Ingham         else
4747730b9a4SJim Ingham         {
4757730b9a4SJim Ingham             if (log)
4767730b9a4SJim Ingham                 log->Printf ("SBFrame::GetPC () => error: process is running");
477c9858e4dSGreg Clayton         }
4787fdf9ef1SGreg Clayton     }
479ceb6b139SCaroline Tice 
480ceb6b139SCaroline Tice     if (log)
481d01b2953SDaniel Malea         log->Printf ("SBFrame(%p)::GetPC () => 0x%" PRIx64, frame, addr);
482ceb6b139SCaroline Tice 
483ceb6b139SCaroline Tice     return addr;
48430fdc8d8SChris Lattner }
48530fdc8d8SChris Lattner 
48630fdc8d8SChris Lattner bool
48769b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc)
48830fdc8d8SChris Lattner {
4895160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
490ceb6b139SCaroline Tice     bool ret_val = false;
4914fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4924fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4934fc6cb9cSJim Ingham 
494b57e4a1bSJason Molenda     StackFrame *frame = NULL;
495d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
4967730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
4977730b9a4SJim Ingham     if (target && process)
498af67cecdSGreg Clayton     {
4997fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5007730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5017730b9a4SJim Ingham         {
5027730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5037730b9a4SJim Ingham             if (frame)
5047fdf9ef1SGreg Clayton             {
505d9e416c0SGreg Clayton                 ret_val = frame->GetRegisterContext()->SetPC (new_pc);
506af67cecdSGreg Clayton             }
507c9858e4dSGreg Clayton             else
508c9858e4dSGreg Clayton             {
509c9858e4dSGreg Clayton                 if (log)
5107730b9a4SJim Ingham                     log->Printf ("SBFrame::SetPC () => error: could not reconstruct frame object for this SBFrame.");
5117730b9a4SJim Ingham             }
5127730b9a4SJim Ingham         }
5137730b9a4SJim Ingham         else
5147730b9a4SJim Ingham         {
5157730b9a4SJim Ingham             if (log)
5167730b9a4SJim Ingham                 log->Printf ("SBFrame::SetPC () => error: process is running");
517c9858e4dSGreg Clayton         }
5187fdf9ef1SGreg Clayton     }
519ceb6b139SCaroline Tice 
520ceb6b139SCaroline Tice     if (log)
521d01b2953SDaniel Malea         log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i",
522d9e416c0SGreg Clayton                      frame, new_pc, ret_val);
523ceb6b139SCaroline Tice 
524ceb6b139SCaroline Tice     return ret_val;
52530fdc8d8SChris Lattner }
52630fdc8d8SChris Lattner 
52769b582faSGreg Clayton addr_t
52830fdc8d8SChris Lattner SBFrame::GetSP () const
52930fdc8d8SChris Lattner {
5305160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5314838131bSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
5324fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5334fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5344fc6cb9cSJim Ingham 
535b57e4a1bSJason Molenda     StackFrame *frame = NULL;
536d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
5377730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
5387730b9a4SJim Ingham     if (target && process)
539af67cecdSGreg Clayton     {
5407fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5417730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5427730b9a4SJim Ingham         {
5437730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5447730b9a4SJim Ingham             if (frame)
5457fdf9ef1SGreg Clayton             {
546d9e416c0SGreg Clayton                 addr = frame->GetRegisterContext()->GetSP();
547af67cecdSGreg Clayton             }
548c9858e4dSGreg Clayton             else
549c9858e4dSGreg Clayton             {
550c9858e4dSGreg Clayton                 if (log)
5517730b9a4SJim Ingham                     log->Printf ("SBFrame::GetSP () => error: could not reconstruct frame object for this SBFrame.");
5527730b9a4SJim Ingham             }
5537730b9a4SJim Ingham         }
5547730b9a4SJim Ingham         else
5557730b9a4SJim Ingham         {
5567730b9a4SJim Ingham             if (log)
5577730b9a4SJim Ingham                 log->Printf ("SBFrame::GetSP () => error: process is running");
5587fdf9ef1SGreg Clayton         }
559c9858e4dSGreg Clayton     }
5604838131bSGreg Clayton     if (log)
561d01b2953SDaniel Malea         log->Printf ("SBFrame(%p)::GetSP () => 0x%" PRIx64, frame, addr);
5624838131bSGreg Clayton 
5634838131bSGreg Clayton     return addr;
56430fdc8d8SChris Lattner }
56530fdc8d8SChris Lattner 
56630fdc8d8SChris Lattner 
56769b582faSGreg Clayton addr_t
56830fdc8d8SChris Lattner SBFrame::GetFP () const
56930fdc8d8SChris Lattner {
5705160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
57169b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
5724fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5734fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5744fc6cb9cSJim Ingham 
575b57e4a1bSJason Molenda     StackFrame *frame = NULL;
576d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
5777730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
5787730b9a4SJim Ingham     if (target && process)
579af67cecdSGreg Clayton     {
5807fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5817730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
5827730b9a4SJim Ingham         {
5837730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
5847730b9a4SJim Ingham             if (frame)
5857fdf9ef1SGreg Clayton             {
586d9e416c0SGreg Clayton                 addr = frame->GetRegisterContext()->GetFP();
587af67cecdSGreg Clayton             }
588c9858e4dSGreg Clayton             else
589c9858e4dSGreg Clayton             {
590c9858e4dSGreg Clayton                 if (log)
5917730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFP () => error: could not reconstruct frame object for this SBFrame.");
5927730b9a4SJim Ingham             }
5937730b9a4SJim Ingham         }
5947730b9a4SJim Ingham         else
5957730b9a4SJim Ingham         {
5967730b9a4SJim Ingham             if (log)
5977730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFP () => error: process is running");
598c9858e4dSGreg Clayton         }
5997fdf9ef1SGreg Clayton     }
600ceb6b139SCaroline Tice 
601ceb6b139SCaroline Tice     if (log)
602d01b2953SDaniel Malea         log->Printf ("SBFrame(%p)::GetFP () => 0x%" PRIx64, frame, addr);
603ceb6b139SCaroline Tice     return addr;
60430fdc8d8SChris Lattner }
60530fdc8d8SChris Lattner 
60630fdc8d8SChris Lattner 
60730fdc8d8SChris Lattner SBAddress
60830fdc8d8SChris Lattner SBFrame::GetPCAddress () const
60930fdc8d8SChris Lattner {
6105160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
61130fdc8d8SChris Lattner     SBAddress sb_addr;
6124fc6cb9cSJim Ingham     Mutex::Locker api_locker;
6134fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
6144fc6cb9cSJim Ingham 
615b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
616d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
6177730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
6187730b9a4SJim Ingham     if (target && process)
619af67cecdSGreg Clayton     {
6207fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6217730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
6227730b9a4SJim Ingham         {
6237730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
6247730b9a4SJim Ingham             if (frame)
6257fdf9ef1SGreg Clayton             {
626d9e416c0SGreg Clayton                 sb_addr.SetAddress (&frame->GetFrameCodeAddress());
627af67cecdSGreg Clayton             }
628c9858e4dSGreg Clayton             else
629c9858e4dSGreg Clayton             {
630c9858e4dSGreg Clayton                 if (log)
6317730b9a4SJim Ingham                     log->Printf ("SBFrame::GetPCAddress () => error: could not reconstruct frame object for this SBFrame.");
6327730b9a4SJim Ingham             }
6337730b9a4SJim Ingham         }
6347730b9a4SJim Ingham         else
6357730b9a4SJim Ingham         {
6367730b9a4SJim Ingham             if (log)
6377730b9a4SJim Ingham                 log->Printf ("SBFrame::GetPCAddress () => error: process is running");
6387fdf9ef1SGreg Clayton         }
639c9858e4dSGreg Clayton     }
6404838131bSGreg Clayton     if (log)
641d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get());
64230fdc8d8SChris Lattner     return sb_addr;
64330fdc8d8SChris Lattner }
64430fdc8d8SChris Lattner 
64530fdc8d8SChris Lattner void
64630fdc8d8SChris Lattner SBFrame::Clear()
64730fdc8d8SChris Lattner {
648af2589eaSGreg Clayton     m_opaque_sp->Clear();
64930fdc8d8SChris Lattner }
65030fdc8d8SChris Lattner 
6517edbdfc9SGreg Clayton lldb::SBValue
6527edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path)
6537edbdfc9SGreg Clayton {
6547edbdfc9SGreg Clayton     SBValue sb_value;
6557fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
656b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
657d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
658d9e416c0SGreg Clayton     if (frame && target)
6597edbdfc9SGreg Clayton     {
660d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
6617edbdfc9SGreg Clayton         sb_value = GetValueForVariablePath (var_path, use_dynamic);
6627edbdfc9SGreg Clayton     }
6637edbdfc9SGreg Clayton     return sb_value;
6647edbdfc9SGreg Clayton }
6657edbdfc9SGreg Clayton 
6667edbdfc9SGreg Clayton lldb::SBValue
6677edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic)
6687edbdfc9SGreg Clayton {
6697edbdfc9SGreg Clayton     SBValue sb_value;
6704fc6cb9cSJim Ingham     Mutex::Locker api_locker;
6715160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
6727730b9a4SJim Ingham     if (var_path == NULL || var_path[0] == '\0')
6737730b9a4SJim Ingham     {
6747730b9a4SJim Ingham         if (log)
6757730b9a4SJim Ingham             log->Printf ("SBFrame::GetValueForVariablePath called with empty variable path.");
6767730b9a4SJim Ingham         return sb_value;
6777730b9a4SJim Ingham     }
6787730b9a4SJim Ingham 
6794fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
6804fc6cb9cSJim Ingham 
681b57e4a1bSJason Molenda     StackFrame *frame = NULL;
682d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
6837730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
6847730b9a4SJim Ingham     if (target && process)
6857edbdfc9SGreg Clayton     {
6867fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6877730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
6887730b9a4SJim Ingham         {
6897730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
6907730b9a4SJim Ingham             if (frame)
6917fdf9ef1SGreg Clayton             {
6927edbdfc9SGreg Clayton                 VariableSP var_sp;
6937edbdfc9SGreg Clayton                 Error error;
694d9e416c0SGreg Clayton                 ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path,
695e3e91517SEnrico Granata                                                                                   eNoDynamicValues,
696b57e4a1bSJason Molenda                                                                                   StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
6977edbdfc9SGreg Clayton                                                                                   var_sp,
6987edbdfc9SGreg Clayton                                                                                   error));
699e3e91517SEnrico Granata                 sb_value.SetSP(value_sp, use_dynamic);
7007edbdfc9SGreg Clayton             }
701c9858e4dSGreg Clayton             else
702c9858e4dSGreg Clayton             {
703c9858e4dSGreg Clayton                 if (log)
7047730b9a4SJim Ingham                     log->Printf ("SBFrame::GetValueForVariablePath () => error: could not reconstruct frame object for this SBFrame.");
7057730b9a4SJim Ingham             }
7067730b9a4SJim Ingham         }
7077730b9a4SJim Ingham         else
7087730b9a4SJim Ingham         {
7097730b9a4SJim Ingham             if (log)
7107730b9a4SJim Ingham                 log->Printf ("SBFrame::GetValueForVariablePath () => error: process is running");
711c9858e4dSGreg Clayton         }
7127fdf9ef1SGreg Clayton     }
7137edbdfc9SGreg Clayton     return sb_value;
7147edbdfc9SGreg Clayton }
7157edbdfc9SGreg Clayton 
71630fdc8d8SChris Lattner SBValue
71769b582faSGreg Clayton SBFrame::FindVariable (const char *name)
71830fdc8d8SChris Lattner {
719316d498bSGreg Clayton     SBValue value;
7207fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
721b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
722d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
723d9e416c0SGreg Clayton     if (frame && target)
724316d498bSGreg Clayton     {
725d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
726316d498bSGreg Clayton         value = FindVariable (name, use_dynamic);
727316d498bSGreg Clayton     }
728316d498bSGreg Clayton     return value;
72978a685aaSJim Ingham }
73078a685aaSJim Ingham 
7317edbdfc9SGreg Clayton 
73278a685aaSJim Ingham SBValue
7332837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
73478a685aaSJim Ingham {
7355160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
73669b582faSGreg Clayton     VariableSP var_sp;
73758b59f95SJim Ingham     SBValue sb_value;
7387730b9a4SJim Ingham 
7397730b9a4SJim Ingham     if (name == NULL || name[0] == '\0')
7407730b9a4SJim Ingham     {
7417730b9a4SJim Ingham         if (log)
7427730b9a4SJim Ingham             log->Printf ("SBFrame::FindVariable called with empty name");
7437730b9a4SJim Ingham         return sb_value;
7447730b9a4SJim Ingham     }
7457730b9a4SJim Ingham 
74681e871edSGreg Clayton     ValueObjectSP value_sp;
7474fc6cb9cSJim Ingham     Mutex::Locker api_locker;
7484fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
7494fc6cb9cSJim Ingham 
750b57e4a1bSJason Molenda     StackFrame *frame = NULL;
751d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
7527730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
7537730b9a4SJim Ingham     if (target && process)
75430fdc8d8SChris Lattner     {
7557fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
7567730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
7577730b9a4SJim Ingham         {
7587730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
7597730b9a4SJim Ingham             if (frame)
7607fdf9ef1SGreg Clayton             {
76169b582faSGreg Clayton                 VariableList variable_list;
762d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
76330fdc8d8SChris Lattner 
76472eff18aSGreg Clayton                 if (sc.block)
76530fdc8d8SChris Lattner                 {
76672eff18aSGreg Clayton                     const bool can_create = true;
76772eff18aSGreg Clayton                     const bool get_parent_variables = true;
76872eff18aSGreg Clayton                     const bool stop_if_block_is_inlined_function = true;
76972eff18aSGreg Clayton 
77072eff18aSGreg Clayton                     if (sc.block->AppendVariables (can_create,
77172eff18aSGreg Clayton                                                    get_parent_variables,
77272eff18aSGreg Clayton                                                    stop_if_block_is_inlined_function,
77372eff18aSGreg Clayton                                                    &variable_list))
77472eff18aSGreg Clayton                     {
77569b582faSGreg Clayton                         var_sp = variable_list.FindVariable (ConstString(name));
77630fdc8d8SChris Lattner                     }
77772eff18aSGreg Clayton                 }
77830fdc8d8SChris Lattner 
7794838131bSGreg Clayton                 if (var_sp)
78081e871edSGreg Clayton                 {
781e3e91517SEnrico Granata                     value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues);
782e3e91517SEnrico Granata                     sb_value.SetSP(value_sp, use_dynamic);
78381e871edSGreg Clayton                 }
7847fdf9ef1SGreg Clayton             }
785c9858e4dSGreg Clayton             else
786c9858e4dSGreg Clayton             {
787c9858e4dSGreg Clayton                 if (log)
7887730b9a4SJim Ingham                     log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame.");
7897730b9a4SJim Ingham             }
7907730b9a4SJim Ingham         }
7917730b9a4SJim Ingham         else
7927730b9a4SJim Ingham         {
7937730b9a4SJim Ingham             if (log)
7947730b9a4SJim Ingham                 log->Printf ("SBFrame::FindVariable () => error: process is running");
795c9858e4dSGreg Clayton         }
796316d498bSGreg Clayton     }
797316d498bSGreg Clayton 
7984838131bSGreg Clayton     if (log)
79969b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
800d9e416c0SGreg Clayton                      frame, name, value_sp.get());
8014838131bSGreg Clayton 
802dde9cff3SCaroline Tice     return sb_value;
803dde9cff3SCaroline Tice }
804dde9cff3SCaroline Tice 
80530fdc8d8SChris Lattner SBValue
80669b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type)
80730fdc8d8SChris Lattner {
808316d498bSGreg Clayton     SBValue value;
8097fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
810b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
811d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
812d9e416c0SGreg Clayton     if (frame && target)
813316d498bSGreg Clayton     {
814d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
815316d498bSGreg Clayton         value = FindValue (name, value_type, use_dynamic);
816316d498bSGreg Clayton     }
817316d498bSGreg Clayton     return value;
81878a685aaSJim Ingham }
81978a685aaSJim Ingham 
82078a685aaSJim Ingham SBValue
8212837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
82278a685aaSJim Ingham {
8235160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
82469b582faSGreg Clayton     SBValue sb_value;
8257730b9a4SJim Ingham 
8267730b9a4SJim Ingham     if (name == NULL || name[0] == '\0')
8277730b9a4SJim Ingham     {
8287730b9a4SJim Ingham         if (log)
8297730b9a4SJim Ingham             log->Printf ("SBFrame::FindValue called with empty name.");
8307730b9a4SJim Ingham         return sb_value;
8317730b9a4SJim Ingham     }
8327730b9a4SJim Ingham 
83381e871edSGreg Clayton     ValueObjectSP value_sp;
8344fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8354fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8364fc6cb9cSJim Ingham 
837b57e4a1bSJason Molenda     StackFrame *frame = NULL;
838d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
8397730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
8407730b9a4SJim Ingham     if (target && process)
84130fdc8d8SChris Lattner     {
8427fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8437730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
8447730b9a4SJim Ingham         {
8457730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
8467730b9a4SJim Ingham             if (frame)
8477fdf9ef1SGreg Clayton             {
848*8a2a0dfbSEnrico Granata                 VariableList variable_list;
849*8a2a0dfbSEnrico Granata 
85069b582faSGreg Clayton                 switch (value_type)
85130fdc8d8SChris Lattner                 {
85269b582faSGreg Clayton                 case eValueTypeVariableGlobal:      // global variable
85369b582faSGreg Clayton                 case eValueTypeVariableStatic:      // static variable
85469b582faSGreg Clayton                 case eValueTypeVariableArgument:    // function argument variables
85569b582faSGreg Clayton                 case eValueTypeVariableLocal:       // function local variables
85669b582faSGreg Clayton                     {
85772eff18aSGreg Clayton 
858d9e416c0SGreg Clayton                         SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
85972eff18aSGreg Clayton 
86072eff18aSGreg Clayton                         const bool can_create = true;
86172eff18aSGreg Clayton                         const bool get_parent_variables = true;
86272eff18aSGreg Clayton                         const bool stop_if_block_is_inlined_function = true;
86372eff18aSGreg Clayton 
86472eff18aSGreg Clayton                         if (sc.block && sc.block->AppendVariables (can_create,
86572eff18aSGreg Clayton                                                                    get_parent_variables,
86672eff18aSGreg Clayton                                                                    stop_if_block_is_inlined_function,
86708a04327SEnrico Granata                                                                    &variable_list))
868beae523aSJohnny Chen                         {
869*8a2a0dfbSEnrico Granata                             if (value_type == eValueTypeVariableGlobal)
870*8a2a0dfbSEnrico Granata                             {
871*8a2a0dfbSEnrico Granata                                 const bool get_file_globals = true;
872*8a2a0dfbSEnrico Granata                                 VariableList* frame_vars = frame->GetVariableList(get_file_globals);
873*8a2a0dfbSEnrico Granata                                 if (frame_vars)
874*8a2a0dfbSEnrico Granata                                     frame_vars->AppendVariablesIfUnique(variable_list);
875*8a2a0dfbSEnrico Granata                             }
87669b582faSGreg Clayton                             ConstString const_name(name);
87708a04327SEnrico Granata                             VariableSP variable_sp(variable_list.FindVariable(const_name,value_type));
87808a04327SEnrico Granata                             if (variable_sp)
879beae523aSJohnny Chen                             {
880e3e91517SEnrico Granata                                 value_sp = frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues);
881e3e91517SEnrico Granata                                 sb_value.SetSP (value_sp, use_dynamic);
882beae523aSJohnny Chen                                 break;
883beae523aSJohnny Chen                             }
88430fdc8d8SChris Lattner                         }
88530fdc8d8SChris Lattner                     }
88669b582faSGreg Clayton                     break;
88769b582faSGreg Clayton 
88869b582faSGreg Clayton                 case eValueTypeRegister:            // stack frame register value
88969b582faSGreg Clayton                     {
890d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
89169b582faSGreg Clayton                         if (reg_ctx)
89269b582faSGreg Clayton                         {
89369b582faSGreg Clayton                             const uint32_t num_regs = reg_ctx->GetRegisterCount();
89469b582faSGreg Clayton                             for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
89569b582faSGreg Clayton                             {
89669b582faSGreg Clayton                                 const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
89769b582faSGreg Clayton                                 if (reg_info &&
89869b582faSGreg Clayton                                     ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
89969b582faSGreg Clayton                                      (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
90069b582faSGreg Clayton                                 {
901d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
90281e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
90381e871edSGreg Clayton                                     break;
90469b582faSGreg Clayton                                 }
90569b582faSGreg Clayton                             }
90669b582faSGreg Clayton                         }
90769b582faSGreg Clayton                     }
90869b582faSGreg Clayton                     break;
90969b582faSGreg Clayton 
91069b582faSGreg Clayton                 case eValueTypeRegisterSet:         // A collection of stack frame register values
91169b582faSGreg Clayton                     {
912d9e416c0SGreg Clayton                         RegisterContextSP reg_ctx (frame->GetRegisterContext());
91369b582faSGreg Clayton                         if (reg_ctx)
91469b582faSGreg Clayton                         {
91569b582faSGreg Clayton                             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
91669b582faSGreg Clayton                             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
91769b582faSGreg Clayton                             {
91869b582faSGreg Clayton                                 const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
91969b582faSGreg Clayton                                 if (reg_set &&
92069b582faSGreg Clayton                                     ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
92169b582faSGreg Clayton                                      (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
92269b582faSGreg Clayton                                 {
923d9e416c0SGreg Clayton                                     value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
92481e871edSGreg Clayton                                     sb_value.SetSP (value_sp);
92581e871edSGreg Clayton                                     break;
92669b582faSGreg Clayton                                 }
92769b582faSGreg Clayton                             }
92869b582faSGreg Clayton                         }
92969b582faSGreg Clayton                     }
93069b582faSGreg Clayton                     break;
93169b582faSGreg Clayton 
93269b582faSGreg Clayton                 case eValueTypeConstResult:         // constant result variables
93369b582faSGreg Clayton                     {
93469b582faSGreg Clayton                         ConstString const_name(name);
935d9e416c0SGreg Clayton                         ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name));
93669b582faSGreg Clayton                         if (expr_var_sp)
93781e871edSGreg Clayton                         {
93881e871edSGreg Clayton                             value_sp = expr_var_sp->GetValueObject();
939e3e91517SEnrico Granata                             sb_value.SetSP (value_sp, use_dynamic);
94081e871edSGreg Clayton                         }
94169b582faSGreg Clayton                     }
94269b582faSGreg Clayton                     break;
94369b582faSGreg Clayton 
94469b582faSGreg Clayton                 default:
94569b582faSGreg Clayton                     break;
94669b582faSGreg Clayton                 }
947beae523aSJohnny Chen             }
948c9858e4dSGreg Clayton             else
949c9858e4dSGreg Clayton             {
950c9858e4dSGreg Clayton                 if (log)
9517730b9a4SJim Ingham                     log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame.");
9527730b9a4SJim Ingham             }
9537730b9a4SJim Ingham         }
9547730b9a4SJim Ingham         else
9557730b9a4SJim Ingham         {
9567730b9a4SJim Ingham             if (log)
9577730b9a4SJim Ingham                 log->Printf ("SBFrame::FindValue () => error: process is running");
958c9858e4dSGreg Clayton         }
9597fdf9ef1SGreg Clayton     }
960dde9cff3SCaroline Tice 
9614838131bSGreg Clayton     if (log)
96269b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
963d9e416c0SGreg Clayton                      frame, name, value_type, value_sp.get());
9644838131bSGreg Clayton 
9654838131bSGreg Clayton 
966dde9cff3SCaroline Tice     return sb_value;
967dde9cff3SCaroline Tice }
968dde9cff3SCaroline Tice 
96930fdc8d8SChris Lattner bool
97035e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const
97135e2ab60SJohnny Chen {
972b57e4a1bSJason Molenda     lldb::StackFrameSP this_sp = GetFrameSP();
973b57e4a1bSJason Molenda     lldb::StackFrameSP that_sp = that.GetFrameSP();
97435e2ab60SJohnny Chen     return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
97535e2ab60SJohnny Chen }
97635e2ab60SJohnny Chen 
97735e2ab60SJohnny Chen bool
97830fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
97930fdc8d8SChris Lattner {
98035e2ab60SJohnny Chen     return IsEqual(rhs);
98130fdc8d8SChris Lattner }
98230fdc8d8SChris Lattner 
98330fdc8d8SChris Lattner bool
98430fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
98530fdc8d8SChris Lattner {
98635e2ab60SJohnny Chen     return !IsEqual(rhs);
987481cef25SGreg Clayton }
98830fdc8d8SChris Lattner 
98930fdc8d8SChris Lattner SBThread
99030fdc8d8SChris Lattner SBFrame::GetThread () const
99130fdc8d8SChris Lattner {
9925160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
993ceb6b139SCaroline Tice 
9947fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
995d9e416c0SGreg Clayton     ThreadSP thread_sp (exe_ctx.GetThreadSP());
996d9e416c0SGreg Clayton     SBThread sb_thread (thread_sp);
997ceb6b139SCaroline Tice 
998ceb6b139SCaroline Tice     if (log)
999750cd175SCaroline Tice     {
1000750cd175SCaroline Tice         SBStream sstr;
1001750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
1002d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
1003d9e416c0SGreg Clayton                      exe_ctx.GetFramePtr(),
1004d9e416c0SGreg Clayton                      thread_sp.get(),
1005d9e416c0SGreg Clayton                      sstr.GetData());
1006750cd175SCaroline Tice     }
1007ceb6b139SCaroline Tice 
100830fdc8d8SChris Lattner     return sb_thread;
100930fdc8d8SChris Lattner }
101030fdc8d8SChris Lattner 
101130fdc8d8SChris Lattner const char *
101230fdc8d8SChris Lattner SBFrame::Disassemble () const
101330fdc8d8SChris Lattner {
10145160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10154838131bSGreg Clayton     const char *disassembly = NULL;
10164fc6cb9cSJim Ingham     Mutex::Locker api_locker;
10174fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
10184fc6cb9cSJim Ingham 
1019b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1020d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
10217730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
10227730b9a4SJim Ingham     if (target && process)
1023af67cecdSGreg Clayton     {
10247fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10257730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
10267730b9a4SJim Ingham         {
10277730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
10287730b9a4SJim Ingham             if (frame)
10297fdf9ef1SGreg Clayton             {
1030d9e416c0SGreg Clayton                 disassembly = frame->Disassemble();
1031af67cecdSGreg Clayton             }
1032c9858e4dSGreg Clayton             else
1033c9858e4dSGreg Clayton             {
1034c9858e4dSGreg Clayton                 if (log)
10357730b9a4SJim Ingham                     log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame.");
10367730b9a4SJim Ingham             }
10377730b9a4SJim Ingham         }
10387730b9a4SJim Ingham         else
10397730b9a4SJim Ingham         {
10407730b9a4SJim Ingham             if (log)
10417730b9a4SJim Ingham                 log->Printf ("SBFrame::Disassemble () => error: process is running");
10427fdf9ef1SGreg Clayton         }
1043c9858e4dSGreg Clayton     }
10444838131bSGreg Clayton 
10454838131bSGreg Clayton     if (log)
1046d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly);
10474838131bSGreg Clayton 
10484838131bSGreg Clayton     return disassembly;
104930fdc8d8SChris Lattner }
105030fdc8d8SChris Lattner 
105130fdc8d8SChris Lattner 
105230fdc8d8SChris Lattner SBValueList
105330fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
105430fdc8d8SChris Lattner                        bool locals,
105530fdc8d8SChris Lattner                        bool statics,
105630fdc8d8SChris Lattner                        bool in_scope_only)
105730fdc8d8SChris Lattner {
1058316d498bSGreg Clayton     SBValueList value_list;
10597fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1060b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
1061d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1062d9e416c0SGreg Clayton     if (frame && target)
1063316d498bSGreg Clayton     {
1064d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
1065316d498bSGreg Clayton         value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic);
1066316d498bSGreg Clayton     }
1067316d498bSGreg Clayton     return value_list;
106878a685aaSJim Ingham }
106978a685aaSJim Ingham 
107078a685aaSJim Ingham SBValueList
107178a685aaSJim Ingham SBFrame::GetVariables (bool arguments,
107278a685aaSJim Ingham                        bool locals,
107378a685aaSJim Ingham                        bool statics,
107478a685aaSJim Ingham                        bool in_scope_only,
10752837b766SJim Ingham                        lldb::DynamicValueType  use_dynamic)
107678a685aaSJim Ingham {
10775160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1078ceb6b139SCaroline Tice 
1079b9556accSGreg Clayton     SBValueList value_list;
10804fc6cb9cSJim Ingham     Mutex::Locker api_locker;
10814fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
10824fc6cb9cSJim Ingham 
1083b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1084d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1085b9556accSGreg Clayton 
1086ceb6b139SCaroline Tice     if (log)
10877730b9a4SJim Ingham         log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
10884838131bSGreg Clayton                      arguments,
10894838131bSGreg Clayton                      locals,
10904838131bSGreg Clayton                      statics,
10914838131bSGreg Clayton                      in_scope_only);
1092ceb6b139SCaroline Tice 
10937730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
10947730b9a4SJim Ingham     if (target && process)
109530fdc8d8SChris Lattner     {
10967fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10977730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
10987fdf9ef1SGreg Clayton         {
10997730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
11007730b9a4SJim Ingham             if (frame)
11017730b9a4SJim Ingham             {
110230fdc8d8SChris Lattner                 size_t i;
1103af67cecdSGreg Clayton                 VariableList *variable_list = NULL;
1104d9e416c0SGreg Clayton                 variable_list = frame->GetVariableList(true);
110530fdc8d8SChris Lattner                 if (variable_list)
110630fdc8d8SChris Lattner                 {
110730fdc8d8SChris Lattner                     const size_t num_variables = variable_list->GetSize();
110830fdc8d8SChris Lattner                     if (num_variables)
110930fdc8d8SChris Lattner                     {
111030fdc8d8SChris Lattner                         for (i = 0; i < num_variables; ++i)
111130fdc8d8SChris Lattner                         {
111230fdc8d8SChris Lattner                             VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
111330fdc8d8SChris Lattner                             if (variable_sp)
111430fdc8d8SChris Lattner                             {
111530fdc8d8SChris Lattner                                 bool add_variable = false;
111630fdc8d8SChris Lattner                                 switch (variable_sp->GetScope())
111730fdc8d8SChris Lattner                                 {
111830fdc8d8SChris Lattner                                 case eValueTypeVariableGlobal:
111930fdc8d8SChris Lattner                                 case eValueTypeVariableStatic:
112030fdc8d8SChris Lattner                                     add_variable = statics;
112130fdc8d8SChris Lattner                                     break;
112230fdc8d8SChris Lattner 
112330fdc8d8SChris Lattner                                 case eValueTypeVariableArgument:
112430fdc8d8SChris Lattner                                     add_variable = arguments;
112530fdc8d8SChris Lattner                                     break;
112630fdc8d8SChris Lattner 
112730fdc8d8SChris Lattner                                 case eValueTypeVariableLocal:
112830fdc8d8SChris Lattner                                     add_variable = locals;
112930fdc8d8SChris Lattner                                     break;
1130c982c768SGreg Clayton 
1131c982c768SGreg Clayton                                 default:
1132c982c768SGreg Clayton                                     break;
113330fdc8d8SChris Lattner                                 }
113430fdc8d8SChris Lattner                                 if (add_variable)
113530fdc8d8SChris Lattner                                 {
1136d9e416c0SGreg Clayton                                     if (in_scope_only && !variable_sp->IsInScope(frame))
113730fdc8d8SChris Lattner                                         continue;
113830fdc8d8SChris Lattner 
1139e3e91517SEnrico Granata                                     ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues));
1140e3e91517SEnrico Granata                                     SBValue value_sb;
1141e3e91517SEnrico Granata                                     value_sb.SetSP(valobj_sp,use_dynamic);
1142e3e91517SEnrico Granata                                     value_list.Append(value_sb);
114330fdc8d8SChris Lattner                                 }
114430fdc8d8SChris Lattner                             }
114530fdc8d8SChris Lattner                         }
114630fdc8d8SChris Lattner                     }
114730fdc8d8SChris Lattner                 }
114830fdc8d8SChris Lattner             }
1149c9858e4dSGreg Clayton             else
1150c9858e4dSGreg Clayton             {
1151c9858e4dSGreg Clayton                 if (log)
11527730b9a4SJim Ingham                     log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame.");
11537730b9a4SJim Ingham             }
11547730b9a4SJim Ingham         }
11557730b9a4SJim Ingham         else
11567730b9a4SJim Ingham         {
11577730b9a4SJim Ingham             if (log)
11587730b9a4SJim Ingham                 log->Printf ("SBFrame::GetVariables () => error: process is running");
1159c9858e4dSGreg Clayton         }
11607fdf9ef1SGreg Clayton     }
1161ceb6b139SCaroline Tice 
1162ceb6b139SCaroline Tice     if (log)
1163ceb6b139SCaroline Tice     {
116408ec0b61SEnrico Granata         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame, value_list.opaque_ptr());
1165ceb6b139SCaroline Tice     }
1166ceb6b139SCaroline Tice 
116730fdc8d8SChris Lattner     return value_list;
116830fdc8d8SChris Lattner }
116930fdc8d8SChris Lattner 
117069b582faSGreg Clayton SBValueList
117130fdc8d8SChris Lattner SBFrame::GetRegisters ()
117230fdc8d8SChris Lattner {
11735160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1174ceb6b139SCaroline Tice 
117530fdc8d8SChris Lattner     SBValueList value_list;
11764fc6cb9cSJim Ingham     Mutex::Locker api_locker;
11774fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
11784fc6cb9cSJim Ingham 
1179b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1180d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
11817730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
11827730b9a4SJim Ingham     if (target && process)
118330fdc8d8SChris Lattner     {
11847fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11857730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
11867730b9a4SJim Ingham         {
11877730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
11887730b9a4SJim Ingham             if (frame)
11897fdf9ef1SGreg Clayton             {
1190d9e416c0SGreg Clayton                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
119130fdc8d8SChris Lattner                 if (reg_ctx)
119230fdc8d8SChris Lattner                 {
119330fdc8d8SChris Lattner                     const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
119430fdc8d8SChris Lattner                     for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
119530fdc8d8SChris Lattner                     {
1196d9e416c0SGreg Clayton                         value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
119730fdc8d8SChris Lattner                     }
119830fdc8d8SChris Lattner                 }
119930fdc8d8SChris Lattner             }
1200c9858e4dSGreg Clayton             else
1201c9858e4dSGreg Clayton             {
1202c9858e4dSGreg Clayton                 if (log)
12037730b9a4SJim Ingham                     log->Printf ("SBFrame::GetRegisters () => 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::GetRegisters () => error: process is running");
1210c9858e4dSGreg Clayton         }
12117fdf9ef1SGreg Clayton     }
1212ceb6b139SCaroline Tice 
1213ceb6b139SCaroline Tice     if (log)
121408ec0b61SEnrico Granata         log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.opaque_ptr());
1215ceb6b139SCaroline Tice 
121630fdc8d8SChris Lattner     return value_list;
121730fdc8d8SChris Lattner }
121830fdc8d8SChris Lattner 
1219ad9a53c5SJason Molenda SBValue
1220ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name)
1221ad9a53c5SJason Molenda {
1222ad9a53c5SJason Molenda     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1223ad9a53c5SJason Molenda 
1224ad9a53c5SJason Molenda     SBValue result;
1225ad9a53c5SJason Molenda     ValueObjectSP value_sp;
1226ad9a53c5SJason Molenda     Mutex::Locker api_locker;
1227ad9a53c5SJason Molenda     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1228ad9a53c5SJason Molenda 
1229b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1230ad9a53c5SJason Molenda     Target *target = exe_ctx.GetTargetPtr();
1231ad9a53c5SJason Molenda     Process *process = exe_ctx.GetProcessPtr();
1232ad9a53c5SJason Molenda     if (target && process)
1233ad9a53c5SJason Molenda     {
1234ad9a53c5SJason Molenda         Process::StopLocker stop_locker;
1235ad9a53c5SJason Molenda         if (stop_locker.TryLock(&process->GetRunLock()))
1236ad9a53c5SJason Molenda         {
1237ad9a53c5SJason Molenda             frame = exe_ctx.GetFramePtr();
1238ad9a53c5SJason Molenda             if (frame)
1239ad9a53c5SJason Molenda             {
1240ad9a53c5SJason Molenda                 RegisterContextSP reg_ctx (frame->GetRegisterContext());
1241ad9a53c5SJason Molenda                 if (reg_ctx)
1242ad9a53c5SJason Molenda                 {
1243ad9a53c5SJason Molenda                     const uint32_t num_regs = reg_ctx->GetRegisterCount();
1244ad9a53c5SJason Molenda                     for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
1245ad9a53c5SJason Molenda                     {
1246ad9a53c5SJason Molenda                         const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
1247ad9a53c5SJason Molenda                         if (reg_info &&
1248ad9a53c5SJason Molenda                             ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
1249ad9a53c5SJason Molenda                              (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
1250ad9a53c5SJason Molenda                         {
1251ad9a53c5SJason Molenda                             value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
1252ad9a53c5SJason Molenda                             result.SetSP (value_sp);
1253ad9a53c5SJason Molenda                             break;
1254ad9a53c5SJason Molenda                         }
1255ad9a53c5SJason Molenda                     }
1256ad9a53c5SJason Molenda                 }
1257ad9a53c5SJason Molenda             }
1258ad9a53c5SJason Molenda             else
1259ad9a53c5SJason Molenda             {
1260ad9a53c5SJason Molenda                 if (log)
12615d353842SJason Molenda                     log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame.");
1262ad9a53c5SJason Molenda             }
1263ad9a53c5SJason Molenda         }
1264ad9a53c5SJason Molenda         else
1265ad9a53c5SJason Molenda         {
1266ad9a53c5SJason Molenda             if (log)
12675d353842SJason Molenda                 log->Printf ("SBFrame::FindRegister () => error: process is running");
1268ad9a53c5SJason Molenda         }
1269ad9a53c5SJason Molenda     }
1270ad9a53c5SJason Molenda 
1271ad9a53c5SJason Molenda     if (log)
12725d353842SJason Molenda         log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)", frame, value_sp.get());
1273ad9a53c5SJason Molenda 
1274ad9a53c5SJason Molenda     return result;
1275ad9a53c5SJason Molenda }
1276ad9a53c5SJason Molenda 
1277dde9cff3SCaroline Tice bool
1278dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
1279dde9cff3SCaroline Tice {
12805160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1281da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1282da7bc7d0SGreg Clayton 
12834fc6cb9cSJim Ingham     Mutex::Locker api_locker;
12844fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
12854fc6cb9cSJim Ingham 
1286b57e4a1bSJason Molenda     StackFrame *frame;
1287d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
12887730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
12897730b9a4SJim Ingham     if (target && process)
1290dde9cff3SCaroline Tice     {
12917fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
12927730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
12937730b9a4SJim Ingham         {
12947730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
12957730b9a4SJim Ingham             if (frame)
12967fdf9ef1SGreg Clayton             {
1297d9e416c0SGreg Clayton                 frame->DumpUsingSettingsFormat (&strm);
1298dde9cff3SCaroline Tice             }
1299c9858e4dSGreg Clayton             else
1300c9858e4dSGreg Clayton             {
1301c9858e4dSGreg Clayton                 if (log)
13027730b9a4SJim Ingham                     log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame.");
13037730b9a4SJim Ingham             }
13047730b9a4SJim Ingham         }
13057730b9a4SJim Ingham         else
13067730b9a4SJim Ingham         {
13077730b9a4SJim Ingham             if (log)
13087730b9a4SJim Ingham                 log->Printf ("SBFrame::GetDescription () => error: process is running");
1309c9858e4dSGreg Clayton         }
1310c9858e4dSGreg Clayton 
13117fdf9ef1SGreg Clayton     }
1312dde9cff3SCaroline Tice     else
1313da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1314dde9cff3SCaroline Tice 
1315dde9cff3SCaroline Tice     return true;
1316dde9cff3SCaroline Tice }
13171d3afba3SGreg Clayton 
131869b582faSGreg Clayton SBValue
13191d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
13201d3afba3SGreg Clayton {
1321316d498bSGreg Clayton     SBValue result;
13227fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1323b57e4a1bSJason Molenda     StackFrame *frame = exe_ctx.GetFramePtr();
1324d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1325d9e416c0SGreg Clayton     if (frame && target)
1326316d498bSGreg Clayton     {
132735e1bda6SJim Ingham         SBExpressionOptions options;
132835e1bda6SJim Ingham         lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue();
1329cced1566SGreg Clayton         options.SetFetchDynamicValue (fetch_dynamic_value);
133035e1bda6SJim Ingham         options.SetUnwindOnError (true);
133135e1bda6SJim Ingham         return EvaluateExpression (expr, options);
1332316d498bSGreg Clayton     }
1333316d498bSGreg Clayton     return result;
133478a685aaSJim Ingham }
133578a685aaSJim Ingham 
133678a685aaSJim Ingham SBValue
13372837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
133878a685aaSJim Ingham {
133935e1bda6SJim Ingham     SBExpressionOptions options;
1340cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
134135e1bda6SJim Ingham     options.SetUnwindOnError (true);
134235e1bda6SJim Ingham     return EvaluateExpression (expr, options);
13437ba6e991SJim Ingham }
13447ba6e991SJim Ingham 
13457ba6e991SJim Ingham SBValue
13467ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error)
13477ba6e991SJim Ingham {
134835e1bda6SJim Ingham     SBExpressionOptions options;
1349cced1566SGreg Clayton     options.SetFetchDynamicValue (fetch_dynamic_value);
135035e1bda6SJim Ingham     options.SetUnwindOnError (unwind_on_error);
135135e1bda6SJim Ingham     return EvaluateExpression (expr, options);
135235e1bda6SJim Ingham }
135335e1bda6SJim Ingham 
135435e1bda6SJim Ingham lldb::SBValue
135535e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options)
135635e1bda6SJim Ingham {
13575160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
13584838131bSGreg Clayton 
13595160ce5cSGreg Clayton     Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1360a162ebafSSean Callanan 
136123f59509SGreg Clayton     ExecutionResults exe_results = eExecutionSetupError;
136269b582faSGreg Clayton     SBValue expr_result;
13637730b9a4SJim Ingham 
13647730b9a4SJim Ingham     if (expr == NULL || expr[0] == '\0')
13657730b9a4SJim Ingham     {
13667730b9a4SJim Ingham         if (log)
13677730b9a4SJim Ingham             log->Printf ("SBFrame::EvaluateExpression called with an empty expression");
13687730b9a4SJim Ingham         return expr_result;
13697730b9a4SJim Ingham     }
13707730b9a4SJim Ingham 
137181e871edSGreg Clayton     ValueObjectSP expr_value_sp;
13724838131bSGreg Clayton 
13734fc6cb9cSJim Ingham     Mutex::Locker api_locker;
13744fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
13754fc6cb9cSJim Ingham 
1376b9556accSGreg Clayton     if (log)
13777730b9a4SJim Ingham         log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr);
1378b9556accSGreg Clayton 
1379b57e4a1bSJason Molenda     StackFrame *frame = NULL;
13807730b9a4SJim Ingham     Target *target = exe_ctx.GetTargetPtr();
13817730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
13827730b9a4SJim Ingham 
13837730b9a4SJim Ingham     if (target && process)
13841d3afba3SGreg Clayton     {
13857fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
13867730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
13877730b9a4SJim Ingham         {
13887730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
13897730b9a4SJim Ingham             if (frame)
13907fdf9ef1SGreg Clayton             {
1391fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1392fb6621efSGreg Clayton                 {
13931ba7c4d0SGreg Clayton                     StreamString frame_description;
1394d9e416c0SGreg Clayton                     frame->DumpUsingSettingsFormat (&frame_description);
13951ba7c4d0SGreg Clayton                     Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
1396cced1566SGreg Clayton                                                          expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str());
1397fb6621efSGreg Clayton                 }
1398fb6621efSGreg Clayton 
1399d9e416c0SGreg Clayton                 exe_results = target->EvaluateExpression (expr,
1400d9e416c0SGreg Clayton                                                           frame,
1401d4439aa9SEnrico Granata                                                           expr_value_sp,
140235e1bda6SJim Ingham                                                           options.ref());
1403e3e91517SEnrico Granata                 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue());
1404fb6621efSGreg Clayton 
1405fb6621efSGreg Clayton                 if (target->GetDisplayExpressionsInCrashlogs())
1406f49e65aeSGreg Clayton                     Host::SetCrashDescription (NULL);
14071d3afba3SGreg Clayton             }
1408c9858e4dSGreg Clayton             else
1409c9858e4dSGreg Clayton             {
1410c9858e4dSGreg Clayton                 if (log)
14117730b9a4SJim Ingham                     log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame.");
14127730b9a4SJim Ingham             }
14137730b9a4SJim Ingham         }
14147730b9a4SJim Ingham         else
14157730b9a4SJim Ingham         {
14167730b9a4SJim Ingham             if (log)
14177730b9a4SJim Ingham                 log->Printf ("SBFrame::EvaluateExpression () => error: process is running");
1418c9858e4dSGreg Clayton         }
14197fdf9ef1SGreg Clayton     }
14204838131bSGreg Clayton 
1421cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1422a162ebafSSean Callanan     if (expr_log)
142378a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
1424fe42ac4dSGreg Clayton                          expr_result.GetValue(),
1425fe42ac4dSGreg Clayton                          expr_result.GetSummary());
1426a162ebafSSean Callanan 
14274838131bSGreg Clayton     if (log)
1428d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1429d9e416c0SGreg Clayton                      frame,
143078a685aaSJim Ingham                      expr,
143181e871edSGreg Clayton                      expr_value_sp.get(),
143225f3a3cdSJohnny Chen                      exe_results);
1433cf7e2dc0SJason Molenda #endif
14344838131bSGreg Clayton 
1435cfd1acedSGreg Clayton     return expr_result;
14361d3afba3SGreg Clayton }
1437316d498bSGreg Clayton 
1438316d498bSGreg Clayton bool
1439316d498bSGreg Clayton SBFrame::IsInlined()
1440316d498bSGreg Clayton {
14415160ce5cSGreg Clayton     Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14427fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1443b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1444d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
14457730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
14467730b9a4SJim Ingham     if (target && process)
1447316d498bSGreg Clayton     {
14487fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
14497730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
14507730b9a4SJim Ingham         {
14517730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
14527730b9a4SJim Ingham             if (frame)
14537fdf9ef1SGreg Clayton             {
14547fdf9ef1SGreg Clayton 
1455d9e416c0SGreg Clayton                 Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1456316d498bSGreg Clayton                 if (block)
1457316d498bSGreg Clayton                     return block->GetContainingInlinedBlock () != NULL;
1458316d498bSGreg Clayton             }
1459c9858e4dSGreg Clayton             else
1460c9858e4dSGreg Clayton             {
1461c9858e4dSGreg Clayton                 if (log)
14627730b9a4SJim Ingham                     log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame.");
14637730b9a4SJim Ingham             }
14647730b9a4SJim Ingham         }
14657730b9a4SJim Ingham         else
14667730b9a4SJim Ingham         {
14677730b9a4SJim Ingham             if (log)
14687730b9a4SJim Ingham                 log->Printf ("SBFrame::IsInlined () => error: process is running");
1469c9858e4dSGreg Clayton         }
1470c9858e4dSGreg Clayton 
14717fdf9ef1SGreg Clayton     }
1472316d498bSGreg Clayton     return false;
1473316d498bSGreg Clayton }
1474316d498bSGreg Clayton 
1475316d498bSGreg Clayton const char *
1476316d498bSGreg Clayton SBFrame::GetFunctionName()
1477316d498bSGreg Clayton {
14785160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1479316d498bSGreg Clayton     const char *name = NULL;
14807fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1481b57e4a1bSJason Molenda     StackFrame *frame = NULL;
1482d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
14837730b9a4SJim Ingham     Process *process = exe_ctx.GetProcessPtr();
14847730b9a4SJim Ingham     if (target && process)
1485316d498bSGreg Clayton     {
14867fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
14877730b9a4SJim Ingham         if (stop_locker.TryLock(&process->GetRunLock()))
14887730b9a4SJim Ingham         {
14897730b9a4SJim Ingham             frame = exe_ctx.GetFramePtr();
14907730b9a4SJim Ingham             if (frame)
14917fdf9ef1SGreg Clayton             {
1492d9e416c0SGreg Clayton                 SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1493316d498bSGreg Clayton                 if (sc.block)
1494316d498bSGreg Clayton                 {
1495316d498bSGreg Clayton                     Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1496316d498bSGreg Clayton                     if (inlined_block)
1497316d498bSGreg Clayton                     {
1498316d498bSGreg Clayton                         const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1499316d498bSGreg Clayton                         name = inlined_info->GetName().AsCString();
1500316d498bSGreg Clayton                     }
1501316d498bSGreg Clayton                 }
1502316d498bSGreg Clayton 
1503316d498bSGreg Clayton                 if (name == NULL)
1504316d498bSGreg Clayton                 {
1505316d498bSGreg Clayton                     if (sc.function)
1506316d498bSGreg Clayton                         name = sc.function->GetName().GetCString();
1507316d498bSGreg Clayton                 }
1508316d498bSGreg Clayton 
1509316d498bSGreg Clayton                 if (name == NULL)
1510316d498bSGreg Clayton                 {
1511316d498bSGreg Clayton                     if (sc.symbol)
1512316d498bSGreg Clayton                         name = sc.symbol->GetName().GetCString();
1513316d498bSGreg Clayton                 }
1514316d498bSGreg Clayton             }
1515c9858e4dSGreg Clayton             else
1516c9858e4dSGreg Clayton             {
1517c9858e4dSGreg Clayton                 if (log)
15187730b9a4SJim Ingham                     log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame.");
15197730b9a4SJim Ingham             }
15207730b9a4SJim Ingham         }
15217730b9a4SJim Ingham         else
15227730b9a4SJim Ingham         {
15237730b9a4SJim Ingham             if (log)
15247730b9a4SJim Ingham                 log->Printf ("SBFrame::GetFunctionName() => error: process is running");
1525c9858e4dSGreg Clayton 
1526c9858e4dSGreg Clayton         }
15277fdf9ef1SGreg Clayton     }
1528316d498bSGreg Clayton     return name;
1529316d498bSGreg Clayton }
1530316d498bSGreg Clayton 
1531