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" 4335e1bda6SJim 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 1177730b9a4SJim Ingham StackFrame *frame = NULL; 118d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1197730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1207730b9a4SJim Ingham if (target && process) 121af67cecdSGreg Clayton { 1227fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1237730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 1247730b9a4SJim Ingham { 1257730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1267730b9a4SJim Ingham if (frame) 1277fdf9ef1SGreg Clayton { 128d9e416c0SGreg Clayton sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope)); 129af67cecdSGreg Clayton } 130c9858e4dSGreg Clayton else 131c9858e4dSGreg Clayton { 132c9858e4dSGreg Clayton if (log) 1337730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame."); 1347730b9a4SJim Ingham } 1357730b9a4SJim Ingham } 1367730b9a4SJim Ingham else 1377730b9a4SJim Ingham { 1387730b9a4SJim Ingham if (log) 1397730b9a4SJim Ingham log->Printf ("SBFrame::GetSymbolContext () => error: process is running"); 140c9858e4dSGreg Clayton } 1417fdf9ef1SGreg Clayton } 142ceb6b139SCaroline Tice 143ceb6b139SCaroline Tice if (log) 1444838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)", 145d9e416c0SGreg Clayton frame, resolve_scope, sb_sym_ctx.get()); 146ceb6b139SCaroline Tice 14730fdc8d8SChris Lattner return sb_sym_ctx; 14830fdc8d8SChris Lattner } 14930fdc8d8SChris Lattner 15030fdc8d8SChris Lattner SBModule 15130fdc8d8SChris Lattner SBFrame::GetModule () const 15230fdc8d8SChris Lattner { 153c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 15472eff18aSGreg Clayton SBModule sb_module; 155acdbe816SGreg Clayton ModuleSP module_sp; 1564fc6cb9cSJim Ingham Mutex::Locker api_locker; 1574fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1584fc6cb9cSJim Ingham 1597730b9a4SJim Ingham StackFrame *frame = NULL; 160d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1617730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1627730b9a4SJim Ingham if (target && process) 163af67cecdSGreg Clayton { 1647fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1657730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 1667730b9a4SJim Ingham { 1677730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1687730b9a4SJim Ingham if (frame) 1697fdf9ef1SGreg Clayton { 170d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp; 171acdbe816SGreg Clayton sb_module.SetSP (module_sp); 172af67cecdSGreg Clayton } 173c9858e4dSGreg Clayton else 174c9858e4dSGreg Clayton { 175c9858e4dSGreg Clayton if (log) 1767730b9a4SJim Ingham log->Printf ("SBFrame::GetModule () => error: could not reconstruct frame object for this SBFrame."); 1777730b9a4SJim Ingham } 1787730b9a4SJim Ingham } 1797730b9a4SJim Ingham else 1807730b9a4SJim Ingham { 1817730b9a4SJim Ingham if (log) 1827730b9a4SJim Ingham log->Printf ("SBFrame::GetModule () => error: process is running"); 183c9858e4dSGreg Clayton } 1847fdf9ef1SGreg Clayton } 18572eff18aSGreg Clayton 1864838131bSGreg Clayton if (log) 1874838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)", 188d9e416c0SGreg Clayton frame, module_sp.get()); 1894838131bSGreg Clayton 19030fdc8d8SChris Lattner return sb_module; 19130fdc8d8SChris Lattner } 19230fdc8d8SChris Lattner 19330fdc8d8SChris Lattner SBCompileUnit 19430fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 19530fdc8d8SChris Lattner { 196c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 19772eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 1984fc6cb9cSJim Ingham Mutex::Locker api_locker; 1994fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2004fc6cb9cSJim Ingham 2017730b9a4SJim Ingham StackFrame *frame = NULL; 202d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2037730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 2047730b9a4SJim Ingham if (target && process) 205af67cecdSGreg Clayton { 2067fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2077730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 2087730b9a4SJim Ingham { 2097730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 2107730b9a4SJim Ingham if (frame) 2117fdf9ef1SGreg Clayton { 212d9e416c0SGreg Clayton sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 213af67cecdSGreg Clayton } 214c9858e4dSGreg Clayton else 215c9858e4dSGreg Clayton { 216ceb6b139SCaroline Tice if (log) 2177730b9a4SJim Ingham log->Printf ("SBFrame::GetCompileUnit () => error: could not reconstruct frame object for this SBFrame."); 2187730b9a4SJim Ingham } 2197730b9a4SJim Ingham } 2207730b9a4SJim Ingham else 2217730b9a4SJim Ingham { 2227730b9a4SJim Ingham if (log) 2237730b9a4SJim Ingham log->Printf ("SBFrame::GetCompileUnit () => error: process is running"); 224c9858e4dSGreg Clayton } 225c9858e4dSGreg Clayton } 226c9858e4dSGreg Clayton if (log) 227c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)", 228d9e416c0SGreg Clayton frame, sb_comp_unit.get()); 229ceb6b139SCaroline Tice 23030fdc8d8SChris Lattner return sb_comp_unit; 23130fdc8d8SChris Lattner } 23230fdc8d8SChris Lattner 23330fdc8d8SChris Lattner SBFunction 23430fdc8d8SChris Lattner SBFrame::GetFunction () const 23530fdc8d8SChris Lattner { 236c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 23772eff18aSGreg Clayton SBFunction sb_function; 2384fc6cb9cSJim Ingham Mutex::Locker api_locker; 2394fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2404fc6cb9cSJim Ingham 2417730b9a4SJim Ingham StackFrame *frame = NULL; 242d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2437730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 2447730b9a4SJim Ingham if (target && process) 245af67cecdSGreg Clayton { 2467fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2477730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 2487730b9a4SJim Ingham { 2497730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 2507730b9a4SJim Ingham if (frame) 2517fdf9ef1SGreg Clayton { 252d9e416c0SGreg Clayton sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function); 253af67cecdSGreg Clayton } 254c9858e4dSGreg Clayton else 255c9858e4dSGreg Clayton { 256c9858e4dSGreg Clayton if (log) 2577730b9a4SJim Ingham log->Printf ("SBFrame::GetFunction () => error: could not reconstruct frame object for this SBFrame."); 2587730b9a4SJim Ingham } 2597730b9a4SJim Ingham } 2607730b9a4SJim Ingham else 2617730b9a4SJim Ingham { 2627730b9a4SJim Ingham if (log) 2637730b9a4SJim Ingham log->Printf ("SBFrame::GetFunction () => error: process is running"); 2647fdf9ef1SGreg Clayton } 265c9858e4dSGreg Clayton } 2664838131bSGreg Clayton if (log) 2674838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)", 268d9e416c0SGreg Clayton frame, sb_function.get()); 2694838131bSGreg Clayton 27030fdc8d8SChris Lattner return sb_function; 27130fdc8d8SChris Lattner } 27230fdc8d8SChris Lattner 2733b06557eSGreg Clayton SBSymbol 2743b06557eSGreg Clayton SBFrame::GetSymbol () const 2753b06557eSGreg Clayton { 276c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 27772eff18aSGreg Clayton SBSymbol sb_symbol; 2784fc6cb9cSJim Ingham Mutex::Locker api_locker; 2794fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2804fc6cb9cSJim Ingham 2817730b9a4SJim Ingham StackFrame *frame = NULL; 282d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2837730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 2847730b9a4SJim Ingham if (target && process) 285af67cecdSGreg Clayton { 2867fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2877730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 2887730b9a4SJim Ingham { 2897730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 2907730b9a4SJim Ingham if (frame) 2917fdf9ef1SGreg Clayton { 292d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol); 293af67cecdSGreg Clayton } 294c9858e4dSGreg Clayton else 295c9858e4dSGreg Clayton { 296c9858e4dSGreg Clayton if (log) 2977730b9a4SJim Ingham log->Printf ("SBFrame::GetSymbol () => error: could not reconstruct frame object for this SBFrame."); 2987730b9a4SJim Ingham } 2997730b9a4SJim Ingham } 3007730b9a4SJim Ingham else 3017730b9a4SJim Ingham { 3027730b9a4SJim Ingham if (log) 3037730b9a4SJim Ingham log->Printf ("SBFrame::GetSymbol () => error: process is running"); 3047fdf9ef1SGreg Clayton } 305c9858e4dSGreg Clayton } 3064838131bSGreg Clayton if (log) 3074838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 308d9e416c0SGreg Clayton frame, sb_symbol.get()); 3093b06557eSGreg Clayton return sb_symbol; 3103b06557eSGreg Clayton } 3113b06557eSGreg Clayton 31230fdc8d8SChris Lattner SBBlock 31330fdc8d8SChris Lattner SBFrame::GetBlock () const 31430fdc8d8SChris Lattner { 315c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 31672eff18aSGreg Clayton SBBlock sb_block; 3174fc6cb9cSJim Ingham Mutex::Locker api_locker; 3184fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3194fc6cb9cSJim Ingham 3207730b9a4SJim Ingham StackFrame *frame = NULL; 321d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3227730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 3237730b9a4SJim Ingham if (target && process) 324af67cecdSGreg Clayton { 3257fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3267730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 3277730b9a4SJim Ingham { 3287730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 3297730b9a4SJim Ingham if (frame) 3307fdf9ef1SGreg Clayton { 331d9e416c0SGreg Clayton sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block); 332af67cecdSGreg Clayton } 333c9858e4dSGreg Clayton else 334c9858e4dSGreg Clayton { 335c9858e4dSGreg Clayton if (log) 3367730b9a4SJim Ingham log->Printf ("SBFrame::GetBlock () => error: could not reconstruct frame object for this SBFrame."); 3377730b9a4SJim Ingham } 3387730b9a4SJim Ingham } 3397730b9a4SJim Ingham else 3407730b9a4SJim Ingham { 3417730b9a4SJim Ingham if (log) 342c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", frame); 3437fdf9ef1SGreg Clayton } 344c9858e4dSGreg Clayton } 3454838131bSGreg Clayton if (log) 3464838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)", 347d9e416c0SGreg Clayton frame, sb_block.GetPtr()); 34830fdc8d8SChris Lattner return sb_block; 34930fdc8d8SChris Lattner } 35030fdc8d8SChris Lattner 35195897c6aSGreg Clayton SBBlock 35295897c6aSGreg Clayton SBFrame::GetFrameBlock () const 35395897c6aSGreg Clayton { 35472eff18aSGreg Clayton SBBlock sb_block; 3554fc6cb9cSJim Ingham Mutex::Locker api_locker; 3564fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3574fc6cb9cSJim Ingham 3587730b9a4SJim Ingham StackFrame *frame = NULL; 359d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 360c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3617730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 3627730b9a4SJim Ingham if (target && process) 363af67cecdSGreg Clayton { 3647fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3657730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 3667730b9a4SJim Ingham { 3677730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 3687730b9a4SJim Ingham if (frame) 3697fdf9ef1SGreg Clayton { 370d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock ()); 371af67cecdSGreg Clayton } 372c9858e4dSGreg Clayton else 373c9858e4dSGreg Clayton { 374c9858e4dSGreg Clayton if (log) 3757730b9a4SJim Ingham log->Printf ("SBFrame::GetFrameBlock () => error: could not reconstruct frame object for this SBFrame."); 3767730b9a4SJim Ingham } 3777730b9a4SJim Ingham } 3787730b9a4SJim Ingham else 3797730b9a4SJim Ingham { 3807730b9a4SJim Ingham if (log) 3817730b9a4SJim Ingham log->Printf ("SBFrame::GetFrameBlock () => error: process is running"); 3827fdf9ef1SGreg Clayton } 383c9858e4dSGreg Clayton } 3844838131bSGreg Clayton if (log) 3854838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 386d9e416c0SGreg Clayton frame, sb_block.GetPtr()); 38795897c6aSGreg Clayton return sb_block; 38895897c6aSGreg Clayton } 38995897c6aSGreg Clayton 39030fdc8d8SChris Lattner SBLineEntry 39130fdc8d8SChris Lattner SBFrame::GetLineEntry () const 39230fdc8d8SChris Lattner { 393c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 39472eff18aSGreg Clayton SBLineEntry sb_line_entry; 3954fc6cb9cSJim Ingham Mutex::Locker api_locker; 3964fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3974fc6cb9cSJim Ingham 3987730b9a4SJim Ingham StackFrame *frame = NULL; 399d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4007730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 4017730b9a4SJim Ingham if (target && process) 402af67cecdSGreg Clayton { 4037fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4047730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 4057730b9a4SJim Ingham { 4067730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 4077730b9a4SJim Ingham if (frame) 4087fdf9ef1SGreg Clayton { 409d9e416c0SGreg Clayton sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry); 410af67cecdSGreg Clayton } 411c9858e4dSGreg Clayton else 412c9858e4dSGreg Clayton { 413c9858e4dSGreg Clayton if (log) 4147730b9a4SJim Ingham log->Printf ("SBFrame::GetLineEntry () => error: could not reconstruct frame object for this SBFrame."); 4157730b9a4SJim Ingham } 4167730b9a4SJim Ingham } 4177730b9a4SJim Ingham else 4187730b9a4SJim Ingham { 4197730b9a4SJim Ingham if (log) 4207730b9a4SJim Ingham log->Printf ("SBFrame::GetLineEntry () => error: process is running"); 4217fdf9ef1SGreg Clayton } 422c9858e4dSGreg Clayton } 4234838131bSGreg Clayton if (log) 4244838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 425d9e416c0SGreg Clayton frame, sb_line_entry.get()); 42630fdc8d8SChris Lattner return sb_line_entry; 42730fdc8d8SChris Lattner } 42830fdc8d8SChris Lattner 42930fdc8d8SChris Lattner uint32_t 43030fdc8d8SChris Lattner SBFrame::GetFrameID () const 43130fdc8d8SChris Lattner { 432b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 433b9556accSGreg Clayton 4347fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 435d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 4367fdf9ef1SGreg Clayton if (frame) 437d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex (); 4384838131bSGreg Clayton 43969b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4404838131bSGreg Clayton if (log) 4414838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameID () => %u", 442d9e416c0SGreg Clayton frame, frame_idx); 4434838131bSGreg Clayton return frame_idx; 44430fdc8d8SChris Lattner } 44530fdc8d8SChris Lattner 44669b582faSGreg Clayton addr_t 44730fdc8d8SChris Lattner SBFrame::GetPC () const 44830fdc8d8SChris Lattner { 449c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 45069b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 4514fc6cb9cSJim Ingham Mutex::Locker api_locker; 4524fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4534fc6cb9cSJim Ingham 4547730b9a4SJim Ingham StackFrame *frame = NULL; 455d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4567730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 4577730b9a4SJim Ingham if (target && process) 458af67cecdSGreg Clayton { 4597fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4607730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 4617730b9a4SJim Ingham { 4627730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 4637730b9a4SJim Ingham if (frame) 4647fdf9ef1SGreg Clayton { 465d9e416c0SGreg Clayton addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target); 466af67cecdSGreg Clayton } 467c9858e4dSGreg Clayton else 468c9858e4dSGreg Clayton { 469c9858e4dSGreg Clayton if (log) 4707730b9a4SJim Ingham log->Printf ("SBFrame::GetPC () => error: could not reconstruct frame object for this SBFrame."); 4717730b9a4SJim Ingham } 4727730b9a4SJim Ingham } 4737730b9a4SJim Ingham else 4747730b9a4SJim Ingham { 4757730b9a4SJim Ingham if (log) 4767730b9a4SJim Ingham log->Printf ("SBFrame::GetPC () => error: process is running"); 477c9858e4dSGreg Clayton } 4787fdf9ef1SGreg Clayton } 479ceb6b139SCaroline Tice 480ceb6b139SCaroline Tice if (log) 481d01b2953SDaniel Malea log->Printf ("SBFrame(%p)::GetPC () => 0x%" PRIx64, frame, addr); 482ceb6b139SCaroline Tice 483ceb6b139SCaroline Tice return addr; 48430fdc8d8SChris Lattner } 48530fdc8d8SChris Lattner 48630fdc8d8SChris Lattner bool 48769b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc) 48830fdc8d8SChris Lattner { 489c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 490ceb6b139SCaroline Tice bool ret_val = false; 4914fc6cb9cSJim Ingham Mutex::Locker api_locker; 4924fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4934fc6cb9cSJim Ingham 4947730b9a4SJim Ingham StackFrame *frame = NULL; 495d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4967730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 4977730b9a4SJim Ingham if (target && process) 498af67cecdSGreg Clayton { 4997fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5007730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 5017730b9a4SJim Ingham { 5027730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5037730b9a4SJim Ingham if (frame) 5047fdf9ef1SGreg Clayton { 505d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC (new_pc); 506af67cecdSGreg Clayton } 507c9858e4dSGreg Clayton else 508c9858e4dSGreg Clayton { 509c9858e4dSGreg Clayton if (log) 5107730b9a4SJim Ingham log->Printf ("SBFrame::SetPC () => error: could not reconstruct frame object for this SBFrame."); 5117730b9a4SJim Ingham } 5127730b9a4SJim Ingham } 5137730b9a4SJim Ingham else 5147730b9a4SJim Ingham { 5157730b9a4SJim Ingham if (log) 5167730b9a4SJim Ingham log->Printf ("SBFrame::SetPC () => error: process is running"); 517c9858e4dSGreg Clayton } 5187fdf9ef1SGreg Clayton } 519ceb6b139SCaroline Tice 520ceb6b139SCaroline Tice if (log) 521d01b2953SDaniel Malea log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i", 522d9e416c0SGreg Clayton frame, new_pc, ret_val); 523ceb6b139SCaroline Tice 524ceb6b139SCaroline Tice return ret_val; 52530fdc8d8SChris Lattner } 52630fdc8d8SChris Lattner 52769b582faSGreg Clayton addr_t 52830fdc8d8SChris Lattner SBFrame::GetSP () const 52930fdc8d8SChris Lattner { 530c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5314838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 5324fc6cb9cSJim Ingham Mutex::Locker api_locker; 5334fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5344fc6cb9cSJim Ingham 5357730b9a4SJim Ingham StackFrame *frame = NULL; 536d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5377730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 5387730b9a4SJim Ingham if (target && process) 539af67cecdSGreg Clayton { 5407fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5417730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 5427730b9a4SJim Ingham { 5437730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5447730b9a4SJim Ingham if (frame) 5457fdf9ef1SGreg Clayton { 546d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 547af67cecdSGreg Clayton } 548c9858e4dSGreg Clayton else 549c9858e4dSGreg Clayton { 550c9858e4dSGreg Clayton if (log) 5517730b9a4SJim Ingham log->Printf ("SBFrame::GetSP () => error: could not reconstruct frame object for this SBFrame."); 5527730b9a4SJim Ingham } 5537730b9a4SJim Ingham } 5547730b9a4SJim Ingham else 5557730b9a4SJim Ingham { 5567730b9a4SJim Ingham if (log) 5577730b9a4SJim Ingham log->Printf ("SBFrame::GetSP () => error: process is running"); 5587fdf9ef1SGreg Clayton } 559c9858e4dSGreg Clayton } 5604838131bSGreg Clayton if (log) 561d01b2953SDaniel Malea log->Printf ("SBFrame(%p)::GetSP () => 0x%" PRIx64, frame, addr); 5624838131bSGreg Clayton 5634838131bSGreg Clayton return addr; 56430fdc8d8SChris Lattner } 56530fdc8d8SChris Lattner 56630fdc8d8SChris Lattner 56769b582faSGreg Clayton addr_t 56830fdc8d8SChris Lattner SBFrame::GetFP () const 56930fdc8d8SChris Lattner { 570c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 57169b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 5724fc6cb9cSJim Ingham Mutex::Locker api_locker; 5734fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5744fc6cb9cSJim Ingham 5757730b9a4SJim Ingham StackFrame *frame = NULL; 576d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5777730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 5787730b9a4SJim Ingham if (target && process) 579af67cecdSGreg Clayton { 5807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5817730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 5827730b9a4SJim Ingham { 5837730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5847730b9a4SJim Ingham if (frame) 5857fdf9ef1SGreg Clayton { 586d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 587af67cecdSGreg Clayton } 588c9858e4dSGreg Clayton else 589c9858e4dSGreg Clayton { 590c9858e4dSGreg Clayton if (log) 5917730b9a4SJim Ingham log->Printf ("SBFrame::GetFP () => error: could not reconstruct frame object for this SBFrame."); 5927730b9a4SJim Ingham } 5937730b9a4SJim Ingham } 5947730b9a4SJim Ingham else 5957730b9a4SJim Ingham { 5967730b9a4SJim Ingham if (log) 5977730b9a4SJim Ingham log->Printf ("SBFrame::GetFP () => error: process is running"); 598c9858e4dSGreg Clayton } 5997fdf9ef1SGreg Clayton } 600ceb6b139SCaroline Tice 601ceb6b139SCaroline Tice if (log) 602d01b2953SDaniel Malea log->Printf ("SBFrame(%p)::GetFP () => 0x%" PRIx64, frame, addr); 603ceb6b139SCaroline Tice return addr; 60430fdc8d8SChris Lattner } 60530fdc8d8SChris Lattner 60630fdc8d8SChris Lattner 60730fdc8d8SChris Lattner SBAddress 60830fdc8d8SChris Lattner SBFrame::GetPCAddress () const 60930fdc8d8SChris Lattner { 610c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 61130fdc8d8SChris Lattner SBAddress sb_addr; 6124fc6cb9cSJim Ingham Mutex::Locker api_locker; 6134fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 6144fc6cb9cSJim Ingham 615d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 616d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6177730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 6187730b9a4SJim Ingham if (target && process) 619af67cecdSGreg Clayton { 6207fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6217730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 6227730b9a4SJim Ingham { 6237730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 6247730b9a4SJim Ingham if (frame) 6257fdf9ef1SGreg Clayton { 626d9e416c0SGreg Clayton sb_addr.SetAddress (&frame->GetFrameCodeAddress()); 627af67cecdSGreg Clayton } 628c9858e4dSGreg Clayton else 629c9858e4dSGreg Clayton { 630c9858e4dSGreg Clayton if (log) 6317730b9a4SJim Ingham log->Printf ("SBFrame::GetPCAddress () => error: could not reconstruct frame object for this SBFrame."); 6327730b9a4SJim Ingham } 6337730b9a4SJim Ingham } 6347730b9a4SJim Ingham else 6357730b9a4SJim Ingham { 6367730b9a4SJim Ingham if (log) 6377730b9a4SJim Ingham log->Printf ("SBFrame::GetPCAddress () => error: process is running"); 6387fdf9ef1SGreg Clayton } 639c9858e4dSGreg Clayton } 6404838131bSGreg Clayton if (log) 641d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get()); 64230fdc8d8SChris Lattner return sb_addr; 64330fdc8d8SChris Lattner } 64430fdc8d8SChris Lattner 64530fdc8d8SChris Lattner void 64630fdc8d8SChris Lattner SBFrame::Clear() 64730fdc8d8SChris Lattner { 648af2589eaSGreg Clayton m_opaque_sp->Clear(); 64930fdc8d8SChris Lattner } 65030fdc8d8SChris Lattner 6517edbdfc9SGreg Clayton lldb::SBValue 6527edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path) 6537edbdfc9SGreg Clayton { 6547edbdfc9SGreg Clayton SBValue sb_value; 6557fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 656d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 657d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 658d9e416c0SGreg Clayton if (frame && target) 6597edbdfc9SGreg Clayton { 660d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 6617edbdfc9SGreg Clayton sb_value = GetValueForVariablePath (var_path, use_dynamic); 6627edbdfc9SGreg Clayton } 6637edbdfc9SGreg Clayton return sb_value; 6647edbdfc9SGreg Clayton } 6657edbdfc9SGreg Clayton 6667edbdfc9SGreg Clayton lldb::SBValue 6677edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic) 6687edbdfc9SGreg Clayton { 6697edbdfc9SGreg Clayton SBValue sb_value; 6704fc6cb9cSJim Ingham Mutex::Locker api_locker; 6717730b9a4SJim Ingham LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6727730b9a4SJim Ingham if (var_path == NULL || var_path[0] == '\0') 6737730b9a4SJim Ingham { 6747730b9a4SJim Ingham if (log) 6757730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath called with empty variable path."); 6767730b9a4SJim Ingham return sb_value; 6777730b9a4SJim Ingham } 6787730b9a4SJim Ingham 6794fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 6804fc6cb9cSJim Ingham 681d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 682d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6837730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 6847730b9a4SJim Ingham if (target && process) 6857edbdfc9SGreg Clayton { 6867fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6877730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 6887730b9a4SJim Ingham { 6897730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 6907730b9a4SJim Ingham if (frame) 6917fdf9ef1SGreg Clayton { 6927edbdfc9SGreg Clayton VariableSP var_sp; 6937edbdfc9SGreg Clayton Error error; 694d9e416c0SGreg Clayton ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path, 695e3e91517SEnrico Granata eNoDynamicValues, 696685c88c5SGreg Clayton StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 6977edbdfc9SGreg Clayton var_sp, 6987edbdfc9SGreg Clayton error)); 699e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 7007edbdfc9SGreg Clayton } 701c9858e4dSGreg Clayton else 702c9858e4dSGreg Clayton { 703c9858e4dSGreg Clayton if (log) 7047730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath () => error: could not reconstruct frame object for this SBFrame."); 7057730b9a4SJim Ingham } 7067730b9a4SJim Ingham } 7077730b9a4SJim Ingham else 7087730b9a4SJim Ingham { 7097730b9a4SJim Ingham if (log) 7107730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath () => error: process is running"); 711c9858e4dSGreg Clayton } 7127fdf9ef1SGreg Clayton } 7137edbdfc9SGreg Clayton return sb_value; 7147edbdfc9SGreg Clayton } 7157edbdfc9SGreg Clayton 71630fdc8d8SChris Lattner SBValue 71769b582faSGreg Clayton SBFrame::FindVariable (const char *name) 71830fdc8d8SChris Lattner { 719316d498bSGreg Clayton SBValue value; 7207fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 721d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 722d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 723d9e416c0SGreg Clayton if (frame && target) 724316d498bSGreg Clayton { 725d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 726316d498bSGreg Clayton value = FindVariable (name, use_dynamic); 727316d498bSGreg Clayton } 728316d498bSGreg Clayton return value; 72978a685aaSJim Ingham } 73078a685aaSJim Ingham 7317edbdfc9SGreg Clayton 73278a685aaSJim Ingham SBValue 7332837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic) 73478a685aaSJim Ingham { 735c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 73669b582faSGreg Clayton VariableSP var_sp; 73758b59f95SJim Ingham SBValue sb_value; 7387730b9a4SJim Ingham 7397730b9a4SJim Ingham if (name == NULL || name[0] == '\0') 7407730b9a4SJim Ingham { 7417730b9a4SJim Ingham if (log) 7427730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable called with empty name"); 7437730b9a4SJim Ingham return sb_value; 7447730b9a4SJim Ingham } 7457730b9a4SJim Ingham 74681e871edSGreg Clayton ValueObjectSP value_sp; 7474fc6cb9cSJim Ingham Mutex::Locker api_locker; 7484fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 7494fc6cb9cSJim Ingham 7507730b9a4SJim Ingham StackFrame *frame = NULL; 751d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7527730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 7537730b9a4SJim Ingham if (target && process) 75430fdc8d8SChris Lattner { 7557fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7567730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 7577730b9a4SJim Ingham { 7587730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 7597730b9a4SJim Ingham if (frame) 7607fdf9ef1SGreg Clayton { 76169b582faSGreg Clayton VariableList variable_list; 762d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 76330fdc8d8SChris Lattner 76472eff18aSGreg Clayton if (sc.block) 76530fdc8d8SChris Lattner { 76672eff18aSGreg Clayton const bool can_create = true; 76772eff18aSGreg Clayton const bool get_parent_variables = true; 76872eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 76972eff18aSGreg Clayton 77072eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 77172eff18aSGreg Clayton get_parent_variables, 77272eff18aSGreg Clayton stop_if_block_is_inlined_function, 77372eff18aSGreg Clayton &variable_list)) 77472eff18aSGreg Clayton { 77569b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 77630fdc8d8SChris Lattner } 77772eff18aSGreg Clayton } 77830fdc8d8SChris Lattner 7794838131bSGreg Clayton if (var_sp) 78081e871edSGreg Clayton { 781e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues); 782e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 78381e871edSGreg Clayton } 7847fdf9ef1SGreg Clayton } 785c9858e4dSGreg Clayton else 786c9858e4dSGreg Clayton { 787c9858e4dSGreg Clayton if (log) 7887730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame."); 7897730b9a4SJim Ingham } 7907730b9a4SJim Ingham } 7917730b9a4SJim Ingham else 7927730b9a4SJim Ingham { 7937730b9a4SJim Ingham if (log) 7947730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable () => error: process is running"); 795c9858e4dSGreg Clayton } 796316d498bSGreg Clayton } 797316d498bSGreg Clayton 7984838131bSGreg Clayton if (log) 79969b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 800d9e416c0SGreg Clayton frame, name, value_sp.get()); 8014838131bSGreg Clayton 802dde9cff3SCaroline Tice return sb_value; 803dde9cff3SCaroline Tice } 804dde9cff3SCaroline Tice 80530fdc8d8SChris Lattner SBValue 80669b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 80730fdc8d8SChris Lattner { 808316d498bSGreg Clayton SBValue value; 8097fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 810d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 811d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 812d9e416c0SGreg Clayton if (frame && target) 813316d498bSGreg Clayton { 814d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 815316d498bSGreg Clayton value = FindValue (name, value_type, use_dynamic); 816316d498bSGreg Clayton } 817316d498bSGreg Clayton return value; 81878a685aaSJim Ingham } 81978a685aaSJim Ingham 82078a685aaSJim Ingham SBValue 8212837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) 82278a685aaSJim Ingham { 823c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 82469b582faSGreg Clayton SBValue sb_value; 8257730b9a4SJim Ingham 8267730b9a4SJim Ingham if (name == NULL || name[0] == '\0') 8277730b9a4SJim Ingham { 8287730b9a4SJim Ingham if (log) 8297730b9a4SJim Ingham log->Printf ("SBFrame::FindValue called with empty name."); 8307730b9a4SJim Ingham return sb_value; 8317730b9a4SJim Ingham } 8327730b9a4SJim Ingham 83381e871edSGreg Clayton ValueObjectSP value_sp; 8344fc6cb9cSJim Ingham Mutex::Locker api_locker; 8354fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 8364fc6cb9cSJim Ingham 8377730b9a4SJim Ingham StackFrame *frame = NULL; 838d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 8397730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 8407730b9a4SJim Ingham if (target && process) 84130fdc8d8SChris Lattner { 8427fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8437730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 8447730b9a4SJim Ingham { 8457730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 8467730b9a4SJim Ingham if (frame) 8477fdf9ef1SGreg Clayton { 84869b582faSGreg Clayton switch (value_type) 84930fdc8d8SChris Lattner { 85069b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 85169b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 85269b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 85369b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 85469b582faSGreg Clayton { 855d9e416c0SGreg Clayton VariableList *variable_list = frame->GetVariableList(true); 85672eff18aSGreg Clayton 857d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 85872eff18aSGreg Clayton 85972eff18aSGreg Clayton const bool can_create = true; 86072eff18aSGreg Clayton const bool get_parent_variables = true; 86172eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 86272eff18aSGreg Clayton 86372eff18aSGreg Clayton if (sc.block && sc.block->AppendVariables (can_create, 86472eff18aSGreg Clayton get_parent_variables, 86572eff18aSGreg Clayton stop_if_block_is_inlined_function, 866e85d9cb8SJohnny Chen variable_list)) 867beae523aSJohnny Chen { 86869b582faSGreg Clayton ConstString const_name(name); 869e85d9cb8SJohnny Chen const uint32_t num_variables = variable_list->GetSize(); 87072eff18aSGreg Clayton for (uint32_t i = 0; i < num_variables; ++i) 87130fdc8d8SChris Lattner { 87269b582faSGreg Clayton VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 87369b582faSGreg Clayton if (variable_sp && 87469b582faSGreg Clayton variable_sp->GetScope() == value_type && 87569b582faSGreg Clayton variable_sp->GetName() == const_name) 876beae523aSJohnny Chen { 877e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues); 878e3e91517SEnrico Granata sb_value.SetSP (value_sp, use_dynamic); 879beae523aSJohnny Chen break; 880beae523aSJohnny Chen } 88130fdc8d8SChris Lattner } 88230fdc8d8SChris Lattner } 88330fdc8d8SChris Lattner } 88469b582faSGreg Clayton break; 88569b582faSGreg Clayton 88669b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 88769b582faSGreg Clayton { 888d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 88969b582faSGreg Clayton if (reg_ctx) 89069b582faSGreg Clayton { 89169b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 89269b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 89369b582faSGreg Clayton { 89469b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 89569b582faSGreg Clayton if (reg_info && 89669b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 89769b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 89869b582faSGreg Clayton { 899d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 90081e871edSGreg Clayton sb_value.SetSP (value_sp); 90181e871edSGreg Clayton break; 90269b582faSGreg Clayton } 90369b582faSGreg Clayton } 90469b582faSGreg Clayton } 90569b582faSGreg Clayton } 90669b582faSGreg Clayton break; 90769b582faSGreg Clayton 90869b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 90969b582faSGreg Clayton { 910d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 91169b582faSGreg Clayton if (reg_ctx) 91269b582faSGreg Clayton { 91369b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 91469b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 91569b582faSGreg Clayton { 91669b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 91769b582faSGreg Clayton if (reg_set && 91869b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 91969b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 92069b582faSGreg Clayton { 921d9e416c0SGreg Clayton value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx); 92281e871edSGreg Clayton sb_value.SetSP (value_sp); 92381e871edSGreg Clayton break; 92469b582faSGreg Clayton } 92569b582faSGreg Clayton } 92669b582faSGreg Clayton } 92769b582faSGreg Clayton } 92869b582faSGreg Clayton break; 92969b582faSGreg Clayton 93069b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 93169b582faSGreg Clayton { 93269b582faSGreg Clayton ConstString const_name(name); 933d9e416c0SGreg Clayton ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name)); 93469b582faSGreg Clayton if (expr_var_sp) 93581e871edSGreg Clayton { 93681e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 937e3e91517SEnrico Granata sb_value.SetSP (value_sp, use_dynamic); 93881e871edSGreg Clayton } 93969b582faSGreg Clayton } 94069b582faSGreg Clayton break; 94169b582faSGreg Clayton 94269b582faSGreg Clayton default: 94369b582faSGreg Clayton break; 94469b582faSGreg Clayton } 945beae523aSJohnny Chen } 946c9858e4dSGreg Clayton else 947c9858e4dSGreg Clayton { 948c9858e4dSGreg Clayton if (log) 9497730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame."); 9507730b9a4SJim Ingham } 9517730b9a4SJim Ingham } 9527730b9a4SJim Ingham else 9537730b9a4SJim Ingham { 9547730b9a4SJim Ingham if (log) 9557730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: process is running"); 956c9858e4dSGreg Clayton } 9577fdf9ef1SGreg Clayton } 958dde9cff3SCaroline Tice 9594838131bSGreg Clayton if (log) 96069b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 961d9e416c0SGreg Clayton frame, name, value_type, value_sp.get()); 9624838131bSGreg Clayton 9634838131bSGreg Clayton 964dde9cff3SCaroline Tice return sb_value; 965dde9cff3SCaroline Tice } 966dde9cff3SCaroline Tice 96730fdc8d8SChris Lattner bool 96835e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const 96935e2ab60SJohnny Chen { 97035e2ab60SJohnny Chen lldb::StackFrameSP this_sp = GetFrameSP(); 97135e2ab60SJohnny Chen lldb::StackFrameSP that_sp = that.GetFrameSP(); 97235e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 97335e2ab60SJohnny Chen } 97435e2ab60SJohnny Chen 97535e2ab60SJohnny Chen bool 97630fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 97730fdc8d8SChris Lattner { 97835e2ab60SJohnny Chen return IsEqual(rhs); 97930fdc8d8SChris Lattner } 98030fdc8d8SChris Lattner 98130fdc8d8SChris Lattner bool 98230fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 98330fdc8d8SChris Lattner { 98435e2ab60SJohnny Chen return !IsEqual(rhs); 985481cef25SGreg Clayton } 98630fdc8d8SChris Lattner 98730fdc8d8SChris Lattner SBThread 98830fdc8d8SChris Lattner SBFrame::GetThread () const 98930fdc8d8SChris Lattner { 99069b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 991ceb6b139SCaroline Tice 9927fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 993d9e416c0SGreg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 994d9e416c0SGreg Clayton SBThread sb_thread (thread_sp); 995ceb6b139SCaroline Tice 996ceb6b139SCaroline Tice if (log) 997750cd175SCaroline Tice { 998750cd175SCaroline Tice SBStream sstr; 999750cd175SCaroline Tice sb_thread.GetDescription (sstr); 1000d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", 1001d9e416c0SGreg Clayton exe_ctx.GetFramePtr(), 1002d9e416c0SGreg Clayton thread_sp.get(), 1003d9e416c0SGreg Clayton sstr.GetData()); 1004750cd175SCaroline Tice } 1005ceb6b139SCaroline Tice 100630fdc8d8SChris Lattner return sb_thread; 100730fdc8d8SChris Lattner } 100830fdc8d8SChris Lattner 100930fdc8d8SChris Lattner const char * 101030fdc8d8SChris Lattner SBFrame::Disassemble () const 101130fdc8d8SChris Lattner { 1012c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 10134838131bSGreg Clayton const char *disassembly = NULL; 10144fc6cb9cSJim Ingham Mutex::Locker api_locker; 10154fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10164fc6cb9cSJim Ingham 10177730b9a4SJim Ingham StackFrame *frame = NULL; 1018d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 10197730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10207730b9a4SJim Ingham if (target && process) 1021af67cecdSGreg Clayton { 10227fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10237730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 10247730b9a4SJim Ingham { 10257730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 10267730b9a4SJim Ingham if (frame) 10277fdf9ef1SGreg Clayton { 1028d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 1029af67cecdSGreg Clayton } 1030c9858e4dSGreg Clayton else 1031c9858e4dSGreg Clayton { 1032c9858e4dSGreg Clayton if (log) 10337730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame."); 10347730b9a4SJim Ingham } 10357730b9a4SJim Ingham } 10367730b9a4SJim Ingham else 10377730b9a4SJim Ingham { 10387730b9a4SJim Ingham if (log) 10397730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: process is running"); 10407fdf9ef1SGreg Clayton } 1041c9858e4dSGreg Clayton } 10424838131bSGreg Clayton 10434838131bSGreg Clayton if (log) 1044d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly); 10454838131bSGreg Clayton 10464838131bSGreg Clayton return disassembly; 104730fdc8d8SChris Lattner } 104830fdc8d8SChris Lattner 104930fdc8d8SChris Lattner 105030fdc8d8SChris Lattner SBValueList 105130fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 105230fdc8d8SChris Lattner bool locals, 105330fdc8d8SChris Lattner bool statics, 105430fdc8d8SChris Lattner bool in_scope_only) 105530fdc8d8SChris Lattner { 1056316d498bSGreg Clayton SBValueList value_list; 10577fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1058d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1059d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1060d9e416c0SGreg Clayton if (frame && target) 1061316d498bSGreg Clayton { 1062d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 1063316d498bSGreg Clayton value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic); 1064316d498bSGreg Clayton } 1065316d498bSGreg Clayton return value_list; 106678a685aaSJim Ingham } 106778a685aaSJim Ingham 106878a685aaSJim Ingham SBValueList 106978a685aaSJim Ingham SBFrame::GetVariables (bool arguments, 107078a685aaSJim Ingham bool locals, 107178a685aaSJim Ingham bool statics, 107278a685aaSJim Ingham bool in_scope_only, 10732837b766SJim Ingham lldb::DynamicValueType use_dynamic) 107478a685aaSJim Ingham { 107569b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1076ceb6b139SCaroline Tice 1077b9556accSGreg Clayton SBValueList value_list; 10784fc6cb9cSJim Ingham Mutex::Locker api_locker; 10794fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10804fc6cb9cSJim Ingham 10817730b9a4SJim Ingham StackFrame *frame = NULL; 1082d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1083b9556accSGreg Clayton 1084ceb6b139SCaroline Tice if (log) 10857730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 10864838131bSGreg Clayton arguments, 10874838131bSGreg Clayton locals, 10884838131bSGreg Clayton statics, 10894838131bSGreg Clayton in_scope_only); 1090ceb6b139SCaroline Tice 10917730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10927730b9a4SJim Ingham if (target && process) 109330fdc8d8SChris Lattner { 10947fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10957730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 10967fdf9ef1SGreg Clayton { 10977730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 10987730b9a4SJim Ingham if (frame) 10997730b9a4SJim Ingham { 110030fdc8d8SChris Lattner size_t i; 1101af67cecdSGreg Clayton VariableList *variable_list = NULL; 1102d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 110330fdc8d8SChris Lattner if (variable_list) 110430fdc8d8SChris Lattner { 110530fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 110630fdc8d8SChris Lattner if (num_variables) 110730fdc8d8SChris Lattner { 110830fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 110930fdc8d8SChris Lattner { 111030fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 111130fdc8d8SChris Lattner if (variable_sp) 111230fdc8d8SChris Lattner { 111330fdc8d8SChris Lattner bool add_variable = false; 111430fdc8d8SChris Lattner switch (variable_sp->GetScope()) 111530fdc8d8SChris Lattner { 111630fdc8d8SChris Lattner case eValueTypeVariableGlobal: 111730fdc8d8SChris Lattner case eValueTypeVariableStatic: 111830fdc8d8SChris Lattner add_variable = statics; 111930fdc8d8SChris Lattner break; 112030fdc8d8SChris Lattner 112130fdc8d8SChris Lattner case eValueTypeVariableArgument: 112230fdc8d8SChris Lattner add_variable = arguments; 112330fdc8d8SChris Lattner break; 112430fdc8d8SChris Lattner 112530fdc8d8SChris Lattner case eValueTypeVariableLocal: 112630fdc8d8SChris Lattner add_variable = locals; 112730fdc8d8SChris Lattner break; 1128c982c768SGreg Clayton 1129c982c768SGreg Clayton default: 1130c982c768SGreg Clayton break; 113130fdc8d8SChris Lattner } 113230fdc8d8SChris Lattner if (add_variable) 113330fdc8d8SChris Lattner { 1134d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 113530fdc8d8SChris Lattner continue; 113630fdc8d8SChris Lattner 1137e3e91517SEnrico Granata ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues)); 1138e3e91517SEnrico Granata SBValue value_sb; 1139e3e91517SEnrico Granata value_sb.SetSP(valobj_sp,use_dynamic); 1140e3e91517SEnrico Granata value_list.Append(value_sb); 114130fdc8d8SChris Lattner } 114230fdc8d8SChris Lattner } 114330fdc8d8SChris Lattner } 114430fdc8d8SChris Lattner } 114530fdc8d8SChris Lattner } 114630fdc8d8SChris Lattner } 1147c9858e4dSGreg Clayton else 1148c9858e4dSGreg Clayton { 1149c9858e4dSGreg Clayton if (log) 11507730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame."); 11517730b9a4SJim Ingham } 11527730b9a4SJim Ingham } 11537730b9a4SJim Ingham else 11547730b9a4SJim Ingham { 11557730b9a4SJim Ingham if (log) 11567730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: process is running"); 1157c9858e4dSGreg Clayton } 11587fdf9ef1SGreg Clayton } 1159ceb6b139SCaroline Tice 1160ceb6b139SCaroline Tice if (log) 1161ceb6b139SCaroline Tice { 1162*08ec0b61SEnrico Granata log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame, value_list.opaque_ptr()); 1163ceb6b139SCaroline Tice } 1164ceb6b139SCaroline Tice 116530fdc8d8SChris Lattner return value_list; 116630fdc8d8SChris Lattner } 116730fdc8d8SChris Lattner 116869b582faSGreg Clayton SBValueList 116930fdc8d8SChris Lattner SBFrame::GetRegisters () 117030fdc8d8SChris Lattner { 117169b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1172ceb6b139SCaroline Tice 117330fdc8d8SChris Lattner SBValueList value_list; 11744fc6cb9cSJim Ingham Mutex::Locker api_locker; 11754fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 11764fc6cb9cSJim Ingham 11777730b9a4SJim Ingham StackFrame *frame = NULL; 1178d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 11797730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 11807730b9a4SJim Ingham if (target && process) 118130fdc8d8SChris Lattner { 11827fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11837730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 11847730b9a4SJim Ingham { 11857730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 11867730b9a4SJim Ingham if (frame) 11877fdf9ef1SGreg Clayton { 1188d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 118930fdc8d8SChris Lattner if (reg_ctx) 119030fdc8d8SChris Lattner { 119130fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 119230fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 119330fdc8d8SChris Lattner { 1194d9e416c0SGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); 119530fdc8d8SChris Lattner } 119630fdc8d8SChris Lattner } 119730fdc8d8SChris Lattner } 1198c9858e4dSGreg Clayton else 1199c9858e4dSGreg Clayton { 1200c9858e4dSGreg Clayton if (log) 12017730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame."); 12027730b9a4SJim Ingham } 12037730b9a4SJim Ingham } 12047730b9a4SJim Ingham else 12057730b9a4SJim Ingham { 12067730b9a4SJim Ingham if (log) 12077730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: process is running"); 1208c9858e4dSGreg Clayton } 12097fdf9ef1SGreg Clayton } 1210ceb6b139SCaroline Tice 1211ceb6b139SCaroline Tice if (log) 1212*08ec0b61SEnrico Granata log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.opaque_ptr()); 1213ceb6b139SCaroline Tice 121430fdc8d8SChris Lattner return value_list; 121530fdc8d8SChris Lattner } 121630fdc8d8SChris Lattner 1217dde9cff3SCaroline Tice bool 1218dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 1219dde9cff3SCaroline Tice { 12207730b9a4SJim Ingham LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1221da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1222da7bc7d0SGreg Clayton 12234fc6cb9cSJim Ingham Mutex::Locker api_locker; 12244fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 12254fc6cb9cSJim Ingham 12267730b9a4SJim Ingham StackFrame *frame; 1227d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 12287730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 12297730b9a4SJim Ingham if (target && process) 1230dde9cff3SCaroline Tice { 12317fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12327730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 12337730b9a4SJim Ingham { 12347730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 12357730b9a4SJim Ingham if (frame) 12367fdf9ef1SGreg Clayton { 1237d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 1238dde9cff3SCaroline Tice } 1239c9858e4dSGreg Clayton else 1240c9858e4dSGreg Clayton { 1241c9858e4dSGreg Clayton if (log) 12427730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame."); 12437730b9a4SJim Ingham } 12447730b9a4SJim Ingham } 12457730b9a4SJim Ingham else 12467730b9a4SJim Ingham { 12477730b9a4SJim Ingham if (log) 12487730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: process is running"); 1249c9858e4dSGreg Clayton } 1250c9858e4dSGreg Clayton 12517fdf9ef1SGreg Clayton } 1252dde9cff3SCaroline Tice else 1253da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1254dde9cff3SCaroline Tice 1255dde9cff3SCaroline Tice return true; 1256dde9cff3SCaroline Tice } 12571d3afba3SGreg Clayton 125869b582faSGreg Clayton SBValue 12591d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 12601d3afba3SGreg Clayton { 1261316d498bSGreg Clayton SBValue result; 12627fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1263d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1264d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1265d9e416c0SGreg Clayton if (frame && target) 1266316d498bSGreg Clayton { 126735e1bda6SJim Ingham SBExpressionOptions options; 126835e1bda6SJim Ingham lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue(); 1269cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 127035e1bda6SJim Ingham options.SetUnwindOnError (true); 127135e1bda6SJim Ingham return EvaluateExpression (expr, options); 1272316d498bSGreg Clayton } 1273316d498bSGreg Clayton return result; 127478a685aaSJim Ingham } 127578a685aaSJim Ingham 127678a685aaSJim Ingham SBValue 12772837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 127878a685aaSJim Ingham { 127935e1bda6SJim Ingham SBExpressionOptions options; 1280cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 128135e1bda6SJim Ingham options.SetUnwindOnError (true); 128235e1bda6SJim Ingham return EvaluateExpression (expr, options); 12837ba6e991SJim Ingham } 12847ba6e991SJim Ingham 12857ba6e991SJim Ingham SBValue 12867ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error) 12877ba6e991SJim Ingham { 128835e1bda6SJim Ingham SBExpressionOptions options; 1289cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 129035e1bda6SJim Ingham options.SetUnwindOnError (unwind_on_error); 129135e1bda6SJim Ingham return EvaluateExpression (expr, options); 129235e1bda6SJim Ingham } 129335e1bda6SJim Ingham 129435e1bda6SJim Ingham lldb::SBValue 129535e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options) 129635e1bda6SJim Ingham { 129769b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 12984838131bSGreg Clayton 129969b582faSGreg Clayton LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1300a162ebafSSean Callanan 130123f59509SGreg Clayton ExecutionResults exe_results = eExecutionSetupError; 130269b582faSGreg Clayton SBValue expr_result; 13037730b9a4SJim Ingham 13047730b9a4SJim Ingham if (expr == NULL || expr[0] == '\0') 13057730b9a4SJim Ingham { 13067730b9a4SJim Ingham if (log) 13077730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression called with an empty expression"); 13087730b9a4SJim Ingham return expr_result; 13097730b9a4SJim Ingham } 13107730b9a4SJim Ingham 131181e871edSGreg Clayton ValueObjectSP expr_value_sp; 13124838131bSGreg Clayton 13134fc6cb9cSJim Ingham Mutex::Locker api_locker; 13144fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 13154fc6cb9cSJim Ingham 1316b9556accSGreg Clayton if (log) 13177730b9a4SJim Ingham log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr); 1318b9556accSGreg Clayton 13197730b9a4SJim Ingham StackFrame *frame = NULL; 13207730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 13217730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 13227730b9a4SJim Ingham 13237730b9a4SJim Ingham if (target && process) 13241d3afba3SGreg Clayton { 13257fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13267730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 13277730b9a4SJim Ingham { 13287730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 13297730b9a4SJim Ingham if (frame) 13307fdf9ef1SGreg Clayton { 1331de4ca5b7SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 13321ba7c4d0SGreg Clayton StreamString frame_description; 1333d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 13341ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 1335cced1566SGreg Clayton expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str()); 1336de4ca5b7SEnrico Granata #endif 1337d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 1338d9e416c0SGreg Clayton frame, 1339d4439aa9SEnrico Granata expr_value_sp, 134035e1bda6SJim Ingham options.ref()); 1341e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1342de4ca5b7SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1343f49e65aeSGreg Clayton Host::SetCrashDescription (NULL); 1344de4ca5b7SEnrico Granata #endif 13451d3afba3SGreg Clayton } 1346c9858e4dSGreg Clayton else 1347c9858e4dSGreg Clayton { 1348c9858e4dSGreg Clayton if (log) 13497730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame."); 13507730b9a4SJim Ingham } 13517730b9a4SJim Ingham } 13527730b9a4SJim Ingham else 13537730b9a4SJim Ingham { 13547730b9a4SJim Ingham if (log) 13557730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: process is running"); 1356c9858e4dSGreg Clayton } 13577fdf9ef1SGreg Clayton } 13584838131bSGreg Clayton 1359cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1360a162ebafSSean Callanan if (expr_log) 136178a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 1362fe42ac4dSGreg Clayton expr_result.GetValue(), 1363fe42ac4dSGreg Clayton expr_result.GetSummary()); 1364a162ebafSSean Callanan 13654838131bSGreg Clayton if (log) 1366d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 1367d9e416c0SGreg Clayton frame, 136878a685aaSJim Ingham expr, 136981e871edSGreg Clayton expr_value_sp.get(), 137025f3a3cdSJohnny Chen exe_results); 1371cf7e2dc0SJason Molenda #endif 13724838131bSGreg Clayton 1373cfd1acedSGreg Clayton return expr_result; 13741d3afba3SGreg Clayton } 1375316d498bSGreg Clayton 1376316d498bSGreg Clayton bool 1377316d498bSGreg Clayton SBFrame::IsInlined() 1378316d498bSGreg Clayton { 13797730b9a4SJim Ingham LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 13807fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 13817730b9a4SJim Ingham StackFrame *frame = NULL; 1382d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 13837730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 13847730b9a4SJim Ingham if (target && process) 1385316d498bSGreg Clayton { 13867fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13877730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 13887730b9a4SJim Ingham { 13897730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 13907730b9a4SJim Ingham if (frame) 13917fdf9ef1SGreg Clayton { 13927fdf9ef1SGreg Clayton 1393d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1394316d498bSGreg Clayton if (block) 1395316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 1396316d498bSGreg Clayton } 1397c9858e4dSGreg Clayton else 1398c9858e4dSGreg Clayton { 1399c9858e4dSGreg Clayton if (log) 14007730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame."); 14017730b9a4SJim Ingham } 14027730b9a4SJim Ingham } 14037730b9a4SJim Ingham else 14047730b9a4SJim Ingham { 14057730b9a4SJim Ingham if (log) 14067730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: process is running"); 1407c9858e4dSGreg Clayton } 1408c9858e4dSGreg Clayton 14097fdf9ef1SGreg Clayton } 1410316d498bSGreg Clayton return false; 1411316d498bSGreg Clayton } 1412316d498bSGreg Clayton 1413316d498bSGreg Clayton const char * 1414316d498bSGreg Clayton SBFrame::GetFunctionName() 1415316d498bSGreg Clayton { 14167730b9a4SJim Ingham LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1417316d498bSGreg Clayton const char *name = NULL; 14187fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 14197730b9a4SJim Ingham StackFrame *frame = NULL; 1420d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 14217730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 14227730b9a4SJim Ingham if (target && process) 1423316d498bSGreg Clayton { 14247fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 14257730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 14267730b9a4SJim Ingham { 14277730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 14287730b9a4SJim Ingham if (frame) 14297fdf9ef1SGreg Clayton { 1430d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1431316d498bSGreg Clayton if (sc.block) 1432316d498bSGreg Clayton { 1433316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1434316d498bSGreg Clayton if (inlined_block) 1435316d498bSGreg Clayton { 1436316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1437316d498bSGreg Clayton name = inlined_info->GetName().AsCString(); 1438316d498bSGreg Clayton } 1439316d498bSGreg Clayton } 1440316d498bSGreg Clayton 1441316d498bSGreg Clayton if (name == NULL) 1442316d498bSGreg Clayton { 1443316d498bSGreg Clayton if (sc.function) 1444316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1445316d498bSGreg Clayton } 1446316d498bSGreg Clayton 1447316d498bSGreg Clayton if (name == NULL) 1448316d498bSGreg Clayton { 1449316d498bSGreg Clayton if (sc.symbol) 1450316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1451316d498bSGreg Clayton } 1452316d498bSGreg Clayton } 1453c9858e4dSGreg Clayton else 1454c9858e4dSGreg Clayton { 1455c9858e4dSGreg Clayton if (log) 14567730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame."); 14577730b9a4SJim Ingham } 14587730b9a4SJim Ingham } 14597730b9a4SJim Ingham else 14607730b9a4SJim Ingham { 14617730b9a4SJim Ingham if (log) 14627730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName() => error: process is running"); 1463c9858e4dSGreg Clayton 1464c9858e4dSGreg Clayton } 14657fdf9ef1SGreg Clayton } 1466316d498bSGreg Clayton return name; 1467316d498bSGreg Clayton } 1468316d498bSGreg Clayton 1469