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 10dbb0abbfSEugene Zelenko // C Includes 11dbb0abbfSEugene Zelenko // C++ Includes 1230fdc8d8SChris Lattner #include <algorithm> 13dbb0abbfSEugene Zelenko #include <string> 14dbb0abbfSEugene Zelenko 15dbb0abbfSEugene Zelenko // Other libraries and framework includes 16dbb0abbfSEugene Zelenko // Project includes 17dbb0abbfSEugene 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 82dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default; 83dbb0abbfSEugene 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 { 95dbb0abbfSEugene 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 { 107dbb0abbfSEugene 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 118dbb0abbfSEugene 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 161dbb0abbfSEugene 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 204dbb0abbfSEugene 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 245dbb0abbfSEugene 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 286dbb0abbfSEugene 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 326dbb0abbfSEugene 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 366dbb0abbfSEugene 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 407dbb0abbfSEugene 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 474dbb0abbfSEugene 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 515dbb0abbfSEugene 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 556dbb0abbfSEugene 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 596dbb0abbfSEugene 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)); 695dbb0abbfSEugene 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 704dbb0abbfSEugene 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 761dbb0abbfSEugene 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 772dbb0abbfSEugene 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, 795*72ac8a84STamas Berghammer [frame](Variable* v) { return v->IsInScope(frame); }, 79672eff18aSGreg Clayton &variable_list)) 79772eff18aSGreg Clayton { 79869b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 79930fdc8d8SChris Lattner } 80072eff18aSGreg Clayton } 80130fdc8d8SChris Lattner 8024838131bSGreg Clayton if (var_sp) 80381e871edSGreg Clayton { 804e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues); 805e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 80681e871edSGreg Clayton } 8077fdf9ef1SGreg Clayton } 808c9858e4dSGreg Clayton else 809c9858e4dSGreg Clayton { 810c9858e4dSGreg Clayton if (log) 8117730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame."); 8127730b9a4SJim Ingham } 8137730b9a4SJim Ingham } 8147730b9a4SJim Ingham else 8157730b9a4SJim Ingham { 8167730b9a4SJim Ingham if (log) 8177730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable () => error: process is running"); 818c9858e4dSGreg Clayton } 819316d498bSGreg Clayton } 820316d498bSGreg Clayton 8214838131bSGreg Clayton if (log) 82269b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 823324a1036SSaleem Abdulrasool static_cast<void*>(frame), name, 824324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 8254838131bSGreg Clayton 826dde9cff3SCaroline Tice return sb_value; 827dde9cff3SCaroline Tice } 828dde9cff3SCaroline Tice 82930fdc8d8SChris Lattner SBValue 83069b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 83130fdc8d8SChris Lattner { 832316d498bSGreg Clayton SBValue value; 8337fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 834b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 835d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 836d9e416c0SGreg Clayton if (frame && target) 837316d498bSGreg Clayton { 838d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 839316d498bSGreg Clayton value = FindValue (name, value_type, use_dynamic); 840316d498bSGreg Clayton } 841316d498bSGreg Clayton return value; 84278a685aaSJim Ingham } 84378a685aaSJim Ingham 84478a685aaSJim Ingham SBValue 8452837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) 84678a685aaSJim Ingham { 8475160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 84869b582faSGreg Clayton SBValue sb_value; 8497730b9a4SJim Ingham 850dbb0abbfSEugene Zelenko if (name == nullptr || name[0] == '\0') 8517730b9a4SJim Ingham { 8527730b9a4SJim Ingham if (log) 8537730b9a4SJim Ingham log->Printf ("SBFrame::FindValue called with empty name."); 8547730b9a4SJim Ingham return sb_value; 8557730b9a4SJim Ingham } 8567730b9a4SJim Ingham 85781e871edSGreg Clayton ValueObjectSP value_sp; 8584fc6cb9cSJim Ingham Mutex::Locker api_locker; 8594fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 8604fc6cb9cSJim Ingham 861dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 862d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 8637730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 8647730b9a4SJim Ingham if (target && process) 86530fdc8d8SChris Lattner { 8667fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8677730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 8687730b9a4SJim Ingham { 8697730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 8707730b9a4SJim Ingham if (frame) 8717fdf9ef1SGreg Clayton { 8728a2a0dfbSEnrico Granata VariableList variable_list; 8738a2a0dfbSEnrico Granata 87469b582faSGreg Clayton switch (value_type) 87530fdc8d8SChris Lattner { 87669b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 87769b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 87869b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 87969b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 88069b582faSGreg Clayton { 881d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 88272eff18aSGreg Clayton 88372eff18aSGreg Clayton const bool can_create = true; 88472eff18aSGreg Clayton const bool get_parent_variables = true; 88572eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 88672eff18aSGreg Clayton 8870efb51a0SChaoren Lin if (sc.block) 8880efb51a0SChaoren Lin sc.block->AppendVariables(can_create, 88972eff18aSGreg Clayton get_parent_variables, 89072eff18aSGreg Clayton stop_if_block_is_inlined_function, 891*72ac8a84STamas Berghammer [frame](Variable* v) { return v->IsInScope(frame); }, 8920efb51a0SChaoren Lin &variable_list); 8938a2a0dfbSEnrico Granata if (value_type == eValueTypeVariableGlobal) 8948a2a0dfbSEnrico Granata { 8958a2a0dfbSEnrico Granata const bool get_file_globals = true; 8968a2a0dfbSEnrico Granata VariableList *frame_vars = frame->GetVariableList(get_file_globals); 8978a2a0dfbSEnrico Granata if (frame_vars) 8988a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 8998a2a0dfbSEnrico Granata } 90069b582faSGreg Clayton ConstString const_name(name); 90108a04327SEnrico Granata VariableSP variable_sp(variable_list.FindVariable(const_name, value_type)); 90208a04327SEnrico Granata if (variable_sp) 903beae523aSJohnny Chen { 904e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable(variable_sp, eNoDynamicValues); 905e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 90630fdc8d8SChris Lattner } 90730fdc8d8SChris Lattner } 90869b582faSGreg Clayton break; 90969b582faSGreg Clayton 91069b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 91169b582faSGreg Clayton { 912d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 91369b582faSGreg Clayton if (reg_ctx) 91469b582faSGreg Clayton { 91569b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 91669b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 91769b582faSGreg Clayton { 91869b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 91969b582faSGreg Clayton if (reg_info && 92069b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 92169b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 92269b582faSGreg Clayton { 923d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_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 eValueTypeRegisterSet: // A collection of stack frame register values 93369b582faSGreg Clayton { 934d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 93569b582faSGreg Clayton if (reg_ctx) 93669b582faSGreg Clayton { 93769b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 93869b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 93969b582faSGreg Clayton { 94069b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 94169b582faSGreg Clayton if (reg_set && 94269b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 94369b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 94469b582faSGreg Clayton { 945d9e416c0SGreg Clayton value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx); 94681e871edSGreg Clayton sb_value.SetSP (value_sp); 94781e871edSGreg Clayton break; 94869b582faSGreg Clayton } 94969b582faSGreg Clayton } 95069b582faSGreg Clayton } 95169b582faSGreg Clayton } 95269b582faSGreg Clayton break; 95369b582faSGreg Clayton 95469b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 95569b582faSGreg Clayton { 95669b582faSGreg Clayton ConstString const_name(name); 9578f1f9a1bSSean Callanan ExpressionVariableSP expr_var_sp (target->GetPersistentVariable (const_name)); 95869b582faSGreg Clayton if (expr_var_sp) 95981e871edSGreg Clayton { 96081e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 961e3e91517SEnrico Granata sb_value.SetSP (value_sp, use_dynamic); 96281e871edSGreg Clayton } 96369b582faSGreg Clayton } 96469b582faSGreg Clayton break; 96569b582faSGreg Clayton 96669b582faSGreg Clayton default: 96769b582faSGreg Clayton break; 96869b582faSGreg Clayton } 969beae523aSJohnny Chen } 970c9858e4dSGreg Clayton else 971c9858e4dSGreg Clayton { 972c9858e4dSGreg Clayton if (log) 9737730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame."); 9747730b9a4SJim Ingham } 9757730b9a4SJim Ingham } 9767730b9a4SJim Ingham else 9777730b9a4SJim Ingham { 9787730b9a4SJim Ingham if (log) 9797730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: process is running"); 980c9858e4dSGreg Clayton } 9817fdf9ef1SGreg Clayton } 982dde9cff3SCaroline Tice 9834838131bSGreg Clayton if (log) 98469b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 985324a1036SSaleem Abdulrasool static_cast<void*>(frame), name, value_type, 986324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 9874838131bSGreg Clayton 988dde9cff3SCaroline Tice return sb_value; 989dde9cff3SCaroline Tice } 990dde9cff3SCaroline Tice 99130fdc8d8SChris Lattner bool 99235e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const 99335e2ab60SJohnny Chen { 994b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 995b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 99635e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 99735e2ab60SJohnny Chen } 99835e2ab60SJohnny Chen 99935e2ab60SJohnny Chen bool 100030fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 100130fdc8d8SChris Lattner { 100235e2ab60SJohnny Chen return IsEqual(rhs); 100330fdc8d8SChris Lattner } 100430fdc8d8SChris Lattner 100530fdc8d8SChris Lattner bool 100630fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 100730fdc8d8SChris Lattner { 100835e2ab60SJohnny Chen return !IsEqual(rhs); 1009481cef25SGreg Clayton } 101030fdc8d8SChris Lattner 101130fdc8d8SChris Lattner SBThread 101230fdc8d8SChris Lattner SBFrame::GetThread () const 101330fdc8d8SChris Lattner { 10145160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1015ceb6b139SCaroline Tice 10167fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1017d9e416c0SGreg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 1018d9e416c0SGreg Clayton SBThread sb_thread (thread_sp); 1019ceb6b139SCaroline Tice 1020ceb6b139SCaroline Tice if (log) 1021750cd175SCaroline Tice { 1022750cd175SCaroline Tice SBStream sstr; 1023750cd175SCaroline Tice sb_thread.GetDescription (sstr); 1024d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", 1025324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetFramePtr()), 1026324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get()), sstr.GetData()); 1027750cd175SCaroline Tice } 1028ceb6b139SCaroline Tice 102930fdc8d8SChris Lattner return sb_thread; 103030fdc8d8SChris Lattner } 103130fdc8d8SChris Lattner 103230fdc8d8SChris Lattner const char * 103330fdc8d8SChris Lattner SBFrame::Disassemble () const 103430fdc8d8SChris Lattner { 10355160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1036dbb0abbfSEugene Zelenko const char *disassembly = nullptr; 10374fc6cb9cSJim Ingham Mutex::Locker api_locker; 10384fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10394fc6cb9cSJim Ingham 1040dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1041d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 10427730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10437730b9a4SJim Ingham if (target && process) 1044af67cecdSGreg Clayton { 10457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10467730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 10477730b9a4SJim Ingham { 10487730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 10497730b9a4SJim Ingham if (frame) 10507fdf9ef1SGreg Clayton { 1051d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 1052af67cecdSGreg Clayton } 1053c9858e4dSGreg Clayton else 1054c9858e4dSGreg Clayton { 1055c9858e4dSGreg Clayton if (log) 10567730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame."); 10577730b9a4SJim Ingham } 10587730b9a4SJim Ingham } 10597730b9a4SJim Ingham else 10607730b9a4SJim Ingham { 10617730b9a4SJim Ingham if (log) 10627730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: process is running"); 10637fdf9ef1SGreg Clayton } 1064c9858e4dSGreg Clayton } 10654838131bSGreg Clayton 10664838131bSGreg Clayton if (log) 1067324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::Disassemble () => %s", 1068324a1036SSaleem Abdulrasool static_cast<void*>(frame), disassembly); 10694838131bSGreg Clayton 10704838131bSGreg Clayton return disassembly; 107130fdc8d8SChris Lattner } 107230fdc8d8SChris Lattner 107330fdc8d8SChris Lattner SBValueList 107430fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 107530fdc8d8SChris Lattner bool locals, 107630fdc8d8SChris Lattner bool statics, 107730fdc8d8SChris Lattner bool in_scope_only) 107830fdc8d8SChris Lattner { 1079316d498bSGreg Clayton SBValueList value_list; 10807fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1081b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1082d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1083d9e416c0SGreg Clayton if (frame && target) 1084316d498bSGreg Clayton { 1085d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 108651f96eebSZachary Turner const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false; 108751f96eebSZachary Turner 108851f96eebSZachary Turner SBVariablesOptions options; 108951f96eebSZachary Turner options.SetIncludeArguments(arguments); 109051f96eebSZachary Turner options.SetIncludeLocals(locals); 109151f96eebSZachary Turner options.SetIncludeStatics(statics); 109251f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 109351f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 109451f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 109551f96eebSZachary Turner 109651f96eebSZachary Turner value_list = GetVariables (options); 1097316d498bSGreg Clayton } 1098316d498bSGreg Clayton return value_list; 109978a685aaSJim Ingham } 110078a685aaSJim Ingham 1101560558ebSEnrico Granata lldb::SBValueList 1102560558ebSEnrico Granata SBFrame::GetVariables (bool arguments, 1103560558ebSEnrico Granata bool locals, 1104560558ebSEnrico Granata bool statics, 1105560558ebSEnrico Granata bool in_scope_only, 1106560558ebSEnrico Granata lldb::DynamicValueType use_dynamic) 1107560558ebSEnrico Granata { 1108560558ebSEnrico Granata ExecutionContext exe_ctx(m_opaque_sp.get()); 1109560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 111051f96eebSZachary Turner const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false; 111151f96eebSZachary Turner SBVariablesOptions options; 111251f96eebSZachary Turner options.SetIncludeArguments(arguments); 111351f96eebSZachary Turner options.SetIncludeLocals(locals); 111451f96eebSZachary Turner options.SetIncludeStatics(statics); 111551f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 111651f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 111751f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 111851f96eebSZachary Turner return GetVariables(options); 1119560558ebSEnrico Granata } 1120560558ebSEnrico Granata 112178a685aaSJim Ingham SBValueList 112251f96eebSZachary Turner SBFrame::GetVariables (const lldb::SBVariablesOptions& options) 112378a685aaSJim Ingham { 11245160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1125ceb6b139SCaroline Tice 1126b9556accSGreg Clayton SBValueList value_list; 11274fc6cb9cSJim Ingham Mutex::Locker api_locker; 11284fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 11294fc6cb9cSJim Ingham 1130dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1131d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1132b9556accSGreg Clayton 113351f96eebSZachary Turner const bool statics = options.GetIncludeStatics(); 113451f96eebSZachary Turner const bool arguments = options.GetIncludeArguments(); 113551f96eebSZachary Turner const bool locals = options.GetIncludeLocals(); 113651f96eebSZachary Turner const bool in_scope_only = options.GetInScopeOnly(); 113751f96eebSZachary Turner const bool include_runtime_support_values = options.GetIncludeRuntimeSupportValues(); 113851f96eebSZachary Turner const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 113951f96eebSZachary Turner 1140ceb6b139SCaroline Tice if (log) 114151f96eebSZachary Turner log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)", 114251f96eebSZachary Turner arguments, locals, 114351f96eebSZachary Turner statics, in_scope_only, 114451f96eebSZachary Turner include_runtime_support_values, use_dynamic); 1145ceb6b139SCaroline Tice 11467730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 11477730b9a4SJim Ingham if (target && process) 114830fdc8d8SChris Lattner { 11497fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11507730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 11517fdf9ef1SGreg Clayton { 11527730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 11537730b9a4SJim Ingham if (frame) 11547730b9a4SJim Ingham { 115530fdc8d8SChris Lattner size_t i; 1156dbb0abbfSEugene Zelenko VariableList *variable_list = nullptr; 1157d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 115830fdc8d8SChris Lattner if (variable_list) 115930fdc8d8SChris Lattner { 116030fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 116130fdc8d8SChris Lattner if (num_variables) 116230fdc8d8SChris Lattner { 116330fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 116430fdc8d8SChris Lattner { 116530fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 116630fdc8d8SChris Lattner if (variable_sp) 116730fdc8d8SChris Lattner { 116830fdc8d8SChris Lattner bool add_variable = false; 116930fdc8d8SChris Lattner switch (variable_sp->GetScope()) 117030fdc8d8SChris Lattner { 117130fdc8d8SChris Lattner case eValueTypeVariableGlobal: 117230fdc8d8SChris Lattner case eValueTypeVariableStatic: 117330fdc8d8SChris Lattner add_variable = statics; 117430fdc8d8SChris Lattner break; 117530fdc8d8SChris Lattner 117630fdc8d8SChris Lattner case eValueTypeVariableArgument: 117730fdc8d8SChris Lattner add_variable = arguments; 117830fdc8d8SChris Lattner break; 117930fdc8d8SChris Lattner 118030fdc8d8SChris Lattner case eValueTypeVariableLocal: 118130fdc8d8SChris Lattner add_variable = locals; 118230fdc8d8SChris Lattner break; 1183c982c768SGreg Clayton 1184c982c768SGreg Clayton default: 1185c982c768SGreg Clayton break; 118630fdc8d8SChris Lattner } 118730fdc8d8SChris Lattner if (add_variable) 118830fdc8d8SChris Lattner { 1189d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 119030fdc8d8SChris Lattner continue; 119130fdc8d8SChris Lattner 1192e3e91517SEnrico Granata ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues)); 1193560558ebSEnrico Granata 1194dbb0abbfSEugene Zelenko if (!include_runtime_support_values && 1195dbb0abbfSEugene Zelenko valobj_sp != nullptr && 1196dbb0abbfSEugene Zelenko valobj_sp->IsRuntimeSupportValue()) 1197560558ebSEnrico Granata continue; 1198560558ebSEnrico Granata 1199e3e91517SEnrico Granata SBValue value_sb; 1200e3e91517SEnrico Granata value_sb.SetSP(valobj_sp,use_dynamic); 1201e3e91517SEnrico Granata value_list.Append(value_sb); 120230fdc8d8SChris Lattner } 120330fdc8d8SChris Lattner } 120430fdc8d8SChris Lattner } 120530fdc8d8SChris Lattner } 120630fdc8d8SChris Lattner } 120730fdc8d8SChris Lattner } 1208c9858e4dSGreg Clayton else 1209c9858e4dSGreg Clayton { 1210c9858e4dSGreg Clayton if (log) 12117730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame."); 12127730b9a4SJim Ingham } 12137730b9a4SJim Ingham } 12147730b9a4SJim Ingham else 12157730b9a4SJim Ingham { 12167730b9a4SJim Ingham if (log) 12177730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: process is running"); 1218c9858e4dSGreg Clayton } 12197fdf9ef1SGreg Clayton } 1220ceb6b139SCaroline Tice 1221ceb6b139SCaroline Tice if (log) 1222324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", 1223324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1224324a1036SSaleem Abdulrasool static_cast<void*>(value_list.opaque_ptr())); 1225ceb6b139SCaroline Tice 122630fdc8d8SChris Lattner return value_list; 122730fdc8d8SChris Lattner } 122830fdc8d8SChris Lattner 122969b582faSGreg Clayton SBValueList 123030fdc8d8SChris Lattner SBFrame::GetRegisters () 123130fdc8d8SChris Lattner { 12325160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1233ceb6b139SCaroline Tice 123430fdc8d8SChris Lattner SBValueList value_list; 12354fc6cb9cSJim Ingham Mutex::Locker api_locker; 12364fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 12374fc6cb9cSJim Ingham 1238dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1239d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 12407730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 12417730b9a4SJim Ingham if (target && process) 124230fdc8d8SChris Lattner { 12437fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12447730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 12457730b9a4SJim Ingham { 12467730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 12477730b9a4SJim Ingham if (frame) 12487fdf9ef1SGreg Clayton { 1249d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 125030fdc8d8SChris Lattner if (reg_ctx) 125130fdc8d8SChris Lattner { 125230fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 125330fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 125430fdc8d8SChris Lattner { 1255d9e416c0SGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); 125630fdc8d8SChris Lattner } 125730fdc8d8SChris Lattner } 125830fdc8d8SChris Lattner } 1259c9858e4dSGreg Clayton else 1260c9858e4dSGreg Clayton { 1261c9858e4dSGreg Clayton if (log) 12627730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame."); 12637730b9a4SJim Ingham } 12647730b9a4SJim Ingham } 12657730b9a4SJim Ingham else 12667730b9a4SJim Ingham { 12677730b9a4SJim Ingham if (log) 12687730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: process is running"); 1269c9858e4dSGreg Clayton } 12707fdf9ef1SGreg Clayton } 1271ceb6b139SCaroline Tice 1272ceb6b139SCaroline Tice if (log) 1273324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", 1274324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1275324a1036SSaleem Abdulrasool static_cast<void*>(value_list.opaque_ptr())); 1276ceb6b139SCaroline Tice 127730fdc8d8SChris Lattner return value_list; 127830fdc8d8SChris Lattner } 127930fdc8d8SChris Lattner 1280ad9a53c5SJason Molenda SBValue 1281ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name) 1282ad9a53c5SJason Molenda { 1283ad9a53c5SJason Molenda Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1284ad9a53c5SJason Molenda 1285ad9a53c5SJason Molenda SBValue result; 1286ad9a53c5SJason Molenda ValueObjectSP value_sp; 1287ad9a53c5SJason Molenda Mutex::Locker api_locker; 1288ad9a53c5SJason Molenda ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1289ad9a53c5SJason Molenda 1290dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1291ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 1292ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1293ad9a53c5SJason Molenda if (target && process) 1294ad9a53c5SJason Molenda { 1295ad9a53c5SJason Molenda Process::StopLocker stop_locker; 1296ad9a53c5SJason Molenda if (stop_locker.TryLock(&process->GetRunLock())) 1297ad9a53c5SJason Molenda { 1298ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 1299ad9a53c5SJason Molenda if (frame) 1300ad9a53c5SJason Molenda { 1301ad9a53c5SJason Molenda RegisterContextSP reg_ctx (frame->GetRegisterContext()); 1302ad9a53c5SJason Molenda if (reg_ctx) 1303ad9a53c5SJason Molenda { 1304ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 1305ad9a53c5SJason Molenda for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 1306ad9a53c5SJason Molenda { 1307ad9a53c5SJason Molenda const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 1308ad9a53c5SJason Molenda if (reg_info && 1309ad9a53c5SJason Molenda ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 1310ad9a53c5SJason Molenda (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 1311ad9a53c5SJason Molenda { 1312ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 1313ad9a53c5SJason Molenda result.SetSP (value_sp); 1314ad9a53c5SJason Molenda break; 1315ad9a53c5SJason Molenda } 1316ad9a53c5SJason Molenda } 1317ad9a53c5SJason Molenda } 1318ad9a53c5SJason Molenda } 1319ad9a53c5SJason Molenda else 1320ad9a53c5SJason Molenda { 1321ad9a53c5SJason Molenda if (log) 13225d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame."); 1323ad9a53c5SJason Molenda } 1324ad9a53c5SJason Molenda } 1325ad9a53c5SJason Molenda else 1326ad9a53c5SJason Molenda { 1327ad9a53c5SJason Molenda if (log) 13285d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: process is running"); 1329ad9a53c5SJason Molenda } 1330ad9a53c5SJason Molenda } 1331ad9a53c5SJason Molenda 1332ad9a53c5SJason Molenda if (log) 1333324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)", 1334324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1335324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 1336ad9a53c5SJason Molenda 1337ad9a53c5SJason Molenda return result; 1338ad9a53c5SJason Molenda } 1339ad9a53c5SJason Molenda 1340dde9cff3SCaroline Tice bool 1341dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 1342dde9cff3SCaroline Tice { 13435160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1344da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1345da7bc7d0SGreg Clayton 13464fc6cb9cSJim Ingham Mutex::Locker api_locker; 13474fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 13484fc6cb9cSJim Ingham 1349b57e4a1bSJason Molenda StackFrame *frame; 1350d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 13517730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 13527730b9a4SJim Ingham if (target && process) 1353dde9cff3SCaroline Tice { 13547fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13557730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 13567730b9a4SJim Ingham { 13577730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 13587730b9a4SJim Ingham if (frame) 13597fdf9ef1SGreg Clayton { 1360d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 1361dde9cff3SCaroline Tice } 1362c9858e4dSGreg Clayton else 1363c9858e4dSGreg Clayton { 1364c9858e4dSGreg Clayton if (log) 13657730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame."); 13667730b9a4SJim Ingham } 13677730b9a4SJim Ingham } 13687730b9a4SJim Ingham else 13697730b9a4SJim Ingham { 13707730b9a4SJim Ingham if (log) 13717730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: process is running"); 1372c9858e4dSGreg Clayton } 1373c9858e4dSGreg Clayton 13747fdf9ef1SGreg Clayton } 1375dde9cff3SCaroline Tice else 1376da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1377dde9cff3SCaroline Tice 1378dde9cff3SCaroline Tice return true; 1379dde9cff3SCaroline Tice } 13801d3afba3SGreg Clayton 138169b582faSGreg Clayton SBValue 13821d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 13831d3afba3SGreg Clayton { 1384316d498bSGreg Clayton SBValue result; 13857fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1386b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1387d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1388d9e416c0SGreg Clayton if (frame && target) 1389316d498bSGreg Clayton { 139035e1bda6SJim Ingham SBExpressionOptions options; 139135e1bda6SJim Ingham lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue(); 1392cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 139335e1bda6SJim Ingham options.SetUnwindOnError (true); 139424785bd0SEugene Leviant options.SetIgnoreBreakpoints (true); 1395998c8a1cSRyan Brown if (target->GetLanguage() != eLanguageTypeUnknown) 1396998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1397998c8a1cSRyan Brown else 1398998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 139935e1bda6SJim Ingham return EvaluateExpression (expr, options); 1400316d498bSGreg Clayton } 1401316d498bSGreg Clayton return result; 140278a685aaSJim Ingham } 140378a685aaSJim Ingham 140478a685aaSJim Ingham SBValue 14052837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 140678a685aaSJim Ingham { 140735e1bda6SJim Ingham SBExpressionOptions options; 1408cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 140935e1bda6SJim Ingham options.SetUnwindOnError (true); 141024785bd0SEugene Leviant options.SetIgnoreBreakpoints (true); 1411998c8a1cSRyan Brown ExecutionContext exe_ctx(m_opaque_sp.get()); 1412998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1413998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1414998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1415998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1416998c8a1cSRyan Brown else if (frame) 1417998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 141835e1bda6SJim Ingham return EvaluateExpression (expr, options); 14197ba6e991SJim Ingham } 14207ba6e991SJim Ingham 14217ba6e991SJim Ingham SBValue 14227ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error) 14237ba6e991SJim Ingham { 142435e1bda6SJim Ingham SBExpressionOptions options; 1425998c8a1cSRyan Brown ExecutionContext exe_ctx(m_opaque_sp.get()); 1426cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 142735e1bda6SJim Ingham options.SetUnwindOnError (unwind_on_error); 142824785bd0SEugene Leviant options.SetIgnoreBreakpoints (true); 1429998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1430998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1431998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1432998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1433998c8a1cSRyan Brown else if (frame) 1434998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 143535e1bda6SJim Ingham return EvaluateExpression (expr, options); 143635e1bda6SJim Ingham } 143735e1bda6SJim Ingham 143835e1bda6SJim Ingham lldb::SBValue 143935e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options) 144035e1bda6SJim Ingham { 14415160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14424838131bSGreg Clayton 14435160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1444a162ebafSSean Callanan 14458646d3c1SJim Ingham ExpressionResults exe_results = eExpressionSetupError; 144669b582faSGreg Clayton SBValue expr_result; 14477730b9a4SJim Ingham 1448dbb0abbfSEugene Zelenko if (expr == nullptr || expr[0] == '\0') 14497730b9a4SJim Ingham { 14507730b9a4SJim Ingham if (log) 14517730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression called with an empty expression"); 14527730b9a4SJim Ingham return expr_result; 14537730b9a4SJim Ingham } 14547730b9a4SJim Ingham 145581e871edSGreg Clayton ValueObjectSP expr_value_sp; 14564838131bSGreg Clayton 14574fc6cb9cSJim Ingham Mutex::Locker api_locker; 14584fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 14594fc6cb9cSJim Ingham 1460b9556accSGreg Clayton if (log) 14617730b9a4SJim Ingham log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr); 1462b9556accSGreg Clayton 1463dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 14647730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 14657730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 14667730b9a4SJim Ingham 14677730b9a4SJim Ingham if (target && process) 14681d3afba3SGreg Clayton { 14697fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 14707730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 14717730b9a4SJim Ingham { 14727730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 14737730b9a4SJim Ingham if (frame) 14747fdf9ef1SGreg Clayton { 1475fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1476fb6621efSGreg Clayton { 14771ba7c4d0SGreg Clayton StreamString frame_description; 1478d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 14791ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 1480cced1566SGreg Clayton expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str()); 1481fb6621efSGreg Clayton } 1482fb6621efSGreg Clayton 1483d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 1484d9e416c0SGreg Clayton frame, 1485d4439aa9SEnrico Granata expr_value_sp, 148635e1bda6SJim Ingham options.ref()); 1487e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1488fb6621efSGreg Clayton 1489fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1490dbb0abbfSEugene Zelenko Host::SetCrashDescription(nullptr); 14911d3afba3SGreg Clayton } 1492c9858e4dSGreg Clayton else 1493c9858e4dSGreg Clayton { 1494c9858e4dSGreg Clayton if (log) 14957730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame."); 14967730b9a4SJim Ingham } 14977730b9a4SJim Ingham } 14987730b9a4SJim Ingham else 14997730b9a4SJim Ingham { 15007730b9a4SJim Ingham if (log) 15017730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: process is running"); 1502c9858e4dSGreg Clayton } 15037fdf9ef1SGreg Clayton } 15044838131bSGreg Clayton 1505cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1506a162ebafSSean Callanan if (expr_log) 150778a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 1508324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 1509a162ebafSSean Callanan 15104838131bSGreg Clayton if (log) 1511d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 1512324a1036SSaleem Abdulrasool static_cast<void*>(frame), expr, 1513324a1036SSaleem Abdulrasool static_cast<void*>(expr_value_sp.get()), exe_results); 1514cf7e2dc0SJason Molenda #endif 15154838131bSGreg Clayton 1516cfd1acedSGreg Clayton return expr_result; 15171d3afba3SGreg Clayton } 1518316d498bSGreg Clayton 1519316d498bSGreg Clayton bool 15206345fe3eSOleksiy Vyalov SBFrame::IsInlined() 1521316d498bSGreg Clayton { 152205f75e9fSOleksiy Vyalov return static_cast<const SBFrame*>(this)->IsInlined(); 152305f75e9fSOleksiy Vyalov } 152405f75e9fSOleksiy Vyalov 152505f75e9fSOleksiy Vyalov bool 152605f75e9fSOleksiy Vyalov SBFrame::IsInlined() const 152705f75e9fSOleksiy Vyalov { 15285160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 15297fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1530dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1531d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 15327730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 15337730b9a4SJim Ingham if (target && process) 1534316d498bSGreg Clayton { 15357fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 15367730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 15377730b9a4SJim Ingham { 15387730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 15397730b9a4SJim Ingham if (frame) 15407fdf9ef1SGreg Clayton { 15417fdf9ef1SGreg Clayton 1542d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1543316d498bSGreg Clayton if (block) 1544dbb0abbfSEugene Zelenko return block->GetContainingInlinedBlock() != nullptr; 1545316d498bSGreg Clayton } 1546c9858e4dSGreg Clayton else 1547c9858e4dSGreg Clayton { 1548c9858e4dSGreg Clayton if (log) 15497730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame."); 15507730b9a4SJim Ingham } 15517730b9a4SJim Ingham } 15527730b9a4SJim Ingham else 15537730b9a4SJim Ingham { 15547730b9a4SJim Ingham if (log) 15557730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: process is running"); 1556c9858e4dSGreg Clayton } 1557c9858e4dSGreg Clayton 15587fdf9ef1SGreg Clayton } 1559316d498bSGreg Clayton return false; 1560316d498bSGreg Clayton } 1561316d498bSGreg Clayton 1562316d498bSGreg Clayton const char * 15636345fe3eSOleksiy Vyalov SBFrame::GetFunctionName() 1564316d498bSGreg Clayton { 156505f75e9fSOleksiy Vyalov return static_cast<const SBFrame*>(this)->GetFunctionName(); 156605f75e9fSOleksiy Vyalov } 156705f75e9fSOleksiy Vyalov 156805f75e9fSOleksiy Vyalov const char * 156905f75e9fSOleksiy Vyalov SBFrame::GetFunctionName() const 157005f75e9fSOleksiy Vyalov { 15715160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1572dbb0abbfSEugene Zelenko const char *name = nullptr; 15737fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1574dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1575d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 15767730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 15777730b9a4SJim Ingham if (target && process) 1578316d498bSGreg Clayton { 15797fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 15807730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 15817730b9a4SJim Ingham { 15827730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 15837730b9a4SJim Ingham if (frame) 15847fdf9ef1SGreg Clayton { 1585d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1586316d498bSGreg Clayton if (sc.block) 1587316d498bSGreg Clayton { 1588316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1589316d498bSGreg Clayton if (inlined_block) 1590316d498bSGreg Clayton { 1591316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1592ddaf6a72SGreg Clayton name = inlined_info->GetName(sc.function->GetLanguage()).AsCString(); 1593316d498bSGreg Clayton } 1594316d498bSGreg Clayton } 1595316d498bSGreg Clayton 1596dbb0abbfSEugene Zelenko if (name == nullptr) 1597316d498bSGreg Clayton { 1598316d498bSGreg Clayton if (sc.function) 1599316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1600316d498bSGreg Clayton } 1601316d498bSGreg Clayton 1602dbb0abbfSEugene Zelenko if (name == nullptr) 1603316d498bSGreg Clayton { 1604316d498bSGreg Clayton if (sc.symbol) 1605316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1606316d498bSGreg Clayton } 1607316d498bSGreg Clayton } 1608c9858e4dSGreg Clayton else 1609c9858e4dSGreg Clayton { 1610c9858e4dSGreg Clayton if (log) 16117730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame."); 16127730b9a4SJim Ingham } 16137730b9a4SJim Ingham } 16147730b9a4SJim Ingham else 16157730b9a4SJim Ingham { 16167730b9a4SJim Ingham if (log) 16177730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName() => error: process is running"); 1618c9858e4dSGreg Clayton 1619c9858e4dSGreg Clayton } 16207fdf9ef1SGreg Clayton } 1621316d498bSGreg Clayton return name; 1622316d498bSGreg Clayton } 1623c1f705c2SEnrico Granata 1624c1f705c2SEnrico Granata const char * 1625c1f705c2SEnrico Granata SBFrame::GetDisplayFunctionName() 1626c1f705c2SEnrico Granata { 1627c1f705c2SEnrico Granata Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1628dbb0abbfSEugene Zelenko const char *name = nullptr; 1629c1f705c2SEnrico Granata ExecutionContext exe_ctx(m_opaque_sp.get()); 1630dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1631c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1632c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 1633c1f705c2SEnrico Granata if (target && process) 1634c1f705c2SEnrico Granata { 1635c1f705c2SEnrico Granata Process::StopLocker stop_locker; 1636c1f705c2SEnrico Granata if (stop_locker.TryLock(&process->GetRunLock())) 1637c1f705c2SEnrico Granata { 1638c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr(); 1639c1f705c2SEnrico Granata if (frame) 1640c1f705c2SEnrico Granata { 1641c1f705c2SEnrico Granata SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1642c1f705c2SEnrico Granata if (sc.block) 1643c1f705c2SEnrico Granata { 1644c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1645c1f705c2SEnrico Granata if (inlined_block) 1646c1f705c2SEnrico Granata { 1647c1f705c2SEnrico Granata const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1648ddaf6a72SGreg Clayton name = inlined_info->GetDisplayName(sc.function->GetLanguage()).AsCString(); 1649c1f705c2SEnrico Granata } 1650c1f705c2SEnrico Granata } 1651c1f705c2SEnrico Granata 1652dbb0abbfSEugene Zelenko if (name == nullptr) 1653c1f705c2SEnrico Granata { 1654c1f705c2SEnrico Granata if (sc.function) 1655c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString(); 1656c1f705c2SEnrico Granata } 1657c1f705c2SEnrico Granata 1658dbb0abbfSEugene Zelenko if (name == nullptr) 1659c1f705c2SEnrico Granata { 1660c1f705c2SEnrico Granata if (sc.symbol) 1661c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString(); 1662c1f705c2SEnrico Granata } 1663c1f705c2SEnrico Granata } 1664c1f705c2SEnrico Granata else 1665c1f705c2SEnrico Granata { 1666c1f705c2SEnrico Granata if (log) 1667c1f705c2SEnrico Granata log->Printf ("SBFrame::GetDisplayFunctionName () => error: could not reconstruct frame object for this SBFrame."); 1668c1f705c2SEnrico Granata } 1669c1f705c2SEnrico Granata } 1670c1f705c2SEnrico Granata else 1671c1f705c2SEnrico Granata { 1672c1f705c2SEnrico Granata if (log) 1673c1f705c2SEnrico Granata log->Printf ("SBFrame::GetDisplayFunctionName() => error: process is running"); 1674c1f705c2SEnrico Granata 1675c1f705c2SEnrico Granata } 1676c1f705c2SEnrico Granata } 1677c1f705c2SEnrico Granata return name; 1678c1f705c2SEnrico Granata } 1679