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" 36b57e4a1bSJason Molenda #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 57b57e4a1bSJason Molenda SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) : 587fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (lldb_object_sp)) 5930fdc8d8SChris Lattner { 605160ce5cSGreg Clayton Log *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 89b57e4a1bSJason Molenda StackFrameSP 90b9556accSGreg Clayton SBFrame::GetFrameSP() const 91b9556accSGreg Clayton { 92af2589eaSGreg Clayton if (m_opaque_sp) 937fdf9ef1SGreg Clayton return m_opaque_sp->GetFrameSP(); 94b57e4a1bSJason Molenda return StackFrameSP(); 95b9556accSGreg Clayton } 9630fdc8d8SChris Lattner 9730fdc8d8SChris Lattner void 98b57e4a1bSJason Molenda 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 { 1125160ce5cSGreg Clayton Log *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 117b57e4a1bSJason Molenda 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 { 1535160ce5cSGreg Clayton Log *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 159b57e4a1bSJason Molenda 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 { 1965160ce5cSGreg Clayton Log *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 201b57e4a1bSJason Molenda 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 { 2365160ce5cSGreg Clayton Log *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 241b57e4a1bSJason Molenda 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 { 2765160ce5cSGreg Clayton Log *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 281b57e4a1bSJason Molenda 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 { 3155160ce5cSGreg Clayton Log *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 320b57e4a1bSJason Molenda 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 358b57e4a1bSJason Molenda StackFrame *frame = NULL; 359d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3605160ce5cSGreg Clayton Log *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 { 3935160ce5cSGreg Clayton Log *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 398b57e4a1bSJason Molenda 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()); 435b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 4367fdf9ef1SGreg Clayton if (frame) 437d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex (); 4384838131bSGreg Clayton 4395160ce5cSGreg Clayton Log *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 { 4495160ce5cSGreg Clayton Log *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 454b57e4a1bSJason Molenda 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 { 4895160ce5cSGreg Clayton Log *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 494b57e4a1bSJason Molenda 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 { 5305160ce5cSGreg Clayton Log *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 535b57e4a1bSJason Molenda 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 { 5705160ce5cSGreg Clayton Log *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 575b57e4a1bSJason Molenda 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 { 6105160ce5cSGreg Clayton Log *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 615b57e4a1bSJason Molenda 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()); 656b57e4a1bSJason Molenda 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; 6715160ce5cSGreg Clayton Log *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 681b57e4a1bSJason Molenda StackFrame *frame = NULL; 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, 696b57e4a1bSJason Molenda 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()); 721b57e4a1bSJason Molenda 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 { 7355160ce5cSGreg Clayton Log *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 750b57e4a1bSJason Molenda 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()); 810b57e4a1bSJason Molenda 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 { 8235160ce5cSGreg Clayton Log *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 837b57e4a1bSJason Molenda 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 { 970b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 971b57e4a1bSJason Molenda 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 { 9905160ce5cSGreg Clayton Log *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 { 10125160ce5cSGreg Clayton Log *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 1017b57e4a1bSJason Molenda 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()); 1058b57e4a1bSJason Molenda 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 { 10755160ce5cSGreg Clayton Log *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 1081b57e4a1bSJason Molenda 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 { 116208ec0b61SEnrico 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 { 11715160ce5cSGreg Clayton Log *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 1177b57e4a1bSJason Molenda 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) 121208ec0b61SEnrico Granata log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.opaque_ptr()); 1213ceb6b139SCaroline Tice 121430fdc8d8SChris Lattner return value_list; 121530fdc8d8SChris Lattner } 121630fdc8d8SChris Lattner 1217ad9a53c5SJason Molenda SBValue 1218ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name) 1219ad9a53c5SJason Molenda { 1220ad9a53c5SJason Molenda Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1221ad9a53c5SJason Molenda 1222ad9a53c5SJason Molenda SBValue result; 1223ad9a53c5SJason Molenda ValueObjectSP value_sp; 1224ad9a53c5SJason Molenda Mutex::Locker api_locker; 1225ad9a53c5SJason Molenda ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1226ad9a53c5SJason Molenda 1227b57e4a1bSJason Molenda StackFrame *frame = NULL; 1228ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 1229ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1230ad9a53c5SJason Molenda if (target && process) 1231ad9a53c5SJason Molenda { 1232ad9a53c5SJason Molenda Process::StopLocker stop_locker; 1233ad9a53c5SJason Molenda if (stop_locker.TryLock(&process->GetRunLock())) 1234ad9a53c5SJason Molenda { 1235ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 1236ad9a53c5SJason Molenda if (frame) 1237ad9a53c5SJason Molenda { 1238ad9a53c5SJason Molenda RegisterContextSP reg_ctx (frame->GetRegisterContext()); 1239ad9a53c5SJason Molenda if (reg_ctx) 1240ad9a53c5SJason Molenda { 1241ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 1242ad9a53c5SJason Molenda for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 1243ad9a53c5SJason Molenda { 1244ad9a53c5SJason Molenda const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 1245ad9a53c5SJason Molenda if (reg_info && 1246ad9a53c5SJason Molenda ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 1247ad9a53c5SJason Molenda (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 1248ad9a53c5SJason Molenda { 1249ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 1250ad9a53c5SJason Molenda result.SetSP (value_sp); 1251ad9a53c5SJason Molenda break; 1252ad9a53c5SJason Molenda } 1253ad9a53c5SJason Molenda } 1254ad9a53c5SJason Molenda } 1255ad9a53c5SJason Molenda } 1256ad9a53c5SJason Molenda else 1257ad9a53c5SJason Molenda { 1258ad9a53c5SJason Molenda if (log) 12595d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame."); 1260ad9a53c5SJason Molenda } 1261ad9a53c5SJason Molenda } 1262ad9a53c5SJason Molenda else 1263ad9a53c5SJason Molenda { 1264ad9a53c5SJason Molenda if (log) 12655d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: process is running"); 1266ad9a53c5SJason Molenda } 1267ad9a53c5SJason Molenda } 1268ad9a53c5SJason Molenda 1269ad9a53c5SJason Molenda if (log) 12705d353842SJason Molenda log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)", frame, value_sp.get()); 1271ad9a53c5SJason Molenda 1272ad9a53c5SJason Molenda return result; 1273ad9a53c5SJason Molenda } 1274ad9a53c5SJason Molenda 1275dde9cff3SCaroline Tice bool 1276dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 1277dde9cff3SCaroline Tice { 12785160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1279da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1280da7bc7d0SGreg Clayton 12814fc6cb9cSJim Ingham Mutex::Locker api_locker; 12824fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 12834fc6cb9cSJim Ingham 1284b57e4a1bSJason Molenda StackFrame *frame; 1285d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 12867730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 12877730b9a4SJim Ingham if (target && process) 1288dde9cff3SCaroline Tice { 12897fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12907730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 12917730b9a4SJim Ingham { 12927730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 12937730b9a4SJim Ingham if (frame) 12947fdf9ef1SGreg Clayton { 1295d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 1296dde9cff3SCaroline Tice } 1297c9858e4dSGreg Clayton else 1298c9858e4dSGreg Clayton { 1299c9858e4dSGreg Clayton if (log) 13007730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame."); 13017730b9a4SJim Ingham } 13027730b9a4SJim Ingham } 13037730b9a4SJim Ingham else 13047730b9a4SJim Ingham { 13057730b9a4SJim Ingham if (log) 13067730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: process is running"); 1307c9858e4dSGreg Clayton } 1308c9858e4dSGreg Clayton 13097fdf9ef1SGreg Clayton } 1310dde9cff3SCaroline Tice else 1311da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1312dde9cff3SCaroline Tice 1313dde9cff3SCaroline Tice return true; 1314dde9cff3SCaroline Tice } 13151d3afba3SGreg Clayton 131669b582faSGreg Clayton SBValue 13171d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 13181d3afba3SGreg Clayton { 1319316d498bSGreg Clayton SBValue result; 13207fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1321b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1322d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1323d9e416c0SGreg Clayton if (frame && target) 1324316d498bSGreg Clayton { 132535e1bda6SJim Ingham SBExpressionOptions options; 132635e1bda6SJim Ingham lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue(); 1327cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 132835e1bda6SJim Ingham options.SetUnwindOnError (true); 132935e1bda6SJim Ingham return EvaluateExpression (expr, options); 1330316d498bSGreg Clayton } 1331316d498bSGreg Clayton return result; 133278a685aaSJim Ingham } 133378a685aaSJim Ingham 133478a685aaSJim Ingham SBValue 13352837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 133678a685aaSJim Ingham { 133735e1bda6SJim Ingham SBExpressionOptions options; 1338cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 133935e1bda6SJim Ingham options.SetUnwindOnError (true); 134035e1bda6SJim Ingham return EvaluateExpression (expr, options); 13417ba6e991SJim Ingham } 13427ba6e991SJim Ingham 13437ba6e991SJim Ingham SBValue 13447ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error) 13457ba6e991SJim Ingham { 134635e1bda6SJim Ingham SBExpressionOptions options; 1347cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 134835e1bda6SJim Ingham options.SetUnwindOnError (unwind_on_error); 134935e1bda6SJim Ingham return EvaluateExpression (expr, options); 135035e1bda6SJim Ingham } 135135e1bda6SJim Ingham 135235e1bda6SJim Ingham lldb::SBValue 135335e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options) 135435e1bda6SJim Ingham { 13555160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 13564838131bSGreg Clayton 13575160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1358a162ebafSSean Callanan 135923f59509SGreg Clayton ExecutionResults exe_results = eExecutionSetupError; 136069b582faSGreg Clayton SBValue expr_result; 13617730b9a4SJim Ingham 13627730b9a4SJim Ingham if (expr == NULL || expr[0] == '\0') 13637730b9a4SJim Ingham { 13647730b9a4SJim Ingham if (log) 13657730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression called with an empty expression"); 13667730b9a4SJim Ingham return expr_result; 13677730b9a4SJim Ingham } 13687730b9a4SJim Ingham 136981e871edSGreg Clayton ValueObjectSP expr_value_sp; 13704838131bSGreg Clayton 13714fc6cb9cSJim Ingham Mutex::Locker api_locker; 13724fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 13734fc6cb9cSJim Ingham 1374b9556accSGreg Clayton if (log) 13757730b9a4SJim Ingham log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr); 1376b9556accSGreg Clayton 1377b57e4a1bSJason Molenda StackFrame *frame = NULL; 13787730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 13797730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 13807730b9a4SJim Ingham 13817730b9a4SJim Ingham if (target && process) 13821d3afba3SGreg Clayton { 13837fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13847730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 13857730b9a4SJim Ingham { 13867730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 13877730b9a4SJim Ingham if (frame) 13887fdf9ef1SGreg Clayton { 1389*fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1390*fb6621efSGreg Clayton { 13911ba7c4d0SGreg Clayton StreamString frame_description; 1392d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 13931ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 1394cced1566SGreg Clayton expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str()); 1395*fb6621efSGreg Clayton } 1396*fb6621efSGreg Clayton 1397d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 1398d9e416c0SGreg Clayton frame, 1399d4439aa9SEnrico Granata expr_value_sp, 140035e1bda6SJim Ingham options.ref()); 1401e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1402*fb6621efSGreg Clayton 1403*fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1404f49e65aeSGreg Clayton Host::SetCrashDescription (NULL); 14051d3afba3SGreg Clayton } 1406c9858e4dSGreg Clayton else 1407c9858e4dSGreg Clayton { 1408c9858e4dSGreg Clayton if (log) 14097730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame."); 14107730b9a4SJim Ingham } 14117730b9a4SJim Ingham } 14127730b9a4SJim Ingham else 14137730b9a4SJim Ingham { 14147730b9a4SJim Ingham if (log) 14157730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: process is running"); 1416c9858e4dSGreg Clayton } 14177fdf9ef1SGreg Clayton } 14184838131bSGreg Clayton 1419cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1420a162ebafSSean Callanan if (expr_log) 142178a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 1422fe42ac4dSGreg Clayton expr_result.GetValue(), 1423fe42ac4dSGreg Clayton expr_result.GetSummary()); 1424a162ebafSSean Callanan 14254838131bSGreg Clayton if (log) 1426d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 1427d9e416c0SGreg Clayton frame, 142878a685aaSJim Ingham expr, 142981e871edSGreg Clayton expr_value_sp.get(), 143025f3a3cdSJohnny Chen exe_results); 1431cf7e2dc0SJason Molenda #endif 14324838131bSGreg Clayton 1433cfd1acedSGreg Clayton return expr_result; 14341d3afba3SGreg Clayton } 1435316d498bSGreg Clayton 1436316d498bSGreg Clayton bool 1437316d498bSGreg Clayton SBFrame::IsInlined() 1438316d498bSGreg Clayton { 14395160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14407fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1441b57e4a1bSJason Molenda StackFrame *frame = NULL; 1442d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 14437730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 14447730b9a4SJim Ingham if (target && process) 1445316d498bSGreg Clayton { 14467fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 14477730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 14487730b9a4SJim Ingham { 14497730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 14507730b9a4SJim Ingham if (frame) 14517fdf9ef1SGreg Clayton { 14527fdf9ef1SGreg Clayton 1453d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1454316d498bSGreg Clayton if (block) 1455316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 1456316d498bSGreg Clayton } 1457c9858e4dSGreg Clayton else 1458c9858e4dSGreg Clayton { 1459c9858e4dSGreg Clayton if (log) 14607730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame."); 14617730b9a4SJim Ingham } 14627730b9a4SJim Ingham } 14637730b9a4SJim Ingham else 14647730b9a4SJim Ingham { 14657730b9a4SJim Ingham if (log) 14667730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: process is running"); 1467c9858e4dSGreg Clayton } 1468c9858e4dSGreg Clayton 14697fdf9ef1SGreg Clayton } 1470316d498bSGreg Clayton return false; 1471316d498bSGreg Clayton } 1472316d498bSGreg Clayton 1473316d498bSGreg Clayton const char * 1474316d498bSGreg Clayton SBFrame::GetFunctionName() 1475316d498bSGreg Clayton { 14765160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1477316d498bSGreg Clayton const char *name = NULL; 14787fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1479b57e4a1bSJason Molenda StackFrame *frame = NULL; 1480d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 14817730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 14827730b9a4SJim Ingham if (target && process) 1483316d498bSGreg Clayton { 14847fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 14857730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 14867730b9a4SJim Ingham { 14877730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 14887730b9a4SJim Ingham if (frame) 14897fdf9ef1SGreg Clayton { 1490d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1491316d498bSGreg Clayton if (sc.block) 1492316d498bSGreg Clayton { 1493316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1494316d498bSGreg Clayton if (inlined_block) 1495316d498bSGreg Clayton { 1496316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1497316d498bSGreg Clayton name = inlined_info->GetName().AsCString(); 1498316d498bSGreg Clayton } 1499316d498bSGreg Clayton } 1500316d498bSGreg Clayton 1501316d498bSGreg Clayton if (name == NULL) 1502316d498bSGreg Clayton { 1503316d498bSGreg Clayton if (sc.function) 1504316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1505316d498bSGreg Clayton } 1506316d498bSGreg Clayton 1507316d498bSGreg Clayton if (name == NULL) 1508316d498bSGreg Clayton { 1509316d498bSGreg Clayton if (sc.symbol) 1510316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1511316d498bSGreg Clayton } 1512316d498bSGreg Clayton } 1513c9858e4dSGreg Clayton else 1514c9858e4dSGreg Clayton { 1515c9858e4dSGreg Clayton if (log) 15167730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame."); 15177730b9a4SJim Ingham } 15187730b9a4SJim Ingham } 15197730b9a4SJim Ingham else 15207730b9a4SJim Ingham { 15217730b9a4SJim Ingham if (log) 15227730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName() => error: process is running"); 1523c9858e4dSGreg Clayton 1524c9858e4dSGreg Clayton } 15257fdf9ef1SGreg Clayton } 1526316d498bSGreg Clayton return name; 1527316d498bSGreg Clayton } 1528316d498bSGreg Clayton 1529