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"
3630fdc8d8SChris Lattner #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"
43*35e1bda6SJim 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 
5769b582faSGreg Clayton SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) :
587fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef (lldb_object_sp))
5930fdc8d8SChris Lattner {
6069b582faSGreg Clayton     LogSP 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 
89b9556accSGreg Clayton StackFrameSP
90b9556accSGreg Clayton SBFrame::GetFrameSP() const
91b9556accSGreg Clayton {
92af2589eaSGreg Clayton     if (m_opaque_sp)
937fdf9ef1SGreg Clayton         return m_opaque_sp->GetFrameSP();
94af2589eaSGreg Clayton     return StackFrameSP();
95b9556accSGreg Clayton }
9630fdc8d8SChris Lattner 
9730fdc8d8SChris Lattner void
98b9556accSGreg Clayton 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 {
112c9858e4dSGreg Clayton     LogSP 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 
117d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
118d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
119d9e416c0SGreg Clayton     if (frame && target)
120af67cecdSGreg Clayton     {
1217fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1227fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1237fdf9ef1SGreg Clayton         {
124d9e416c0SGreg Clayton             sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope));
125af67cecdSGreg Clayton         }
126c9858e4dSGreg Clayton         else
127c9858e4dSGreg Clayton         {
128c9858e4dSGreg Clayton             if (log)
129c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetSymbolContext () => error: process is running", frame);
130c9858e4dSGreg Clayton         }
1317fdf9ef1SGreg Clayton     }
132ceb6b139SCaroline Tice 
133ceb6b139SCaroline Tice     if (log)
1344838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)",
135d9e416c0SGreg Clayton                      frame, resolve_scope, sb_sym_ctx.get());
136ceb6b139SCaroline Tice 
13730fdc8d8SChris Lattner     return sb_sym_ctx;
13830fdc8d8SChris Lattner }
13930fdc8d8SChris Lattner 
14030fdc8d8SChris Lattner SBModule
14130fdc8d8SChris Lattner SBFrame::GetModule () const
14230fdc8d8SChris Lattner {
143c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14472eff18aSGreg Clayton     SBModule sb_module;
145acdbe816SGreg Clayton     ModuleSP module_sp;
1464fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1474fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1484fc6cb9cSJim Ingham 
149d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
150d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
151d9e416c0SGreg Clayton     if (frame && target)
152af67cecdSGreg Clayton     {
1537fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1547fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1557fdf9ef1SGreg Clayton         {
156d9e416c0SGreg Clayton             module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp;
157acdbe816SGreg Clayton             sb_module.SetSP (module_sp);
158af67cecdSGreg Clayton         }
159c9858e4dSGreg Clayton         else
160c9858e4dSGreg Clayton         {
161c9858e4dSGreg Clayton             if (log)
162c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetModule () => error: process is running", frame);
163c9858e4dSGreg Clayton         }
1647fdf9ef1SGreg Clayton     }
16572eff18aSGreg Clayton 
1664838131bSGreg Clayton     if (log)
1674838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
168d9e416c0SGreg Clayton                      frame, module_sp.get());
1694838131bSGreg Clayton 
17030fdc8d8SChris Lattner     return sb_module;
17130fdc8d8SChris Lattner }
17230fdc8d8SChris Lattner 
17330fdc8d8SChris Lattner SBCompileUnit
17430fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
17530fdc8d8SChris Lattner {
176c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
17772eff18aSGreg Clayton     SBCompileUnit sb_comp_unit;
1784fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1794fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1804fc6cb9cSJim Ingham 
181d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
182d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
183d9e416c0SGreg Clayton     if (frame && target)
184af67cecdSGreg Clayton     {
1857fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1867fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1877fdf9ef1SGreg Clayton         {
188d9e416c0SGreg Clayton             sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
189af67cecdSGreg Clayton         }
190c9858e4dSGreg Clayton         else
191c9858e4dSGreg Clayton         {
192ceb6b139SCaroline Tice             if (log)
193c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetCompileUnit () => error: process is running", frame);
194c9858e4dSGreg Clayton         }
195c9858e4dSGreg Clayton     }
196c9858e4dSGreg Clayton     if (log)
197c9858e4dSGreg Clayton         log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
198d9e416c0SGreg Clayton                      frame, sb_comp_unit.get());
199ceb6b139SCaroline Tice 
20030fdc8d8SChris Lattner     return sb_comp_unit;
20130fdc8d8SChris Lattner }
20230fdc8d8SChris Lattner 
20330fdc8d8SChris Lattner SBFunction
20430fdc8d8SChris Lattner SBFrame::GetFunction () const
20530fdc8d8SChris Lattner {
206c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
20772eff18aSGreg Clayton     SBFunction sb_function;
2084fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2094fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2104fc6cb9cSJim Ingham 
211d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
212d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
213d9e416c0SGreg Clayton     if (frame && target)
214af67cecdSGreg Clayton     {
2157fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2167fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2177fdf9ef1SGreg Clayton         {
218d9e416c0SGreg Clayton             sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function);
219af67cecdSGreg Clayton         }
220c9858e4dSGreg Clayton         else
221c9858e4dSGreg Clayton         {
222c9858e4dSGreg Clayton             if (log)
223c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFunction () => error: process is running", frame);
2247fdf9ef1SGreg Clayton         }
225c9858e4dSGreg Clayton     }
2264838131bSGreg Clayton     if (log)
2274838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
228d9e416c0SGreg Clayton                      frame, sb_function.get());
2294838131bSGreg Clayton 
23030fdc8d8SChris Lattner     return sb_function;
23130fdc8d8SChris Lattner }
23230fdc8d8SChris Lattner 
2333b06557eSGreg Clayton SBSymbol
2343b06557eSGreg Clayton SBFrame::GetSymbol () const
2353b06557eSGreg Clayton {
236c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
23772eff18aSGreg Clayton     SBSymbol sb_symbol;
2384fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2394fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2404fc6cb9cSJim Ingham 
241d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
242d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
243d9e416c0SGreg Clayton     if (frame && target)
244af67cecdSGreg Clayton     {
2457fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2467fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2477fdf9ef1SGreg Clayton         {
248d9e416c0SGreg Clayton             sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol);
249af67cecdSGreg Clayton         }
250c9858e4dSGreg Clayton         else
251c9858e4dSGreg Clayton         {
252c9858e4dSGreg Clayton             if (log)
253c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetSymbol () => error: process is running", frame);
2547fdf9ef1SGreg Clayton         }
255c9858e4dSGreg Clayton     }
2564838131bSGreg Clayton     if (log)
2574838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
258d9e416c0SGreg Clayton                      frame, sb_symbol.get());
2593b06557eSGreg Clayton     return sb_symbol;
2603b06557eSGreg Clayton }
2613b06557eSGreg Clayton 
26230fdc8d8SChris Lattner SBBlock
26330fdc8d8SChris Lattner SBFrame::GetBlock () const
26430fdc8d8SChris Lattner {
265c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
26672eff18aSGreg Clayton     SBBlock sb_block;
2674fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2684fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2694fc6cb9cSJim Ingham 
270d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
271d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
272d9e416c0SGreg Clayton     if (frame && target)
273af67cecdSGreg Clayton     {
2747fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2757fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2767fdf9ef1SGreg Clayton         {
277d9e416c0SGreg Clayton             sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block);
278af67cecdSGreg Clayton         }
279c9858e4dSGreg Clayton         else
280c9858e4dSGreg Clayton         {
281c9858e4dSGreg Clayton             if (log)
282c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", frame);
2837fdf9ef1SGreg Clayton         }
284c9858e4dSGreg Clayton     }
2854838131bSGreg Clayton     if (log)
2864838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
287d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
28830fdc8d8SChris Lattner     return sb_block;
28930fdc8d8SChris Lattner }
29030fdc8d8SChris Lattner 
29195897c6aSGreg Clayton SBBlock
29295897c6aSGreg Clayton SBFrame::GetFrameBlock () const
29395897c6aSGreg Clayton {
29472eff18aSGreg Clayton     SBBlock sb_block;
2954fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2964fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2974fc6cb9cSJim Ingham 
298d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
299d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
300c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
301d9e416c0SGreg Clayton     if (frame && target)
302af67cecdSGreg Clayton     {
3037fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3047fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3057fdf9ef1SGreg Clayton         {
306d9e416c0SGreg Clayton             sb_block.SetPtr(frame->GetFrameBlock ());
307af67cecdSGreg Clayton         }
308c9858e4dSGreg Clayton         else
309c9858e4dSGreg Clayton         {
310c9858e4dSGreg Clayton             if (log)
311c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFrameBlock () => error: process is running", frame);
3127fdf9ef1SGreg Clayton         }
313c9858e4dSGreg Clayton     }
3144838131bSGreg Clayton     if (log)
3154838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
316d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
31795897c6aSGreg Clayton     return sb_block;
31895897c6aSGreg Clayton }
31995897c6aSGreg Clayton 
32030fdc8d8SChris Lattner SBLineEntry
32130fdc8d8SChris Lattner SBFrame::GetLineEntry () const
32230fdc8d8SChris Lattner {
323c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
32472eff18aSGreg Clayton     SBLineEntry sb_line_entry;
3254fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3264fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3274fc6cb9cSJim Ingham 
328d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
329d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
330d9e416c0SGreg Clayton     if (frame && target)
331af67cecdSGreg Clayton     {
3327fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3337fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3347fdf9ef1SGreg Clayton         {
335d9e416c0SGreg Clayton             sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry);
336af67cecdSGreg Clayton         }
337c9858e4dSGreg Clayton         else
338c9858e4dSGreg Clayton         {
339c9858e4dSGreg Clayton             if (log)
340c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetLineEntry () => error: process is running", frame);
3417fdf9ef1SGreg Clayton         }
342c9858e4dSGreg Clayton     }
3434838131bSGreg Clayton     if (log)
3444838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
345d9e416c0SGreg Clayton                      frame, sb_line_entry.get());
34630fdc8d8SChris Lattner     return sb_line_entry;
34730fdc8d8SChris Lattner }
34830fdc8d8SChris Lattner 
34930fdc8d8SChris Lattner uint32_t
35030fdc8d8SChris Lattner SBFrame::GetFrameID () const
35130fdc8d8SChris Lattner {
352b9556accSGreg Clayton     uint32_t frame_idx = UINT32_MAX;
353b9556accSGreg Clayton 
3547fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
355d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
3567fdf9ef1SGreg Clayton     if (frame)
357d9e416c0SGreg Clayton         frame_idx = frame->GetFrameIndex ();
3584838131bSGreg Clayton 
35969b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3604838131bSGreg Clayton     if (log)
3614838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameID () => %u",
362d9e416c0SGreg Clayton                      frame, frame_idx);
3634838131bSGreg Clayton     return frame_idx;
36430fdc8d8SChris Lattner }
36530fdc8d8SChris Lattner 
36669b582faSGreg Clayton addr_t
36730fdc8d8SChris Lattner SBFrame::GetPC () const
36830fdc8d8SChris Lattner {
369c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
37069b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
3714fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3724fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3734fc6cb9cSJim Ingham 
374d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
375d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
376d9e416c0SGreg Clayton     if (frame && target)
377af67cecdSGreg Clayton     {
3787fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3797fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3807fdf9ef1SGreg Clayton         {
381d9e416c0SGreg Clayton             addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target);
382af67cecdSGreg Clayton         }
383c9858e4dSGreg Clayton         else
384c9858e4dSGreg Clayton         {
385c9858e4dSGreg Clayton             if (log)
386c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetPC () => error: process is running", frame);
387c9858e4dSGreg Clayton         }
3887fdf9ef1SGreg Clayton     }
389ceb6b139SCaroline Tice 
390ceb6b139SCaroline Tice     if (log)
391d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", frame, addr);
392ceb6b139SCaroline Tice 
393ceb6b139SCaroline Tice     return addr;
39430fdc8d8SChris Lattner }
39530fdc8d8SChris Lattner 
39630fdc8d8SChris Lattner bool
39769b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc)
39830fdc8d8SChris Lattner {
399c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
400ceb6b139SCaroline Tice     bool ret_val = false;
4014fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4024fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4034fc6cb9cSJim Ingham 
404d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
405d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
406d9e416c0SGreg Clayton     if (frame && target)
407af67cecdSGreg Clayton     {
4087fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4097fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4107fdf9ef1SGreg Clayton         {
411d9e416c0SGreg Clayton             ret_val = frame->GetRegisterContext()->SetPC (new_pc);
412af67cecdSGreg Clayton         }
413c9858e4dSGreg Clayton         else
414c9858e4dSGreg Clayton         {
415c9858e4dSGreg Clayton             if (log)
416c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::SetPC () => error: process is running", frame);
417c9858e4dSGreg Clayton         }
4187fdf9ef1SGreg Clayton     }
419ceb6b139SCaroline Tice 
420ceb6b139SCaroline Tice     if (log)
4214838131bSGreg Clayton         log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i",
422d9e416c0SGreg Clayton                      frame, new_pc, ret_val);
423ceb6b139SCaroline Tice 
424ceb6b139SCaroline Tice     return ret_val;
42530fdc8d8SChris Lattner }
42630fdc8d8SChris Lattner 
42769b582faSGreg Clayton addr_t
42830fdc8d8SChris Lattner SBFrame::GetSP () const
42930fdc8d8SChris Lattner {
430c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4314838131bSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
4324fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4334fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4344fc6cb9cSJim Ingham 
435d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
436d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
437d9e416c0SGreg Clayton     if (frame && target)
438af67cecdSGreg Clayton     {
4397fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4407fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4417fdf9ef1SGreg Clayton         {
442d9e416c0SGreg Clayton             addr = frame->GetRegisterContext()->GetSP();
443af67cecdSGreg Clayton         }
444c9858e4dSGreg Clayton         else
445c9858e4dSGreg Clayton         {
446c9858e4dSGreg Clayton             if (log)
447c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetSP () => error: process is running", frame);
4487fdf9ef1SGreg Clayton         }
449c9858e4dSGreg Clayton     }
4504838131bSGreg Clayton     if (log)
451d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", frame, addr);
4524838131bSGreg Clayton 
4534838131bSGreg Clayton     return addr;
45430fdc8d8SChris Lattner }
45530fdc8d8SChris Lattner 
45630fdc8d8SChris Lattner 
45769b582faSGreg Clayton addr_t
45830fdc8d8SChris Lattner SBFrame::GetFP () const
45930fdc8d8SChris Lattner {
460c9858e4dSGreg Clayton     LogSP 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 
465d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
466d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
467d9e416c0SGreg Clayton     if (frame && target)
468af67cecdSGreg Clayton     {
4697fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4707fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4717fdf9ef1SGreg Clayton         {
472d9e416c0SGreg Clayton             addr = frame->GetRegisterContext()->GetFP();
473af67cecdSGreg Clayton         }
474c9858e4dSGreg Clayton         else
475c9858e4dSGreg Clayton         {
476c9858e4dSGreg Clayton             if (log)
477c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFP () => error: process is running", frame);
478c9858e4dSGreg Clayton         }
4797fdf9ef1SGreg Clayton     }
480ceb6b139SCaroline Tice 
481ceb6b139SCaroline Tice     if (log)
482d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", frame, addr);
483ceb6b139SCaroline Tice     return addr;
48430fdc8d8SChris Lattner }
48530fdc8d8SChris Lattner 
48630fdc8d8SChris Lattner 
48730fdc8d8SChris Lattner SBAddress
48830fdc8d8SChris Lattner SBFrame::GetPCAddress () const
48930fdc8d8SChris Lattner {
490c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
49130fdc8d8SChris Lattner     SBAddress sb_addr;
4924fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4934fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4944fc6cb9cSJim Ingham 
495d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
496d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
497d9e416c0SGreg Clayton     if (frame && target)
498af67cecdSGreg Clayton     {
4997fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5007fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5017fdf9ef1SGreg Clayton         {
502d9e416c0SGreg Clayton             sb_addr.SetAddress (&frame->GetFrameCodeAddress());
503af67cecdSGreg Clayton         }
504c9858e4dSGreg Clayton         else
505c9858e4dSGreg Clayton         {
506c9858e4dSGreg Clayton             if (log)
507c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetPCAddress () => error: process is running", frame);
5087fdf9ef1SGreg Clayton         }
509c9858e4dSGreg Clayton     }
5104838131bSGreg Clayton     if (log)
511d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get());
51230fdc8d8SChris Lattner     return sb_addr;
51330fdc8d8SChris Lattner }
51430fdc8d8SChris Lattner 
51530fdc8d8SChris Lattner void
51630fdc8d8SChris Lattner SBFrame::Clear()
51730fdc8d8SChris Lattner {
518af2589eaSGreg Clayton     m_opaque_sp->Clear();
51930fdc8d8SChris Lattner }
52030fdc8d8SChris Lattner 
5217edbdfc9SGreg Clayton lldb::SBValue
5227edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path)
5237edbdfc9SGreg Clayton {
5247edbdfc9SGreg Clayton     SBValue sb_value;
5257fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
526d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
527d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
528d9e416c0SGreg Clayton     if (frame && target)
5297edbdfc9SGreg Clayton     {
530d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
5317edbdfc9SGreg Clayton         sb_value = GetValueForVariablePath (var_path, use_dynamic);
5327edbdfc9SGreg Clayton     }
5337edbdfc9SGreg Clayton     return sb_value;
5347edbdfc9SGreg Clayton }
5357edbdfc9SGreg Clayton 
5367edbdfc9SGreg Clayton lldb::SBValue
5377edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic)
5387edbdfc9SGreg Clayton {
5397edbdfc9SGreg Clayton     SBValue sb_value;
5404fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5414fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5424fc6cb9cSJim Ingham 
543d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
544d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
545d9e416c0SGreg Clayton     if (frame && target && var_path && var_path[0])
5467edbdfc9SGreg Clayton     {
5477fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5487fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5497fdf9ef1SGreg Clayton         {
5507edbdfc9SGreg Clayton             VariableSP var_sp;
5517edbdfc9SGreg Clayton             Error error;
552d9e416c0SGreg Clayton             ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path,
5537edbdfc9SGreg Clayton                                                                               use_dynamic,
554685c88c5SGreg Clayton                                                                               StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
5557edbdfc9SGreg Clayton                                                                               var_sp,
5567edbdfc9SGreg Clayton                                                                               error));
55781e871edSGreg Clayton             sb_value.SetSP(value_sp);
5587edbdfc9SGreg Clayton         }
559c9858e4dSGreg Clayton         else
560c9858e4dSGreg Clayton         {
561c9858e4dSGreg Clayton             LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
562c9858e4dSGreg Clayton             if (log)
563c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetValueForVariablePath () => error: process is running", frame);
564c9858e4dSGreg Clayton         }
5657fdf9ef1SGreg Clayton     }
5667edbdfc9SGreg Clayton     return sb_value;
5677edbdfc9SGreg Clayton }
5687edbdfc9SGreg Clayton 
56930fdc8d8SChris Lattner SBValue
57069b582faSGreg Clayton SBFrame::FindVariable (const char *name)
57130fdc8d8SChris Lattner {
572316d498bSGreg Clayton     SBValue value;
5737fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
574d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
575d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
576d9e416c0SGreg Clayton     if (frame && target)
577316d498bSGreg Clayton     {
578d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
579316d498bSGreg Clayton         value = FindVariable (name, use_dynamic);
580316d498bSGreg Clayton     }
581316d498bSGreg Clayton     return value;
58278a685aaSJim Ingham }
58378a685aaSJim Ingham 
5847edbdfc9SGreg Clayton 
58578a685aaSJim Ingham SBValue
5862837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
58778a685aaSJim Ingham {
588c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
58969b582faSGreg Clayton     VariableSP var_sp;
59058b59f95SJim Ingham     SBValue sb_value;
59181e871edSGreg Clayton     ValueObjectSP value_sp;
5924fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5934fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5944fc6cb9cSJim Ingham 
595d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
596d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
597d9e416c0SGreg Clayton     if (frame && target && name && name[0])
59830fdc8d8SChris Lattner     {
5997fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6007fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
6017fdf9ef1SGreg Clayton         {
60269b582faSGreg Clayton             VariableList variable_list;
603d9e416c0SGreg Clayton             SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
60430fdc8d8SChris Lattner 
60572eff18aSGreg Clayton             if (sc.block)
60630fdc8d8SChris Lattner             {
60772eff18aSGreg Clayton                 const bool can_create = true;
60872eff18aSGreg Clayton                 const bool get_parent_variables = true;
60972eff18aSGreg Clayton                 const bool stop_if_block_is_inlined_function = true;
61072eff18aSGreg Clayton 
61172eff18aSGreg Clayton                 if (sc.block->AppendVariables (can_create,
61272eff18aSGreg Clayton                                                get_parent_variables,
61372eff18aSGreg Clayton                                                stop_if_block_is_inlined_function,
61472eff18aSGreg Clayton                                                &variable_list))
61572eff18aSGreg Clayton                 {
61669b582faSGreg Clayton                     var_sp = variable_list.FindVariable (ConstString(name));
61730fdc8d8SChris Lattner                 }
61872eff18aSGreg Clayton             }
61930fdc8d8SChris Lattner 
6204838131bSGreg Clayton             if (var_sp)
62181e871edSGreg Clayton             {
622d9e416c0SGreg Clayton                 value_sp = frame->GetValueObjectForFrameVariable(var_sp, use_dynamic);
62381e871edSGreg Clayton                 sb_value.SetSP(value_sp);
62481e871edSGreg Clayton             }
6257fdf9ef1SGreg Clayton         }
626c9858e4dSGreg Clayton         else
627c9858e4dSGreg Clayton         {
628c9858e4dSGreg Clayton             if (log)
629c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::FindVariable () => error: process is running", frame);
630c9858e4dSGreg Clayton         }
631316d498bSGreg Clayton     }
632316d498bSGreg Clayton 
6334838131bSGreg Clayton     if (log)
63469b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
635d9e416c0SGreg Clayton                      frame, name, value_sp.get());
6364838131bSGreg Clayton 
637dde9cff3SCaroline Tice     return sb_value;
638dde9cff3SCaroline Tice }
639dde9cff3SCaroline Tice 
64030fdc8d8SChris Lattner SBValue
64169b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type)
64230fdc8d8SChris Lattner {
643316d498bSGreg Clayton     SBValue value;
6447fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
645d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
646d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
647d9e416c0SGreg Clayton     if (frame && target)
648316d498bSGreg Clayton     {
649d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
650316d498bSGreg Clayton         value = FindValue (name, value_type, use_dynamic);
651316d498bSGreg Clayton     }
652316d498bSGreg Clayton     return value;
65378a685aaSJim Ingham }
65478a685aaSJim Ingham 
65578a685aaSJim Ingham SBValue
6562837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
65778a685aaSJim Ingham {
658c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
65969b582faSGreg Clayton     SBValue sb_value;
66081e871edSGreg Clayton     ValueObjectSP value_sp;
6614fc6cb9cSJim Ingham     Mutex::Locker api_locker;
6624fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
6634fc6cb9cSJim Ingham 
664d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
665d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
666d9e416c0SGreg Clayton     if (frame && target && name && name[0])
66730fdc8d8SChris Lattner     {
6687fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6697fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
6707fdf9ef1SGreg Clayton         {
67169b582faSGreg Clayton             switch (value_type)
67230fdc8d8SChris Lattner             {
67369b582faSGreg Clayton             case eValueTypeVariableGlobal:      // global variable
67469b582faSGreg Clayton             case eValueTypeVariableStatic:      // static variable
67569b582faSGreg Clayton             case eValueTypeVariableArgument:    // function argument variables
67669b582faSGreg Clayton             case eValueTypeVariableLocal:       // function local variables
67769b582faSGreg Clayton                 {
678d9e416c0SGreg Clayton                     VariableList *variable_list = frame->GetVariableList(true);
67972eff18aSGreg Clayton 
680d9e416c0SGreg Clayton                     SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
68172eff18aSGreg Clayton 
68272eff18aSGreg Clayton                     const bool can_create = true;
68372eff18aSGreg Clayton                     const bool get_parent_variables = true;
68472eff18aSGreg Clayton                     const bool stop_if_block_is_inlined_function = true;
68572eff18aSGreg Clayton 
68672eff18aSGreg Clayton                     if (sc.block && sc.block->AppendVariables (can_create,
68772eff18aSGreg Clayton                                                                get_parent_variables,
68872eff18aSGreg Clayton                                                                stop_if_block_is_inlined_function,
689e85d9cb8SJohnny Chen                                                                variable_list))
690beae523aSJohnny Chen                     {
69169b582faSGreg Clayton                         ConstString const_name(name);
692e85d9cb8SJohnny Chen                         const uint32_t num_variables = variable_list->GetSize();
69372eff18aSGreg Clayton                         for (uint32_t i = 0; i < num_variables; ++i)
69430fdc8d8SChris Lattner                         {
69569b582faSGreg Clayton                             VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
69669b582faSGreg Clayton                             if (variable_sp &&
69769b582faSGreg Clayton                                 variable_sp->GetScope() == value_type &&
69869b582faSGreg Clayton                                 variable_sp->GetName() == const_name)
699beae523aSJohnny Chen                             {
700d9e416c0SGreg Clayton                                 value_sp = frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic);
70181e871edSGreg Clayton                                 sb_value.SetSP (value_sp);
702beae523aSJohnny Chen                                 break;
703beae523aSJohnny Chen                             }
70430fdc8d8SChris Lattner                         }
70530fdc8d8SChris Lattner                     }
70630fdc8d8SChris Lattner                 }
70769b582faSGreg Clayton                 break;
70869b582faSGreg Clayton 
70969b582faSGreg Clayton             case eValueTypeRegister:            // stack frame register value
71069b582faSGreg Clayton                 {
711d9e416c0SGreg Clayton                     RegisterContextSP reg_ctx (frame->GetRegisterContext());
71269b582faSGreg Clayton                     if (reg_ctx)
71369b582faSGreg Clayton                     {
71469b582faSGreg Clayton                         const uint32_t num_regs = reg_ctx->GetRegisterCount();
71569b582faSGreg Clayton                         for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
71669b582faSGreg Clayton                         {
71769b582faSGreg Clayton                             const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
71869b582faSGreg Clayton                             if (reg_info &&
71969b582faSGreg Clayton                                 ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
72069b582faSGreg Clayton                                  (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
72169b582faSGreg Clayton                             {
722d9e416c0SGreg Clayton                                 value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
72381e871edSGreg Clayton                                 sb_value.SetSP (value_sp);
72481e871edSGreg Clayton                                 break;
72569b582faSGreg Clayton                             }
72669b582faSGreg Clayton                         }
72769b582faSGreg Clayton                     }
72869b582faSGreg Clayton                 }
72969b582faSGreg Clayton                 break;
73069b582faSGreg Clayton 
73169b582faSGreg Clayton             case eValueTypeRegisterSet:         // A collection of stack frame register values
73269b582faSGreg Clayton                 {
733d9e416c0SGreg Clayton                     RegisterContextSP reg_ctx (frame->GetRegisterContext());
73469b582faSGreg Clayton                     if (reg_ctx)
73569b582faSGreg Clayton                     {
73669b582faSGreg Clayton                         const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
73769b582faSGreg Clayton                         for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
73869b582faSGreg Clayton                         {
73969b582faSGreg Clayton                             const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
74069b582faSGreg Clayton                             if (reg_set &&
74169b582faSGreg Clayton                                 ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
74269b582faSGreg Clayton                                  (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
74369b582faSGreg Clayton                             {
744d9e416c0SGreg Clayton                                 value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
74581e871edSGreg Clayton                                 sb_value.SetSP (value_sp);
74681e871edSGreg Clayton                                 break;
74769b582faSGreg Clayton                             }
74869b582faSGreg Clayton                         }
74969b582faSGreg Clayton                     }
75069b582faSGreg Clayton                 }
75169b582faSGreg Clayton                 break;
75269b582faSGreg Clayton 
75369b582faSGreg Clayton             case eValueTypeConstResult:         // constant result variables
75469b582faSGreg Clayton                 {
75569b582faSGreg Clayton                     ConstString const_name(name);
756d9e416c0SGreg Clayton                     ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name));
75769b582faSGreg Clayton                     if (expr_var_sp)
75881e871edSGreg Clayton                     {
75981e871edSGreg Clayton                         value_sp = expr_var_sp->GetValueObject();
76081e871edSGreg Clayton                         sb_value.SetSP (value_sp);
76181e871edSGreg Clayton                     }
76269b582faSGreg Clayton                 }
76369b582faSGreg Clayton                 break;
76469b582faSGreg Clayton 
76569b582faSGreg Clayton             default:
76669b582faSGreg Clayton                 break;
76769b582faSGreg Clayton             }
768beae523aSJohnny Chen         }
769c9858e4dSGreg Clayton         else
770c9858e4dSGreg Clayton         {
771c9858e4dSGreg Clayton             if (log)
772c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::FindValue () => error: process is running", frame);
773c9858e4dSGreg Clayton         }
7747fdf9ef1SGreg Clayton     }
775dde9cff3SCaroline Tice 
7764838131bSGreg Clayton     if (log)
77769b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
778d9e416c0SGreg Clayton                      frame, name, value_type, value_sp.get());
7794838131bSGreg Clayton 
7804838131bSGreg Clayton 
781dde9cff3SCaroline Tice     return sb_value;
782dde9cff3SCaroline Tice }
783dde9cff3SCaroline Tice 
78430fdc8d8SChris Lattner bool
78535e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const
78635e2ab60SJohnny Chen {
78735e2ab60SJohnny Chen     lldb::StackFrameSP this_sp = GetFrameSP();
78835e2ab60SJohnny Chen     lldb::StackFrameSP that_sp = that.GetFrameSP();
78935e2ab60SJohnny Chen     return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
79035e2ab60SJohnny Chen }
79135e2ab60SJohnny Chen 
79235e2ab60SJohnny Chen bool
79330fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
79430fdc8d8SChris Lattner {
79535e2ab60SJohnny Chen     return IsEqual(rhs);
79630fdc8d8SChris Lattner }
79730fdc8d8SChris Lattner 
79830fdc8d8SChris Lattner bool
79930fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
80030fdc8d8SChris Lattner {
80135e2ab60SJohnny Chen     return !IsEqual(rhs);
802481cef25SGreg Clayton }
80330fdc8d8SChris Lattner 
80430fdc8d8SChris Lattner SBThread
80530fdc8d8SChris Lattner SBFrame::GetThread () const
80630fdc8d8SChris Lattner {
80769b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
808ceb6b139SCaroline Tice 
8097fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
810d9e416c0SGreg Clayton     ThreadSP thread_sp (exe_ctx.GetThreadSP());
811d9e416c0SGreg Clayton     SBThread sb_thread (thread_sp);
812ceb6b139SCaroline Tice 
813ceb6b139SCaroline Tice     if (log)
814750cd175SCaroline Tice     {
815750cd175SCaroline Tice         SBStream sstr;
816750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
817d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
818d9e416c0SGreg Clayton                      exe_ctx.GetFramePtr(),
819d9e416c0SGreg Clayton                      thread_sp.get(),
820d9e416c0SGreg Clayton                      sstr.GetData());
821750cd175SCaroline Tice     }
822ceb6b139SCaroline Tice 
82330fdc8d8SChris Lattner     return sb_thread;
82430fdc8d8SChris Lattner }
82530fdc8d8SChris Lattner 
82630fdc8d8SChris Lattner const char *
82730fdc8d8SChris Lattner SBFrame::Disassemble () const
82830fdc8d8SChris Lattner {
829c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
8304838131bSGreg Clayton     const char *disassembly = NULL;
8314fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8324fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8334fc6cb9cSJim Ingham 
834d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
835d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
836d9e416c0SGreg Clayton     if (frame && target)
837af67cecdSGreg Clayton     {
8387fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8397fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
8407fdf9ef1SGreg Clayton         {
841d9e416c0SGreg Clayton             disassembly = frame->Disassemble();
842af67cecdSGreg Clayton         }
843c9858e4dSGreg Clayton         else
844c9858e4dSGreg Clayton         {
845c9858e4dSGreg Clayton             if (log)
846c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::Disassemble () => error: process is running", frame);
8477fdf9ef1SGreg Clayton         }
848c9858e4dSGreg Clayton     }
8494838131bSGreg Clayton 
8504838131bSGreg Clayton     if (log)
851d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly);
8524838131bSGreg Clayton 
8534838131bSGreg Clayton     return disassembly;
85430fdc8d8SChris Lattner }
85530fdc8d8SChris Lattner 
85630fdc8d8SChris Lattner 
85730fdc8d8SChris Lattner SBValueList
85830fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
85930fdc8d8SChris Lattner                        bool locals,
86030fdc8d8SChris Lattner                        bool statics,
86130fdc8d8SChris Lattner                        bool in_scope_only)
86230fdc8d8SChris Lattner {
863316d498bSGreg Clayton     SBValueList value_list;
8647fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
865d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
866d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
867d9e416c0SGreg Clayton     if (frame && target)
868316d498bSGreg Clayton     {
869d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
870316d498bSGreg Clayton         value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic);
871316d498bSGreg Clayton     }
872316d498bSGreg Clayton     return value_list;
87378a685aaSJim Ingham }
87478a685aaSJim Ingham 
87578a685aaSJim Ingham SBValueList
87678a685aaSJim Ingham SBFrame::GetVariables (bool arguments,
87778a685aaSJim Ingham                        bool locals,
87878a685aaSJim Ingham                        bool statics,
87978a685aaSJim Ingham                        bool in_scope_only,
8802837b766SJim Ingham                        lldb::DynamicValueType  use_dynamic)
88178a685aaSJim Ingham {
88269b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
883ceb6b139SCaroline Tice 
884b9556accSGreg Clayton     SBValueList value_list;
8854fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8864fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8874fc6cb9cSJim Ingham 
888d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
889d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
890b9556accSGreg Clayton 
891ceb6b139SCaroline Tice     if (log)
8924838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
893d9e416c0SGreg Clayton                      frame,
8944838131bSGreg Clayton                      arguments,
8954838131bSGreg Clayton                      locals,
8964838131bSGreg Clayton                      statics,
8974838131bSGreg Clayton                      in_scope_only);
898ceb6b139SCaroline Tice 
899d9e416c0SGreg Clayton     if (frame && target)
90030fdc8d8SChris Lattner     {
9017fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
9027fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
9037fdf9ef1SGreg Clayton         {
904af67cecdSGreg Clayton 
90530fdc8d8SChris Lattner             size_t i;
906af67cecdSGreg Clayton             VariableList *variable_list = NULL;
907d9e416c0SGreg Clayton             variable_list = frame->GetVariableList(true);
90830fdc8d8SChris Lattner             if (variable_list)
90930fdc8d8SChris Lattner             {
91030fdc8d8SChris Lattner                 const size_t num_variables = variable_list->GetSize();
91130fdc8d8SChris Lattner                 if (num_variables)
91230fdc8d8SChris Lattner                 {
91330fdc8d8SChris Lattner                     for (i = 0; i < num_variables; ++i)
91430fdc8d8SChris Lattner                     {
91530fdc8d8SChris Lattner                         VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
91630fdc8d8SChris Lattner                         if (variable_sp)
91730fdc8d8SChris Lattner                         {
91830fdc8d8SChris Lattner                             bool add_variable = false;
91930fdc8d8SChris Lattner                             switch (variable_sp->GetScope())
92030fdc8d8SChris Lattner                             {
92130fdc8d8SChris Lattner                             case eValueTypeVariableGlobal:
92230fdc8d8SChris Lattner                             case eValueTypeVariableStatic:
92330fdc8d8SChris Lattner                                 add_variable = statics;
92430fdc8d8SChris Lattner                                 break;
92530fdc8d8SChris Lattner 
92630fdc8d8SChris Lattner                             case eValueTypeVariableArgument:
92730fdc8d8SChris Lattner                                 add_variable = arguments;
92830fdc8d8SChris Lattner                                 break;
92930fdc8d8SChris Lattner 
93030fdc8d8SChris Lattner                             case eValueTypeVariableLocal:
93130fdc8d8SChris Lattner                                 add_variable = locals;
93230fdc8d8SChris Lattner                                 break;
933c982c768SGreg Clayton 
934c982c768SGreg Clayton                             default:
935c982c768SGreg Clayton                                 break;
93630fdc8d8SChris Lattner                             }
93730fdc8d8SChris Lattner                             if (add_variable)
93830fdc8d8SChris Lattner                             {
939d9e416c0SGreg Clayton                                 if (in_scope_only && !variable_sp->IsInScope(frame))
94030fdc8d8SChris Lattner                                     continue;
94130fdc8d8SChris Lattner 
942d9e416c0SGreg Clayton                                 value_list.Append(frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic));
94330fdc8d8SChris Lattner                             }
94430fdc8d8SChris Lattner                         }
94530fdc8d8SChris Lattner                     }
94630fdc8d8SChris Lattner                 }
94730fdc8d8SChris Lattner             }
94830fdc8d8SChris Lattner         }
949c9858e4dSGreg Clayton         else
950c9858e4dSGreg Clayton         {
951c9858e4dSGreg Clayton             if (log)
952c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetVariables () => error: process is running", frame);
953c9858e4dSGreg Clayton         }
9547fdf9ef1SGreg Clayton     }
955ceb6b139SCaroline Tice 
956ceb6b139SCaroline Tice     if (log)
957ceb6b139SCaroline Tice     {
958d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame,
959750cd175SCaroline Tice                      value_list.get());
960ceb6b139SCaroline Tice     }
961ceb6b139SCaroline Tice 
96230fdc8d8SChris Lattner     return value_list;
96330fdc8d8SChris Lattner }
96430fdc8d8SChris Lattner 
96569b582faSGreg Clayton SBValueList
96630fdc8d8SChris Lattner SBFrame::GetRegisters ()
96730fdc8d8SChris Lattner {
96869b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
969ceb6b139SCaroline Tice 
97030fdc8d8SChris Lattner     SBValueList value_list;
9714fc6cb9cSJim Ingham     Mutex::Locker api_locker;
9724fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
9734fc6cb9cSJim Ingham 
974d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
975d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
976d9e416c0SGreg Clayton     if (frame && target)
97730fdc8d8SChris Lattner     {
9787fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
9797fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
9807fdf9ef1SGreg Clayton         {
981d9e416c0SGreg Clayton             RegisterContextSP reg_ctx (frame->GetRegisterContext());
98230fdc8d8SChris Lattner             if (reg_ctx)
98330fdc8d8SChris Lattner             {
98430fdc8d8SChris Lattner                 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
98530fdc8d8SChris Lattner                 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
98630fdc8d8SChris Lattner                 {
987d9e416c0SGreg Clayton                     value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
98830fdc8d8SChris Lattner                 }
98930fdc8d8SChris Lattner             }
99030fdc8d8SChris Lattner         }
991c9858e4dSGreg Clayton         else
992c9858e4dSGreg Clayton         {
993c9858e4dSGreg Clayton             if (log)
994c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetRegisters () => error: process is running", frame);
995c9858e4dSGreg Clayton         }
9967fdf9ef1SGreg Clayton     }
997ceb6b139SCaroline Tice 
998ceb6b139SCaroline Tice     if (log)
999c9858e4dSGreg Clayton         log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.get());
1000ceb6b139SCaroline Tice 
100130fdc8d8SChris Lattner     return value_list;
100230fdc8d8SChris Lattner }
100330fdc8d8SChris Lattner 
1004dde9cff3SCaroline Tice bool
1005dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
1006dde9cff3SCaroline Tice {
1007da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1008da7bc7d0SGreg Clayton 
10094fc6cb9cSJim Ingham     Mutex::Locker api_locker;
10104fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
10114fc6cb9cSJim Ingham 
1012d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1013d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1014d9e416c0SGreg Clayton     if (frame && target)
1015dde9cff3SCaroline Tice     {
10167fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10177fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
10187fdf9ef1SGreg Clayton         {
1019d9e416c0SGreg Clayton             frame->DumpUsingSettingsFormat (&strm);
1020dde9cff3SCaroline Tice         }
1021c9858e4dSGreg Clayton         else
1022c9858e4dSGreg Clayton         {
1023c9858e4dSGreg Clayton             LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1024c9858e4dSGreg Clayton             if (log)
1025c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetDescription () => error: process is running", frame);
1026c9858e4dSGreg Clayton         }
1027c9858e4dSGreg Clayton 
10287fdf9ef1SGreg Clayton     }
1029dde9cff3SCaroline Tice     else
1030da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1031dde9cff3SCaroline Tice 
1032dde9cff3SCaroline Tice     return true;
1033dde9cff3SCaroline Tice }
10341d3afba3SGreg Clayton 
103569b582faSGreg Clayton SBValue
10361d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
10371d3afba3SGreg Clayton {
1038316d498bSGreg Clayton     SBValue result;
10397fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1040d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1041d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1042d9e416c0SGreg Clayton     if (frame && target)
1043316d498bSGreg Clayton     {
1044*35e1bda6SJim Ingham         SBExpressionOptions options;
1045*35e1bda6SJim Ingham         lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue();
1046*35e1bda6SJim Ingham         options.SetUseDynamic (fetch_dynamic_value);
1047*35e1bda6SJim Ingham         options.SetUnwindOnError (true);
1048*35e1bda6SJim Ingham         return EvaluateExpression (expr, options);
1049316d498bSGreg Clayton     }
1050316d498bSGreg Clayton     return result;
105178a685aaSJim Ingham }
105278a685aaSJim Ingham 
105378a685aaSJim Ingham SBValue
10542837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
105578a685aaSJim Ingham {
1056*35e1bda6SJim Ingham     SBExpressionOptions options;
1057*35e1bda6SJim Ingham     options.SetUseDynamic (fetch_dynamic_value);
1058*35e1bda6SJim Ingham     options.SetUnwindOnError (true);
1059*35e1bda6SJim Ingham     return EvaluateExpression (expr, options);
10607ba6e991SJim Ingham }
10617ba6e991SJim Ingham 
10627ba6e991SJim Ingham SBValue
10637ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error)
10647ba6e991SJim Ingham {
1065*35e1bda6SJim Ingham     SBExpressionOptions options;
1066*35e1bda6SJim Ingham     options.SetUseDynamic (fetch_dynamic_value);
1067*35e1bda6SJim Ingham     options.SetUnwindOnError (unwind_on_error);
1068*35e1bda6SJim Ingham     return EvaluateExpression (expr, options);
1069*35e1bda6SJim Ingham }
1070*35e1bda6SJim Ingham 
1071*35e1bda6SJim Ingham lldb::SBValue
1072*35e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options)
1073*35e1bda6SJim Ingham {
107469b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10754838131bSGreg Clayton 
107669b582faSGreg Clayton     LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1077a162ebafSSean Callanan 
107823f59509SGreg Clayton     ExecutionResults exe_results = eExecutionSetupError;
107969b582faSGreg Clayton     SBValue expr_result;
108081e871edSGreg Clayton     ValueObjectSP expr_value_sp;
10814838131bSGreg Clayton 
10824fc6cb9cSJim Ingham     Mutex::Locker api_locker;
10834fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
10844fc6cb9cSJim Ingham 
1085d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1086d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1087b9556accSGreg Clayton     if (log)
1088d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame, expr);
1089b9556accSGreg Clayton 
1090d9e416c0SGreg Clayton     if (frame && target)
10911d3afba3SGreg Clayton     {
10927fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10937fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
10947fdf9ef1SGreg Clayton         {
1095de4ca5b7SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
10961ba7c4d0SGreg Clayton             StreamString frame_description;
1097d9e416c0SGreg Clayton             frame->DumpUsingSettingsFormat (&frame_description);
10981ba7c4d0SGreg Clayton             Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
1099*35e1bda6SJim Ingham                                                  expr, options.GetUseDynamic(), frame_description.GetString().c_str());
1100de4ca5b7SEnrico Granata #endif
1101d9e416c0SGreg Clayton             exe_results = target->EvaluateExpression (expr,
1102d9e416c0SGreg Clayton                                                       frame,
1103d4439aa9SEnrico Granata                                                       expr_value_sp,
1104*35e1bda6SJim Ingham                                                       options.ref());
110581e871edSGreg Clayton             expr_result.SetSP(expr_value_sp);
1106de4ca5b7SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1107f49e65aeSGreg Clayton             Host::SetCrashDescription (NULL);
1108de4ca5b7SEnrico Granata #endif
11091d3afba3SGreg Clayton         }
1110c9858e4dSGreg Clayton         else
1111c9858e4dSGreg Clayton         {
1112c9858e4dSGreg Clayton             if (log)
1113c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::EvaluateExpression () => error: process is running", frame);
1114c9858e4dSGreg Clayton         }
11157fdf9ef1SGreg Clayton     }
11164838131bSGreg Clayton 
1117cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1118a162ebafSSean Callanan     if (expr_log)
111978a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
1120fe42ac4dSGreg Clayton                          expr_result.GetValue(),
1121fe42ac4dSGreg Clayton                          expr_result.GetSummary());
1122a162ebafSSean Callanan 
11234838131bSGreg Clayton     if (log)
1124d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1125d9e416c0SGreg Clayton                      frame,
112678a685aaSJim Ingham                      expr,
112781e871edSGreg Clayton                      expr_value_sp.get(),
112825f3a3cdSJohnny Chen                      exe_results);
1129cf7e2dc0SJason Molenda #endif
11304838131bSGreg Clayton 
1131cfd1acedSGreg Clayton     return expr_result;
11321d3afba3SGreg Clayton }
1133316d498bSGreg Clayton 
1134316d498bSGreg Clayton bool
1135316d498bSGreg Clayton SBFrame::IsInlined()
1136316d498bSGreg Clayton {
11377fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1138d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1139d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1140d9e416c0SGreg Clayton     if (frame && target)
1141316d498bSGreg Clayton     {
11427fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11437fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
11447fdf9ef1SGreg Clayton         {
11457fdf9ef1SGreg Clayton 
1146d9e416c0SGreg Clayton             Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1147316d498bSGreg Clayton             if (block)
1148316d498bSGreg Clayton                 return block->GetContainingInlinedBlock () != NULL;
1149316d498bSGreg Clayton         }
1150c9858e4dSGreg Clayton         else
1151c9858e4dSGreg Clayton         {
1152c9858e4dSGreg Clayton             LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1153c9858e4dSGreg Clayton             if (log)
1154c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::IsInlined () => error: process is running", frame);
1155c9858e4dSGreg Clayton         }
1156c9858e4dSGreg Clayton 
11577fdf9ef1SGreg Clayton     }
1158316d498bSGreg Clayton     return false;
1159316d498bSGreg Clayton }
1160316d498bSGreg Clayton 
1161316d498bSGreg Clayton const char *
1162316d498bSGreg Clayton SBFrame::GetFunctionName()
1163316d498bSGreg Clayton {
1164316d498bSGreg Clayton     const char *name = NULL;
11657fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1166d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1167d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1168d9e416c0SGreg Clayton     if (frame && target)
1169316d498bSGreg Clayton     {
11707fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11717fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
11727fdf9ef1SGreg Clayton         {
1173d9e416c0SGreg Clayton             SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1174316d498bSGreg Clayton             if (sc.block)
1175316d498bSGreg Clayton             {
1176316d498bSGreg Clayton                 Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1177316d498bSGreg Clayton                 if (inlined_block)
1178316d498bSGreg Clayton                 {
1179316d498bSGreg Clayton                     const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1180316d498bSGreg Clayton                     name = inlined_info->GetName().AsCString();
1181316d498bSGreg Clayton                 }
1182316d498bSGreg Clayton             }
1183316d498bSGreg Clayton 
1184316d498bSGreg Clayton             if (name == NULL)
1185316d498bSGreg Clayton             {
1186316d498bSGreg Clayton                 if (sc.function)
1187316d498bSGreg Clayton                     name = sc.function->GetName().GetCString();
1188316d498bSGreg Clayton             }
1189316d498bSGreg Clayton 
1190316d498bSGreg Clayton             if (name == NULL)
1191316d498bSGreg Clayton             {
1192316d498bSGreg Clayton                 if (sc.symbol)
1193316d498bSGreg Clayton                     name = sc.symbol->GetName().GetCString();
1194316d498bSGreg Clayton             }
1195316d498bSGreg Clayton         }
1196c9858e4dSGreg Clayton         else
1197c9858e4dSGreg Clayton         {
1198c9858e4dSGreg Clayton             LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1199c9858e4dSGreg Clayton             if (log)
1200c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFunctionName() => error: process is running", frame);
1201c9858e4dSGreg Clayton 
1202c9858e4dSGreg Clayton         }
12037fdf9ef1SGreg Clayton     }
1204316d498bSGreg Clayton     return name;
1205316d498bSGreg Clayton }
1206316d498bSGreg Clayton 
1207