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 {
89*af2589eaSGreg Clayton     if (m_opaque_sp)
907fdf9ef1SGreg Clayton         return m_opaque_sp->GetFrameSP();
91*af2589eaSGreg Clayton     return StackFrameSP();
92b9556accSGreg Clayton }
9330fdc8d8SChris Lattner 
9430fdc8d8SChris Lattner void
95b9556accSGreg Clayton SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp)
9630fdc8d8SChris Lattner {
977fdf9ef1SGreg Clayton     return m_opaque_sp->SetFrameSP(lldb_object_sp);
98b9556accSGreg Clayton }
9930fdc8d8SChris Lattner 
10030fdc8d8SChris Lattner bool
10130fdc8d8SChris Lattner SBFrame::IsValid() const
10230fdc8d8SChris Lattner {
1037fdf9ef1SGreg Clayton     return GetFrameSP().get() != NULL;
10430fdc8d8SChris Lattner }
10530fdc8d8SChris Lattner 
10630fdc8d8SChris Lattner SBSymbolContext
10730fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const
10830fdc8d8SChris Lattner {
109c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
11030fdc8d8SChris Lattner     SBSymbolContext sb_sym_ctx;
1117fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
112d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
113d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
114d9e416c0SGreg Clayton     if (frame && target)
115af67cecdSGreg Clayton     {
1167fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1177fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1187fdf9ef1SGreg Clayton         {
119d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
120d9e416c0SGreg Clayton             sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope));
121af67cecdSGreg Clayton         }
122c9858e4dSGreg Clayton         else
123c9858e4dSGreg Clayton         {
124c9858e4dSGreg Clayton             if (log)
125c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetSymbolContext () => error: process is running", frame);
126c9858e4dSGreg Clayton         }
1277fdf9ef1SGreg Clayton     }
128ceb6b139SCaroline Tice 
129ceb6b139SCaroline Tice     if (log)
1304838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)",
131d9e416c0SGreg Clayton                      frame, resolve_scope, sb_sym_ctx.get());
132ceb6b139SCaroline Tice 
13330fdc8d8SChris Lattner     return sb_sym_ctx;
13430fdc8d8SChris Lattner }
13530fdc8d8SChris Lattner 
13630fdc8d8SChris Lattner SBModule
13730fdc8d8SChris Lattner SBFrame::GetModule () const
13830fdc8d8SChris Lattner {
139c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
14072eff18aSGreg Clayton     SBModule sb_module;
141acdbe816SGreg Clayton     ModuleSP module_sp;
1427fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
143d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
144d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
145d9e416c0SGreg Clayton     if (frame && target)
146af67cecdSGreg Clayton     {
1477fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1487fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1497fdf9ef1SGreg Clayton         {
150d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
151d9e416c0SGreg Clayton             module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp;
152acdbe816SGreg Clayton             sb_module.SetSP (module_sp);
153af67cecdSGreg Clayton         }
154c9858e4dSGreg Clayton         else
155c9858e4dSGreg Clayton         {
156c9858e4dSGreg Clayton             if (log)
157c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetModule () => error: process is running", frame);
158c9858e4dSGreg Clayton         }
1597fdf9ef1SGreg Clayton     }
16072eff18aSGreg Clayton 
1614838131bSGreg Clayton     if (log)
1624838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
163d9e416c0SGreg Clayton                      frame, module_sp.get());
1644838131bSGreg Clayton 
16530fdc8d8SChris Lattner     return sb_module;
16630fdc8d8SChris Lattner }
16730fdc8d8SChris Lattner 
16830fdc8d8SChris Lattner SBCompileUnit
16930fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
17030fdc8d8SChris Lattner {
171c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
17272eff18aSGreg Clayton     SBCompileUnit sb_comp_unit;
1737fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
174d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
175d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
176d9e416c0SGreg Clayton     if (frame && target)
177af67cecdSGreg Clayton     {
1787fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
1797fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
1807fdf9ef1SGreg Clayton         {
181d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
182d9e416c0SGreg Clayton             sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
183af67cecdSGreg Clayton         }
184c9858e4dSGreg Clayton         else
185c9858e4dSGreg Clayton         {
186ceb6b139SCaroline Tice             if (log)
187c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetCompileUnit () => error: process is running", frame);
188c9858e4dSGreg Clayton         }
189c9858e4dSGreg Clayton     }
190c9858e4dSGreg Clayton     if (log)
191c9858e4dSGreg Clayton         log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)",
192d9e416c0SGreg Clayton                      frame, sb_comp_unit.get());
193ceb6b139SCaroline Tice 
19430fdc8d8SChris Lattner     return sb_comp_unit;
19530fdc8d8SChris Lattner }
19630fdc8d8SChris Lattner 
19730fdc8d8SChris Lattner SBFunction
19830fdc8d8SChris Lattner SBFrame::GetFunction () const
19930fdc8d8SChris Lattner {
200c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
20172eff18aSGreg Clayton     SBFunction sb_function;
2027fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
203d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
204d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
205d9e416c0SGreg Clayton     if (frame && target)
206af67cecdSGreg Clayton     {
2077fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2087fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2097fdf9ef1SGreg Clayton         {
210d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
211d9e416c0SGreg Clayton             sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function);
212af67cecdSGreg Clayton         }
213c9858e4dSGreg Clayton         else
214c9858e4dSGreg Clayton         {
215c9858e4dSGreg Clayton             if (log)
216c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFunction () => error: process is running", frame);
2177fdf9ef1SGreg Clayton         }
218c9858e4dSGreg Clayton     }
2194838131bSGreg Clayton     if (log)
2204838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
221d9e416c0SGreg Clayton                      frame, sb_function.get());
2224838131bSGreg Clayton 
22330fdc8d8SChris Lattner     return sb_function;
22430fdc8d8SChris Lattner }
22530fdc8d8SChris Lattner 
2263b06557eSGreg Clayton SBSymbol
2273b06557eSGreg Clayton SBFrame::GetSymbol () const
2283b06557eSGreg Clayton {
229c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
23072eff18aSGreg Clayton     SBSymbol sb_symbol;
2317fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
232d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
233d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
234d9e416c0SGreg Clayton     if (frame && target)
235af67cecdSGreg Clayton     {
2367fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2377fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2387fdf9ef1SGreg Clayton         {
239d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
240d9e416c0SGreg Clayton             sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol);
241af67cecdSGreg Clayton         }
242c9858e4dSGreg Clayton         else
243c9858e4dSGreg Clayton         {
244c9858e4dSGreg Clayton             if (log)
245c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetSymbol () => error: process is running", frame);
2467fdf9ef1SGreg Clayton         }
247c9858e4dSGreg Clayton     }
2484838131bSGreg Clayton     if (log)
2494838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
250d9e416c0SGreg Clayton                      frame, sb_symbol.get());
2513b06557eSGreg Clayton     return sb_symbol;
2523b06557eSGreg Clayton }
2533b06557eSGreg Clayton 
25430fdc8d8SChris Lattner SBBlock
25530fdc8d8SChris Lattner SBFrame::GetBlock () const
25630fdc8d8SChris Lattner {
257c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
25872eff18aSGreg Clayton     SBBlock sb_block;
2597fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
260d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
261d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
262d9e416c0SGreg Clayton     if (frame && target)
263af67cecdSGreg Clayton     {
2647fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2657fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2667fdf9ef1SGreg Clayton         {
267d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
268d9e416c0SGreg Clayton             sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block);
269af67cecdSGreg Clayton         }
270c9858e4dSGreg Clayton         else
271c9858e4dSGreg Clayton         {
272c9858e4dSGreg Clayton             if (log)
273c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", frame);
2747fdf9ef1SGreg Clayton         }
275c9858e4dSGreg Clayton     }
2764838131bSGreg Clayton     if (log)
2774838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
278d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
27930fdc8d8SChris Lattner     return sb_block;
28030fdc8d8SChris Lattner }
28130fdc8d8SChris Lattner 
28295897c6aSGreg Clayton SBBlock
28395897c6aSGreg Clayton SBFrame::GetFrameBlock () const
28495897c6aSGreg Clayton {
28572eff18aSGreg Clayton     SBBlock sb_block;
2867fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
287d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
288d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
289c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
290d9e416c0SGreg Clayton     if (frame && target)
291af67cecdSGreg Clayton     {
2927fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
2937fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
2947fdf9ef1SGreg Clayton         {
295d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
296d9e416c0SGreg Clayton             sb_block.SetPtr(frame->GetFrameBlock ());
297af67cecdSGreg Clayton         }
298c9858e4dSGreg Clayton         else
299c9858e4dSGreg Clayton         {
300c9858e4dSGreg Clayton             if (log)
301c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFrameBlock () => error: process is running", frame);
3027fdf9ef1SGreg Clayton         }
303c9858e4dSGreg Clayton     }
3044838131bSGreg Clayton     if (log)
3054838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
306d9e416c0SGreg Clayton                      frame, sb_block.GetPtr());
30795897c6aSGreg Clayton     return sb_block;
30895897c6aSGreg Clayton }
30995897c6aSGreg Clayton 
31030fdc8d8SChris Lattner SBLineEntry
31130fdc8d8SChris Lattner SBFrame::GetLineEntry () const
31230fdc8d8SChris Lattner {
313c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
31472eff18aSGreg Clayton     SBLineEntry sb_line_entry;
3157fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
316d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
317d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
318d9e416c0SGreg Clayton     if (frame && target)
319af67cecdSGreg Clayton     {
3207fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3217fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3227fdf9ef1SGreg Clayton         {
323d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
324d9e416c0SGreg Clayton             sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry);
325af67cecdSGreg Clayton         }
326c9858e4dSGreg Clayton         else
327c9858e4dSGreg Clayton         {
328c9858e4dSGreg Clayton             if (log)
329c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetLineEntry () => error: process is running", frame);
3307fdf9ef1SGreg Clayton         }
331c9858e4dSGreg Clayton     }
3324838131bSGreg Clayton     if (log)
3334838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
334d9e416c0SGreg Clayton                      frame, sb_line_entry.get());
33530fdc8d8SChris Lattner     return sb_line_entry;
33630fdc8d8SChris Lattner }
33730fdc8d8SChris Lattner 
33830fdc8d8SChris Lattner uint32_t
33930fdc8d8SChris Lattner SBFrame::GetFrameID () const
34030fdc8d8SChris Lattner {
341b9556accSGreg Clayton     uint32_t frame_idx = UINT32_MAX;
342b9556accSGreg Clayton 
3437fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
344d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
3457fdf9ef1SGreg Clayton     if (frame)
346d9e416c0SGreg Clayton         frame_idx = frame->GetFrameIndex ();
3474838131bSGreg Clayton 
34869b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3494838131bSGreg Clayton     if (log)
3504838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameID () => %u",
351d9e416c0SGreg Clayton                      frame, frame_idx);
3524838131bSGreg Clayton     return frame_idx;
35330fdc8d8SChris Lattner }
35430fdc8d8SChris Lattner 
35569b582faSGreg Clayton addr_t
35630fdc8d8SChris Lattner SBFrame::GetPC () const
35730fdc8d8SChris Lattner {
358c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
35969b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
3607fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
361d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
362d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
363d9e416c0SGreg Clayton     if (frame && target)
364af67cecdSGreg Clayton     {
3657fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3667fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3677fdf9ef1SGreg Clayton         {
368d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
369d9e416c0SGreg Clayton             addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target);
370af67cecdSGreg Clayton         }
371c9858e4dSGreg Clayton         else
372c9858e4dSGreg Clayton         {
373c9858e4dSGreg Clayton             if (log)
374c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetPC () => error: process is running", frame);
375c9858e4dSGreg Clayton         }
3767fdf9ef1SGreg Clayton     }
377ceb6b139SCaroline Tice 
378ceb6b139SCaroline Tice     if (log)
379d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", frame, addr);
380ceb6b139SCaroline Tice 
381ceb6b139SCaroline Tice     return addr;
38230fdc8d8SChris Lattner }
38330fdc8d8SChris Lattner 
38430fdc8d8SChris Lattner bool
38569b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc)
38630fdc8d8SChris Lattner {
387c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
388ceb6b139SCaroline Tice     bool ret_val = false;
3897fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
390d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
391d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
392d9e416c0SGreg Clayton     if (frame && target)
393af67cecdSGreg Clayton     {
3947fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
3957fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
3967fdf9ef1SGreg Clayton         {
397d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
398d9e416c0SGreg Clayton             ret_val = frame->GetRegisterContext()->SetPC (new_pc);
399af67cecdSGreg Clayton         }
400c9858e4dSGreg Clayton         else
401c9858e4dSGreg Clayton         {
402c9858e4dSGreg Clayton             if (log)
403c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::SetPC () => error: process is running", frame);
404c9858e4dSGreg Clayton         }
4057fdf9ef1SGreg Clayton     }
406ceb6b139SCaroline Tice 
407ceb6b139SCaroline Tice     if (log)
4084838131bSGreg Clayton         log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i",
409d9e416c0SGreg Clayton                      frame, new_pc, ret_val);
410ceb6b139SCaroline Tice 
411ceb6b139SCaroline Tice     return ret_val;
41230fdc8d8SChris Lattner }
41330fdc8d8SChris Lattner 
41469b582faSGreg Clayton addr_t
41530fdc8d8SChris Lattner SBFrame::GetSP () const
41630fdc8d8SChris Lattner {
417c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4184838131bSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
4197fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
420d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
421d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
422d9e416c0SGreg Clayton     if (frame && target)
423af67cecdSGreg Clayton     {
4247fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4257fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4267fdf9ef1SGreg Clayton         {
427d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
428d9e416c0SGreg Clayton             addr = frame->GetRegisterContext()->GetSP();
429af67cecdSGreg Clayton         }
430c9858e4dSGreg Clayton         else
431c9858e4dSGreg Clayton         {
432c9858e4dSGreg Clayton             if (log)
433c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetSP () => error: process is running", frame);
4347fdf9ef1SGreg Clayton         }
435c9858e4dSGreg Clayton     }
4364838131bSGreg Clayton     if (log)
437d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", frame, addr);
4384838131bSGreg Clayton 
4394838131bSGreg Clayton     return addr;
44030fdc8d8SChris Lattner }
44130fdc8d8SChris Lattner 
44230fdc8d8SChris Lattner 
44369b582faSGreg Clayton addr_t
44430fdc8d8SChris Lattner SBFrame::GetFP () const
44530fdc8d8SChris Lattner {
446c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
44769b582faSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
4487fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
449d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
450d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
451d9e416c0SGreg Clayton     if (frame && target)
452af67cecdSGreg Clayton     {
4537fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4547fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4557fdf9ef1SGreg Clayton         {
456d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
457d9e416c0SGreg Clayton             addr = frame->GetRegisterContext()->GetFP();
458af67cecdSGreg Clayton         }
459c9858e4dSGreg Clayton         else
460c9858e4dSGreg Clayton         {
461c9858e4dSGreg Clayton             if (log)
462c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFP () => error: process is running", frame);
463c9858e4dSGreg Clayton         }
4647fdf9ef1SGreg Clayton     }
465ceb6b139SCaroline Tice 
466ceb6b139SCaroline Tice     if (log)
467d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", frame, addr);
468ceb6b139SCaroline Tice     return addr;
46930fdc8d8SChris Lattner }
47030fdc8d8SChris Lattner 
47130fdc8d8SChris Lattner 
47230fdc8d8SChris Lattner SBAddress
47330fdc8d8SChris Lattner SBFrame::GetPCAddress () const
47430fdc8d8SChris Lattner {
475c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
47630fdc8d8SChris Lattner     SBAddress sb_addr;
4777fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
478d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
479d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
480d9e416c0SGreg Clayton     if (frame && target)
481af67cecdSGreg Clayton     {
4827fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
4837fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
4847fdf9ef1SGreg Clayton         {
485d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
486d9e416c0SGreg Clayton             sb_addr.SetAddress (&frame->GetFrameCodeAddress());
487af67cecdSGreg Clayton         }
488c9858e4dSGreg Clayton         else
489c9858e4dSGreg Clayton         {
490c9858e4dSGreg Clayton             if (log)
491c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetPCAddress () => error: process is running", frame);
4927fdf9ef1SGreg Clayton         }
493c9858e4dSGreg Clayton     }
4944838131bSGreg Clayton     if (log)
495d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get());
49630fdc8d8SChris Lattner     return sb_addr;
49730fdc8d8SChris Lattner }
49830fdc8d8SChris Lattner 
49930fdc8d8SChris Lattner void
50030fdc8d8SChris Lattner SBFrame::Clear()
50130fdc8d8SChris Lattner {
502*af2589eaSGreg Clayton     m_opaque_sp->Clear();
50330fdc8d8SChris Lattner }
50430fdc8d8SChris Lattner 
5057edbdfc9SGreg Clayton lldb::SBValue
5067edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path)
5077edbdfc9SGreg Clayton {
5087edbdfc9SGreg Clayton     SBValue sb_value;
5097fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
510d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
511d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
512d9e416c0SGreg Clayton     if (frame && target)
5137edbdfc9SGreg Clayton     {
514d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
5157edbdfc9SGreg Clayton         sb_value = GetValueForVariablePath (var_path, use_dynamic);
5167edbdfc9SGreg Clayton     }
5177edbdfc9SGreg Clayton     return sb_value;
5187edbdfc9SGreg Clayton }
5197edbdfc9SGreg Clayton 
5207edbdfc9SGreg Clayton lldb::SBValue
5217edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic)
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 && var_path && var_path[0])
5287edbdfc9SGreg Clayton     {
5297fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5307fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5317fdf9ef1SGreg Clayton         {
532d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
5337edbdfc9SGreg Clayton             VariableSP var_sp;
5347edbdfc9SGreg Clayton             Error error;
535d9e416c0SGreg Clayton             ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path,
5367edbdfc9SGreg Clayton                                                                               use_dynamic,
5377edbdfc9SGreg Clayton                                                                               StackFrame::eExpressionPathOptionCheckPtrVsMember,
5387edbdfc9SGreg Clayton                                                                               var_sp,
5397edbdfc9SGreg Clayton                                                                               error));
54081e871edSGreg Clayton             sb_value.SetSP(value_sp);
5417edbdfc9SGreg Clayton         }
542c9858e4dSGreg Clayton         else
543c9858e4dSGreg Clayton         {
544c9858e4dSGreg Clayton             LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
545c9858e4dSGreg Clayton             if (log)
546c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetValueForVariablePath () => error: process is running", frame);
547c9858e4dSGreg Clayton         }
5487fdf9ef1SGreg Clayton     }
5497edbdfc9SGreg Clayton     return sb_value;
5507edbdfc9SGreg Clayton }
5517edbdfc9SGreg Clayton 
55230fdc8d8SChris Lattner SBValue
55369b582faSGreg Clayton SBFrame::FindVariable (const char *name)
55430fdc8d8SChris Lattner {
555316d498bSGreg Clayton     SBValue value;
5567fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
557d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
558d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
559d9e416c0SGreg Clayton     if (frame && target)
560316d498bSGreg Clayton     {
561d9e416c0SGreg Clayton         lldb::DynamicValueType  use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
562316d498bSGreg Clayton         value = FindVariable (name, use_dynamic);
563316d498bSGreg Clayton     }
564316d498bSGreg Clayton     return value;
56578a685aaSJim Ingham }
56678a685aaSJim Ingham 
5677edbdfc9SGreg Clayton 
56878a685aaSJim Ingham SBValue
5692837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic)
57078a685aaSJim Ingham {
571c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
57269b582faSGreg Clayton     VariableSP var_sp;
57358b59f95SJim Ingham     SBValue sb_value;
57481e871edSGreg Clayton     ValueObjectSP value_sp;
5757fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
576d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
577d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
578d9e416c0SGreg Clayton     if (frame && target && name && name[0])
57930fdc8d8SChris Lattner     {
5807fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
5817fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
5827fdf9ef1SGreg Clayton         {
58369b582faSGreg Clayton             VariableList variable_list;
584d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
585d9e416c0SGreg Clayton             SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
58630fdc8d8SChris Lattner 
58772eff18aSGreg Clayton             if (sc.block)
58830fdc8d8SChris Lattner             {
58972eff18aSGreg Clayton                 const bool can_create = true;
59072eff18aSGreg Clayton                 const bool get_parent_variables = true;
59172eff18aSGreg Clayton                 const bool stop_if_block_is_inlined_function = true;
59272eff18aSGreg Clayton 
59372eff18aSGreg Clayton                 if (sc.block->AppendVariables (can_create,
59472eff18aSGreg Clayton                                                get_parent_variables,
59572eff18aSGreg Clayton                                                stop_if_block_is_inlined_function,
59672eff18aSGreg Clayton                                                &variable_list))
59772eff18aSGreg Clayton                 {
59869b582faSGreg Clayton                     var_sp = variable_list.FindVariable (ConstString(name));
59930fdc8d8SChris Lattner                 }
60072eff18aSGreg Clayton             }
60130fdc8d8SChris Lattner 
6024838131bSGreg Clayton             if (var_sp)
60381e871edSGreg Clayton             {
604d9e416c0SGreg Clayton                 value_sp = frame->GetValueObjectForFrameVariable(var_sp, use_dynamic);
60581e871edSGreg Clayton                 sb_value.SetSP(value_sp);
60681e871edSGreg Clayton             }
6077fdf9ef1SGreg Clayton         }
608c9858e4dSGreg Clayton         else
609c9858e4dSGreg Clayton         {
610c9858e4dSGreg Clayton             if (log)
611c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::FindVariable () => error: process is running", frame);
612c9858e4dSGreg Clayton         }
613316d498bSGreg Clayton     }
614316d498bSGreg Clayton 
6154838131bSGreg Clayton     if (log)
61669b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)",
617d9e416c0SGreg Clayton                      frame, name, value_sp.get());
6184838131bSGreg Clayton 
619dde9cff3SCaroline Tice     return sb_value;
620dde9cff3SCaroline Tice }
621dde9cff3SCaroline Tice 
62230fdc8d8SChris Lattner SBValue
62369b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type)
62430fdc8d8SChris Lattner {
625316d498bSGreg Clayton     SBValue value;
6267fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
627d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
628d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
629d9e416c0SGreg Clayton     if (frame && target)
630316d498bSGreg Clayton     {
631d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
632316d498bSGreg Clayton         value = FindValue (name, value_type, use_dynamic);
633316d498bSGreg Clayton     }
634316d498bSGreg Clayton     return value;
63578a685aaSJim Ingham }
63678a685aaSJim Ingham 
63778a685aaSJim Ingham SBValue
6382837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic)
63978a685aaSJim Ingham {
640c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
64169b582faSGreg Clayton     SBValue sb_value;
64281e871edSGreg Clayton     ValueObjectSP value_sp;
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 && name && name[0])
64730fdc8d8SChris Lattner     {
6487fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
6497fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
6507fdf9ef1SGreg Clayton         {
651d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
65230fdc8d8SChris Lattner 
65369b582faSGreg Clayton             switch (value_type)
65430fdc8d8SChris Lattner             {
65569b582faSGreg Clayton             case eValueTypeVariableGlobal:      // global variable
65669b582faSGreg Clayton             case eValueTypeVariableStatic:      // static variable
65769b582faSGreg Clayton             case eValueTypeVariableArgument:    // function argument variables
65869b582faSGreg Clayton             case eValueTypeVariableLocal:       // function local variables
65969b582faSGreg Clayton                 {
660d9e416c0SGreg Clayton                     VariableList *variable_list = frame->GetVariableList(true);
66172eff18aSGreg Clayton 
662d9e416c0SGreg Clayton                     SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock));
66372eff18aSGreg Clayton 
66472eff18aSGreg Clayton                     const bool can_create = true;
66572eff18aSGreg Clayton                     const bool get_parent_variables = true;
66672eff18aSGreg Clayton                     const bool stop_if_block_is_inlined_function = true;
66772eff18aSGreg Clayton 
66872eff18aSGreg Clayton                     if (sc.block && sc.block->AppendVariables (can_create,
66972eff18aSGreg Clayton                                                                get_parent_variables,
67072eff18aSGreg Clayton                                                                stop_if_block_is_inlined_function,
671e85d9cb8SJohnny Chen                                                                variable_list))
672beae523aSJohnny Chen                     {
67369b582faSGreg Clayton                         ConstString const_name(name);
674e85d9cb8SJohnny Chen                         const uint32_t num_variables = variable_list->GetSize();
67572eff18aSGreg Clayton                         for (uint32_t i = 0; i < num_variables; ++i)
67630fdc8d8SChris Lattner                         {
67769b582faSGreg Clayton                             VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
67869b582faSGreg Clayton                             if (variable_sp &&
67969b582faSGreg Clayton                                 variable_sp->GetScope() == value_type &&
68069b582faSGreg Clayton                                 variable_sp->GetName() == const_name)
681beae523aSJohnny Chen                             {
682d9e416c0SGreg Clayton                                 value_sp = frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic);
68381e871edSGreg Clayton                                 sb_value.SetSP (value_sp);
684beae523aSJohnny Chen                                 break;
685beae523aSJohnny Chen                             }
68630fdc8d8SChris Lattner                         }
68730fdc8d8SChris Lattner                     }
68830fdc8d8SChris Lattner                 }
68969b582faSGreg Clayton                 break;
69069b582faSGreg Clayton 
69169b582faSGreg Clayton             case eValueTypeRegister:            // stack frame register value
69269b582faSGreg Clayton                 {
693d9e416c0SGreg Clayton                     RegisterContextSP reg_ctx (frame->GetRegisterContext());
69469b582faSGreg Clayton                     if (reg_ctx)
69569b582faSGreg Clayton                     {
69669b582faSGreg Clayton                         const uint32_t num_regs = reg_ctx->GetRegisterCount();
69769b582faSGreg Clayton                         for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
69869b582faSGreg Clayton                         {
69969b582faSGreg Clayton                             const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx);
70069b582faSGreg Clayton                             if (reg_info &&
70169b582faSGreg Clayton                                 ((reg_info->name && strcasecmp (reg_info->name, name) == 0) ||
70269b582faSGreg Clayton                                  (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0)))
70369b582faSGreg Clayton                             {
704d9e416c0SGreg Clayton                                 value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx);
70581e871edSGreg Clayton                                 sb_value.SetSP (value_sp);
70681e871edSGreg Clayton                                 break;
70769b582faSGreg Clayton                             }
70869b582faSGreg Clayton                         }
70969b582faSGreg Clayton                     }
71069b582faSGreg Clayton                 }
71169b582faSGreg Clayton                 break;
71269b582faSGreg Clayton 
71369b582faSGreg Clayton             case eValueTypeRegisterSet:         // A collection of stack frame register values
71469b582faSGreg Clayton                 {
715d9e416c0SGreg Clayton                     RegisterContextSP reg_ctx (frame->GetRegisterContext());
71669b582faSGreg Clayton                     if (reg_ctx)
71769b582faSGreg Clayton                     {
71869b582faSGreg Clayton                         const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
71969b582faSGreg Clayton                         for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
72069b582faSGreg Clayton                         {
72169b582faSGreg Clayton                             const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx);
72269b582faSGreg Clayton                             if (reg_set &&
72369b582faSGreg Clayton                                 ((reg_set->name && strcasecmp (reg_set->name, name) == 0) ||
72469b582faSGreg Clayton                                  (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0)))
72569b582faSGreg Clayton                             {
726d9e416c0SGreg Clayton                                 value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx);
72781e871edSGreg Clayton                                 sb_value.SetSP (value_sp);
72881e871edSGreg Clayton                                 break;
72969b582faSGreg Clayton                             }
73069b582faSGreg Clayton                         }
73169b582faSGreg Clayton                     }
73269b582faSGreg Clayton                 }
73369b582faSGreg Clayton                 break;
73469b582faSGreg Clayton 
73569b582faSGreg Clayton             case eValueTypeConstResult:         // constant result variables
73669b582faSGreg Clayton                 {
73769b582faSGreg Clayton                     ConstString const_name(name);
738d9e416c0SGreg Clayton                     ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name));
73969b582faSGreg Clayton                     if (expr_var_sp)
74081e871edSGreg Clayton                     {
74181e871edSGreg Clayton                         value_sp = expr_var_sp->GetValueObject();
74281e871edSGreg Clayton                         sb_value.SetSP (value_sp);
74381e871edSGreg Clayton                     }
74469b582faSGreg Clayton                 }
74569b582faSGreg Clayton                 break;
74669b582faSGreg Clayton 
74769b582faSGreg Clayton             default:
74869b582faSGreg Clayton                 break;
74969b582faSGreg Clayton             }
750beae523aSJohnny Chen         }
751c9858e4dSGreg Clayton         else
752c9858e4dSGreg Clayton         {
753c9858e4dSGreg Clayton             if (log)
754c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::FindValue () => error: process is running", frame);
755c9858e4dSGreg Clayton         }
7567fdf9ef1SGreg Clayton     }
757dde9cff3SCaroline Tice 
7584838131bSGreg Clayton     if (log)
75969b582faSGreg Clayton         log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)",
760d9e416c0SGreg Clayton                      frame, name, value_type, value_sp.get());
7614838131bSGreg Clayton 
7624838131bSGreg Clayton 
763dde9cff3SCaroline Tice     return sb_value;
764dde9cff3SCaroline Tice }
765dde9cff3SCaroline Tice 
76630fdc8d8SChris Lattner bool
76735e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const
76835e2ab60SJohnny Chen {
76935e2ab60SJohnny Chen     lldb::StackFrameSP this_sp = GetFrameSP();
77035e2ab60SJohnny Chen     lldb::StackFrameSP that_sp = that.GetFrameSP();
77135e2ab60SJohnny Chen     return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
77235e2ab60SJohnny Chen }
77335e2ab60SJohnny Chen 
77435e2ab60SJohnny Chen bool
77530fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
77630fdc8d8SChris Lattner {
77735e2ab60SJohnny Chen     return IsEqual(rhs);
77830fdc8d8SChris Lattner }
77930fdc8d8SChris Lattner 
78030fdc8d8SChris Lattner bool
78130fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
78230fdc8d8SChris Lattner {
78335e2ab60SJohnny Chen     return !IsEqual(rhs);
784481cef25SGreg Clayton }
78530fdc8d8SChris Lattner 
78630fdc8d8SChris Lattner SBThread
78730fdc8d8SChris Lattner SBFrame::GetThread () const
78830fdc8d8SChris Lattner {
78969b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
790ceb6b139SCaroline Tice 
7917fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
792d9e416c0SGreg Clayton     ThreadSP thread_sp (exe_ctx.GetThreadSP());
793d9e416c0SGreg Clayton     SBThread sb_thread (thread_sp);
794ceb6b139SCaroline Tice 
795ceb6b139SCaroline Tice     if (log)
796750cd175SCaroline Tice     {
797750cd175SCaroline Tice         SBStream sstr;
798750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
799d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s",
800d9e416c0SGreg Clayton                      exe_ctx.GetFramePtr(),
801d9e416c0SGreg Clayton                      thread_sp.get(),
802d9e416c0SGreg Clayton                      sstr.GetData());
803750cd175SCaroline Tice     }
804ceb6b139SCaroline Tice 
80530fdc8d8SChris Lattner     return sb_thread;
80630fdc8d8SChris Lattner }
80730fdc8d8SChris Lattner 
80830fdc8d8SChris Lattner const char *
80930fdc8d8SChris Lattner SBFrame::Disassemble () const
81030fdc8d8SChris Lattner {
811c9858e4dSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
8124838131bSGreg Clayton     const char *disassembly = NULL;
8137fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
814d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
815d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
816d9e416c0SGreg Clayton     if (frame && target)
817af67cecdSGreg Clayton     {
8187fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8197fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
8207fdf9ef1SGreg Clayton         {
821d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
822d9e416c0SGreg Clayton             disassembly = frame->Disassemble();
823af67cecdSGreg Clayton         }
824c9858e4dSGreg Clayton         else
825c9858e4dSGreg Clayton         {
826c9858e4dSGreg Clayton             if (log)
827c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::Disassemble () => error: process is running", frame);
8287fdf9ef1SGreg Clayton         }
829c9858e4dSGreg Clayton     }
8304838131bSGreg Clayton 
8314838131bSGreg Clayton     if (log)
832d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly);
8334838131bSGreg Clayton 
8344838131bSGreg Clayton     return disassembly;
83530fdc8d8SChris Lattner }
83630fdc8d8SChris Lattner 
83730fdc8d8SChris Lattner 
83830fdc8d8SChris Lattner SBValueList
83930fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
84030fdc8d8SChris Lattner                        bool locals,
84130fdc8d8SChris Lattner                        bool statics,
84230fdc8d8SChris Lattner                        bool in_scope_only)
84330fdc8d8SChris Lattner {
844316d498bSGreg Clayton     SBValueList value_list;
8457fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
846d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
847d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
848d9e416c0SGreg Clayton     if (frame && target)
849316d498bSGreg Clayton     {
850d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
851316d498bSGreg Clayton         value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic);
852316d498bSGreg Clayton     }
853316d498bSGreg Clayton     return value_list;
85478a685aaSJim Ingham }
85578a685aaSJim Ingham 
85678a685aaSJim Ingham SBValueList
85778a685aaSJim Ingham SBFrame::GetVariables (bool arguments,
85878a685aaSJim Ingham                        bool locals,
85978a685aaSJim Ingham                        bool statics,
86078a685aaSJim Ingham                        bool in_scope_only,
8612837b766SJim Ingham                        lldb::DynamicValueType  use_dynamic)
86278a685aaSJim Ingham {
86369b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
864ceb6b139SCaroline Tice 
865b9556accSGreg Clayton     SBValueList value_list;
8667fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
867d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
868d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
869b9556accSGreg Clayton 
870ceb6b139SCaroline Tice     if (log)
8714838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
872d9e416c0SGreg Clayton                      frame,
8734838131bSGreg Clayton                      arguments,
8744838131bSGreg Clayton                      locals,
8754838131bSGreg Clayton                      statics,
8764838131bSGreg Clayton                      in_scope_only);
877ceb6b139SCaroline Tice 
878d9e416c0SGreg Clayton     if (frame && target)
87930fdc8d8SChris Lattner     {
8807fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
8817fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
8827fdf9ef1SGreg Clayton         {
883af67cecdSGreg Clayton 
88430fdc8d8SChris Lattner             size_t i;
885af67cecdSGreg Clayton             VariableList *variable_list = NULL;
886af67cecdSGreg Clayton             // Scope for locker
887af67cecdSGreg Clayton             {
888d9e416c0SGreg Clayton                 Mutex::Locker api_locker (target->GetAPIMutex());
889d9e416c0SGreg Clayton                 variable_list = frame->GetVariableList(true);
890af67cecdSGreg Clayton             }
89130fdc8d8SChris Lattner             if (variable_list)
89230fdc8d8SChris Lattner             {
89330fdc8d8SChris Lattner                 const size_t num_variables = variable_list->GetSize();
89430fdc8d8SChris Lattner                 if (num_variables)
89530fdc8d8SChris Lattner                 {
89630fdc8d8SChris Lattner                     for (i = 0; i < num_variables; ++i)
89730fdc8d8SChris Lattner                     {
89830fdc8d8SChris Lattner                         VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
89930fdc8d8SChris Lattner                         if (variable_sp)
90030fdc8d8SChris Lattner                         {
90130fdc8d8SChris Lattner                             bool add_variable = false;
90230fdc8d8SChris Lattner                             switch (variable_sp->GetScope())
90330fdc8d8SChris Lattner                             {
90430fdc8d8SChris Lattner                             case eValueTypeVariableGlobal:
90530fdc8d8SChris Lattner                             case eValueTypeVariableStatic:
90630fdc8d8SChris Lattner                                 add_variable = statics;
90730fdc8d8SChris Lattner                                 break;
90830fdc8d8SChris Lattner 
90930fdc8d8SChris Lattner                             case eValueTypeVariableArgument:
91030fdc8d8SChris Lattner                                 add_variable = arguments;
91130fdc8d8SChris Lattner                                 break;
91230fdc8d8SChris Lattner 
91330fdc8d8SChris Lattner                             case eValueTypeVariableLocal:
91430fdc8d8SChris Lattner                                 add_variable = locals;
91530fdc8d8SChris Lattner                                 break;
916c982c768SGreg Clayton 
917c982c768SGreg Clayton                             default:
918c982c768SGreg Clayton                                 break;
91930fdc8d8SChris Lattner                             }
92030fdc8d8SChris Lattner                             if (add_variable)
92130fdc8d8SChris Lattner                             {
922d9e416c0SGreg Clayton                                 if (in_scope_only && !variable_sp->IsInScope(frame))
92330fdc8d8SChris Lattner                                     continue;
92430fdc8d8SChris Lattner 
925d9e416c0SGreg Clayton                                 value_list.Append(frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic));
92630fdc8d8SChris Lattner                             }
92730fdc8d8SChris Lattner                         }
92830fdc8d8SChris Lattner                     }
92930fdc8d8SChris Lattner                 }
93030fdc8d8SChris Lattner             }
93130fdc8d8SChris Lattner         }
932c9858e4dSGreg Clayton         else
933c9858e4dSGreg Clayton         {
934c9858e4dSGreg Clayton             if (log)
935c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetVariables () => error: process is running", frame);
936c9858e4dSGreg Clayton         }
9377fdf9ef1SGreg Clayton     }
938ceb6b139SCaroline Tice 
939ceb6b139SCaroline Tice     if (log)
940ceb6b139SCaroline Tice     {
941d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame,
942750cd175SCaroline Tice                      value_list.get());
943ceb6b139SCaroline Tice     }
944ceb6b139SCaroline Tice 
94530fdc8d8SChris Lattner     return value_list;
94630fdc8d8SChris Lattner }
94730fdc8d8SChris Lattner 
94869b582faSGreg Clayton SBValueList
94930fdc8d8SChris Lattner SBFrame::GetRegisters ()
95030fdc8d8SChris Lattner {
95169b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
952ceb6b139SCaroline Tice 
95330fdc8d8SChris Lattner     SBValueList value_list;
9547fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
955d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
956d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
957d9e416c0SGreg Clayton     if (frame && target)
95830fdc8d8SChris Lattner     {
9597fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
9607fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
9617fdf9ef1SGreg Clayton         {
962d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
963d9e416c0SGreg Clayton             RegisterContextSP reg_ctx (frame->GetRegisterContext());
96430fdc8d8SChris Lattner             if (reg_ctx)
96530fdc8d8SChris Lattner             {
96630fdc8d8SChris Lattner                 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
96730fdc8d8SChris Lattner                 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
96830fdc8d8SChris Lattner                 {
969d9e416c0SGreg Clayton                     value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx));
97030fdc8d8SChris Lattner                 }
97130fdc8d8SChris Lattner             }
97230fdc8d8SChris Lattner         }
973c9858e4dSGreg Clayton         else
974c9858e4dSGreg Clayton         {
975c9858e4dSGreg Clayton             if (log)
976c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetRegisters () => error: process is running", frame);
977c9858e4dSGreg Clayton         }
9787fdf9ef1SGreg Clayton     }
979ceb6b139SCaroline Tice 
980ceb6b139SCaroline Tice     if (log)
981c9858e4dSGreg Clayton         log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.get());
982ceb6b139SCaroline Tice 
98330fdc8d8SChris Lattner     return value_list;
98430fdc8d8SChris Lattner }
98530fdc8d8SChris Lattner 
986dde9cff3SCaroline Tice bool
987dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
988dde9cff3SCaroline Tice {
989da7bc7d0SGreg Clayton     Stream &strm = description.ref();
990da7bc7d0SGreg Clayton 
9917fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
992d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
993d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
994d9e416c0SGreg Clayton     if (frame && target)
995dde9cff3SCaroline Tice     {
9967fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
9977fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
9987fdf9ef1SGreg Clayton         {
999d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
1000d9e416c0SGreg Clayton             frame->DumpUsingSettingsFormat (&strm);
1001dde9cff3SCaroline Tice         }
1002c9858e4dSGreg Clayton         else
1003c9858e4dSGreg Clayton         {
1004c9858e4dSGreg Clayton             LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1005c9858e4dSGreg Clayton             if (log)
1006c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetDescription () => error: process is running", frame);
1007c9858e4dSGreg Clayton         }
1008c9858e4dSGreg Clayton 
10097fdf9ef1SGreg Clayton     }
1010dde9cff3SCaroline Tice     else
1011da7bc7d0SGreg Clayton         strm.PutCString ("No value");
1012dde9cff3SCaroline Tice 
1013dde9cff3SCaroline Tice     return true;
1014dde9cff3SCaroline Tice }
10151d3afba3SGreg Clayton 
101669b582faSGreg Clayton SBValue
10171d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
10181d3afba3SGreg Clayton {
1019316d498bSGreg Clayton     SBValue result;
10207fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1021d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1022d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1023d9e416c0SGreg Clayton     if (frame && target)
1024316d498bSGreg Clayton     {
1025d9e416c0SGreg Clayton         lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue();
1026316d498bSGreg Clayton         result = EvaluateExpression (expr, use_dynamic);
1027316d498bSGreg Clayton     }
1028316d498bSGreg Clayton     return result;
102978a685aaSJim Ingham }
103078a685aaSJim Ingham 
103178a685aaSJim Ingham SBValue
10322837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value)
103378a685aaSJim Ingham {
103469b582faSGreg Clayton     LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
10354838131bSGreg Clayton 
103669b582faSGreg Clayton     LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
1037a162ebafSSean Callanan 
103825f3a3cdSJohnny Chen     ExecutionResults exe_results;
103969b582faSGreg Clayton     SBValue expr_result;
104081e871edSGreg Clayton     ValueObjectSP expr_value_sp;
10414838131bSGreg Clayton 
10427fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1043d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1044d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1045b9556accSGreg Clayton     if (log)
1046d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame, expr);
1047b9556accSGreg Clayton 
1048d9e416c0SGreg Clayton     if (frame && target)
10491d3afba3SGreg Clayton     {
10507fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
10517fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
10527fdf9ef1SGreg Clayton         {
10537fdf9ef1SGreg Clayton 
1054d9e416c0SGreg Clayton             Mutex::Locker api_locker (target->GetAPIMutex());
1055316d498bSGreg Clayton 
10561ba7c4d0SGreg Clayton 
10571ba7c4d0SGreg Clayton             StreamString frame_description;
1058d9e416c0SGreg Clayton             frame->DumpUsingSettingsFormat (&frame_description);
10591ba7c4d0SGreg Clayton 
10601ba7c4d0SGreg Clayton             Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s",
10611ba7c4d0SGreg Clayton                                                  expr, fetch_dynamic_value, frame_description.GetString().c_str());
10621ba7c4d0SGreg Clayton 
106320bb3aa5SSean Callanan             const bool coerce_to_id = false;
10648b2fe6dcSGreg Clayton             const bool unwind_on_error = true;
106592adcac9SSean Callanan             const bool keep_in_memory = false;
1066322f529bSSean Callanan 
1067d9e416c0SGreg Clayton             exe_results = target->EvaluateExpression (expr,
1068d9e416c0SGreg Clayton                                                       frame,
10693bfdaa2aSSean Callanan                                                       eExecutionPolicyOnlyWhenNeeded,
107020bb3aa5SSean Callanan                                                       coerce_to_id,
107178a685aaSJim Ingham                                                       unwind_on_error,
107278a685aaSJim Ingham                                                       keep_in_memory,
10732837b766SJim Ingham                                                       fetch_dynamic_value,
107481e871edSGreg Clayton                                                       expr_value_sp);
107581e871edSGreg Clayton             expr_result.SetSP(expr_value_sp);
1076f49e65aeSGreg Clayton             Host::SetCrashDescription (NULL);
10771d3afba3SGreg Clayton         }
1078c9858e4dSGreg Clayton         else
1079c9858e4dSGreg Clayton         {
1080c9858e4dSGreg Clayton             if (log)
1081c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::EvaluateExpression () => error: process is running", frame);
1082c9858e4dSGreg Clayton         }
10837fdf9ef1SGreg Clayton     }
10844838131bSGreg Clayton 
1085cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON
1086a162ebafSSean Callanan     if (expr_log)
108778a685aaSJim Ingham         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **",
1088fe42ac4dSGreg Clayton                          expr_result.GetValue(),
1089fe42ac4dSGreg Clayton                          expr_result.GetSummary());
1090a162ebafSSean Callanan 
10914838131bSGreg Clayton     if (log)
1092d9e416c0SGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)",
1093d9e416c0SGreg Clayton                      frame,
109478a685aaSJim Ingham                      expr,
109581e871edSGreg Clayton                      expr_value_sp.get(),
109625f3a3cdSJohnny Chen                      exe_results);
1097cf7e2dc0SJason Molenda #endif
10984838131bSGreg Clayton 
1099cfd1acedSGreg Clayton     return expr_result;
11001d3afba3SGreg Clayton }
1101316d498bSGreg Clayton 
1102316d498bSGreg Clayton bool
1103316d498bSGreg Clayton SBFrame::IsInlined()
1104316d498bSGreg Clayton {
11057fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1106d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1107d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1108d9e416c0SGreg Clayton     if (frame && target)
1109316d498bSGreg Clayton     {
11107fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11117fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
11127fdf9ef1SGreg Clayton         {
11137fdf9ef1SGreg Clayton 
1114d9e416c0SGreg Clayton             Block *block = frame->GetSymbolContext(eSymbolContextBlock).block;
1115316d498bSGreg Clayton             if (block)
1116316d498bSGreg Clayton                 return block->GetContainingInlinedBlock () != NULL;
1117316d498bSGreg Clayton         }
1118c9858e4dSGreg Clayton         else
1119c9858e4dSGreg Clayton         {
1120c9858e4dSGreg Clayton             LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1121c9858e4dSGreg Clayton             if (log)
1122c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::IsInlined () => error: process is running", frame);
1123c9858e4dSGreg Clayton         }
1124c9858e4dSGreg Clayton 
11257fdf9ef1SGreg Clayton     }
1126316d498bSGreg Clayton     return false;
1127316d498bSGreg Clayton }
1128316d498bSGreg Clayton 
1129316d498bSGreg Clayton const char *
1130316d498bSGreg Clayton SBFrame::GetFunctionName()
1131316d498bSGreg Clayton {
1132316d498bSGreg Clayton     const char *name = NULL;
11337fdf9ef1SGreg Clayton     ExecutionContext exe_ctx(m_opaque_sp.get());
1134d9e416c0SGreg Clayton     StackFrame *frame = exe_ctx.GetFramePtr();
1135d9e416c0SGreg Clayton     Target *target = exe_ctx.GetTargetPtr();
1136d9e416c0SGreg Clayton     if (frame && target)
1137316d498bSGreg Clayton     {
11387fdf9ef1SGreg Clayton         Process::StopLocker stop_locker;
11397fdf9ef1SGreg Clayton         if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock()))
11407fdf9ef1SGreg Clayton         {
1141d9e416c0SGreg Clayton             SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol));
1142316d498bSGreg Clayton             if (sc.block)
1143316d498bSGreg Clayton             {
1144316d498bSGreg Clayton                 Block *inlined_block = sc.block->GetContainingInlinedBlock ();
1145316d498bSGreg Clayton                 if (inlined_block)
1146316d498bSGreg Clayton                 {
1147316d498bSGreg Clayton                     const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo();
1148316d498bSGreg Clayton                     name = inlined_info->GetName().AsCString();
1149316d498bSGreg Clayton                 }
1150316d498bSGreg Clayton             }
1151316d498bSGreg Clayton 
1152316d498bSGreg Clayton             if (name == NULL)
1153316d498bSGreg Clayton             {
1154316d498bSGreg Clayton                 if (sc.function)
1155316d498bSGreg Clayton                     name = sc.function->GetName().GetCString();
1156316d498bSGreg Clayton             }
1157316d498bSGreg Clayton 
1158316d498bSGreg Clayton             if (name == NULL)
1159316d498bSGreg Clayton             {
1160316d498bSGreg Clayton                 if (sc.symbol)
1161316d498bSGreg Clayton                     name = sc.symbol->GetName().GetCString();
1162316d498bSGreg Clayton             }
1163316d498bSGreg Clayton         }
1164c9858e4dSGreg Clayton         else
1165c9858e4dSGreg Clayton         {
1166c9858e4dSGreg Clayton             LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1167c9858e4dSGreg Clayton             if (log)
1168c9858e4dSGreg Clayton                 log->Printf ("SBFrame(%p)::GetFunctionName() => error: process is running", frame);
1169c9858e4dSGreg Clayton 
1170c9858e4dSGreg Clayton         }
11717fdf9ef1SGreg Clayton     }
1172316d498bSGreg Clayton     return name;
1173316d498bSGreg Clayton }
1174316d498bSGreg Clayton 
1175