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"
2730fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h"
2830fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h"
2930fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h"
3030fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h"
3130fdc8d8SChris Lattner #include "lldb/Target/Target.h"
3230fdc8d8SChris Lattner #include "lldb/Target/Process.h"
3330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
3430fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h"
35b9556accSGreg Clayton #include "lldb/Target/StackID.h"
3630fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
3730fdc8d8SChris Lattner 
384c5de699SEli Friedman #include "lldb/API/SBDebugger.h"
394c5de699SEli Friedman #include "lldb/API/SBValue.h"
404c5de699SEli Friedman #include "lldb/API/SBAddress.h"
41dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
424c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h"
434c5de699SEli Friedman #include "lldb/API/SBThread.h"
4430fdc8d8SChris Lattner 
4530fdc8d8SChris Lattner using namespace lldb;
4630fdc8d8SChris Lattner using namespace lldb_private;
4730fdc8d8SChris Lattner 
48b9556accSGreg Clayton 
4930fdc8d8SChris Lattner SBFrame::SBFrame () :
507fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef())
5130fdc8d8SChris Lattner {
5230fdc8d8SChris Lattner }
5330fdc8d8SChris Lattner 
5469b582faSGreg Clayton SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) :
557fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef (lldb_object_sp))
5630fdc8d8SChris Lattner {
5769b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
58ceb6b139SCaroline Tice 
59ceb6b139SCaroline Tice     if (log)
60ceb6b139SCaroline Tice     {
61ceb6b139SCaroline Tice         SBStream sstr;
62ceb6b139SCaroline Tice         GetDescription (sstr);
634838131bSGreg Clayton         log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s",
64b9556accSGreg Clayton                      lldb_object_sp.get(), lldb_object_sp.get(), sstr.GetData());
65750cd175SCaroline Tice 
66ceb6b139SCaroline Tice     }
6730fdc8d8SChris Lattner }
6830fdc8d8SChris Lattner 
69efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) :
707fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp))
71efabb123SGreg Clayton {
72efabb123SGreg Clayton }
73efabb123SGreg Clayton 
74efabb123SGreg Clayton const SBFrame &
75efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs)
76efabb123SGreg Clayton {
77efabb123SGreg Clayton     if (this != &rhs)
787fdf9ef1SGreg Clayton         *m_opaque_sp = *rhs.m_opaque_sp;
79efabb123SGreg Clayton     return *this;
80efabb123SGreg Clayton }
81efabb123SGreg Clayton 
8230fdc8d8SChris Lattner SBFrame::~SBFrame()
8330fdc8d8SChris Lattner {
8430fdc8d8SChris Lattner }
8530fdc8d8SChris Lattner 
86b9556accSGreg Clayton StackFrameSP
87b9556accSGreg Clayton SBFrame::GetFrameSP() const
88b9556accSGreg Clayton {
89af2589eaSGreg Clayton     if (m_opaque_sp)
907fdf9ef1SGreg Clayton         return m_opaque_sp->GetFrameSP();
91af2589eaSGreg Clayton     return StackFrameSP();
92b9556accSGreg Clayton }
9330fdc8d8SChris Lattner 
9430fdc8d8SChris Lattner void
95b9556accSGreg Clayton SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp)
9630fdc8d8SChris Lattner {
977fdf9ef1SGreg Clayton     return m_opaque_sp->SetFrameSP(lldb_object_sp);
98b9556accSGreg Clayton }
9930fdc8d8SChris Lattner 
10030fdc8d8SChris Lattner bool
10130fdc8d8SChris Lattner SBFrame::IsValid() const
10230fdc8d8SChris Lattner {
1037fdf9ef1SGreg Clayton     return GetFrameSP().get() != NULL;
10430fdc8d8SChris Lattner }
10530fdc8d8SChris Lattner 
10630fdc8d8SChris Lattner SBSymbolContext
10730fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const
10830fdc8d8SChris Lattner {
109c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11030fdc8d8SChris Lattner     SBSymbolContext sb_sym_ctx;
111*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
112*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
113*4fc6cb9cSJim Ingham 
114d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
115d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
116d9e416c0SGreg Clayton     if (frame && target)
117af67cecdSGreg Clayton     {
1187fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1197fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1207fdf9ef1SGreg Clayton         {
121d9e416c0SGreg Clayton             sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope));
122af67cecdSGreg Clayton         }
123c9858e4dSGreg Clayton         else
124c9858e4dSGreg Clayton         {
125c9858e4dSGreg Clayton             if (log)
126c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetSymbolContext () => error: process is running", frame);
127c9858e4dSGreg Clayton         }
1287fdf9ef1SGreg Clayton     }
129ceb6b139SCaroline Tice 
130ceb6b139SCaroline Tice     if (log)
1314838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)",
132d9e416c0SGreg Clayton                      frame, resolve_scope, sb_sym_ctx.get());
133ceb6b139SCaroline Tice 
13430fdc8d8SChris Lattner     return sb_sym_ctx;
13530fdc8d8SChris Lattner }
13630fdc8d8SChris Lattner 
13730fdc8d8SChris Lattner SBModule
13830fdc8d8SChris Lattner SBFrame::GetModule () const
13930fdc8d8SChris Lattner {
140c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14172eff18aSGreg Clayton     SBModule sb_module;
142acdbe816SGreg Clayton     ModuleSP module_sp;
143*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
144*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
145*4fc6cb9cSJim Ingham 
146d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
147d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
148d9e416c0SGreg Clayton     if (frame && target)
149af67cecdSGreg Clayton     {
1507fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1517fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1527fdf9ef1SGreg Clayton         {
153d9e416c0SGreg Clayton             module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp;
154acdbe816SGreg Clayton             sb_module.SetSP (module_sp);
155af67cecdSGreg Clayton         }
156c9858e4dSGreg Clayton         else
157c9858e4dSGreg Clayton         {
158c9858e4dSGreg Clayton             if (log)
159c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetModule () => error: process is running", frame);
160c9858e4dSGreg Clayton         }
1617fdf9ef1SGreg Clayton     }
16272eff18aSGreg Clayton 
1634838131bSGreg Clayton     if (log)
1644838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
165d9e416c0SGreg Clayton                      frame, module_sp.get());
1664838131bSGreg Clayton 
16730fdc8d8SChris Lattner     return sb_module;
16830fdc8d8SChris Lattner }
16930fdc8d8SChris Lattner 
17030fdc8d8SChris Lattner SBCompileUnit
17130fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
17230fdc8d8SChris Lattner {
173c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
17472eff18aSGreg Clayton     SBCompileUnit sb_comp_unit;
175*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
176*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
177*4fc6cb9cSJim Ingham 
178d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
179d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
180d9e416c0SGreg Clayton     if (frame && target)
181af67cecdSGreg Clayton     {
1827fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1837fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1847fdf9ef1SGreg Clayton         {
185d9e416c0SGreg Clayton             sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
186af67cecdSGreg Clayton         }
187c9858e4dSGreg Clayton         else
188c9858e4dSGreg Clayton         {
189ceb6b139SCaroline Tice             if (log)
190c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetCompileUnit () => error: process is running", frame);
191c9858e4dSGreg Clayton         }
192c9858e4dSGreg Clayton     }
193c9858e4dSGreg Clayton     if (log)
194c9858e4dSGreg Clayton         log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
195d9e416c0SGreg Clayton                      frame, sb_comp_unit.get());
196ceb6b139SCaroline Tice 
19730fdc8d8SChris Lattner     return sb_comp_unit;
19830fdc8d8SChris Lattner }
19930fdc8d8SChris Lattner 
20030fdc8d8SChris Lattner SBFunction
20130fdc8d8SChris Lattner SBFrame::GetFunction () const
20230fdc8d8SChris Lattner {
203c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
20472eff18aSGreg Clayton     SBFunction sb_function;
205*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
206*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
207*4fc6cb9cSJim Ingham 
208d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
209d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
210d9e416c0SGreg Clayton     if (frame && target)
211af67cecdSGreg Clayton     {
2127fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2137fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2147fdf9ef1SGreg Clayton         {
215d9e416c0SGreg Clayton             sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function);
216af67cecdSGreg Clayton         }
217c9858e4dSGreg Clayton         else
218c9858e4dSGreg Clayton         {
219c9858e4dSGreg Clayton             if (log)
220c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFunction () => error: process is running", frame);
2217fdf9ef1SGreg Clayton         }
222c9858e4dSGreg Clayton     }
2234838131bSGreg Clayton     if (log)
2244838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
225d9e416c0SGreg Clayton                      frame, sb_function.get());
2264838131bSGreg Clayton 
22730fdc8d8SChris Lattner     return sb_function;
22830fdc8d8SChris Lattner }
22930fdc8d8SChris Lattner 
2303b06557eSGreg Clayton SBSymbol
2313b06557eSGreg Clayton SBFrame::GetSymbol () const
2323b06557eSGreg Clayton {
233c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
23472eff18aSGreg Clayton     SBSymbol sb_symbol;
235*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
236*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
237*4fc6cb9cSJim Ingham 
238d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
239d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
240d9e416c0SGreg Clayton     if (frame && target)
241af67cecdSGreg Clayton     {
2427fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2437fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2447fdf9ef1SGreg Clayton         {
245d9e416c0SGreg Clayton             sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol);
246af67cecdSGreg Clayton         }
247c9858e4dSGreg Clayton         else
248c9858e4dSGreg Clayton         {
249c9858e4dSGreg Clayton             if (log)
250c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetSymbol () => error: process is running", frame);
2517fdf9ef1SGreg Clayton         }
252c9858e4dSGreg Clayton     }
2534838131bSGreg Clayton     if (log)
2544838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
255d9e416c0SGreg Clayton                      frame, sb_symbol.get());
2563b06557eSGreg Clayton     return sb_symbol;
2573b06557eSGreg Clayton }
2583b06557eSGreg Clayton 
25930fdc8d8SChris Lattner SBBlock
26030fdc8d8SChris Lattner SBFrame::GetBlock () const
26130fdc8d8SChris Lattner {
262c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
26372eff18aSGreg Clayton     SBBlock sb_block;
264*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
265*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
266*4fc6cb9cSJim Ingham 
267d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
268d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
269d9e416c0SGreg Clayton     if (frame && target)
270af67cecdSGreg Clayton     {
2717fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2727fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2737fdf9ef1SGreg Clayton         {
274d9e416c0SGreg Clayton             sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block);
275af67cecdSGreg Clayton         }
276c9858e4dSGreg Clayton         else
277c9858e4dSGreg Clayton         {
278c9858e4dSGreg Clayton             if (log)
279c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", frame);
2807fdf9ef1SGreg Clayton         }
281c9858e4dSGreg Clayton     }
2824838131bSGreg Clayton     if (log)
2834838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
284d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
28530fdc8d8SChris Lattner     return sb_block;
28630fdc8d8SChris Lattner }
28730fdc8d8SChris Lattner 
28895897c6aSGreg Clayton SBBlock
28995897c6aSGreg Clayton SBFrame::GetFrameBlock () const
29095897c6aSGreg Clayton {
29172eff18aSGreg Clayton     SBBlock sb_block;
292*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
293*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
294*4fc6cb9cSJim Ingham 
295d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
296d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
297c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
298d9e416c0SGreg Clayton     if (frame && target)
299af67cecdSGreg Clayton     {
3007fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3017fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3027fdf9ef1SGreg Clayton         {
303d9e416c0SGreg Clayton             sb_block.SetPtr(frame->GetFrameBlock ());
304af67cecdSGreg Clayton         }
305c9858e4dSGreg Clayton         else
306c9858e4dSGreg Clayton         {
307c9858e4dSGreg Clayton             if (log)
308c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFrameBlock () => error: process is running", frame);
3097fdf9ef1SGreg Clayton         }
310c9858e4dSGreg Clayton     }
3114838131bSGreg Clayton     if (log)
3124838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
313d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
31495897c6aSGreg Clayton     return sb_block;
31595897c6aSGreg Clayton }
31695897c6aSGreg Clayton 
31730fdc8d8SChris Lattner SBLineEntry
31830fdc8d8SChris Lattner SBFrame::GetLineEntry () const
31930fdc8d8SChris Lattner {
320c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
32172eff18aSGreg Clayton     SBLineEntry sb_line_entry;
322*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
323*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
324*4fc6cb9cSJim Ingham 
325d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
326d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
327d9e416c0SGreg Clayton     if (frame && target)
328af67cecdSGreg Clayton     {
3297fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3307fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3317fdf9ef1SGreg Clayton         {
332d9e416c0SGreg Clayton             sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry);
333af67cecdSGreg Clayton         }
334c9858e4dSGreg Clayton         else
335c9858e4dSGreg Clayton         {
336c9858e4dSGreg Clayton             if (log)
337c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetLineEntry () => error: process is running", frame);
3387fdf9ef1SGreg Clayton         }
339c9858e4dSGreg Clayton     }
3404838131bSGreg Clayton     if (log)
3414838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
342d9e416c0SGreg Clayton                      frame, sb_line_entry.get());
34330fdc8d8SChris Lattner     return sb_line_entry;
34430fdc8d8SChris Lattner }
34530fdc8d8SChris Lattner 
34630fdc8d8SChris Lattner uint32_t
34730fdc8d8SChris Lattner SBFrame::GetFrameID () const
34830fdc8d8SChris Lattner {
349b9556accSGreg Clayton     uint32_t frame_idx = UINT32_MAX;
350b9556accSGreg Clayton 
3517fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
352d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
3537fdf9ef1SGreg Clayton     if (frame)
354d9e416c0SGreg Clayton         frame_idx = frame->GetFrameIndex ();
3554838131bSGreg Clayton 
35669b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3574838131bSGreg Clayton     if (log)
3584838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameID () => %u",
359d9e416c0SGreg Clayton                      frame, frame_idx);
3604838131bSGreg Clayton     return frame_idx;
36130fdc8d8SChris Lattner }
36230fdc8d8SChris Lattner 
36369b582faSGreg Clayton addr_t
36430fdc8d8SChris Lattner SBFrame::GetPC () const
36530fdc8d8SChris Lattner {
366c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
36769b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
368*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
369*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
370*4fc6cb9cSJim Ingham 
371d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
372d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
373d9e416c0SGreg Clayton     if (frame && target)
374af67cecdSGreg Clayton     {
3757fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3767fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3777fdf9ef1SGreg Clayton         {
378d9e416c0SGreg Clayton             addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target);
379af67cecdSGreg Clayton         }
380c9858e4dSGreg Clayton         else
381c9858e4dSGreg Clayton         {
382c9858e4dSGreg Clayton             if (log)
383c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetPC () => error: process is running", frame);
384c9858e4dSGreg Clayton         }
3857fdf9ef1SGreg Clayton     }
386ceb6b139SCaroline Tice 
387ceb6b139SCaroline Tice     if (log)
388d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", frame, addr);
389ceb6b139SCaroline Tice 
390ceb6b139SCaroline Tice     return addr;
39130fdc8d8SChris Lattner }
39230fdc8d8SChris Lattner 
39330fdc8d8SChris Lattner bool
39469b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc)
39530fdc8d8SChris Lattner {
396c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
397ceb6b139SCaroline Tice     bool ret_val = false;
398*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
399*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
400*4fc6cb9cSJim Ingham 
401d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
402d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
403d9e416c0SGreg Clayton     if (frame && target)
404af67cecdSGreg Clayton     {
4057fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4067fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4077fdf9ef1SGreg Clayton         {
408d9e416c0SGreg Clayton             ret_val = frame->GetRegisterContext()->SetPC (new_pc);
409af67cecdSGreg Clayton         }
410c9858e4dSGreg Clayton         else
411c9858e4dSGreg Clayton         {
412c9858e4dSGreg Clayton             if (log)
413c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::SetPC () => error: process is running", frame);
414c9858e4dSGreg Clayton         }
4157fdf9ef1SGreg Clayton     }
416ceb6b139SCaroline Tice 
417ceb6b139SCaroline Tice     if (log)
4184838131bSGreg Clayton         log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i",
419d9e416c0SGreg Clayton                      frame, new_pc, ret_val);
420ceb6b139SCaroline Tice 
421ceb6b139SCaroline Tice     return ret_val;
42230fdc8d8SChris Lattner }
42330fdc8d8SChris Lattner 
42469b582faSGreg Clayton addr_t
42530fdc8d8SChris Lattner SBFrame::GetSP () const
42630fdc8d8SChris Lattner {
427c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4284838131bSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
429*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
430*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
431*4fc6cb9cSJim Ingham 
432d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
433d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
434d9e416c0SGreg Clayton     if (frame && target)
435af67cecdSGreg Clayton     {
4367fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4377fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4387fdf9ef1SGreg Clayton         {
439d9e416c0SGreg Clayton             addr = frame->GetRegisterContext()->GetSP();
440af67cecdSGreg Clayton         }
441c9858e4dSGreg Clayton         else
442c9858e4dSGreg Clayton         {
443c9858e4dSGreg Clayton             if (log)
444c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetSP () => error: process is running", frame);
4457fdf9ef1SGreg Clayton         }
446c9858e4dSGreg Clayton     }
4474838131bSGreg Clayton     if (log)
448d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", frame, addr);
4494838131bSGreg Clayton 
4504838131bSGreg Clayton     return addr;
45130fdc8d8SChris Lattner }
45230fdc8d8SChris Lattner 
45330fdc8d8SChris Lattner 
45469b582faSGreg Clayton addr_t
45530fdc8d8SChris Lattner SBFrame::GetFP () const
45630fdc8d8SChris Lattner {
457c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
45869b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
459*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
460*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
461*4fc6cb9cSJim Ingham 
462d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
463d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
464d9e416c0SGreg Clayton     if (frame && target)
465af67cecdSGreg Clayton     {
4667fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4677fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4687fdf9ef1SGreg Clayton         {
469d9e416c0SGreg Clayton             addr = frame->GetRegisterContext()->GetFP();
470af67cecdSGreg Clayton         }
471c9858e4dSGreg Clayton         else
472c9858e4dSGreg Clayton         {
473c9858e4dSGreg Clayton             if (log)
474c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFP () => error: process is running", frame);
475c9858e4dSGreg Clayton         }
4767fdf9ef1SGreg Clayton     }
477ceb6b139SCaroline Tice 
478ceb6b139SCaroline Tice     if (log)
479d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", frame, addr);
480ceb6b139SCaroline Tice     return addr;
48130fdc8d8SChris Lattner }
48230fdc8d8SChris Lattner 
48330fdc8d8SChris Lattner 
48430fdc8d8SChris Lattner SBAddress
48530fdc8d8SChris Lattner SBFrame::GetPCAddress () const
48630fdc8d8SChris Lattner {
487c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
48830fdc8d8SChris Lattner     SBAddress sb_addr;
489*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
490*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
491*4fc6cb9cSJim Ingham 
492d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
493d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
494d9e416c0SGreg Clayton     if (frame && target)
495af67cecdSGreg Clayton     {
4967fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4977fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4987fdf9ef1SGreg Clayton         {
499d9e416c0SGreg Clayton             sb_addr.SetAddress (&frame->GetFrameCodeAddress());
500af67cecdSGreg Clayton         }
501c9858e4dSGreg Clayton         else
502c9858e4dSGreg Clayton         {
503c9858e4dSGreg Clayton             if (log)
504c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetPCAddress () => error: process is running", frame);
5057fdf9ef1SGreg Clayton         }
506c9858e4dSGreg Clayton     }
5074838131bSGreg Clayton     if (log)
508d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get());
50930fdc8d8SChris Lattner     return sb_addr;
51030fdc8d8SChris Lattner }
51130fdc8d8SChris Lattner 
51230fdc8d8SChris Lattner void
51330fdc8d8SChris Lattner SBFrame::Clear()
51430fdc8d8SChris Lattner {
515af2589eaSGreg Clayton     m_opaque_sp->Clear();
51630fdc8d8SChris Lattner }
51730fdc8d8SChris Lattner 
5187edbdfc9SGreg Clayton lldb::SBValue
5197edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path)
5207edbdfc9SGreg Clayton {
5217edbdfc9SGreg Clayton     SBValue sb_value;
5227fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
523d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
524d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
525d9e416c0SGreg Clayton     if (frame && target)
5267edbdfc9SGreg Clayton     {
527d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
5287edbdfc9SGreg Clayton         sb_value = GetValueForVariablePath (var_path, use_dynamic);
5297edbdfc9SGreg Clayton     }
5307edbdfc9SGreg Clayton     return sb_value;
5317edbdfc9SGreg Clayton }
5327edbdfc9SGreg Clayton 
5337edbdfc9SGreg Clayton lldb::SBValue
5347edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic)
5357edbdfc9SGreg Clayton {
5367edbdfc9SGreg Clayton     SBValue sb_value;
537*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
538*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
539*4fc6cb9cSJim Ingham 
540d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
541d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
542d9e416c0SGreg Clayton     if (frame && target && var_path && var_path[0])
5437edbdfc9SGreg Clayton     {
5447fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5457fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5467fdf9ef1SGreg Clayton         {
5477edbdfc9SGreg Clayton             VariableSP var_sp;
5487edbdfc9SGreg Clayton             Error error;
549d9e416c0SGreg Clayton             ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path,
5507edbdfc9SGreg Clayton                                                                               use_dynamic,
551685c88c5SGreg Clayton                                                                               StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
5527edbdfc9SGreg Clayton                                                                               var_sp,
5537edbdfc9SGreg Clayton                                                                               error));
55481e871edSGreg Clayton             sb_value.SetSP(value_sp);
5557edbdfc9SGreg Clayton         }
556c9858e4dSGreg Clayton         else
557c9858e4dSGreg Clayton         {
558c9858e4dSGreg Clayton             LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
559c9858e4dSGreg Clayton             if (log)
560c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetValueForVariablePath () => error: process is running", frame);
561c9858e4dSGreg Clayton         }
5627fdf9ef1SGreg Clayton     }
5637edbdfc9SGreg Clayton     return sb_value;
5647edbdfc9SGreg Clayton }
5657edbdfc9SGreg Clayton 
56630fdc8d8SChris Lattner SBValue
56769b582faSGreg Clayton SBFrame::FindVariable (const char *name)
56830fdc8d8SChris Lattner {
569316d498bSGreg Clayton     SBValue value;
5707fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
571d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
572d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
573d9e416c0SGreg Clayton     if (frame && target)
574316d498bSGreg Clayton     {
575d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
576316d498bSGreg Clayton         value = FindVariable (name, use_dynamic);
577316d498bSGreg Clayton     }
578316d498bSGreg Clayton     return value;
57978a685aaSJim Ingham }
58078a685aaSJim Ingham 
5817edbdfc9SGreg Clayton 
58278a685aaSJim Ingham SBValue
5832837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
58478a685aaSJim Ingham {
585c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
58669b582faSGreg Clayton     VariableSP var_sp;
58758b59f95SJim Ingham     SBValue sb_value;
58881e871edSGreg Clayton     ValueObjectSP value_sp;
589*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
590*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
591*4fc6cb9cSJim Ingham 
592d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
593d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
594d9e416c0SGreg Clayton     if (frame && target && name && name[0])
59530fdc8d8SChris Lattner     {
5967fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5977fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5987fdf9ef1SGreg Clayton         {
59969b582faSGreg Clayton             VariableList variable_list;
600d9e416c0SGreg Clayton             SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
60130fdc8d8SChris Lattner 
60272eff18aSGreg Clayton             if (sc.block)
60330fdc8d8SChris Lattner             {
60472eff18aSGreg Clayton                 const bool can_create = true;
60572eff18aSGreg Clayton                 const bool get_parent_variables = true;
60672eff18aSGreg Clayton                 const bool stop_if_block_is_inlined_function = true;
60772eff18aSGreg Clayton 
60872eff18aSGreg Clayton                 if (sc.block->AppendVariables (can_create,
60972eff18aSGreg Clayton                                                get_parent_variables,
61072eff18aSGreg Clayton                                                stop_if_block_is_inlined_function,
61172eff18aSGreg Clayton                                                &variable_list))
61272eff18aSGreg Clayton                 {
61369b582faSGreg Clayton                     var_sp = variable_list.FindVariable (ConstString(name));
61430fdc8d8SChris Lattner                 }
61572eff18aSGreg Clayton             }
61630fdc8d8SChris Lattner 
6174838131bSGreg Clayton             if (var_sp)
61881e871edSGreg Clayton             {
619d9e416c0SGreg Clayton                 value_sp = frame->GetValueObjectForFrameVariable(var_sp, use_dynamic);
62081e871edSGreg Clayton                 sb_value.SetSP(value_sp);
62181e871edSGreg Clayton             }
6227fdf9ef1SGreg Clayton         }
623c9858e4dSGreg Clayton         else
624c9858e4dSGreg Clayton         {
625c9858e4dSGreg Clayton             if (log)
626c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::FindVariable () => error: process is running", frame);
627c9858e4dSGreg Clayton         }
628316d498bSGreg Clayton     }
629316d498bSGreg Clayton 
6304838131bSGreg Clayton     if (log)
63169b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
632d9e416c0SGreg Clayton                      frame, name, value_sp.get());
6334838131bSGreg Clayton 
634dde9cff3SCaroline Tice     return sb_value;
635dde9cff3SCaroline Tice }
636dde9cff3SCaroline Tice 
63730fdc8d8SChris Lattner SBValue
63869b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type)
63930fdc8d8SChris Lattner {
640316d498bSGreg Clayton     SBValue value;
6417fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
642d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
643d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
644d9e416c0SGreg Clayton     if (frame && target)
645316d498bSGreg Clayton     {
646d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
647316d498bSGreg Clayton         value = FindValue (name, value_type, use_dynamic);
648316d498bSGreg Clayton     }
649316d498bSGreg Clayton     return value;
65078a685aaSJim Ingham }
65178a685aaSJim Ingham 
65278a685aaSJim Ingham SBValue
6532837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
65478a685aaSJim Ingham {
655c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
65669b582faSGreg Clayton     SBValue sb_value;
65781e871edSGreg Clayton     ValueObjectSP value_sp;
658*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
659*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
660*4fc6cb9cSJim Ingham 
661d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
662d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
663d9e416c0SGreg Clayton     if (frame && target && name && name[0])
66430fdc8d8SChris Lattner     {
6657fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6667fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
6677fdf9ef1SGreg Clayton         {
66869b582faSGreg Clayton             switch (value_type)
66930fdc8d8SChris Lattner             {
67069b582faSGreg Clayton             case eValueTypeVariableGlobal:      // global variable
67169b582faSGreg Clayton             case eValueTypeVariableStatic:      // static variable
67269b582faSGreg Clayton             case eValueTypeVariableArgument:    // function argument variables
67369b582faSGreg Clayton             case eValueTypeVariableLocal:       // function local variables
67469b582faSGreg Clayton                 {
675d9e416c0SGreg Clayton                     VariableList *variable_list = frame->GetVariableList(true);
67672eff18aSGreg Clayton 
677d9e416c0SGreg Clayton                     SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
67872eff18aSGreg Clayton 
67972eff18aSGreg Clayton                     const bool can_create = true;
68072eff18aSGreg Clayton                     const bool get_parent_variables = true;
68172eff18aSGreg Clayton                     const bool stop_if_block_is_inlined_function = true;
68272eff18aSGreg Clayton 
68372eff18aSGreg Clayton                     if (sc.block && sc.block->AppendVariables (can_create,
68472eff18aSGreg Clayton                                                                get_parent_variables,
68572eff18aSGreg Clayton                                                                stop_if_block_is_inlined_function,
686e85d9cb8SJohnny Chen                                                                variable_list))
687beae523aSJohnny Chen                     {
68869b582faSGreg Clayton                         ConstString const_name(name);
689e85d9cb8SJohnny Chen                         const uint32_t num_variables = variable_list->GetSize();
69072eff18aSGreg Clayton                         for (uint32_t i = 0; i < num_variables; ++i)
69130fdc8d8SChris Lattner                         {
69269b582faSGreg Clayton                             VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
69369b582faSGreg Clayton                             if (variable_sp &&
69469b582faSGreg Clayton                                 variable_sp->GetScope() == value_type &&
69569b582faSGreg Clayton                                 variable_sp->GetName() == const_name)
696beae523aSJohnny Chen                             {
697d9e416c0SGreg Clayton                                 value_sp = frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic);
69881e871edSGreg Clayton                                 sb_value.SetSP (value_sp);
699beae523aSJohnny Chen                                 break;
700beae523aSJohnny Chen                             }
70130fdc8d8SChris Lattner                         }
70230fdc8d8SChris Lattner                     }
70330fdc8d8SChris Lattner                 }
70469b582faSGreg Clayton                 break;
70569b582faSGreg Clayton 
70669b582faSGreg Clayton             case eValueTypeRegister:            // stack frame register value
70769b582faSGreg Clayton                 {
708d9e416c0SGreg Clayton                     RegisterContextSP reg_ctx (frame->GetRegisterContext());
70969b582faSGreg Clayton                     if (reg_ctx)
71069b582faSGreg Clayton                     {
71169b582faSGreg Clayton                         const uint32_t num_regs = reg_ctx->GetRegisterCount();
71269b582faSGreg Clayton                         for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
71369b582faSGreg Clayton                         {
71469b582faSGreg Clayton                             const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
71569b582faSGreg Clayton                             if (reg_info &&
71669b582faSGreg Clayton                                 ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
71769b582faSGreg Clayton                                  (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
71869b582faSGreg Clayton                             {
719d9e416c0SGreg Clayton                                 value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
72081e871edSGreg Clayton                                 sb_value.SetSP (value_sp);
72181e871edSGreg Clayton                                 break;
72269b582faSGreg Clayton                             }
72369b582faSGreg Clayton                         }
72469b582faSGreg Clayton                     }
72569b582faSGreg Clayton                 }
72669b582faSGreg Clayton                 break;
72769b582faSGreg Clayton 
72869b582faSGreg Clayton             case eValueTypeRegisterSet:         // A collection of stack frame register values
72969b582faSGreg Clayton                 {
730d9e416c0SGreg Clayton                     RegisterContextSP reg_ctx (frame->GetRegisterContext());
73169b582faSGreg Clayton                     if (reg_ctx)
73269b582faSGreg Clayton                     {
73369b582faSGreg Clayton                         const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
73469b582faSGreg Clayton                         for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
73569b582faSGreg Clayton                         {
73669b582faSGreg Clayton                             const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
73769b582faSGreg Clayton                             if (reg_set &&
73869b582faSGreg Clayton                                 ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
73969b582faSGreg Clayton                                  (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
74069b582faSGreg Clayton                             {
741d9e416c0SGreg Clayton                                 value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
74281e871edSGreg Clayton                                 sb_value.SetSP (value_sp);
74381e871edSGreg Clayton                                 break;
74469b582faSGreg Clayton                             }
74569b582faSGreg Clayton                         }
74669b582faSGreg Clayton                     }
74769b582faSGreg Clayton                 }
74869b582faSGreg Clayton                 break;
74969b582faSGreg Clayton 
75069b582faSGreg Clayton             case eValueTypeConstResult:         // constant result variables
75169b582faSGreg Clayton                 {
75269b582faSGreg Clayton                     ConstString const_name(name);
753d9e416c0SGreg Clayton                     ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name));
75469b582faSGreg Clayton                     if (expr_var_sp)
75581e871edSGreg Clayton                     {
75681e871edSGreg Clayton                         value_sp = expr_var_sp->GetValueObject();
75781e871edSGreg Clayton                         sb_value.SetSP (value_sp);
75881e871edSGreg Clayton                     }
75969b582faSGreg Clayton                 }
76069b582faSGreg Clayton                 break;
76169b582faSGreg Clayton 
76269b582faSGreg Clayton             default:
76369b582faSGreg Clayton                 break;
76469b582faSGreg Clayton             }
765beae523aSJohnny Chen         }
766c9858e4dSGreg Clayton         else
767c9858e4dSGreg Clayton         {
768c9858e4dSGreg Clayton             if (log)
769c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::FindValue () => error: process is running", frame);
770c9858e4dSGreg Clayton         }
7717fdf9ef1SGreg Clayton     }
772dde9cff3SCaroline Tice 
7734838131bSGreg Clayton     if (log)
77469b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
775d9e416c0SGreg Clayton                      frame, name, value_type, value_sp.get());
7764838131bSGreg Clayton 
7774838131bSGreg Clayton 
778dde9cff3SCaroline Tice     return sb_value;
779dde9cff3SCaroline Tice }
780dde9cff3SCaroline Tice 
78130fdc8d8SChris Lattner bool
78235e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const
78335e2ab60SJohnny Chen {
78435e2ab60SJohnny Chen     lldb::StackFrameSP this_sp = GetFrameSP();
78535e2ab60SJohnny Chen     lldb::StackFrameSP that_sp = that.GetFrameSP();
78635e2ab60SJohnny Chen     return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
78735e2ab60SJohnny Chen }
78835e2ab60SJohnny Chen 
78935e2ab60SJohnny Chen bool
79030fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
79130fdc8d8SChris Lattner {
79235e2ab60SJohnny Chen     return IsEqual(rhs);
79330fdc8d8SChris Lattner }
79430fdc8d8SChris Lattner 
79530fdc8d8SChris Lattner bool
79630fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
79730fdc8d8SChris Lattner {
79835e2ab60SJohnny Chen     return !IsEqual(rhs);
799481cef25SGreg Clayton }
80030fdc8d8SChris Lattner 
80130fdc8d8SChris Lattner SBThread
80230fdc8d8SChris Lattner SBFrame::GetThread () const
80330fdc8d8SChris Lattner {
80469b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
805ceb6b139SCaroline Tice 
8067fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
807d9e416c0SGreg Clayton     ThreadSP thread_sp (exe_ctx.GetThreadSP());
808d9e416c0SGreg Clayton     SBThread sb_thread (thread_sp);
809ceb6b139SCaroline Tice 
810ceb6b139SCaroline Tice     if (log)
811750cd175SCaroline Tice     {
812750cd175SCaroline Tice         SBStream sstr;
813750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
814d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
815d9e416c0SGreg Clayton                      exe_ctx.GetFramePtr(),
816d9e416c0SGreg Clayton                      thread_sp.get(),
817d9e416c0SGreg Clayton                      sstr.GetData());
818750cd175SCaroline Tice     }
819ceb6b139SCaroline Tice 
82030fdc8d8SChris Lattner     return sb_thread;
82130fdc8d8SChris Lattner }
82230fdc8d8SChris Lattner 
82330fdc8d8SChris Lattner const char *
82430fdc8d8SChris Lattner SBFrame::Disassemble () const
82530fdc8d8SChris Lattner {
826c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
8274838131bSGreg Clayton     const char *disassembly = NULL;
828*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
829*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
830*4fc6cb9cSJim Ingham 
831d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
832d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
833d9e416c0SGreg Clayton     if (frame && target)
834af67cecdSGreg Clayton     {
8357fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8367fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
8377fdf9ef1SGreg Clayton         {
838d9e416c0SGreg Clayton             disassembly = frame->Disassemble();
839af67cecdSGreg Clayton         }
840c9858e4dSGreg Clayton         else
841c9858e4dSGreg Clayton         {
842c9858e4dSGreg Clayton             if (log)
843c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::Disassemble () => error: process is running", frame);
8447fdf9ef1SGreg Clayton         }
845c9858e4dSGreg Clayton     }
8464838131bSGreg Clayton 
8474838131bSGreg Clayton     if (log)
848d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly);
8494838131bSGreg Clayton 
8504838131bSGreg Clayton     return disassembly;
85130fdc8d8SChris Lattner }
85230fdc8d8SChris Lattner 
85330fdc8d8SChris Lattner 
85430fdc8d8SChris Lattner SBValueList
85530fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
85630fdc8d8SChris Lattner                        bool locals,
85730fdc8d8SChris Lattner                        bool statics,
85830fdc8d8SChris Lattner                        bool in_scope_only)
85930fdc8d8SChris Lattner {
860316d498bSGreg Clayton     SBValueList value_list;
8617fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
862d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
863d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
864d9e416c0SGreg Clayton     if (frame && target)
865316d498bSGreg Clayton     {
866d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
867316d498bSGreg Clayton         value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic);
868316d498bSGreg Clayton     }
869316d498bSGreg Clayton     return value_list;
87078a685aaSJim Ingham }
87178a685aaSJim Ingham 
87278a685aaSJim Ingham SBValueList
87378a685aaSJim Ingham SBFrame::GetVariables (bool arguments,
87478a685aaSJim Ingham                        bool locals,
87578a685aaSJim Ingham                        bool statics,
87678a685aaSJim Ingham                        bool in_scope_only,
8772837b766SJim Ingham                        lldb::DynamicValueType  use_dynamic)
87878a685aaSJim Ingham {
87969b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
880ceb6b139SCaroline Tice 
881b9556accSGreg Clayton     SBValueList value_list;
882*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
883*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
884*4fc6cb9cSJim Ingham 
885d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
886d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
887b9556accSGreg Clayton 
888ceb6b139SCaroline Tice     if (log)
8894838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
890d9e416c0SGreg Clayton                      frame,
8914838131bSGreg Clayton                      arguments,
8924838131bSGreg Clayton                      locals,
8934838131bSGreg Clayton                      statics,
8944838131bSGreg Clayton                      in_scope_only);
895ceb6b139SCaroline Tice 
896d9e416c0SGreg Clayton     if (frame && target)
89730fdc8d8SChris Lattner     {
8987fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8997fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
9007fdf9ef1SGreg Clayton         {
901af67cecdSGreg Clayton 
90230fdc8d8SChris Lattner             size_t i;
903af67cecdSGreg Clayton             VariableList *variable_list = NULL;
904d9e416c0SGreg Clayton             variable_list = frame->GetVariableList(true);
90530fdc8d8SChris Lattner             if (variable_list)
90630fdc8d8SChris Lattner             {
90730fdc8d8SChris Lattner                 const size_t num_variables = variable_list->GetSize();
90830fdc8d8SChris Lattner                 if (num_variables)
90930fdc8d8SChris Lattner                 {
91030fdc8d8SChris Lattner                     for (i = 0; i < num_variables; ++i)
91130fdc8d8SChris Lattner                     {
91230fdc8d8SChris Lattner                         VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
91330fdc8d8SChris Lattner                         if (variable_sp)
91430fdc8d8SChris Lattner                         {
91530fdc8d8SChris Lattner                             bool add_variable = false;
91630fdc8d8SChris Lattner                             switch (variable_sp->GetScope())
91730fdc8d8SChris Lattner                             {
91830fdc8d8SChris Lattner                             case eValueTypeVariableGlobal:
91930fdc8d8SChris Lattner                             case eValueTypeVariableStatic:
92030fdc8d8SChris Lattner                                 add_variable = statics;
92130fdc8d8SChris Lattner                                 break;
92230fdc8d8SChris Lattner 
92330fdc8d8SChris Lattner                             case eValueTypeVariableArgument:
92430fdc8d8SChris Lattner                                 add_variable = arguments;
92530fdc8d8SChris Lattner                                 break;
92630fdc8d8SChris Lattner 
92730fdc8d8SChris Lattner                             case eValueTypeVariableLocal:
92830fdc8d8SChris Lattner                                 add_variable = locals;
92930fdc8d8SChris Lattner                                 break;
930c982c768SGreg Clayton 
931c982c768SGreg Clayton                             default:
932c982c768SGreg Clayton                                 break;
93330fdc8d8SChris Lattner                             }
93430fdc8d8SChris Lattner                             if (add_variable)
93530fdc8d8SChris Lattner                             {
936d9e416c0SGreg Clayton                                 if (in_scope_only && !variable_sp->IsInScope(frame))
93730fdc8d8SChris Lattner                                     continue;
93830fdc8d8SChris Lattner 
939d9e416c0SGreg Clayton                                 value_list.Append(frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic));
94030fdc8d8SChris Lattner                             }
94130fdc8d8SChris Lattner                         }
94230fdc8d8SChris Lattner                     }
94330fdc8d8SChris Lattner                 }
94430fdc8d8SChris Lattner             }
94530fdc8d8SChris Lattner         }
946c9858e4dSGreg Clayton         else
947c9858e4dSGreg Clayton         {
948c9858e4dSGreg Clayton             if (log)
949c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetVariables () => error: process is running", frame);
950c9858e4dSGreg Clayton         }
9517fdf9ef1SGreg Clayton     }
952ceb6b139SCaroline Tice 
953ceb6b139SCaroline Tice     if (log)
954ceb6b139SCaroline Tice     {
955d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame,
956750cd175SCaroline Tice                      value_list.get());
957ceb6b139SCaroline Tice     }
958ceb6b139SCaroline Tice 
95930fdc8d8SChris Lattner     return value_list;
96030fdc8d8SChris Lattner }
96130fdc8d8SChris Lattner 
96269b582faSGreg Clayton SBValueList
96330fdc8d8SChris Lattner SBFrame::GetRegisters ()
96430fdc8d8SChris Lattner {
96569b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
966ceb6b139SCaroline Tice 
96730fdc8d8SChris Lattner     SBValueList value_list;
968*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
969*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
970*4fc6cb9cSJim Ingham 
971d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
972d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
973d9e416c0SGreg Clayton     if (frame && target)
97430fdc8d8SChris Lattner     {
9757fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
9767fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
9777fdf9ef1SGreg Clayton         {
978d9e416c0SGreg Clayton             RegisterContextSP reg_ctx (frame->GetRegisterContext());
97930fdc8d8SChris Lattner             if (reg_ctx)
98030fdc8d8SChris Lattner             {
98130fdc8d8SChris Lattner                 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
98230fdc8d8SChris Lattner                 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
98330fdc8d8SChris Lattner                 {
984d9e416c0SGreg Clayton                     value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
98530fdc8d8SChris Lattner                 }
98630fdc8d8SChris Lattner             }
98730fdc8d8SChris Lattner         }
988c9858e4dSGreg Clayton         else
989c9858e4dSGreg Clayton         {
990c9858e4dSGreg Clayton             if (log)
991c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetRegisters () => error: process is running", frame);
992c9858e4dSGreg Clayton         }
9937fdf9ef1SGreg Clayton     }
994ceb6b139SCaroline Tice 
995ceb6b139SCaroline Tice     if (log)
996c9858e4dSGreg Clayton         log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.get());
997ceb6b139SCaroline Tice 
99830fdc8d8SChris Lattner     return value_list;
99930fdc8d8SChris Lattner }
100030fdc8d8SChris Lattner 
1001dde9cff3SCaroline Tice bool
1002dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
1003dde9cff3SCaroline Tice {
1004da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1005da7bc7d0SGreg Clayton 
1006*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1007*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1008*4fc6cb9cSJim Ingham 
1009d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1010d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1011d9e416c0SGreg Clayton     if (frame && target)
1012dde9cff3SCaroline Tice     {
10137fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10147fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
10157fdf9ef1SGreg Clayton         {
1016d9e416c0SGreg Clayton             frame->DumpUsingSettingsFormat (&strm);
1017dde9cff3SCaroline Tice         }
1018c9858e4dSGreg Clayton         else
1019c9858e4dSGreg Clayton         {
1020c9858e4dSGreg Clayton             LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1021c9858e4dSGreg Clayton             if (log)
1022c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetDescription () => error: process is running", frame);
1023c9858e4dSGreg Clayton         }
1024c9858e4dSGreg Clayton 
10257fdf9ef1SGreg Clayton     }
1026dde9cff3SCaroline Tice     else
1027da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1028dde9cff3SCaroline Tice 
1029dde9cff3SCaroline Tice     return true;
1030dde9cff3SCaroline Tice }
10311d3afba3SGreg Clayton 
103269b582faSGreg Clayton SBValue
10331d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
10341d3afba3SGreg Clayton {
1035316d498bSGreg Clayton     SBValue result;
10367fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1037d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1038d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1039d9e416c0SGreg Clayton     if (frame && target)
1040316d498bSGreg Clayton     {
1041d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
1042316d498bSGreg Clayton         result = EvaluateExpression (expr, use_dynamic);
1043316d498bSGreg Clayton     }
1044316d498bSGreg Clayton     return result;
104578a685aaSJim Ingham }
104678a685aaSJim Ingham 
104778a685aaSJim Ingham SBValue
10482837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
104978a685aaSJim Ingham {
10507ba6e991SJim Ingham     return EvaluateExpression (expr, fetch_dynamic_value, true);
10517ba6e991SJim Ingham }
10527ba6e991SJim Ingham 
10537ba6e991SJim Ingham SBValue
10547ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error)
10557ba6e991SJim Ingham {
105669b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10574838131bSGreg Clayton 
105869b582faSGreg Clayton     LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1059a162ebafSSean Callanan 
106023f59509SGreg Clayton     ExecutionResults exe_results = eExecutionSetupError;
106169b582faSGreg Clayton     SBValue expr_result;
106281e871edSGreg Clayton     ValueObjectSP expr_value_sp;
10634838131bSGreg Clayton 
1064*4fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1065*4fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1066*4fc6cb9cSJim Ingham 
1067d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1068d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1069b9556accSGreg Clayton     if (log)
1070d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame, expr);
1071b9556accSGreg Clayton 
1072d9e416c0SGreg Clayton     if (frame && target)
10731d3afba3SGreg Clayton     {
10747fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10757fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
10767fdf9ef1SGreg Clayton         {
1077de4ca5b7SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
10781ba7c4d0SGreg Clayton             StreamString frame_description;
1079d9e416c0SGreg Clayton             frame->DumpUsingSettingsFormat (&frame_description);
10801ba7c4d0SGreg Clayton             Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
10811ba7c4d0SGreg Clayton                                                  expr, fetch_dynamic_value, frame_description.GetString().c_str());
1082de4ca5b7SEnrico Granata #endif
108320bb3aa5SSean Callanan             const bool coerce_to_id = false;
108492adcac9SSean Callanan             const bool keep_in_memory = false;
1085322f529bSSean Callanan 
1086d9e416c0SGreg Clayton             exe_results = target->EvaluateExpression (expr,
1087d9e416c0SGreg Clayton                                                       frame,
10883bfdaa2aSSean Callanan                                                       eExecutionPolicyOnlyWhenNeeded,
108920bb3aa5SSean Callanan                                                       coerce_to_id,
109078a685aaSJim Ingham                                                       unwind_on_error,
109178a685aaSJim Ingham                                                       keep_in_memory,
10922837b766SJim Ingham                                                       fetch_dynamic_value,
109381e871edSGreg Clayton                                                       expr_value_sp);
109481e871edSGreg Clayton             expr_result.SetSP(expr_value_sp);
1095de4ca5b7SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1096f49e65aeSGreg Clayton             Host::SetCrashDescription (NULL);
1097de4ca5b7SEnrico Granata #endif
10981d3afba3SGreg Clayton         }
1099c9858e4dSGreg Clayton         else
1100c9858e4dSGreg Clayton         {
1101c9858e4dSGreg Clayton             if (log)
1102c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::EvaluateExpression () => error: process is running", frame);
1103c9858e4dSGreg Clayton         }
11047fdf9ef1SGreg Clayton     }
11054838131bSGreg Clayton 
1106cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1107a162ebafSSean Callanan     if (expr_log)
110878a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
1109fe42ac4dSGreg Clayton                          expr_result.GetValue(),
1110fe42ac4dSGreg Clayton                          expr_result.GetSummary());
1111a162ebafSSean Callanan 
11124838131bSGreg Clayton     if (log)
1113d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1114d9e416c0SGreg Clayton                      frame,
111578a685aaSJim Ingham                      expr,
111681e871edSGreg Clayton                      expr_value_sp.get(),
111725f3a3cdSJohnny Chen                      exe_results);
1118cf7e2dc0SJason Molenda #endif
11194838131bSGreg Clayton 
1120cfd1acedSGreg Clayton     return expr_result;
11211d3afba3SGreg Clayton }
1122316d498bSGreg Clayton 
1123316d498bSGreg Clayton bool
1124316d498bSGreg Clayton SBFrame::IsInlined()
1125316d498bSGreg Clayton {
11267fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1127d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1128d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1129d9e416c0SGreg Clayton     if (frame && target)
1130316d498bSGreg Clayton     {
11317fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11327fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
11337fdf9ef1SGreg Clayton         {
11347fdf9ef1SGreg Clayton 
1135d9e416c0SGreg Clayton             Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1136316d498bSGreg Clayton             if (block)
1137316d498bSGreg Clayton                 return block->GetContainingInlinedBlock () != NULL;
1138316d498bSGreg Clayton         }
1139c9858e4dSGreg Clayton         else
1140c9858e4dSGreg Clayton         {
1141c9858e4dSGreg Clayton             LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1142c9858e4dSGreg Clayton             if (log)
1143c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::IsInlined () => error: process is running", frame);
1144c9858e4dSGreg Clayton         }
1145c9858e4dSGreg Clayton 
11467fdf9ef1SGreg Clayton     }
1147316d498bSGreg Clayton     return false;
1148316d498bSGreg Clayton }
1149316d498bSGreg Clayton 
1150316d498bSGreg Clayton const char *
1151316d498bSGreg Clayton SBFrame::GetFunctionName()
1152316d498bSGreg Clayton {
1153316d498bSGreg Clayton     const char *name = NULL;
11547fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1155d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1156d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1157d9e416c0SGreg Clayton     if (frame && target)
1158316d498bSGreg Clayton     {
11597fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11607fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
11617fdf9ef1SGreg Clayton         {
1162d9e416c0SGreg Clayton             SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1163316d498bSGreg Clayton             if (sc.block)
1164316d498bSGreg Clayton             {
1165316d498bSGreg Clayton                 Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1166316d498bSGreg Clayton                 if (inlined_block)
1167316d498bSGreg Clayton                 {
1168316d498bSGreg Clayton                     const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1169316d498bSGreg Clayton                     name = inlined_info->GetName().AsCString();
1170316d498bSGreg Clayton                 }
1171316d498bSGreg Clayton             }
1172316d498bSGreg Clayton 
1173316d498bSGreg Clayton             if (name == NULL)
1174316d498bSGreg Clayton             {
1175316d498bSGreg Clayton                 if (sc.function)
1176316d498bSGreg Clayton                     name = sc.function->GetName().GetCString();
1177316d498bSGreg Clayton             }
1178316d498bSGreg Clayton 
1179316d498bSGreg Clayton             if (name == NULL)
1180316d498bSGreg Clayton             {
1181316d498bSGreg Clayton                 if (sc.symbol)
1182316d498bSGreg Clayton                     name = sc.symbol->GetName().GetCString();
1183316d498bSGreg Clayton             }
1184316d498bSGreg Clayton         }
1185c9858e4dSGreg Clayton         else
1186c9858e4dSGreg Clayton         {
1187c9858e4dSGreg Clayton             LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1188c9858e4dSGreg Clayton             if (log)
1189c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFunctionName() => error: process is running", frame);
1190c9858e4dSGreg Clayton 
1191c9858e4dSGreg Clayton         }
11927fdf9ef1SGreg Clayton     }
1193316d498bSGreg Clayton     return name;
1194316d498bSGreg Clayton }
1195316d498bSGreg Clayton 
1196