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 { 855*08a04327SEnrico Granata VariableList variable_list; 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, 866*08a04327SEnrico Granata &variable_list)) 867beae523aSJohnny Chen { 86869b582faSGreg Clayton ConstString const_name(name); 869*08a04327SEnrico Granata VariableSP variable_sp(variable_list.FindVariable(const_name,value_type)); 870*08a04327SEnrico Granata if (variable_sp) 871beae523aSJohnny Chen { 872e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues); 873e3e91517SEnrico Granata sb_value.SetSP (value_sp, use_dynamic); 874beae523aSJohnny Chen break; 875beae523aSJohnny Chen } 87630fdc8d8SChris Lattner } 87730fdc8d8SChris Lattner } 87869b582faSGreg Clayton break; 87969b582faSGreg Clayton 88069b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 88169b582faSGreg Clayton { 882d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 88369b582faSGreg Clayton if (reg_ctx) 88469b582faSGreg Clayton { 88569b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 88669b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 88769b582faSGreg Clayton { 88869b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 88969b582faSGreg Clayton if (reg_info && 89069b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 89169b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 89269b582faSGreg Clayton { 893d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 89481e871edSGreg Clayton sb_value.SetSP (value_sp); 89581e871edSGreg Clayton break; 89669b582faSGreg Clayton } 89769b582faSGreg Clayton } 89869b582faSGreg Clayton } 89969b582faSGreg Clayton } 90069b582faSGreg Clayton break; 90169b582faSGreg Clayton 90269b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 90369b582faSGreg Clayton { 904d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 90569b582faSGreg Clayton if (reg_ctx) 90669b582faSGreg Clayton { 90769b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 90869b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 90969b582faSGreg Clayton { 91069b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 91169b582faSGreg Clayton if (reg_set && 91269b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 91369b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 91469b582faSGreg Clayton { 915d9e416c0SGreg Clayton value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx); 91681e871edSGreg Clayton sb_value.SetSP (value_sp); 91781e871edSGreg Clayton break; 91869b582faSGreg Clayton } 91969b582faSGreg Clayton } 92069b582faSGreg Clayton } 92169b582faSGreg Clayton } 92269b582faSGreg Clayton break; 92369b582faSGreg Clayton 92469b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 92569b582faSGreg Clayton { 92669b582faSGreg Clayton ConstString const_name(name); 927d9e416c0SGreg Clayton ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name)); 92869b582faSGreg Clayton if (expr_var_sp) 92981e871edSGreg Clayton { 93081e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 931e3e91517SEnrico Granata sb_value.SetSP (value_sp, use_dynamic); 93281e871edSGreg Clayton } 93369b582faSGreg Clayton } 93469b582faSGreg Clayton break; 93569b582faSGreg Clayton 93669b582faSGreg Clayton default: 93769b582faSGreg Clayton break; 93869b582faSGreg Clayton } 939beae523aSJohnny Chen } 940c9858e4dSGreg Clayton else 941c9858e4dSGreg Clayton { 942c9858e4dSGreg Clayton if (log) 9437730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame."); 9447730b9a4SJim Ingham } 9457730b9a4SJim Ingham } 9467730b9a4SJim Ingham else 9477730b9a4SJim Ingham { 9487730b9a4SJim Ingham if (log) 9497730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: process is running"); 950c9858e4dSGreg Clayton } 9517fdf9ef1SGreg Clayton } 952dde9cff3SCaroline Tice 9534838131bSGreg Clayton if (log) 95469b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 955d9e416c0SGreg Clayton frame, name, value_type, value_sp.get()); 9564838131bSGreg Clayton 9574838131bSGreg Clayton 958dde9cff3SCaroline Tice return sb_value; 959dde9cff3SCaroline Tice } 960dde9cff3SCaroline Tice 96130fdc8d8SChris Lattner bool 96235e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const 96335e2ab60SJohnny Chen { 964b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 965b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 96635e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 96735e2ab60SJohnny Chen } 96835e2ab60SJohnny Chen 96935e2ab60SJohnny Chen bool 97030fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 97130fdc8d8SChris Lattner { 97235e2ab60SJohnny Chen return IsEqual(rhs); 97330fdc8d8SChris Lattner } 97430fdc8d8SChris Lattner 97530fdc8d8SChris Lattner bool 97630fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 97730fdc8d8SChris Lattner { 97835e2ab60SJohnny Chen return !IsEqual(rhs); 979481cef25SGreg Clayton } 98030fdc8d8SChris Lattner 98130fdc8d8SChris Lattner SBThread 98230fdc8d8SChris Lattner SBFrame::GetThread () const 98330fdc8d8SChris Lattner { 9845160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 985ceb6b139SCaroline Tice 9867fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 987d9e416c0SGreg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 988d9e416c0SGreg Clayton SBThread sb_thread (thread_sp); 989ceb6b139SCaroline Tice 990ceb6b139SCaroline Tice if (log) 991750cd175SCaroline Tice { 992750cd175SCaroline Tice SBStream sstr; 993750cd175SCaroline Tice sb_thread.GetDescription (sstr); 994d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", 995d9e416c0SGreg Clayton exe_ctx.GetFramePtr(), 996d9e416c0SGreg Clayton thread_sp.get(), 997d9e416c0SGreg Clayton sstr.GetData()); 998750cd175SCaroline Tice } 999ceb6b139SCaroline Tice 100030fdc8d8SChris Lattner return sb_thread; 100130fdc8d8SChris Lattner } 100230fdc8d8SChris Lattner 100330fdc8d8SChris Lattner const char * 100430fdc8d8SChris Lattner SBFrame::Disassemble () const 100530fdc8d8SChris Lattner { 10065160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 10074838131bSGreg Clayton const char *disassembly = NULL; 10084fc6cb9cSJim Ingham Mutex::Locker api_locker; 10094fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10104fc6cb9cSJim Ingham 1011b57e4a1bSJason Molenda StackFrame *frame = NULL; 1012d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 10137730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10147730b9a4SJim Ingham if (target && process) 1015af67cecdSGreg Clayton { 10167fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10177730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 10187730b9a4SJim Ingham { 10197730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 10207730b9a4SJim Ingham if (frame) 10217fdf9ef1SGreg Clayton { 1022d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 1023af67cecdSGreg Clayton } 1024c9858e4dSGreg Clayton else 1025c9858e4dSGreg Clayton { 1026c9858e4dSGreg Clayton if (log) 10277730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame."); 10287730b9a4SJim Ingham } 10297730b9a4SJim Ingham } 10307730b9a4SJim Ingham else 10317730b9a4SJim Ingham { 10327730b9a4SJim Ingham if (log) 10337730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: process is running"); 10347fdf9ef1SGreg Clayton } 1035c9858e4dSGreg Clayton } 10364838131bSGreg Clayton 10374838131bSGreg Clayton if (log) 1038d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly); 10394838131bSGreg Clayton 10404838131bSGreg Clayton return disassembly; 104130fdc8d8SChris Lattner } 104230fdc8d8SChris Lattner 104330fdc8d8SChris Lattner 104430fdc8d8SChris Lattner SBValueList 104530fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 104630fdc8d8SChris Lattner bool locals, 104730fdc8d8SChris Lattner bool statics, 104830fdc8d8SChris Lattner bool in_scope_only) 104930fdc8d8SChris Lattner { 1050316d498bSGreg Clayton SBValueList value_list; 10517fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1052b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1053d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1054d9e416c0SGreg Clayton if (frame && target) 1055316d498bSGreg Clayton { 1056d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 1057316d498bSGreg Clayton value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic); 1058316d498bSGreg Clayton } 1059316d498bSGreg Clayton return value_list; 106078a685aaSJim Ingham } 106178a685aaSJim Ingham 106278a685aaSJim Ingham SBValueList 106378a685aaSJim Ingham SBFrame::GetVariables (bool arguments, 106478a685aaSJim Ingham bool locals, 106578a685aaSJim Ingham bool statics, 106678a685aaSJim Ingham bool in_scope_only, 10672837b766SJim Ingham lldb::DynamicValueType use_dynamic) 106878a685aaSJim Ingham { 10695160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1070ceb6b139SCaroline Tice 1071b9556accSGreg Clayton SBValueList value_list; 10724fc6cb9cSJim Ingham Mutex::Locker api_locker; 10734fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10744fc6cb9cSJim Ingham 1075b57e4a1bSJason Molenda StackFrame *frame = NULL; 1076d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1077b9556accSGreg Clayton 1078ceb6b139SCaroline Tice if (log) 10797730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 10804838131bSGreg Clayton arguments, 10814838131bSGreg Clayton locals, 10824838131bSGreg Clayton statics, 10834838131bSGreg Clayton in_scope_only); 1084ceb6b139SCaroline Tice 10857730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10867730b9a4SJim Ingham if (target && process) 108730fdc8d8SChris Lattner { 10887fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10897730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 10907fdf9ef1SGreg Clayton { 10917730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 10927730b9a4SJim Ingham if (frame) 10937730b9a4SJim Ingham { 109430fdc8d8SChris Lattner size_t i; 1095af67cecdSGreg Clayton VariableList *variable_list = NULL; 1096d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 109730fdc8d8SChris Lattner if (variable_list) 109830fdc8d8SChris Lattner { 109930fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 110030fdc8d8SChris Lattner if (num_variables) 110130fdc8d8SChris Lattner { 110230fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 110330fdc8d8SChris Lattner { 110430fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 110530fdc8d8SChris Lattner if (variable_sp) 110630fdc8d8SChris Lattner { 110730fdc8d8SChris Lattner bool add_variable = false; 110830fdc8d8SChris Lattner switch (variable_sp->GetScope()) 110930fdc8d8SChris Lattner { 111030fdc8d8SChris Lattner case eValueTypeVariableGlobal: 111130fdc8d8SChris Lattner case eValueTypeVariableStatic: 111230fdc8d8SChris Lattner add_variable = statics; 111330fdc8d8SChris Lattner break; 111430fdc8d8SChris Lattner 111530fdc8d8SChris Lattner case eValueTypeVariableArgument: 111630fdc8d8SChris Lattner add_variable = arguments; 111730fdc8d8SChris Lattner break; 111830fdc8d8SChris Lattner 111930fdc8d8SChris Lattner case eValueTypeVariableLocal: 112030fdc8d8SChris Lattner add_variable = locals; 112130fdc8d8SChris Lattner break; 1122c982c768SGreg Clayton 1123c982c768SGreg Clayton default: 1124c982c768SGreg Clayton break; 112530fdc8d8SChris Lattner } 112630fdc8d8SChris Lattner if (add_variable) 112730fdc8d8SChris Lattner { 1128d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 112930fdc8d8SChris Lattner continue; 113030fdc8d8SChris Lattner 1131e3e91517SEnrico Granata ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues)); 1132e3e91517SEnrico Granata SBValue value_sb; 1133e3e91517SEnrico Granata value_sb.SetSP(valobj_sp,use_dynamic); 1134e3e91517SEnrico Granata value_list.Append(value_sb); 113530fdc8d8SChris Lattner } 113630fdc8d8SChris Lattner } 113730fdc8d8SChris Lattner } 113830fdc8d8SChris Lattner } 113930fdc8d8SChris Lattner } 114030fdc8d8SChris Lattner } 1141c9858e4dSGreg Clayton else 1142c9858e4dSGreg Clayton { 1143c9858e4dSGreg Clayton if (log) 11447730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame."); 11457730b9a4SJim Ingham } 11467730b9a4SJim Ingham } 11477730b9a4SJim Ingham else 11487730b9a4SJim Ingham { 11497730b9a4SJim Ingham if (log) 11507730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: process is running"); 1151c9858e4dSGreg Clayton } 11527fdf9ef1SGreg Clayton } 1153ceb6b139SCaroline Tice 1154ceb6b139SCaroline Tice if (log) 1155ceb6b139SCaroline Tice { 115608ec0b61SEnrico Granata log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame, value_list.opaque_ptr()); 1157ceb6b139SCaroline Tice } 1158ceb6b139SCaroline Tice 115930fdc8d8SChris Lattner return value_list; 116030fdc8d8SChris Lattner } 116130fdc8d8SChris Lattner 116269b582faSGreg Clayton SBValueList 116330fdc8d8SChris Lattner SBFrame::GetRegisters () 116430fdc8d8SChris Lattner { 11655160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1166ceb6b139SCaroline Tice 116730fdc8d8SChris Lattner SBValueList value_list; 11684fc6cb9cSJim Ingham Mutex::Locker api_locker; 11694fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 11704fc6cb9cSJim Ingham 1171b57e4a1bSJason Molenda StackFrame *frame = NULL; 1172d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 11737730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 11747730b9a4SJim Ingham if (target && process) 117530fdc8d8SChris Lattner { 11767fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11777730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 11787730b9a4SJim Ingham { 11797730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 11807730b9a4SJim Ingham if (frame) 11817fdf9ef1SGreg Clayton { 1182d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 118330fdc8d8SChris Lattner if (reg_ctx) 118430fdc8d8SChris Lattner { 118530fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 118630fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 118730fdc8d8SChris Lattner { 1188d9e416c0SGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); 118930fdc8d8SChris Lattner } 119030fdc8d8SChris Lattner } 119130fdc8d8SChris Lattner } 1192c9858e4dSGreg Clayton else 1193c9858e4dSGreg Clayton { 1194c9858e4dSGreg Clayton if (log) 11957730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame."); 11967730b9a4SJim Ingham } 11977730b9a4SJim Ingham } 11987730b9a4SJim Ingham else 11997730b9a4SJim Ingham { 12007730b9a4SJim Ingham if (log) 12017730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: process is running"); 1202c9858e4dSGreg Clayton } 12037fdf9ef1SGreg Clayton } 1204ceb6b139SCaroline Tice 1205ceb6b139SCaroline Tice if (log) 120608ec0b61SEnrico Granata log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.opaque_ptr()); 1207ceb6b139SCaroline Tice 120830fdc8d8SChris Lattner return value_list; 120930fdc8d8SChris Lattner } 121030fdc8d8SChris Lattner 1211ad9a53c5SJason Molenda SBValue 1212ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name) 1213ad9a53c5SJason Molenda { 1214ad9a53c5SJason Molenda Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1215ad9a53c5SJason Molenda 1216ad9a53c5SJason Molenda SBValue result; 1217ad9a53c5SJason Molenda ValueObjectSP value_sp; 1218ad9a53c5SJason Molenda Mutex::Locker api_locker; 1219ad9a53c5SJason Molenda ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1220ad9a53c5SJason Molenda 1221b57e4a1bSJason Molenda StackFrame *frame = NULL; 1222ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 1223ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1224ad9a53c5SJason Molenda if (target && process) 1225ad9a53c5SJason Molenda { 1226ad9a53c5SJason Molenda Process::StopLocker stop_locker; 1227ad9a53c5SJason Molenda if (stop_locker.TryLock(&process->GetRunLock())) 1228ad9a53c5SJason Molenda { 1229ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 1230ad9a53c5SJason Molenda if (frame) 1231ad9a53c5SJason Molenda { 1232ad9a53c5SJason Molenda RegisterContextSP reg_ctx (frame->GetRegisterContext()); 1233ad9a53c5SJason Molenda if (reg_ctx) 1234ad9a53c5SJason Molenda { 1235ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 1236ad9a53c5SJason Molenda for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 1237ad9a53c5SJason Molenda { 1238ad9a53c5SJason Molenda const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 1239ad9a53c5SJason Molenda if (reg_info && 1240ad9a53c5SJason Molenda ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 1241ad9a53c5SJason Molenda (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 1242ad9a53c5SJason Molenda { 1243ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 1244ad9a53c5SJason Molenda result.SetSP (value_sp); 1245ad9a53c5SJason Molenda break; 1246ad9a53c5SJason Molenda } 1247ad9a53c5SJason Molenda } 1248ad9a53c5SJason Molenda } 1249ad9a53c5SJason Molenda } 1250ad9a53c5SJason Molenda else 1251ad9a53c5SJason Molenda { 1252ad9a53c5SJason Molenda if (log) 12535d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame."); 1254ad9a53c5SJason Molenda } 1255ad9a53c5SJason Molenda } 1256ad9a53c5SJason Molenda else 1257ad9a53c5SJason Molenda { 1258ad9a53c5SJason Molenda if (log) 12595d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: process is running"); 1260ad9a53c5SJason Molenda } 1261ad9a53c5SJason Molenda } 1262ad9a53c5SJason Molenda 1263ad9a53c5SJason Molenda if (log) 12645d353842SJason Molenda log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)", frame, value_sp.get()); 1265ad9a53c5SJason Molenda 1266ad9a53c5SJason Molenda return result; 1267ad9a53c5SJason Molenda } 1268ad9a53c5SJason Molenda 1269dde9cff3SCaroline Tice bool 1270dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 1271dde9cff3SCaroline Tice { 12725160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1273da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1274da7bc7d0SGreg Clayton 12754fc6cb9cSJim Ingham Mutex::Locker api_locker; 12764fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 12774fc6cb9cSJim Ingham 1278b57e4a1bSJason Molenda StackFrame *frame; 1279d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 12807730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 12817730b9a4SJim Ingham if (target && process) 1282dde9cff3SCaroline Tice { 12837fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12847730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 12857730b9a4SJim Ingham { 12867730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 12877730b9a4SJim Ingham if (frame) 12887fdf9ef1SGreg Clayton { 1289d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 1290dde9cff3SCaroline Tice } 1291c9858e4dSGreg Clayton else 1292c9858e4dSGreg Clayton { 1293c9858e4dSGreg Clayton if (log) 12947730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame."); 12957730b9a4SJim Ingham } 12967730b9a4SJim Ingham } 12977730b9a4SJim Ingham else 12987730b9a4SJim Ingham { 12997730b9a4SJim Ingham if (log) 13007730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: process is running"); 1301c9858e4dSGreg Clayton } 1302c9858e4dSGreg Clayton 13037fdf9ef1SGreg Clayton } 1304dde9cff3SCaroline Tice else 1305da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1306dde9cff3SCaroline Tice 1307dde9cff3SCaroline Tice return true; 1308dde9cff3SCaroline Tice } 13091d3afba3SGreg Clayton 131069b582faSGreg Clayton SBValue 13111d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 13121d3afba3SGreg Clayton { 1313316d498bSGreg Clayton SBValue result; 13147fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1315b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1316d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1317d9e416c0SGreg Clayton if (frame && target) 1318316d498bSGreg Clayton { 131935e1bda6SJim Ingham SBExpressionOptions options; 132035e1bda6SJim Ingham lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue(); 1321cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 132235e1bda6SJim Ingham options.SetUnwindOnError (true); 132335e1bda6SJim Ingham return EvaluateExpression (expr, options); 1324316d498bSGreg Clayton } 1325316d498bSGreg Clayton return result; 132678a685aaSJim Ingham } 132778a685aaSJim Ingham 132878a685aaSJim Ingham SBValue 13292837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 133078a685aaSJim Ingham { 133135e1bda6SJim Ingham SBExpressionOptions options; 1332cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 133335e1bda6SJim Ingham options.SetUnwindOnError (true); 133435e1bda6SJim Ingham return EvaluateExpression (expr, options); 13357ba6e991SJim Ingham } 13367ba6e991SJim Ingham 13377ba6e991SJim Ingham SBValue 13387ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error) 13397ba6e991SJim Ingham { 134035e1bda6SJim Ingham SBExpressionOptions options; 1341cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 134235e1bda6SJim Ingham options.SetUnwindOnError (unwind_on_error); 134335e1bda6SJim Ingham return EvaluateExpression (expr, options); 134435e1bda6SJim Ingham } 134535e1bda6SJim Ingham 134635e1bda6SJim Ingham lldb::SBValue 134735e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options) 134835e1bda6SJim Ingham { 13495160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 13504838131bSGreg Clayton 13515160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1352a162ebafSSean Callanan 135323f59509SGreg Clayton ExecutionResults exe_results = eExecutionSetupError; 135469b582faSGreg Clayton SBValue expr_result; 13557730b9a4SJim Ingham 13567730b9a4SJim Ingham if (expr == NULL || expr[0] == '\0') 13577730b9a4SJim Ingham { 13587730b9a4SJim Ingham if (log) 13597730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression called with an empty expression"); 13607730b9a4SJim Ingham return expr_result; 13617730b9a4SJim Ingham } 13627730b9a4SJim Ingham 136381e871edSGreg Clayton ValueObjectSP expr_value_sp; 13644838131bSGreg Clayton 13654fc6cb9cSJim Ingham Mutex::Locker api_locker; 13664fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 13674fc6cb9cSJim Ingham 1368b9556accSGreg Clayton if (log) 13697730b9a4SJim Ingham log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr); 1370b9556accSGreg Clayton 1371b57e4a1bSJason Molenda StackFrame *frame = NULL; 13727730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 13737730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 13747730b9a4SJim Ingham 13757730b9a4SJim Ingham if (target && process) 13761d3afba3SGreg Clayton { 13777fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13787730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 13797730b9a4SJim Ingham { 13807730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 13817730b9a4SJim Ingham if (frame) 13827fdf9ef1SGreg Clayton { 1383fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1384fb6621efSGreg Clayton { 13851ba7c4d0SGreg Clayton StreamString frame_description; 1386d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 13871ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 1388cced1566SGreg Clayton expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str()); 1389fb6621efSGreg Clayton } 1390fb6621efSGreg Clayton 1391d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 1392d9e416c0SGreg Clayton frame, 1393d4439aa9SEnrico Granata expr_value_sp, 139435e1bda6SJim Ingham options.ref()); 1395e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1396fb6621efSGreg Clayton 1397fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1398f49e65aeSGreg Clayton Host::SetCrashDescription (NULL); 13991d3afba3SGreg Clayton } 1400c9858e4dSGreg Clayton else 1401c9858e4dSGreg Clayton { 1402c9858e4dSGreg Clayton if (log) 14037730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame."); 14047730b9a4SJim Ingham } 14057730b9a4SJim Ingham } 14067730b9a4SJim Ingham else 14077730b9a4SJim Ingham { 14087730b9a4SJim Ingham if (log) 14097730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: process is running"); 1410c9858e4dSGreg Clayton } 14117fdf9ef1SGreg Clayton } 14124838131bSGreg Clayton 1413cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1414a162ebafSSean Callanan if (expr_log) 141578a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 1416fe42ac4dSGreg Clayton expr_result.GetValue(), 1417fe42ac4dSGreg Clayton expr_result.GetSummary()); 1418a162ebafSSean Callanan 14194838131bSGreg Clayton if (log) 1420d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 1421d9e416c0SGreg Clayton frame, 142278a685aaSJim Ingham expr, 142381e871edSGreg Clayton expr_value_sp.get(), 142425f3a3cdSJohnny Chen exe_results); 1425cf7e2dc0SJason Molenda #endif 14264838131bSGreg Clayton 1427cfd1acedSGreg Clayton return expr_result; 14281d3afba3SGreg Clayton } 1429316d498bSGreg Clayton 1430316d498bSGreg Clayton bool 1431316d498bSGreg Clayton SBFrame::IsInlined() 1432316d498bSGreg Clayton { 14335160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14347fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1435b57e4a1bSJason Molenda StackFrame *frame = NULL; 1436d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 14377730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 14387730b9a4SJim Ingham if (target && process) 1439316d498bSGreg Clayton { 14407fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 14417730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 14427730b9a4SJim Ingham { 14437730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 14447730b9a4SJim Ingham if (frame) 14457fdf9ef1SGreg Clayton { 14467fdf9ef1SGreg Clayton 1447d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1448316d498bSGreg Clayton if (block) 1449316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 1450316d498bSGreg Clayton } 1451c9858e4dSGreg Clayton else 1452c9858e4dSGreg Clayton { 1453c9858e4dSGreg Clayton if (log) 14547730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame."); 14557730b9a4SJim Ingham } 14567730b9a4SJim Ingham } 14577730b9a4SJim Ingham else 14587730b9a4SJim Ingham { 14597730b9a4SJim Ingham if (log) 14607730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: process is running"); 1461c9858e4dSGreg Clayton } 1462c9858e4dSGreg Clayton 14637fdf9ef1SGreg Clayton } 1464316d498bSGreg Clayton return false; 1465316d498bSGreg Clayton } 1466316d498bSGreg Clayton 1467316d498bSGreg Clayton const char * 1468316d498bSGreg Clayton SBFrame::GetFunctionName() 1469316d498bSGreg Clayton { 14705160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1471316d498bSGreg Clayton const char *name = NULL; 14727fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1473b57e4a1bSJason Molenda StackFrame *frame = NULL; 1474d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 14757730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 14767730b9a4SJim Ingham if (target && process) 1477316d498bSGreg Clayton { 14787fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 14797730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 14807730b9a4SJim Ingham { 14817730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 14827730b9a4SJim Ingham if (frame) 14837fdf9ef1SGreg Clayton { 1484d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1485316d498bSGreg Clayton if (sc.block) 1486316d498bSGreg Clayton { 1487316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1488316d498bSGreg Clayton if (inlined_block) 1489316d498bSGreg Clayton { 1490316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1491316d498bSGreg Clayton name = inlined_info->GetName().AsCString(); 1492316d498bSGreg Clayton } 1493316d498bSGreg Clayton } 1494316d498bSGreg Clayton 1495316d498bSGreg Clayton if (name == NULL) 1496316d498bSGreg Clayton { 1497316d498bSGreg Clayton if (sc.function) 1498316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1499316d498bSGreg Clayton } 1500316d498bSGreg Clayton 1501316d498bSGreg Clayton if (name == NULL) 1502316d498bSGreg Clayton { 1503316d498bSGreg Clayton if (sc.symbol) 1504316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1505316d498bSGreg Clayton } 1506316d498bSGreg Clayton } 1507c9858e4dSGreg Clayton else 1508c9858e4dSGreg Clayton { 1509c9858e4dSGreg Clayton if (log) 15107730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame."); 15117730b9a4SJim Ingham } 15127730b9a4SJim Ingham } 15137730b9a4SJim Ingham else 15147730b9a4SJim Ingham { 15157730b9a4SJim Ingham if (log) 15167730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName() => error: process is running"); 1517c9858e4dSGreg Clayton 1518c9858e4dSGreg Clayton } 15197fdf9ef1SGreg Clayton } 1520316d498bSGreg Clayton return name; 1521316d498bSGreg Clayton } 1522316d498bSGreg Clayton 1523