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 { 848*8a2a0dfbSEnrico Granata VariableList variable_list; 849*8a2a0dfbSEnrico Granata 85069b582faSGreg Clayton switch (value_type) 85130fdc8d8SChris Lattner { 85269b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 85369b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 85469b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 85569b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 85669b582faSGreg Clayton { 85772eff18aSGreg Clayton 858d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 85972eff18aSGreg Clayton 86072eff18aSGreg Clayton const bool can_create = true; 86172eff18aSGreg Clayton const bool get_parent_variables = true; 86272eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 86372eff18aSGreg Clayton 86472eff18aSGreg Clayton if (sc.block && sc.block->AppendVariables (can_create, 86572eff18aSGreg Clayton get_parent_variables, 86672eff18aSGreg Clayton stop_if_block_is_inlined_function, 86708a04327SEnrico Granata &variable_list)) 868beae523aSJohnny Chen { 869*8a2a0dfbSEnrico Granata if (value_type == eValueTypeVariableGlobal) 870*8a2a0dfbSEnrico Granata { 871*8a2a0dfbSEnrico Granata const bool get_file_globals = true; 872*8a2a0dfbSEnrico Granata VariableList* frame_vars = frame->GetVariableList(get_file_globals); 873*8a2a0dfbSEnrico Granata if (frame_vars) 874*8a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 875*8a2a0dfbSEnrico Granata } 87669b582faSGreg Clayton ConstString const_name(name); 87708a04327SEnrico Granata VariableSP variable_sp(variable_list.FindVariable(const_name,value_type)); 87808a04327SEnrico Granata if (variable_sp) 879beae523aSJohnny Chen { 880e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues); 881e3e91517SEnrico Granata sb_value.SetSP (value_sp, use_dynamic); 882beae523aSJohnny Chen break; 883beae523aSJohnny Chen } 88430fdc8d8SChris Lattner } 88530fdc8d8SChris Lattner } 88669b582faSGreg Clayton break; 88769b582faSGreg Clayton 88869b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 88969b582faSGreg Clayton { 890d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 89169b582faSGreg Clayton if (reg_ctx) 89269b582faSGreg Clayton { 89369b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 89469b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 89569b582faSGreg Clayton { 89669b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 89769b582faSGreg Clayton if (reg_info && 89869b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 89969b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 90069b582faSGreg Clayton { 901d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 90281e871edSGreg Clayton sb_value.SetSP (value_sp); 90381e871edSGreg Clayton break; 90469b582faSGreg Clayton } 90569b582faSGreg Clayton } 90669b582faSGreg Clayton } 90769b582faSGreg Clayton } 90869b582faSGreg Clayton break; 90969b582faSGreg Clayton 91069b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 91169b582faSGreg Clayton { 912d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 91369b582faSGreg Clayton if (reg_ctx) 91469b582faSGreg Clayton { 91569b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 91669b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 91769b582faSGreg Clayton { 91869b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 91969b582faSGreg Clayton if (reg_set && 92069b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 92169b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 92269b582faSGreg Clayton { 923d9e416c0SGreg Clayton value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx); 92481e871edSGreg Clayton sb_value.SetSP (value_sp); 92581e871edSGreg Clayton break; 92669b582faSGreg Clayton } 92769b582faSGreg Clayton } 92869b582faSGreg Clayton } 92969b582faSGreg Clayton } 93069b582faSGreg Clayton break; 93169b582faSGreg Clayton 93269b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 93369b582faSGreg Clayton { 93469b582faSGreg Clayton ConstString const_name(name); 935d9e416c0SGreg Clayton ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name)); 93669b582faSGreg Clayton if (expr_var_sp) 93781e871edSGreg Clayton { 93881e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 939e3e91517SEnrico Granata sb_value.SetSP (value_sp, use_dynamic); 94081e871edSGreg Clayton } 94169b582faSGreg Clayton } 94269b582faSGreg Clayton break; 94369b582faSGreg Clayton 94469b582faSGreg Clayton default: 94569b582faSGreg Clayton break; 94669b582faSGreg Clayton } 947beae523aSJohnny Chen } 948c9858e4dSGreg Clayton else 949c9858e4dSGreg Clayton { 950c9858e4dSGreg Clayton if (log) 9517730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame."); 9527730b9a4SJim Ingham } 9537730b9a4SJim Ingham } 9547730b9a4SJim Ingham else 9557730b9a4SJim Ingham { 9567730b9a4SJim Ingham if (log) 9577730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: process is running"); 958c9858e4dSGreg Clayton } 9597fdf9ef1SGreg Clayton } 960dde9cff3SCaroline Tice 9614838131bSGreg Clayton if (log) 96269b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 963d9e416c0SGreg Clayton frame, name, value_type, value_sp.get()); 9644838131bSGreg Clayton 9654838131bSGreg Clayton 966dde9cff3SCaroline Tice return sb_value; 967dde9cff3SCaroline Tice } 968dde9cff3SCaroline Tice 96930fdc8d8SChris Lattner bool 97035e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const 97135e2ab60SJohnny Chen { 972b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 973b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 97435e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 97535e2ab60SJohnny Chen } 97635e2ab60SJohnny Chen 97735e2ab60SJohnny Chen bool 97830fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 97930fdc8d8SChris Lattner { 98035e2ab60SJohnny Chen return IsEqual(rhs); 98130fdc8d8SChris Lattner } 98230fdc8d8SChris Lattner 98330fdc8d8SChris Lattner bool 98430fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 98530fdc8d8SChris Lattner { 98635e2ab60SJohnny Chen return !IsEqual(rhs); 987481cef25SGreg Clayton } 98830fdc8d8SChris Lattner 98930fdc8d8SChris Lattner SBThread 99030fdc8d8SChris Lattner SBFrame::GetThread () const 99130fdc8d8SChris Lattner { 9925160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 993ceb6b139SCaroline Tice 9947fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 995d9e416c0SGreg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 996d9e416c0SGreg Clayton SBThread sb_thread (thread_sp); 997ceb6b139SCaroline Tice 998ceb6b139SCaroline Tice if (log) 999750cd175SCaroline Tice { 1000750cd175SCaroline Tice SBStream sstr; 1001750cd175SCaroline Tice sb_thread.GetDescription (sstr); 1002d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", 1003d9e416c0SGreg Clayton exe_ctx.GetFramePtr(), 1004d9e416c0SGreg Clayton thread_sp.get(), 1005d9e416c0SGreg Clayton sstr.GetData()); 1006750cd175SCaroline Tice } 1007ceb6b139SCaroline Tice 100830fdc8d8SChris Lattner return sb_thread; 100930fdc8d8SChris Lattner } 101030fdc8d8SChris Lattner 101130fdc8d8SChris Lattner const char * 101230fdc8d8SChris Lattner SBFrame::Disassemble () const 101330fdc8d8SChris Lattner { 10145160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 10154838131bSGreg Clayton const char *disassembly = NULL; 10164fc6cb9cSJim Ingham Mutex::Locker api_locker; 10174fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10184fc6cb9cSJim Ingham 1019b57e4a1bSJason Molenda StackFrame *frame = NULL; 1020d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 10217730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10227730b9a4SJim Ingham if (target && process) 1023af67cecdSGreg Clayton { 10247fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10257730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 10267730b9a4SJim Ingham { 10277730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 10287730b9a4SJim Ingham if (frame) 10297fdf9ef1SGreg Clayton { 1030d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 1031af67cecdSGreg Clayton } 1032c9858e4dSGreg Clayton else 1033c9858e4dSGreg Clayton { 1034c9858e4dSGreg Clayton if (log) 10357730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame."); 10367730b9a4SJim Ingham } 10377730b9a4SJim Ingham } 10387730b9a4SJim Ingham else 10397730b9a4SJim Ingham { 10407730b9a4SJim Ingham if (log) 10417730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: process is running"); 10427fdf9ef1SGreg Clayton } 1043c9858e4dSGreg Clayton } 10444838131bSGreg Clayton 10454838131bSGreg Clayton if (log) 1046d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly); 10474838131bSGreg Clayton 10484838131bSGreg Clayton return disassembly; 104930fdc8d8SChris Lattner } 105030fdc8d8SChris Lattner 105130fdc8d8SChris Lattner 105230fdc8d8SChris Lattner SBValueList 105330fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 105430fdc8d8SChris Lattner bool locals, 105530fdc8d8SChris Lattner bool statics, 105630fdc8d8SChris Lattner bool in_scope_only) 105730fdc8d8SChris Lattner { 1058316d498bSGreg Clayton SBValueList value_list; 10597fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1060b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1061d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1062d9e416c0SGreg Clayton if (frame && target) 1063316d498bSGreg Clayton { 1064d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 1065316d498bSGreg Clayton value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic); 1066316d498bSGreg Clayton } 1067316d498bSGreg Clayton return value_list; 106878a685aaSJim Ingham } 106978a685aaSJim Ingham 107078a685aaSJim Ingham SBValueList 107178a685aaSJim Ingham SBFrame::GetVariables (bool arguments, 107278a685aaSJim Ingham bool locals, 107378a685aaSJim Ingham bool statics, 107478a685aaSJim Ingham bool in_scope_only, 10752837b766SJim Ingham lldb::DynamicValueType use_dynamic) 107678a685aaSJim Ingham { 10775160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1078ceb6b139SCaroline Tice 1079b9556accSGreg Clayton SBValueList value_list; 10804fc6cb9cSJim Ingham Mutex::Locker api_locker; 10814fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10824fc6cb9cSJim Ingham 1083b57e4a1bSJason Molenda StackFrame *frame = NULL; 1084d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1085b9556accSGreg Clayton 1086ceb6b139SCaroline Tice if (log) 10877730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 10884838131bSGreg Clayton arguments, 10894838131bSGreg Clayton locals, 10904838131bSGreg Clayton statics, 10914838131bSGreg Clayton in_scope_only); 1092ceb6b139SCaroline Tice 10937730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10947730b9a4SJim Ingham if (target && process) 109530fdc8d8SChris Lattner { 10967fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10977730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 10987fdf9ef1SGreg Clayton { 10997730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 11007730b9a4SJim Ingham if (frame) 11017730b9a4SJim Ingham { 110230fdc8d8SChris Lattner size_t i; 1103af67cecdSGreg Clayton VariableList *variable_list = NULL; 1104d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 110530fdc8d8SChris Lattner if (variable_list) 110630fdc8d8SChris Lattner { 110730fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 110830fdc8d8SChris Lattner if (num_variables) 110930fdc8d8SChris Lattner { 111030fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 111130fdc8d8SChris Lattner { 111230fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 111330fdc8d8SChris Lattner if (variable_sp) 111430fdc8d8SChris Lattner { 111530fdc8d8SChris Lattner bool add_variable = false; 111630fdc8d8SChris Lattner switch (variable_sp->GetScope()) 111730fdc8d8SChris Lattner { 111830fdc8d8SChris Lattner case eValueTypeVariableGlobal: 111930fdc8d8SChris Lattner case eValueTypeVariableStatic: 112030fdc8d8SChris Lattner add_variable = statics; 112130fdc8d8SChris Lattner break; 112230fdc8d8SChris Lattner 112330fdc8d8SChris Lattner case eValueTypeVariableArgument: 112430fdc8d8SChris Lattner add_variable = arguments; 112530fdc8d8SChris Lattner break; 112630fdc8d8SChris Lattner 112730fdc8d8SChris Lattner case eValueTypeVariableLocal: 112830fdc8d8SChris Lattner add_variable = locals; 112930fdc8d8SChris Lattner break; 1130c982c768SGreg Clayton 1131c982c768SGreg Clayton default: 1132c982c768SGreg Clayton break; 113330fdc8d8SChris Lattner } 113430fdc8d8SChris Lattner if (add_variable) 113530fdc8d8SChris Lattner { 1136d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 113730fdc8d8SChris Lattner continue; 113830fdc8d8SChris Lattner 1139e3e91517SEnrico Granata ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues)); 1140e3e91517SEnrico Granata SBValue value_sb; 1141e3e91517SEnrico Granata value_sb.SetSP(valobj_sp,use_dynamic); 1142e3e91517SEnrico Granata value_list.Append(value_sb); 114330fdc8d8SChris Lattner } 114430fdc8d8SChris Lattner } 114530fdc8d8SChris Lattner } 114630fdc8d8SChris Lattner } 114730fdc8d8SChris Lattner } 114830fdc8d8SChris Lattner } 1149c9858e4dSGreg Clayton else 1150c9858e4dSGreg Clayton { 1151c9858e4dSGreg Clayton if (log) 11527730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame."); 11537730b9a4SJim Ingham } 11547730b9a4SJim Ingham } 11557730b9a4SJim Ingham else 11567730b9a4SJim Ingham { 11577730b9a4SJim Ingham if (log) 11587730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: process is running"); 1159c9858e4dSGreg Clayton } 11607fdf9ef1SGreg Clayton } 1161ceb6b139SCaroline Tice 1162ceb6b139SCaroline Tice if (log) 1163ceb6b139SCaroline Tice { 116408ec0b61SEnrico Granata log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame, value_list.opaque_ptr()); 1165ceb6b139SCaroline Tice } 1166ceb6b139SCaroline Tice 116730fdc8d8SChris Lattner return value_list; 116830fdc8d8SChris Lattner } 116930fdc8d8SChris Lattner 117069b582faSGreg Clayton SBValueList 117130fdc8d8SChris Lattner SBFrame::GetRegisters () 117230fdc8d8SChris Lattner { 11735160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1174ceb6b139SCaroline Tice 117530fdc8d8SChris Lattner SBValueList value_list; 11764fc6cb9cSJim Ingham Mutex::Locker api_locker; 11774fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 11784fc6cb9cSJim Ingham 1179b57e4a1bSJason Molenda StackFrame *frame = NULL; 1180d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 11817730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 11827730b9a4SJim Ingham if (target && process) 118330fdc8d8SChris Lattner { 11847fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11857730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 11867730b9a4SJim Ingham { 11877730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 11887730b9a4SJim Ingham if (frame) 11897fdf9ef1SGreg Clayton { 1190d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 119130fdc8d8SChris Lattner if (reg_ctx) 119230fdc8d8SChris Lattner { 119330fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 119430fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 119530fdc8d8SChris Lattner { 1196d9e416c0SGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); 119730fdc8d8SChris Lattner } 119830fdc8d8SChris Lattner } 119930fdc8d8SChris Lattner } 1200c9858e4dSGreg Clayton else 1201c9858e4dSGreg Clayton { 1202c9858e4dSGreg Clayton if (log) 12037730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame."); 12047730b9a4SJim Ingham } 12057730b9a4SJim Ingham } 12067730b9a4SJim Ingham else 12077730b9a4SJim Ingham { 12087730b9a4SJim Ingham if (log) 12097730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: process is running"); 1210c9858e4dSGreg Clayton } 12117fdf9ef1SGreg Clayton } 1212ceb6b139SCaroline Tice 1213ceb6b139SCaroline Tice if (log) 121408ec0b61SEnrico Granata log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.opaque_ptr()); 1215ceb6b139SCaroline Tice 121630fdc8d8SChris Lattner return value_list; 121730fdc8d8SChris Lattner } 121830fdc8d8SChris Lattner 1219ad9a53c5SJason Molenda SBValue 1220ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name) 1221ad9a53c5SJason Molenda { 1222ad9a53c5SJason Molenda Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1223ad9a53c5SJason Molenda 1224ad9a53c5SJason Molenda SBValue result; 1225ad9a53c5SJason Molenda ValueObjectSP value_sp; 1226ad9a53c5SJason Molenda Mutex::Locker api_locker; 1227ad9a53c5SJason Molenda ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1228ad9a53c5SJason Molenda 1229b57e4a1bSJason Molenda StackFrame *frame = NULL; 1230ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 1231ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1232ad9a53c5SJason Molenda if (target && process) 1233ad9a53c5SJason Molenda { 1234ad9a53c5SJason Molenda Process::StopLocker stop_locker; 1235ad9a53c5SJason Molenda if (stop_locker.TryLock(&process->GetRunLock())) 1236ad9a53c5SJason Molenda { 1237ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 1238ad9a53c5SJason Molenda if (frame) 1239ad9a53c5SJason Molenda { 1240ad9a53c5SJason Molenda RegisterContextSP reg_ctx (frame->GetRegisterContext()); 1241ad9a53c5SJason Molenda if (reg_ctx) 1242ad9a53c5SJason Molenda { 1243ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 1244ad9a53c5SJason Molenda for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 1245ad9a53c5SJason Molenda { 1246ad9a53c5SJason Molenda const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 1247ad9a53c5SJason Molenda if (reg_info && 1248ad9a53c5SJason Molenda ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 1249ad9a53c5SJason Molenda (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 1250ad9a53c5SJason Molenda { 1251ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 1252ad9a53c5SJason Molenda result.SetSP (value_sp); 1253ad9a53c5SJason Molenda break; 1254ad9a53c5SJason Molenda } 1255ad9a53c5SJason Molenda } 1256ad9a53c5SJason Molenda } 1257ad9a53c5SJason Molenda } 1258ad9a53c5SJason Molenda else 1259ad9a53c5SJason Molenda { 1260ad9a53c5SJason Molenda if (log) 12615d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame."); 1262ad9a53c5SJason Molenda } 1263ad9a53c5SJason Molenda } 1264ad9a53c5SJason Molenda else 1265ad9a53c5SJason Molenda { 1266ad9a53c5SJason Molenda if (log) 12675d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: process is running"); 1268ad9a53c5SJason Molenda } 1269ad9a53c5SJason Molenda } 1270ad9a53c5SJason Molenda 1271ad9a53c5SJason Molenda if (log) 12725d353842SJason Molenda log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)", frame, value_sp.get()); 1273ad9a53c5SJason Molenda 1274ad9a53c5SJason Molenda return result; 1275ad9a53c5SJason Molenda } 1276ad9a53c5SJason Molenda 1277dde9cff3SCaroline Tice bool 1278dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 1279dde9cff3SCaroline Tice { 12805160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1281da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1282da7bc7d0SGreg Clayton 12834fc6cb9cSJim Ingham Mutex::Locker api_locker; 12844fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 12854fc6cb9cSJim Ingham 1286b57e4a1bSJason Molenda StackFrame *frame; 1287d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 12887730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 12897730b9a4SJim Ingham if (target && process) 1290dde9cff3SCaroline Tice { 12917fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12927730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 12937730b9a4SJim Ingham { 12947730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 12957730b9a4SJim Ingham if (frame) 12967fdf9ef1SGreg Clayton { 1297d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 1298dde9cff3SCaroline Tice } 1299c9858e4dSGreg Clayton else 1300c9858e4dSGreg Clayton { 1301c9858e4dSGreg Clayton if (log) 13027730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame."); 13037730b9a4SJim Ingham } 13047730b9a4SJim Ingham } 13057730b9a4SJim Ingham else 13067730b9a4SJim Ingham { 13077730b9a4SJim Ingham if (log) 13087730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: process is running"); 1309c9858e4dSGreg Clayton } 1310c9858e4dSGreg Clayton 13117fdf9ef1SGreg Clayton } 1312dde9cff3SCaroline Tice else 1313da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1314dde9cff3SCaroline Tice 1315dde9cff3SCaroline Tice return true; 1316dde9cff3SCaroline Tice } 13171d3afba3SGreg Clayton 131869b582faSGreg Clayton SBValue 13191d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 13201d3afba3SGreg Clayton { 1321316d498bSGreg Clayton SBValue result; 13227fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1323b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1324d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1325d9e416c0SGreg Clayton if (frame && target) 1326316d498bSGreg Clayton { 132735e1bda6SJim Ingham SBExpressionOptions options; 132835e1bda6SJim Ingham lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue(); 1329cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 133035e1bda6SJim Ingham options.SetUnwindOnError (true); 133135e1bda6SJim Ingham return EvaluateExpression (expr, options); 1332316d498bSGreg Clayton } 1333316d498bSGreg Clayton return result; 133478a685aaSJim Ingham } 133578a685aaSJim Ingham 133678a685aaSJim Ingham SBValue 13372837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 133878a685aaSJim Ingham { 133935e1bda6SJim Ingham SBExpressionOptions options; 1340cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 134135e1bda6SJim Ingham options.SetUnwindOnError (true); 134235e1bda6SJim Ingham return EvaluateExpression (expr, options); 13437ba6e991SJim Ingham } 13447ba6e991SJim Ingham 13457ba6e991SJim Ingham SBValue 13467ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error) 13477ba6e991SJim Ingham { 134835e1bda6SJim Ingham SBExpressionOptions options; 1349cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 135035e1bda6SJim Ingham options.SetUnwindOnError (unwind_on_error); 135135e1bda6SJim Ingham return EvaluateExpression (expr, options); 135235e1bda6SJim Ingham } 135335e1bda6SJim Ingham 135435e1bda6SJim Ingham lldb::SBValue 135535e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options) 135635e1bda6SJim Ingham { 13575160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 13584838131bSGreg Clayton 13595160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1360a162ebafSSean Callanan 136123f59509SGreg Clayton ExecutionResults exe_results = eExecutionSetupError; 136269b582faSGreg Clayton SBValue expr_result; 13637730b9a4SJim Ingham 13647730b9a4SJim Ingham if (expr == NULL || expr[0] == '\0') 13657730b9a4SJim Ingham { 13667730b9a4SJim Ingham if (log) 13677730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression called with an empty expression"); 13687730b9a4SJim Ingham return expr_result; 13697730b9a4SJim Ingham } 13707730b9a4SJim Ingham 137181e871edSGreg Clayton ValueObjectSP expr_value_sp; 13724838131bSGreg Clayton 13734fc6cb9cSJim Ingham Mutex::Locker api_locker; 13744fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 13754fc6cb9cSJim Ingham 1376b9556accSGreg Clayton if (log) 13777730b9a4SJim Ingham log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr); 1378b9556accSGreg Clayton 1379b57e4a1bSJason Molenda StackFrame *frame = NULL; 13807730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 13817730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 13827730b9a4SJim Ingham 13837730b9a4SJim Ingham if (target && process) 13841d3afba3SGreg Clayton { 13857fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13867730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 13877730b9a4SJim Ingham { 13887730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 13897730b9a4SJim Ingham if (frame) 13907fdf9ef1SGreg Clayton { 1391fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1392fb6621efSGreg Clayton { 13931ba7c4d0SGreg Clayton StreamString frame_description; 1394d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 13951ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 1396cced1566SGreg Clayton expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str()); 1397fb6621efSGreg Clayton } 1398fb6621efSGreg Clayton 1399d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 1400d9e416c0SGreg Clayton frame, 1401d4439aa9SEnrico Granata expr_value_sp, 140235e1bda6SJim Ingham options.ref()); 1403e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1404fb6621efSGreg Clayton 1405fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1406f49e65aeSGreg Clayton Host::SetCrashDescription (NULL); 14071d3afba3SGreg Clayton } 1408c9858e4dSGreg Clayton else 1409c9858e4dSGreg Clayton { 1410c9858e4dSGreg Clayton if (log) 14117730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame."); 14127730b9a4SJim Ingham } 14137730b9a4SJim Ingham } 14147730b9a4SJim Ingham else 14157730b9a4SJim Ingham { 14167730b9a4SJim Ingham if (log) 14177730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: process is running"); 1418c9858e4dSGreg Clayton } 14197fdf9ef1SGreg Clayton } 14204838131bSGreg Clayton 1421cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1422a162ebafSSean Callanan if (expr_log) 142378a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 1424fe42ac4dSGreg Clayton expr_result.GetValue(), 1425fe42ac4dSGreg Clayton expr_result.GetSummary()); 1426a162ebafSSean Callanan 14274838131bSGreg Clayton if (log) 1428d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 1429d9e416c0SGreg Clayton frame, 143078a685aaSJim Ingham expr, 143181e871edSGreg Clayton expr_value_sp.get(), 143225f3a3cdSJohnny Chen exe_results); 1433cf7e2dc0SJason Molenda #endif 14344838131bSGreg Clayton 1435cfd1acedSGreg Clayton return expr_result; 14361d3afba3SGreg Clayton } 1437316d498bSGreg Clayton 1438316d498bSGreg Clayton bool 1439316d498bSGreg Clayton SBFrame::IsInlined() 1440316d498bSGreg Clayton { 14415160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14427fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1443b57e4a1bSJason Molenda StackFrame *frame = NULL; 1444d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 14457730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 14467730b9a4SJim Ingham if (target && process) 1447316d498bSGreg Clayton { 14487fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 14497730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 14507730b9a4SJim Ingham { 14517730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 14527730b9a4SJim Ingham if (frame) 14537fdf9ef1SGreg Clayton { 14547fdf9ef1SGreg Clayton 1455d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1456316d498bSGreg Clayton if (block) 1457316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 1458316d498bSGreg Clayton } 1459c9858e4dSGreg Clayton else 1460c9858e4dSGreg Clayton { 1461c9858e4dSGreg Clayton if (log) 14627730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame."); 14637730b9a4SJim Ingham } 14647730b9a4SJim Ingham } 14657730b9a4SJim Ingham else 14667730b9a4SJim Ingham { 14677730b9a4SJim Ingham if (log) 14687730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: process is running"); 1469c9858e4dSGreg Clayton } 1470c9858e4dSGreg Clayton 14717fdf9ef1SGreg Clayton } 1472316d498bSGreg Clayton return false; 1473316d498bSGreg Clayton } 1474316d498bSGreg Clayton 1475316d498bSGreg Clayton const char * 1476316d498bSGreg Clayton SBFrame::GetFunctionName() 1477316d498bSGreg Clayton { 14785160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1479316d498bSGreg Clayton const char *name = NULL; 14807fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1481b57e4a1bSJason Molenda StackFrame *frame = NULL; 1482d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 14837730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 14847730b9a4SJim Ingham if (target && process) 1485316d498bSGreg Clayton { 14867fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 14877730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 14887730b9a4SJim Ingham { 14897730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 14907730b9a4SJim Ingham if (frame) 14917fdf9ef1SGreg Clayton { 1492d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1493316d498bSGreg Clayton if (sc.block) 1494316d498bSGreg Clayton { 1495316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1496316d498bSGreg Clayton if (inlined_block) 1497316d498bSGreg Clayton { 1498316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1499316d498bSGreg Clayton name = inlined_info->GetName().AsCString(); 1500316d498bSGreg Clayton } 1501316d498bSGreg Clayton } 1502316d498bSGreg Clayton 1503316d498bSGreg Clayton if (name == NULL) 1504316d498bSGreg Clayton { 1505316d498bSGreg Clayton if (sc.function) 1506316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1507316d498bSGreg Clayton } 1508316d498bSGreg Clayton 1509316d498bSGreg Clayton if (name == NULL) 1510316d498bSGreg Clayton { 1511316d498bSGreg Clayton if (sc.symbol) 1512316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1513316d498bSGreg Clayton } 1514316d498bSGreg Clayton } 1515c9858e4dSGreg Clayton else 1516c9858e4dSGreg Clayton { 1517c9858e4dSGreg Clayton if (log) 15187730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame."); 15197730b9a4SJim Ingham } 15207730b9a4SJim Ingham } 15217730b9a4SJim Ingham else 15227730b9a4SJim Ingham { 15237730b9a4SJim Ingham if (log) 15247730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName() => error: process is running"); 1525c9858e4dSGreg Clayton 1526c9858e4dSGreg Clayton } 15277fdf9ef1SGreg Clayton } 1528316d498bSGreg Clayton return name; 1529316d498bSGreg Clayton } 1530316d498bSGreg Clayton 1531