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