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"
43dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
444c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h"
454c5de699SEli Friedman #include "lldb/API/SBThread.h"
4630fdc8d8SChris Lattner 
4730fdc8d8SChris Lattner using namespace lldb;
4830fdc8d8SChris Lattner using namespace lldb_private;
4930fdc8d8SChris Lattner 
50b9556accSGreg Clayton 
5130fdc8d8SChris Lattner SBFrame::SBFrame () :
527fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef())
5330fdc8d8SChris Lattner {
5430fdc8d8SChris Lattner }
5530fdc8d8SChris Lattner 
5669b582faSGreg Clayton SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) :
577fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef (lldb_object_sp))
5830fdc8d8SChris Lattner {
5969b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
60ceb6b139SCaroline Tice 
61ceb6b139SCaroline Tice     if (log)
62ceb6b139SCaroline Tice     {
63ceb6b139SCaroline Tice         SBStream sstr;
64ceb6b139SCaroline Tice         GetDescription (sstr);
654838131bSGreg Clayton         log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s",
66b9556accSGreg Clayton                      lldb_object_sp.get(), lldb_object_sp.get(), sstr.GetData());
67750cd175SCaroline Tice 
68ceb6b139SCaroline Tice     }
6930fdc8d8SChris Lattner }
7030fdc8d8SChris Lattner 
71efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) :
727fdf9ef1SGreg Clayton     m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp))
73efabb123SGreg Clayton {
74efabb123SGreg Clayton }
75efabb123SGreg Clayton 
76efabb123SGreg Clayton const SBFrame &
77efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs)
78efabb123SGreg Clayton {
79efabb123SGreg Clayton     if (this != &rhs)
807fdf9ef1SGreg Clayton         *m_opaque_sp = *rhs.m_opaque_sp;
81efabb123SGreg Clayton     return *this;
82efabb123SGreg Clayton }
83efabb123SGreg Clayton 
8430fdc8d8SChris Lattner SBFrame::~SBFrame()
8530fdc8d8SChris Lattner {
8630fdc8d8SChris Lattner }
8730fdc8d8SChris Lattner 
88b9556accSGreg Clayton StackFrameSP
89b9556accSGreg Clayton SBFrame::GetFrameSP() const
90b9556accSGreg Clayton {
91af2589eaSGreg Clayton     if (m_opaque_sp)
927fdf9ef1SGreg Clayton         return m_opaque_sp->GetFrameSP();
93af2589eaSGreg Clayton     return StackFrameSP();
94b9556accSGreg Clayton }
9530fdc8d8SChris Lattner 
9630fdc8d8SChris Lattner void
97b9556accSGreg Clayton SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp)
9830fdc8d8SChris Lattner {
997fdf9ef1SGreg Clayton     return m_opaque_sp->SetFrameSP(lldb_object_sp);
100b9556accSGreg Clayton }
10130fdc8d8SChris Lattner 
10230fdc8d8SChris Lattner bool
10330fdc8d8SChris Lattner SBFrame::IsValid() const
10430fdc8d8SChris Lattner {
1057fdf9ef1SGreg Clayton     return GetFrameSP().get() != NULL;
10630fdc8d8SChris Lattner }
10730fdc8d8SChris Lattner 
10830fdc8d8SChris Lattner SBSymbolContext
10930fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const
11030fdc8d8SChris Lattner {
111c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11230fdc8d8SChris Lattner     SBSymbolContext sb_sym_ctx;
1134fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1144fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1154fc6cb9cSJim Ingham 
116d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
117d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
118d9e416c0SGreg Clayton     if (frame && target)
119af67cecdSGreg Clayton     {
1207fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1217fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1227fdf9ef1SGreg Clayton         {
123d9e416c0SGreg Clayton             sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope));
124af67cecdSGreg Clayton         }
125c9858e4dSGreg Clayton         else
126c9858e4dSGreg Clayton         {
127c9858e4dSGreg Clayton             if (log)
128c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetSymbolContext () => error: process is running", frame);
129c9858e4dSGreg Clayton         }
1307fdf9ef1SGreg Clayton     }
131ceb6b139SCaroline Tice 
132ceb6b139SCaroline Tice     if (log)
1334838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)",
134d9e416c0SGreg Clayton                      frame, resolve_scope, sb_sym_ctx.get());
135ceb6b139SCaroline Tice 
13630fdc8d8SChris Lattner     return sb_sym_ctx;
13730fdc8d8SChris Lattner }
13830fdc8d8SChris Lattner 
13930fdc8d8SChris Lattner SBModule
14030fdc8d8SChris Lattner SBFrame::GetModule () const
14130fdc8d8SChris Lattner {
142c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14372eff18aSGreg Clayton     SBModule sb_module;
144acdbe816SGreg Clayton     ModuleSP module_sp;
1454fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1464fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1474fc6cb9cSJim Ingham 
148d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
149d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
150d9e416c0SGreg Clayton     if (frame && target)
151af67cecdSGreg Clayton     {
1527fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1537fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1547fdf9ef1SGreg Clayton         {
155d9e416c0SGreg Clayton             module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp;
156acdbe816SGreg Clayton             sb_module.SetSP (module_sp);
157af67cecdSGreg Clayton         }
158c9858e4dSGreg Clayton         else
159c9858e4dSGreg Clayton         {
160c9858e4dSGreg Clayton             if (log)
161c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetModule () => error: process is running", frame);
162c9858e4dSGreg Clayton         }
1637fdf9ef1SGreg Clayton     }
16472eff18aSGreg Clayton 
1654838131bSGreg Clayton     if (log)
1664838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
167d9e416c0SGreg Clayton                      frame, module_sp.get());
1684838131bSGreg Clayton 
16930fdc8d8SChris Lattner     return sb_module;
17030fdc8d8SChris Lattner }
17130fdc8d8SChris Lattner 
17230fdc8d8SChris Lattner SBCompileUnit
17330fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
17430fdc8d8SChris Lattner {
175c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
17672eff18aSGreg Clayton     SBCompileUnit sb_comp_unit;
1774fc6cb9cSJim Ingham     Mutex::Locker api_locker;
1784fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
1794fc6cb9cSJim Ingham 
180d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
181d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
182d9e416c0SGreg Clayton     if (frame && target)
183af67cecdSGreg Clayton     {
1847fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1857fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1867fdf9ef1SGreg Clayton         {
187d9e416c0SGreg Clayton             sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
188af67cecdSGreg Clayton         }
189c9858e4dSGreg Clayton         else
190c9858e4dSGreg Clayton         {
191ceb6b139SCaroline Tice             if (log)
192c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetCompileUnit () => error: process is running", frame);
193c9858e4dSGreg Clayton         }
194c9858e4dSGreg Clayton     }
195c9858e4dSGreg Clayton     if (log)
196c9858e4dSGreg Clayton         log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
197d9e416c0SGreg Clayton                      frame, sb_comp_unit.get());
198ceb6b139SCaroline Tice 
19930fdc8d8SChris Lattner     return sb_comp_unit;
20030fdc8d8SChris Lattner }
20130fdc8d8SChris Lattner 
20230fdc8d8SChris Lattner SBFunction
20330fdc8d8SChris Lattner SBFrame::GetFunction () const
20430fdc8d8SChris Lattner {
205c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
20672eff18aSGreg Clayton     SBFunction sb_function;
2074fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2084fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2094fc6cb9cSJim Ingham 
210d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
211d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
212d9e416c0SGreg Clayton     if (frame && target)
213af67cecdSGreg Clayton     {
2147fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2157fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2167fdf9ef1SGreg Clayton         {
217d9e416c0SGreg Clayton             sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function);
218af67cecdSGreg Clayton         }
219c9858e4dSGreg Clayton         else
220c9858e4dSGreg Clayton         {
221c9858e4dSGreg Clayton             if (log)
222c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFunction () => error: process is running", frame);
2237fdf9ef1SGreg Clayton         }
224c9858e4dSGreg Clayton     }
2254838131bSGreg Clayton     if (log)
2264838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
227d9e416c0SGreg Clayton                      frame, sb_function.get());
2284838131bSGreg Clayton 
22930fdc8d8SChris Lattner     return sb_function;
23030fdc8d8SChris Lattner }
23130fdc8d8SChris Lattner 
2323b06557eSGreg Clayton SBSymbol
2333b06557eSGreg Clayton SBFrame::GetSymbol () const
2343b06557eSGreg Clayton {
235c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
23672eff18aSGreg Clayton     SBSymbol sb_symbol;
2374fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2384fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2394fc6cb9cSJim Ingham 
240d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
241d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
242d9e416c0SGreg Clayton     if (frame && target)
243af67cecdSGreg Clayton     {
2447fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2457fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2467fdf9ef1SGreg Clayton         {
247d9e416c0SGreg Clayton             sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol);
248af67cecdSGreg Clayton         }
249c9858e4dSGreg Clayton         else
250c9858e4dSGreg Clayton         {
251c9858e4dSGreg Clayton             if (log)
252c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetSymbol () => error: process is running", frame);
2537fdf9ef1SGreg Clayton         }
254c9858e4dSGreg Clayton     }
2554838131bSGreg Clayton     if (log)
2564838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
257d9e416c0SGreg Clayton                      frame, sb_symbol.get());
2583b06557eSGreg Clayton     return sb_symbol;
2593b06557eSGreg Clayton }
2603b06557eSGreg Clayton 
26130fdc8d8SChris Lattner SBBlock
26230fdc8d8SChris Lattner SBFrame::GetBlock () const
26330fdc8d8SChris Lattner {
264c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
26572eff18aSGreg Clayton     SBBlock sb_block;
2664fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2674fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2684fc6cb9cSJim Ingham 
269d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
270d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
271d9e416c0SGreg Clayton     if (frame && target)
272af67cecdSGreg Clayton     {
2737fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2747fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2757fdf9ef1SGreg Clayton         {
276d9e416c0SGreg Clayton             sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block);
277af67cecdSGreg Clayton         }
278c9858e4dSGreg Clayton         else
279c9858e4dSGreg Clayton         {
280c9858e4dSGreg Clayton             if (log)
281c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", frame);
2827fdf9ef1SGreg Clayton         }
283c9858e4dSGreg Clayton     }
2844838131bSGreg Clayton     if (log)
2854838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
286d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
28730fdc8d8SChris Lattner     return sb_block;
28830fdc8d8SChris Lattner }
28930fdc8d8SChris Lattner 
29095897c6aSGreg Clayton SBBlock
29195897c6aSGreg Clayton SBFrame::GetFrameBlock () const
29295897c6aSGreg Clayton {
29372eff18aSGreg Clayton     SBBlock sb_block;
2944fc6cb9cSJim Ingham     Mutex::Locker api_locker;
2954fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
2964fc6cb9cSJim Ingham 
297d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
298d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
299c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
300d9e416c0SGreg Clayton     if (frame && target)
301af67cecdSGreg Clayton     {
3027fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3037fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3047fdf9ef1SGreg Clayton         {
305d9e416c0SGreg Clayton             sb_block.SetPtr(frame->GetFrameBlock ());
306af67cecdSGreg Clayton         }
307c9858e4dSGreg Clayton         else
308c9858e4dSGreg Clayton         {
309c9858e4dSGreg Clayton             if (log)
310c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFrameBlock () => error: process is running", frame);
3117fdf9ef1SGreg Clayton         }
312c9858e4dSGreg Clayton     }
3134838131bSGreg Clayton     if (log)
3144838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
315d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
31695897c6aSGreg Clayton     return sb_block;
31795897c6aSGreg Clayton }
31895897c6aSGreg Clayton 
31930fdc8d8SChris Lattner SBLineEntry
32030fdc8d8SChris Lattner SBFrame::GetLineEntry () const
32130fdc8d8SChris Lattner {
322c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
32372eff18aSGreg Clayton     SBLineEntry sb_line_entry;
3244fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3254fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3264fc6cb9cSJim Ingham 
327d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
328d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
329d9e416c0SGreg Clayton     if (frame && target)
330af67cecdSGreg Clayton     {
3317fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3327fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3337fdf9ef1SGreg Clayton         {
334d9e416c0SGreg Clayton             sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry);
335af67cecdSGreg Clayton         }
336c9858e4dSGreg Clayton         else
337c9858e4dSGreg Clayton         {
338c9858e4dSGreg Clayton             if (log)
339c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetLineEntry () => error: process is running", frame);
3407fdf9ef1SGreg Clayton         }
341c9858e4dSGreg Clayton     }
3424838131bSGreg Clayton     if (log)
3434838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
344d9e416c0SGreg Clayton                      frame, sb_line_entry.get());
34530fdc8d8SChris Lattner     return sb_line_entry;
34630fdc8d8SChris Lattner }
34730fdc8d8SChris Lattner 
34830fdc8d8SChris Lattner uint32_t
34930fdc8d8SChris Lattner SBFrame::GetFrameID () const
35030fdc8d8SChris Lattner {
351b9556accSGreg Clayton     uint32_t frame_idx = UINT32_MAX;
352b9556accSGreg Clayton 
3537fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
354d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
3557fdf9ef1SGreg Clayton     if (frame)
356d9e416c0SGreg Clayton         frame_idx = frame->GetFrameIndex ();
3574838131bSGreg Clayton 
35869b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3594838131bSGreg Clayton     if (log)
3604838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameID () => %u",
361d9e416c0SGreg Clayton                      frame, frame_idx);
3624838131bSGreg Clayton     return frame_idx;
36330fdc8d8SChris Lattner }
36430fdc8d8SChris Lattner 
36569b582faSGreg Clayton addr_t
36630fdc8d8SChris Lattner SBFrame::GetPC () const
36730fdc8d8SChris Lattner {
368c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
36969b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
3704fc6cb9cSJim Ingham     Mutex::Locker api_locker;
3714fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
3724fc6cb9cSJim Ingham 
373d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
374d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
375d9e416c0SGreg Clayton     if (frame && target)
376af67cecdSGreg Clayton     {
3777fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3787fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3797fdf9ef1SGreg Clayton         {
380d9e416c0SGreg Clayton             addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target);
381af67cecdSGreg Clayton         }
382c9858e4dSGreg Clayton         else
383c9858e4dSGreg Clayton         {
384c9858e4dSGreg Clayton             if (log)
385c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetPC () => error: process is running", frame);
386c9858e4dSGreg Clayton         }
3877fdf9ef1SGreg Clayton     }
388ceb6b139SCaroline Tice 
389ceb6b139SCaroline Tice     if (log)
390d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", frame, addr);
391ceb6b139SCaroline Tice 
392ceb6b139SCaroline Tice     return addr;
39330fdc8d8SChris Lattner }
39430fdc8d8SChris Lattner 
39530fdc8d8SChris Lattner bool
39669b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc)
39730fdc8d8SChris Lattner {
398c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
399ceb6b139SCaroline Tice     bool ret_val = false;
4004fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4014fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4024fc6cb9cSJim Ingham 
403d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
404d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
405d9e416c0SGreg Clayton     if (frame && target)
406af67cecdSGreg Clayton     {
4077fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4087fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4097fdf9ef1SGreg Clayton         {
410d9e416c0SGreg Clayton             ret_val = frame->GetRegisterContext()->SetPC (new_pc);
411af67cecdSGreg Clayton         }
412c9858e4dSGreg Clayton         else
413c9858e4dSGreg Clayton         {
414c9858e4dSGreg Clayton             if (log)
415c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::SetPC () => error: process is running", frame);
416c9858e4dSGreg Clayton         }
4177fdf9ef1SGreg Clayton     }
418ceb6b139SCaroline Tice 
419ceb6b139SCaroline Tice     if (log)
4204838131bSGreg Clayton         log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i",
421d9e416c0SGreg Clayton                      frame, new_pc, ret_val);
422ceb6b139SCaroline Tice 
423ceb6b139SCaroline Tice     return ret_val;
42430fdc8d8SChris Lattner }
42530fdc8d8SChris Lattner 
42669b582faSGreg Clayton addr_t
42730fdc8d8SChris Lattner SBFrame::GetSP () const
42830fdc8d8SChris Lattner {
429c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4304838131bSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
4314fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4324fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4334fc6cb9cSJim Ingham 
434d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
435d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
436d9e416c0SGreg Clayton     if (frame && target)
437af67cecdSGreg Clayton     {
4387fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4397fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4407fdf9ef1SGreg Clayton         {
441d9e416c0SGreg Clayton             addr = frame->GetRegisterContext()->GetSP();
442af67cecdSGreg Clayton         }
443c9858e4dSGreg Clayton         else
444c9858e4dSGreg Clayton         {
445c9858e4dSGreg Clayton             if (log)
446c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetSP () => error: process is running", frame);
4477fdf9ef1SGreg Clayton         }
448c9858e4dSGreg Clayton     }
4494838131bSGreg Clayton     if (log)
450d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", frame, addr);
4514838131bSGreg Clayton 
4524838131bSGreg Clayton     return addr;
45330fdc8d8SChris Lattner }
45430fdc8d8SChris Lattner 
45530fdc8d8SChris Lattner 
45669b582faSGreg Clayton addr_t
45730fdc8d8SChris Lattner SBFrame::GetFP () const
45830fdc8d8SChris Lattner {
459c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
46069b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
4614fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4624fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4634fc6cb9cSJim Ingham 
464d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
465d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
466d9e416c0SGreg Clayton     if (frame && target)
467af67cecdSGreg Clayton     {
4687fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4697fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4707fdf9ef1SGreg Clayton         {
471d9e416c0SGreg Clayton             addr = frame->GetRegisterContext()->GetFP();
472af67cecdSGreg Clayton         }
473c9858e4dSGreg Clayton         else
474c9858e4dSGreg Clayton         {
475c9858e4dSGreg Clayton             if (log)
476c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFP () => error: process is running", frame);
477c9858e4dSGreg Clayton         }
4787fdf9ef1SGreg Clayton     }
479ceb6b139SCaroline Tice 
480ceb6b139SCaroline Tice     if (log)
481d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", frame, addr);
482ceb6b139SCaroline Tice     return addr;
48330fdc8d8SChris Lattner }
48430fdc8d8SChris Lattner 
48530fdc8d8SChris Lattner 
48630fdc8d8SChris Lattner SBAddress
48730fdc8d8SChris Lattner SBFrame::GetPCAddress () const
48830fdc8d8SChris Lattner {
489c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
49030fdc8d8SChris Lattner     SBAddress sb_addr;
4914fc6cb9cSJim Ingham     Mutex::Locker api_locker;
4924fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
4934fc6cb9cSJim Ingham 
494d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
495d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
496d9e416c0SGreg Clayton     if (frame && target)
497af67cecdSGreg Clayton     {
4987fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4997fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5007fdf9ef1SGreg Clayton         {
501d9e416c0SGreg Clayton             sb_addr.SetAddress (&frame->GetFrameCodeAddress());
502af67cecdSGreg Clayton         }
503c9858e4dSGreg Clayton         else
504c9858e4dSGreg Clayton         {
505c9858e4dSGreg Clayton             if (log)
506c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetPCAddress () => error: process is running", frame);
5077fdf9ef1SGreg Clayton         }
508c9858e4dSGreg Clayton     }
5094838131bSGreg Clayton     if (log)
510d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get());
51130fdc8d8SChris Lattner     return sb_addr;
51230fdc8d8SChris Lattner }
51330fdc8d8SChris Lattner 
51430fdc8d8SChris Lattner void
51530fdc8d8SChris Lattner SBFrame::Clear()
51630fdc8d8SChris Lattner {
517af2589eaSGreg Clayton     m_opaque_sp->Clear();
51830fdc8d8SChris Lattner }
51930fdc8d8SChris Lattner 
5207edbdfc9SGreg Clayton lldb::SBValue
5217edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path)
5227edbdfc9SGreg Clayton {
5237edbdfc9SGreg Clayton     SBValue sb_value;
5247fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
525d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
526d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
527d9e416c0SGreg Clayton     if (frame && target)
5287edbdfc9SGreg Clayton     {
529d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
5307edbdfc9SGreg Clayton         sb_value = GetValueForVariablePath (var_path, use_dynamic);
5317edbdfc9SGreg Clayton     }
5327edbdfc9SGreg Clayton     return sb_value;
5337edbdfc9SGreg Clayton }
5347edbdfc9SGreg Clayton 
5357edbdfc9SGreg Clayton lldb::SBValue
5367edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic)
5377edbdfc9SGreg Clayton {
5387edbdfc9SGreg Clayton     SBValue sb_value;
5394fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5404fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5414fc6cb9cSJim Ingham 
542d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
543d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
544d9e416c0SGreg Clayton     if (frame && target && var_path && var_path[0])
5457edbdfc9SGreg Clayton     {
5467fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5477fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5487fdf9ef1SGreg Clayton         {
5497edbdfc9SGreg Clayton             VariableSP var_sp;
5507edbdfc9SGreg Clayton             Error error;
551d9e416c0SGreg Clayton             ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path,
5527edbdfc9SGreg Clayton                                                                               use_dynamic,
553685c88c5SGreg Clayton                                                                               StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess,
5547edbdfc9SGreg Clayton                                                                               var_sp,
5557edbdfc9SGreg Clayton                                                                               error));
55681e871edSGreg Clayton             sb_value.SetSP(value_sp);
5577edbdfc9SGreg Clayton         }
558c9858e4dSGreg Clayton         else
559c9858e4dSGreg Clayton         {
560c9858e4dSGreg Clayton             LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
561c9858e4dSGreg Clayton             if (log)
562c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetValueForVariablePath () => error: process is running", frame);
563c9858e4dSGreg Clayton         }
5647fdf9ef1SGreg Clayton     }
5657edbdfc9SGreg Clayton     return sb_value;
5667edbdfc9SGreg Clayton }
5677edbdfc9SGreg Clayton 
56830fdc8d8SChris Lattner SBValue
56969b582faSGreg Clayton SBFrame::FindVariable (const char *name)
57030fdc8d8SChris Lattner {
571316d498bSGreg Clayton     SBValue value;
5727fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
573d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
574d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
575d9e416c0SGreg Clayton     if (frame && target)
576316d498bSGreg Clayton     {
577d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
578316d498bSGreg Clayton         value = FindVariable (name, use_dynamic);
579316d498bSGreg Clayton     }
580316d498bSGreg Clayton     return value;
58178a685aaSJim Ingham }
58278a685aaSJim Ingham 
5837edbdfc9SGreg Clayton 
58478a685aaSJim Ingham SBValue
5852837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
58678a685aaSJim Ingham {
587c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
58869b582faSGreg Clayton     VariableSP var_sp;
58958b59f95SJim Ingham     SBValue sb_value;
59081e871edSGreg Clayton     ValueObjectSP value_sp;
5914fc6cb9cSJim Ingham     Mutex::Locker api_locker;
5924fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
5934fc6cb9cSJim Ingham 
594d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
595d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
596d9e416c0SGreg Clayton     if (frame && target && name && name[0])
59730fdc8d8SChris Lattner     {
5987fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5997fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
6007fdf9ef1SGreg Clayton         {
60169b582faSGreg Clayton             VariableList variable_list;
602d9e416c0SGreg Clayton             SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
60330fdc8d8SChris Lattner 
60472eff18aSGreg Clayton             if (sc.block)
60530fdc8d8SChris Lattner             {
60672eff18aSGreg Clayton                 const bool can_create = true;
60772eff18aSGreg Clayton                 const bool get_parent_variables = true;
60872eff18aSGreg Clayton                 const bool stop_if_block_is_inlined_function = true;
60972eff18aSGreg Clayton 
61072eff18aSGreg Clayton                 if (sc.block->AppendVariables (can_create,
61172eff18aSGreg Clayton                                                get_parent_variables,
61272eff18aSGreg Clayton                                                stop_if_block_is_inlined_function,
61372eff18aSGreg Clayton                                                &variable_list))
61472eff18aSGreg Clayton                 {
61569b582faSGreg Clayton                     var_sp = variable_list.FindVariable (ConstString(name));
61630fdc8d8SChris Lattner                 }
61772eff18aSGreg Clayton             }
61830fdc8d8SChris Lattner 
6194838131bSGreg Clayton             if (var_sp)
62081e871edSGreg Clayton             {
621d9e416c0SGreg Clayton                 value_sp = frame->GetValueObjectForFrameVariable(var_sp, use_dynamic);
62281e871edSGreg Clayton                 sb_value.SetSP(value_sp);
62381e871edSGreg Clayton             }
6247fdf9ef1SGreg Clayton         }
625c9858e4dSGreg Clayton         else
626c9858e4dSGreg Clayton         {
627c9858e4dSGreg Clayton             if (log)
628c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::FindVariable () => error: process is running", frame);
629c9858e4dSGreg Clayton         }
630316d498bSGreg Clayton     }
631316d498bSGreg Clayton 
6324838131bSGreg Clayton     if (log)
63369b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
634d9e416c0SGreg Clayton                      frame, name, value_sp.get());
6354838131bSGreg Clayton 
636dde9cff3SCaroline Tice     return sb_value;
637dde9cff3SCaroline Tice }
638dde9cff3SCaroline Tice 
63930fdc8d8SChris Lattner SBValue
64069b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type)
64130fdc8d8SChris Lattner {
642316d498bSGreg Clayton     SBValue value;
6437fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
644d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
645d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
646d9e416c0SGreg Clayton     if (frame && target)
647316d498bSGreg Clayton     {
648d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
649316d498bSGreg Clayton         value = FindValue (name, value_type, use_dynamic);
650316d498bSGreg Clayton     }
651316d498bSGreg Clayton     return value;
65278a685aaSJim Ingham }
65378a685aaSJim Ingham 
65478a685aaSJim Ingham SBValue
6552837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
65678a685aaSJim Ingham {
657c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
65869b582faSGreg Clayton     SBValue sb_value;
65981e871edSGreg Clayton     ValueObjectSP value_sp;
6604fc6cb9cSJim Ingham     Mutex::Locker api_locker;
6614fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
6624fc6cb9cSJim Ingham 
663d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
664d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
665d9e416c0SGreg Clayton     if (frame && target && name && name[0])
66630fdc8d8SChris Lattner     {
6677fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6687fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
6697fdf9ef1SGreg Clayton         {
67069b582faSGreg Clayton             switch (value_type)
67130fdc8d8SChris Lattner             {
67269b582faSGreg Clayton             case eValueTypeVariableGlobal:      // global variable
67369b582faSGreg Clayton             case eValueTypeVariableStatic:      // static variable
67469b582faSGreg Clayton             case eValueTypeVariableArgument:    // function argument variables
67569b582faSGreg Clayton             case eValueTypeVariableLocal:       // function local variables
67669b582faSGreg Clayton                 {
677d9e416c0SGreg Clayton                     VariableList *variable_list = frame->GetVariableList(true);
67872eff18aSGreg Clayton 
679d9e416c0SGreg Clayton                     SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
68072eff18aSGreg Clayton 
68172eff18aSGreg Clayton                     const bool can_create = true;
68272eff18aSGreg Clayton                     const bool get_parent_variables = true;
68372eff18aSGreg Clayton                     const bool stop_if_block_is_inlined_function = true;
68472eff18aSGreg Clayton 
68572eff18aSGreg Clayton                     if (sc.block && sc.block->AppendVariables (can_create,
68672eff18aSGreg Clayton                                                                get_parent_variables,
68772eff18aSGreg Clayton                                                                stop_if_block_is_inlined_function,
688e85d9cb8SJohnny Chen                                                                variable_list))
689beae523aSJohnny Chen                     {
69069b582faSGreg Clayton                         ConstString const_name(name);
691e85d9cb8SJohnny Chen                         const uint32_t num_variables = variable_list->GetSize();
69272eff18aSGreg Clayton                         for (uint32_t i = 0; i < num_variables; ++i)
69330fdc8d8SChris Lattner                         {
69469b582faSGreg Clayton                             VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
69569b582faSGreg Clayton                             if (variable_sp &&
69669b582faSGreg Clayton                                 variable_sp->GetScope() == value_type &&
69769b582faSGreg Clayton                                 variable_sp->GetName() == const_name)
698beae523aSJohnny Chen                             {
699d9e416c0SGreg Clayton                                 value_sp = frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic);
70081e871edSGreg Clayton                                 sb_value.SetSP (value_sp);
701beae523aSJohnny Chen                                 break;
702beae523aSJohnny Chen                             }
70330fdc8d8SChris Lattner                         }
70430fdc8d8SChris Lattner                     }
70530fdc8d8SChris Lattner                 }
70669b582faSGreg Clayton                 break;
70769b582faSGreg Clayton 
70869b582faSGreg Clayton             case eValueTypeRegister:            // stack frame register value
70969b582faSGreg Clayton                 {
710d9e416c0SGreg Clayton                     RegisterContextSP reg_ctx (frame->GetRegisterContext());
71169b582faSGreg Clayton                     if (reg_ctx)
71269b582faSGreg Clayton                     {
71369b582faSGreg Clayton                         const uint32_t num_regs = reg_ctx->GetRegisterCount();
71469b582faSGreg Clayton                         for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
71569b582faSGreg Clayton                         {
71669b582faSGreg Clayton                             const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
71769b582faSGreg Clayton                             if (reg_info &&
71869b582faSGreg Clayton                                 ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
71969b582faSGreg Clayton                                  (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
72069b582faSGreg Clayton                             {
721d9e416c0SGreg Clayton                                 value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
72281e871edSGreg Clayton                                 sb_value.SetSP (value_sp);
72381e871edSGreg Clayton                                 break;
72469b582faSGreg Clayton                             }
72569b582faSGreg Clayton                         }
72669b582faSGreg Clayton                     }
72769b582faSGreg Clayton                 }
72869b582faSGreg Clayton                 break;
72969b582faSGreg Clayton 
73069b582faSGreg Clayton             case eValueTypeRegisterSet:         // A collection of stack frame register values
73169b582faSGreg Clayton                 {
732d9e416c0SGreg Clayton                     RegisterContextSP reg_ctx (frame->GetRegisterContext());
73369b582faSGreg Clayton                     if (reg_ctx)
73469b582faSGreg Clayton                     {
73569b582faSGreg Clayton                         const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
73669b582faSGreg Clayton                         for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
73769b582faSGreg Clayton                         {
73869b582faSGreg Clayton                             const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
73969b582faSGreg Clayton                             if (reg_set &&
74069b582faSGreg Clayton                                 ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
74169b582faSGreg Clayton                                  (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
74269b582faSGreg Clayton                             {
743d9e416c0SGreg Clayton                                 value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
74481e871edSGreg Clayton                                 sb_value.SetSP (value_sp);
74581e871edSGreg Clayton                                 break;
74669b582faSGreg Clayton                             }
74769b582faSGreg Clayton                         }
74869b582faSGreg Clayton                     }
74969b582faSGreg Clayton                 }
75069b582faSGreg Clayton                 break;
75169b582faSGreg Clayton 
75269b582faSGreg Clayton             case eValueTypeConstResult:         // constant result variables
75369b582faSGreg Clayton                 {
75469b582faSGreg Clayton                     ConstString const_name(name);
755d9e416c0SGreg Clayton                     ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name));
75669b582faSGreg Clayton                     if (expr_var_sp)
75781e871edSGreg Clayton                     {
75881e871edSGreg Clayton                         value_sp = expr_var_sp->GetValueObject();
75981e871edSGreg Clayton                         sb_value.SetSP (value_sp);
76081e871edSGreg Clayton                     }
76169b582faSGreg Clayton                 }
76269b582faSGreg Clayton                 break;
76369b582faSGreg Clayton 
76469b582faSGreg Clayton             default:
76569b582faSGreg Clayton                 break;
76669b582faSGreg Clayton             }
767beae523aSJohnny Chen         }
768c9858e4dSGreg Clayton         else
769c9858e4dSGreg Clayton         {
770c9858e4dSGreg Clayton             if (log)
771c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::FindValue () => error: process is running", frame);
772c9858e4dSGreg Clayton         }
7737fdf9ef1SGreg Clayton     }
774dde9cff3SCaroline Tice 
7754838131bSGreg Clayton     if (log)
77669b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
777d9e416c0SGreg Clayton                      frame, name, value_type, value_sp.get());
7784838131bSGreg Clayton 
7794838131bSGreg Clayton 
780dde9cff3SCaroline Tice     return sb_value;
781dde9cff3SCaroline Tice }
782dde9cff3SCaroline Tice 
78330fdc8d8SChris Lattner bool
78435e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const
78535e2ab60SJohnny Chen {
78635e2ab60SJohnny Chen     lldb::StackFrameSP this_sp = GetFrameSP();
78735e2ab60SJohnny Chen     lldb::StackFrameSP that_sp = that.GetFrameSP();
78835e2ab60SJohnny Chen     return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
78935e2ab60SJohnny Chen }
79035e2ab60SJohnny Chen 
79135e2ab60SJohnny Chen bool
79230fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
79330fdc8d8SChris Lattner {
79435e2ab60SJohnny Chen     return IsEqual(rhs);
79530fdc8d8SChris Lattner }
79630fdc8d8SChris Lattner 
79730fdc8d8SChris Lattner bool
79830fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
79930fdc8d8SChris Lattner {
80035e2ab60SJohnny Chen     return !IsEqual(rhs);
801481cef25SGreg Clayton }
80230fdc8d8SChris Lattner 
80330fdc8d8SChris Lattner SBThread
80430fdc8d8SChris Lattner SBFrame::GetThread () const
80530fdc8d8SChris Lattner {
80669b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
807ceb6b139SCaroline Tice 
8087fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
809d9e416c0SGreg Clayton     ThreadSP thread_sp (exe_ctx.GetThreadSP());
810d9e416c0SGreg Clayton     SBThread sb_thread (thread_sp);
811ceb6b139SCaroline Tice 
812ceb6b139SCaroline Tice     if (log)
813750cd175SCaroline Tice     {
814750cd175SCaroline Tice         SBStream sstr;
815750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
816d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
817d9e416c0SGreg Clayton                      exe_ctx.GetFramePtr(),
818d9e416c0SGreg Clayton                      thread_sp.get(),
819d9e416c0SGreg Clayton                      sstr.GetData());
820750cd175SCaroline Tice     }
821ceb6b139SCaroline Tice 
82230fdc8d8SChris Lattner     return sb_thread;
82330fdc8d8SChris Lattner }
82430fdc8d8SChris Lattner 
82530fdc8d8SChris Lattner const char *
82630fdc8d8SChris Lattner SBFrame::Disassemble () const
82730fdc8d8SChris Lattner {
828c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
8294838131bSGreg Clayton     const char *disassembly = NULL;
8304fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8314fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8324fc6cb9cSJim Ingham 
833d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
834d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
835d9e416c0SGreg Clayton     if (frame && target)
836af67cecdSGreg Clayton     {
8377fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8387fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
8397fdf9ef1SGreg Clayton         {
840d9e416c0SGreg Clayton             disassembly = frame->Disassemble();
841af67cecdSGreg Clayton         }
842c9858e4dSGreg Clayton         else
843c9858e4dSGreg Clayton         {
844c9858e4dSGreg Clayton             if (log)
845c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::Disassemble () => error: process is running", frame);
8467fdf9ef1SGreg Clayton         }
847c9858e4dSGreg Clayton     }
8484838131bSGreg Clayton 
8494838131bSGreg Clayton     if (log)
850d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly);
8514838131bSGreg Clayton 
8524838131bSGreg Clayton     return disassembly;
85330fdc8d8SChris Lattner }
85430fdc8d8SChris Lattner 
85530fdc8d8SChris Lattner 
85630fdc8d8SChris Lattner SBValueList
85730fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
85830fdc8d8SChris Lattner                        bool locals,
85930fdc8d8SChris Lattner                        bool statics,
86030fdc8d8SChris Lattner                        bool in_scope_only)
86130fdc8d8SChris Lattner {
862316d498bSGreg Clayton     SBValueList value_list;
8637fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
864d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
865d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
866d9e416c0SGreg Clayton     if (frame && target)
867316d498bSGreg Clayton     {
868d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
869316d498bSGreg Clayton         value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic);
870316d498bSGreg Clayton     }
871316d498bSGreg Clayton     return value_list;
87278a685aaSJim Ingham }
87378a685aaSJim Ingham 
87478a685aaSJim Ingham SBValueList
87578a685aaSJim Ingham SBFrame::GetVariables (bool arguments,
87678a685aaSJim Ingham                        bool locals,
87778a685aaSJim Ingham                        bool statics,
87878a685aaSJim Ingham                        bool in_scope_only,
8792837b766SJim Ingham                        lldb::DynamicValueType  use_dynamic)
88078a685aaSJim Ingham {
88169b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
882ceb6b139SCaroline Tice 
883b9556accSGreg Clayton     SBValueList value_list;
8844fc6cb9cSJim Ingham     Mutex::Locker api_locker;
8854fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
8864fc6cb9cSJim Ingham 
887d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
888d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
889b9556accSGreg Clayton 
890ceb6b139SCaroline Tice     if (log)
8914838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
892d9e416c0SGreg Clayton                      frame,
8934838131bSGreg Clayton                      arguments,
8944838131bSGreg Clayton                      locals,
8954838131bSGreg Clayton                      statics,
8964838131bSGreg Clayton                      in_scope_only);
897ceb6b139SCaroline Tice 
898d9e416c0SGreg Clayton     if (frame && target)
89930fdc8d8SChris Lattner     {
9007fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
9017fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
9027fdf9ef1SGreg Clayton         {
903af67cecdSGreg Clayton 
90430fdc8d8SChris Lattner             size_t i;
905af67cecdSGreg Clayton             VariableList *variable_list = NULL;
906d9e416c0SGreg Clayton             variable_list = frame->GetVariableList(true);
90730fdc8d8SChris Lattner             if (variable_list)
90830fdc8d8SChris Lattner             {
90930fdc8d8SChris Lattner                 const size_t num_variables = variable_list->GetSize();
91030fdc8d8SChris Lattner                 if (num_variables)
91130fdc8d8SChris Lattner                 {
91230fdc8d8SChris Lattner                     for (i = 0; i < num_variables; ++i)
91330fdc8d8SChris Lattner                     {
91430fdc8d8SChris Lattner                         VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
91530fdc8d8SChris Lattner                         if (variable_sp)
91630fdc8d8SChris Lattner                         {
91730fdc8d8SChris Lattner                             bool add_variable = false;
91830fdc8d8SChris Lattner                             switch (variable_sp->GetScope())
91930fdc8d8SChris Lattner                             {
92030fdc8d8SChris Lattner                             case eValueTypeVariableGlobal:
92130fdc8d8SChris Lattner                             case eValueTypeVariableStatic:
92230fdc8d8SChris Lattner                                 add_variable = statics;
92330fdc8d8SChris Lattner                                 break;
92430fdc8d8SChris Lattner 
92530fdc8d8SChris Lattner                             case eValueTypeVariableArgument:
92630fdc8d8SChris Lattner                                 add_variable = arguments;
92730fdc8d8SChris Lattner                                 break;
92830fdc8d8SChris Lattner 
92930fdc8d8SChris Lattner                             case eValueTypeVariableLocal:
93030fdc8d8SChris Lattner                                 add_variable = locals;
93130fdc8d8SChris Lattner                                 break;
932c982c768SGreg Clayton 
933c982c768SGreg Clayton                             default:
934c982c768SGreg Clayton                                 break;
93530fdc8d8SChris Lattner                             }
93630fdc8d8SChris Lattner                             if (add_variable)
93730fdc8d8SChris Lattner                             {
938d9e416c0SGreg Clayton                                 if (in_scope_only && !variable_sp->IsInScope(frame))
93930fdc8d8SChris Lattner                                     continue;
94030fdc8d8SChris Lattner 
941d9e416c0SGreg Clayton                                 value_list.Append(frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic));
94230fdc8d8SChris Lattner                             }
94330fdc8d8SChris Lattner                         }
94430fdc8d8SChris Lattner                     }
94530fdc8d8SChris Lattner                 }
94630fdc8d8SChris Lattner             }
94730fdc8d8SChris Lattner         }
948c9858e4dSGreg Clayton         else
949c9858e4dSGreg Clayton         {
950c9858e4dSGreg Clayton             if (log)
951c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetVariables () => error: process is running", frame);
952c9858e4dSGreg Clayton         }
9537fdf9ef1SGreg Clayton     }
954ceb6b139SCaroline Tice 
955ceb6b139SCaroline Tice     if (log)
956ceb6b139SCaroline Tice     {
957d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame,
958750cd175SCaroline Tice                      value_list.get());
959ceb6b139SCaroline Tice     }
960ceb6b139SCaroline Tice 
96130fdc8d8SChris Lattner     return value_list;
96230fdc8d8SChris Lattner }
96330fdc8d8SChris Lattner 
96469b582faSGreg Clayton SBValueList
96530fdc8d8SChris Lattner SBFrame::GetRegisters ()
96630fdc8d8SChris Lattner {
96769b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
968ceb6b139SCaroline Tice 
96930fdc8d8SChris Lattner     SBValueList value_list;
9704fc6cb9cSJim Ingham     Mutex::Locker api_locker;
9714fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
9724fc6cb9cSJim Ingham 
973d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
974d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
975d9e416c0SGreg Clayton     if (frame && target)
97630fdc8d8SChris Lattner     {
9777fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
9787fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
9797fdf9ef1SGreg Clayton         {
980d9e416c0SGreg Clayton             RegisterContextSP reg_ctx (frame->GetRegisterContext());
98130fdc8d8SChris Lattner             if (reg_ctx)
98230fdc8d8SChris Lattner             {
98330fdc8d8SChris Lattner                 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
98430fdc8d8SChris Lattner                 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
98530fdc8d8SChris Lattner                 {
986d9e416c0SGreg Clayton                     value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
98730fdc8d8SChris Lattner                 }
98830fdc8d8SChris Lattner             }
98930fdc8d8SChris Lattner         }
990c9858e4dSGreg Clayton         else
991c9858e4dSGreg Clayton         {
992c9858e4dSGreg Clayton             if (log)
993c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetRegisters () => error: process is running", frame);
994c9858e4dSGreg Clayton         }
9957fdf9ef1SGreg Clayton     }
996ceb6b139SCaroline Tice 
997ceb6b139SCaroline Tice     if (log)
998c9858e4dSGreg Clayton         log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.get());
999ceb6b139SCaroline Tice 
100030fdc8d8SChris Lattner     return value_list;
100130fdc8d8SChris Lattner }
100230fdc8d8SChris Lattner 
1003dde9cff3SCaroline Tice bool
1004dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
1005dde9cff3SCaroline Tice {
1006da7bc7d0SGreg Clayton     Stream &strm = description.ref();
1007da7bc7d0SGreg Clayton 
10084fc6cb9cSJim Ingham     Mutex::Locker api_locker;
10094fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
10104fc6cb9cSJim Ingham 
1011d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1012d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1013d9e416c0SGreg Clayton     if (frame && target)
1014dde9cff3SCaroline Tice     {
10157fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10167fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
10177fdf9ef1SGreg Clayton         {
1018d9e416c0SGreg Clayton             frame->DumpUsingSettingsFormat (&strm);
1019dde9cff3SCaroline Tice         }
1020c9858e4dSGreg Clayton         else
1021c9858e4dSGreg Clayton         {
1022c9858e4dSGreg Clayton             LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1023c9858e4dSGreg Clayton             if (log)
1024c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetDescription () => error: process is running", frame);
1025c9858e4dSGreg Clayton         }
1026c9858e4dSGreg Clayton 
10277fdf9ef1SGreg Clayton     }
1028dde9cff3SCaroline Tice     else
1029da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1030dde9cff3SCaroline Tice 
1031dde9cff3SCaroline Tice     return true;
1032dde9cff3SCaroline Tice }
10331d3afba3SGreg Clayton 
103469b582faSGreg Clayton SBValue
10351d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
10361d3afba3SGreg Clayton {
1037316d498bSGreg Clayton     SBValue result;
10387fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1039d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1040d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1041d9e416c0SGreg Clayton     if (frame && target)
1042316d498bSGreg Clayton     {
1043d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
1044316d498bSGreg Clayton         result = EvaluateExpression (expr, use_dynamic);
1045316d498bSGreg Clayton     }
1046316d498bSGreg Clayton     return result;
104778a685aaSJim Ingham }
104878a685aaSJim Ingham 
104978a685aaSJim Ingham SBValue
10502837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
105178a685aaSJim Ingham {
10527ba6e991SJim Ingham     return EvaluateExpression (expr, fetch_dynamic_value, true);
10537ba6e991SJim Ingham }
10547ba6e991SJim Ingham 
10557ba6e991SJim Ingham SBValue
10567ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error)
10577ba6e991SJim Ingham {
105869b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10594838131bSGreg Clayton 
106069b582faSGreg Clayton     LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1061a162ebafSSean Callanan 
106223f59509SGreg Clayton     ExecutionResults exe_results = eExecutionSetupError;
106369b582faSGreg Clayton     SBValue expr_result;
106481e871edSGreg Clayton     ValueObjectSP expr_value_sp;
10654838131bSGreg Clayton 
10664fc6cb9cSJim Ingham     Mutex::Locker api_locker;
10674fc6cb9cSJim Ingham     ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker);
10684fc6cb9cSJim Ingham 
1069d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1070d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1071b9556accSGreg Clayton     if (log)
1072d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame, expr);
1073b9556accSGreg Clayton 
1074d9e416c0SGreg Clayton     if (frame && target)
10751d3afba3SGreg Clayton     {
10767fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10777fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
10787fdf9ef1SGreg Clayton         {
1079de4ca5b7SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
10801ba7c4d0SGreg Clayton             StreamString frame_description;
1081d9e416c0SGreg Clayton             frame->DumpUsingSettingsFormat (&frame_description);
10821ba7c4d0SGreg Clayton             Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
10831ba7c4d0SGreg Clayton                                                  expr, fetch_dynamic_value, frame_description.GetString().c_str());
1084de4ca5b7SEnrico Granata #endif
1085*d4439aa9SEnrico Granata             Target::EvaluateExpressionOptions options;
1086*d4439aa9SEnrico Granata             options.SetUnwindOnError(unwind_on_error)
1087*d4439aa9SEnrico Granata             .SetUseDynamic(fetch_dynamic_value);
1088322f529bSSean Callanan 
1089d9e416c0SGreg Clayton             exe_results = target->EvaluateExpression (expr,
1090d9e416c0SGreg Clayton                                                       frame,
1091*d4439aa9SEnrico Granata                                                       expr_value_sp,
1092*d4439aa9SEnrico Granata                                                       options);
109381e871edSGreg Clayton             expr_result.SetSP(expr_value_sp);
1094de4ca5b7SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1095f49e65aeSGreg Clayton             Host::SetCrashDescription (NULL);
1096de4ca5b7SEnrico Granata #endif
10971d3afba3SGreg Clayton         }
1098c9858e4dSGreg Clayton         else
1099c9858e4dSGreg Clayton         {
1100c9858e4dSGreg Clayton             if (log)
1101c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::EvaluateExpression () => error: process is running", frame);
1102c9858e4dSGreg Clayton         }
11037fdf9ef1SGreg Clayton     }
11044838131bSGreg Clayton 
1105cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1106a162ebafSSean Callanan     if (expr_log)
110778a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
1108fe42ac4dSGreg Clayton                          expr_result.GetValue(),
1109fe42ac4dSGreg Clayton                          expr_result.GetSummary());
1110a162ebafSSean Callanan 
11114838131bSGreg Clayton     if (log)
1112d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1113d9e416c0SGreg Clayton                      frame,
111478a685aaSJim Ingham                      expr,
111581e871edSGreg Clayton                      expr_value_sp.get(),
111625f3a3cdSJohnny Chen                      exe_results);
1117cf7e2dc0SJason Molenda #endif
11184838131bSGreg Clayton 
1119cfd1acedSGreg Clayton     return expr_result;
11201d3afba3SGreg Clayton }
1121316d498bSGreg Clayton 
1122316d498bSGreg Clayton bool
1123316d498bSGreg Clayton SBFrame::IsInlined()
1124316d498bSGreg Clayton {
11257fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1126d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1127d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1128d9e416c0SGreg Clayton     if (frame && target)
1129316d498bSGreg Clayton     {
11307fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11317fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
11327fdf9ef1SGreg Clayton         {
11337fdf9ef1SGreg Clayton 
1134d9e416c0SGreg Clayton             Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1135316d498bSGreg Clayton             if (block)
1136316d498bSGreg Clayton                 return block->GetContainingInlinedBlock () != NULL;
1137316d498bSGreg Clayton         }
1138c9858e4dSGreg Clayton         else
1139c9858e4dSGreg Clayton         {
1140c9858e4dSGreg Clayton             LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1141c9858e4dSGreg Clayton             if (log)
1142c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::IsInlined () => error: process is running", frame);
1143c9858e4dSGreg Clayton         }
1144c9858e4dSGreg Clayton 
11457fdf9ef1SGreg Clayton     }
1146316d498bSGreg Clayton     return false;
1147316d498bSGreg Clayton }
1148316d498bSGreg Clayton 
1149316d498bSGreg Clayton const char *
1150316d498bSGreg Clayton SBFrame::GetFunctionName()
1151316d498bSGreg Clayton {
1152316d498bSGreg Clayton     const char *name = NULL;
11537fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1154d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1155d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1156d9e416c0SGreg Clayton     if (frame && target)
1157316d498bSGreg Clayton     {
11587fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11597fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
11607fdf9ef1SGreg Clayton         {
1161d9e416c0SGreg Clayton             SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1162316d498bSGreg Clayton             if (sc.block)
1163316d498bSGreg Clayton             {
1164316d498bSGreg Clayton                 Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1165316d498bSGreg Clayton                 if (inlined_block)
1166316d498bSGreg Clayton                 {
1167316d498bSGreg Clayton                     const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1168316d498bSGreg Clayton                     name = inlined_info->GetName().AsCString();
1169316d498bSGreg Clayton                 }
1170316d498bSGreg Clayton             }
1171316d498bSGreg Clayton 
1172316d498bSGreg Clayton             if (name == NULL)
1173316d498bSGreg Clayton             {
1174316d498bSGreg Clayton                 if (sc.function)
1175316d498bSGreg Clayton                     name = sc.function->GetName().GetCString();
1176316d498bSGreg Clayton             }
1177316d498bSGreg Clayton 
1178316d498bSGreg Clayton             if (name == NULL)
1179316d498bSGreg Clayton             {
1180316d498bSGreg Clayton                 if (sc.symbol)
1181316d498bSGreg Clayton                     name = sc.symbol->GetName().GetCString();
1182316d498bSGreg Clayton             }
1183316d498bSGreg Clayton         }
1184c9858e4dSGreg Clayton         else
1185c9858e4dSGreg Clayton         {
1186c9858e4dSGreg Clayton             LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1187c9858e4dSGreg Clayton             if (log)
1188c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFunctionName() => error: process is running", frame);
1189c9858e4dSGreg Clayton 
1190c9858e4dSGreg Clayton         }
11917fdf9ef1SGreg Clayton     }
1192316d498bSGreg Clayton     return name;
1193316d498bSGreg Clayton }
1194316d498bSGreg Clayton 
1195