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 10*dbb0abbfSEugene Zelenko // C Includes 11*dbb0abbfSEugene Zelenko // C++ Includes 1230fdc8d8SChris Lattner #include <algorithm> 13*dbb0abbfSEugene Zelenko #include <string> 14*dbb0abbfSEugene Zelenko 15*dbb0abbfSEugene Zelenko // Other libraries and framework includes 16*dbb0abbfSEugene Zelenko // Project includes 17*dbb0abbfSEugene Zelenko #include "lldb/API/SBFrame.h" 1830fdc8d8SChris Lattner 1930fdc8d8SChris Lattner #include "lldb/lldb-types.h" 2030fdc8d8SChris Lattner 2130fdc8d8SChris Lattner #include "lldb/Core/Address.h" 2230fdc8d8SChris Lattner #include "lldb/Core/ConstString.h" 23ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 2430fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2530fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2630fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h" 2730fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h" 284dbb271fSSean Callanan #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h" 29151c032cSJim Ingham #include "lldb/Expression/UserExpression.h" 301ba7c4d0SGreg Clayton #include "lldb/Host/Host.h" 3130fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 321f746071SGreg Clayton #include "lldb/Symbol/Function.h" 331f746071SGreg Clayton #include "lldb/Symbol/Symbol.h" 3430fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 3530fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h" 3630fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h" 3730fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h" 3830fdc8d8SChris Lattner #include "lldb/Target/Target.h" 3930fdc8d8SChris Lattner #include "lldb/Target/Process.h" 4030fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 41b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h" 42b9556accSGreg Clayton #include "lldb/Target/StackID.h" 4330fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 4430fdc8d8SChris Lattner 454c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 464c5de699SEli Friedman #include "lldb/API/SBValue.h" 474c5de699SEli Friedman #include "lldb/API/SBAddress.h" 4835e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h" 49dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 504c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h" 514c5de699SEli Friedman #include "lldb/API/SBThread.h" 5251f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h" 5330fdc8d8SChris Lattner 5430fdc8d8SChris Lattner using namespace lldb; 5530fdc8d8SChris Lattner using namespace lldb_private; 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner SBFrame::SBFrame () : 587fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef()) 5930fdc8d8SChris Lattner { 6030fdc8d8SChris Lattner } 6130fdc8d8SChris Lattner 62b57e4a1bSJason Molenda SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) : 637fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (lldb_object_sp)) 6430fdc8d8SChris Lattner { 655160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 66ceb6b139SCaroline Tice 67ceb6b139SCaroline Tice if (log) 68ceb6b139SCaroline Tice { 69ceb6b139SCaroline Tice SBStream sstr; 70ceb6b139SCaroline Tice GetDescription (sstr); 714838131bSGreg Clayton log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s", 72324a1036SSaleem Abdulrasool static_cast<void*>(lldb_object_sp.get()), 73324a1036SSaleem Abdulrasool static_cast<void*>(lldb_object_sp.get()), sstr.GetData()); 74ceb6b139SCaroline Tice } 7530fdc8d8SChris Lattner } 7630fdc8d8SChris Lattner 77efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) : 787fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp)) 79efabb123SGreg Clayton { 80efabb123SGreg Clayton } 81efabb123SGreg Clayton 82*dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default; 83*dbb0abbfSEugene Zelenko 84efabb123SGreg Clayton const SBFrame & 85efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs) 86efabb123SGreg Clayton { 87efabb123SGreg Clayton if (this != &rhs) 887fdf9ef1SGreg Clayton *m_opaque_sp = *rhs.m_opaque_sp; 89efabb123SGreg Clayton return *this; 90efabb123SGreg Clayton } 91efabb123SGreg Clayton 92b57e4a1bSJason Molenda StackFrameSP 93b9556accSGreg Clayton SBFrame::GetFrameSP() const 94b9556accSGreg Clayton { 95*dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP()); 96b9556accSGreg Clayton } 9730fdc8d8SChris Lattner 9830fdc8d8SChris Lattner void 99b57e4a1bSJason Molenda SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp) 10030fdc8d8SChris Lattner { 1017fdf9ef1SGreg Clayton return m_opaque_sp->SetFrameSP(lldb_object_sp); 102b9556accSGreg Clayton } 10330fdc8d8SChris Lattner 10430fdc8d8SChris Lattner bool 10530fdc8d8SChris Lattner SBFrame::IsValid() const 10630fdc8d8SChris Lattner { 107*dbb0abbfSEugene Zelenko return GetFrameSP().get() != nullptr; 10830fdc8d8SChris Lattner } 10930fdc8d8SChris Lattner 11030fdc8d8SChris Lattner SBSymbolContext 11130fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const 11230fdc8d8SChris Lattner { 1135160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 11430fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 1154fc6cb9cSJim Ingham Mutex::Locker api_locker; 1164fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1174fc6cb9cSJim Ingham 118*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 119d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1207730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1217730b9a4SJim Ingham if (target && process) 122af67cecdSGreg Clayton { 1237fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1247730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 1257730b9a4SJim Ingham { 1267730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1277730b9a4SJim Ingham if (frame) 1287fdf9ef1SGreg Clayton { 129d9e416c0SGreg Clayton sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope)); 130af67cecdSGreg Clayton } 131c9858e4dSGreg Clayton else 132c9858e4dSGreg Clayton { 133c9858e4dSGreg Clayton if (log) 1347730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame."); 1357730b9a4SJim Ingham } 1367730b9a4SJim Ingham } 1377730b9a4SJim Ingham else 1387730b9a4SJim Ingham { 1397730b9a4SJim Ingham if (log) 1407730b9a4SJim Ingham log->Printf ("SBFrame::GetSymbolContext () => error: process is running"); 141c9858e4dSGreg Clayton } 1427fdf9ef1SGreg Clayton } 143ceb6b139SCaroline Tice 144ceb6b139SCaroline Tice if (log) 1454838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)", 146324a1036SSaleem Abdulrasool static_cast<void*>(frame), resolve_scope, 147324a1036SSaleem Abdulrasool static_cast<void*>(sb_sym_ctx.get())); 148ceb6b139SCaroline Tice 14930fdc8d8SChris Lattner return sb_sym_ctx; 15030fdc8d8SChris Lattner } 15130fdc8d8SChris Lattner 15230fdc8d8SChris Lattner SBModule 15330fdc8d8SChris Lattner SBFrame::GetModule () const 15430fdc8d8SChris Lattner { 1555160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 15672eff18aSGreg Clayton SBModule sb_module; 157acdbe816SGreg Clayton ModuleSP module_sp; 1584fc6cb9cSJim Ingham Mutex::Locker api_locker; 1594fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1604fc6cb9cSJim Ingham 161*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 162d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1637730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1647730b9a4SJim Ingham if (target && process) 165af67cecdSGreg Clayton { 1667fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1677730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 1687730b9a4SJim Ingham { 1697730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1707730b9a4SJim Ingham if (frame) 1717fdf9ef1SGreg Clayton { 172d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp; 173acdbe816SGreg Clayton sb_module.SetSP (module_sp); 174af67cecdSGreg Clayton } 175c9858e4dSGreg Clayton else 176c9858e4dSGreg Clayton { 177c9858e4dSGreg Clayton if (log) 1787730b9a4SJim Ingham log->Printf ("SBFrame::GetModule () => error: could not reconstruct frame object for this SBFrame."); 1797730b9a4SJim Ingham } 1807730b9a4SJim Ingham } 1817730b9a4SJim Ingham else 1827730b9a4SJim Ingham { 1837730b9a4SJim Ingham if (log) 1847730b9a4SJim Ingham log->Printf ("SBFrame::GetModule () => error: process is running"); 185c9858e4dSGreg Clayton } 1867fdf9ef1SGreg Clayton } 18772eff18aSGreg Clayton 1884838131bSGreg Clayton if (log) 1894838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)", 190324a1036SSaleem Abdulrasool static_cast<void*>(frame), 191324a1036SSaleem Abdulrasool static_cast<void*>(module_sp.get())); 1924838131bSGreg Clayton 19330fdc8d8SChris Lattner return sb_module; 19430fdc8d8SChris Lattner } 19530fdc8d8SChris Lattner 19630fdc8d8SChris Lattner SBCompileUnit 19730fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 19830fdc8d8SChris Lattner { 1995160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 20072eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 2014fc6cb9cSJim Ingham Mutex::Locker api_locker; 2024fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2034fc6cb9cSJim Ingham 204*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 205d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2067730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 2077730b9a4SJim Ingham if (target && process) 208af67cecdSGreg Clayton { 2097fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2107730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 2117730b9a4SJim Ingham { 2127730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 2137730b9a4SJim Ingham if (frame) 2147fdf9ef1SGreg Clayton { 215d9e416c0SGreg Clayton sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 216af67cecdSGreg Clayton } 217c9858e4dSGreg Clayton else 218c9858e4dSGreg Clayton { 219ceb6b139SCaroline Tice if (log) 2207730b9a4SJim Ingham log->Printf ("SBFrame::GetCompileUnit () => error: could not reconstruct frame object for this SBFrame."); 2217730b9a4SJim Ingham } 2227730b9a4SJim Ingham } 2237730b9a4SJim Ingham else 2247730b9a4SJim Ingham { 2257730b9a4SJim Ingham if (log) 2267730b9a4SJim Ingham log->Printf ("SBFrame::GetCompileUnit () => error: process is running"); 227c9858e4dSGreg Clayton } 228c9858e4dSGreg Clayton } 229c9858e4dSGreg Clayton if (log) 230c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)", 231324a1036SSaleem Abdulrasool static_cast<void*>(frame), 232324a1036SSaleem Abdulrasool static_cast<void*>(sb_comp_unit.get())); 233ceb6b139SCaroline Tice 23430fdc8d8SChris Lattner return sb_comp_unit; 23530fdc8d8SChris Lattner } 23630fdc8d8SChris Lattner 23730fdc8d8SChris Lattner SBFunction 23830fdc8d8SChris Lattner SBFrame::GetFunction () const 23930fdc8d8SChris Lattner { 2405160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 24172eff18aSGreg Clayton SBFunction sb_function; 2424fc6cb9cSJim Ingham Mutex::Locker api_locker; 2434fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2444fc6cb9cSJim Ingham 245*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 246d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2477730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 2487730b9a4SJim Ingham if (target && process) 249af67cecdSGreg Clayton { 2507fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2517730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 2527730b9a4SJim Ingham { 2537730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 2547730b9a4SJim Ingham if (frame) 2557fdf9ef1SGreg Clayton { 256d9e416c0SGreg Clayton sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function); 257af67cecdSGreg Clayton } 258c9858e4dSGreg Clayton else 259c9858e4dSGreg Clayton { 260c9858e4dSGreg Clayton if (log) 2617730b9a4SJim Ingham log->Printf ("SBFrame::GetFunction () => error: could not reconstruct frame object for this SBFrame."); 2627730b9a4SJim Ingham } 2637730b9a4SJim Ingham } 2647730b9a4SJim Ingham else 2657730b9a4SJim Ingham { 2667730b9a4SJim Ingham if (log) 2677730b9a4SJim Ingham log->Printf ("SBFrame::GetFunction () => error: process is running"); 2687fdf9ef1SGreg Clayton } 269c9858e4dSGreg Clayton } 2704838131bSGreg Clayton if (log) 2714838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)", 272324a1036SSaleem Abdulrasool static_cast<void*>(frame), 273324a1036SSaleem Abdulrasool static_cast<void*>(sb_function.get())); 2744838131bSGreg Clayton 27530fdc8d8SChris Lattner return sb_function; 27630fdc8d8SChris Lattner } 27730fdc8d8SChris Lattner 2783b06557eSGreg Clayton SBSymbol 2793b06557eSGreg Clayton SBFrame::GetSymbol () const 2803b06557eSGreg Clayton { 2815160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 28272eff18aSGreg Clayton SBSymbol sb_symbol; 2834fc6cb9cSJim Ingham Mutex::Locker api_locker; 2844fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2854fc6cb9cSJim Ingham 286*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 287d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2887730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 2897730b9a4SJim Ingham if (target && process) 290af67cecdSGreg Clayton { 2917fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2927730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 2937730b9a4SJim Ingham { 2947730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 2957730b9a4SJim Ingham if (frame) 2967fdf9ef1SGreg Clayton { 297d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol); 298af67cecdSGreg Clayton } 299c9858e4dSGreg Clayton else 300c9858e4dSGreg Clayton { 301c9858e4dSGreg Clayton if (log) 3027730b9a4SJim Ingham log->Printf ("SBFrame::GetSymbol () => error: could not reconstruct frame object for this SBFrame."); 3037730b9a4SJim Ingham } 3047730b9a4SJim Ingham } 3057730b9a4SJim Ingham else 3067730b9a4SJim Ingham { 3077730b9a4SJim Ingham if (log) 3087730b9a4SJim Ingham log->Printf ("SBFrame::GetSymbol () => error: process is running"); 3097fdf9ef1SGreg Clayton } 310c9858e4dSGreg Clayton } 3114838131bSGreg Clayton if (log) 3124838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 313324a1036SSaleem Abdulrasool static_cast<void*>(frame), 314324a1036SSaleem Abdulrasool static_cast<void*>(sb_symbol.get())); 3153b06557eSGreg Clayton return sb_symbol; 3163b06557eSGreg Clayton } 3173b06557eSGreg Clayton 31830fdc8d8SChris Lattner SBBlock 31930fdc8d8SChris Lattner SBFrame::GetBlock () const 32030fdc8d8SChris Lattner { 3215160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 32272eff18aSGreg Clayton SBBlock sb_block; 3234fc6cb9cSJim Ingham Mutex::Locker api_locker; 3244fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3254fc6cb9cSJim Ingham 326*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 327d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3287730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 3297730b9a4SJim Ingham if (target && process) 330af67cecdSGreg Clayton { 3317fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3327730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 3337730b9a4SJim Ingham { 3347730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 3357730b9a4SJim Ingham if (frame) 3367fdf9ef1SGreg Clayton { 337d9e416c0SGreg Clayton sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block); 338af67cecdSGreg Clayton } 339c9858e4dSGreg Clayton else 340c9858e4dSGreg Clayton { 341c9858e4dSGreg Clayton if (log) 3427730b9a4SJim Ingham log->Printf ("SBFrame::GetBlock () => error: could not reconstruct frame object for this SBFrame."); 3437730b9a4SJim Ingham } 3447730b9a4SJim Ingham } 3457730b9a4SJim Ingham else 3467730b9a4SJim Ingham { 3477730b9a4SJim Ingham if (log) 348324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", 349324a1036SSaleem Abdulrasool static_cast<void*>(frame)); 3507fdf9ef1SGreg Clayton } 351c9858e4dSGreg Clayton } 3524838131bSGreg Clayton if (log) 3534838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)", 354324a1036SSaleem Abdulrasool static_cast<void*>(frame), 355324a1036SSaleem Abdulrasool static_cast<void*>(sb_block.GetPtr())); 35630fdc8d8SChris Lattner return sb_block; 35730fdc8d8SChris Lattner } 35830fdc8d8SChris Lattner 35995897c6aSGreg Clayton SBBlock 36095897c6aSGreg Clayton SBFrame::GetFrameBlock () const 36195897c6aSGreg Clayton { 36272eff18aSGreg Clayton SBBlock sb_block; 3634fc6cb9cSJim Ingham Mutex::Locker api_locker; 3644fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3654fc6cb9cSJim Ingham 366*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 367d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3685160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3697730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 3707730b9a4SJim Ingham if (target && process) 371af67cecdSGreg Clayton { 3727fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3737730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 3747730b9a4SJim Ingham { 3757730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 3767730b9a4SJim Ingham if (frame) 3777fdf9ef1SGreg Clayton { 378d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock ()); 379af67cecdSGreg Clayton } 380c9858e4dSGreg Clayton else 381c9858e4dSGreg Clayton { 382c9858e4dSGreg Clayton if (log) 3837730b9a4SJim Ingham log->Printf ("SBFrame::GetFrameBlock () => error: could not reconstruct frame object for this SBFrame."); 3847730b9a4SJim Ingham } 3857730b9a4SJim Ingham } 3867730b9a4SJim Ingham else 3877730b9a4SJim Ingham { 3887730b9a4SJim Ingham if (log) 3897730b9a4SJim Ingham log->Printf ("SBFrame::GetFrameBlock () => error: process is running"); 3907fdf9ef1SGreg Clayton } 391c9858e4dSGreg Clayton } 3924838131bSGreg Clayton if (log) 3934838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 394324a1036SSaleem Abdulrasool static_cast<void*>(frame), 395324a1036SSaleem Abdulrasool static_cast<void*>(sb_block.GetPtr())); 39695897c6aSGreg Clayton return sb_block; 39795897c6aSGreg Clayton } 39895897c6aSGreg Clayton 39930fdc8d8SChris Lattner SBLineEntry 40030fdc8d8SChris Lattner SBFrame::GetLineEntry () const 40130fdc8d8SChris Lattner { 4025160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 40372eff18aSGreg Clayton SBLineEntry sb_line_entry; 4044fc6cb9cSJim Ingham Mutex::Locker api_locker; 4054fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4064fc6cb9cSJim Ingham 407*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 408d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4097730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 4107730b9a4SJim Ingham if (target && process) 411af67cecdSGreg Clayton { 4127fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4137730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 4147730b9a4SJim Ingham { 4157730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 4167730b9a4SJim Ingham if (frame) 4177fdf9ef1SGreg Clayton { 418d9e416c0SGreg Clayton sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry); 419af67cecdSGreg Clayton } 420c9858e4dSGreg Clayton else 421c9858e4dSGreg Clayton { 422c9858e4dSGreg Clayton if (log) 4237730b9a4SJim Ingham log->Printf ("SBFrame::GetLineEntry () => error: could not reconstruct frame object for this SBFrame."); 4247730b9a4SJim Ingham } 4257730b9a4SJim Ingham } 4267730b9a4SJim Ingham else 4277730b9a4SJim Ingham { 4287730b9a4SJim Ingham if (log) 4297730b9a4SJim Ingham log->Printf ("SBFrame::GetLineEntry () => error: process is running"); 4307fdf9ef1SGreg Clayton } 431c9858e4dSGreg Clayton } 4324838131bSGreg Clayton if (log) 4334838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 434324a1036SSaleem Abdulrasool static_cast<void*>(frame), 435324a1036SSaleem Abdulrasool static_cast<void*>(sb_line_entry.get())); 43630fdc8d8SChris Lattner return sb_line_entry; 43730fdc8d8SChris Lattner } 43830fdc8d8SChris Lattner 43930fdc8d8SChris Lattner uint32_t 44030fdc8d8SChris Lattner SBFrame::GetFrameID () const 44130fdc8d8SChris Lattner { 442b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 443b9556accSGreg Clayton 4447fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 445b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 4467fdf9ef1SGreg Clayton if (frame) 447d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex (); 4484838131bSGreg Clayton 4495160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4504838131bSGreg Clayton if (log) 4514838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameID () => %u", 452324a1036SSaleem Abdulrasool static_cast<void*>(frame), frame_idx); 4534838131bSGreg Clayton return frame_idx; 45430fdc8d8SChris Lattner } 45530fdc8d8SChris Lattner 456424a5dbcSGreg Clayton lldb::addr_t 457424a5dbcSGreg Clayton SBFrame::GetCFA () const 458424a5dbcSGreg Clayton { 459424a5dbcSGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 460424a5dbcSGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 461424a5dbcSGreg Clayton if (frame) 462424a5dbcSGreg Clayton return frame->GetStackID().GetCallFrameAddress(); 463424a5dbcSGreg Clayton return LLDB_INVALID_ADDRESS; 464424a5dbcSGreg Clayton } 465424a5dbcSGreg Clayton 46669b582faSGreg Clayton addr_t 46730fdc8d8SChris Lattner SBFrame::GetPC () const 46830fdc8d8SChris Lattner { 4695160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 47069b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 4714fc6cb9cSJim Ingham Mutex::Locker api_locker; 4724fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4734fc6cb9cSJim Ingham 474*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 475d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4767730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 4777730b9a4SJim Ingham if (target && process) 478af67cecdSGreg Clayton { 4797fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4807730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 4817730b9a4SJim Ingham { 4827730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 4837730b9a4SJim Ingham if (frame) 4847fdf9ef1SGreg Clayton { 48525b9f7ebSTamas Berghammer addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target, eAddressClassCode); 486af67cecdSGreg Clayton } 487c9858e4dSGreg Clayton else 488c9858e4dSGreg Clayton { 489c9858e4dSGreg Clayton if (log) 4907730b9a4SJim Ingham log->Printf ("SBFrame::GetPC () => error: could not reconstruct frame object for this SBFrame."); 4917730b9a4SJim Ingham } 4927730b9a4SJim Ingham } 4937730b9a4SJim Ingham else 4947730b9a4SJim Ingham { 4957730b9a4SJim Ingham if (log) 4967730b9a4SJim Ingham log->Printf ("SBFrame::GetPC () => error: process is running"); 497c9858e4dSGreg Clayton } 4987fdf9ef1SGreg Clayton } 499ceb6b139SCaroline Tice 500ceb6b139SCaroline Tice if (log) 501324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetPC () => 0x%" PRIx64, 502324a1036SSaleem Abdulrasool static_cast<void*>(frame), addr); 503ceb6b139SCaroline Tice 504ceb6b139SCaroline Tice return addr; 50530fdc8d8SChris Lattner } 50630fdc8d8SChris Lattner 50730fdc8d8SChris Lattner bool 50869b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc) 50930fdc8d8SChris Lattner { 5105160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 511ceb6b139SCaroline Tice bool ret_val = false; 5124fc6cb9cSJim Ingham Mutex::Locker api_locker; 5134fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5144fc6cb9cSJim Ingham 515*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 516d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5177730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 5187730b9a4SJim Ingham if (target && process) 519af67cecdSGreg Clayton { 5207fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5217730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 5227730b9a4SJim Ingham { 5237730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5247730b9a4SJim Ingham if (frame) 5257fdf9ef1SGreg Clayton { 526d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC (new_pc); 527af67cecdSGreg Clayton } 528c9858e4dSGreg Clayton else 529c9858e4dSGreg Clayton { 530c9858e4dSGreg Clayton if (log) 5317730b9a4SJim Ingham log->Printf ("SBFrame::SetPC () => error: could not reconstruct frame object for this SBFrame."); 5327730b9a4SJim Ingham } 5337730b9a4SJim Ingham } 5347730b9a4SJim Ingham else 5357730b9a4SJim Ingham { 5367730b9a4SJim Ingham if (log) 5377730b9a4SJim Ingham log->Printf ("SBFrame::SetPC () => error: process is running"); 538c9858e4dSGreg Clayton } 5397fdf9ef1SGreg Clayton } 540ceb6b139SCaroline Tice 541ceb6b139SCaroline Tice if (log) 542d01b2953SDaniel Malea log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i", 543324a1036SSaleem Abdulrasool static_cast<void*>(frame), new_pc, ret_val); 544ceb6b139SCaroline Tice 545ceb6b139SCaroline Tice return ret_val; 54630fdc8d8SChris Lattner } 54730fdc8d8SChris Lattner 54869b582faSGreg Clayton addr_t 54930fdc8d8SChris Lattner SBFrame::GetSP () const 55030fdc8d8SChris Lattner { 5515160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5524838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 5534fc6cb9cSJim Ingham Mutex::Locker api_locker; 5544fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5554fc6cb9cSJim Ingham 556*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 557d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5587730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 5597730b9a4SJim Ingham if (target && process) 560af67cecdSGreg Clayton { 5617fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5627730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 5637730b9a4SJim Ingham { 5647730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5657730b9a4SJim Ingham if (frame) 5667fdf9ef1SGreg Clayton { 567d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 568af67cecdSGreg Clayton } 569c9858e4dSGreg Clayton else 570c9858e4dSGreg Clayton { 571c9858e4dSGreg Clayton if (log) 5727730b9a4SJim Ingham log->Printf ("SBFrame::GetSP () => error: could not reconstruct frame object for this SBFrame."); 5737730b9a4SJim Ingham } 5747730b9a4SJim Ingham } 5757730b9a4SJim Ingham else 5767730b9a4SJim Ingham { 5777730b9a4SJim Ingham if (log) 5787730b9a4SJim Ingham log->Printf ("SBFrame::GetSP () => error: process is running"); 5797fdf9ef1SGreg Clayton } 580c9858e4dSGreg Clayton } 5814838131bSGreg Clayton if (log) 582324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetSP () => 0x%" PRIx64, 583324a1036SSaleem Abdulrasool static_cast<void*>(frame), addr); 5844838131bSGreg Clayton 5854838131bSGreg Clayton return addr; 58630fdc8d8SChris Lattner } 58730fdc8d8SChris Lattner 58869b582faSGreg Clayton addr_t 58930fdc8d8SChris Lattner SBFrame::GetFP () const 59030fdc8d8SChris Lattner { 5915160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 59269b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 5934fc6cb9cSJim Ingham Mutex::Locker api_locker; 5944fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5954fc6cb9cSJim Ingham 596*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 597d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5987730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 5997730b9a4SJim Ingham if (target && process) 600af67cecdSGreg Clayton { 6017fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6027730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 6037730b9a4SJim Ingham { 6047730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 6057730b9a4SJim Ingham if (frame) 6067fdf9ef1SGreg Clayton { 607d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 608af67cecdSGreg Clayton } 609c9858e4dSGreg Clayton else 610c9858e4dSGreg Clayton { 611c9858e4dSGreg Clayton if (log) 6127730b9a4SJim Ingham log->Printf ("SBFrame::GetFP () => error: could not reconstruct frame object for this SBFrame."); 6137730b9a4SJim Ingham } 6147730b9a4SJim Ingham } 6157730b9a4SJim Ingham else 6167730b9a4SJim Ingham { 6177730b9a4SJim Ingham if (log) 6187730b9a4SJim Ingham log->Printf ("SBFrame::GetFP () => error: process is running"); 619c9858e4dSGreg Clayton } 6207fdf9ef1SGreg Clayton } 621ceb6b139SCaroline Tice 622ceb6b139SCaroline Tice if (log) 623324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetFP () => 0x%" PRIx64, 624324a1036SSaleem Abdulrasool static_cast<void*>(frame), addr); 625ceb6b139SCaroline Tice return addr; 62630fdc8d8SChris Lattner } 62730fdc8d8SChris Lattner 62830fdc8d8SChris Lattner SBAddress 62930fdc8d8SChris Lattner SBFrame::GetPCAddress () const 63030fdc8d8SChris Lattner { 6315160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 63230fdc8d8SChris Lattner SBAddress sb_addr; 6334fc6cb9cSJim Ingham Mutex::Locker api_locker; 6344fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 6354fc6cb9cSJim Ingham 636b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 637d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6387730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 6397730b9a4SJim Ingham if (target && process) 640af67cecdSGreg Clayton { 6417fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6427730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 6437730b9a4SJim Ingham { 6447730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 6457730b9a4SJim Ingham if (frame) 6467fdf9ef1SGreg Clayton { 647d9e416c0SGreg Clayton sb_addr.SetAddress (&frame->GetFrameCodeAddress()); 648af67cecdSGreg Clayton } 649c9858e4dSGreg Clayton else 650c9858e4dSGreg Clayton { 651c9858e4dSGreg Clayton if (log) 6527730b9a4SJim Ingham log->Printf ("SBFrame::GetPCAddress () => error: could not reconstruct frame object for this SBFrame."); 6537730b9a4SJim Ingham } 6547730b9a4SJim Ingham } 6557730b9a4SJim Ingham else 6567730b9a4SJim Ingham { 6577730b9a4SJim Ingham if (log) 6587730b9a4SJim Ingham log->Printf ("SBFrame::GetPCAddress () => error: process is running"); 6597fdf9ef1SGreg Clayton } 660c9858e4dSGreg Clayton } 6614838131bSGreg Clayton if (log) 662324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", 663324a1036SSaleem Abdulrasool static_cast<void*>(frame), 664324a1036SSaleem Abdulrasool static_cast<void*>(sb_addr.get())); 66530fdc8d8SChris Lattner return sb_addr; 66630fdc8d8SChris Lattner } 66730fdc8d8SChris Lattner 66830fdc8d8SChris Lattner void 66930fdc8d8SChris Lattner SBFrame::Clear() 67030fdc8d8SChris Lattner { 671af2589eaSGreg Clayton m_opaque_sp->Clear(); 67230fdc8d8SChris Lattner } 67330fdc8d8SChris Lattner 6747edbdfc9SGreg Clayton lldb::SBValue 6757edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path) 6767edbdfc9SGreg Clayton { 6777edbdfc9SGreg Clayton SBValue sb_value; 6787fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 679b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 680d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 681d9e416c0SGreg Clayton if (frame && target) 6827edbdfc9SGreg Clayton { 683d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 6847edbdfc9SGreg Clayton sb_value = GetValueForVariablePath (var_path, use_dynamic); 6857edbdfc9SGreg Clayton } 6867edbdfc9SGreg Clayton return sb_value; 6877edbdfc9SGreg Clayton } 6887edbdfc9SGreg Clayton 6897edbdfc9SGreg Clayton lldb::SBValue 6907edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic) 6917edbdfc9SGreg Clayton { 6927edbdfc9SGreg Clayton SBValue sb_value; 6934fc6cb9cSJim Ingham Mutex::Locker api_locker; 6945160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 695*dbb0abbfSEugene Zelenko if (var_path == nullptr || var_path[0] == '\0') 6967730b9a4SJim Ingham { 6977730b9a4SJim Ingham if (log) 6987730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath called with empty variable path."); 6997730b9a4SJim Ingham return sb_value; 7007730b9a4SJim Ingham } 7017730b9a4SJim Ingham 7024fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 7034fc6cb9cSJim Ingham 704*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 705d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7067730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 7077730b9a4SJim Ingham if (target && process) 7087edbdfc9SGreg Clayton { 7097fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7107730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 7117730b9a4SJim Ingham { 7127730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 7137730b9a4SJim Ingham if (frame) 7147fdf9ef1SGreg Clayton { 7157edbdfc9SGreg Clayton VariableSP var_sp; 7167edbdfc9SGreg Clayton Error error; 717d9e416c0SGreg Clayton ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path, 718e3e91517SEnrico Granata eNoDynamicValues, 719b57e4a1bSJason Molenda StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 7207edbdfc9SGreg Clayton var_sp, 7217edbdfc9SGreg Clayton error)); 722e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 7237edbdfc9SGreg Clayton } 724c9858e4dSGreg Clayton else 725c9858e4dSGreg Clayton { 726c9858e4dSGreg Clayton if (log) 7277730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath () => error: could not reconstruct frame object for this SBFrame."); 7287730b9a4SJim Ingham } 7297730b9a4SJim Ingham } 7307730b9a4SJim Ingham else 7317730b9a4SJim Ingham { 7327730b9a4SJim Ingham if (log) 7337730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath () => error: process is running"); 734c9858e4dSGreg Clayton } 7357fdf9ef1SGreg Clayton } 7367edbdfc9SGreg Clayton return sb_value; 7377edbdfc9SGreg Clayton } 7387edbdfc9SGreg Clayton 73930fdc8d8SChris Lattner SBValue 74069b582faSGreg Clayton SBFrame::FindVariable (const char *name) 74130fdc8d8SChris Lattner { 742316d498bSGreg Clayton SBValue value; 7437fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 744b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 745d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 746d9e416c0SGreg Clayton if (frame && target) 747316d498bSGreg Clayton { 748d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 749316d498bSGreg Clayton value = FindVariable (name, use_dynamic); 750316d498bSGreg Clayton } 751316d498bSGreg Clayton return value; 75278a685aaSJim Ingham } 75378a685aaSJim Ingham 75478a685aaSJim Ingham SBValue 7552837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic) 75678a685aaSJim Ingham { 7575160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 75869b582faSGreg Clayton VariableSP var_sp; 75958b59f95SJim Ingham SBValue sb_value; 7607730b9a4SJim Ingham 761*dbb0abbfSEugene Zelenko if (name == nullptr || name[0] == '\0') 7627730b9a4SJim Ingham { 7637730b9a4SJim Ingham if (log) 7647730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable called with empty name"); 7657730b9a4SJim Ingham return sb_value; 7667730b9a4SJim Ingham } 7677730b9a4SJim Ingham 76881e871edSGreg Clayton ValueObjectSP value_sp; 7694fc6cb9cSJim Ingham Mutex::Locker api_locker; 7704fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 7714fc6cb9cSJim Ingham 772*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 773d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7747730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 7757730b9a4SJim Ingham if (target && process) 77630fdc8d8SChris Lattner { 7777fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7787730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 7797730b9a4SJim Ingham { 7807730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 7817730b9a4SJim Ingham if (frame) 7827fdf9ef1SGreg Clayton { 78369b582faSGreg Clayton VariableList variable_list; 784d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 78530fdc8d8SChris Lattner 78672eff18aSGreg Clayton if (sc.block) 78730fdc8d8SChris Lattner { 78872eff18aSGreg Clayton const bool can_create = true; 78972eff18aSGreg Clayton const bool get_parent_variables = true; 79072eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 79172eff18aSGreg Clayton 79272eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 79372eff18aSGreg Clayton get_parent_variables, 79472eff18aSGreg Clayton stop_if_block_is_inlined_function, 79572eff18aSGreg Clayton &variable_list)) 79672eff18aSGreg Clayton { 79769b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 79830fdc8d8SChris Lattner } 79972eff18aSGreg Clayton } 80030fdc8d8SChris Lattner 8014838131bSGreg Clayton if (var_sp) 80281e871edSGreg Clayton { 803e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues); 804e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 80581e871edSGreg Clayton } 8067fdf9ef1SGreg Clayton } 807c9858e4dSGreg Clayton else 808c9858e4dSGreg Clayton { 809c9858e4dSGreg Clayton if (log) 8107730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame."); 8117730b9a4SJim Ingham } 8127730b9a4SJim Ingham } 8137730b9a4SJim Ingham else 8147730b9a4SJim Ingham { 8157730b9a4SJim Ingham if (log) 8167730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable () => error: process is running"); 817c9858e4dSGreg Clayton } 818316d498bSGreg Clayton } 819316d498bSGreg Clayton 8204838131bSGreg Clayton if (log) 82169b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 822324a1036SSaleem Abdulrasool static_cast<void*>(frame), name, 823324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 8244838131bSGreg Clayton 825dde9cff3SCaroline Tice return sb_value; 826dde9cff3SCaroline Tice } 827dde9cff3SCaroline Tice 82830fdc8d8SChris Lattner SBValue 82969b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 83030fdc8d8SChris Lattner { 831316d498bSGreg Clayton SBValue value; 8327fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 833b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 834d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 835d9e416c0SGreg Clayton if (frame && target) 836316d498bSGreg Clayton { 837d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 838316d498bSGreg Clayton value = FindValue (name, value_type, use_dynamic); 839316d498bSGreg Clayton } 840316d498bSGreg Clayton return value; 84178a685aaSJim Ingham } 84278a685aaSJim Ingham 84378a685aaSJim Ingham SBValue 8442837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) 84578a685aaSJim Ingham { 8465160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 84769b582faSGreg Clayton SBValue sb_value; 8487730b9a4SJim Ingham 849*dbb0abbfSEugene Zelenko if (name == nullptr || name[0] == '\0') 8507730b9a4SJim Ingham { 8517730b9a4SJim Ingham if (log) 8527730b9a4SJim Ingham log->Printf ("SBFrame::FindValue called with empty name."); 8537730b9a4SJim Ingham return sb_value; 8547730b9a4SJim Ingham } 8557730b9a4SJim Ingham 85681e871edSGreg Clayton ValueObjectSP value_sp; 8574fc6cb9cSJim Ingham Mutex::Locker api_locker; 8584fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 8594fc6cb9cSJim Ingham 860*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 861d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 8627730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 8637730b9a4SJim Ingham if (target && process) 86430fdc8d8SChris Lattner { 8657fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8667730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 8677730b9a4SJim Ingham { 8687730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 8697730b9a4SJim Ingham if (frame) 8707fdf9ef1SGreg Clayton { 8718a2a0dfbSEnrico Granata VariableList variable_list; 8728a2a0dfbSEnrico Granata 87369b582faSGreg Clayton switch (value_type) 87430fdc8d8SChris Lattner { 87569b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 87669b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 87769b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 87869b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 87969b582faSGreg Clayton { 880d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 88172eff18aSGreg Clayton 88272eff18aSGreg Clayton const bool can_create = true; 88372eff18aSGreg Clayton const bool get_parent_variables = true; 88472eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 88572eff18aSGreg Clayton 8860efb51a0SChaoren Lin if (sc.block) 8870efb51a0SChaoren Lin sc.block->AppendVariables(can_create, 88872eff18aSGreg Clayton get_parent_variables, 88972eff18aSGreg Clayton stop_if_block_is_inlined_function, 8900efb51a0SChaoren Lin &variable_list); 8918a2a0dfbSEnrico Granata if (value_type == eValueTypeVariableGlobal) 8928a2a0dfbSEnrico Granata { 8938a2a0dfbSEnrico Granata const bool get_file_globals = true; 8948a2a0dfbSEnrico Granata VariableList *frame_vars = frame->GetVariableList(get_file_globals); 8958a2a0dfbSEnrico Granata if (frame_vars) 8968a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 8978a2a0dfbSEnrico Granata } 89869b582faSGreg Clayton ConstString const_name(name); 89908a04327SEnrico Granata VariableSP variable_sp(variable_list.FindVariable(const_name, value_type)); 90008a04327SEnrico Granata if (variable_sp) 901beae523aSJohnny Chen { 902e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable(variable_sp, eNoDynamicValues); 903e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 90430fdc8d8SChris Lattner } 90530fdc8d8SChris Lattner } 90669b582faSGreg Clayton break; 90769b582faSGreg Clayton 90869b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 90969b582faSGreg Clayton { 910d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 91169b582faSGreg Clayton if (reg_ctx) 91269b582faSGreg Clayton { 91369b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 91469b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 91569b582faSGreg Clayton { 91669b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 91769b582faSGreg Clayton if (reg_info && 91869b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 91969b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 92069b582faSGreg Clayton { 921d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 92281e871edSGreg Clayton sb_value.SetSP (value_sp); 92381e871edSGreg Clayton break; 92469b582faSGreg Clayton } 92569b582faSGreg Clayton } 92669b582faSGreg Clayton } 92769b582faSGreg Clayton } 92869b582faSGreg Clayton break; 92969b582faSGreg Clayton 93069b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 93169b582faSGreg Clayton { 932d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 93369b582faSGreg Clayton if (reg_ctx) 93469b582faSGreg Clayton { 93569b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 93669b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 93769b582faSGreg Clayton { 93869b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 93969b582faSGreg Clayton if (reg_set && 94069b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 94169b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 94269b582faSGreg Clayton { 943d9e416c0SGreg Clayton value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx); 94481e871edSGreg Clayton sb_value.SetSP (value_sp); 94581e871edSGreg Clayton break; 94669b582faSGreg Clayton } 94769b582faSGreg Clayton } 94869b582faSGreg Clayton } 94969b582faSGreg Clayton } 95069b582faSGreg Clayton break; 95169b582faSGreg Clayton 95269b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 95369b582faSGreg Clayton { 95469b582faSGreg Clayton ConstString const_name(name); 9558f1f9a1bSSean Callanan ExpressionVariableSP expr_var_sp (target->GetPersistentVariable (const_name)); 95669b582faSGreg Clayton if (expr_var_sp) 95781e871edSGreg Clayton { 95881e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 959e3e91517SEnrico Granata sb_value.SetSP (value_sp, use_dynamic); 96081e871edSGreg Clayton } 96169b582faSGreg Clayton } 96269b582faSGreg Clayton break; 96369b582faSGreg Clayton 96469b582faSGreg Clayton default: 96569b582faSGreg Clayton break; 96669b582faSGreg Clayton } 967beae523aSJohnny Chen } 968c9858e4dSGreg Clayton else 969c9858e4dSGreg Clayton { 970c9858e4dSGreg Clayton if (log) 9717730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame."); 9727730b9a4SJim Ingham } 9737730b9a4SJim Ingham } 9747730b9a4SJim Ingham else 9757730b9a4SJim Ingham { 9767730b9a4SJim Ingham if (log) 9777730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: process is running"); 978c9858e4dSGreg Clayton } 9797fdf9ef1SGreg Clayton } 980dde9cff3SCaroline Tice 9814838131bSGreg Clayton if (log) 98269b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 983324a1036SSaleem Abdulrasool static_cast<void*>(frame), name, value_type, 984324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 9854838131bSGreg Clayton 986dde9cff3SCaroline Tice return sb_value; 987dde9cff3SCaroline Tice } 988dde9cff3SCaroline Tice 98930fdc8d8SChris Lattner bool 99035e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const 99135e2ab60SJohnny Chen { 992b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 993b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 99435e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 99535e2ab60SJohnny Chen } 99635e2ab60SJohnny Chen 99735e2ab60SJohnny Chen bool 99830fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 99930fdc8d8SChris Lattner { 100035e2ab60SJohnny Chen return IsEqual(rhs); 100130fdc8d8SChris Lattner } 100230fdc8d8SChris Lattner 100330fdc8d8SChris Lattner bool 100430fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 100530fdc8d8SChris Lattner { 100635e2ab60SJohnny Chen return !IsEqual(rhs); 1007481cef25SGreg Clayton } 100830fdc8d8SChris Lattner 100930fdc8d8SChris Lattner SBThread 101030fdc8d8SChris Lattner SBFrame::GetThread () const 101130fdc8d8SChris Lattner { 10125160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1013ceb6b139SCaroline Tice 10147fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1015d9e416c0SGreg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 1016d9e416c0SGreg Clayton SBThread sb_thread (thread_sp); 1017ceb6b139SCaroline Tice 1018ceb6b139SCaroline Tice if (log) 1019750cd175SCaroline Tice { 1020750cd175SCaroline Tice SBStream sstr; 1021750cd175SCaroline Tice sb_thread.GetDescription (sstr); 1022d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", 1023324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetFramePtr()), 1024324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get()), sstr.GetData()); 1025750cd175SCaroline Tice } 1026ceb6b139SCaroline Tice 102730fdc8d8SChris Lattner return sb_thread; 102830fdc8d8SChris Lattner } 102930fdc8d8SChris Lattner 103030fdc8d8SChris Lattner const char * 103130fdc8d8SChris Lattner SBFrame::Disassemble () const 103230fdc8d8SChris Lattner { 10335160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1034*dbb0abbfSEugene Zelenko const char *disassembly = nullptr; 10354fc6cb9cSJim Ingham Mutex::Locker api_locker; 10364fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10374fc6cb9cSJim Ingham 1038*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1039d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 10407730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10417730b9a4SJim Ingham if (target && process) 1042af67cecdSGreg Clayton { 10437fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10447730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 10457730b9a4SJim Ingham { 10467730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 10477730b9a4SJim Ingham if (frame) 10487fdf9ef1SGreg Clayton { 1049d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 1050af67cecdSGreg Clayton } 1051c9858e4dSGreg Clayton else 1052c9858e4dSGreg Clayton { 1053c9858e4dSGreg Clayton if (log) 10547730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame."); 10557730b9a4SJim Ingham } 10567730b9a4SJim Ingham } 10577730b9a4SJim Ingham else 10587730b9a4SJim Ingham { 10597730b9a4SJim Ingham if (log) 10607730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: process is running"); 10617fdf9ef1SGreg Clayton } 1062c9858e4dSGreg Clayton } 10634838131bSGreg Clayton 10644838131bSGreg Clayton if (log) 1065324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::Disassemble () => %s", 1066324a1036SSaleem Abdulrasool static_cast<void*>(frame), disassembly); 10674838131bSGreg Clayton 10684838131bSGreg Clayton return disassembly; 106930fdc8d8SChris Lattner } 107030fdc8d8SChris Lattner 107130fdc8d8SChris Lattner SBValueList 107230fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 107330fdc8d8SChris Lattner bool locals, 107430fdc8d8SChris Lattner bool statics, 107530fdc8d8SChris Lattner bool in_scope_only) 107630fdc8d8SChris Lattner { 1077316d498bSGreg Clayton SBValueList value_list; 10787fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1079b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1080d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1081d9e416c0SGreg Clayton if (frame && target) 1082316d498bSGreg Clayton { 1083d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 108451f96eebSZachary Turner const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false; 108551f96eebSZachary Turner 108651f96eebSZachary Turner SBVariablesOptions options; 108751f96eebSZachary Turner options.SetIncludeArguments(arguments); 108851f96eebSZachary Turner options.SetIncludeLocals(locals); 108951f96eebSZachary Turner options.SetIncludeStatics(statics); 109051f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 109151f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 109251f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 109351f96eebSZachary Turner 109451f96eebSZachary Turner value_list = GetVariables (options); 1095316d498bSGreg Clayton } 1096316d498bSGreg Clayton return value_list; 109778a685aaSJim Ingham } 109878a685aaSJim Ingham 1099560558ebSEnrico Granata lldb::SBValueList 1100560558ebSEnrico Granata SBFrame::GetVariables (bool arguments, 1101560558ebSEnrico Granata bool locals, 1102560558ebSEnrico Granata bool statics, 1103560558ebSEnrico Granata bool in_scope_only, 1104560558ebSEnrico Granata lldb::DynamicValueType use_dynamic) 1105560558ebSEnrico Granata { 1106560558ebSEnrico Granata ExecutionContext exe_ctx(m_opaque_sp.get()); 1107560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 110851f96eebSZachary Turner const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false; 110951f96eebSZachary Turner SBVariablesOptions options; 111051f96eebSZachary Turner options.SetIncludeArguments(arguments); 111151f96eebSZachary Turner options.SetIncludeLocals(locals); 111251f96eebSZachary Turner options.SetIncludeStatics(statics); 111351f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 111451f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 111551f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 111651f96eebSZachary Turner return GetVariables(options); 1117560558ebSEnrico Granata } 1118560558ebSEnrico Granata 111978a685aaSJim Ingham SBValueList 112051f96eebSZachary Turner SBFrame::GetVariables (const lldb::SBVariablesOptions& options) 112178a685aaSJim Ingham { 11225160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1123ceb6b139SCaroline Tice 1124b9556accSGreg Clayton SBValueList value_list; 11254fc6cb9cSJim Ingham Mutex::Locker api_locker; 11264fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 11274fc6cb9cSJim Ingham 1128*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1129d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1130b9556accSGreg Clayton 113151f96eebSZachary Turner const bool statics = options.GetIncludeStatics(); 113251f96eebSZachary Turner const bool arguments = options.GetIncludeArguments(); 113351f96eebSZachary Turner const bool locals = options.GetIncludeLocals(); 113451f96eebSZachary Turner const bool in_scope_only = options.GetInScopeOnly(); 113551f96eebSZachary Turner const bool include_runtime_support_values = options.GetIncludeRuntimeSupportValues(); 113651f96eebSZachary Turner const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 113751f96eebSZachary Turner 1138ceb6b139SCaroline Tice if (log) 113951f96eebSZachary Turner log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)", 114051f96eebSZachary Turner arguments, locals, 114151f96eebSZachary Turner statics, in_scope_only, 114251f96eebSZachary Turner include_runtime_support_values, use_dynamic); 1143ceb6b139SCaroline Tice 11447730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 11457730b9a4SJim Ingham if (target && process) 114630fdc8d8SChris Lattner { 11477fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11487730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 11497fdf9ef1SGreg Clayton { 11507730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 11517730b9a4SJim Ingham if (frame) 11527730b9a4SJim Ingham { 115330fdc8d8SChris Lattner size_t i; 1154*dbb0abbfSEugene Zelenko VariableList *variable_list = nullptr; 1155d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 115630fdc8d8SChris Lattner if (variable_list) 115730fdc8d8SChris Lattner { 115830fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 115930fdc8d8SChris Lattner if (num_variables) 116030fdc8d8SChris Lattner { 116130fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 116230fdc8d8SChris Lattner { 116330fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 116430fdc8d8SChris Lattner if (variable_sp) 116530fdc8d8SChris Lattner { 116630fdc8d8SChris Lattner bool add_variable = false; 116730fdc8d8SChris Lattner switch (variable_sp->GetScope()) 116830fdc8d8SChris Lattner { 116930fdc8d8SChris Lattner case eValueTypeVariableGlobal: 117030fdc8d8SChris Lattner case eValueTypeVariableStatic: 117130fdc8d8SChris Lattner add_variable = statics; 117230fdc8d8SChris Lattner break; 117330fdc8d8SChris Lattner 117430fdc8d8SChris Lattner case eValueTypeVariableArgument: 117530fdc8d8SChris Lattner add_variable = arguments; 117630fdc8d8SChris Lattner break; 117730fdc8d8SChris Lattner 117830fdc8d8SChris Lattner case eValueTypeVariableLocal: 117930fdc8d8SChris Lattner add_variable = locals; 118030fdc8d8SChris Lattner break; 1181c982c768SGreg Clayton 1182c982c768SGreg Clayton default: 1183c982c768SGreg Clayton break; 118430fdc8d8SChris Lattner } 118530fdc8d8SChris Lattner if (add_variable) 118630fdc8d8SChris Lattner { 1187d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 118830fdc8d8SChris Lattner continue; 118930fdc8d8SChris Lattner 1190e3e91517SEnrico Granata ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues)); 1191560558ebSEnrico Granata 1192*dbb0abbfSEugene Zelenko if (!include_runtime_support_values && 1193*dbb0abbfSEugene Zelenko valobj_sp != nullptr && 1194*dbb0abbfSEugene Zelenko valobj_sp->IsRuntimeSupportValue()) 1195560558ebSEnrico Granata continue; 1196560558ebSEnrico Granata 1197e3e91517SEnrico Granata SBValue value_sb; 1198e3e91517SEnrico Granata value_sb.SetSP(valobj_sp,use_dynamic); 1199e3e91517SEnrico Granata value_list.Append(value_sb); 120030fdc8d8SChris Lattner } 120130fdc8d8SChris Lattner } 120230fdc8d8SChris Lattner } 120330fdc8d8SChris Lattner } 120430fdc8d8SChris Lattner } 120530fdc8d8SChris Lattner } 1206c9858e4dSGreg Clayton else 1207c9858e4dSGreg Clayton { 1208c9858e4dSGreg Clayton if (log) 12097730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame."); 12107730b9a4SJim Ingham } 12117730b9a4SJim Ingham } 12127730b9a4SJim Ingham else 12137730b9a4SJim Ingham { 12147730b9a4SJim Ingham if (log) 12157730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: process is running"); 1216c9858e4dSGreg Clayton } 12177fdf9ef1SGreg Clayton } 1218ceb6b139SCaroline Tice 1219ceb6b139SCaroline Tice if (log) 1220324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", 1221324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1222324a1036SSaleem Abdulrasool static_cast<void*>(value_list.opaque_ptr())); 1223ceb6b139SCaroline Tice 122430fdc8d8SChris Lattner return value_list; 122530fdc8d8SChris Lattner } 122630fdc8d8SChris Lattner 122769b582faSGreg Clayton SBValueList 122830fdc8d8SChris Lattner SBFrame::GetRegisters () 122930fdc8d8SChris Lattner { 12305160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1231ceb6b139SCaroline Tice 123230fdc8d8SChris Lattner SBValueList value_list; 12334fc6cb9cSJim Ingham Mutex::Locker api_locker; 12344fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 12354fc6cb9cSJim Ingham 1236*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1237d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 12387730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 12397730b9a4SJim Ingham if (target && process) 124030fdc8d8SChris Lattner { 12417fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12427730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 12437730b9a4SJim Ingham { 12447730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 12457730b9a4SJim Ingham if (frame) 12467fdf9ef1SGreg Clayton { 1247d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 124830fdc8d8SChris Lattner if (reg_ctx) 124930fdc8d8SChris Lattner { 125030fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 125130fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 125230fdc8d8SChris Lattner { 1253d9e416c0SGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); 125430fdc8d8SChris Lattner } 125530fdc8d8SChris Lattner } 125630fdc8d8SChris Lattner } 1257c9858e4dSGreg Clayton else 1258c9858e4dSGreg Clayton { 1259c9858e4dSGreg Clayton if (log) 12607730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame."); 12617730b9a4SJim Ingham } 12627730b9a4SJim Ingham } 12637730b9a4SJim Ingham else 12647730b9a4SJim Ingham { 12657730b9a4SJim Ingham if (log) 12667730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: process is running"); 1267c9858e4dSGreg Clayton } 12687fdf9ef1SGreg Clayton } 1269ceb6b139SCaroline Tice 1270ceb6b139SCaroline Tice if (log) 1271324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", 1272324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1273324a1036SSaleem Abdulrasool static_cast<void*>(value_list.opaque_ptr())); 1274ceb6b139SCaroline Tice 127530fdc8d8SChris Lattner return value_list; 127630fdc8d8SChris Lattner } 127730fdc8d8SChris Lattner 1278ad9a53c5SJason Molenda SBValue 1279ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name) 1280ad9a53c5SJason Molenda { 1281ad9a53c5SJason Molenda Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1282ad9a53c5SJason Molenda 1283ad9a53c5SJason Molenda SBValue result; 1284ad9a53c5SJason Molenda ValueObjectSP value_sp; 1285ad9a53c5SJason Molenda Mutex::Locker api_locker; 1286ad9a53c5SJason Molenda ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1287ad9a53c5SJason Molenda 1288*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1289ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 1290ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1291ad9a53c5SJason Molenda if (target && process) 1292ad9a53c5SJason Molenda { 1293ad9a53c5SJason Molenda Process::StopLocker stop_locker; 1294ad9a53c5SJason Molenda if (stop_locker.TryLock(&process->GetRunLock())) 1295ad9a53c5SJason Molenda { 1296ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 1297ad9a53c5SJason Molenda if (frame) 1298ad9a53c5SJason Molenda { 1299ad9a53c5SJason Molenda RegisterContextSP reg_ctx (frame->GetRegisterContext()); 1300ad9a53c5SJason Molenda if (reg_ctx) 1301ad9a53c5SJason Molenda { 1302ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 1303ad9a53c5SJason Molenda for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 1304ad9a53c5SJason Molenda { 1305ad9a53c5SJason Molenda const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 1306ad9a53c5SJason Molenda if (reg_info && 1307ad9a53c5SJason Molenda ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 1308ad9a53c5SJason Molenda (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 1309ad9a53c5SJason Molenda { 1310ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 1311ad9a53c5SJason Molenda result.SetSP (value_sp); 1312ad9a53c5SJason Molenda break; 1313ad9a53c5SJason Molenda } 1314ad9a53c5SJason Molenda } 1315ad9a53c5SJason Molenda } 1316ad9a53c5SJason Molenda } 1317ad9a53c5SJason Molenda else 1318ad9a53c5SJason Molenda { 1319ad9a53c5SJason Molenda if (log) 13205d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame."); 1321ad9a53c5SJason Molenda } 1322ad9a53c5SJason Molenda } 1323ad9a53c5SJason Molenda else 1324ad9a53c5SJason Molenda { 1325ad9a53c5SJason Molenda if (log) 13265d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: process is running"); 1327ad9a53c5SJason Molenda } 1328ad9a53c5SJason Molenda } 1329ad9a53c5SJason Molenda 1330ad9a53c5SJason Molenda if (log) 1331324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)", 1332324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1333324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 1334ad9a53c5SJason Molenda 1335ad9a53c5SJason Molenda return result; 1336ad9a53c5SJason Molenda } 1337ad9a53c5SJason Molenda 1338dde9cff3SCaroline Tice bool 1339dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 1340dde9cff3SCaroline Tice { 13415160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1342da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1343da7bc7d0SGreg Clayton 13444fc6cb9cSJim Ingham Mutex::Locker api_locker; 13454fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 13464fc6cb9cSJim Ingham 1347b57e4a1bSJason Molenda StackFrame *frame; 1348d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 13497730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 13507730b9a4SJim Ingham if (target && process) 1351dde9cff3SCaroline Tice { 13527fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13537730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 13547730b9a4SJim Ingham { 13557730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 13567730b9a4SJim Ingham if (frame) 13577fdf9ef1SGreg Clayton { 1358d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 1359dde9cff3SCaroline Tice } 1360c9858e4dSGreg Clayton else 1361c9858e4dSGreg Clayton { 1362c9858e4dSGreg Clayton if (log) 13637730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame."); 13647730b9a4SJim Ingham } 13657730b9a4SJim Ingham } 13667730b9a4SJim Ingham else 13677730b9a4SJim Ingham { 13687730b9a4SJim Ingham if (log) 13697730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: process is running"); 1370c9858e4dSGreg Clayton } 1371c9858e4dSGreg Clayton 13727fdf9ef1SGreg Clayton } 1373dde9cff3SCaroline Tice else 1374da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1375dde9cff3SCaroline Tice 1376dde9cff3SCaroline Tice return true; 1377dde9cff3SCaroline Tice } 13781d3afba3SGreg Clayton 137969b582faSGreg Clayton SBValue 13801d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 13811d3afba3SGreg Clayton { 1382316d498bSGreg Clayton SBValue result; 13837fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1384b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1385d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1386d9e416c0SGreg Clayton if (frame && target) 1387316d498bSGreg Clayton { 138835e1bda6SJim Ingham SBExpressionOptions options; 138935e1bda6SJim Ingham lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue(); 1390cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 139135e1bda6SJim Ingham options.SetUnwindOnError (true); 139235e1bda6SJim Ingham return EvaluateExpression (expr, options); 1393316d498bSGreg Clayton } 1394316d498bSGreg Clayton return result; 139578a685aaSJim Ingham } 139678a685aaSJim Ingham 139778a685aaSJim Ingham SBValue 13982837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 139978a685aaSJim Ingham { 140035e1bda6SJim Ingham SBExpressionOptions options; 1401cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 140235e1bda6SJim Ingham options.SetUnwindOnError (true); 140335e1bda6SJim Ingham return EvaluateExpression (expr, options); 14047ba6e991SJim Ingham } 14057ba6e991SJim Ingham 14067ba6e991SJim Ingham SBValue 14077ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error) 14087ba6e991SJim Ingham { 140935e1bda6SJim Ingham SBExpressionOptions options; 1410cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 141135e1bda6SJim Ingham options.SetUnwindOnError (unwind_on_error); 141235e1bda6SJim Ingham return EvaluateExpression (expr, options); 141335e1bda6SJim Ingham } 141435e1bda6SJim Ingham 141535e1bda6SJim Ingham lldb::SBValue 141635e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options) 141735e1bda6SJim Ingham { 14185160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14194838131bSGreg Clayton 14205160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1421a162ebafSSean Callanan 14228646d3c1SJim Ingham ExpressionResults exe_results = eExpressionSetupError; 142369b582faSGreg Clayton SBValue expr_result; 14247730b9a4SJim Ingham 1425*dbb0abbfSEugene Zelenko if (expr == nullptr || expr[0] == '\0') 14267730b9a4SJim Ingham { 14277730b9a4SJim Ingham if (log) 14287730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression called with an empty expression"); 14297730b9a4SJim Ingham return expr_result; 14307730b9a4SJim Ingham } 14317730b9a4SJim Ingham 143281e871edSGreg Clayton ValueObjectSP expr_value_sp; 14334838131bSGreg Clayton 14344fc6cb9cSJim Ingham Mutex::Locker api_locker; 14354fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 14364fc6cb9cSJim Ingham 1437b9556accSGreg Clayton if (log) 14387730b9a4SJim Ingham log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr); 1439b9556accSGreg Clayton 1440*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 14417730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 14427730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 14437730b9a4SJim Ingham 14447730b9a4SJim Ingham if (target && process) 14451d3afba3SGreg Clayton { 14467fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 14477730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 14487730b9a4SJim Ingham { 14497730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 14507730b9a4SJim Ingham if (frame) 14517fdf9ef1SGreg Clayton { 1452fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1453fb6621efSGreg Clayton { 14541ba7c4d0SGreg Clayton StreamString frame_description; 1455d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 14561ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 1457cced1566SGreg Clayton expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str()); 1458fb6621efSGreg Clayton } 1459fb6621efSGreg Clayton 1460d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 1461d9e416c0SGreg Clayton frame, 1462d4439aa9SEnrico Granata expr_value_sp, 146335e1bda6SJim Ingham options.ref()); 1464e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1465fb6621efSGreg Clayton 1466fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1467*dbb0abbfSEugene Zelenko Host::SetCrashDescription(nullptr); 14681d3afba3SGreg Clayton } 1469c9858e4dSGreg Clayton else 1470c9858e4dSGreg Clayton { 1471c9858e4dSGreg Clayton if (log) 14727730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame."); 14737730b9a4SJim Ingham } 14747730b9a4SJim Ingham } 14757730b9a4SJim Ingham else 14767730b9a4SJim Ingham { 14777730b9a4SJim Ingham if (log) 14787730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: process is running"); 1479c9858e4dSGreg Clayton } 14807fdf9ef1SGreg Clayton } 14814838131bSGreg Clayton 1482cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1483a162ebafSSean Callanan if (expr_log) 148478a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 1485324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 1486a162ebafSSean Callanan 14874838131bSGreg Clayton if (log) 1488d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 1489324a1036SSaleem Abdulrasool static_cast<void*>(frame), expr, 1490324a1036SSaleem Abdulrasool static_cast<void*>(expr_value_sp.get()), exe_results); 1491cf7e2dc0SJason Molenda #endif 14924838131bSGreg Clayton 1493cfd1acedSGreg Clayton return expr_result; 14941d3afba3SGreg Clayton } 1495316d498bSGreg Clayton 1496316d498bSGreg Clayton bool 14976345fe3eSOleksiy Vyalov SBFrame::IsInlined() 1498316d498bSGreg Clayton { 149905f75e9fSOleksiy Vyalov return static_cast<const SBFrame*>(this)->IsInlined(); 150005f75e9fSOleksiy Vyalov } 150105f75e9fSOleksiy Vyalov 150205f75e9fSOleksiy Vyalov bool 150305f75e9fSOleksiy Vyalov SBFrame::IsInlined() const 150405f75e9fSOleksiy Vyalov { 15055160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 15067fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1507*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1508d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 15097730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 15107730b9a4SJim Ingham if (target && process) 1511316d498bSGreg Clayton { 15127fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 15137730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 15147730b9a4SJim Ingham { 15157730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 15167730b9a4SJim Ingham if (frame) 15177fdf9ef1SGreg Clayton { 15187fdf9ef1SGreg Clayton 1519d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1520316d498bSGreg Clayton if (block) 1521*dbb0abbfSEugene Zelenko return block->GetContainingInlinedBlock() != nullptr; 1522316d498bSGreg Clayton } 1523c9858e4dSGreg Clayton else 1524c9858e4dSGreg Clayton { 1525c9858e4dSGreg Clayton if (log) 15267730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame."); 15277730b9a4SJim Ingham } 15287730b9a4SJim Ingham } 15297730b9a4SJim Ingham else 15307730b9a4SJim Ingham { 15317730b9a4SJim Ingham if (log) 15327730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: process is running"); 1533c9858e4dSGreg Clayton } 1534c9858e4dSGreg Clayton 15357fdf9ef1SGreg Clayton } 1536316d498bSGreg Clayton return false; 1537316d498bSGreg Clayton } 1538316d498bSGreg Clayton 1539316d498bSGreg Clayton const char * 15406345fe3eSOleksiy Vyalov SBFrame::GetFunctionName() 1541316d498bSGreg Clayton { 154205f75e9fSOleksiy Vyalov return static_cast<const SBFrame*>(this)->GetFunctionName(); 154305f75e9fSOleksiy Vyalov } 154405f75e9fSOleksiy Vyalov 154505f75e9fSOleksiy Vyalov const char * 154605f75e9fSOleksiy Vyalov SBFrame::GetFunctionName() const 154705f75e9fSOleksiy Vyalov { 15485160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1549*dbb0abbfSEugene Zelenko const char *name = nullptr; 15507fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1551*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1552d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 15537730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 15547730b9a4SJim Ingham if (target && process) 1555316d498bSGreg Clayton { 15567fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 15577730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 15587730b9a4SJim Ingham { 15597730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 15607730b9a4SJim Ingham if (frame) 15617fdf9ef1SGreg Clayton { 1562d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1563316d498bSGreg Clayton if (sc.block) 1564316d498bSGreg Clayton { 1565316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1566316d498bSGreg Clayton if (inlined_block) 1567316d498bSGreg Clayton { 1568316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1569ddaf6a72SGreg Clayton name = inlined_info->GetName(sc.function->GetLanguage()).AsCString(); 1570316d498bSGreg Clayton } 1571316d498bSGreg Clayton } 1572316d498bSGreg Clayton 1573*dbb0abbfSEugene Zelenko if (name == nullptr) 1574316d498bSGreg Clayton { 1575316d498bSGreg Clayton if (sc.function) 1576316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1577316d498bSGreg Clayton } 1578316d498bSGreg Clayton 1579*dbb0abbfSEugene Zelenko if (name == nullptr) 1580316d498bSGreg Clayton { 1581316d498bSGreg Clayton if (sc.symbol) 1582316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1583316d498bSGreg Clayton } 1584316d498bSGreg Clayton } 1585c9858e4dSGreg Clayton else 1586c9858e4dSGreg Clayton { 1587c9858e4dSGreg Clayton if (log) 15887730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame."); 15897730b9a4SJim Ingham } 15907730b9a4SJim Ingham } 15917730b9a4SJim Ingham else 15927730b9a4SJim Ingham { 15937730b9a4SJim Ingham if (log) 15947730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName() => error: process is running"); 1595c9858e4dSGreg Clayton 1596c9858e4dSGreg Clayton } 15977fdf9ef1SGreg Clayton } 1598316d498bSGreg Clayton return name; 1599316d498bSGreg Clayton } 1600c1f705c2SEnrico Granata 1601c1f705c2SEnrico Granata const char * 1602c1f705c2SEnrico Granata SBFrame::GetDisplayFunctionName() 1603c1f705c2SEnrico Granata { 1604c1f705c2SEnrico Granata Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1605*dbb0abbfSEugene Zelenko const char *name = nullptr; 1606c1f705c2SEnrico Granata ExecutionContext exe_ctx(m_opaque_sp.get()); 1607*dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1608c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1609c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 1610c1f705c2SEnrico Granata if (target && process) 1611c1f705c2SEnrico Granata { 1612c1f705c2SEnrico Granata Process::StopLocker stop_locker; 1613c1f705c2SEnrico Granata if (stop_locker.TryLock(&process->GetRunLock())) 1614c1f705c2SEnrico Granata { 1615c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr(); 1616c1f705c2SEnrico Granata if (frame) 1617c1f705c2SEnrico Granata { 1618c1f705c2SEnrico Granata SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1619c1f705c2SEnrico Granata if (sc.block) 1620c1f705c2SEnrico Granata { 1621c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1622c1f705c2SEnrico Granata if (inlined_block) 1623c1f705c2SEnrico Granata { 1624c1f705c2SEnrico Granata const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1625ddaf6a72SGreg Clayton name = inlined_info->GetDisplayName(sc.function->GetLanguage()).AsCString(); 1626c1f705c2SEnrico Granata } 1627c1f705c2SEnrico Granata } 1628c1f705c2SEnrico Granata 1629*dbb0abbfSEugene Zelenko if (name == nullptr) 1630c1f705c2SEnrico Granata { 1631c1f705c2SEnrico Granata if (sc.function) 1632c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString(); 1633c1f705c2SEnrico Granata } 1634c1f705c2SEnrico Granata 1635*dbb0abbfSEugene Zelenko if (name == nullptr) 1636c1f705c2SEnrico Granata { 1637c1f705c2SEnrico Granata if (sc.symbol) 1638c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString(); 1639c1f705c2SEnrico Granata } 1640c1f705c2SEnrico Granata } 1641c1f705c2SEnrico Granata else 1642c1f705c2SEnrico Granata { 1643c1f705c2SEnrico Granata if (log) 1644c1f705c2SEnrico Granata log->Printf ("SBFrame::GetDisplayFunctionName () => error: could not reconstruct frame object for this SBFrame."); 1645c1f705c2SEnrico Granata } 1646c1f705c2SEnrico Granata } 1647c1f705c2SEnrico Granata else 1648c1f705c2SEnrico Granata { 1649c1f705c2SEnrico Granata if (log) 1650c1f705c2SEnrico Granata log->Printf ("SBFrame::GetDisplayFunctionName() => error: process is running"); 1651c1f705c2SEnrico Granata 1652c1f705c2SEnrico Granata } 1653c1f705c2SEnrico Granata } 1654c1f705c2SEnrico Granata return name; 1655c1f705c2SEnrico Granata } 1656