130fdc8d8SChris Lattner //===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 104c5de699SEli Friedman #include "lldb/API/SBFrame.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner #include <string> 1330fdc8d8SChris Lattner #include <algorithm> 1430fdc8d8SChris Lattner 1530fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1630fdc8d8SChris Lattner 1730fdc8d8SChris Lattner #include "lldb/Core/Address.h" 1830fdc8d8SChris Lattner #include "lldb/Core/ConstString.h" 19ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 2030fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h" 2330fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h" 24b71f3844SGreg Clayton #include "lldb/Expression/ClangUserExpression.h" 251ba7c4d0SGreg Clayton #include "lldb/Host/Host.h" 2630fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 271f746071SGreg Clayton #include "lldb/Symbol/Function.h" 281f746071SGreg Clayton #include "lldb/Symbol/Symbol.h" 2930fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 3030fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h" 3130fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h" 3230fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h" 3330fdc8d8SChris Lattner #include "lldb/Target/Target.h" 3430fdc8d8SChris Lattner #include "lldb/Target/Process.h" 3530fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 3630fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h" 37b9556accSGreg Clayton #include "lldb/Target/StackID.h" 3830fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 3930fdc8d8SChris Lattner 404c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 414c5de699SEli Friedman #include "lldb/API/SBValue.h" 424c5de699SEli Friedman #include "lldb/API/SBAddress.h" 43*35e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h" 44dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 454c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h" 464c5de699SEli Friedman #include "lldb/API/SBThread.h" 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner using namespace lldb; 4930fdc8d8SChris Lattner using namespace lldb_private; 5030fdc8d8SChris Lattner 51b9556accSGreg Clayton 5230fdc8d8SChris Lattner SBFrame::SBFrame () : 537fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef()) 5430fdc8d8SChris Lattner { 5530fdc8d8SChris Lattner } 5630fdc8d8SChris Lattner 5769b582faSGreg Clayton SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) : 587fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (lldb_object_sp)) 5930fdc8d8SChris Lattner { 6069b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 61ceb6b139SCaroline Tice 62ceb6b139SCaroline Tice if (log) 63ceb6b139SCaroline Tice { 64ceb6b139SCaroline Tice SBStream sstr; 65ceb6b139SCaroline Tice GetDescription (sstr); 664838131bSGreg Clayton log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s", 67b9556accSGreg Clayton lldb_object_sp.get(), lldb_object_sp.get(), sstr.GetData()); 68750cd175SCaroline Tice 69ceb6b139SCaroline Tice } 7030fdc8d8SChris Lattner } 7130fdc8d8SChris Lattner 72efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) : 737fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp)) 74efabb123SGreg Clayton { 75efabb123SGreg Clayton } 76efabb123SGreg Clayton 77efabb123SGreg Clayton const SBFrame & 78efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs) 79efabb123SGreg Clayton { 80efabb123SGreg Clayton if (this != &rhs) 817fdf9ef1SGreg Clayton *m_opaque_sp = *rhs.m_opaque_sp; 82efabb123SGreg Clayton return *this; 83efabb123SGreg Clayton } 84efabb123SGreg Clayton 8530fdc8d8SChris Lattner SBFrame::~SBFrame() 8630fdc8d8SChris Lattner { 8730fdc8d8SChris Lattner } 8830fdc8d8SChris Lattner 89b9556accSGreg Clayton StackFrameSP 90b9556accSGreg Clayton SBFrame::GetFrameSP() const 91b9556accSGreg Clayton { 92af2589eaSGreg Clayton if (m_opaque_sp) 937fdf9ef1SGreg Clayton return m_opaque_sp->GetFrameSP(); 94af2589eaSGreg Clayton return StackFrameSP(); 95b9556accSGreg Clayton } 9630fdc8d8SChris Lattner 9730fdc8d8SChris Lattner void 98b9556accSGreg Clayton SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp) 9930fdc8d8SChris Lattner { 1007fdf9ef1SGreg Clayton return m_opaque_sp->SetFrameSP(lldb_object_sp); 101b9556accSGreg Clayton } 10230fdc8d8SChris Lattner 10330fdc8d8SChris Lattner bool 10430fdc8d8SChris Lattner SBFrame::IsValid() const 10530fdc8d8SChris Lattner { 1067fdf9ef1SGreg Clayton return GetFrameSP().get() != NULL; 10730fdc8d8SChris Lattner } 10830fdc8d8SChris Lattner 10930fdc8d8SChris Lattner SBSymbolContext 11030fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const 11130fdc8d8SChris Lattner { 112c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 11330fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 1144fc6cb9cSJim Ingham Mutex::Locker api_locker; 1154fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1164fc6cb9cSJim Ingham 117d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 118d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 119d9e416c0SGreg Clayton if (frame && target) 120af67cecdSGreg Clayton { 1217fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1227fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1237fdf9ef1SGreg Clayton { 124d9e416c0SGreg Clayton sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope)); 125af67cecdSGreg Clayton } 126c9858e4dSGreg Clayton else 127c9858e4dSGreg Clayton { 128c9858e4dSGreg Clayton if (log) 129c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext () => error: process is running", frame); 130c9858e4dSGreg Clayton } 1317fdf9ef1SGreg Clayton } 132ceb6b139SCaroline Tice 133ceb6b139SCaroline Tice if (log) 1344838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)", 135d9e416c0SGreg Clayton frame, resolve_scope, sb_sym_ctx.get()); 136ceb6b139SCaroline Tice 13730fdc8d8SChris Lattner return sb_sym_ctx; 13830fdc8d8SChris Lattner } 13930fdc8d8SChris Lattner 14030fdc8d8SChris Lattner SBModule 14130fdc8d8SChris Lattner SBFrame::GetModule () const 14230fdc8d8SChris Lattner { 143c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14472eff18aSGreg Clayton SBModule sb_module; 145acdbe816SGreg Clayton ModuleSP module_sp; 1464fc6cb9cSJim Ingham Mutex::Locker api_locker; 1474fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1484fc6cb9cSJim Ingham 149d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 150d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 151d9e416c0SGreg Clayton if (frame && target) 152af67cecdSGreg Clayton { 1537fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1547fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1557fdf9ef1SGreg Clayton { 156d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp; 157acdbe816SGreg Clayton sb_module.SetSP (module_sp); 158af67cecdSGreg Clayton } 159c9858e4dSGreg Clayton else 160c9858e4dSGreg Clayton { 161c9858e4dSGreg Clayton if (log) 162c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => error: process is running", frame); 163c9858e4dSGreg Clayton } 1647fdf9ef1SGreg Clayton } 16572eff18aSGreg Clayton 1664838131bSGreg Clayton if (log) 1674838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)", 168d9e416c0SGreg Clayton frame, module_sp.get()); 1694838131bSGreg Clayton 17030fdc8d8SChris Lattner return sb_module; 17130fdc8d8SChris Lattner } 17230fdc8d8SChris Lattner 17330fdc8d8SChris Lattner SBCompileUnit 17430fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 17530fdc8d8SChris Lattner { 176c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 17772eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 1784fc6cb9cSJim Ingham Mutex::Locker api_locker; 1794fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1804fc6cb9cSJim Ingham 181d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 182d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 183d9e416c0SGreg Clayton if (frame && target) 184af67cecdSGreg Clayton { 1857fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1867fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1877fdf9ef1SGreg Clayton { 188d9e416c0SGreg Clayton sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 189af67cecdSGreg Clayton } 190c9858e4dSGreg Clayton else 191c9858e4dSGreg Clayton { 192ceb6b139SCaroline Tice if (log) 193c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetCompileUnit () => error: process is running", frame); 194c9858e4dSGreg Clayton } 195c9858e4dSGreg Clayton } 196c9858e4dSGreg Clayton if (log) 197c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)", 198d9e416c0SGreg Clayton frame, sb_comp_unit.get()); 199ceb6b139SCaroline Tice 20030fdc8d8SChris Lattner return sb_comp_unit; 20130fdc8d8SChris Lattner } 20230fdc8d8SChris Lattner 20330fdc8d8SChris Lattner SBFunction 20430fdc8d8SChris Lattner SBFrame::GetFunction () const 20530fdc8d8SChris Lattner { 206c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 20772eff18aSGreg Clayton SBFunction sb_function; 2084fc6cb9cSJim Ingham Mutex::Locker api_locker; 2094fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2104fc6cb9cSJim Ingham 211d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 212d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 213d9e416c0SGreg Clayton if (frame && target) 214af67cecdSGreg Clayton { 2157fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2167fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2177fdf9ef1SGreg Clayton { 218d9e416c0SGreg Clayton sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function); 219af67cecdSGreg Clayton } 220c9858e4dSGreg Clayton else 221c9858e4dSGreg Clayton { 222c9858e4dSGreg Clayton if (log) 223c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => error: process is running", frame); 2247fdf9ef1SGreg Clayton } 225c9858e4dSGreg Clayton } 2264838131bSGreg Clayton if (log) 2274838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)", 228d9e416c0SGreg Clayton frame, sb_function.get()); 2294838131bSGreg Clayton 23030fdc8d8SChris Lattner return sb_function; 23130fdc8d8SChris Lattner } 23230fdc8d8SChris Lattner 2333b06557eSGreg Clayton SBSymbol 2343b06557eSGreg Clayton SBFrame::GetSymbol () const 2353b06557eSGreg Clayton { 236c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 23772eff18aSGreg Clayton SBSymbol sb_symbol; 2384fc6cb9cSJim Ingham Mutex::Locker api_locker; 2394fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2404fc6cb9cSJim Ingham 241d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 242d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 243d9e416c0SGreg Clayton if (frame && target) 244af67cecdSGreg Clayton { 2457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2467fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2477fdf9ef1SGreg Clayton { 248d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol); 249af67cecdSGreg Clayton } 250c9858e4dSGreg Clayton else 251c9858e4dSGreg Clayton { 252c9858e4dSGreg Clayton if (log) 253c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => error: process is running", frame); 2547fdf9ef1SGreg Clayton } 255c9858e4dSGreg Clayton } 2564838131bSGreg Clayton if (log) 2574838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 258d9e416c0SGreg Clayton frame, sb_symbol.get()); 2593b06557eSGreg Clayton return sb_symbol; 2603b06557eSGreg Clayton } 2613b06557eSGreg Clayton 26230fdc8d8SChris Lattner SBBlock 26330fdc8d8SChris Lattner SBFrame::GetBlock () const 26430fdc8d8SChris Lattner { 265c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 26672eff18aSGreg Clayton SBBlock sb_block; 2674fc6cb9cSJim Ingham Mutex::Locker api_locker; 2684fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2694fc6cb9cSJim Ingham 270d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 271d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 272d9e416c0SGreg Clayton if (frame && target) 273af67cecdSGreg Clayton { 2747fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2757fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2767fdf9ef1SGreg Clayton { 277d9e416c0SGreg Clayton sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block); 278af67cecdSGreg Clayton } 279c9858e4dSGreg Clayton else 280c9858e4dSGreg Clayton { 281c9858e4dSGreg Clayton if (log) 282c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", frame); 2837fdf9ef1SGreg Clayton } 284c9858e4dSGreg Clayton } 2854838131bSGreg Clayton if (log) 2864838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)", 287d9e416c0SGreg Clayton frame, sb_block.GetPtr()); 28830fdc8d8SChris Lattner return sb_block; 28930fdc8d8SChris Lattner } 29030fdc8d8SChris Lattner 29195897c6aSGreg Clayton SBBlock 29295897c6aSGreg Clayton SBFrame::GetFrameBlock () const 29395897c6aSGreg Clayton { 29472eff18aSGreg Clayton SBBlock sb_block; 2954fc6cb9cSJim Ingham Mutex::Locker api_locker; 2964fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2974fc6cb9cSJim Ingham 298d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 299d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 300c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 301d9e416c0SGreg Clayton if (frame && target) 302af67cecdSGreg Clayton { 3037fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3047fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 3057fdf9ef1SGreg Clayton { 306d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock ()); 307af67cecdSGreg Clayton } 308c9858e4dSGreg Clayton else 309c9858e4dSGreg Clayton { 310c9858e4dSGreg Clayton if (log) 311c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => error: process is running", frame); 3127fdf9ef1SGreg Clayton } 313c9858e4dSGreg Clayton } 3144838131bSGreg Clayton if (log) 3154838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 316d9e416c0SGreg Clayton frame, sb_block.GetPtr()); 31795897c6aSGreg Clayton return sb_block; 31895897c6aSGreg Clayton } 31995897c6aSGreg Clayton 32030fdc8d8SChris Lattner SBLineEntry 32130fdc8d8SChris Lattner SBFrame::GetLineEntry () const 32230fdc8d8SChris Lattner { 323c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 32472eff18aSGreg Clayton SBLineEntry sb_line_entry; 3254fc6cb9cSJim Ingham Mutex::Locker api_locker; 3264fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3274fc6cb9cSJim Ingham 328d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 329d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 330d9e416c0SGreg Clayton if (frame && target) 331af67cecdSGreg Clayton { 3327fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3337fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 3347fdf9ef1SGreg Clayton { 335d9e416c0SGreg Clayton sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry); 336af67cecdSGreg Clayton } 337c9858e4dSGreg Clayton else 338c9858e4dSGreg Clayton { 339c9858e4dSGreg Clayton if (log) 340c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => error: process is running", frame); 3417fdf9ef1SGreg Clayton } 342c9858e4dSGreg Clayton } 3434838131bSGreg Clayton if (log) 3444838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 345d9e416c0SGreg Clayton frame, sb_line_entry.get()); 34630fdc8d8SChris Lattner return sb_line_entry; 34730fdc8d8SChris Lattner } 34830fdc8d8SChris Lattner 34930fdc8d8SChris Lattner uint32_t 35030fdc8d8SChris Lattner SBFrame::GetFrameID () const 35130fdc8d8SChris Lattner { 352b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 353b9556accSGreg Clayton 3547fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 355d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 3567fdf9ef1SGreg Clayton if (frame) 357d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex (); 3584838131bSGreg Clayton 35969b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3604838131bSGreg Clayton if (log) 3614838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameID () => %u", 362d9e416c0SGreg Clayton frame, frame_idx); 3634838131bSGreg Clayton return frame_idx; 36430fdc8d8SChris Lattner } 36530fdc8d8SChris Lattner 36669b582faSGreg Clayton addr_t 36730fdc8d8SChris Lattner SBFrame::GetPC () const 36830fdc8d8SChris Lattner { 369c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 37069b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 3714fc6cb9cSJim Ingham Mutex::Locker api_locker; 3724fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3734fc6cb9cSJim Ingham 374d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 375d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 376d9e416c0SGreg Clayton if (frame && target) 377af67cecdSGreg Clayton { 3787fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3797fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 3807fdf9ef1SGreg Clayton { 381d9e416c0SGreg Clayton addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target); 382af67cecdSGreg Clayton } 383c9858e4dSGreg Clayton else 384c9858e4dSGreg Clayton { 385c9858e4dSGreg Clayton if (log) 386c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetPC () => error: process is running", frame); 387c9858e4dSGreg Clayton } 3887fdf9ef1SGreg Clayton } 389ceb6b139SCaroline Tice 390ceb6b139SCaroline Tice if (log) 391d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", frame, addr); 392ceb6b139SCaroline Tice 393ceb6b139SCaroline Tice return addr; 39430fdc8d8SChris Lattner } 39530fdc8d8SChris Lattner 39630fdc8d8SChris Lattner bool 39769b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc) 39830fdc8d8SChris Lattner { 399c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 400ceb6b139SCaroline Tice bool ret_val = false; 4014fc6cb9cSJim Ingham Mutex::Locker api_locker; 4024fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4034fc6cb9cSJim Ingham 404d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 405d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 406d9e416c0SGreg Clayton if (frame && target) 407af67cecdSGreg Clayton { 4087fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4097fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4107fdf9ef1SGreg Clayton { 411d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC (new_pc); 412af67cecdSGreg Clayton } 413c9858e4dSGreg Clayton else 414c9858e4dSGreg Clayton { 415c9858e4dSGreg Clayton if (log) 416c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::SetPC () => error: process is running", frame); 417c9858e4dSGreg Clayton } 4187fdf9ef1SGreg Clayton } 419ceb6b139SCaroline Tice 420ceb6b139SCaroline Tice if (log) 4214838131bSGreg Clayton log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i", 422d9e416c0SGreg Clayton frame, new_pc, ret_val); 423ceb6b139SCaroline Tice 424ceb6b139SCaroline Tice return ret_val; 42530fdc8d8SChris Lattner } 42630fdc8d8SChris Lattner 42769b582faSGreg Clayton addr_t 42830fdc8d8SChris Lattner SBFrame::GetSP () const 42930fdc8d8SChris Lattner { 430c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4314838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 4324fc6cb9cSJim Ingham Mutex::Locker api_locker; 4334fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4344fc6cb9cSJim Ingham 435d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 436d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 437d9e416c0SGreg Clayton if (frame && target) 438af67cecdSGreg Clayton { 4397fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4407fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4417fdf9ef1SGreg Clayton { 442d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 443af67cecdSGreg Clayton } 444c9858e4dSGreg Clayton else 445c9858e4dSGreg Clayton { 446c9858e4dSGreg Clayton if (log) 447c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetSP () => error: process is running", frame); 4487fdf9ef1SGreg Clayton } 449c9858e4dSGreg Clayton } 4504838131bSGreg Clayton if (log) 451d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", frame, addr); 4524838131bSGreg Clayton 4534838131bSGreg Clayton return addr; 45430fdc8d8SChris Lattner } 45530fdc8d8SChris Lattner 45630fdc8d8SChris Lattner 45769b582faSGreg Clayton addr_t 45830fdc8d8SChris Lattner SBFrame::GetFP () const 45930fdc8d8SChris Lattner { 460c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 46169b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 4624fc6cb9cSJim Ingham Mutex::Locker api_locker; 4634fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4644fc6cb9cSJim Ingham 465d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 466d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 467d9e416c0SGreg Clayton if (frame && target) 468af67cecdSGreg Clayton { 4697fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4707fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4717fdf9ef1SGreg Clayton { 472d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 473af67cecdSGreg Clayton } 474c9858e4dSGreg Clayton else 475c9858e4dSGreg Clayton { 476c9858e4dSGreg Clayton if (log) 477c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFP () => error: process is running", frame); 478c9858e4dSGreg Clayton } 4797fdf9ef1SGreg Clayton } 480ceb6b139SCaroline Tice 481ceb6b139SCaroline Tice if (log) 482d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", frame, addr); 483ceb6b139SCaroline Tice return addr; 48430fdc8d8SChris Lattner } 48530fdc8d8SChris Lattner 48630fdc8d8SChris Lattner 48730fdc8d8SChris Lattner SBAddress 48830fdc8d8SChris Lattner SBFrame::GetPCAddress () const 48930fdc8d8SChris Lattner { 490c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 49130fdc8d8SChris Lattner SBAddress sb_addr; 4924fc6cb9cSJim Ingham Mutex::Locker api_locker; 4934fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4944fc6cb9cSJim Ingham 495d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 496d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 497d9e416c0SGreg Clayton if (frame && target) 498af67cecdSGreg Clayton { 4997fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5007fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 5017fdf9ef1SGreg Clayton { 502d9e416c0SGreg Clayton sb_addr.SetAddress (&frame->GetFrameCodeAddress()); 503af67cecdSGreg Clayton } 504c9858e4dSGreg Clayton else 505c9858e4dSGreg Clayton { 506c9858e4dSGreg Clayton if (log) 507c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetPCAddress () => error: process is running", frame); 5087fdf9ef1SGreg Clayton } 509c9858e4dSGreg Clayton } 5104838131bSGreg Clayton if (log) 511d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get()); 51230fdc8d8SChris Lattner return sb_addr; 51330fdc8d8SChris Lattner } 51430fdc8d8SChris Lattner 51530fdc8d8SChris Lattner void 51630fdc8d8SChris Lattner SBFrame::Clear() 51730fdc8d8SChris Lattner { 518af2589eaSGreg Clayton m_opaque_sp->Clear(); 51930fdc8d8SChris Lattner } 52030fdc8d8SChris Lattner 5217edbdfc9SGreg Clayton lldb::SBValue 5227edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path) 5237edbdfc9SGreg Clayton { 5247edbdfc9SGreg Clayton SBValue sb_value; 5257fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 526d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 527d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 528d9e416c0SGreg Clayton if (frame && target) 5297edbdfc9SGreg Clayton { 530d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 5317edbdfc9SGreg Clayton sb_value = GetValueForVariablePath (var_path, use_dynamic); 5327edbdfc9SGreg Clayton } 5337edbdfc9SGreg Clayton return sb_value; 5347edbdfc9SGreg Clayton } 5357edbdfc9SGreg Clayton 5367edbdfc9SGreg Clayton lldb::SBValue 5377edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic) 5387edbdfc9SGreg Clayton { 5397edbdfc9SGreg Clayton SBValue sb_value; 5404fc6cb9cSJim Ingham Mutex::Locker api_locker; 5414fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5424fc6cb9cSJim Ingham 543d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 544d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 545d9e416c0SGreg Clayton if (frame && target && var_path && var_path[0]) 5467edbdfc9SGreg Clayton { 5477fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5487fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 5497fdf9ef1SGreg Clayton { 5507edbdfc9SGreg Clayton VariableSP var_sp; 5517edbdfc9SGreg Clayton Error error; 552d9e416c0SGreg Clayton ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path, 5537edbdfc9SGreg Clayton use_dynamic, 554685c88c5SGreg Clayton StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 5557edbdfc9SGreg Clayton var_sp, 5567edbdfc9SGreg Clayton error)); 55781e871edSGreg Clayton sb_value.SetSP(value_sp); 5587edbdfc9SGreg Clayton } 559c9858e4dSGreg Clayton else 560c9858e4dSGreg Clayton { 561c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 562c9858e4dSGreg Clayton if (log) 563c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetValueForVariablePath () => error: process is running", frame); 564c9858e4dSGreg Clayton } 5657fdf9ef1SGreg Clayton } 5667edbdfc9SGreg Clayton return sb_value; 5677edbdfc9SGreg Clayton } 5687edbdfc9SGreg Clayton 56930fdc8d8SChris Lattner SBValue 57069b582faSGreg Clayton SBFrame::FindVariable (const char *name) 57130fdc8d8SChris Lattner { 572316d498bSGreg Clayton SBValue value; 5737fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 574d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 575d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 576d9e416c0SGreg Clayton if (frame && target) 577316d498bSGreg Clayton { 578d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 579316d498bSGreg Clayton value = FindVariable (name, use_dynamic); 580316d498bSGreg Clayton } 581316d498bSGreg Clayton return value; 58278a685aaSJim Ingham } 58378a685aaSJim Ingham 5847edbdfc9SGreg Clayton 58578a685aaSJim Ingham SBValue 5862837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic) 58778a685aaSJim Ingham { 588c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 58969b582faSGreg Clayton VariableSP var_sp; 59058b59f95SJim Ingham SBValue sb_value; 59181e871edSGreg Clayton ValueObjectSP value_sp; 5924fc6cb9cSJim Ingham Mutex::Locker api_locker; 5934fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5944fc6cb9cSJim Ingham 595d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 596d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 597d9e416c0SGreg Clayton if (frame && target && name && name[0]) 59830fdc8d8SChris Lattner { 5997fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6007fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 6017fdf9ef1SGreg Clayton { 60269b582faSGreg Clayton VariableList variable_list; 603d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 60430fdc8d8SChris Lattner 60572eff18aSGreg Clayton if (sc.block) 60630fdc8d8SChris Lattner { 60772eff18aSGreg Clayton const bool can_create = true; 60872eff18aSGreg Clayton const bool get_parent_variables = true; 60972eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 61072eff18aSGreg Clayton 61172eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 61272eff18aSGreg Clayton get_parent_variables, 61372eff18aSGreg Clayton stop_if_block_is_inlined_function, 61472eff18aSGreg Clayton &variable_list)) 61572eff18aSGreg Clayton { 61669b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 61730fdc8d8SChris Lattner } 61872eff18aSGreg Clayton } 61930fdc8d8SChris Lattner 6204838131bSGreg Clayton if (var_sp) 62181e871edSGreg Clayton { 622d9e416c0SGreg Clayton value_sp = frame->GetValueObjectForFrameVariable(var_sp, use_dynamic); 62381e871edSGreg Clayton sb_value.SetSP(value_sp); 62481e871edSGreg Clayton } 6257fdf9ef1SGreg Clayton } 626c9858e4dSGreg Clayton else 627c9858e4dSGreg Clayton { 628c9858e4dSGreg Clayton if (log) 629c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable () => error: process is running", frame); 630c9858e4dSGreg Clayton } 631316d498bSGreg Clayton } 632316d498bSGreg Clayton 6334838131bSGreg Clayton if (log) 63469b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 635d9e416c0SGreg Clayton frame, name, value_sp.get()); 6364838131bSGreg Clayton 637dde9cff3SCaroline Tice return sb_value; 638dde9cff3SCaroline Tice } 639dde9cff3SCaroline Tice 64030fdc8d8SChris Lattner SBValue 64169b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 64230fdc8d8SChris Lattner { 643316d498bSGreg Clayton SBValue value; 6447fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 645d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 646d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 647d9e416c0SGreg Clayton if (frame && target) 648316d498bSGreg Clayton { 649d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 650316d498bSGreg Clayton value = FindValue (name, value_type, use_dynamic); 651316d498bSGreg Clayton } 652316d498bSGreg Clayton return value; 65378a685aaSJim Ingham } 65478a685aaSJim Ingham 65578a685aaSJim Ingham SBValue 6562837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) 65778a685aaSJim Ingham { 658c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 65969b582faSGreg Clayton SBValue sb_value; 66081e871edSGreg Clayton ValueObjectSP value_sp; 6614fc6cb9cSJim Ingham Mutex::Locker api_locker; 6624fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 6634fc6cb9cSJim Ingham 664d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 665d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 666d9e416c0SGreg Clayton if (frame && target && name && name[0]) 66730fdc8d8SChris Lattner { 6687fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6697fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 6707fdf9ef1SGreg Clayton { 67169b582faSGreg Clayton switch (value_type) 67230fdc8d8SChris Lattner { 67369b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 67469b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 67569b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 67669b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 67769b582faSGreg Clayton { 678d9e416c0SGreg Clayton VariableList *variable_list = frame->GetVariableList(true); 67972eff18aSGreg Clayton 680d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 68172eff18aSGreg Clayton 68272eff18aSGreg Clayton const bool can_create = true; 68372eff18aSGreg Clayton const bool get_parent_variables = true; 68472eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 68572eff18aSGreg Clayton 68672eff18aSGreg Clayton if (sc.block && sc.block->AppendVariables (can_create, 68772eff18aSGreg Clayton get_parent_variables, 68872eff18aSGreg Clayton stop_if_block_is_inlined_function, 689e85d9cb8SJohnny Chen variable_list)) 690beae523aSJohnny Chen { 69169b582faSGreg Clayton ConstString const_name(name); 692e85d9cb8SJohnny Chen const uint32_t num_variables = variable_list->GetSize(); 69372eff18aSGreg Clayton for (uint32_t i = 0; i < num_variables; ++i) 69430fdc8d8SChris Lattner { 69569b582faSGreg Clayton VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 69669b582faSGreg Clayton if (variable_sp && 69769b582faSGreg Clayton variable_sp->GetScope() == value_type && 69869b582faSGreg Clayton variable_sp->GetName() == const_name) 699beae523aSJohnny Chen { 700d9e416c0SGreg Clayton value_sp = frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic); 70181e871edSGreg Clayton sb_value.SetSP (value_sp); 702beae523aSJohnny Chen break; 703beae523aSJohnny Chen } 70430fdc8d8SChris Lattner } 70530fdc8d8SChris Lattner } 70630fdc8d8SChris Lattner } 70769b582faSGreg Clayton break; 70869b582faSGreg Clayton 70969b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 71069b582faSGreg Clayton { 711d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 71269b582faSGreg Clayton if (reg_ctx) 71369b582faSGreg Clayton { 71469b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 71569b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 71669b582faSGreg Clayton { 71769b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 71869b582faSGreg Clayton if (reg_info && 71969b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 72069b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 72169b582faSGreg Clayton { 722d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 72381e871edSGreg Clayton sb_value.SetSP (value_sp); 72481e871edSGreg Clayton break; 72569b582faSGreg Clayton } 72669b582faSGreg Clayton } 72769b582faSGreg Clayton } 72869b582faSGreg Clayton } 72969b582faSGreg Clayton break; 73069b582faSGreg Clayton 73169b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 73269b582faSGreg Clayton { 733d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 73469b582faSGreg Clayton if (reg_ctx) 73569b582faSGreg Clayton { 73669b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 73769b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 73869b582faSGreg Clayton { 73969b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 74069b582faSGreg Clayton if (reg_set && 74169b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 74269b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 74369b582faSGreg Clayton { 744d9e416c0SGreg Clayton value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx); 74581e871edSGreg Clayton sb_value.SetSP (value_sp); 74681e871edSGreg Clayton break; 74769b582faSGreg Clayton } 74869b582faSGreg Clayton } 74969b582faSGreg Clayton } 75069b582faSGreg Clayton } 75169b582faSGreg Clayton break; 75269b582faSGreg Clayton 75369b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 75469b582faSGreg Clayton { 75569b582faSGreg Clayton ConstString const_name(name); 756d9e416c0SGreg Clayton ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name)); 75769b582faSGreg Clayton if (expr_var_sp) 75881e871edSGreg Clayton { 75981e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 76081e871edSGreg Clayton sb_value.SetSP (value_sp); 76181e871edSGreg Clayton } 76269b582faSGreg Clayton } 76369b582faSGreg Clayton break; 76469b582faSGreg Clayton 76569b582faSGreg Clayton default: 76669b582faSGreg Clayton break; 76769b582faSGreg Clayton } 768beae523aSJohnny Chen } 769c9858e4dSGreg Clayton else 770c9858e4dSGreg Clayton { 771c9858e4dSGreg Clayton if (log) 772c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::FindValue () => error: process is running", frame); 773c9858e4dSGreg Clayton } 7747fdf9ef1SGreg Clayton } 775dde9cff3SCaroline Tice 7764838131bSGreg Clayton if (log) 77769b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 778d9e416c0SGreg Clayton frame, name, value_type, value_sp.get()); 7794838131bSGreg Clayton 7804838131bSGreg Clayton 781dde9cff3SCaroline Tice return sb_value; 782dde9cff3SCaroline Tice } 783dde9cff3SCaroline Tice 78430fdc8d8SChris Lattner bool 78535e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const 78635e2ab60SJohnny Chen { 78735e2ab60SJohnny Chen lldb::StackFrameSP this_sp = GetFrameSP(); 78835e2ab60SJohnny Chen lldb::StackFrameSP that_sp = that.GetFrameSP(); 78935e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 79035e2ab60SJohnny Chen } 79135e2ab60SJohnny Chen 79235e2ab60SJohnny Chen bool 79330fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 79430fdc8d8SChris Lattner { 79535e2ab60SJohnny Chen return IsEqual(rhs); 79630fdc8d8SChris Lattner } 79730fdc8d8SChris Lattner 79830fdc8d8SChris Lattner bool 79930fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 80030fdc8d8SChris Lattner { 80135e2ab60SJohnny Chen return !IsEqual(rhs); 802481cef25SGreg Clayton } 80330fdc8d8SChris Lattner 80430fdc8d8SChris Lattner SBThread 80530fdc8d8SChris Lattner SBFrame::GetThread () const 80630fdc8d8SChris Lattner { 80769b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 808ceb6b139SCaroline Tice 8097fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 810d9e416c0SGreg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 811d9e416c0SGreg Clayton SBThread sb_thread (thread_sp); 812ceb6b139SCaroline Tice 813ceb6b139SCaroline Tice if (log) 814750cd175SCaroline Tice { 815750cd175SCaroline Tice SBStream sstr; 816750cd175SCaroline Tice sb_thread.GetDescription (sstr); 817d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", 818d9e416c0SGreg Clayton exe_ctx.GetFramePtr(), 819d9e416c0SGreg Clayton thread_sp.get(), 820d9e416c0SGreg Clayton sstr.GetData()); 821750cd175SCaroline Tice } 822ceb6b139SCaroline Tice 82330fdc8d8SChris Lattner return sb_thread; 82430fdc8d8SChris Lattner } 82530fdc8d8SChris Lattner 82630fdc8d8SChris Lattner const char * 82730fdc8d8SChris Lattner SBFrame::Disassemble () const 82830fdc8d8SChris Lattner { 829c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8304838131bSGreg Clayton const char *disassembly = NULL; 8314fc6cb9cSJim Ingham Mutex::Locker api_locker; 8324fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 8334fc6cb9cSJim Ingham 834d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 835d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 836d9e416c0SGreg Clayton if (frame && target) 837af67cecdSGreg Clayton { 8387fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8397fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 8407fdf9ef1SGreg Clayton { 841d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 842af67cecdSGreg Clayton } 843c9858e4dSGreg Clayton else 844c9858e4dSGreg Clayton { 845c9858e4dSGreg Clayton if (log) 846c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => error: process is running", frame); 8477fdf9ef1SGreg Clayton } 848c9858e4dSGreg Clayton } 8494838131bSGreg Clayton 8504838131bSGreg Clayton if (log) 851d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly); 8524838131bSGreg Clayton 8534838131bSGreg Clayton return disassembly; 85430fdc8d8SChris Lattner } 85530fdc8d8SChris Lattner 85630fdc8d8SChris Lattner 85730fdc8d8SChris Lattner SBValueList 85830fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 85930fdc8d8SChris Lattner bool locals, 86030fdc8d8SChris Lattner bool statics, 86130fdc8d8SChris Lattner bool in_scope_only) 86230fdc8d8SChris Lattner { 863316d498bSGreg Clayton SBValueList value_list; 8647fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 865d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 866d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 867d9e416c0SGreg Clayton if (frame && target) 868316d498bSGreg Clayton { 869d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 870316d498bSGreg Clayton value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic); 871316d498bSGreg Clayton } 872316d498bSGreg Clayton return value_list; 87378a685aaSJim Ingham } 87478a685aaSJim Ingham 87578a685aaSJim Ingham SBValueList 87678a685aaSJim Ingham SBFrame::GetVariables (bool arguments, 87778a685aaSJim Ingham bool locals, 87878a685aaSJim Ingham bool statics, 87978a685aaSJim Ingham bool in_scope_only, 8802837b766SJim Ingham lldb::DynamicValueType use_dynamic) 88178a685aaSJim Ingham { 88269b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 883ceb6b139SCaroline Tice 884b9556accSGreg Clayton SBValueList value_list; 8854fc6cb9cSJim Ingham Mutex::Locker api_locker; 8864fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 8874fc6cb9cSJim Ingham 888d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 889d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 890b9556accSGreg Clayton 891ceb6b139SCaroline Tice if (log) 8924838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 893d9e416c0SGreg Clayton frame, 8944838131bSGreg Clayton arguments, 8954838131bSGreg Clayton locals, 8964838131bSGreg Clayton statics, 8974838131bSGreg Clayton in_scope_only); 898ceb6b139SCaroline Tice 899d9e416c0SGreg Clayton if (frame && target) 90030fdc8d8SChris Lattner { 9017fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9027fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 9037fdf9ef1SGreg Clayton { 904af67cecdSGreg Clayton 90530fdc8d8SChris Lattner size_t i; 906af67cecdSGreg Clayton VariableList *variable_list = NULL; 907d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 90830fdc8d8SChris Lattner if (variable_list) 90930fdc8d8SChris Lattner { 91030fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 91130fdc8d8SChris Lattner if (num_variables) 91230fdc8d8SChris Lattner { 91330fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 91430fdc8d8SChris Lattner { 91530fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 91630fdc8d8SChris Lattner if (variable_sp) 91730fdc8d8SChris Lattner { 91830fdc8d8SChris Lattner bool add_variable = false; 91930fdc8d8SChris Lattner switch (variable_sp->GetScope()) 92030fdc8d8SChris Lattner { 92130fdc8d8SChris Lattner case eValueTypeVariableGlobal: 92230fdc8d8SChris Lattner case eValueTypeVariableStatic: 92330fdc8d8SChris Lattner add_variable = statics; 92430fdc8d8SChris Lattner break; 92530fdc8d8SChris Lattner 92630fdc8d8SChris Lattner case eValueTypeVariableArgument: 92730fdc8d8SChris Lattner add_variable = arguments; 92830fdc8d8SChris Lattner break; 92930fdc8d8SChris Lattner 93030fdc8d8SChris Lattner case eValueTypeVariableLocal: 93130fdc8d8SChris Lattner add_variable = locals; 93230fdc8d8SChris Lattner break; 933c982c768SGreg Clayton 934c982c768SGreg Clayton default: 935c982c768SGreg Clayton break; 93630fdc8d8SChris Lattner } 93730fdc8d8SChris Lattner if (add_variable) 93830fdc8d8SChris Lattner { 939d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 94030fdc8d8SChris Lattner continue; 94130fdc8d8SChris Lattner 942d9e416c0SGreg Clayton value_list.Append(frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic)); 94330fdc8d8SChris Lattner } 94430fdc8d8SChris Lattner } 94530fdc8d8SChris Lattner } 94630fdc8d8SChris Lattner } 94730fdc8d8SChris Lattner } 94830fdc8d8SChris Lattner } 949c9858e4dSGreg Clayton else 950c9858e4dSGreg Clayton { 951c9858e4dSGreg Clayton if (log) 952c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables () => error: process is running", frame); 953c9858e4dSGreg Clayton } 9547fdf9ef1SGreg Clayton } 955ceb6b139SCaroline Tice 956ceb6b139SCaroline Tice if (log) 957ceb6b139SCaroline Tice { 958d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame, 959750cd175SCaroline Tice value_list.get()); 960ceb6b139SCaroline Tice } 961ceb6b139SCaroline Tice 96230fdc8d8SChris Lattner return value_list; 96330fdc8d8SChris Lattner } 96430fdc8d8SChris Lattner 96569b582faSGreg Clayton SBValueList 96630fdc8d8SChris Lattner SBFrame::GetRegisters () 96730fdc8d8SChris Lattner { 96869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 969ceb6b139SCaroline Tice 97030fdc8d8SChris Lattner SBValueList value_list; 9714fc6cb9cSJim Ingham Mutex::Locker api_locker; 9724fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 9734fc6cb9cSJim Ingham 974d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 975d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 976d9e416c0SGreg Clayton if (frame && target) 97730fdc8d8SChris Lattner { 9787fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9797fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 9807fdf9ef1SGreg Clayton { 981d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 98230fdc8d8SChris Lattner if (reg_ctx) 98330fdc8d8SChris Lattner { 98430fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 98530fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 98630fdc8d8SChris Lattner { 987d9e416c0SGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); 98830fdc8d8SChris Lattner } 98930fdc8d8SChris Lattner } 99030fdc8d8SChris Lattner } 991c9858e4dSGreg Clayton else 992c9858e4dSGreg Clayton { 993c9858e4dSGreg Clayton if (log) 994c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetRegisters () => error: process is running", frame); 995c9858e4dSGreg Clayton } 9967fdf9ef1SGreg Clayton } 997ceb6b139SCaroline Tice 998ceb6b139SCaroline Tice if (log) 999c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.get()); 1000ceb6b139SCaroline Tice 100130fdc8d8SChris Lattner return value_list; 100230fdc8d8SChris Lattner } 100330fdc8d8SChris Lattner 1004dde9cff3SCaroline Tice bool 1005dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 1006dde9cff3SCaroline Tice { 1007da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1008da7bc7d0SGreg Clayton 10094fc6cb9cSJim Ingham Mutex::Locker api_locker; 10104fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10114fc6cb9cSJim Ingham 1012d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1013d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1014d9e416c0SGreg Clayton if (frame && target) 1015dde9cff3SCaroline Tice { 10167fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10177fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 10187fdf9ef1SGreg Clayton { 1019d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 1020dde9cff3SCaroline Tice } 1021c9858e4dSGreg Clayton else 1022c9858e4dSGreg Clayton { 1023c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1024c9858e4dSGreg Clayton if (log) 1025c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetDescription () => error: process is running", frame); 1026c9858e4dSGreg Clayton } 1027c9858e4dSGreg Clayton 10287fdf9ef1SGreg Clayton } 1029dde9cff3SCaroline Tice else 1030da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1031dde9cff3SCaroline Tice 1032dde9cff3SCaroline Tice return true; 1033dde9cff3SCaroline Tice } 10341d3afba3SGreg Clayton 103569b582faSGreg Clayton SBValue 10361d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 10371d3afba3SGreg Clayton { 1038316d498bSGreg Clayton SBValue result; 10397fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1040d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1041d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1042d9e416c0SGreg Clayton if (frame && target) 1043316d498bSGreg Clayton { 1044*35e1bda6SJim Ingham SBExpressionOptions options; 1045*35e1bda6SJim Ingham lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue(); 1046*35e1bda6SJim Ingham options.SetUseDynamic (fetch_dynamic_value); 1047*35e1bda6SJim Ingham options.SetUnwindOnError (true); 1048*35e1bda6SJim Ingham return EvaluateExpression (expr, options); 1049316d498bSGreg Clayton } 1050316d498bSGreg Clayton return result; 105178a685aaSJim Ingham } 105278a685aaSJim Ingham 105378a685aaSJim Ingham SBValue 10542837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 105578a685aaSJim Ingham { 1056*35e1bda6SJim Ingham SBExpressionOptions options; 1057*35e1bda6SJim Ingham options.SetUseDynamic (fetch_dynamic_value); 1058*35e1bda6SJim Ingham options.SetUnwindOnError (true); 1059*35e1bda6SJim Ingham return EvaluateExpression (expr, options); 10607ba6e991SJim Ingham } 10617ba6e991SJim Ingham 10627ba6e991SJim Ingham SBValue 10637ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error) 10647ba6e991SJim Ingham { 1065*35e1bda6SJim Ingham SBExpressionOptions options; 1066*35e1bda6SJim Ingham options.SetUseDynamic (fetch_dynamic_value); 1067*35e1bda6SJim Ingham options.SetUnwindOnError (unwind_on_error); 1068*35e1bda6SJim Ingham return EvaluateExpression (expr, options); 1069*35e1bda6SJim Ingham } 1070*35e1bda6SJim Ingham 1071*35e1bda6SJim Ingham lldb::SBValue 1072*35e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options) 1073*35e1bda6SJim Ingham { 107469b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 10754838131bSGreg Clayton 107669b582faSGreg Clayton LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1077a162ebafSSean Callanan 107823f59509SGreg Clayton ExecutionResults exe_results = eExecutionSetupError; 107969b582faSGreg Clayton SBValue expr_result; 108081e871edSGreg Clayton ValueObjectSP expr_value_sp; 10814838131bSGreg Clayton 10824fc6cb9cSJim Ingham Mutex::Locker api_locker; 10834fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10844fc6cb9cSJim Ingham 1085d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1086d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1087b9556accSGreg Clayton if (log) 1088d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame, expr); 1089b9556accSGreg Clayton 1090d9e416c0SGreg Clayton if (frame && target) 10911d3afba3SGreg Clayton { 10927fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10937fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 10947fdf9ef1SGreg Clayton { 1095de4ca5b7SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 10961ba7c4d0SGreg Clayton StreamString frame_description; 1097d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 10981ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 1099*35e1bda6SJim Ingham expr, options.GetUseDynamic(), frame_description.GetString().c_str()); 1100de4ca5b7SEnrico Granata #endif 1101d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 1102d9e416c0SGreg Clayton frame, 1103d4439aa9SEnrico Granata expr_value_sp, 1104*35e1bda6SJim Ingham options.ref()); 110581e871edSGreg Clayton expr_result.SetSP(expr_value_sp); 1106de4ca5b7SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1107f49e65aeSGreg Clayton Host::SetCrashDescription (NULL); 1108de4ca5b7SEnrico Granata #endif 11091d3afba3SGreg Clayton } 1110c9858e4dSGreg Clayton else 1111c9858e4dSGreg Clayton { 1112c9858e4dSGreg Clayton if (log) 1113c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression () => error: process is running", frame); 1114c9858e4dSGreg Clayton } 11157fdf9ef1SGreg Clayton } 11164838131bSGreg Clayton 1117cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1118a162ebafSSean Callanan if (expr_log) 111978a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 1120fe42ac4dSGreg Clayton expr_result.GetValue(), 1121fe42ac4dSGreg Clayton expr_result.GetSummary()); 1122a162ebafSSean Callanan 11234838131bSGreg Clayton if (log) 1124d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 1125d9e416c0SGreg Clayton frame, 112678a685aaSJim Ingham expr, 112781e871edSGreg Clayton expr_value_sp.get(), 112825f3a3cdSJohnny Chen exe_results); 1129cf7e2dc0SJason Molenda #endif 11304838131bSGreg Clayton 1131cfd1acedSGreg Clayton return expr_result; 11321d3afba3SGreg Clayton } 1133316d498bSGreg Clayton 1134316d498bSGreg Clayton bool 1135316d498bSGreg Clayton SBFrame::IsInlined() 1136316d498bSGreg Clayton { 11377fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1138d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1139d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1140d9e416c0SGreg Clayton if (frame && target) 1141316d498bSGreg Clayton { 11427fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11437fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 11447fdf9ef1SGreg Clayton { 11457fdf9ef1SGreg Clayton 1146d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1147316d498bSGreg Clayton if (block) 1148316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 1149316d498bSGreg Clayton } 1150c9858e4dSGreg Clayton else 1151c9858e4dSGreg Clayton { 1152c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1153c9858e4dSGreg Clayton if (log) 1154c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::IsInlined () => error: process is running", frame); 1155c9858e4dSGreg Clayton } 1156c9858e4dSGreg Clayton 11577fdf9ef1SGreg Clayton } 1158316d498bSGreg Clayton return false; 1159316d498bSGreg Clayton } 1160316d498bSGreg Clayton 1161316d498bSGreg Clayton const char * 1162316d498bSGreg Clayton SBFrame::GetFunctionName() 1163316d498bSGreg Clayton { 1164316d498bSGreg Clayton const char *name = NULL; 11657fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1166d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1167d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1168d9e416c0SGreg Clayton if (frame && target) 1169316d498bSGreg Clayton { 11707fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11717fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 11727fdf9ef1SGreg Clayton { 1173d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1174316d498bSGreg Clayton if (sc.block) 1175316d498bSGreg Clayton { 1176316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1177316d498bSGreg Clayton if (inlined_block) 1178316d498bSGreg Clayton { 1179316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1180316d498bSGreg Clayton name = inlined_info->GetName().AsCString(); 1181316d498bSGreg Clayton } 1182316d498bSGreg Clayton } 1183316d498bSGreg Clayton 1184316d498bSGreg Clayton if (name == NULL) 1185316d498bSGreg Clayton { 1186316d498bSGreg Clayton if (sc.function) 1187316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1188316d498bSGreg Clayton } 1189316d498bSGreg Clayton 1190316d498bSGreg Clayton if (name == NULL) 1191316d498bSGreg Clayton { 1192316d498bSGreg Clayton if (sc.symbol) 1193316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1194316d498bSGreg Clayton } 1195316d498bSGreg Clayton } 1196c9858e4dSGreg Clayton else 1197c9858e4dSGreg Clayton { 1198c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1199c9858e4dSGreg Clayton if (log) 1200c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFunctionName() => error: process is running", frame); 1201c9858e4dSGreg Clayton 1202c9858e4dSGreg Clayton } 12037fdf9ef1SGreg Clayton } 1204316d498bSGreg Clayton return name; 1205316d498bSGreg Clayton } 1206316d498bSGreg Clayton 1207