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> 13349213f9SGreg Clayton #include <set> 14dbb0abbfSEugene Zelenko #include <string> 15dbb0abbfSEugene Zelenko 16dbb0abbfSEugene Zelenko // Other libraries and framework includes 17dbb0abbfSEugene Zelenko // Project includes 18dbb0abbfSEugene Zelenko #include "lldb/API/SBFrame.h" 1930fdc8d8SChris Lattner 2030fdc8d8SChris Lattner #include "lldb/lldb-types.h" 2130fdc8d8SChris Lattner 2230fdc8d8SChris Lattner #include "lldb/Core/Address.h" 2330fdc8d8SChris Lattner #include "lldb/Core/ConstString.h" 24ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 2530fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2630fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2730fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h" 2830fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h" 294dbb271fSSean Callanan #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h" 30151c032cSJim Ingham #include "lldb/Expression/UserExpression.h" 311ba7c4d0SGreg Clayton #include "lldb/Host/Host.h" 3230fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 331f746071SGreg Clayton #include "lldb/Symbol/Function.h" 341f746071SGreg Clayton #include "lldb/Symbol/Symbol.h" 3530fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 3630fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h" 3730fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h" 3830fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h" 3930fdc8d8SChris Lattner #include "lldb/Target/Target.h" 4030fdc8d8SChris Lattner #include "lldb/Target/Process.h" 4130fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 42b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h" 43b9556accSGreg Clayton #include "lldb/Target/StackID.h" 4430fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 4530fdc8d8SChris Lattner 464c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 474c5de699SEli Friedman #include "lldb/API/SBValue.h" 484c5de699SEli Friedman #include "lldb/API/SBAddress.h" 4935e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h" 50dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 514c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h" 524c5de699SEli Friedman #include "lldb/API/SBThread.h" 5351f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h" 5430fdc8d8SChris Lattner 5530fdc8d8SChris Lattner using namespace lldb; 5630fdc8d8SChris Lattner using namespace lldb_private; 5730fdc8d8SChris Lattner 5830fdc8d8SChris Lattner SBFrame::SBFrame () : 597fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef()) 6030fdc8d8SChris Lattner { 6130fdc8d8SChris Lattner } 6230fdc8d8SChris Lattner 63b57e4a1bSJason Molenda SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) : 647fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (lldb_object_sp)) 6530fdc8d8SChris Lattner { 665160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 67ceb6b139SCaroline Tice 68ceb6b139SCaroline Tice if (log) 69ceb6b139SCaroline Tice { 70ceb6b139SCaroline Tice SBStream sstr; 71ceb6b139SCaroline Tice GetDescription (sstr); 724838131bSGreg Clayton log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s", 73324a1036SSaleem Abdulrasool static_cast<void*>(lldb_object_sp.get()), 74324a1036SSaleem Abdulrasool static_cast<void*>(lldb_object_sp.get()), sstr.GetData()); 75ceb6b139SCaroline Tice } 7630fdc8d8SChris Lattner } 7730fdc8d8SChris Lattner 78efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) : 797fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp)) 80efabb123SGreg Clayton { 81efabb123SGreg Clayton } 82efabb123SGreg Clayton 83dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default; 84dbb0abbfSEugene Zelenko 85efabb123SGreg Clayton const SBFrame & 86efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs) 87efabb123SGreg Clayton { 88efabb123SGreg Clayton if (this != &rhs) 897fdf9ef1SGreg Clayton *m_opaque_sp = *rhs.m_opaque_sp; 90efabb123SGreg Clayton return *this; 91efabb123SGreg Clayton } 92efabb123SGreg Clayton 93b57e4a1bSJason Molenda StackFrameSP 94b9556accSGreg Clayton SBFrame::GetFrameSP() const 95b9556accSGreg Clayton { 96dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP()); 97b9556accSGreg Clayton } 9830fdc8d8SChris Lattner 9930fdc8d8SChris Lattner void 100b57e4a1bSJason Molenda SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp) 10130fdc8d8SChris Lattner { 1027fdf9ef1SGreg Clayton return m_opaque_sp->SetFrameSP(lldb_object_sp); 103b9556accSGreg Clayton } 10430fdc8d8SChris Lattner 10530fdc8d8SChris Lattner bool 10630fdc8d8SChris Lattner SBFrame::IsValid() const 10730fdc8d8SChris Lattner { 108bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 109bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1107fa7dc36SJim Ingham 1117fa7dc36SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1127fa7dc36SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1137fa7dc36SJim Ingham if (target && process) 1147fa7dc36SJim Ingham { 1157fa7dc36SJim Ingham Process::StopLocker stop_locker; 1167fa7dc36SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 117dbb0abbfSEugene Zelenko return GetFrameSP().get() != nullptr; 11830fdc8d8SChris Lattner } 11930fdc8d8SChris Lattner 1207fa7dc36SJim Ingham // Without a target & process we can't have a valid stack frame. 1217fa7dc36SJim Ingham return false; 1227fa7dc36SJim Ingham } 1237fa7dc36SJim Ingham 12430fdc8d8SChris Lattner SBSymbolContext 12530fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const 12630fdc8d8SChris Lattner { 1275160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 12830fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 129bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 130bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1314fc6cb9cSJim Ingham 132dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 133d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1347730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1357730b9a4SJim Ingham if (target && process) 136af67cecdSGreg Clayton { 1377fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1387730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 1397730b9a4SJim Ingham { 1407730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1417730b9a4SJim Ingham if (frame) 1427fdf9ef1SGreg Clayton { 143d9e416c0SGreg Clayton sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope)); 144af67cecdSGreg Clayton } 145c9858e4dSGreg Clayton else 146c9858e4dSGreg Clayton { 147c9858e4dSGreg Clayton if (log) 1487730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame."); 1497730b9a4SJim Ingham } 1507730b9a4SJim Ingham } 1517730b9a4SJim Ingham else 1527730b9a4SJim Ingham { 1537730b9a4SJim Ingham if (log) 1547730b9a4SJim Ingham log->Printf ("SBFrame::GetSymbolContext () => error: process is running"); 155c9858e4dSGreg Clayton } 1567fdf9ef1SGreg Clayton } 157ceb6b139SCaroline Tice 158ceb6b139SCaroline Tice if (log) 1594838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)", 160324a1036SSaleem Abdulrasool static_cast<void*>(frame), resolve_scope, 161324a1036SSaleem Abdulrasool static_cast<void*>(sb_sym_ctx.get())); 162ceb6b139SCaroline Tice 16330fdc8d8SChris Lattner return sb_sym_ctx; 16430fdc8d8SChris Lattner } 16530fdc8d8SChris Lattner 16630fdc8d8SChris Lattner SBModule 16730fdc8d8SChris Lattner SBFrame::GetModule () const 16830fdc8d8SChris Lattner { 1695160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 17072eff18aSGreg Clayton SBModule sb_module; 171acdbe816SGreg Clayton ModuleSP module_sp; 172bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 173bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1744fc6cb9cSJim Ingham 175dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 176d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1777730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1787730b9a4SJim Ingham if (target && process) 179af67cecdSGreg Clayton { 1807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1817730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 1827730b9a4SJim Ingham { 1837730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1847730b9a4SJim Ingham if (frame) 1857fdf9ef1SGreg Clayton { 186d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp; 187acdbe816SGreg Clayton sb_module.SetSP (module_sp); 188af67cecdSGreg Clayton } 189c9858e4dSGreg Clayton else 190c9858e4dSGreg Clayton { 191c9858e4dSGreg Clayton if (log) 1927730b9a4SJim Ingham log->Printf ("SBFrame::GetModule () => error: could not reconstruct frame object for this SBFrame."); 1937730b9a4SJim Ingham } 1947730b9a4SJim Ingham } 1957730b9a4SJim Ingham else 1967730b9a4SJim Ingham { 1977730b9a4SJim Ingham if (log) 1987730b9a4SJim Ingham log->Printf ("SBFrame::GetModule () => error: process is running"); 199c9858e4dSGreg Clayton } 2007fdf9ef1SGreg Clayton } 20172eff18aSGreg Clayton 2024838131bSGreg Clayton if (log) 2034838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)", 204324a1036SSaleem Abdulrasool static_cast<void*>(frame), 205324a1036SSaleem Abdulrasool static_cast<void*>(module_sp.get())); 2064838131bSGreg Clayton 20730fdc8d8SChris Lattner return sb_module; 20830fdc8d8SChris Lattner } 20930fdc8d8SChris Lattner 21030fdc8d8SChris Lattner SBCompileUnit 21130fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 21230fdc8d8SChris Lattner { 2135160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 21472eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 215bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 216bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2174fc6cb9cSJim Ingham 218dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 219d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2207730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 2217730b9a4SJim Ingham if (target && process) 222af67cecdSGreg Clayton { 2237fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2247730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 2257730b9a4SJim Ingham { 2267730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 2277730b9a4SJim Ingham if (frame) 2287fdf9ef1SGreg Clayton { 229d9e416c0SGreg Clayton sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 230af67cecdSGreg Clayton } 231c9858e4dSGreg Clayton else 232c9858e4dSGreg Clayton { 233ceb6b139SCaroline Tice if (log) 2347730b9a4SJim Ingham log->Printf ("SBFrame::GetCompileUnit () => error: could not reconstruct frame object for this SBFrame."); 2357730b9a4SJim Ingham } 2367730b9a4SJim Ingham } 2377730b9a4SJim Ingham else 2387730b9a4SJim Ingham { 2397730b9a4SJim Ingham if (log) 2407730b9a4SJim Ingham log->Printf ("SBFrame::GetCompileUnit () => error: process is running"); 241c9858e4dSGreg Clayton } 242c9858e4dSGreg Clayton } 243c9858e4dSGreg Clayton if (log) 244c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)", 245324a1036SSaleem Abdulrasool static_cast<void*>(frame), 246324a1036SSaleem Abdulrasool static_cast<void*>(sb_comp_unit.get())); 247ceb6b139SCaroline Tice 24830fdc8d8SChris Lattner return sb_comp_unit; 24930fdc8d8SChris Lattner } 25030fdc8d8SChris Lattner 25130fdc8d8SChris Lattner SBFunction 25230fdc8d8SChris Lattner SBFrame::GetFunction () const 25330fdc8d8SChris Lattner { 2545160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 25572eff18aSGreg Clayton SBFunction sb_function; 256bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 257bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2584fc6cb9cSJim Ingham 259dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 260d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2617730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 2627730b9a4SJim Ingham if (target && process) 263af67cecdSGreg Clayton { 2647fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2657730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 2667730b9a4SJim Ingham { 2677730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 2687730b9a4SJim Ingham if (frame) 2697fdf9ef1SGreg Clayton { 270d9e416c0SGreg Clayton sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function); 271af67cecdSGreg Clayton } 272c9858e4dSGreg Clayton else 273c9858e4dSGreg Clayton { 274c9858e4dSGreg Clayton if (log) 2757730b9a4SJim Ingham log->Printf ("SBFrame::GetFunction () => error: could not reconstruct frame object for this SBFrame."); 2767730b9a4SJim Ingham } 2777730b9a4SJim Ingham } 2787730b9a4SJim Ingham else 2797730b9a4SJim Ingham { 2807730b9a4SJim Ingham if (log) 2817730b9a4SJim Ingham log->Printf ("SBFrame::GetFunction () => error: process is running"); 2827fdf9ef1SGreg Clayton } 283c9858e4dSGreg Clayton } 2844838131bSGreg Clayton if (log) 2854838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)", 286324a1036SSaleem Abdulrasool static_cast<void*>(frame), 287324a1036SSaleem Abdulrasool static_cast<void*>(sb_function.get())); 2884838131bSGreg Clayton 28930fdc8d8SChris Lattner return sb_function; 29030fdc8d8SChris Lattner } 29130fdc8d8SChris Lattner 2923b06557eSGreg Clayton SBSymbol 2933b06557eSGreg Clayton SBFrame::GetSymbol () const 2943b06557eSGreg Clayton { 2955160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 29672eff18aSGreg Clayton SBSymbol sb_symbol; 297bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 298bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2994fc6cb9cSJim Ingham 300dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 301d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3027730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 3037730b9a4SJim Ingham if (target && process) 304af67cecdSGreg Clayton { 3057fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3067730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 3077730b9a4SJim Ingham { 3087730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 3097730b9a4SJim Ingham if (frame) 3107fdf9ef1SGreg Clayton { 311d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol); 312af67cecdSGreg Clayton } 313c9858e4dSGreg Clayton else 314c9858e4dSGreg Clayton { 315c9858e4dSGreg Clayton if (log) 3167730b9a4SJim Ingham log->Printf ("SBFrame::GetSymbol () => error: could not reconstruct frame object for this SBFrame."); 3177730b9a4SJim Ingham } 3187730b9a4SJim Ingham } 3197730b9a4SJim Ingham else 3207730b9a4SJim Ingham { 3217730b9a4SJim Ingham if (log) 3227730b9a4SJim Ingham log->Printf ("SBFrame::GetSymbol () => error: process is running"); 3237fdf9ef1SGreg Clayton } 324c9858e4dSGreg Clayton } 3254838131bSGreg Clayton if (log) 3264838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 327324a1036SSaleem Abdulrasool static_cast<void*>(frame), 328324a1036SSaleem Abdulrasool static_cast<void*>(sb_symbol.get())); 3293b06557eSGreg Clayton return sb_symbol; 3303b06557eSGreg Clayton } 3313b06557eSGreg Clayton 33230fdc8d8SChris Lattner SBBlock 33330fdc8d8SChris Lattner SBFrame::GetBlock () const 33430fdc8d8SChris Lattner { 3355160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 33672eff18aSGreg Clayton SBBlock sb_block; 337bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 338bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3394fc6cb9cSJim Ingham 340dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 341d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3427730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 3437730b9a4SJim Ingham if (target && process) 344af67cecdSGreg Clayton { 3457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3467730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 3477730b9a4SJim Ingham { 3487730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 3497730b9a4SJim Ingham if (frame) 3507fdf9ef1SGreg Clayton { 351d9e416c0SGreg Clayton sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block); 352af67cecdSGreg Clayton } 353c9858e4dSGreg Clayton else 354c9858e4dSGreg Clayton { 355c9858e4dSGreg Clayton if (log) 3567730b9a4SJim Ingham log->Printf ("SBFrame::GetBlock () => error: could not reconstruct frame object for this SBFrame."); 3577730b9a4SJim Ingham } 3587730b9a4SJim Ingham } 3597730b9a4SJim Ingham else 3607730b9a4SJim Ingham { 3617730b9a4SJim Ingham if (log) 362324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", 363324a1036SSaleem Abdulrasool static_cast<void*>(frame)); 3647fdf9ef1SGreg Clayton } 365c9858e4dSGreg Clayton } 3664838131bSGreg Clayton if (log) 3674838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)", 368324a1036SSaleem Abdulrasool static_cast<void*>(frame), 369324a1036SSaleem Abdulrasool static_cast<void*>(sb_block.GetPtr())); 37030fdc8d8SChris Lattner return sb_block; 37130fdc8d8SChris Lattner } 37230fdc8d8SChris Lattner 37395897c6aSGreg Clayton SBBlock 37495897c6aSGreg Clayton SBFrame::GetFrameBlock () const 37595897c6aSGreg Clayton { 37672eff18aSGreg Clayton SBBlock sb_block; 377bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 378bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3794fc6cb9cSJim Ingham 380dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 381d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3825160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3837730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 3847730b9a4SJim Ingham if (target && process) 385af67cecdSGreg Clayton { 3867fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3877730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 3887730b9a4SJim Ingham { 3897730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 3907730b9a4SJim Ingham if (frame) 3917fdf9ef1SGreg Clayton { 392d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock ()); 393af67cecdSGreg Clayton } 394c9858e4dSGreg Clayton else 395c9858e4dSGreg Clayton { 396c9858e4dSGreg Clayton if (log) 3977730b9a4SJim Ingham log->Printf ("SBFrame::GetFrameBlock () => error: could not reconstruct frame object for this SBFrame."); 3987730b9a4SJim Ingham } 3997730b9a4SJim Ingham } 4007730b9a4SJim Ingham else 4017730b9a4SJim Ingham { 4027730b9a4SJim Ingham if (log) 4037730b9a4SJim Ingham log->Printf ("SBFrame::GetFrameBlock () => error: process is running"); 4047fdf9ef1SGreg Clayton } 405c9858e4dSGreg Clayton } 4064838131bSGreg Clayton if (log) 4074838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 408324a1036SSaleem Abdulrasool static_cast<void*>(frame), 409324a1036SSaleem Abdulrasool static_cast<void*>(sb_block.GetPtr())); 41095897c6aSGreg Clayton return sb_block; 41195897c6aSGreg Clayton } 41295897c6aSGreg Clayton 41330fdc8d8SChris Lattner SBLineEntry 41430fdc8d8SChris Lattner SBFrame::GetLineEntry () const 41530fdc8d8SChris Lattner { 4165160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 41772eff18aSGreg Clayton SBLineEntry sb_line_entry; 418bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 419bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4204fc6cb9cSJim Ingham 421dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 422d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4237730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 4247730b9a4SJim Ingham if (target && process) 425af67cecdSGreg Clayton { 4267fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4277730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 4287730b9a4SJim Ingham { 4297730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 4307730b9a4SJim Ingham if (frame) 4317fdf9ef1SGreg Clayton { 432d9e416c0SGreg Clayton sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry); 433af67cecdSGreg Clayton } 434c9858e4dSGreg Clayton else 435c9858e4dSGreg Clayton { 436c9858e4dSGreg Clayton if (log) 4377730b9a4SJim Ingham log->Printf ("SBFrame::GetLineEntry () => error: could not reconstruct frame object for this SBFrame."); 4387730b9a4SJim Ingham } 4397730b9a4SJim Ingham } 4407730b9a4SJim Ingham else 4417730b9a4SJim Ingham { 4427730b9a4SJim Ingham if (log) 4437730b9a4SJim Ingham log->Printf ("SBFrame::GetLineEntry () => error: process is running"); 4447fdf9ef1SGreg Clayton } 445c9858e4dSGreg Clayton } 4464838131bSGreg Clayton if (log) 4474838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 448324a1036SSaleem Abdulrasool static_cast<void*>(frame), 449324a1036SSaleem Abdulrasool static_cast<void*>(sb_line_entry.get())); 45030fdc8d8SChris Lattner return sb_line_entry; 45130fdc8d8SChris Lattner } 45230fdc8d8SChris Lattner 45330fdc8d8SChris Lattner uint32_t 45430fdc8d8SChris Lattner SBFrame::GetFrameID () const 45530fdc8d8SChris Lattner { 456b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 457b9556accSGreg Clayton 458*c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 459*c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 460*c481c7eeSJim Ingham 461b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 4627fdf9ef1SGreg Clayton if (frame) 463d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex (); 4644838131bSGreg Clayton 4655160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4664838131bSGreg Clayton if (log) 4674838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameID () => %u", 468324a1036SSaleem Abdulrasool static_cast<void*>(frame), frame_idx); 4694838131bSGreg Clayton return frame_idx; 47030fdc8d8SChris Lattner } 47130fdc8d8SChris Lattner 472424a5dbcSGreg Clayton lldb::addr_t 473424a5dbcSGreg Clayton SBFrame::GetCFA () const 474424a5dbcSGreg Clayton { 475*c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 476*c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 477*c481c7eeSJim Ingham 478424a5dbcSGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 479424a5dbcSGreg Clayton if (frame) 480424a5dbcSGreg Clayton return frame->GetStackID().GetCallFrameAddress(); 481424a5dbcSGreg Clayton return LLDB_INVALID_ADDRESS; 482424a5dbcSGreg Clayton } 483424a5dbcSGreg Clayton 48469b582faSGreg Clayton addr_t 48530fdc8d8SChris Lattner SBFrame::GetPC () const 48630fdc8d8SChris Lattner { 4875160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 48869b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 489bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 490bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4914fc6cb9cSJim Ingham 492dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 493d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4947730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 4957730b9a4SJim Ingham if (target && process) 496af67cecdSGreg Clayton { 4977fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4987730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 4997730b9a4SJim Ingham { 5007730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5017730b9a4SJim Ingham if (frame) 5027fdf9ef1SGreg Clayton { 50325b9f7ebSTamas Berghammer addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target, eAddressClassCode); 504af67cecdSGreg Clayton } 505c9858e4dSGreg Clayton else 506c9858e4dSGreg Clayton { 507c9858e4dSGreg Clayton if (log) 5087730b9a4SJim Ingham log->Printf ("SBFrame::GetPC () => error: could not reconstruct frame object for this SBFrame."); 5097730b9a4SJim Ingham } 5107730b9a4SJim Ingham } 5117730b9a4SJim Ingham else 5127730b9a4SJim Ingham { 5137730b9a4SJim Ingham if (log) 5147730b9a4SJim Ingham log->Printf ("SBFrame::GetPC () => error: process is running"); 515c9858e4dSGreg Clayton } 5167fdf9ef1SGreg Clayton } 517ceb6b139SCaroline Tice 518ceb6b139SCaroline Tice if (log) 519324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetPC () => 0x%" PRIx64, 520324a1036SSaleem Abdulrasool static_cast<void*>(frame), addr); 521ceb6b139SCaroline Tice 522ceb6b139SCaroline Tice return addr; 52330fdc8d8SChris Lattner } 52430fdc8d8SChris Lattner 52530fdc8d8SChris Lattner bool 52669b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc) 52730fdc8d8SChris Lattner { 5285160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 529ceb6b139SCaroline Tice bool ret_val = false; 530bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 531bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5324fc6cb9cSJim Ingham 533dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 534d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5357730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 5367730b9a4SJim Ingham if (target && process) 537af67cecdSGreg Clayton { 5387fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5397730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 5407730b9a4SJim Ingham { 5417730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5427730b9a4SJim Ingham if (frame) 5437fdf9ef1SGreg Clayton { 544d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC (new_pc); 545af67cecdSGreg Clayton } 546c9858e4dSGreg Clayton else 547c9858e4dSGreg Clayton { 548c9858e4dSGreg Clayton if (log) 5497730b9a4SJim Ingham log->Printf ("SBFrame::SetPC () => error: could not reconstruct frame object for this SBFrame."); 5507730b9a4SJim Ingham } 5517730b9a4SJim Ingham } 5527730b9a4SJim Ingham else 5537730b9a4SJim Ingham { 5547730b9a4SJim Ingham if (log) 5557730b9a4SJim Ingham log->Printf ("SBFrame::SetPC () => error: process is running"); 556c9858e4dSGreg Clayton } 5577fdf9ef1SGreg Clayton } 558ceb6b139SCaroline Tice 559ceb6b139SCaroline Tice if (log) 560d01b2953SDaniel Malea log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i", 561324a1036SSaleem Abdulrasool static_cast<void*>(frame), new_pc, ret_val); 562ceb6b139SCaroline Tice 563ceb6b139SCaroline Tice return ret_val; 56430fdc8d8SChris Lattner } 56530fdc8d8SChris Lattner 56669b582faSGreg Clayton addr_t 56730fdc8d8SChris Lattner SBFrame::GetSP () const 56830fdc8d8SChris Lattner { 5695160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5704838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 571bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 572bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5734fc6cb9cSJim Ingham 574dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 575d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5767730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 5777730b9a4SJim Ingham if (target && process) 578af67cecdSGreg Clayton { 5797fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5807730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 5817730b9a4SJim Ingham { 5827730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5837730b9a4SJim Ingham if (frame) 5847fdf9ef1SGreg Clayton { 585d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 586af67cecdSGreg Clayton } 587c9858e4dSGreg Clayton else 588c9858e4dSGreg Clayton { 589c9858e4dSGreg Clayton if (log) 5907730b9a4SJim Ingham log->Printf ("SBFrame::GetSP () => error: could not reconstruct frame object for this SBFrame."); 5917730b9a4SJim Ingham } 5927730b9a4SJim Ingham } 5937730b9a4SJim Ingham else 5947730b9a4SJim Ingham { 5957730b9a4SJim Ingham if (log) 5967730b9a4SJim Ingham log->Printf ("SBFrame::GetSP () => error: process is running"); 5977fdf9ef1SGreg Clayton } 598c9858e4dSGreg Clayton } 5994838131bSGreg Clayton if (log) 600324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetSP () => 0x%" PRIx64, 601324a1036SSaleem Abdulrasool static_cast<void*>(frame), addr); 6024838131bSGreg Clayton 6034838131bSGreg Clayton return addr; 60430fdc8d8SChris Lattner } 60530fdc8d8SChris Lattner 60669b582faSGreg Clayton addr_t 60730fdc8d8SChris Lattner SBFrame::GetFP () const 60830fdc8d8SChris Lattner { 6095160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 61069b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 611bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 612bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 6134fc6cb9cSJim Ingham 614dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 615d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6167730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 6177730b9a4SJim Ingham if (target && process) 618af67cecdSGreg Clayton { 6197fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6207730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 6217730b9a4SJim Ingham { 6227730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 6237730b9a4SJim Ingham if (frame) 6247fdf9ef1SGreg Clayton { 625d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 626af67cecdSGreg Clayton } 627c9858e4dSGreg Clayton else 628c9858e4dSGreg Clayton { 629c9858e4dSGreg Clayton if (log) 6307730b9a4SJim Ingham log->Printf ("SBFrame::GetFP () => error: could not reconstruct frame object for this SBFrame."); 6317730b9a4SJim Ingham } 6327730b9a4SJim Ingham } 6337730b9a4SJim Ingham else 6347730b9a4SJim Ingham { 6357730b9a4SJim Ingham if (log) 6367730b9a4SJim Ingham log->Printf ("SBFrame::GetFP () => error: process is running"); 637c9858e4dSGreg Clayton } 6387fdf9ef1SGreg Clayton } 639ceb6b139SCaroline Tice 640ceb6b139SCaroline Tice if (log) 641324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetFP () => 0x%" PRIx64, 642324a1036SSaleem Abdulrasool static_cast<void*>(frame), addr); 643ceb6b139SCaroline Tice return addr; 64430fdc8d8SChris Lattner } 64530fdc8d8SChris Lattner 64630fdc8d8SChris Lattner SBAddress 64730fdc8d8SChris Lattner SBFrame::GetPCAddress () const 64830fdc8d8SChris Lattner { 6495160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 65030fdc8d8SChris Lattner SBAddress sb_addr; 651bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 652bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 6534fc6cb9cSJim Ingham 654b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 655d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6567730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 6577730b9a4SJim Ingham if (target && process) 658af67cecdSGreg Clayton { 6597fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6607730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 6617730b9a4SJim Ingham { 6627730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 6637730b9a4SJim Ingham if (frame) 6647fdf9ef1SGreg Clayton { 665d9e416c0SGreg Clayton sb_addr.SetAddress (&frame->GetFrameCodeAddress()); 666af67cecdSGreg Clayton } 667c9858e4dSGreg Clayton else 668c9858e4dSGreg Clayton { 669c9858e4dSGreg Clayton if (log) 6707730b9a4SJim Ingham log->Printf ("SBFrame::GetPCAddress () => error: could not reconstruct frame object for this SBFrame."); 6717730b9a4SJim Ingham } 6727730b9a4SJim Ingham } 6737730b9a4SJim Ingham else 6747730b9a4SJim Ingham { 6757730b9a4SJim Ingham if (log) 6767730b9a4SJim Ingham log->Printf ("SBFrame::GetPCAddress () => error: process is running"); 6777fdf9ef1SGreg Clayton } 678c9858e4dSGreg Clayton } 6794838131bSGreg Clayton if (log) 680324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", 681324a1036SSaleem Abdulrasool static_cast<void*>(frame), 682324a1036SSaleem Abdulrasool static_cast<void*>(sb_addr.get())); 68330fdc8d8SChris Lattner return sb_addr; 68430fdc8d8SChris Lattner } 68530fdc8d8SChris Lattner 68630fdc8d8SChris Lattner void 68730fdc8d8SChris Lattner SBFrame::Clear() 68830fdc8d8SChris Lattner { 689af2589eaSGreg Clayton m_opaque_sp->Clear(); 69030fdc8d8SChris Lattner } 69130fdc8d8SChris Lattner 6927edbdfc9SGreg Clayton lldb::SBValue 6937edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path) 6947edbdfc9SGreg Clayton { 6957edbdfc9SGreg Clayton SBValue sb_value; 696*c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 697*c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 698*c481c7eeSJim Ingham 699b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 700d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 701d9e416c0SGreg Clayton if (frame && target) 7027edbdfc9SGreg Clayton { 703d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 7047edbdfc9SGreg Clayton sb_value = GetValueForVariablePath (var_path, use_dynamic); 7057edbdfc9SGreg Clayton } 7067edbdfc9SGreg Clayton return sb_value; 7077edbdfc9SGreg Clayton } 7087edbdfc9SGreg Clayton 7097edbdfc9SGreg Clayton lldb::SBValue 7107edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic) 7117edbdfc9SGreg Clayton { 7127edbdfc9SGreg Clayton SBValue sb_value; 7135160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 714dbb0abbfSEugene Zelenko if (var_path == nullptr || var_path[0] == '\0') 7157730b9a4SJim Ingham { 7167730b9a4SJim Ingham if (log) 7177730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath called with empty variable path."); 7187730b9a4SJim Ingham return sb_value; 7197730b9a4SJim Ingham } 7207730b9a4SJim Ingham 721bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 722bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7234fc6cb9cSJim Ingham 724dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 725d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7267730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 7277730b9a4SJim Ingham if (target && process) 7287edbdfc9SGreg Clayton { 7297fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7307730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 7317730b9a4SJim Ingham { 7327730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 7337730b9a4SJim Ingham if (frame) 7347fdf9ef1SGreg Clayton { 7357edbdfc9SGreg Clayton VariableSP var_sp; 7367edbdfc9SGreg Clayton Error error; 737d9e416c0SGreg Clayton ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path, 738e3e91517SEnrico Granata eNoDynamicValues, 739b57e4a1bSJason Molenda StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 7407edbdfc9SGreg Clayton var_sp, 7417edbdfc9SGreg Clayton error)); 742e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 7437edbdfc9SGreg Clayton } 744c9858e4dSGreg Clayton else 745c9858e4dSGreg Clayton { 746c9858e4dSGreg Clayton if (log) 7477730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath () => error: could not reconstruct frame object for this SBFrame."); 7487730b9a4SJim Ingham } 7497730b9a4SJim Ingham } 7507730b9a4SJim Ingham else 7517730b9a4SJim Ingham { 7527730b9a4SJim Ingham if (log) 7537730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath () => error: process is running"); 754c9858e4dSGreg Clayton } 7557fdf9ef1SGreg Clayton } 7567edbdfc9SGreg Clayton return sb_value; 7577edbdfc9SGreg Clayton } 7587edbdfc9SGreg Clayton 75930fdc8d8SChris Lattner SBValue 76069b582faSGreg Clayton SBFrame::FindVariable (const char *name) 76130fdc8d8SChris Lattner { 762316d498bSGreg Clayton SBValue value; 763*c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 764*c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 765*c481c7eeSJim Ingham 766b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 767d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 768d9e416c0SGreg Clayton if (frame && target) 769316d498bSGreg Clayton { 770d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 771316d498bSGreg Clayton value = FindVariable (name, use_dynamic); 772316d498bSGreg Clayton } 773316d498bSGreg Clayton return value; 77478a685aaSJim Ingham } 77578a685aaSJim Ingham 77678a685aaSJim Ingham SBValue 7772837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic) 77878a685aaSJim Ingham { 7795160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 78069b582faSGreg Clayton VariableSP var_sp; 78158b59f95SJim Ingham SBValue sb_value; 7827730b9a4SJim Ingham 783dbb0abbfSEugene Zelenko if (name == nullptr || name[0] == '\0') 7847730b9a4SJim Ingham { 7857730b9a4SJim Ingham if (log) 7867730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable called with empty name"); 7877730b9a4SJim Ingham return sb_value; 7887730b9a4SJim Ingham } 7897730b9a4SJim Ingham 79081e871edSGreg Clayton ValueObjectSP value_sp; 791bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 792bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7934fc6cb9cSJim Ingham 794dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 795d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7967730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 7977730b9a4SJim Ingham if (target && process) 79830fdc8d8SChris Lattner { 7997fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8007730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 8017730b9a4SJim Ingham { 8027730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 8037730b9a4SJim Ingham if (frame) 8047fdf9ef1SGreg Clayton { 80569b582faSGreg Clayton VariableList variable_list; 806d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 80730fdc8d8SChris Lattner 80872eff18aSGreg Clayton if (sc.block) 80930fdc8d8SChris Lattner { 81072eff18aSGreg Clayton const bool can_create = true; 81172eff18aSGreg Clayton const bool get_parent_variables = true; 81272eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 81372eff18aSGreg Clayton 81472eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 81572eff18aSGreg Clayton get_parent_variables, 81672eff18aSGreg Clayton stop_if_block_is_inlined_function, 81772ac8a84STamas Berghammer [frame](Variable* v) { return v->IsInScope(frame); }, 81872eff18aSGreg Clayton &variable_list)) 81972eff18aSGreg Clayton { 82069b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 82130fdc8d8SChris Lattner } 82272eff18aSGreg Clayton } 82330fdc8d8SChris Lattner 8244838131bSGreg Clayton if (var_sp) 82581e871edSGreg Clayton { 826e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues); 827e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 82881e871edSGreg Clayton } 8297fdf9ef1SGreg Clayton } 830c9858e4dSGreg Clayton else 831c9858e4dSGreg Clayton { 832c9858e4dSGreg Clayton if (log) 8337730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame."); 8347730b9a4SJim Ingham } 8357730b9a4SJim Ingham } 8367730b9a4SJim Ingham else 8377730b9a4SJim Ingham { 8387730b9a4SJim Ingham if (log) 8397730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable () => error: process is running"); 840c9858e4dSGreg Clayton } 841316d498bSGreg Clayton } 842316d498bSGreg Clayton 8434838131bSGreg Clayton if (log) 84469b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 845324a1036SSaleem Abdulrasool static_cast<void*>(frame), name, 846324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 8474838131bSGreg Clayton 848dde9cff3SCaroline Tice return sb_value; 849dde9cff3SCaroline Tice } 850dde9cff3SCaroline Tice 85130fdc8d8SChris Lattner SBValue 85269b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 85330fdc8d8SChris Lattner { 854316d498bSGreg Clayton SBValue value; 855*c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 856*c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 857*c481c7eeSJim Ingham 858b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 859d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 860d9e416c0SGreg Clayton if (frame && target) 861316d498bSGreg Clayton { 862d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 863316d498bSGreg Clayton value = FindValue (name, value_type, use_dynamic); 864316d498bSGreg Clayton } 865316d498bSGreg Clayton return value; 86678a685aaSJim Ingham } 86778a685aaSJim Ingham 86878a685aaSJim Ingham SBValue 8692837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) 87078a685aaSJim Ingham { 8715160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 87269b582faSGreg Clayton SBValue sb_value; 8737730b9a4SJim Ingham 874dbb0abbfSEugene Zelenko if (name == nullptr || name[0] == '\0') 8757730b9a4SJim Ingham { 8767730b9a4SJim Ingham if (log) 8777730b9a4SJim Ingham log->Printf ("SBFrame::FindValue called with empty name."); 8787730b9a4SJim Ingham return sb_value; 8797730b9a4SJim Ingham } 8807730b9a4SJim Ingham 88181e871edSGreg Clayton ValueObjectSP value_sp; 882bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 883bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 8844fc6cb9cSJim Ingham 885dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 886d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 8877730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 8887730b9a4SJim Ingham if (target && process) 88930fdc8d8SChris Lattner { 8907fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8917730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 8927730b9a4SJim Ingham { 8937730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 8947730b9a4SJim Ingham if (frame) 8957fdf9ef1SGreg Clayton { 8968a2a0dfbSEnrico Granata VariableList variable_list; 8978a2a0dfbSEnrico Granata 89869b582faSGreg Clayton switch (value_type) 89930fdc8d8SChris Lattner { 90069b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 90169b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 90269b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 90369b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 90469b582faSGreg Clayton { 905d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 90672eff18aSGreg Clayton 90772eff18aSGreg Clayton const bool can_create = true; 90872eff18aSGreg Clayton const bool get_parent_variables = true; 90972eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 91072eff18aSGreg Clayton 9110efb51a0SChaoren Lin if (sc.block) 9120efb51a0SChaoren Lin sc.block->AppendVariables(can_create, 91372eff18aSGreg Clayton get_parent_variables, 91472eff18aSGreg Clayton stop_if_block_is_inlined_function, 91572ac8a84STamas Berghammer [frame](Variable* v) { return v->IsInScope(frame); }, 9160efb51a0SChaoren Lin &variable_list); 9178a2a0dfbSEnrico Granata if (value_type == eValueTypeVariableGlobal) 9188a2a0dfbSEnrico Granata { 9198a2a0dfbSEnrico Granata const bool get_file_globals = true; 9208a2a0dfbSEnrico Granata VariableList *frame_vars = frame->GetVariableList(get_file_globals); 9218a2a0dfbSEnrico Granata if (frame_vars) 9228a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 9238a2a0dfbSEnrico Granata } 92469b582faSGreg Clayton ConstString const_name(name); 92508a04327SEnrico Granata VariableSP variable_sp(variable_list.FindVariable(const_name, value_type)); 92608a04327SEnrico Granata if (variable_sp) 927beae523aSJohnny Chen { 928e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable(variable_sp, eNoDynamicValues); 929e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 93030fdc8d8SChris Lattner } 93130fdc8d8SChris Lattner } 93269b582faSGreg Clayton break; 93369b582faSGreg Clayton 93469b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 93569b582faSGreg Clayton { 936d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 93769b582faSGreg Clayton if (reg_ctx) 93869b582faSGreg Clayton { 93969b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 94069b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 94169b582faSGreg Clayton { 94269b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 94369b582faSGreg Clayton if (reg_info && 94469b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 94569b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 94669b582faSGreg Clayton { 947d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 94881e871edSGreg Clayton sb_value.SetSP (value_sp); 94981e871edSGreg Clayton break; 95069b582faSGreg Clayton } 95169b582faSGreg Clayton } 95269b582faSGreg Clayton } 95369b582faSGreg Clayton } 95469b582faSGreg Clayton break; 95569b582faSGreg Clayton 95669b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 95769b582faSGreg Clayton { 958d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 95969b582faSGreg Clayton if (reg_ctx) 96069b582faSGreg Clayton { 96169b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 96269b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 96369b582faSGreg Clayton { 96469b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 96569b582faSGreg Clayton if (reg_set && 96669b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 96769b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 96869b582faSGreg Clayton { 969d9e416c0SGreg Clayton value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx); 97081e871edSGreg Clayton sb_value.SetSP (value_sp); 97181e871edSGreg Clayton break; 97269b582faSGreg Clayton } 97369b582faSGreg Clayton } 97469b582faSGreg Clayton } 97569b582faSGreg Clayton } 97669b582faSGreg Clayton break; 97769b582faSGreg Clayton 97869b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 97969b582faSGreg Clayton { 98069b582faSGreg Clayton ConstString const_name(name); 9818f1f9a1bSSean Callanan ExpressionVariableSP expr_var_sp (target->GetPersistentVariable (const_name)); 98269b582faSGreg Clayton if (expr_var_sp) 98381e871edSGreg Clayton { 98481e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 985e3e91517SEnrico Granata sb_value.SetSP (value_sp, use_dynamic); 98681e871edSGreg Clayton } 98769b582faSGreg Clayton } 98869b582faSGreg Clayton break; 98969b582faSGreg Clayton 99069b582faSGreg Clayton default: 99169b582faSGreg Clayton break; 99269b582faSGreg Clayton } 993beae523aSJohnny Chen } 994c9858e4dSGreg Clayton else 995c9858e4dSGreg Clayton { 996c9858e4dSGreg Clayton if (log) 9977730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame."); 9987730b9a4SJim Ingham } 9997730b9a4SJim Ingham } 10007730b9a4SJim Ingham else 10017730b9a4SJim Ingham { 10027730b9a4SJim Ingham if (log) 10037730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: process is running"); 1004c9858e4dSGreg Clayton } 10057fdf9ef1SGreg Clayton } 1006dde9cff3SCaroline Tice 10074838131bSGreg Clayton if (log) 100869b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 1009324a1036SSaleem Abdulrasool static_cast<void*>(frame), name, value_type, 1010324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 10114838131bSGreg Clayton 1012dde9cff3SCaroline Tice return sb_value; 1013dde9cff3SCaroline Tice } 1014dde9cff3SCaroline Tice 101530fdc8d8SChris Lattner bool 101635e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const 101735e2ab60SJohnny Chen { 1018b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 1019b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 102035e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 102135e2ab60SJohnny Chen } 102235e2ab60SJohnny Chen 102335e2ab60SJohnny Chen bool 102430fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 102530fdc8d8SChris Lattner { 102635e2ab60SJohnny Chen return IsEqual(rhs); 102730fdc8d8SChris Lattner } 102830fdc8d8SChris Lattner 102930fdc8d8SChris Lattner bool 103030fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 103130fdc8d8SChris Lattner { 103235e2ab60SJohnny Chen return !IsEqual(rhs); 1033481cef25SGreg Clayton } 103430fdc8d8SChris Lattner 103530fdc8d8SChris Lattner SBThread 103630fdc8d8SChris Lattner SBFrame::GetThread () const 103730fdc8d8SChris Lattner { 10385160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1039ceb6b139SCaroline Tice 1040*c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1041*c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1042*c481c7eeSJim Ingham 1043d9e416c0SGreg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 1044d9e416c0SGreg Clayton SBThread sb_thread (thread_sp); 1045ceb6b139SCaroline Tice 1046ceb6b139SCaroline Tice if (log) 1047750cd175SCaroline Tice { 1048750cd175SCaroline Tice SBStream sstr; 1049750cd175SCaroline Tice sb_thread.GetDescription (sstr); 1050d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", 1051324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetFramePtr()), 1052324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get()), sstr.GetData()); 1053750cd175SCaroline Tice } 1054ceb6b139SCaroline Tice 105530fdc8d8SChris Lattner return sb_thread; 105630fdc8d8SChris Lattner } 105730fdc8d8SChris Lattner 105830fdc8d8SChris Lattner const char * 105930fdc8d8SChris Lattner SBFrame::Disassemble () const 106030fdc8d8SChris Lattner { 10615160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1062dbb0abbfSEugene Zelenko const char *disassembly = nullptr; 1063bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1064bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 10654fc6cb9cSJim Ingham 1066dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1067d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 10687730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10697730b9a4SJim Ingham if (target && process) 1070af67cecdSGreg Clayton { 10717fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10727730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 10737730b9a4SJim Ingham { 10747730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 10757730b9a4SJim Ingham if (frame) 10767fdf9ef1SGreg Clayton { 1077d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 1078af67cecdSGreg Clayton } 1079c9858e4dSGreg Clayton else 1080c9858e4dSGreg Clayton { 1081c9858e4dSGreg Clayton if (log) 10827730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame."); 10837730b9a4SJim Ingham } 10847730b9a4SJim Ingham } 10857730b9a4SJim Ingham else 10867730b9a4SJim Ingham { 10877730b9a4SJim Ingham if (log) 10887730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: process is running"); 10897fdf9ef1SGreg Clayton } 1090c9858e4dSGreg Clayton } 10914838131bSGreg Clayton 10924838131bSGreg Clayton if (log) 1093324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::Disassemble () => %s", 1094324a1036SSaleem Abdulrasool static_cast<void*>(frame), disassembly); 10954838131bSGreg Clayton 10964838131bSGreg Clayton return disassembly; 109730fdc8d8SChris Lattner } 109830fdc8d8SChris Lattner 109930fdc8d8SChris Lattner SBValueList 110030fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 110130fdc8d8SChris Lattner bool locals, 110230fdc8d8SChris Lattner bool statics, 110330fdc8d8SChris Lattner bool in_scope_only) 110430fdc8d8SChris Lattner { 1105316d498bSGreg Clayton SBValueList value_list; 1106*c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1107*c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1108*c481c7eeSJim Ingham 1109b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1110d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1111d9e416c0SGreg Clayton if (frame && target) 1112316d498bSGreg Clayton { 1113d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 111451f96eebSZachary Turner const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false; 111551f96eebSZachary Turner 111651f96eebSZachary Turner SBVariablesOptions options; 111751f96eebSZachary Turner options.SetIncludeArguments(arguments); 111851f96eebSZachary Turner options.SetIncludeLocals(locals); 111951f96eebSZachary Turner options.SetIncludeStatics(statics); 112051f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 112151f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 112251f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 112351f96eebSZachary Turner 112451f96eebSZachary Turner value_list = GetVariables (options); 1125316d498bSGreg Clayton } 1126316d498bSGreg Clayton return value_list; 112778a685aaSJim Ingham } 112878a685aaSJim Ingham 1129560558ebSEnrico Granata lldb::SBValueList 1130560558ebSEnrico Granata SBFrame::GetVariables (bool arguments, 1131560558ebSEnrico Granata bool locals, 1132560558ebSEnrico Granata bool statics, 1133560558ebSEnrico Granata bool in_scope_only, 1134560558ebSEnrico Granata lldb::DynamicValueType use_dynamic) 1135560558ebSEnrico Granata { 1136*c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1137*c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1138*c481c7eeSJim Ingham 1139560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 114051f96eebSZachary Turner const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false; 114151f96eebSZachary Turner SBVariablesOptions options; 114251f96eebSZachary Turner options.SetIncludeArguments(arguments); 114351f96eebSZachary Turner options.SetIncludeLocals(locals); 114451f96eebSZachary Turner options.SetIncludeStatics(statics); 114551f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 114651f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 114751f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 114851f96eebSZachary Turner return GetVariables(options); 1149560558ebSEnrico Granata } 1150560558ebSEnrico Granata 115178a685aaSJim Ingham SBValueList 115251f96eebSZachary Turner SBFrame::GetVariables (const lldb::SBVariablesOptions& options) 115378a685aaSJim Ingham { 11545160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1155ceb6b139SCaroline Tice 1156b9556accSGreg Clayton SBValueList value_list; 1157bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1158bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11594fc6cb9cSJim Ingham 1160dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1161d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1162b9556accSGreg Clayton 116351f96eebSZachary Turner const bool statics = options.GetIncludeStatics(); 116451f96eebSZachary Turner const bool arguments = options.GetIncludeArguments(); 116551f96eebSZachary Turner const bool locals = options.GetIncludeLocals(); 116651f96eebSZachary Turner const bool in_scope_only = options.GetInScopeOnly(); 116751f96eebSZachary Turner const bool include_runtime_support_values = options.GetIncludeRuntimeSupportValues(); 116851f96eebSZachary Turner const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 116951f96eebSZachary Turner 1170ceb6b139SCaroline Tice if (log) 117151f96eebSZachary Turner log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)", 117251f96eebSZachary Turner arguments, locals, 117351f96eebSZachary Turner statics, in_scope_only, 117451f96eebSZachary Turner include_runtime_support_values, use_dynamic); 1175ceb6b139SCaroline Tice 1176349213f9SGreg Clayton std::set<VariableSP> variable_set; 11777730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 11787730b9a4SJim Ingham if (target && process) 117930fdc8d8SChris Lattner { 11807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11817730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 11827fdf9ef1SGreg Clayton { 11837730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 11847730b9a4SJim Ingham if (frame) 11857730b9a4SJim Ingham { 118630fdc8d8SChris Lattner size_t i; 1187dbb0abbfSEugene Zelenko VariableList *variable_list = nullptr; 1188d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 118930fdc8d8SChris Lattner if (variable_list) 119030fdc8d8SChris Lattner { 119130fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 119230fdc8d8SChris Lattner if (num_variables) 119330fdc8d8SChris Lattner { 119430fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 119530fdc8d8SChris Lattner { 119630fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 119730fdc8d8SChris Lattner if (variable_sp) 119830fdc8d8SChris Lattner { 119930fdc8d8SChris Lattner bool add_variable = false; 120030fdc8d8SChris Lattner switch (variable_sp->GetScope()) 120130fdc8d8SChris Lattner { 120230fdc8d8SChris Lattner case eValueTypeVariableGlobal: 120330fdc8d8SChris Lattner case eValueTypeVariableStatic: 120430fdc8d8SChris Lattner add_variable = statics; 120530fdc8d8SChris Lattner break; 120630fdc8d8SChris Lattner 120730fdc8d8SChris Lattner case eValueTypeVariableArgument: 120830fdc8d8SChris Lattner add_variable = arguments; 120930fdc8d8SChris Lattner break; 121030fdc8d8SChris Lattner 121130fdc8d8SChris Lattner case eValueTypeVariableLocal: 121230fdc8d8SChris Lattner add_variable = locals; 121330fdc8d8SChris Lattner break; 1214c982c768SGreg Clayton 1215c982c768SGreg Clayton default: 1216c982c768SGreg Clayton break; 121730fdc8d8SChris Lattner } 121830fdc8d8SChris Lattner if (add_variable) 121930fdc8d8SChris Lattner { 1220349213f9SGreg Clayton // Only add variables once so we don't end up with duplicates 1221349213f9SGreg Clayton if (variable_set.find(variable_sp) == variable_set.end()) 1222349213f9SGreg Clayton variable_set.insert(variable_sp); 1223349213f9SGreg Clayton else 1224349213f9SGreg Clayton continue; 1225349213f9SGreg Clayton 1226d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 122730fdc8d8SChris Lattner continue; 122830fdc8d8SChris Lattner 1229e3e91517SEnrico Granata ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues)); 1230560558ebSEnrico Granata 1231dbb0abbfSEugene Zelenko if (!include_runtime_support_values && 1232dbb0abbfSEugene Zelenko valobj_sp != nullptr && 1233dbb0abbfSEugene Zelenko valobj_sp->IsRuntimeSupportValue()) 1234560558ebSEnrico Granata continue; 1235560558ebSEnrico Granata 1236e3e91517SEnrico Granata SBValue value_sb; 1237e3e91517SEnrico Granata value_sb.SetSP(valobj_sp,use_dynamic); 1238e3e91517SEnrico Granata value_list.Append(value_sb); 123930fdc8d8SChris Lattner } 124030fdc8d8SChris Lattner } 124130fdc8d8SChris Lattner } 124230fdc8d8SChris Lattner } 124330fdc8d8SChris Lattner } 124430fdc8d8SChris Lattner } 1245c9858e4dSGreg Clayton else 1246c9858e4dSGreg Clayton { 1247c9858e4dSGreg Clayton if (log) 12487730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame."); 12497730b9a4SJim Ingham } 12507730b9a4SJim Ingham } 12517730b9a4SJim Ingham else 12527730b9a4SJim Ingham { 12537730b9a4SJim Ingham if (log) 12547730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: process is running"); 1255c9858e4dSGreg Clayton } 12567fdf9ef1SGreg Clayton } 1257ceb6b139SCaroline Tice 1258ceb6b139SCaroline Tice if (log) 1259324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", 1260324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1261324a1036SSaleem Abdulrasool static_cast<void*>(value_list.opaque_ptr())); 1262ceb6b139SCaroline Tice 126330fdc8d8SChris Lattner return value_list; 126430fdc8d8SChris Lattner } 126530fdc8d8SChris Lattner 126669b582faSGreg Clayton SBValueList 126730fdc8d8SChris Lattner SBFrame::GetRegisters () 126830fdc8d8SChris Lattner { 12695160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1270ceb6b139SCaroline Tice 127130fdc8d8SChris Lattner SBValueList value_list; 1272bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1273bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 12744fc6cb9cSJim Ingham 1275dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1276d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 12777730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 12787730b9a4SJim Ingham if (target && process) 127930fdc8d8SChris Lattner { 12807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12817730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 12827730b9a4SJim Ingham { 12837730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 12847730b9a4SJim Ingham if (frame) 12857fdf9ef1SGreg Clayton { 1286d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 128730fdc8d8SChris Lattner if (reg_ctx) 128830fdc8d8SChris Lattner { 128930fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 129030fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 129130fdc8d8SChris Lattner { 1292d9e416c0SGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); 129330fdc8d8SChris Lattner } 129430fdc8d8SChris Lattner } 129530fdc8d8SChris Lattner } 1296c9858e4dSGreg Clayton else 1297c9858e4dSGreg Clayton { 1298c9858e4dSGreg Clayton if (log) 12997730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame."); 13007730b9a4SJim Ingham } 13017730b9a4SJim Ingham } 13027730b9a4SJim Ingham else 13037730b9a4SJim Ingham { 13047730b9a4SJim Ingham if (log) 13057730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: process is running"); 1306c9858e4dSGreg Clayton } 13077fdf9ef1SGreg Clayton } 1308ceb6b139SCaroline Tice 1309ceb6b139SCaroline Tice if (log) 1310324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", 1311324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1312324a1036SSaleem Abdulrasool static_cast<void*>(value_list.opaque_ptr())); 1313ceb6b139SCaroline Tice 131430fdc8d8SChris Lattner return value_list; 131530fdc8d8SChris Lattner } 131630fdc8d8SChris Lattner 1317ad9a53c5SJason Molenda SBValue 1318ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name) 1319ad9a53c5SJason Molenda { 1320ad9a53c5SJason Molenda Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1321ad9a53c5SJason Molenda 1322ad9a53c5SJason Molenda SBValue result; 1323ad9a53c5SJason Molenda ValueObjectSP value_sp; 1324bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1325bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1326ad9a53c5SJason Molenda 1327dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1328ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 1329ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1330ad9a53c5SJason Molenda if (target && process) 1331ad9a53c5SJason Molenda { 1332ad9a53c5SJason Molenda Process::StopLocker stop_locker; 1333ad9a53c5SJason Molenda if (stop_locker.TryLock(&process->GetRunLock())) 1334ad9a53c5SJason Molenda { 1335ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 1336ad9a53c5SJason Molenda if (frame) 1337ad9a53c5SJason Molenda { 1338ad9a53c5SJason Molenda RegisterContextSP reg_ctx (frame->GetRegisterContext()); 1339ad9a53c5SJason Molenda if (reg_ctx) 1340ad9a53c5SJason Molenda { 1341ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 1342ad9a53c5SJason Molenda for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 1343ad9a53c5SJason Molenda { 1344ad9a53c5SJason Molenda const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 1345ad9a53c5SJason Molenda if (reg_info && 1346ad9a53c5SJason Molenda ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 1347ad9a53c5SJason Molenda (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 1348ad9a53c5SJason Molenda { 1349ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 1350ad9a53c5SJason Molenda result.SetSP (value_sp); 1351ad9a53c5SJason Molenda break; 1352ad9a53c5SJason Molenda } 1353ad9a53c5SJason Molenda } 1354ad9a53c5SJason Molenda } 1355ad9a53c5SJason Molenda } 1356ad9a53c5SJason Molenda else 1357ad9a53c5SJason Molenda { 1358ad9a53c5SJason Molenda if (log) 13595d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame."); 1360ad9a53c5SJason Molenda } 1361ad9a53c5SJason Molenda } 1362ad9a53c5SJason Molenda else 1363ad9a53c5SJason Molenda { 1364ad9a53c5SJason Molenda if (log) 13655d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: process is running"); 1366ad9a53c5SJason Molenda } 1367ad9a53c5SJason Molenda } 1368ad9a53c5SJason Molenda 1369ad9a53c5SJason Molenda if (log) 1370324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)", 1371324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1372324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 1373ad9a53c5SJason Molenda 1374ad9a53c5SJason Molenda return result; 1375ad9a53c5SJason Molenda } 1376ad9a53c5SJason Molenda 1377dde9cff3SCaroline Tice bool 1378dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 1379dde9cff3SCaroline Tice { 13805160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1381da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1382da7bc7d0SGreg Clayton 1383bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1384bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 13854fc6cb9cSJim Ingham 1386b57e4a1bSJason Molenda StackFrame *frame; 1387d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 13887730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 13897730b9a4SJim Ingham if (target && process) 1390dde9cff3SCaroline Tice { 13917fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13927730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 13937730b9a4SJim Ingham { 13947730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 13957730b9a4SJim Ingham if (frame) 13967fdf9ef1SGreg Clayton { 1397d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 1398dde9cff3SCaroline Tice } 1399c9858e4dSGreg Clayton else 1400c9858e4dSGreg Clayton { 1401c9858e4dSGreg Clayton if (log) 14027730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame."); 14037730b9a4SJim Ingham } 14047730b9a4SJim Ingham } 14057730b9a4SJim Ingham else 14067730b9a4SJim Ingham { 14077730b9a4SJim Ingham if (log) 14087730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: process is running"); 1409c9858e4dSGreg Clayton } 1410c9858e4dSGreg Clayton 14117fdf9ef1SGreg Clayton } 1412dde9cff3SCaroline Tice else 1413da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1414dde9cff3SCaroline Tice 1415dde9cff3SCaroline Tice return true; 1416dde9cff3SCaroline Tice } 14171d3afba3SGreg Clayton 141869b582faSGreg Clayton SBValue 14191d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 14201d3afba3SGreg Clayton { 1421316d498bSGreg Clayton SBValue result; 1422*c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1423*c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1424*c481c7eeSJim Ingham 1425b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1426d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1427d9e416c0SGreg Clayton if (frame && target) 1428316d498bSGreg Clayton { 142935e1bda6SJim Ingham SBExpressionOptions options; 143035e1bda6SJim Ingham lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue(); 1431cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 143235e1bda6SJim Ingham options.SetUnwindOnError (true); 143324785bd0SEugene Leviant options.SetIgnoreBreakpoints (true); 1434998c8a1cSRyan Brown if (target->GetLanguage() != eLanguageTypeUnknown) 1435998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1436998c8a1cSRyan Brown else 1437998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 143835e1bda6SJim Ingham return EvaluateExpression (expr, options); 1439316d498bSGreg Clayton } 1440316d498bSGreg Clayton return result; 144178a685aaSJim Ingham } 144278a685aaSJim Ingham 144378a685aaSJim Ingham SBValue 14442837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 144578a685aaSJim Ingham { 144635e1bda6SJim Ingham SBExpressionOptions options; 1447cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 144835e1bda6SJim Ingham options.SetUnwindOnError (true); 144924785bd0SEugene Leviant options.SetIgnoreBreakpoints (true); 1450*c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1451*c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1452*c481c7eeSJim Ingham 1453998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1454998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1455998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1456998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1457998c8a1cSRyan Brown else if (frame) 1458998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 145935e1bda6SJim Ingham return EvaluateExpression (expr, options); 14607ba6e991SJim Ingham } 14617ba6e991SJim Ingham 14627ba6e991SJim Ingham SBValue 14637ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error) 14647ba6e991SJim Ingham { 146535e1bda6SJim Ingham SBExpressionOptions options; 1466*c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1467*c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1468*c481c7eeSJim Ingham 1469cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 147035e1bda6SJim Ingham options.SetUnwindOnError (unwind_on_error); 147124785bd0SEugene Leviant options.SetIgnoreBreakpoints (true); 1472998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1473998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1474998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1475998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1476998c8a1cSRyan Brown else if (frame) 1477998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 147835e1bda6SJim Ingham return EvaluateExpression (expr, options); 147935e1bda6SJim Ingham } 148035e1bda6SJim Ingham 148135e1bda6SJim Ingham lldb::SBValue 148235e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options) 148335e1bda6SJim Ingham { 14845160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14854838131bSGreg Clayton 1486358efd65SSaleem Abdulrasool #ifndef LLDB_DISABLE_PYTHON 14875160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1488358efd65SSaleem Abdulrasool #endif 1489a162ebafSSean Callanan 14908646d3c1SJim Ingham ExpressionResults exe_results = eExpressionSetupError; 149169b582faSGreg Clayton SBValue expr_result; 14927730b9a4SJim Ingham 1493dbb0abbfSEugene Zelenko if (expr == nullptr || expr[0] == '\0') 14947730b9a4SJim Ingham { 14957730b9a4SJim Ingham if (log) 14967730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression called with an empty expression"); 14977730b9a4SJim Ingham return expr_result; 14987730b9a4SJim Ingham } 14997730b9a4SJim Ingham 150081e871edSGreg Clayton ValueObjectSP expr_value_sp; 15014838131bSGreg Clayton 1502bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1503bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 15044fc6cb9cSJim Ingham 1505b9556accSGreg Clayton if (log) 15067730b9a4SJim Ingham log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr); 1507b9556accSGreg Clayton 1508dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 15097730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 15107730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 15117730b9a4SJim Ingham 15127730b9a4SJim Ingham if (target && process) 15131d3afba3SGreg Clayton { 15147fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 15157730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 15167730b9a4SJim Ingham { 15177730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 15187730b9a4SJim Ingham if (frame) 15197fdf9ef1SGreg Clayton { 1520fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1521fb6621efSGreg Clayton { 15221ba7c4d0SGreg Clayton StreamString frame_description; 1523d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 15241ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 1525cced1566SGreg Clayton expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str()); 1526fb6621efSGreg Clayton } 1527fb6621efSGreg Clayton 1528d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 1529d9e416c0SGreg Clayton frame, 1530d4439aa9SEnrico Granata expr_value_sp, 153135e1bda6SJim Ingham options.ref()); 1532e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1533fb6621efSGreg Clayton 1534fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1535dbb0abbfSEugene Zelenko Host::SetCrashDescription(nullptr); 15361d3afba3SGreg Clayton } 1537c9858e4dSGreg Clayton else 1538c9858e4dSGreg Clayton { 1539c9858e4dSGreg Clayton if (log) 15407730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame."); 15417730b9a4SJim Ingham } 15427730b9a4SJim Ingham } 15437730b9a4SJim Ingham else 15447730b9a4SJim Ingham { 15457730b9a4SJim Ingham if (log) 15467730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: process is running"); 1547c9858e4dSGreg Clayton } 15487fdf9ef1SGreg Clayton } 15494838131bSGreg Clayton 1550cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1551a162ebafSSean Callanan if (expr_log) 155278a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 1553324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 1554a162ebafSSean Callanan 15554838131bSGreg Clayton if (log) 1556d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 1557324a1036SSaleem Abdulrasool static_cast<void*>(frame), expr, 1558324a1036SSaleem Abdulrasool static_cast<void*>(expr_value_sp.get()), exe_results); 1559cf7e2dc0SJason Molenda #endif 15604838131bSGreg Clayton 1561cfd1acedSGreg Clayton return expr_result; 15621d3afba3SGreg Clayton } 1563316d498bSGreg Clayton 1564316d498bSGreg Clayton bool 15656345fe3eSOleksiy Vyalov SBFrame::IsInlined() 1566316d498bSGreg Clayton { 156705f75e9fSOleksiy Vyalov return static_cast<const SBFrame*>(this)->IsInlined(); 156805f75e9fSOleksiy Vyalov } 156905f75e9fSOleksiy Vyalov 157005f75e9fSOleksiy Vyalov bool 157105f75e9fSOleksiy Vyalov SBFrame::IsInlined() const 157205f75e9fSOleksiy Vyalov { 15735160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1574*c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1575*c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1576*c481c7eeSJim Ingham 1577dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1578d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 15797730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 15807730b9a4SJim Ingham if (target && process) 1581316d498bSGreg Clayton { 15827fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 15837730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 15847730b9a4SJim Ingham { 15857730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 15867730b9a4SJim Ingham if (frame) 15877fdf9ef1SGreg Clayton { 15887fdf9ef1SGreg Clayton 1589d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1590316d498bSGreg Clayton if (block) 1591dbb0abbfSEugene Zelenko return block->GetContainingInlinedBlock() != nullptr; 1592316d498bSGreg Clayton } 1593c9858e4dSGreg Clayton else 1594c9858e4dSGreg Clayton { 1595c9858e4dSGreg Clayton if (log) 15967730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame."); 15977730b9a4SJim Ingham } 15987730b9a4SJim Ingham } 15997730b9a4SJim Ingham else 16007730b9a4SJim Ingham { 16017730b9a4SJim Ingham if (log) 16027730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: process is running"); 1603c9858e4dSGreg Clayton } 1604c9858e4dSGreg Clayton 16057fdf9ef1SGreg Clayton } 1606316d498bSGreg Clayton return false; 1607316d498bSGreg Clayton } 1608316d498bSGreg Clayton 1609316d498bSGreg Clayton const char * 16106345fe3eSOleksiy Vyalov SBFrame::GetFunctionName() 1611316d498bSGreg Clayton { 161205f75e9fSOleksiy Vyalov return static_cast<const SBFrame*>(this)->GetFunctionName(); 161305f75e9fSOleksiy Vyalov } 161405f75e9fSOleksiy Vyalov 161505f75e9fSOleksiy Vyalov const char * 161605f75e9fSOleksiy Vyalov SBFrame::GetFunctionName() const 161705f75e9fSOleksiy Vyalov { 16185160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1619dbb0abbfSEugene Zelenko const char *name = nullptr; 1620*c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1621*c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1622*c481c7eeSJim Ingham 1623dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1624d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 16257730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 16267730b9a4SJim Ingham if (target && process) 1627316d498bSGreg Clayton { 16287fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 16297730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 16307730b9a4SJim Ingham { 16317730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 16327730b9a4SJim Ingham if (frame) 16337fdf9ef1SGreg Clayton { 1634d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1635316d498bSGreg Clayton if (sc.block) 1636316d498bSGreg Clayton { 1637316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1638316d498bSGreg Clayton if (inlined_block) 1639316d498bSGreg Clayton { 1640316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1641ddaf6a72SGreg Clayton name = inlined_info->GetName(sc.function->GetLanguage()).AsCString(); 1642316d498bSGreg Clayton } 1643316d498bSGreg Clayton } 1644316d498bSGreg Clayton 1645dbb0abbfSEugene Zelenko if (name == nullptr) 1646316d498bSGreg Clayton { 1647316d498bSGreg Clayton if (sc.function) 1648316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1649316d498bSGreg Clayton } 1650316d498bSGreg Clayton 1651dbb0abbfSEugene Zelenko if (name == nullptr) 1652316d498bSGreg Clayton { 1653316d498bSGreg Clayton if (sc.symbol) 1654316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1655316d498bSGreg Clayton } 1656316d498bSGreg Clayton } 1657c9858e4dSGreg Clayton else 1658c9858e4dSGreg Clayton { 1659c9858e4dSGreg Clayton if (log) 16607730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame."); 16617730b9a4SJim Ingham } 16627730b9a4SJim Ingham } 16637730b9a4SJim Ingham else 16647730b9a4SJim Ingham { 16657730b9a4SJim Ingham if (log) 16667730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName() => error: process is running"); 1667c9858e4dSGreg Clayton 1668c9858e4dSGreg Clayton } 16697fdf9ef1SGreg Clayton } 1670316d498bSGreg Clayton return name; 1671316d498bSGreg Clayton } 1672c1f705c2SEnrico Granata 1673c1f705c2SEnrico Granata const char * 1674c1f705c2SEnrico Granata SBFrame::GetDisplayFunctionName() 1675c1f705c2SEnrico Granata { 1676c1f705c2SEnrico Granata Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1677dbb0abbfSEugene Zelenko const char *name = nullptr; 1678*c481c7eeSJim Ingham 1679*c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1680*c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1681*c481c7eeSJim Ingham 1682dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1683c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1684c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 1685c1f705c2SEnrico Granata if (target && process) 1686c1f705c2SEnrico Granata { 1687c1f705c2SEnrico Granata Process::StopLocker stop_locker; 1688c1f705c2SEnrico Granata if (stop_locker.TryLock(&process->GetRunLock())) 1689c1f705c2SEnrico Granata { 1690c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr(); 1691c1f705c2SEnrico Granata if (frame) 1692c1f705c2SEnrico Granata { 1693c1f705c2SEnrico Granata SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1694c1f705c2SEnrico Granata if (sc.block) 1695c1f705c2SEnrico Granata { 1696c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1697c1f705c2SEnrico Granata if (inlined_block) 1698c1f705c2SEnrico Granata { 1699c1f705c2SEnrico Granata const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1700ddaf6a72SGreg Clayton name = inlined_info->GetDisplayName(sc.function->GetLanguage()).AsCString(); 1701c1f705c2SEnrico Granata } 1702c1f705c2SEnrico Granata } 1703c1f705c2SEnrico Granata 1704dbb0abbfSEugene Zelenko if (name == nullptr) 1705c1f705c2SEnrico Granata { 1706c1f705c2SEnrico Granata if (sc.function) 1707c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString(); 1708c1f705c2SEnrico Granata } 1709c1f705c2SEnrico Granata 1710dbb0abbfSEugene Zelenko if (name == nullptr) 1711c1f705c2SEnrico Granata { 1712c1f705c2SEnrico Granata if (sc.symbol) 1713c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString(); 1714c1f705c2SEnrico Granata } 1715c1f705c2SEnrico Granata } 1716c1f705c2SEnrico Granata else 1717c1f705c2SEnrico Granata { 1718c1f705c2SEnrico Granata if (log) 1719c1f705c2SEnrico Granata log->Printf ("SBFrame::GetDisplayFunctionName () => error: could not reconstruct frame object for this SBFrame."); 1720c1f705c2SEnrico Granata } 1721c1f705c2SEnrico Granata } 1722c1f705c2SEnrico Granata else 1723c1f705c2SEnrico Granata { 1724c1f705c2SEnrico Granata if (log) 1725c1f705c2SEnrico Granata log->Printf ("SBFrame::GetDisplayFunctionName() => error: process is running"); 1726c1f705c2SEnrico Granata 1727c1f705c2SEnrico Granata } 1728c1f705c2SEnrico Granata } 1729c1f705c2SEnrico Granata return name; 1730c1f705c2SEnrico Granata } 1731