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 {
897fdf9ef1SGreg Clayton     return m_opaque_sp->GetFrameSP();
90b9556accSGreg Clayton }
9130fdc8d8SChris Lattner 
9230fdc8d8SChris Lattner void
93b9556accSGreg Clayton SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp)
9430fdc8d8SChris Lattner {
957fdf9ef1SGreg Clayton     return m_opaque_sp->SetFrameSP(lldb_object_sp);
96b9556accSGreg Clayton }
9730fdc8d8SChris Lattner 
9830fdc8d8SChris Lattner bool
9930fdc8d8SChris Lattner SBFrame::IsValid() const
10030fdc8d8SChris Lattner {
1017fdf9ef1SGreg Clayton     return GetFrameSP().get() != NULL;
10230fdc8d8SChris Lattner }
10330fdc8d8SChris Lattner 
10430fdc8d8SChris Lattner SBSymbolContext
10530fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const
10630fdc8d8SChris Lattner {
107*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10830fdc8d8SChris Lattner     SBSymbolContext sb_sym_ctx;
1097fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
110d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
111d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
112d9e416c0SGreg Clayton     if (frame && target)
113af67cecdSGreg Clayton     {
1147fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1157fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1167fdf9ef1SGreg Clayton         {
117d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
118d9e416c0SGreg Clayton             sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope));
119af67cecdSGreg Clayton         }
120*c9858e4dSGreg Clayton         else
121*c9858e4dSGreg Clayton         {
122*c9858e4dSGreg Clayton             if (log)
123*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetSymbolContext () => error: process is running", frame);
124*c9858e4dSGreg Clayton         }
1257fdf9ef1SGreg Clayton     }
126ceb6b139SCaroline Tice 
127ceb6b139SCaroline Tice     if (log)
1284838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)",
129d9e416c0SGreg Clayton                      frame, resolve_scope, sb_sym_ctx.get());
130ceb6b139SCaroline Tice 
13130fdc8d8SChris Lattner     return sb_sym_ctx;
13230fdc8d8SChris Lattner }
13330fdc8d8SChris Lattner 
13430fdc8d8SChris Lattner SBModule
13530fdc8d8SChris Lattner SBFrame::GetModule () const
13630fdc8d8SChris Lattner {
137*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
13872eff18aSGreg Clayton     SBModule sb_module;
139acdbe816SGreg Clayton     ModuleSP module_sp;
1407fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
141d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
142d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
143d9e416c0SGreg Clayton     if (frame && target)
144af67cecdSGreg Clayton     {
1457fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1467fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1477fdf9ef1SGreg Clayton         {
148d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
149d9e416c0SGreg Clayton             module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp;
150acdbe816SGreg Clayton             sb_module.SetSP (module_sp);
151af67cecdSGreg Clayton         }
152*c9858e4dSGreg Clayton         else
153*c9858e4dSGreg Clayton         {
154*c9858e4dSGreg Clayton             if (log)
155*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetModule () => error: process is running", frame);
156*c9858e4dSGreg Clayton         }
1577fdf9ef1SGreg Clayton     }
15872eff18aSGreg Clayton 
1594838131bSGreg Clayton     if (log)
1604838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
161d9e416c0SGreg Clayton                      frame, module_sp.get());
1624838131bSGreg Clayton 
16330fdc8d8SChris Lattner     return sb_module;
16430fdc8d8SChris Lattner }
16530fdc8d8SChris Lattner 
16630fdc8d8SChris Lattner SBCompileUnit
16730fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
16830fdc8d8SChris Lattner {
169*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
17072eff18aSGreg Clayton     SBCompileUnit sb_comp_unit;
1717fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
172d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
173d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
174d9e416c0SGreg Clayton     if (frame && target)
175af67cecdSGreg Clayton     {
1767fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1777fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1787fdf9ef1SGreg Clayton         {
179d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
180d9e416c0SGreg Clayton             sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
181af67cecdSGreg Clayton         }
182*c9858e4dSGreg Clayton         else
183*c9858e4dSGreg Clayton         {
184ceb6b139SCaroline Tice             if (log)
185*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetCompileUnit () => error: process is running", frame);
186*c9858e4dSGreg Clayton         }
187*c9858e4dSGreg Clayton     }
188*c9858e4dSGreg Clayton     if (log)
189*c9858e4dSGreg Clayton         log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
190d9e416c0SGreg Clayton                      frame, sb_comp_unit.get());
191ceb6b139SCaroline Tice 
19230fdc8d8SChris Lattner     return sb_comp_unit;
19330fdc8d8SChris Lattner }
19430fdc8d8SChris Lattner 
19530fdc8d8SChris Lattner SBFunction
19630fdc8d8SChris Lattner SBFrame::GetFunction () const
19730fdc8d8SChris Lattner {
198*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
19972eff18aSGreg Clayton     SBFunction sb_function;
2007fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
201d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
202d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
203d9e416c0SGreg Clayton     if (frame && target)
204af67cecdSGreg Clayton     {
2057fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2067fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2077fdf9ef1SGreg Clayton         {
208d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
209d9e416c0SGreg Clayton             sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function);
210af67cecdSGreg Clayton         }
211*c9858e4dSGreg Clayton         else
212*c9858e4dSGreg Clayton         {
213*c9858e4dSGreg Clayton             if (log)
214*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFunction () => error: process is running", frame);
2157fdf9ef1SGreg Clayton         }
216*c9858e4dSGreg Clayton     }
2174838131bSGreg Clayton     if (log)
2184838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
219d9e416c0SGreg Clayton                      frame, sb_function.get());
2204838131bSGreg Clayton 
22130fdc8d8SChris Lattner     return sb_function;
22230fdc8d8SChris Lattner }
22330fdc8d8SChris Lattner 
2243b06557eSGreg Clayton SBSymbol
2253b06557eSGreg Clayton SBFrame::GetSymbol () const
2263b06557eSGreg Clayton {
227*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
22872eff18aSGreg Clayton     SBSymbol sb_symbol;
2297fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
230d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
231d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
232d9e416c0SGreg Clayton     if (frame && target)
233af67cecdSGreg Clayton     {
2347fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2357fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2367fdf9ef1SGreg Clayton         {
237d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
238d9e416c0SGreg Clayton             sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol);
239af67cecdSGreg Clayton         }
240*c9858e4dSGreg Clayton         else
241*c9858e4dSGreg Clayton         {
242*c9858e4dSGreg Clayton             if (log)
243*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetSymbol () => error: process is running", frame);
2447fdf9ef1SGreg Clayton         }
245*c9858e4dSGreg Clayton     }
2464838131bSGreg Clayton     if (log)
2474838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
248d9e416c0SGreg Clayton                      frame, sb_symbol.get());
2493b06557eSGreg Clayton     return sb_symbol;
2503b06557eSGreg Clayton }
2513b06557eSGreg Clayton 
25230fdc8d8SChris Lattner SBBlock
25330fdc8d8SChris Lattner SBFrame::GetBlock () const
25430fdc8d8SChris Lattner {
255*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
25672eff18aSGreg Clayton     SBBlock sb_block;
2577fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
258d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
259d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
260d9e416c0SGreg Clayton     if (frame && target)
261af67cecdSGreg Clayton     {
2627fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2637fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2647fdf9ef1SGreg Clayton         {
265d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
266d9e416c0SGreg Clayton             sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block);
267af67cecdSGreg Clayton         }
268*c9858e4dSGreg Clayton         else
269*c9858e4dSGreg Clayton         {
270*c9858e4dSGreg Clayton             if (log)
271*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", frame);
2727fdf9ef1SGreg Clayton         }
273*c9858e4dSGreg Clayton     }
2744838131bSGreg Clayton     if (log)
2754838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
276d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
27730fdc8d8SChris Lattner     return sb_block;
27830fdc8d8SChris Lattner }
27930fdc8d8SChris Lattner 
28095897c6aSGreg Clayton SBBlock
28195897c6aSGreg Clayton SBFrame::GetFrameBlock () const
28295897c6aSGreg Clayton {
28372eff18aSGreg Clayton     SBBlock sb_block;
2847fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
285d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
286d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
287*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
288d9e416c0SGreg Clayton     if (frame && target)
289af67cecdSGreg Clayton     {
2907fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2917fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2927fdf9ef1SGreg Clayton         {
293d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
294d9e416c0SGreg Clayton             sb_block.SetPtr(frame->GetFrameBlock ());
295af67cecdSGreg Clayton         }
296*c9858e4dSGreg Clayton         else
297*c9858e4dSGreg Clayton         {
298*c9858e4dSGreg Clayton             if (log)
299*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFrameBlock () => error: process is running", frame);
3007fdf9ef1SGreg Clayton         }
301*c9858e4dSGreg Clayton     }
3024838131bSGreg Clayton     if (log)
3034838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
304d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
30595897c6aSGreg Clayton     return sb_block;
30695897c6aSGreg Clayton }
30795897c6aSGreg Clayton 
30830fdc8d8SChris Lattner SBLineEntry
30930fdc8d8SChris Lattner SBFrame::GetLineEntry () const
31030fdc8d8SChris Lattner {
311*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
31272eff18aSGreg Clayton     SBLineEntry sb_line_entry;
3137fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
314d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
315d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
316d9e416c0SGreg Clayton     if (frame && target)
317af67cecdSGreg Clayton     {
3187fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3197fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3207fdf9ef1SGreg Clayton         {
321d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
322d9e416c0SGreg Clayton             sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry);
323af67cecdSGreg Clayton         }
324*c9858e4dSGreg Clayton         else
325*c9858e4dSGreg Clayton         {
326*c9858e4dSGreg Clayton             if (log)
327*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetLineEntry () => error: process is running", frame);
3287fdf9ef1SGreg Clayton         }
329*c9858e4dSGreg Clayton     }
3304838131bSGreg Clayton     if (log)
3314838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
332d9e416c0SGreg Clayton                      frame, sb_line_entry.get());
33330fdc8d8SChris Lattner     return sb_line_entry;
33430fdc8d8SChris Lattner }
33530fdc8d8SChris Lattner 
33630fdc8d8SChris Lattner uint32_t
33730fdc8d8SChris Lattner SBFrame::GetFrameID () const
33830fdc8d8SChris Lattner {
339b9556accSGreg Clayton     uint32_t frame_idx = UINT32_MAX;
340b9556accSGreg Clayton 
3417fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
342d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
3437fdf9ef1SGreg Clayton     if (frame)
344d9e416c0SGreg Clayton         frame_idx = frame->GetFrameIndex ();
3454838131bSGreg Clayton 
34669b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3474838131bSGreg Clayton     if (log)
3484838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameID () => %u",
349d9e416c0SGreg Clayton                      frame, frame_idx);
3504838131bSGreg Clayton     return frame_idx;
35130fdc8d8SChris Lattner }
35230fdc8d8SChris Lattner 
35369b582faSGreg Clayton addr_t
35430fdc8d8SChris Lattner SBFrame::GetPC () const
35530fdc8d8SChris Lattner {
356*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
35769b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
3587fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
359d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
360d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
361d9e416c0SGreg Clayton     if (frame && target)
362af67cecdSGreg Clayton     {
3637fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3647fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3657fdf9ef1SGreg Clayton         {
366d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
367d9e416c0SGreg Clayton             addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target);
368af67cecdSGreg Clayton         }
369*c9858e4dSGreg Clayton         else
370*c9858e4dSGreg Clayton         {
371*c9858e4dSGreg Clayton             if (log)
372*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetPC () => error: process is running", frame);
373*c9858e4dSGreg Clayton         }
3747fdf9ef1SGreg Clayton     }
375ceb6b139SCaroline Tice 
376ceb6b139SCaroline Tice     if (log)
377d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", frame, addr);
378ceb6b139SCaroline Tice 
379ceb6b139SCaroline Tice     return addr;
38030fdc8d8SChris Lattner }
38130fdc8d8SChris Lattner 
38230fdc8d8SChris Lattner bool
38369b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc)
38430fdc8d8SChris Lattner {
385*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
386ceb6b139SCaroline Tice     bool ret_val = false;
3877fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
388d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
389d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
390d9e416c0SGreg Clayton     if (frame && target)
391af67cecdSGreg Clayton     {
3927fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3937fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3947fdf9ef1SGreg Clayton         {
395d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
396d9e416c0SGreg Clayton             ret_val = frame->GetRegisterContext()->SetPC (new_pc);
397af67cecdSGreg Clayton         }
398*c9858e4dSGreg Clayton         else
399*c9858e4dSGreg Clayton         {
400*c9858e4dSGreg Clayton             if (log)
401*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::SetPC () => error: process is running", frame);
402*c9858e4dSGreg Clayton         }
4037fdf9ef1SGreg Clayton     }
404ceb6b139SCaroline Tice 
405ceb6b139SCaroline Tice     if (log)
4064838131bSGreg Clayton         log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i",
407d9e416c0SGreg Clayton                      frame, new_pc, ret_val);
408ceb6b139SCaroline Tice 
409ceb6b139SCaroline Tice     return ret_val;
41030fdc8d8SChris Lattner }
41130fdc8d8SChris Lattner 
41269b582faSGreg Clayton addr_t
41330fdc8d8SChris Lattner SBFrame::GetSP () const
41430fdc8d8SChris Lattner {
415*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4164838131bSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
4177fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
418d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
419d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
420d9e416c0SGreg Clayton     if (frame && target)
421af67cecdSGreg Clayton     {
4227fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4237fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4247fdf9ef1SGreg Clayton         {
425d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
426d9e416c0SGreg Clayton             addr = frame->GetRegisterContext()->GetSP();
427af67cecdSGreg Clayton         }
428*c9858e4dSGreg Clayton         else
429*c9858e4dSGreg Clayton         {
430*c9858e4dSGreg Clayton             if (log)
431*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetSP () => error: process is running", frame);
4327fdf9ef1SGreg Clayton         }
433*c9858e4dSGreg Clayton     }
4344838131bSGreg Clayton     if (log)
435d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", frame, addr);
4364838131bSGreg Clayton 
4374838131bSGreg Clayton     return addr;
43830fdc8d8SChris Lattner }
43930fdc8d8SChris Lattner 
44030fdc8d8SChris Lattner 
44169b582faSGreg Clayton addr_t
44230fdc8d8SChris Lattner SBFrame::GetFP () const
44330fdc8d8SChris Lattner {
444*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
44569b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
4467fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
447d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
448d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
449d9e416c0SGreg Clayton     if (frame && target)
450af67cecdSGreg Clayton     {
4517fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4527fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4537fdf9ef1SGreg Clayton         {
454d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
455d9e416c0SGreg Clayton             addr = frame->GetRegisterContext()->GetFP();
456af67cecdSGreg Clayton         }
457*c9858e4dSGreg Clayton         else
458*c9858e4dSGreg Clayton         {
459*c9858e4dSGreg Clayton             if (log)
460*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFP () => error: process is running", frame);
461*c9858e4dSGreg Clayton         }
4627fdf9ef1SGreg Clayton     }
463ceb6b139SCaroline Tice 
464ceb6b139SCaroline Tice     if (log)
465d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", frame, addr);
466ceb6b139SCaroline Tice     return addr;
46730fdc8d8SChris Lattner }
46830fdc8d8SChris Lattner 
46930fdc8d8SChris Lattner 
47030fdc8d8SChris Lattner SBAddress
47130fdc8d8SChris Lattner SBFrame::GetPCAddress () const
47230fdc8d8SChris Lattner {
473*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
47430fdc8d8SChris Lattner     SBAddress sb_addr;
4757fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
476d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
477d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
478d9e416c0SGreg Clayton     if (frame && target)
479af67cecdSGreg Clayton     {
4807fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4817fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4827fdf9ef1SGreg Clayton         {
483d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
484d9e416c0SGreg Clayton             sb_addr.SetAddress (&frame->GetFrameCodeAddress());
485af67cecdSGreg Clayton         }
486*c9858e4dSGreg Clayton         else
487*c9858e4dSGreg Clayton         {
488*c9858e4dSGreg Clayton             if (log)
489*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetPCAddress () => error: process is running", frame);
4907fdf9ef1SGreg Clayton         }
491*c9858e4dSGreg Clayton     }
4924838131bSGreg Clayton     if (log)
493d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get());
49430fdc8d8SChris Lattner     return sb_addr;
49530fdc8d8SChris Lattner }
49630fdc8d8SChris Lattner 
49730fdc8d8SChris Lattner void
49830fdc8d8SChris Lattner SBFrame::Clear()
49930fdc8d8SChris Lattner {
5006611103cSGreg Clayton     m_opaque_sp.reset();
50130fdc8d8SChris Lattner }
50230fdc8d8SChris Lattner 
5037edbdfc9SGreg Clayton lldb::SBValue
5047edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path)
5057edbdfc9SGreg Clayton {
5067edbdfc9SGreg Clayton     SBValue sb_value;
5077fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
508d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
509d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
510d9e416c0SGreg Clayton     if (frame && target)
5117edbdfc9SGreg Clayton     {
512d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
5137edbdfc9SGreg Clayton         sb_value = GetValueForVariablePath (var_path, use_dynamic);
5147edbdfc9SGreg Clayton     }
5157edbdfc9SGreg Clayton     return sb_value;
5167edbdfc9SGreg Clayton }
5177edbdfc9SGreg Clayton 
5187edbdfc9SGreg Clayton lldb::SBValue
5197edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic)
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 && var_path && var_path[0])
5267edbdfc9SGreg Clayton     {
5277fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5287fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5297fdf9ef1SGreg Clayton         {
530d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
5317edbdfc9SGreg Clayton             VariableSP var_sp;
5327edbdfc9SGreg Clayton             Error error;
533d9e416c0SGreg Clayton             ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path,
5347edbdfc9SGreg Clayton                                                                               use_dynamic,
5357edbdfc9SGreg Clayton                                                                               StackFrame::eExpressionPathOptionCheckPtrVsMember,
5367edbdfc9SGreg Clayton                                                                               var_sp,
5377edbdfc9SGreg Clayton                                                                               error));
53881e871edSGreg Clayton             sb_value.SetSP(value_sp);
5397edbdfc9SGreg Clayton         }
540*c9858e4dSGreg Clayton         else
541*c9858e4dSGreg Clayton         {
542*c9858e4dSGreg Clayton             LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
543*c9858e4dSGreg Clayton             if (log)
544*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetValueForVariablePath () => error: process is running", frame);
545*c9858e4dSGreg Clayton         }
5467fdf9ef1SGreg Clayton     }
5477edbdfc9SGreg Clayton     return sb_value;
5487edbdfc9SGreg Clayton }
5497edbdfc9SGreg Clayton 
55030fdc8d8SChris Lattner SBValue
55169b582faSGreg Clayton SBFrame::FindVariable (const char *name)
55230fdc8d8SChris Lattner {
553316d498bSGreg Clayton     SBValue value;
5547fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
555d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
556d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
557d9e416c0SGreg Clayton     if (frame && target)
558316d498bSGreg Clayton     {
559d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
560316d498bSGreg Clayton         value = FindVariable (name, use_dynamic);
561316d498bSGreg Clayton     }
562316d498bSGreg Clayton     return value;
56378a685aaSJim Ingham }
56478a685aaSJim Ingham 
5657edbdfc9SGreg Clayton 
56678a685aaSJim Ingham SBValue
5672837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
56878a685aaSJim Ingham {
569*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
57069b582faSGreg Clayton     VariableSP var_sp;
57158b59f95SJim Ingham     SBValue sb_value;
57281e871edSGreg Clayton     ValueObjectSP value_sp;
5737fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
574d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
575d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
576d9e416c0SGreg Clayton     if (frame && target && name && name[0])
57730fdc8d8SChris Lattner     {
5787fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5797fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5807fdf9ef1SGreg Clayton         {
58169b582faSGreg Clayton             VariableList variable_list;
582d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
583d9e416c0SGreg Clayton             SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
58430fdc8d8SChris Lattner 
58572eff18aSGreg Clayton             if (sc.block)
58630fdc8d8SChris Lattner             {
58772eff18aSGreg Clayton                 const bool can_create = true;
58872eff18aSGreg Clayton                 const bool get_parent_variables = true;
58972eff18aSGreg Clayton                 const bool stop_if_block_is_inlined_function = true;
59072eff18aSGreg Clayton 
59172eff18aSGreg Clayton                 if (sc.block->AppendVariables (can_create,
59272eff18aSGreg Clayton                                                get_parent_variables,
59372eff18aSGreg Clayton                                                stop_if_block_is_inlined_function,
59472eff18aSGreg Clayton                                                &variable_list))
59572eff18aSGreg Clayton                 {
59669b582faSGreg Clayton                     var_sp = variable_list.FindVariable (ConstString(name));
59730fdc8d8SChris Lattner                 }
59872eff18aSGreg Clayton             }
59930fdc8d8SChris Lattner 
6004838131bSGreg Clayton             if (var_sp)
60181e871edSGreg Clayton             {
602d9e416c0SGreg Clayton                 value_sp = frame->GetValueObjectForFrameVariable(var_sp, use_dynamic);
60381e871edSGreg Clayton                 sb_value.SetSP(value_sp);
60481e871edSGreg Clayton             }
6057fdf9ef1SGreg Clayton         }
606*c9858e4dSGreg Clayton         else
607*c9858e4dSGreg Clayton         {
608*c9858e4dSGreg Clayton             if (log)
609*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::FindVariable () => error: process is running", frame);
610*c9858e4dSGreg Clayton         }
611316d498bSGreg Clayton     }
612316d498bSGreg Clayton 
6134838131bSGreg Clayton     if (log)
61469b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
615d9e416c0SGreg Clayton                      frame, name, value_sp.get());
6164838131bSGreg Clayton 
617dde9cff3SCaroline Tice     return sb_value;
618dde9cff3SCaroline Tice }
619dde9cff3SCaroline Tice 
62030fdc8d8SChris Lattner SBValue
62169b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type)
62230fdc8d8SChris Lattner {
623316d498bSGreg Clayton     SBValue value;
6247fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
625d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
626d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
627d9e416c0SGreg Clayton     if (frame && target)
628316d498bSGreg Clayton     {
629d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
630316d498bSGreg Clayton         value = FindValue (name, value_type, use_dynamic);
631316d498bSGreg Clayton     }
632316d498bSGreg Clayton     return value;
63378a685aaSJim Ingham }
63478a685aaSJim Ingham 
63578a685aaSJim Ingham SBValue
6362837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
63778a685aaSJim Ingham {
638*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
63969b582faSGreg Clayton     SBValue sb_value;
64081e871edSGreg Clayton     ValueObjectSP value_sp;
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 && name && name[0])
64530fdc8d8SChris Lattner     {
6467fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6477fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
6487fdf9ef1SGreg Clayton         {
649d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
65030fdc8d8SChris Lattner 
65169b582faSGreg Clayton             switch (value_type)
65230fdc8d8SChris Lattner             {
65369b582faSGreg Clayton             case eValueTypeVariableGlobal:      // global variable
65469b582faSGreg Clayton             case eValueTypeVariableStatic:      // static variable
65569b582faSGreg Clayton             case eValueTypeVariableArgument:    // function argument variables
65669b582faSGreg Clayton             case eValueTypeVariableLocal:       // function local variables
65769b582faSGreg Clayton                 {
658d9e416c0SGreg Clayton                     VariableList *variable_list = frame->GetVariableList(true);
65972eff18aSGreg Clayton 
660d9e416c0SGreg Clayton                     SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
66172eff18aSGreg Clayton 
66272eff18aSGreg Clayton                     const bool can_create = true;
66372eff18aSGreg Clayton                     const bool get_parent_variables = true;
66472eff18aSGreg Clayton                     const bool stop_if_block_is_inlined_function = true;
66572eff18aSGreg Clayton 
66672eff18aSGreg Clayton                     if (sc.block && sc.block->AppendVariables (can_create,
66772eff18aSGreg Clayton                                                                get_parent_variables,
66872eff18aSGreg Clayton                                                                stop_if_block_is_inlined_function,
669e85d9cb8SJohnny Chen                                                                variable_list))
670beae523aSJohnny Chen                     {
67169b582faSGreg Clayton                         ConstString const_name(name);
672e85d9cb8SJohnny Chen                         const uint32_t num_variables = variable_list->GetSize();
67372eff18aSGreg Clayton                         for (uint32_t i = 0; i < num_variables; ++i)
67430fdc8d8SChris Lattner                         {
67569b582faSGreg Clayton                             VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
67669b582faSGreg Clayton                             if (variable_sp &&
67769b582faSGreg Clayton                                 variable_sp->GetScope() == value_type &&
67869b582faSGreg Clayton                                 variable_sp->GetName() == const_name)
679beae523aSJohnny Chen                             {
680d9e416c0SGreg Clayton                                 value_sp = frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic);
68181e871edSGreg Clayton                                 sb_value.SetSP (value_sp);
682beae523aSJohnny Chen                                 break;
683beae523aSJohnny Chen                             }
68430fdc8d8SChris Lattner                         }
68530fdc8d8SChris Lattner                     }
68630fdc8d8SChris Lattner                 }
68769b582faSGreg Clayton                 break;
68869b582faSGreg Clayton 
68969b582faSGreg Clayton             case eValueTypeRegister:            // stack frame register value
69069b582faSGreg Clayton                 {
691d9e416c0SGreg Clayton                     RegisterContextSP reg_ctx (frame->GetRegisterContext());
69269b582faSGreg Clayton                     if (reg_ctx)
69369b582faSGreg Clayton                     {
69469b582faSGreg Clayton                         const uint32_t num_regs = reg_ctx->GetRegisterCount();
69569b582faSGreg Clayton                         for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
69669b582faSGreg Clayton                         {
69769b582faSGreg Clayton                             const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
69869b582faSGreg Clayton                             if (reg_info &&
69969b582faSGreg Clayton                                 ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
70069b582faSGreg Clayton                                  (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
70169b582faSGreg Clayton                             {
702d9e416c0SGreg Clayton                                 value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
70381e871edSGreg Clayton                                 sb_value.SetSP (value_sp);
70481e871edSGreg Clayton                                 break;
70569b582faSGreg Clayton                             }
70669b582faSGreg Clayton                         }
70769b582faSGreg Clayton                     }
70869b582faSGreg Clayton                 }
70969b582faSGreg Clayton                 break;
71069b582faSGreg Clayton 
71169b582faSGreg Clayton             case eValueTypeRegisterSet:         // A collection of stack frame register values
71269b582faSGreg Clayton                 {
713d9e416c0SGreg Clayton                     RegisterContextSP reg_ctx (frame->GetRegisterContext());
71469b582faSGreg Clayton                     if (reg_ctx)
71569b582faSGreg Clayton                     {
71669b582faSGreg Clayton                         const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
71769b582faSGreg Clayton                         for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
71869b582faSGreg Clayton                         {
71969b582faSGreg Clayton                             const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
72069b582faSGreg Clayton                             if (reg_set &&
72169b582faSGreg Clayton                                 ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
72269b582faSGreg Clayton                                  (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
72369b582faSGreg Clayton                             {
724d9e416c0SGreg Clayton                                 value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
72581e871edSGreg Clayton                                 sb_value.SetSP (value_sp);
72681e871edSGreg Clayton                                 break;
72769b582faSGreg Clayton                             }
72869b582faSGreg Clayton                         }
72969b582faSGreg Clayton                     }
73069b582faSGreg Clayton                 }
73169b582faSGreg Clayton                 break;
73269b582faSGreg Clayton 
73369b582faSGreg Clayton             case eValueTypeConstResult:         // constant result variables
73469b582faSGreg Clayton                 {
73569b582faSGreg Clayton                     ConstString const_name(name);
736d9e416c0SGreg Clayton                     ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name));
73769b582faSGreg Clayton                     if (expr_var_sp)
73881e871edSGreg Clayton                     {
73981e871edSGreg Clayton                         value_sp = expr_var_sp->GetValueObject();
74081e871edSGreg Clayton                         sb_value.SetSP (value_sp);
74181e871edSGreg Clayton                     }
74269b582faSGreg Clayton                 }
74369b582faSGreg Clayton                 break;
74469b582faSGreg Clayton 
74569b582faSGreg Clayton             default:
74669b582faSGreg Clayton                 break;
74769b582faSGreg Clayton             }
748beae523aSJohnny Chen         }
749*c9858e4dSGreg Clayton         else
750*c9858e4dSGreg Clayton         {
751*c9858e4dSGreg Clayton             if (log)
752*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::FindValue () => error: process is running", frame);
753*c9858e4dSGreg Clayton         }
7547fdf9ef1SGreg Clayton     }
755dde9cff3SCaroline Tice 
7564838131bSGreg Clayton     if (log)
75769b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
758d9e416c0SGreg Clayton                      frame, name, value_type, value_sp.get());
7594838131bSGreg Clayton 
7604838131bSGreg Clayton 
761dde9cff3SCaroline Tice     return sb_value;
762dde9cff3SCaroline Tice }
763dde9cff3SCaroline Tice 
76430fdc8d8SChris Lattner bool
76535e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const
76635e2ab60SJohnny Chen {
76735e2ab60SJohnny Chen     lldb::StackFrameSP this_sp = GetFrameSP();
76835e2ab60SJohnny Chen     lldb::StackFrameSP that_sp = that.GetFrameSP();
76935e2ab60SJohnny Chen     return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
77035e2ab60SJohnny Chen }
77135e2ab60SJohnny Chen 
77235e2ab60SJohnny Chen bool
77330fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
77430fdc8d8SChris Lattner {
77535e2ab60SJohnny Chen     return IsEqual(rhs);
77630fdc8d8SChris Lattner }
77730fdc8d8SChris Lattner 
77830fdc8d8SChris Lattner bool
77930fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
78030fdc8d8SChris Lattner {
78135e2ab60SJohnny Chen     return !IsEqual(rhs);
782481cef25SGreg Clayton }
78330fdc8d8SChris Lattner 
78430fdc8d8SChris Lattner SBThread
78530fdc8d8SChris Lattner SBFrame::GetThread () const
78630fdc8d8SChris Lattner {
78769b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
788ceb6b139SCaroline Tice 
7897fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
790d9e416c0SGreg Clayton     ThreadSP thread_sp (exe_ctx.GetThreadSP());
791d9e416c0SGreg Clayton     SBThread sb_thread (thread_sp);
792ceb6b139SCaroline Tice 
793ceb6b139SCaroline Tice     if (log)
794750cd175SCaroline Tice     {
795750cd175SCaroline Tice         SBStream sstr;
796750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
797d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
798d9e416c0SGreg Clayton                      exe_ctx.GetFramePtr(),
799d9e416c0SGreg Clayton                      thread_sp.get(),
800d9e416c0SGreg Clayton                      sstr.GetData());
801750cd175SCaroline Tice     }
802ceb6b139SCaroline Tice 
80330fdc8d8SChris Lattner     return sb_thread;
80430fdc8d8SChris Lattner }
80530fdc8d8SChris Lattner 
80630fdc8d8SChris Lattner const char *
80730fdc8d8SChris Lattner SBFrame::Disassemble () const
80830fdc8d8SChris Lattner {
809*c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
8104838131bSGreg Clayton     const char *disassembly = NULL;
8117fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
812d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
813d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
814d9e416c0SGreg Clayton     if (frame && target)
815af67cecdSGreg Clayton     {
8167fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8177fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
8187fdf9ef1SGreg Clayton         {
819d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
820d9e416c0SGreg Clayton             disassembly = frame->Disassemble();
821af67cecdSGreg Clayton         }
822*c9858e4dSGreg Clayton         else
823*c9858e4dSGreg Clayton         {
824*c9858e4dSGreg Clayton             if (log)
825*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::Disassemble () => error: process is running", frame);
8267fdf9ef1SGreg Clayton         }
827*c9858e4dSGreg Clayton     }
8284838131bSGreg Clayton 
8294838131bSGreg Clayton     if (log)
830d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly);
8314838131bSGreg Clayton 
8324838131bSGreg Clayton     return disassembly;
83330fdc8d8SChris Lattner }
83430fdc8d8SChris Lattner 
83530fdc8d8SChris Lattner 
83630fdc8d8SChris Lattner SBValueList
83730fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
83830fdc8d8SChris Lattner                        bool locals,
83930fdc8d8SChris Lattner                        bool statics,
84030fdc8d8SChris Lattner                        bool in_scope_only)
84130fdc8d8SChris Lattner {
842316d498bSGreg Clayton     SBValueList value_list;
8437fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
844d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
845d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
846d9e416c0SGreg Clayton     if (frame && target)
847316d498bSGreg Clayton     {
848d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
849316d498bSGreg Clayton         value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic);
850316d498bSGreg Clayton     }
851316d498bSGreg Clayton     return value_list;
85278a685aaSJim Ingham }
85378a685aaSJim Ingham 
85478a685aaSJim Ingham SBValueList
85578a685aaSJim Ingham SBFrame::GetVariables (bool arguments,
85678a685aaSJim Ingham                        bool locals,
85778a685aaSJim Ingham                        bool statics,
85878a685aaSJim Ingham                        bool in_scope_only,
8592837b766SJim Ingham                        lldb::DynamicValueType  use_dynamic)
86078a685aaSJim Ingham {
86169b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
862ceb6b139SCaroline Tice 
863b9556accSGreg Clayton     SBValueList value_list;
8647fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
865d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
866d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
867b9556accSGreg Clayton 
868ceb6b139SCaroline Tice     if (log)
8694838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
870d9e416c0SGreg Clayton                      frame,
8714838131bSGreg Clayton                      arguments,
8724838131bSGreg Clayton                      locals,
8734838131bSGreg Clayton                      statics,
8744838131bSGreg Clayton                      in_scope_only);
875ceb6b139SCaroline Tice 
876d9e416c0SGreg Clayton     if (frame && target)
87730fdc8d8SChris Lattner     {
8787fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8797fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
8807fdf9ef1SGreg Clayton         {
881af67cecdSGreg Clayton 
88230fdc8d8SChris Lattner             size_t i;
883af67cecdSGreg Clayton             VariableList *variable_list = NULL;
884af67cecdSGreg Clayton             // Scope for locker
885af67cecdSGreg Clayton             {
886d9e416c0SGreg Clayton                 Mutex::Locker api_locker (target->GetAPIMutex());
887d9e416c0SGreg Clayton                 variable_list = frame->GetVariableList(true);
888af67cecdSGreg Clayton             }
88930fdc8d8SChris Lattner             if (variable_list)
89030fdc8d8SChris Lattner             {
89130fdc8d8SChris Lattner                 const size_t num_variables = variable_list->GetSize();
89230fdc8d8SChris Lattner                 if (num_variables)
89330fdc8d8SChris Lattner                 {
89430fdc8d8SChris Lattner                     for (i = 0; i < num_variables; ++i)
89530fdc8d8SChris Lattner                     {
89630fdc8d8SChris Lattner                         VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
89730fdc8d8SChris Lattner                         if (variable_sp)
89830fdc8d8SChris Lattner                         {
89930fdc8d8SChris Lattner                             bool add_variable = false;
90030fdc8d8SChris Lattner                             switch (variable_sp->GetScope())
90130fdc8d8SChris Lattner                             {
90230fdc8d8SChris Lattner                             case eValueTypeVariableGlobal:
90330fdc8d8SChris Lattner                             case eValueTypeVariableStatic:
90430fdc8d8SChris Lattner                                 add_variable = statics;
90530fdc8d8SChris Lattner                                 break;
90630fdc8d8SChris Lattner 
90730fdc8d8SChris Lattner                             case eValueTypeVariableArgument:
90830fdc8d8SChris Lattner                                 add_variable = arguments;
90930fdc8d8SChris Lattner                                 break;
91030fdc8d8SChris Lattner 
91130fdc8d8SChris Lattner                             case eValueTypeVariableLocal:
91230fdc8d8SChris Lattner                                 add_variable = locals;
91330fdc8d8SChris Lattner                                 break;
914c982c768SGreg Clayton 
915c982c768SGreg Clayton                             default:
916c982c768SGreg Clayton                                 break;
91730fdc8d8SChris Lattner                             }
91830fdc8d8SChris Lattner                             if (add_variable)
91930fdc8d8SChris Lattner                             {
920d9e416c0SGreg Clayton                                 if (in_scope_only && !variable_sp->IsInScope(frame))
92130fdc8d8SChris Lattner                                     continue;
92230fdc8d8SChris Lattner 
923d9e416c0SGreg Clayton                                 value_list.Append(frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic));
92430fdc8d8SChris Lattner                             }
92530fdc8d8SChris Lattner                         }
92630fdc8d8SChris Lattner                     }
92730fdc8d8SChris Lattner                 }
92830fdc8d8SChris Lattner             }
92930fdc8d8SChris Lattner         }
930*c9858e4dSGreg Clayton         else
931*c9858e4dSGreg Clayton         {
932*c9858e4dSGreg Clayton             if (log)
933*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetVariables () => error: process is running", frame);
934*c9858e4dSGreg Clayton         }
9357fdf9ef1SGreg Clayton     }
936ceb6b139SCaroline Tice 
937ceb6b139SCaroline Tice     if (log)
938ceb6b139SCaroline Tice     {
939d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame,
940750cd175SCaroline Tice                      value_list.get());
941ceb6b139SCaroline Tice     }
942ceb6b139SCaroline Tice 
94330fdc8d8SChris Lattner     return value_list;
94430fdc8d8SChris Lattner }
94530fdc8d8SChris Lattner 
94669b582faSGreg Clayton SBValueList
94730fdc8d8SChris Lattner SBFrame::GetRegisters ()
94830fdc8d8SChris Lattner {
94969b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
950ceb6b139SCaroline Tice 
95130fdc8d8SChris Lattner     SBValueList value_list;
9527fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
953d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
954d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
955d9e416c0SGreg Clayton     if (frame && target)
95630fdc8d8SChris Lattner     {
9577fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
9587fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
9597fdf9ef1SGreg Clayton         {
960d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
961d9e416c0SGreg Clayton             RegisterContextSP reg_ctx (frame->GetRegisterContext());
96230fdc8d8SChris Lattner             if (reg_ctx)
96330fdc8d8SChris Lattner             {
96430fdc8d8SChris Lattner                 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
96530fdc8d8SChris Lattner                 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
96630fdc8d8SChris Lattner                 {
967d9e416c0SGreg Clayton                     value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
96830fdc8d8SChris Lattner                 }
96930fdc8d8SChris Lattner             }
97030fdc8d8SChris Lattner         }
971*c9858e4dSGreg Clayton         else
972*c9858e4dSGreg Clayton         {
973*c9858e4dSGreg Clayton             if (log)
974*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetRegisters () => error: process is running", frame);
975*c9858e4dSGreg Clayton         }
9767fdf9ef1SGreg Clayton     }
977ceb6b139SCaroline Tice 
978ceb6b139SCaroline Tice     if (log)
979*c9858e4dSGreg Clayton         log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.get());
980ceb6b139SCaroline Tice 
98130fdc8d8SChris Lattner     return value_list;
98230fdc8d8SChris Lattner }
98330fdc8d8SChris Lattner 
984dde9cff3SCaroline Tice bool
985dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
986dde9cff3SCaroline Tice {
987da7bc7d0SGreg Clayton     Stream &strm = description.ref();
988da7bc7d0SGreg Clayton 
9897fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
990d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
991d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
992d9e416c0SGreg Clayton     if (frame && target)
993dde9cff3SCaroline Tice     {
9947fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
9957fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
9967fdf9ef1SGreg Clayton         {
997d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
998d9e416c0SGreg Clayton             frame->DumpUsingSettingsFormat (&strm);
999dde9cff3SCaroline Tice         }
1000*c9858e4dSGreg Clayton         else
1001*c9858e4dSGreg Clayton         {
1002*c9858e4dSGreg Clayton             LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1003*c9858e4dSGreg Clayton             if (log)
1004*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetDescription () => error: process is running", frame);
1005*c9858e4dSGreg Clayton         }
1006*c9858e4dSGreg Clayton 
10077fdf9ef1SGreg Clayton     }
1008dde9cff3SCaroline Tice     else
1009da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1010dde9cff3SCaroline Tice 
1011dde9cff3SCaroline Tice     return true;
1012dde9cff3SCaroline Tice }
10131d3afba3SGreg Clayton 
101469b582faSGreg Clayton SBValue
10151d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
10161d3afba3SGreg Clayton {
1017316d498bSGreg Clayton     SBValue result;
10187fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1019d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1020d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1021d9e416c0SGreg Clayton     if (frame && target)
1022316d498bSGreg Clayton     {
1023d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
1024316d498bSGreg Clayton         result = EvaluateExpression (expr, use_dynamic);
1025316d498bSGreg Clayton     }
1026316d498bSGreg Clayton     return result;
102778a685aaSJim Ingham }
102878a685aaSJim Ingham 
102978a685aaSJim Ingham SBValue
10302837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
103178a685aaSJim Ingham {
103269b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10334838131bSGreg Clayton 
103469b582faSGreg Clayton     LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1035a162ebafSSean Callanan 
103625f3a3cdSJohnny Chen     ExecutionResults exe_results;
103769b582faSGreg Clayton     SBValue expr_result;
103881e871edSGreg Clayton     ValueObjectSP expr_value_sp;
10394838131bSGreg Clayton 
10407fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1041d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1042d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1043b9556accSGreg Clayton     if (log)
1044d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame, expr);
1045b9556accSGreg Clayton 
1046d9e416c0SGreg Clayton     if (frame && target)
10471d3afba3SGreg Clayton     {
10487fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10497fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
10507fdf9ef1SGreg Clayton         {
10517fdf9ef1SGreg Clayton 
1052d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
1053316d498bSGreg Clayton 
10541ba7c4d0SGreg Clayton 
10551ba7c4d0SGreg Clayton             StreamString frame_description;
1056d9e416c0SGreg Clayton             frame->DumpUsingSettingsFormat (&frame_description);
10571ba7c4d0SGreg Clayton 
10581ba7c4d0SGreg Clayton             Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
10591ba7c4d0SGreg Clayton                                                  expr, fetch_dynamic_value, frame_description.GetString().c_str());
10601ba7c4d0SGreg Clayton 
106120bb3aa5SSean Callanan             const bool coerce_to_id = false;
10628b2fe6dcSGreg Clayton             const bool unwind_on_error = true;
106392adcac9SSean Callanan             const bool keep_in_memory = false;
1064322f529bSSean Callanan 
1065d9e416c0SGreg Clayton             exe_results = target->EvaluateExpression (expr,
1066d9e416c0SGreg Clayton                                                       frame,
10673bfdaa2aSSean Callanan                                                       eExecutionPolicyOnlyWhenNeeded,
106820bb3aa5SSean Callanan                                                       coerce_to_id,
106978a685aaSJim Ingham                                                       unwind_on_error,
107078a685aaSJim Ingham                                                       keep_in_memory,
10712837b766SJim Ingham                                                       fetch_dynamic_value,
107281e871edSGreg Clayton                                                       expr_value_sp);
107381e871edSGreg Clayton             expr_result.SetSP(expr_value_sp);
1074f49e65aeSGreg Clayton             Host::SetCrashDescription (NULL);
10751d3afba3SGreg Clayton         }
1076*c9858e4dSGreg Clayton         else
1077*c9858e4dSGreg Clayton         {
1078*c9858e4dSGreg Clayton             if (log)
1079*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::EvaluateExpression () => error: process is running", frame);
1080*c9858e4dSGreg Clayton         }
10817fdf9ef1SGreg Clayton     }
10824838131bSGreg Clayton 
1083cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1084a162ebafSSean Callanan     if (expr_log)
108578a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
1086fe42ac4dSGreg Clayton                          expr_result.GetValue(),
1087fe42ac4dSGreg Clayton                          expr_result.GetSummary());
1088a162ebafSSean Callanan 
10894838131bSGreg Clayton     if (log)
1090d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1091d9e416c0SGreg Clayton                      frame,
109278a685aaSJim Ingham                      expr,
109381e871edSGreg Clayton                      expr_value_sp.get(),
109425f3a3cdSJohnny Chen                      exe_results);
1095cf7e2dc0SJason Molenda #endif
10964838131bSGreg Clayton 
1097cfd1acedSGreg Clayton     return expr_result;
10981d3afba3SGreg Clayton }
1099316d498bSGreg Clayton 
1100316d498bSGreg Clayton bool
1101316d498bSGreg Clayton SBFrame::IsInlined()
1102316d498bSGreg Clayton {
11037fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1104d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1105d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1106d9e416c0SGreg Clayton     if (frame && target)
1107316d498bSGreg Clayton     {
11087fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11097fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
11107fdf9ef1SGreg Clayton         {
11117fdf9ef1SGreg Clayton 
1112d9e416c0SGreg Clayton             Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1113316d498bSGreg Clayton             if (block)
1114316d498bSGreg Clayton                 return block->GetContainingInlinedBlock () != NULL;
1115316d498bSGreg Clayton         }
1116*c9858e4dSGreg Clayton         else
1117*c9858e4dSGreg Clayton         {
1118*c9858e4dSGreg Clayton             LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1119*c9858e4dSGreg Clayton             if (log)
1120*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::IsInlined () => error: process is running", frame);
1121*c9858e4dSGreg Clayton         }
1122*c9858e4dSGreg Clayton 
11237fdf9ef1SGreg Clayton     }
1124316d498bSGreg Clayton     return false;
1125316d498bSGreg Clayton }
1126316d498bSGreg Clayton 
1127316d498bSGreg Clayton const char *
1128316d498bSGreg Clayton SBFrame::GetFunctionName()
1129316d498bSGreg Clayton {
1130316d498bSGreg Clayton     const char *name = NULL;
11317fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1132d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1133d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1134d9e416c0SGreg Clayton     if (frame && target)
1135316d498bSGreg Clayton     {
11367fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11377fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
11387fdf9ef1SGreg Clayton         {
1139d9e416c0SGreg Clayton             SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1140316d498bSGreg Clayton             if (sc.block)
1141316d498bSGreg Clayton             {
1142316d498bSGreg Clayton                 Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1143316d498bSGreg Clayton                 if (inlined_block)
1144316d498bSGreg Clayton                 {
1145316d498bSGreg Clayton                     const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1146316d498bSGreg Clayton                     name = inlined_info->GetName().AsCString();
1147316d498bSGreg Clayton                 }
1148316d498bSGreg Clayton             }
1149316d498bSGreg Clayton 
1150316d498bSGreg Clayton             if (name == NULL)
1151316d498bSGreg Clayton             {
1152316d498bSGreg Clayton                 if (sc.function)
1153316d498bSGreg Clayton                     name = sc.function->GetName().GetCString();
1154316d498bSGreg Clayton             }
1155316d498bSGreg Clayton 
1156316d498bSGreg Clayton             if (name == NULL)
1157316d498bSGreg Clayton             {
1158316d498bSGreg Clayton                 if (sc.symbol)
1159316d498bSGreg Clayton                     name = sc.symbol->GetName().GetCString();
1160316d498bSGreg Clayton             }
1161316d498bSGreg Clayton         }
1162*c9858e4dSGreg Clayton         else
1163*c9858e4dSGreg Clayton         {
1164*c9858e4dSGreg Clayton             LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1165*c9858e4dSGreg Clayton             if (log)
1166*c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFunctionName() => error: process is running", frame);
1167*c9858e4dSGreg Clayton 
1168*c9858e4dSGreg Clayton         }
11697fdf9ef1SGreg Clayton     }
1170316d498bSGreg Clayton     return name;
1171316d498bSGreg Clayton }
1172316d498bSGreg Clayton 
1173