130fdc8d8SChris Lattner //===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 930fdc8d8SChris Lattner #include <algorithm> 10349213f9SGreg Clayton #include <set> 11dbb0abbfSEugene Zelenko #include <string> 12dbb0abbfSEugene Zelenko 13dbb0abbfSEugene Zelenko #include "lldb/API/SBFrame.h" 1430fdc8d8SChris Lattner 1530fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1630fdc8d8SChris Lattner 17b9c1b51eSKate Stone #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h" 1830fdc8d8SChris Lattner #include "lldb/Core/Address.h" 1930fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2030fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h" 2130fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h" 22151c032cSJim Ingham #include "lldb/Expression/UserExpression.h" 231ba7c4d0SGreg Clayton #include "lldb/Host/Host.h" 2430fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 251f746071SGreg Clayton #include "lldb/Symbol/Function.h" 261f746071SGreg Clayton #include "lldb/Symbol/Symbol.h" 2730fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 2830fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h" 29b9c1b51eSKate Stone #include "lldb/Symbol/VariableList.h" 3030fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h" 3130fdc8d8SChris Lattner #include "lldb/Target/Process.h" 3230fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 33b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h" 3441ae8e74SKuba Mracek #include "lldb/Target/StackFrameRecognizer.h" 35b9556accSGreg Clayton #include "lldb/Target/StackID.h" 36b9c1b51eSKate Stone #include "lldb/Target/Target.h" 3730fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 38bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h" 396f9e6901SZachary Turner #include "lldb/Utility/Log.h" 40bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 4130fdc8d8SChris Lattner 424c5de699SEli Friedman #include "lldb/API/SBAddress.h" 43b9c1b51eSKate Stone #include "lldb/API/SBDebugger.h" 4435e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h" 45dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 464c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h" 474c5de699SEli Friedman #include "lldb/API/SBThread.h" 48b9c1b51eSKate Stone #include "lldb/API/SBValue.h" 4951f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h" 5030fdc8d8SChris Lattner 51237c3ed9SSean Callanan #include "llvm/Support/PrettyStackTrace.h" 52237c3ed9SSean Callanan 5330fdc8d8SChris Lattner using namespace lldb; 5430fdc8d8SChris Lattner using namespace lldb_private; 5530fdc8d8SChris Lattner 56b9c1b51eSKate Stone SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) {} 5730fdc8d8SChris Lattner 58b9c1b51eSKate Stone SBFrame::SBFrame(const StackFrameSP &lldb_object_sp) 59b9c1b51eSKate Stone : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) { 605160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 61ceb6b139SCaroline Tice 62b9c1b51eSKate Stone if (log) { 63ceb6b139SCaroline Tice SBStream sstr; 64ceb6b139SCaroline Tice GetDescription(sstr); 654838131bSGreg Clayton log->Printf("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s", 66324a1036SSaleem Abdulrasool static_cast<void *>(lldb_object_sp.get()), 67324a1036SSaleem Abdulrasool static_cast<void *>(lldb_object_sp.get()), sstr.GetData()); 68ceb6b139SCaroline Tice } 6930fdc8d8SChris Lattner } 7030fdc8d8SChris Lattner 71b9c1b51eSKate Stone SBFrame::SBFrame(const SBFrame &rhs) 72b9c1b51eSKate Stone : m_opaque_sp(new ExecutionContextRef(*rhs.m_opaque_sp)) {} 73efabb123SGreg Clayton 74dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default; 75dbb0abbfSEugene Zelenko 76b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) { 77efabb123SGreg Clayton if (this != &rhs) 787fdf9ef1SGreg Clayton *m_opaque_sp = *rhs.m_opaque_sp; 79efabb123SGreg Clayton return *this; 80efabb123SGreg Clayton } 81efabb123SGreg Clayton 82b9c1b51eSKate Stone StackFrameSP SBFrame::GetFrameSP() const { 83dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP()); 84b9556accSGreg Clayton } 8530fdc8d8SChris Lattner 86b9c1b51eSKate Stone void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) { 877fdf9ef1SGreg Clayton return m_opaque_sp->SetFrameSP(lldb_object_sp); 88b9556accSGreg Clayton } 8930fdc8d8SChris Lattner 90b9c1b51eSKate Stone bool SBFrame::IsValid() const { 91bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 92bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 937fa7dc36SJim Ingham 947fa7dc36SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 957fa7dc36SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 96b9c1b51eSKate Stone if (target && process) { 977fa7dc36SJim Ingham Process::StopLocker stop_locker; 987fa7dc36SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 99dbb0abbfSEugene Zelenko return GetFrameSP().get() != nullptr; 10030fdc8d8SChris Lattner } 10130fdc8d8SChris Lattner 1027fa7dc36SJim Ingham // Without a target & process we can't have a valid stack frame. 1037fa7dc36SJim Ingham return false; 1047fa7dc36SJim Ingham } 1057fa7dc36SJim Ingham 106b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const { 1075160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 10830fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 109bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 110bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 111991e4453SZachary Turner SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope); 112dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 113d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1147730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 115b9c1b51eSKate Stone if (target && process) { 1167fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 117b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1187730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 119b9c1b51eSKate Stone if (frame) { 120991e4453SZachary Turner sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext(scope)); 121b9c1b51eSKate Stone } else { 122c9858e4dSGreg Clayton if (log) 123b9c1b51eSKate Stone log->Printf("SBFrame::GetVariables () => error: could not " 124b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 1257730b9a4SJim Ingham } 126b9c1b51eSKate Stone } else { 1277730b9a4SJim Ingham if (log) 128b9c1b51eSKate Stone log->Printf( 129b9c1b51eSKate Stone "SBFrame::GetSymbolContext () => error: process is running"); 130c9858e4dSGreg Clayton } 1317fdf9ef1SGreg Clayton } 132ceb6b139SCaroline Tice 133ceb6b139SCaroline Tice if (log) 134b9c1b51eSKate Stone log->Printf("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => " 135b9c1b51eSKate Stone "SBSymbolContext(%p)", 136324a1036SSaleem Abdulrasool static_cast<void *>(frame), resolve_scope, 137324a1036SSaleem Abdulrasool static_cast<void *>(sb_sym_ctx.get())); 138ceb6b139SCaroline Tice 13930fdc8d8SChris Lattner return sb_sym_ctx; 14030fdc8d8SChris Lattner } 14130fdc8d8SChris Lattner 142b9c1b51eSKate Stone SBModule SBFrame::GetModule() const { 1435160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 14472eff18aSGreg Clayton SBModule sb_module; 145acdbe816SGreg Clayton ModuleSP module_sp; 146bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 147bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1484fc6cb9cSJim Ingham 149dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 150d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1517730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 152b9c1b51eSKate Stone if (target && process) { 1537fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 154b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1557730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 156b9c1b51eSKate Stone if (frame) { 157d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp; 158acdbe816SGreg Clayton sb_module.SetSP(module_sp); 159b9c1b51eSKate Stone } else { 160c9858e4dSGreg Clayton if (log) 161b9c1b51eSKate Stone log->Printf("SBFrame::GetModule () => error: could not reconstruct " 162b9c1b51eSKate Stone "frame object for this SBFrame."); 1637730b9a4SJim Ingham } 164b9c1b51eSKate Stone } else { 1657730b9a4SJim Ingham if (log) 1667730b9a4SJim Ingham log->Printf("SBFrame::GetModule () => error: process is running"); 167c9858e4dSGreg Clayton } 1687fdf9ef1SGreg Clayton } 16972eff18aSGreg Clayton 1704838131bSGreg Clayton if (log) 1714838131bSGreg Clayton log->Printf("SBFrame(%p)::GetModule () => SBModule(%p)", 172324a1036SSaleem Abdulrasool static_cast<void *>(frame), 173324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get())); 1744838131bSGreg Clayton 17530fdc8d8SChris Lattner return sb_module; 17630fdc8d8SChris Lattner } 17730fdc8d8SChris Lattner 178b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const { 1795160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 18072eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 181bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 182bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1834fc6cb9cSJim Ingham 184dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 185d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1867730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 187b9c1b51eSKate Stone if (target && process) { 1887fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 189b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1907730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 191b9c1b51eSKate Stone if (frame) { 192b9c1b51eSKate Stone sb_comp_unit.reset( 193b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit); 194b9c1b51eSKate Stone } else { 195ceb6b139SCaroline Tice if (log) 196b9c1b51eSKate Stone log->Printf("SBFrame::GetCompileUnit () => error: could not " 197b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 1987730b9a4SJim Ingham } 199b9c1b51eSKate Stone } else { 2007730b9a4SJim Ingham if (log) 2017730b9a4SJim Ingham log->Printf("SBFrame::GetCompileUnit () => error: process is running"); 202c9858e4dSGreg Clayton } 203c9858e4dSGreg Clayton } 204c9858e4dSGreg Clayton if (log) 205c9858e4dSGreg Clayton log->Printf("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)", 206324a1036SSaleem Abdulrasool static_cast<void *>(frame), 207324a1036SSaleem Abdulrasool static_cast<void *>(sb_comp_unit.get())); 208ceb6b139SCaroline Tice 20930fdc8d8SChris Lattner return sb_comp_unit; 21030fdc8d8SChris Lattner } 21130fdc8d8SChris Lattner 212b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const { 2135160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 21472eff18aSGreg Clayton SBFunction sb_function; 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(); 221b9c1b51eSKate Stone if (target && process) { 2227fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 223b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2247730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 225b9c1b51eSKate Stone if (frame) { 226b9c1b51eSKate Stone sb_function.reset( 227b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextFunction).function); 228b9c1b51eSKate Stone } else { 229c9858e4dSGreg Clayton if (log) 230b9c1b51eSKate Stone log->Printf("SBFrame::GetFunction () => error: could not reconstruct " 231b9c1b51eSKate Stone "frame object for this SBFrame."); 2327730b9a4SJim Ingham } 233b9c1b51eSKate Stone } else { 2347730b9a4SJim Ingham if (log) 2357730b9a4SJim Ingham log->Printf("SBFrame::GetFunction () => error: process is running"); 2367fdf9ef1SGreg Clayton } 237c9858e4dSGreg Clayton } 2384838131bSGreg Clayton if (log) 2394838131bSGreg Clayton log->Printf("SBFrame(%p)::GetFunction () => SBFunction(%p)", 240324a1036SSaleem Abdulrasool static_cast<void *>(frame), 241324a1036SSaleem Abdulrasool static_cast<void *>(sb_function.get())); 2424838131bSGreg Clayton 24330fdc8d8SChris Lattner return sb_function; 24430fdc8d8SChris Lattner } 24530fdc8d8SChris Lattner 246b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const { 2475160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 24872eff18aSGreg Clayton SBSymbol sb_symbol; 249bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 250bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2514fc6cb9cSJim Ingham 252dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 253d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2547730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 255b9c1b51eSKate Stone if (target && process) { 2567fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 257b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2587730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 259b9c1b51eSKate Stone if (frame) { 260d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol); 261b9c1b51eSKate Stone } else { 262c9858e4dSGreg Clayton if (log) 263b9c1b51eSKate Stone log->Printf("SBFrame::GetSymbol () => error: could not reconstruct " 264b9c1b51eSKate Stone "frame object for this SBFrame."); 2657730b9a4SJim Ingham } 266b9c1b51eSKate Stone } else { 2677730b9a4SJim Ingham if (log) 2687730b9a4SJim Ingham log->Printf("SBFrame::GetSymbol () => error: process is running"); 2697fdf9ef1SGreg Clayton } 270c9858e4dSGreg Clayton } 2714838131bSGreg Clayton if (log) 2724838131bSGreg Clayton log->Printf("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 273324a1036SSaleem Abdulrasool static_cast<void *>(frame), 274324a1036SSaleem Abdulrasool static_cast<void *>(sb_symbol.get())); 2753b06557eSGreg Clayton return sb_symbol; 2763b06557eSGreg Clayton } 2773b06557eSGreg Clayton 278b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const { 2795160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 28072eff18aSGreg Clayton SBBlock sb_block; 281bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 282bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2834fc6cb9cSJim Ingham 284dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 285d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2867730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 287b9c1b51eSKate Stone if (target && process) { 2887fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 289b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2907730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 291b9c1b51eSKate Stone if (frame) { 292d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block); 293b9c1b51eSKate Stone } else { 294c9858e4dSGreg Clayton if (log) 295b9c1b51eSKate Stone log->Printf("SBFrame::GetBlock () => error: could not reconstruct " 296b9c1b51eSKate Stone "frame object for this SBFrame."); 2977730b9a4SJim Ingham } 298b9c1b51eSKate Stone } else { 2997730b9a4SJim Ingham if (log) 300324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetBlock () => error: process is running", 301324a1036SSaleem Abdulrasool static_cast<void *>(frame)); 3027fdf9ef1SGreg Clayton } 303c9858e4dSGreg Clayton } 3044838131bSGreg Clayton if (log) 3054838131bSGreg Clayton log->Printf("SBFrame(%p)::GetBlock () => SBBlock(%p)", 306324a1036SSaleem Abdulrasool static_cast<void *>(frame), 307324a1036SSaleem Abdulrasool static_cast<void *>(sb_block.GetPtr())); 30830fdc8d8SChris Lattner return sb_block; 30930fdc8d8SChris Lattner } 31030fdc8d8SChris Lattner 311b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const { 31272eff18aSGreg Clayton SBBlock sb_block; 313bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 314bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3154fc6cb9cSJim Ingham 316dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 317d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3185160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3197730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 320b9c1b51eSKate Stone if (target && process) { 3217fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 322b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3237730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 324b9c1b51eSKate Stone if (frame) { 325d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock()); 326b9c1b51eSKate Stone } else { 327c9858e4dSGreg Clayton if (log) 328b9c1b51eSKate Stone log->Printf("SBFrame::GetFrameBlock () => error: could not " 329b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 3307730b9a4SJim Ingham } 331b9c1b51eSKate Stone } else { 3327730b9a4SJim Ingham if (log) 3337730b9a4SJim Ingham log->Printf("SBFrame::GetFrameBlock () => error: process is running"); 3347fdf9ef1SGreg Clayton } 335c9858e4dSGreg Clayton } 3364838131bSGreg Clayton if (log) 3374838131bSGreg Clayton log->Printf("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 338324a1036SSaleem Abdulrasool static_cast<void *>(frame), 339324a1036SSaleem Abdulrasool static_cast<void *>(sb_block.GetPtr())); 34095897c6aSGreg Clayton return sb_block; 34195897c6aSGreg Clayton } 34295897c6aSGreg Clayton 343b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const { 3445160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 34572eff18aSGreg Clayton SBLineEntry sb_line_entry; 346bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 347bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3484fc6cb9cSJim Ingham 349dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 350d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3517730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 352b9c1b51eSKate Stone if (target && process) { 3537fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 354b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3557730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 356b9c1b51eSKate Stone if (frame) { 357b9c1b51eSKate Stone sb_line_entry.SetLineEntry( 358b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextLineEntry).line_entry); 359b9c1b51eSKate Stone } else { 360c9858e4dSGreg Clayton if (log) 361b9c1b51eSKate Stone log->Printf("SBFrame::GetLineEntry () => error: could not " 362b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 3637730b9a4SJim Ingham } 364b9c1b51eSKate Stone } else { 3657730b9a4SJim Ingham if (log) 3667730b9a4SJim Ingham log->Printf("SBFrame::GetLineEntry () => error: process is running"); 3677fdf9ef1SGreg Clayton } 368c9858e4dSGreg Clayton } 3694838131bSGreg Clayton if (log) 3704838131bSGreg Clayton log->Printf("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 371324a1036SSaleem Abdulrasool static_cast<void *>(frame), 372324a1036SSaleem Abdulrasool static_cast<void *>(sb_line_entry.get())); 37330fdc8d8SChris Lattner return sb_line_entry; 37430fdc8d8SChris Lattner } 37530fdc8d8SChris Lattner 376b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const { 377b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 378b9556accSGreg Clayton 379c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 380c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 381c481c7eeSJim Ingham 382b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 3837fdf9ef1SGreg Clayton if (frame) 384d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex(); 3854838131bSGreg Clayton 3865160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3874838131bSGreg Clayton if (log) 388b9c1b51eSKate Stone log->Printf("SBFrame(%p)::GetFrameID () => %u", static_cast<void *>(frame), 389b9c1b51eSKate Stone frame_idx); 3904838131bSGreg Clayton return frame_idx; 39130fdc8d8SChris Lattner } 39230fdc8d8SChris Lattner 393b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const { 394c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 395c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 396c481c7eeSJim Ingham 397424a5dbcSGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 398424a5dbcSGreg Clayton if (frame) 399424a5dbcSGreg Clayton return frame->GetStackID().GetCallFrameAddress(); 400424a5dbcSGreg Clayton return LLDB_INVALID_ADDRESS; 401424a5dbcSGreg Clayton } 402424a5dbcSGreg Clayton 403b9c1b51eSKate Stone addr_t SBFrame::GetPC() const { 4045160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 40569b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 406bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 407bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4084fc6cb9cSJim Ingham 409dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 410d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4117730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 412b9c1b51eSKate Stone if (target && process) { 4137fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 414b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4157730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 416b9c1b51eSKate Stone if (frame) { 417b9c1b51eSKate Stone addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress( 41804803b3eSTatyana Krasnukha target, AddressClass::eCode); 419b9c1b51eSKate Stone } else { 420c9858e4dSGreg Clayton if (log) 421b9c1b51eSKate Stone log->Printf("SBFrame::GetPC () => error: could not reconstruct frame " 422b9c1b51eSKate Stone "object for this SBFrame."); 4237730b9a4SJim Ingham } 424b9c1b51eSKate Stone } else { 4257730b9a4SJim Ingham if (log) 4267730b9a4SJim Ingham log->Printf("SBFrame::GetPC () => error: process is running"); 427c9858e4dSGreg Clayton } 4287fdf9ef1SGreg Clayton } 429ceb6b139SCaroline Tice 430ceb6b139SCaroline Tice if (log) 431324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetPC () => 0x%" PRIx64, 432324a1036SSaleem Abdulrasool static_cast<void *>(frame), addr); 433ceb6b139SCaroline Tice 434ceb6b139SCaroline Tice return addr; 43530fdc8d8SChris Lattner } 43630fdc8d8SChris Lattner 437b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) { 4385160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 439ceb6b139SCaroline Tice bool ret_val = false; 440bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 441bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4424fc6cb9cSJim Ingham 443dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 444d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4457730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 446b9c1b51eSKate Stone if (target && process) { 4477fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 448b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4497730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 450b9c1b51eSKate Stone if (frame) { 451d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC(new_pc); 452b9c1b51eSKate Stone } else { 453c9858e4dSGreg Clayton if (log) 454b9c1b51eSKate Stone log->Printf("SBFrame::SetPC () => error: could not reconstruct frame " 455b9c1b51eSKate Stone "object for this SBFrame."); 4567730b9a4SJim Ingham } 457b9c1b51eSKate Stone } else { 4587730b9a4SJim Ingham if (log) 4597730b9a4SJim Ingham log->Printf("SBFrame::SetPC () => error: process is running"); 460c9858e4dSGreg Clayton } 4617fdf9ef1SGreg Clayton } 462ceb6b139SCaroline Tice 463ceb6b139SCaroline Tice if (log) 464d01b2953SDaniel Malea log->Printf("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i", 465324a1036SSaleem Abdulrasool static_cast<void *>(frame), new_pc, ret_val); 466ceb6b139SCaroline Tice 467ceb6b139SCaroline Tice return ret_val; 46830fdc8d8SChris Lattner } 46930fdc8d8SChris Lattner 470b9c1b51eSKate Stone addr_t SBFrame::GetSP() const { 4715160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4724838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 473bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 474bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4754fc6cb9cSJim Ingham 476dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 477d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4787730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 479b9c1b51eSKate Stone if (target && process) { 4807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 481b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4827730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 483b9c1b51eSKate Stone if (frame) { 484d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 485b9c1b51eSKate Stone } else { 486c9858e4dSGreg Clayton if (log) 487b9c1b51eSKate Stone log->Printf("SBFrame::GetSP () => error: could not reconstruct frame " 488b9c1b51eSKate Stone "object for this SBFrame."); 4897730b9a4SJim Ingham } 490b9c1b51eSKate Stone } else { 4917730b9a4SJim Ingham if (log) 4927730b9a4SJim Ingham log->Printf("SBFrame::GetSP () => error: process is running"); 4937fdf9ef1SGreg Clayton } 494c9858e4dSGreg Clayton } 4954838131bSGreg Clayton if (log) 496324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetSP () => 0x%" PRIx64, 497324a1036SSaleem Abdulrasool static_cast<void *>(frame), addr); 4984838131bSGreg Clayton 4994838131bSGreg Clayton return addr; 50030fdc8d8SChris Lattner } 50130fdc8d8SChris Lattner 502b9c1b51eSKate Stone addr_t SBFrame::GetFP() const { 5035160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 50469b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 505bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 506bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5074fc6cb9cSJim Ingham 508dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 509d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5107730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 511b9c1b51eSKate Stone if (target && process) { 5127fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 513b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5147730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 515b9c1b51eSKate Stone if (frame) { 516d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 517b9c1b51eSKate Stone } else { 518c9858e4dSGreg Clayton if (log) 519b9c1b51eSKate Stone log->Printf("SBFrame::GetFP () => error: could not reconstruct frame " 520b9c1b51eSKate Stone "object for this SBFrame."); 5217730b9a4SJim Ingham } 522b9c1b51eSKate Stone } else { 5237730b9a4SJim Ingham if (log) 5247730b9a4SJim Ingham log->Printf("SBFrame::GetFP () => error: process is running"); 525c9858e4dSGreg Clayton } 5267fdf9ef1SGreg Clayton } 527ceb6b139SCaroline Tice 528ceb6b139SCaroline Tice if (log) 529324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetFP () => 0x%" PRIx64, 530324a1036SSaleem Abdulrasool static_cast<void *>(frame), addr); 531ceb6b139SCaroline Tice return addr; 53230fdc8d8SChris Lattner } 53330fdc8d8SChris Lattner 534b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const { 5355160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 53630fdc8d8SChris Lattner SBAddress sb_addr; 537bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 538bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5394fc6cb9cSJim Ingham 540b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 541d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5427730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 543b9c1b51eSKate Stone if (target && process) { 5447fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 545b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5467730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 547b9c1b51eSKate Stone if (frame) { 548d9e416c0SGreg Clayton sb_addr.SetAddress(&frame->GetFrameCodeAddress()); 549b9c1b51eSKate Stone } else { 550c9858e4dSGreg Clayton if (log) 551b9c1b51eSKate Stone log->Printf("SBFrame::GetPCAddress () => error: could not " 552b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 5537730b9a4SJim Ingham } 554b9c1b51eSKate Stone } else { 5557730b9a4SJim Ingham if (log) 5567730b9a4SJim Ingham log->Printf("SBFrame::GetPCAddress () => error: process is running"); 5577fdf9ef1SGreg Clayton } 558c9858e4dSGreg Clayton } 5594838131bSGreg Clayton if (log) 560324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", 561b9c1b51eSKate Stone static_cast<void *>(frame), static_cast<void *>(sb_addr.get())); 56230fdc8d8SChris Lattner return sb_addr; 56330fdc8d8SChris Lattner } 56430fdc8d8SChris Lattner 565b9c1b51eSKate Stone void SBFrame::Clear() { m_opaque_sp->Clear(); } 56630fdc8d8SChris Lattner 567b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) { 5687edbdfc9SGreg Clayton SBValue sb_value; 569c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 570c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 571c481c7eeSJim Ingham 572b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 573d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 574b9c1b51eSKate Stone if (frame && target) { 575b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 576b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 5777edbdfc9SGreg Clayton sb_value = GetValueForVariablePath(var_path, use_dynamic); 5787edbdfc9SGreg Clayton } 5797edbdfc9SGreg Clayton return sb_value; 5807edbdfc9SGreg Clayton } 5817edbdfc9SGreg Clayton 582b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path, 583b9c1b51eSKate Stone DynamicValueType use_dynamic) { 5847edbdfc9SGreg Clayton SBValue sb_value; 5855160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 586b9c1b51eSKate Stone if (var_path == nullptr || var_path[0] == '\0') { 5877730b9a4SJim Ingham if (log) 588b9c1b51eSKate Stone log->Printf( 589b9c1b51eSKate Stone "SBFrame::GetValueForVariablePath called with empty variable path."); 5907730b9a4SJim Ingham return sb_value; 5917730b9a4SJim Ingham } 5927730b9a4SJim Ingham 593bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 594bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5954fc6cb9cSJim Ingham 596dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 597d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5987730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 599b9c1b51eSKate Stone if (target && process) { 6007fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 601b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 6027730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 603b9c1b51eSKate Stone if (frame) { 6047edbdfc9SGreg Clayton VariableSP var_sp; 60597206d57SZachary Turner Status error; 606b9c1b51eSKate Stone ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath( 607b9c1b51eSKate Stone var_path, eNoDynamicValues, 608b9c1b51eSKate Stone StackFrame::eExpressionPathOptionCheckPtrVsMember | 609b9c1b51eSKate Stone StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 610b9c1b51eSKate Stone var_sp, error)); 611e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 612b9c1b51eSKate Stone } else { 613c9858e4dSGreg Clayton if (log) 614b9c1b51eSKate Stone log->Printf("SBFrame::GetValueForVariablePath () => error: could not " 615b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 6167730b9a4SJim Ingham } 617b9c1b51eSKate Stone } else { 6187730b9a4SJim Ingham if (log) 619b9c1b51eSKate Stone log->Printf( 620b9c1b51eSKate Stone "SBFrame::GetValueForVariablePath () => error: process is running"); 621c9858e4dSGreg Clayton } 6227fdf9ef1SGreg Clayton } 6237edbdfc9SGreg Clayton return sb_value; 6247edbdfc9SGreg Clayton } 6257edbdfc9SGreg Clayton 626b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) { 627316d498bSGreg Clayton SBValue value; 628c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 629c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 630c481c7eeSJim Ingham 631b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 632d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 633b9c1b51eSKate Stone if (frame && target) { 634b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 635b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 636316d498bSGreg Clayton value = FindVariable(name, use_dynamic); 637316d498bSGreg Clayton } 638316d498bSGreg Clayton return value; 63978a685aaSJim Ingham } 64078a685aaSJim Ingham 641b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name, 642b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 6435160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 64469b582faSGreg Clayton VariableSP var_sp; 64558b59f95SJim Ingham SBValue sb_value; 6467730b9a4SJim Ingham 647b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 6487730b9a4SJim Ingham if (log) 6497730b9a4SJim Ingham log->Printf("SBFrame::FindVariable called with empty name"); 6507730b9a4SJim Ingham return sb_value; 6517730b9a4SJim Ingham } 6527730b9a4SJim Ingham 65381e871edSGreg Clayton ValueObjectSP value_sp; 654bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 655bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 6564fc6cb9cSJim Ingham 657dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 658d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6597730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 660b9c1b51eSKate Stone if (target && process) { 6617fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 662b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 6637730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 664b9c1b51eSKate Stone if (frame) { 665e23d0b63SShafik Yaghmour value_sp = frame->FindVariable(ConstString(name)); 66630fdc8d8SChris Lattner 667e23d0b63SShafik Yaghmour if (value_sp) 668e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 669b9c1b51eSKate Stone } else { 670c9858e4dSGreg Clayton if (log) 671b9c1b51eSKate Stone log->Printf("SBFrame::FindVariable () => error: could not " 672b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 6737730b9a4SJim Ingham } 674b9c1b51eSKate Stone } else { 6757730b9a4SJim Ingham if (log) 6767730b9a4SJim Ingham log->Printf("SBFrame::FindVariable () => error: process is running"); 677c9858e4dSGreg Clayton } 678316d498bSGreg Clayton } 679316d498bSGreg Clayton 6804838131bSGreg Clayton if (log) 68169b582faSGreg Clayton log->Printf("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 682324a1036SSaleem Abdulrasool static_cast<void *>(frame), name, 683324a1036SSaleem Abdulrasool static_cast<void *>(value_sp.get())); 6844838131bSGreg Clayton 685dde9cff3SCaroline Tice return sb_value; 686dde9cff3SCaroline Tice } 687dde9cff3SCaroline Tice 688b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) { 689316d498bSGreg Clayton SBValue value; 690c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 691c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 692c481c7eeSJim Ingham 693b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 694d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 695b9c1b51eSKate Stone if (frame && target) { 696b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 697b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 698316d498bSGreg Clayton value = FindValue(name, value_type, use_dynamic); 699316d498bSGreg Clayton } 700316d498bSGreg Clayton return value; 70178a685aaSJim Ingham } 70278a685aaSJim Ingham 703b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type, 704b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 7055160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 70669b582faSGreg Clayton SBValue sb_value; 7077730b9a4SJim Ingham 708b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 7097730b9a4SJim Ingham if (log) 7107730b9a4SJim Ingham log->Printf("SBFrame::FindValue called with empty name."); 7117730b9a4SJim Ingham return sb_value; 7127730b9a4SJim Ingham } 7137730b9a4SJim Ingham 71481e871edSGreg Clayton ValueObjectSP value_sp; 715bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 716bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7174fc6cb9cSJim Ingham 718dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 719d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7207730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 721b9c1b51eSKate Stone if (target && process) { 7227fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 723b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 7247730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 725b9c1b51eSKate Stone if (frame) { 7268a2a0dfbSEnrico Granata VariableList variable_list; 7278a2a0dfbSEnrico Granata 728b9c1b51eSKate Stone switch (value_type) { 72969b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 73069b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 73169b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 73269b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 73363a27afaSGreg Clayton case eValueTypeVariableThreadLocal: // thread local variables 73469b582faSGreg Clayton { 735d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 73672eff18aSGreg Clayton 73772eff18aSGreg Clayton const bool can_create = true; 73872eff18aSGreg Clayton const bool get_parent_variables = true; 73972eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 74072eff18aSGreg Clayton 7410efb51a0SChaoren Lin if (sc.block) 742b9c1b51eSKate Stone sc.block->AppendVariables( 743b9c1b51eSKate Stone can_create, get_parent_variables, 744b9c1b51eSKate Stone stop_if_block_is_inlined_function, 745b9c1b51eSKate Stone [frame](Variable *v) { return v->IsInScope(frame); }, 746b9c1b51eSKate Stone &variable_list); 747b9c1b51eSKate Stone if (value_type == eValueTypeVariableGlobal) { 7488a2a0dfbSEnrico Granata const bool get_file_globals = true; 7498a2a0dfbSEnrico Granata VariableList *frame_vars = frame->GetVariableList(get_file_globals); 7508a2a0dfbSEnrico Granata if (frame_vars) 7518a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 7528a2a0dfbSEnrico Granata } 75369b582faSGreg Clayton ConstString const_name(name); 754b9c1b51eSKate Stone VariableSP variable_sp( 755b9c1b51eSKate Stone variable_list.FindVariable(const_name, value_type)); 756b9c1b51eSKate Stone if (variable_sp) { 757b9c1b51eSKate Stone value_sp = frame->GetValueObjectForFrameVariable(variable_sp, 758b9c1b51eSKate Stone eNoDynamicValues); 759e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 76030fdc8d8SChris Lattner } 761b9c1b51eSKate Stone } break; 76269b582faSGreg Clayton 76369b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 76469b582faSGreg Clayton { 765d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 766b9c1b51eSKate Stone if (reg_ctx) { 76769b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 768b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 769b9c1b51eSKate Stone const RegisterInfo *reg_info = 770b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 77169b582faSGreg Clayton if (reg_info && 77269b582faSGreg Clayton ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 773b9c1b51eSKate Stone (reg_info->alt_name && 774b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 775d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 77681e871edSGreg Clayton sb_value.SetSP(value_sp); 77781e871edSGreg Clayton break; 77869b582faSGreg Clayton } 77969b582faSGreg Clayton } 78069b582faSGreg Clayton } 781b9c1b51eSKate Stone } break; 78269b582faSGreg Clayton 783b9c1b51eSKate Stone case eValueTypeRegisterSet: // A collection of stack frame register 784b9c1b51eSKate Stone // values 78569b582faSGreg Clayton { 786d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 787b9c1b51eSKate Stone if (reg_ctx) { 78869b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 789b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 79069b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx); 79169b582faSGreg Clayton if (reg_set && 79269b582faSGreg Clayton ((reg_set->name && strcasecmp(reg_set->name, name) == 0) || 793b9c1b51eSKate Stone (reg_set->short_name && 794b9c1b51eSKate Stone strcasecmp(reg_set->short_name, name) == 0))) { 795b9c1b51eSKate Stone value_sp = 796b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx); 79781e871edSGreg Clayton sb_value.SetSP(value_sp); 79881e871edSGreg Clayton break; 79969b582faSGreg Clayton } 80069b582faSGreg Clayton } 80169b582faSGreg Clayton } 802b9c1b51eSKate Stone } break; 80369b582faSGreg Clayton 80469b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 80569b582faSGreg Clayton { 80669b582faSGreg Clayton ConstString const_name(name); 807b9c1b51eSKate Stone ExpressionVariableSP expr_var_sp( 808b9c1b51eSKate Stone target->GetPersistentVariable(const_name)); 809b9c1b51eSKate Stone if (expr_var_sp) { 81081e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 811e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 81281e871edSGreg Clayton } 813b9c1b51eSKate Stone } break; 81469b582faSGreg Clayton 81569b582faSGreg Clayton default: 81669b582faSGreg Clayton break; 81769b582faSGreg Clayton } 818b9c1b51eSKate Stone } else { 819c9858e4dSGreg Clayton if (log) 820b9c1b51eSKate Stone log->Printf("SBFrame::FindValue () => error: could not reconstruct " 821b9c1b51eSKate Stone "frame object for this SBFrame."); 8227730b9a4SJim Ingham } 823b9c1b51eSKate Stone } else { 8247730b9a4SJim Ingham if (log) 8257730b9a4SJim Ingham log->Printf("SBFrame::FindValue () => error: process is running"); 826c9858e4dSGreg Clayton } 8277fdf9ef1SGreg Clayton } 828dde9cff3SCaroline Tice 8294838131bSGreg Clayton if (log) 830b9c1b51eSKate Stone log->Printf("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) " 831b9c1b51eSKate Stone "=> SBValue(%p)", 832324a1036SSaleem Abdulrasool static_cast<void *>(frame), name, value_type, 833324a1036SSaleem Abdulrasool static_cast<void *>(value_sp.get())); 8344838131bSGreg Clayton 835dde9cff3SCaroline Tice return sb_value; 836dde9cff3SCaroline Tice } 837dde9cff3SCaroline Tice 838b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const { 839b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 840b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 84135e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 84235e2ab60SJohnny Chen } 84335e2ab60SJohnny Chen 844b9c1b51eSKate Stone bool SBFrame::operator==(const SBFrame &rhs) const { return IsEqual(rhs); } 84530fdc8d8SChris Lattner 846b9c1b51eSKate Stone bool SBFrame::operator!=(const SBFrame &rhs) const { return !IsEqual(rhs); } 84730fdc8d8SChris Lattner 848b9c1b51eSKate Stone SBThread SBFrame::GetThread() const { 8495160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 850ceb6b139SCaroline Tice 851c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 852c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 853c481c7eeSJim Ingham 854d9e416c0SGreg Clayton ThreadSP thread_sp(exe_ctx.GetThreadSP()); 855d9e416c0SGreg Clayton SBThread sb_thread(thread_sp); 856ceb6b139SCaroline Tice 857b9c1b51eSKate Stone if (log) { 858750cd175SCaroline Tice SBStream sstr; 859750cd175SCaroline Tice sb_thread.GetDescription(sstr); 860d9e416c0SGreg Clayton log->Printf("SBFrame(%p)::GetThread () => SBThread(%p): %s", 861324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetFramePtr()), 862324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get()), sstr.GetData()); 863750cd175SCaroline Tice } 864ceb6b139SCaroline Tice 86530fdc8d8SChris Lattner return sb_thread; 86630fdc8d8SChris Lattner } 86730fdc8d8SChris Lattner 868b9c1b51eSKate Stone const char *SBFrame::Disassemble() const { 8695160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 870dbb0abbfSEugene Zelenko const char *disassembly = nullptr; 871bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 872bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 8734fc6cb9cSJim Ingham 874dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 875d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 8767730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 877b9c1b51eSKate Stone if (target && process) { 8787fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 879b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 8807730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 881b9c1b51eSKate Stone if (frame) { 882d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 883b9c1b51eSKate Stone } else { 884c9858e4dSGreg Clayton if (log) 885b9c1b51eSKate Stone log->Printf("SBFrame::Disassemble () => error: could not reconstruct " 886b9c1b51eSKate Stone "frame object for this SBFrame."); 8877730b9a4SJim Ingham } 888b9c1b51eSKate Stone } else { 8897730b9a4SJim Ingham if (log) 8907730b9a4SJim Ingham log->Printf("SBFrame::Disassemble () => error: process is running"); 8917fdf9ef1SGreg Clayton } 892c9858e4dSGreg Clayton } 8934838131bSGreg Clayton 8944838131bSGreg Clayton if (log) 895b9c1b51eSKate Stone log->Printf("SBFrame(%p)::Disassemble () => %s", static_cast<void *>(frame), 896b9c1b51eSKate Stone disassembly); 8974838131bSGreg Clayton 8984838131bSGreg Clayton return disassembly; 89930fdc8d8SChris Lattner } 90030fdc8d8SChris Lattner 901b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics, 902b9c1b51eSKate Stone bool in_scope_only) { 903316d498bSGreg Clayton SBValueList value_list; 904c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 905c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 906c481c7eeSJim Ingham 907b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 908d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 909b9c1b51eSKate Stone if (frame && target) { 910b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 911b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 912b9c1b51eSKate Stone const bool include_runtime_support_values = 913b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 91451f96eebSZachary Turner 91551f96eebSZachary Turner SBVariablesOptions options; 91651f96eebSZachary Turner options.SetIncludeArguments(arguments); 91751f96eebSZachary Turner options.SetIncludeLocals(locals); 91851f96eebSZachary Turner options.SetIncludeStatics(statics); 91951f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 92051f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 92151f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 92251f96eebSZachary Turner 92351f96eebSZachary Turner value_list = GetVariables(options); 924316d498bSGreg Clayton } 925316d498bSGreg Clayton return value_list; 92678a685aaSJim Ingham } 92778a685aaSJim Ingham 928b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals, 929b9c1b51eSKate Stone bool statics, bool in_scope_only, 930b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 931c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 932c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 933c481c7eeSJim Ingham 934560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 935b9c1b51eSKate Stone const bool include_runtime_support_values = 936b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 93751f96eebSZachary Turner SBVariablesOptions options; 93851f96eebSZachary Turner options.SetIncludeArguments(arguments); 93951f96eebSZachary Turner options.SetIncludeLocals(locals); 94051f96eebSZachary Turner options.SetIncludeStatics(statics); 94151f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 94251f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 94351f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 94451f96eebSZachary Turner return GetVariables(options); 945560558ebSEnrico Granata } 946560558ebSEnrico Granata 947b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) { 9485160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 949ceb6b139SCaroline Tice 950b9556accSGreg Clayton SBValueList value_list; 951bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 952bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9534fc6cb9cSJim Ingham 954dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 955d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 956b9556accSGreg Clayton 95751f96eebSZachary Turner const bool statics = options.GetIncludeStatics(); 95851f96eebSZachary Turner const bool arguments = options.GetIncludeArguments(); 9594c7f5d5cSKuba Mracek const bool recognized_arguments = 9604c7f5d5cSKuba Mracek options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP())); 96151f96eebSZachary Turner const bool locals = options.GetIncludeLocals(); 96251f96eebSZachary Turner const bool in_scope_only = options.GetInScopeOnly(); 963b9c1b51eSKate Stone const bool include_runtime_support_values = 964b9c1b51eSKate Stone options.GetIncludeRuntimeSupportValues(); 96551f96eebSZachary Turner const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 96651f96eebSZachary Turner 967ceb6b139SCaroline Tice if (log) 96841ae8e74SKuba Mracek log->Printf( 96941ae8e74SKuba Mracek "SBFrame::GetVariables (arguments=%i, recognized_arguments=%i, " 97041ae8e74SKuba Mracek "locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)", 97141ae8e74SKuba Mracek arguments, recognized_arguments, locals, statics, in_scope_only, 97251f96eebSZachary Turner include_runtime_support_values, use_dynamic); 973ceb6b139SCaroline Tice 974349213f9SGreg Clayton std::set<VariableSP> variable_set; 9757730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 976b9c1b51eSKate Stone if (target && process) { 9777fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 978b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9797730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 980b9c1b51eSKate Stone if (frame) { 98130fdc8d8SChris Lattner size_t i; 982dbb0abbfSEugene Zelenko VariableList *variable_list = nullptr; 983d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 984b9c1b51eSKate Stone if (variable_list) { 98530fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 986b9c1b51eSKate Stone if (num_variables) { 987b9c1b51eSKate Stone for (i = 0; i < num_variables; ++i) { 98830fdc8d8SChris Lattner VariableSP variable_sp(variable_list->GetVariableAtIndex(i)); 989b9c1b51eSKate Stone if (variable_sp) { 99030fdc8d8SChris Lattner bool add_variable = false; 991b9c1b51eSKate Stone switch (variable_sp->GetScope()) { 99230fdc8d8SChris Lattner case eValueTypeVariableGlobal: 99330fdc8d8SChris Lattner case eValueTypeVariableStatic: 99463a27afaSGreg Clayton case eValueTypeVariableThreadLocal: 99530fdc8d8SChris Lattner add_variable = statics; 99630fdc8d8SChris Lattner break; 99730fdc8d8SChris Lattner 99830fdc8d8SChris Lattner case eValueTypeVariableArgument: 99930fdc8d8SChris Lattner add_variable = arguments; 100030fdc8d8SChris Lattner break; 100130fdc8d8SChris Lattner 100230fdc8d8SChris Lattner case eValueTypeVariableLocal: 100330fdc8d8SChris Lattner add_variable = locals; 100430fdc8d8SChris Lattner break; 1005c982c768SGreg Clayton 1006c982c768SGreg Clayton default: 1007c982c768SGreg Clayton break; 100830fdc8d8SChris Lattner } 1009b9c1b51eSKate Stone if (add_variable) { 1010349213f9SGreg Clayton // Only add variables once so we don't end up with duplicates 1011349213f9SGreg Clayton if (variable_set.find(variable_sp) == variable_set.end()) 1012349213f9SGreg Clayton variable_set.insert(variable_sp); 1013349213f9SGreg Clayton else 1014349213f9SGreg Clayton continue; 1015349213f9SGreg Clayton 1016d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 101730fdc8d8SChris Lattner continue; 101830fdc8d8SChris Lattner 1019b9c1b51eSKate Stone ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable( 1020b9c1b51eSKate Stone variable_sp, eNoDynamicValues)); 1021560558ebSEnrico Granata 1022b9c1b51eSKate Stone if (!include_runtime_support_values && valobj_sp != nullptr && 1023dbb0abbfSEugene Zelenko valobj_sp->IsRuntimeSupportValue()) 1024560558ebSEnrico Granata continue; 1025560558ebSEnrico Granata 1026e3e91517SEnrico Granata SBValue value_sb; 1027e3e91517SEnrico Granata value_sb.SetSP(valobj_sp, use_dynamic); 1028e3e91517SEnrico Granata value_list.Append(value_sb); 102930fdc8d8SChris Lattner } 103030fdc8d8SChris Lattner } 103130fdc8d8SChris Lattner } 103230fdc8d8SChris Lattner } 103330fdc8d8SChris Lattner } 103441ae8e74SKuba Mracek if (recognized_arguments) { 103541ae8e74SKuba Mracek auto recognized_frame = frame->GetRecognizedFrame(); 103641ae8e74SKuba Mracek if (recognized_frame) { 103741ae8e74SKuba Mracek ValueObjectListSP recognized_arg_list = 103841ae8e74SKuba Mracek recognized_frame->GetRecognizedArguments(); 103941ae8e74SKuba Mracek if (recognized_arg_list) { 104041ae8e74SKuba Mracek for (auto &rec_value_sp : recognized_arg_list->GetObjects()) { 104141ae8e74SKuba Mracek SBValue value_sb; 104241ae8e74SKuba Mracek value_sb.SetSP(rec_value_sp, use_dynamic); 104341ae8e74SKuba Mracek value_list.Append(value_sb); 104441ae8e74SKuba Mracek } 104541ae8e74SKuba Mracek } 104641ae8e74SKuba Mracek } 104741ae8e74SKuba Mracek } 1048b9c1b51eSKate Stone } else { 1049c9858e4dSGreg Clayton if (log) 1050b9c1b51eSKate Stone log->Printf("SBFrame::GetVariables () => error: could not " 1051b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 10527730b9a4SJim Ingham } 1053b9c1b51eSKate Stone } else { 10547730b9a4SJim Ingham if (log) 10557730b9a4SJim Ingham log->Printf("SBFrame::GetVariables () => error: process is running"); 1056c9858e4dSGreg Clayton } 10577fdf9ef1SGreg Clayton } 1058ceb6b139SCaroline Tice 1059ceb6b139SCaroline Tice if (log) 1060324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", 1061324a1036SSaleem Abdulrasool static_cast<void *>(frame), 1062324a1036SSaleem Abdulrasool static_cast<void *>(value_list.opaque_ptr())); 1063ceb6b139SCaroline Tice 106430fdc8d8SChris Lattner return value_list; 106530fdc8d8SChris Lattner } 106630fdc8d8SChris Lattner 1067b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() { 10685160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1069ceb6b139SCaroline Tice 107030fdc8d8SChris Lattner SBValueList value_list; 1071bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1072bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 10734fc6cb9cSJim Ingham 1074dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1075d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 10767730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1077b9c1b51eSKate Stone if (target && process) { 10787fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1079b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 10807730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1081b9c1b51eSKate Stone if (frame) { 1082d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 1083b9c1b51eSKate Stone if (reg_ctx) { 108430fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 1085b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 1086b9c1b51eSKate Stone value_list.Append( 1087b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx)); 108830fdc8d8SChris Lattner } 108930fdc8d8SChris Lattner } 1090b9c1b51eSKate Stone } else { 1091c9858e4dSGreg Clayton if (log) 1092b9c1b51eSKate Stone log->Printf("SBFrame::GetRegisters () => error: could not " 1093b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 10947730b9a4SJim Ingham } 1095b9c1b51eSKate Stone } else { 10967730b9a4SJim Ingham if (log) 10977730b9a4SJim Ingham log->Printf("SBFrame::GetRegisters () => error: process is running"); 1098c9858e4dSGreg Clayton } 10997fdf9ef1SGreg Clayton } 1100ceb6b139SCaroline Tice 1101ceb6b139SCaroline Tice if (log) 1102324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetRegisters () => SBValueList(%p)", 1103324a1036SSaleem Abdulrasool static_cast<void *>(frame), 1104324a1036SSaleem Abdulrasool static_cast<void *>(value_list.opaque_ptr())); 1105ceb6b139SCaroline Tice 110630fdc8d8SChris Lattner return value_list; 110730fdc8d8SChris Lattner } 110830fdc8d8SChris Lattner 1109b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) { 1110ad9a53c5SJason Molenda Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1111ad9a53c5SJason Molenda 1112ad9a53c5SJason Molenda SBValue result; 1113ad9a53c5SJason Molenda ValueObjectSP value_sp; 1114bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1115bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1116ad9a53c5SJason Molenda 1117dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1118ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 1119ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1120b9c1b51eSKate Stone if (target && process) { 1121ad9a53c5SJason Molenda Process::StopLocker stop_locker; 1122b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1123ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 1124b9c1b51eSKate Stone if (frame) { 1125ad9a53c5SJason Molenda RegisterContextSP reg_ctx(frame->GetRegisterContext()); 1126b9c1b51eSKate Stone if (reg_ctx) { 1127ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 1128b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 1129b9c1b51eSKate Stone const RegisterInfo *reg_info = 1130b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 1131ad9a53c5SJason Molenda if (reg_info && 1132ad9a53c5SJason Molenda ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 1133b9c1b51eSKate Stone (reg_info->alt_name && 1134b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 1135ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 1136ad9a53c5SJason Molenda result.SetSP(value_sp); 1137ad9a53c5SJason Molenda break; 1138ad9a53c5SJason Molenda } 1139ad9a53c5SJason Molenda } 1140ad9a53c5SJason Molenda } 1141b9c1b51eSKate Stone } else { 1142ad9a53c5SJason Molenda if (log) 1143b9c1b51eSKate Stone log->Printf("SBFrame::FindRegister () => error: could not " 1144b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 1145ad9a53c5SJason Molenda } 1146b9c1b51eSKate Stone } else { 1147ad9a53c5SJason Molenda if (log) 11485d353842SJason Molenda log->Printf("SBFrame::FindRegister () => error: process is running"); 1149ad9a53c5SJason Molenda } 1150ad9a53c5SJason Molenda } 1151ad9a53c5SJason Molenda 1152ad9a53c5SJason Molenda if (log) 1153324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::FindRegister () => SBValue(%p)", 1154324a1036SSaleem Abdulrasool static_cast<void *>(frame), 1155324a1036SSaleem Abdulrasool static_cast<void *>(value_sp.get())); 1156ad9a53c5SJason Molenda 1157ad9a53c5SJason Molenda return result; 1158ad9a53c5SJason Molenda } 1159ad9a53c5SJason Molenda 1160b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) { 11615160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1162da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1163da7bc7d0SGreg Clayton 1164bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1165bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11664fc6cb9cSJim Ingham 1167b57e4a1bSJason Molenda StackFrame *frame; 1168d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 11697730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1170b9c1b51eSKate Stone if (target && process) { 11717fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1172b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11737730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1174b9c1b51eSKate Stone if (frame) { 1175d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&strm); 1176b9c1b51eSKate Stone } else { 1177c9858e4dSGreg Clayton if (log) 1178b9c1b51eSKate Stone log->Printf("SBFrame::GetDescription () => error: could not " 1179b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 11807730b9a4SJim Ingham } 1181b9c1b51eSKate Stone } else { 11827730b9a4SJim Ingham if (log) 11837730b9a4SJim Ingham log->Printf("SBFrame::GetDescription () => error: process is running"); 1184c9858e4dSGreg Clayton } 1185c9858e4dSGreg Clayton 1186b9c1b51eSKate Stone } else 1187da7bc7d0SGreg Clayton strm.PutCString("No value"); 1188dde9cff3SCaroline Tice 1189dde9cff3SCaroline Tice return true; 1190dde9cff3SCaroline Tice } 11911d3afba3SGreg Clayton 1192b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) { 1193316d498bSGreg Clayton SBValue result; 1194c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1195c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1196c481c7eeSJim Ingham 1197b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1198d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1199b9c1b51eSKate Stone if (frame && target) { 120035e1bda6SJim Ingham SBExpressionOptions options; 1201b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value = 1202b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 1203cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 120435e1bda6SJim Ingham options.SetUnwindOnError(true); 120524785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1206998c8a1cSRyan Brown if (target->GetLanguage() != eLanguageTypeUnknown) 1207998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1208998c8a1cSRyan Brown else 1209998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 121035e1bda6SJim Ingham return EvaluateExpression(expr, options); 1211316d498bSGreg Clayton } 1212316d498bSGreg Clayton return result; 121378a685aaSJim Ingham } 121478a685aaSJim Ingham 121578a685aaSJim Ingham SBValue 1216b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr, 1217b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value) { 121835e1bda6SJim Ingham SBExpressionOptions options; 1219cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 122035e1bda6SJim Ingham options.SetUnwindOnError(true); 122124785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1222c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1223c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1224c481c7eeSJim Ingham 1225998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1226998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1227998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1228998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1229998c8a1cSRyan Brown else if (frame) 1230998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 123135e1bda6SJim Ingham return EvaluateExpression(expr, options); 12327ba6e991SJim Ingham } 12337ba6e991SJim Ingham 1234b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr, 1235b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value, 1236b9c1b51eSKate Stone bool unwind_on_error) { 123735e1bda6SJim Ingham SBExpressionOptions options; 1238c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1239c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1240c481c7eeSJim Ingham 1241cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 124235e1bda6SJim Ingham options.SetUnwindOnError(unwind_on_error); 124324785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1244998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1245998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1246998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1247998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1248998c8a1cSRyan Brown else if (frame) 1249998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 125035e1bda6SJim Ingham return EvaluateExpression(expr, options); 125135e1bda6SJim Ingham } 125235e1bda6SJim Ingham 1253b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr, 1254b9c1b51eSKate Stone const SBExpressionOptions &options) { 12555160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 12564838131bSGreg Clayton 1257358efd65SSaleem Abdulrasool #ifndef LLDB_DISABLE_PYTHON 12585160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1259358efd65SSaleem Abdulrasool #endif 1260a162ebafSSean Callanan 12618646d3c1SJim Ingham ExpressionResults exe_results = eExpressionSetupError; 126269b582faSGreg Clayton SBValue expr_result; 12637730b9a4SJim Ingham 1264b9c1b51eSKate Stone if (expr == nullptr || expr[0] == '\0') { 12657730b9a4SJim Ingham if (log) 1266b9c1b51eSKate Stone log->Printf( 1267b9c1b51eSKate Stone "SBFrame::EvaluateExpression called with an empty expression"); 12687730b9a4SJim Ingham return expr_result; 12697730b9a4SJim Ingham } 12707730b9a4SJim Ingham 127181e871edSGreg Clayton ValueObjectSP expr_value_sp; 12724838131bSGreg Clayton 1273bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1274bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 12754fc6cb9cSJim Ingham 1276b9556accSGreg Clayton if (log) 12777730b9a4SJim Ingham log->Printf("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr); 1278b9556accSGreg Clayton 1279dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 12807730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 12817730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 12827730b9a4SJim Ingham 1283b9c1b51eSKate Stone if (target && process) { 12847fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1285b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 12867730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1287b9c1b51eSKate Stone if (frame) { 12888f7db52dSJim Ingham std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace; 1289b9c1b51eSKate Stone if (target->GetDisplayExpressionsInCrashlogs()) { 12901ba7c4d0SGreg Clayton StreamString frame_description; 1291d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&frame_description); 12928f7db52dSJim Ingham stack_trace = llvm::make_unique<llvm::PrettyStackTraceFormat>( 1293b9c1b51eSKate Stone "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value " 1294b9c1b51eSKate Stone "= %u) %s", 1295b9c1b51eSKate Stone expr, options.GetFetchDynamicValue(), 1296c156427dSZachary Turner frame_description.GetData()); 1297fb6621efSGreg Clayton } 1298fb6621efSGreg Clayton 1299b9c1b51eSKate Stone exe_results = target->EvaluateExpression(expr, frame, expr_value_sp, 130035e1bda6SJim Ingham options.ref()); 1301e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1302b9c1b51eSKate Stone } else { 1303c9858e4dSGreg Clayton if (log) 1304b9c1b51eSKate Stone log->Printf("SBFrame::EvaluateExpression () => error: could not " 1305b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 13067730b9a4SJim Ingham } 1307b9c1b51eSKate Stone } else { 13087730b9a4SJim Ingham if (log) 1309b9c1b51eSKate Stone log->Printf( 1310b9c1b51eSKate Stone "SBFrame::EvaluateExpression () => error: process is running"); 1311c9858e4dSGreg Clayton } 13127fdf9ef1SGreg Clayton } 13134838131bSGreg Clayton 1314cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1315a162ebafSSean Callanan if (expr_log) 1316b9c1b51eSKate Stone expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is " 1317b9c1b51eSKate Stone "%s, summary %s **", 1318324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 1319a162ebafSSean Callanan 13204838131bSGreg Clayton if (log) 1321b9c1b51eSKate Stone log->Printf("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) " 1322b9c1b51eSKate Stone "(execution result=%d)", 1323324a1036SSaleem Abdulrasool static_cast<void *>(frame), expr, 1324324a1036SSaleem Abdulrasool static_cast<void *>(expr_value_sp.get()), exe_results); 1325cf7e2dc0SJason Molenda #endif 13264838131bSGreg Clayton 1327cfd1acedSGreg Clayton return expr_result; 13281d3afba3SGreg Clayton } 1329316d498bSGreg Clayton 1330b9c1b51eSKate Stone bool SBFrame::IsInlined() { 133105f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->IsInlined(); 133205f75e9fSOleksiy Vyalov } 133305f75e9fSOleksiy Vyalov 1334b9c1b51eSKate Stone bool SBFrame::IsInlined() const { 13355160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1336c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1337c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1338c481c7eeSJim Ingham 1339dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1340d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 13417730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1342b9c1b51eSKate Stone if (target && process) { 13437fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1344b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 13457730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1346b9c1b51eSKate Stone if (frame) { 13477fdf9ef1SGreg Clayton 1348d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1349316d498bSGreg Clayton if (block) 1350dbb0abbfSEugene Zelenko return block->GetContainingInlinedBlock() != nullptr; 1351b9c1b51eSKate Stone } else { 1352c9858e4dSGreg Clayton if (log) 1353b9c1b51eSKate Stone log->Printf("SBFrame::IsInlined () => error: could not reconstruct " 1354b9c1b51eSKate Stone "frame object for this SBFrame."); 13557730b9a4SJim Ingham } 1356b9c1b51eSKate Stone } else { 13577730b9a4SJim Ingham if (log) 13587730b9a4SJim Ingham log->Printf("SBFrame::IsInlined () => error: process is running"); 1359c9858e4dSGreg Clayton } 13607fdf9ef1SGreg Clayton } 1361316d498bSGreg Clayton return false; 1362316d498bSGreg Clayton } 1363316d498bSGreg Clayton 13644b36f791SVedant Kumar bool SBFrame::IsArtificial() { 13654b36f791SVedant Kumar return static_cast<const SBFrame *>(this)->IsArtificial(); 13664b36f791SVedant Kumar } 13674b36f791SVedant Kumar 13684b36f791SVedant Kumar bool SBFrame::IsArtificial() const { 13694b36f791SVedant Kumar std::unique_lock<std::recursive_mutex> lock; 13704b36f791SVedant Kumar ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 13714b36f791SVedant Kumar 13724b36f791SVedant Kumar StackFrame *frame = exe_ctx.GetFramePtr(); 13734b36f791SVedant Kumar if (frame) 13744b36f791SVedant Kumar return frame->IsArtificial(); 13754b36f791SVedant Kumar 13764b36f791SVedant Kumar return false; 13774b36f791SVedant Kumar } 13784b36f791SVedant Kumar 1379b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() { 138005f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->GetFunctionName(); 138105f75e9fSOleksiy Vyalov } 138205f75e9fSOleksiy Vyalov 1383bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const { 1384bdbdd229SJim Ingham std::unique_lock<std::recursive_mutex> lock; 1385bdbdd229SJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1386bdbdd229SJim Ingham 1387bdbdd229SJim Ingham StackFrame *frame = nullptr; 1388bdbdd229SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1389bdbdd229SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1390bdbdd229SJim Ingham if (target && process) { 1391bdbdd229SJim Ingham Process::StopLocker stop_locker; 1392bdbdd229SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) { 1393bdbdd229SJim Ingham frame = exe_ctx.GetFramePtr(); 1394bdbdd229SJim Ingham if (frame) { 1395bdbdd229SJim Ingham return frame->GuessLanguage(); 1396bdbdd229SJim Ingham } 1397bdbdd229SJim Ingham } 1398bdbdd229SJim Ingham } 1399bdbdd229SJim Ingham return eLanguageTypeUnknown; 1400bdbdd229SJim Ingham } 1401bdbdd229SJim Ingham 1402b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const { 14035160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1404dbb0abbfSEugene Zelenko const char *name = nullptr; 1405c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1406c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1407c481c7eeSJim Ingham 1408dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1409d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 14107730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1411b9c1b51eSKate Stone if (target && process) { 14127fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1413b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 14147730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1415b9c1b51eSKate Stone if (frame) { 1416b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1417b9c1b51eSKate Stone eSymbolContextBlock | 1418b9c1b51eSKate Stone eSymbolContextSymbol)); 1419b9c1b51eSKate Stone if (sc.block) { 1420316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1421b9c1b51eSKate Stone if (inlined_block) { 1422b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1423b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1424b9c1b51eSKate Stone name = 1425b9c1b51eSKate Stone inlined_info->GetName(sc.function->GetLanguage()).AsCString(); 1426316d498bSGreg Clayton } 1427316d498bSGreg Clayton } 1428316d498bSGreg Clayton 1429b9c1b51eSKate Stone if (name == nullptr) { 1430316d498bSGreg Clayton if (sc.function) 1431316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1432316d498bSGreg Clayton } 1433316d498bSGreg Clayton 1434b9c1b51eSKate Stone if (name == nullptr) { 1435316d498bSGreg Clayton if (sc.symbol) 1436316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1437316d498bSGreg Clayton } 1438b9c1b51eSKate Stone } else { 1439c9858e4dSGreg Clayton if (log) 1440b9c1b51eSKate Stone log->Printf("SBFrame::GetFunctionName () => error: could not " 1441b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 14427730b9a4SJim Ingham } 1443b9c1b51eSKate Stone } else { 14447730b9a4SJim Ingham if (log) 14457730b9a4SJim Ingham log->Printf("SBFrame::GetFunctionName() => error: process is running"); 1446c9858e4dSGreg Clayton } 14477fdf9ef1SGreg Clayton } 1448316d498bSGreg Clayton return name; 1449316d498bSGreg Clayton } 1450c1f705c2SEnrico Granata 1451b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() { 1452c1f705c2SEnrico Granata Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1453dbb0abbfSEugene Zelenko const char *name = nullptr; 1454c481c7eeSJim Ingham 1455c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1456c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1457c481c7eeSJim Ingham 1458dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1459c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1460c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 1461b9c1b51eSKate Stone if (target && process) { 1462c1f705c2SEnrico Granata Process::StopLocker stop_locker; 1463b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1464c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr(); 1465b9c1b51eSKate Stone if (frame) { 1466b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1467b9c1b51eSKate Stone eSymbolContextBlock | 1468b9c1b51eSKate Stone eSymbolContextSymbol)); 1469b9c1b51eSKate Stone if (sc.block) { 1470c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1471b9c1b51eSKate Stone if (inlined_block) { 1472b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1473b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1474b9c1b51eSKate Stone name = inlined_info->GetDisplayName(sc.function->GetLanguage()) 1475b9c1b51eSKate Stone .AsCString(); 1476c1f705c2SEnrico Granata } 1477c1f705c2SEnrico Granata } 1478c1f705c2SEnrico Granata 1479b9c1b51eSKate Stone if (name == nullptr) { 1480c1f705c2SEnrico Granata if (sc.function) 1481c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString(); 1482c1f705c2SEnrico Granata } 1483c1f705c2SEnrico Granata 1484b9c1b51eSKate Stone if (name == nullptr) { 1485c1f705c2SEnrico Granata if (sc.symbol) 1486c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString(); 1487c1f705c2SEnrico Granata } 1488b9c1b51eSKate Stone } else { 1489c1f705c2SEnrico Granata if (log) 1490b9c1b51eSKate Stone log->Printf("SBFrame::GetDisplayFunctionName () => error: could not " 1491b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 1492c1f705c2SEnrico Granata } 1493b9c1b51eSKate Stone } else { 1494c1f705c2SEnrico Granata if (log) 1495b9c1b51eSKate Stone log->Printf( 1496b9c1b51eSKate Stone "SBFrame::GetDisplayFunctionName() => error: process is running"); 1497c1f705c2SEnrico Granata } 1498c1f705c2SEnrico Granata } 1499c1f705c2SEnrico Granata return name; 1500c1f705c2SEnrico Granata } 1501