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 22b9c1b51eSKate Stone #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h" 2330fdc8d8SChris Lattner #include "lldb/Core/Address.h" 2430fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2530fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h" 2630fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h" 27151c032cSJim Ingham #include "lldb/Expression/UserExpression.h" 281ba7c4d0SGreg Clayton #include "lldb/Host/Host.h" 2930fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 301f746071SGreg Clayton #include "lldb/Symbol/Function.h" 311f746071SGreg Clayton #include "lldb/Symbol/Symbol.h" 3230fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 3330fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h" 34b9c1b51eSKate Stone #include "lldb/Symbol/VariableList.h" 3530fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h" 3630fdc8d8SChris Lattner #include "lldb/Target/Process.h" 3730fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 38b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h" 39b9556accSGreg Clayton #include "lldb/Target/StackID.h" 40b9c1b51eSKate Stone #include "lldb/Target/Target.h" 4130fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 42bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h" 436f9e6901SZachary Turner #include "lldb/Utility/Log.h" 44bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 4530fdc8d8SChris Lattner 464c5de699SEli Friedman #include "lldb/API/SBAddress.h" 47b9c1b51eSKate Stone #include "lldb/API/SBDebugger.h" 4835e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h" 49dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 504c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h" 514c5de699SEli Friedman #include "lldb/API/SBThread.h" 52b9c1b51eSKate Stone #include "lldb/API/SBValue.h" 5351f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h" 5430fdc8d8SChris Lattner 55237c3ed9SSean Callanan #include "llvm/Support/PrettyStackTrace.h" 56237c3ed9SSean Callanan 5730fdc8d8SChris Lattner using namespace lldb; 5830fdc8d8SChris Lattner using namespace lldb_private; 5930fdc8d8SChris Lattner 60b9c1b51eSKate Stone SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) {} 6130fdc8d8SChris Lattner 62b9c1b51eSKate Stone SBFrame::SBFrame(const StackFrameSP &lldb_object_sp) 63b9c1b51eSKate Stone : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) { 645160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 65ceb6b139SCaroline Tice 66b9c1b51eSKate Stone if (log) { 67ceb6b139SCaroline Tice SBStream sstr; 68ceb6b139SCaroline Tice GetDescription(sstr); 694838131bSGreg Clayton log->Printf("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s", 70324a1036SSaleem Abdulrasool static_cast<void *>(lldb_object_sp.get()), 71324a1036SSaleem Abdulrasool static_cast<void *>(lldb_object_sp.get()), sstr.GetData()); 72ceb6b139SCaroline Tice } 7330fdc8d8SChris Lattner } 7430fdc8d8SChris Lattner 75b9c1b51eSKate Stone SBFrame::SBFrame(const SBFrame &rhs) 76b9c1b51eSKate Stone : m_opaque_sp(new ExecutionContextRef(*rhs.m_opaque_sp)) {} 77efabb123SGreg Clayton 78dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default; 79dbb0abbfSEugene Zelenko 80b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) { 81efabb123SGreg Clayton if (this != &rhs) 827fdf9ef1SGreg Clayton *m_opaque_sp = *rhs.m_opaque_sp; 83efabb123SGreg Clayton return *this; 84efabb123SGreg Clayton } 85efabb123SGreg Clayton 86b9c1b51eSKate Stone StackFrameSP SBFrame::GetFrameSP() const { 87dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP()); 88b9556accSGreg Clayton } 8930fdc8d8SChris Lattner 90b9c1b51eSKate Stone void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) { 917fdf9ef1SGreg Clayton return m_opaque_sp->SetFrameSP(lldb_object_sp); 92b9556accSGreg Clayton } 9330fdc8d8SChris Lattner 94b9c1b51eSKate Stone bool SBFrame::IsValid() const { 95bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 96bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 977fa7dc36SJim Ingham 987fa7dc36SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 997fa7dc36SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 100b9c1b51eSKate Stone if (target && process) { 1017fa7dc36SJim Ingham Process::StopLocker stop_locker; 1027fa7dc36SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 103dbb0abbfSEugene Zelenko return GetFrameSP().get() != nullptr; 10430fdc8d8SChris Lattner } 10530fdc8d8SChris Lattner 1067fa7dc36SJim Ingham // Without a target & process we can't have a valid stack frame. 1077fa7dc36SJim Ingham return false; 1087fa7dc36SJim Ingham } 1097fa7dc36SJim Ingham 110b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const { 1115160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 11230fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 113bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 114bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1154fc6cb9cSJim Ingham 116dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 117d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1187730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 119b9c1b51eSKate Stone if (target && process) { 1207fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 121b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1227730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 123b9c1b51eSKate Stone if (frame) { 124d9e416c0SGreg Clayton sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext(resolve_scope)); 125b9c1b51eSKate Stone } else { 126c9858e4dSGreg Clayton if (log) 127b9c1b51eSKate Stone log->Printf("SBFrame::GetVariables () => error: could not " 128b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 1297730b9a4SJim Ingham } 130b9c1b51eSKate Stone } else { 1317730b9a4SJim Ingham if (log) 132b9c1b51eSKate Stone log->Printf( 133b9c1b51eSKate Stone "SBFrame::GetSymbolContext () => error: process is running"); 134c9858e4dSGreg Clayton } 1357fdf9ef1SGreg Clayton } 136ceb6b139SCaroline Tice 137ceb6b139SCaroline Tice if (log) 138b9c1b51eSKate Stone log->Printf("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => " 139b9c1b51eSKate Stone "SBSymbolContext(%p)", 140324a1036SSaleem Abdulrasool static_cast<void *>(frame), resolve_scope, 141324a1036SSaleem Abdulrasool static_cast<void *>(sb_sym_ctx.get())); 142ceb6b139SCaroline Tice 14330fdc8d8SChris Lattner return sb_sym_ctx; 14430fdc8d8SChris Lattner } 14530fdc8d8SChris Lattner 146b9c1b51eSKate Stone SBModule SBFrame::GetModule() const { 1475160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 14872eff18aSGreg Clayton SBModule sb_module; 149acdbe816SGreg Clayton ModuleSP module_sp; 150bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 151bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1524fc6cb9cSJim Ingham 153dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 154d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1557730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 156b9c1b51eSKate Stone if (target && process) { 1577fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 158b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1597730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 160b9c1b51eSKate Stone if (frame) { 161d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp; 162acdbe816SGreg Clayton sb_module.SetSP(module_sp); 163b9c1b51eSKate Stone } else { 164c9858e4dSGreg Clayton if (log) 165b9c1b51eSKate Stone log->Printf("SBFrame::GetModule () => error: could not reconstruct " 166b9c1b51eSKate Stone "frame object for this SBFrame."); 1677730b9a4SJim Ingham } 168b9c1b51eSKate Stone } else { 1697730b9a4SJim Ingham if (log) 1707730b9a4SJim Ingham log->Printf("SBFrame::GetModule () => error: process is running"); 171c9858e4dSGreg Clayton } 1727fdf9ef1SGreg Clayton } 17372eff18aSGreg Clayton 1744838131bSGreg Clayton if (log) 1754838131bSGreg Clayton log->Printf("SBFrame(%p)::GetModule () => SBModule(%p)", 176324a1036SSaleem Abdulrasool static_cast<void *>(frame), 177324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get())); 1784838131bSGreg Clayton 17930fdc8d8SChris Lattner return sb_module; 18030fdc8d8SChris Lattner } 18130fdc8d8SChris Lattner 182b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const { 1835160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 18472eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 185bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 186bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1874fc6cb9cSJim Ingham 188dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 189d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1907730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 191b9c1b51eSKate Stone if (target && process) { 1927fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 193b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1947730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 195b9c1b51eSKate Stone if (frame) { 196b9c1b51eSKate Stone sb_comp_unit.reset( 197b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit); 198b9c1b51eSKate Stone } else { 199ceb6b139SCaroline Tice if (log) 200b9c1b51eSKate Stone log->Printf("SBFrame::GetCompileUnit () => error: could not " 201b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 2027730b9a4SJim Ingham } 203b9c1b51eSKate Stone } else { 2047730b9a4SJim Ingham if (log) 2057730b9a4SJim Ingham log->Printf("SBFrame::GetCompileUnit () => error: process is running"); 206c9858e4dSGreg Clayton } 207c9858e4dSGreg Clayton } 208c9858e4dSGreg Clayton if (log) 209c9858e4dSGreg Clayton log->Printf("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)", 210324a1036SSaleem Abdulrasool static_cast<void *>(frame), 211324a1036SSaleem Abdulrasool static_cast<void *>(sb_comp_unit.get())); 212ceb6b139SCaroline Tice 21330fdc8d8SChris Lattner return sb_comp_unit; 21430fdc8d8SChris Lattner } 21530fdc8d8SChris Lattner 216b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const { 2175160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 21872eff18aSGreg Clayton SBFunction sb_function; 219bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 220bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2214fc6cb9cSJim Ingham 222dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 223d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2247730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 225b9c1b51eSKate Stone if (target && process) { 2267fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 227b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2287730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 229b9c1b51eSKate Stone if (frame) { 230b9c1b51eSKate Stone sb_function.reset( 231b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextFunction).function); 232b9c1b51eSKate Stone } else { 233c9858e4dSGreg Clayton if (log) 234b9c1b51eSKate Stone log->Printf("SBFrame::GetFunction () => error: could not reconstruct " 235b9c1b51eSKate Stone "frame object for this SBFrame."); 2367730b9a4SJim Ingham } 237b9c1b51eSKate Stone } else { 2387730b9a4SJim Ingham if (log) 2397730b9a4SJim Ingham log->Printf("SBFrame::GetFunction () => error: process is running"); 2407fdf9ef1SGreg Clayton } 241c9858e4dSGreg Clayton } 2424838131bSGreg Clayton if (log) 2434838131bSGreg Clayton log->Printf("SBFrame(%p)::GetFunction () => SBFunction(%p)", 244324a1036SSaleem Abdulrasool static_cast<void *>(frame), 245324a1036SSaleem Abdulrasool static_cast<void *>(sb_function.get())); 2464838131bSGreg Clayton 24730fdc8d8SChris Lattner return sb_function; 24830fdc8d8SChris Lattner } 24930fdc8d8SChris Lattner 250b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const { 2515160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 25272eff18aSGreg Clayton SBSymbol sb_symbol; 253bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 254bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2554fc6cb9cSJim Ingham 256dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 257d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2587730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 259b9c1b51eSKate Stone if (target && process) { 2607fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 261b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2627730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 263b9c1b51eSKate Stone if (frame) { 264d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol); 265b9c1b51eSKate Stone } else { 266c9858e4dSGreg Clayton if (log) 267b9c1b51eSKate Stone log->Printf("SBFrame::GetSymbol () => error: could not reconstruct " 268b9c1b51eSKate Stone "frame object for this SBFrame."); 2697730b9a4SJim Ingham } 270b9c1b51eSKate Stone } else { 2717730b9a4SJim Ingham if (log) 2727730b9a4SJim Ingham log->Printf("SBFrame::GetSymbol () => error: process is running"); 2737fdf9ef1SGreg Clayton } 274c9858e4dSGreg Clayton } 2754838131bSGreg Clayton if (log) 2764838131bSGreg Clayton log->Printf("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 277324a1036SSaleem Abdulrasool static_cast<void *>(frame), 278324a1036SSaleem Abdulrasool static_cast<void *>(sb_symbol.get())); 2793b06557eSGreg Clayton return sb_symbol; 2803b06557eSGreg Clayton } 2813b06557eSGreg Clayton 282b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const { 2835160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 28472eff18aSGreg Clayton SBBlock sb_block; 285bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 286bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2874fc6cb9cSJim Ingham 288dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 289d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2907730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 291b9c1b51eSKate Stone if (target && process) { 2927fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 293b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2947730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 295b9c1b51eSKate Stone if (frame) { 296d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block); 297b9c1b51eSKate Stone } else { 298c9858e4dSGreg Clayton if (log) 299b9c1b51eSKate Stone log->Printf("SBFrame::GetBlock () => error: could not reconstruct " 300b9c1b51eSKate Stone "frame object for this SBFrame."); 3017730b9a4SJim Ingham } 302b9c1b51eSKate Stone } else { 3037730b9a4SJim Ingham if (log) 304324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetBlock () => error: process is running", 305324a1036SSaleem Abdulrasool static_cast<void *>(frame)); 3067fdf9ef1SGreg Clayton } 307c9858e4dSGreg Clayton } 3084838131bSGreg Clayton if (log) 3094838131bSGreg Clayton log->Printf("SBFrame(%p)::GetBlock () => SBBlock(%p)", 310324a1036SSaleem Abdulrasool static_cast<void *>(frame), 311324a1036SSaleem Abdulrasool static_cast<void *>(sb_block.GetPtr())); 31230fdc8d8SChris Lattner return sb_block; 31330fdc8d8SChris Lattner } 31430fdc8d8SChris Lattner 315b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const { 31672eff18aSGreg Clayton SBBlock sb_block; 317bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 318bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3194fc6cb9cSJim Ingham 320dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 321d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3225160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3237730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 324b9c1b51eSKate Stone if (target && process) { 3257fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 326b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3277730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 328b9c1b51eSKate Stone if (frame) { 329d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock()); 330b9c1b51eSKate Stone } else { 331c9858e4dSGreg Clayton if (log) 332b9c1b51eSKate Stone log->Printf("SBFrame::GetFrameBlock () => error: could not " 333b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 3347730b9a4SJim Ingham } 335b9c1b51eSKate Stone } else { 3367730b9a4SJim Ingham if (log) 3377730b9a4SJim Ingham log->Printf("SBFrame::GetFrameBlock () => error: process is running"); 3387fdf9ef1SGreg Clayton } 339c9858e4dSGreg Clayton } 3404838131bSGreg Clayton if (log) 3414838131bSGreg Clayton log->Printf("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 342324a1036SSaleem Abdulrasool static_cast<void *>(frame), 343324a1036SSaleem Abdulrasool static_cast<void *>(sb_block.GetPtr())); 34495897c6aSGreg Clayton return sb_block; 34595897c6aSGreg Clayton } 34695897c6aSGreg Clayton 347b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const { 3485160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 34972eff18aSGreg Clayton SBLineEntry sb_line_entry; 350bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 351bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3524fc6cb9cSJim Ingham 353dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 354d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3557730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 356b9c1b51eSKate Stone if (target && process) { 3577fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 358b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3597730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 360b9c1b51eSKate Stone if (frame) { 361b9c1b51eSKate Stone sb_line_entry.SetLineEntry( 362b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextLineEntry).line_entry); 363b9c1b51eSKate Stone } else { 364c9858e4dSGreg Clayton if (log) 365b9c1b51eSKate Stone log->Printf("SBFrame::GetLineEntry () => error: could not " 366b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 3677730b9a4SJim Ingham } 368b9c1b51eSKate Stone } else { 3697730b9a4SJim Ingham if (log) 3707730b9a4SJim Ingham log->Printf("SBFrame::GetLineEntry () => error: process is running"); 3717fdf9ef1SGreg Clayton } 372c9858e4dSGreg Clayton } 3734838131bSGreg Clayton if (log) 3744838131bSGreg Clayton log->Printf("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 375324a1036SSaleem Abdulrasool static_cast<void *>(frame), 376324a1036SSaleem Abdulrasool static_cast<void *>(sb_line_entry.get())); 37730fdc8d8SChris Lattner return sb_line_entry; 37830fdc8d8SChris Lattner } 37930fdc8d8SChris Lattner 380b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const { 381b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 382b9556accSGreg Clayton 383c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 384c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 385c481c7eeSJim Ingham 386b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 3877fdf9ef1SGreg Clayton if (frame) 388d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex(); 3894838131bSGreg Clayton 3905160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3914838131bSGreg Clayton if (log) 392b9c1b51eSKate Stone log->Printf("SBFrame(%p)::GetFrameID () => %u", static_cast<void *>(frame), 393b9c1b51eSKate Stone frame_idx); 3944838131bSGreg Clayton return frame_idx; 39530fdc8d8SChris Lattner } 39630fdc8d8SChris Lattner 397b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const { 398c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 399c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 400c481c7eeSJim Ingham 401424a5dbcSGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 402424a5dbcSGreg Clayton if (frame) 403424a5dbcSGreg Clayton return frame->GetStackID().GetCallFrameAddress(); 404424a5dbcSGreg Clayton return LLDB_INVALID_ADDRESS; 405424a5dbcSGreg Clayton } 406424a5dbcSGreg Clayton 407b9c1b51eSKate Stone addr_t SBFrame::GetPC() const { 4085160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 40969b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 410bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 411bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4124fc6cb9cSJim Ingham 413dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 414d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4157730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 416b9c1b51eSKate Stone if (target && process) { 4177fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 418b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4197730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 420b9c1b51eSKate Stone if (frame) { 421b9c1b51eSKate Stone addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress( 422b9c1b51eSKate Stone target, eAddressClassCode); 423b9c1b51eSKate Stone } else { 424c9858e4dSGreg Clayton if (log) 425b9c1b51eSKate Stone log->Printf("SBFrame::GetPC () => error: could not reconstruct frame " 426b9c1b51eSKate Stone "object for this SBFrame."); 4277730b9a4SJim Ingham } 428b9c1b51eSKate Stone } else { 4297730b9a4SJim Ingham if (log) 4307730b9a4SJim Ingham log->Printf("SBFrame::GetPC () => error: process is running"); 431c9858e4dSGreg Clayton } 4327fdf9ef1SGreg Clayton } 433ceb6b139SCaroline Tice 434ceb6b139SCaroline Tice if (log) 435324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetPC () => 0x%" PRIx64, 436324a1036SSaleem Abdulrasool static_cast<void *>(frame), addr); 437ceb6b139SCaroline Tice 438ceb6b139SCaroline Tice return addr; 43930fdc8d8SChris Lattner } 44030fdc8d8SChris Lattner 441b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) { 4425160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 443ceb6b139SCaroline Tice bool ret_val = false; 444bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 445bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4464fc6cb9cSJim Ingham 447dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 448d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4497730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 450b9c1b51eSKate Stone if (target && process) { 4517fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 452b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4537730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 454b9c1b51eSKate Stone if (frame) { 455d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC(new_pc); 456b9c1b51eSKate Stone } else { 457c9858e4dSGreg Clayton if (log) 458b9c1b51eSKate Stone log->Printf("SBFrame::SetPC () => error: could not reconstruct frame " 459b9c1b51eSKate Stone "object for this SBFrame."); 4607730b9a4SJim Ingham } 461b9c1b51eSKate Stone } else { 4627730b9a4SJim Ingham if (log) 4637730b9a4SJim Ingham log->Printf("SBFrame::SetPC () => error: process is running"); 464c9858e4dSGreg Clayton } 4657fdf9ef1SGreg Clayton } 466ceb6b139SCaroline Tice 467ceb6b139SCaroline Tice if (log) 468d01b2953SDaniel Malea log->Printf("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i", 469324a1036SSaleem Abdulrasool static_cast<void *>(frame), new_pc, ret_val); 470ceb6b139SCaroline Tice 471ceb6b139SCaroline Tice return ret_val; 47230fdc8d8SChris Lattner } 47330fdc8d8SChris Lattner 474b9c1b51eSKate Stone addr_t SBFrame::GetSP() const { 4755160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4764838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 477bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 478bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4794fc6cb9cSJim Ingham 480dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 481d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4827730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 483b9c1b51eSKate Stone if (target && process) { 4847fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 485b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4867730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 487b9c1b51eSKate Stone if (frame) { 488d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 489b9c1b51eSKate Stone } else { 490c9858e4dSGreg Clayton if (log) 491b9c1b51eSKate Stone log->Printf("SBFrame::GetSP () => error: could not reconstruct frame " 492b9c1b51eSKate Stone "object for this SBFrame."); 4937730b9a4SJim Ingham } 494b9c1b51eSKate Stone } else { 4957730b9a4SJim Ingham if (log) 4967730b9a4SJim Ingham log->Printf("SBFrame::GetSP () => error: process is running"); 4977fdf9ef1SGreg Clayton } 498c9858e4dSGreg Clayton } 4994838131bSGreg Clayton if (log) 500324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetSP () => 0x%" PRIx64, 501324a1036SSaleem Abdulrasool static_cast<void *>(frame), addr); 5024838131bSGreg Clayton 5034838131bSGreg Clayton return addr; 50430fdc8d8SChris Lattner } 50530fdc8d8SChris Lattner 506b9c1b51eSKate Stone addr_t SBFrame::GetFP() const { 5075160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 50869b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 509bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 510bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5114fc6cb9cSJim Ingham 512dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 513d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5147730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 515b9c1b51eSKate Stone if (target && process) { 5167fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 517b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5187730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 519b9c1b51eSKate Stone if (frame) { 520d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 521b9c1b51eSKate Stone } else { 522c9858e4dSGreg Clayton if (log) 523b9c1b51eSKate Stone log->Printf("SBFrame::GetFP () => error: could not reconstruct frame " 524b9c1b51eSKate Stone "object for this SBFrame."); 5257730b9a4SJim Ingham } 526b9c1b51eSKate Stone } else { 5277730b9a4SJim Ingham if (log) 5287730b9a4SJim Ingham log->Printf("SBFrame::GetFP () => error: process is running"); 529c9858e4dSGreg Clayton } 5307fdf9ef1SGreg Clayton } 531ceb6b139SCaroline Tice 532ceb6b139SCaroline Tice if (log) 533324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetFP () => 0x%" PRIx64, 534324a1036SSaleem Abdulrasool static_cast<void *>(frame), addr); 535ceb6b139SCaroline Tice return addr; 53630fdc8d8SChris Lattner } 53730fdc8d8SChris Lattner 538b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const { 5395160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 54030fdc8d8SChris Lattner SBAddress sb_addr; 541bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 542bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5434fc6cb9cSJim Ingham 544b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 545d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5467730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 547b9c1b51eSKate Stone if (target && process) { 5487fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 549b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5507730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 551b9c1b51eSKate Stone if (frame) { 552d9e416c0SGreg Clayton sb_addr.SetAddress(&frame->GetFrameCodeAddress()); 553b9c1b51eSKate Stone } else { 554c9858e4dSGreg Clayton if (log) 555b9c1b51eSKate Stone log->Printf("SBFrame::GetPCAddress () => error: could not " 556b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 5577730b9a4SJim Ingham } 558b9c1b51eSKate Stone } else { 5597730b9a4SJim Ingham if (log) 5607730b9a4SJim Ingham log->Printf("SBFrame::GetPCAddress () => error: process is running"); 5617fdf9ef1SGreg Clayton } 562c9858e4dSGreg Clayton } 5634838131bSGreg Clayton if (log) 564324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", 565b9c1b51eSKate Stone static_cast<void *>(frame), static_cast<void *>(sb_addr.get())); 56630fdc8d8SChris Lattner return sb_addr; 56730fdc8d8SChris Lattner } 56830fdc8d8SChris Lattner 569b9c1b51eSKate Stone void SBFrame::Clear() { m_opaque_sp->Clear(); } 57030fdc8d8SChris Lattner 571b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) { 5727edbdfc9SGreg Clayton SBValue sb_value; 573c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 574c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 575c481c7eeSJim Ingham 576b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 577d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 578b9c1b51eSKate Stone if (frame && target) { 579b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 580b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 5817edbdfc9SGreg Clayton sb_value = GetValueForVariablePath(var_path, use_dynamic); 5827edbdfc9SGreg Clayton } 5837edbdfc9SGreg Clayton return sb_value; 5847edbdfc9SGreg Clayton } 5857edbdfc9SGreg Clayton 586b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path, 587b9c1b51eSKate Stone DynamicValueType use_dynamic) { 5887edbdfc9SGreg Clayton SBValue sb_value; 5895160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 590b9c1b51eSKate Stone if (var_path == nullptr || var_path[0] == '\0') { 5917730b9a4SJim Ingham if (log) 592b9c1b51eSKate Stone log->Printf( 593b9c1b51eSKate Stone "SBFrame::GetValueForVariablePath called with empty variable path."); 5947730b9a4SJim Ingham return sb_value; 5957730b9a4SJim Ingham } 5967730b9a4SJim Ingham 597bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 598bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5994fc6cb9cSJim Ingham 600dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 601d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6027730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 603b9c1b51eSKate Stone if (target && process) { 6047fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 605b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 6067730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 607b9c1b51eSKate Stone if (frame) { 6087edbdfc9SGreg Clayton VariableSP var_sp; 6097edbdfc9SGreg Clayton Error error; 610b9c1b51eSKate Stone ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath( 611b9c1b51eSKate Stone var_path, eNoDynamicValues, 612b9c1b51eSKate Stone StackFrame::eExpressionPathOptionCheckPtrVsMember | 613b9c1b51eSKate Stone StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 614b9c1b51eSKate Stone var_sp, error)); 615e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 616b9c1b51eSKate Stone } else { 617c9858e4dSGreg Clayton if (log) 618b9c1b51eSKate Stone log->Printf("SBFrame::GetValueForVariablePath () => error: could not " 619b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 6207730b9a4SJim Ingham } 621b9c1b51eSKate Stone } else { 6227730b9a4SJim Ingham if (log) 623b9c1b51eSKate Stone log->Printf( 624b9c1b51eSKate Stone "SBFrame::GetValueForVariablePath () => error: process is running"); 625c9858e4dSGreg Clayton } 6267fdf9ef1SGreg Clayton } 6277edbdfc9SGreg Clayton return sb_value; 6287edbdfc9SGreg Clayton } 6297edbdfc9SGreg Clayton 630b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) { 631316d498bSGreg Clayton SBValue value; 632c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 633c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 634c481c7eeSJim Ingham 635b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 636d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 637b9c1b51eSKate Stone if (frame && target) { 638b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 639b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 640316d498bSGreg Clayton value = FindVariable(name, use_dynamic); 641316d498bSGreg Clayton } 642316d498bSGreg Clayton return value; 64378a685aaSJim Ingham } 64478a685aaSJim Ingham 645b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name, 646b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 6475160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 64869b582faSGreg Clayton VariableSP var_sp; 64958b59f95SJim Ingham SBValue sb_value; 6507730b9a4SJim Ingham 651b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 6527730b9a4SJim Ingham if (log) 6537730b9a4SJim Ingham log->Printf("SBFrame::FindVariable called with empty name"); 6547730b9a4SJim Ingham return sb_value; 6557730b9a4SJim Ingham } 6567730b9a4SJim Ingham 65781e871edSGreg Clayton ValueObjectSP value_sp; 658bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 659bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 6604fc6cb9cSJim Ingham 661dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 662d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6637730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 664b9c1b51eSKate Stone if (target && process) { 6657fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 666b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 6677730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 668b9c1b51eSKate Stone if (frame) { 66969b582faSGreg Clayton VariableList variable_list; 670d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 67130fdc8d8SChris Lattner 672b9c1b51eSKate Stone if (sc.block) { 67372eff18aSGreg Clayton const bool can_create = true; 67472eff18aSGreg Clayton const bool get_parent_variables = true; 67572eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 67672eff18aSGreg Clayton 677b9c1b51eSKate Stone if (sc.block->AppendVariables( 678b9c1b51eSKate Stone can_create, get_parent_variables, 67972eff18aSGreg Clayton stop_if_block_is_inlined_function, 68072ac8a84STamas Berghammer [frame](Variable *v) { return v->IsInScope(frame); }, 681b9c1b51eSKate Stone &variable_list)) { 68269b582faSGreg Clayton var_sp = variable_list.FindVariable(ConstString(name)); 68330fdc8d8SChris Lattner } 68472eff18aSGreg Clayton } 68530fdc8d8SChris Lattner 686b9c1b51eSKate Stone if (var_sp) { 687b9c1b51eSKate Stone value_sp = 688b9c1b51eSKate Stone frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues); 689e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 69081e871edSGreg Clayton } 691b9c1b51eSKate Stone } else { 692c9858e4dSGreg Clayton if (log) 693b9c1b51eSKate Stone log->Printf("SBFrame::FindVariable () => error: could not " 694b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 6957730b9a4SJim Ingham } 696b9c1b51eSKate Stone } else { 6977730b9a4SJim Ingham if (log) 6987730b9a4SJim Ingham log->Printf("SBFrame::FindVariable () => error: process is running"); 699c9858e4dSGreg Clayton } 700316d498bSGreg Clayton } 701316d498bSGreg Clayton 7024838131bSGreg Clayton if (log) 70369b582faSGreg Clayton log->Printf("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 704324a1036SSaleem Abdulrasool static_cast<void *>(frame), name, 705324a1036SSaleem Abdulrasool static_cast<void *>(value_sp.get())); 7064838131bSGreg Clayton 707dde9cff3SCaroline Tice return sb_value; 708dde9cff3SCaroline Tice } 709dde9cff3SCaroline Tice 710b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) { 711316d498bSGreg Clayton SBValue value; 712c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 713c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 714c481c7eeSJim Ingham 715b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 716d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 717b9c1b51eSKate Stone if (frame && target) { 718b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 719b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 720316d498bSGreg Clayton value = FindValue(name, value_type, use_dynamic); 721316d498bSGreg Clayton } 722316d498bSGreg Clayton return value; 72378a685aaSJim Ingham } 72478a685aaSJim Ingham 725b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type, 726b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 7275160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 72869b582faSGreg Clayton SBValue sb_value; 7297730b9a4SJim Ingham 730b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 7317730b9a4SJim Ingham if (log) 7327730b9a4SJim Ingham log->Printf("SBFrame::FindValue called with empty name."); 7337730b9a4SJim Ingham return sb_value; 7347730b9a4SJim Ingham } 7357730b9a4SJim Ingham 73681e871edSGreg Clayton ValueObjectSP value_sp; 737bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 738bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7394fc6cb9cSJim Ingham 740dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 741d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7427730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 743b9c1b51eSKate Stone if (target && process) { 7447fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 745b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 7467730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 747b9c1b51eSKate Stone if (frame) { 7488a2a0dfbSEnrico Granata VariableList variable_list; 7498a2a0dfbSEnrico Granata 750b9c1b51eSKate Stone switch (value_type) { 75169b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 75269b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 75369b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 75469b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 75563a27afaSGreg Clayton case eValueTypeVariableThreadLocal: // thread local variables 75669b582faSGreg Clayton { 757d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 75872eff18aSGreg Clayton 75972eff18aSGreg Clayton const bool can_create = true; 76072eff18aSGreg Clayton const bool get_parent_variables = true; 76172eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 76272eff18aSGreg Clayton 7630efb51a0SChaoren Lin if (sc.block) 764b9c1b51eSKate Stone sc.block->AppendVariables( 765b9c1b51eSKate Stone can_create, get_parent_variables, 766b9c1b51eSKate Stone stop_if_block_is_inlined_function, 767b9c1b51eSKate Stone [frame](Variable *v) { return v->IsInScope(frame); }, 768b9c1b51eSKate Stone &variable_list); 769b9c1b51eSKate Stone if (value_type == eValueTypeVariableGlobal) { 7708a2a0dfbSEnrico Granata const bool get_file_globals = true; 7718a2a0dfbSEnrico Granata VariableList *frame_vars = frame->GetVariableList(get_file_globals); 7728a2a0dfbSEnrico Granata if (frame_vars) 7738a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 7748a2a0dfbSEnrico Granata } 77569b582faSGreg Clayton ConstString const_name(name); 776b9c1b51eSKate Stone VariableSP variable_sp( 777b9c1b51eSKate Stone variable_list.FindVariable(const_name, value_type)); 778b9c1b51eSKate Stone if (variable_sp) { 779b9c1b51eSKate Stone value_sp = frame->GetValueObjectForFrameVariable(variable_sp, 780b9c1b51eSKate Stone eNoDynamicValues); 781e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 78230fdc8d8SChris Lattner } 783b9c1b51eSKate Stone } break; 78469b582faSGreg Clayton 78569b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 78669b582faSGreg Clayton { 787d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 788b9c1b51eSKate Stone if (reg_ctx) { 78969b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 790b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 791b9c1b51eSKate Stone const RegisterInfo *reg_info = 792b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 79369b582faSGreg Clayton if (reg_info && 79469b582faSGreg Clayton ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 795b9c1b51eSKate Stone (reg_info->alt_name && 796b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 797d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 79881e871edSGreg Clayton sb_value.SetSP(value_sp); 79981e871edSGreg Clayton break; 80069b582faSGreg Clayton } 80169b582faSGreg Clayton } 80269b582faSGreg Clayton } 803b9c1b51eSKate Stone } break; 80469b582faSGreg Clayton 805b9c1b51eSKate Stone case eValueTypeRegisterSet: // A collection of stack frame register 806b9c1b51eSKate Stone // values 80769b582faSGreg Clayton { 808d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 809b9c1b51eSKate Stone if (reg_ctx) { 81069b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 811b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 81269b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx); 81369b582faSGreg Clayton if (reg_set && 81469b582faSGreg Clayton ((reg_set->name && strcasecmp(reg_set->name, name) == 0) || 815b9c1b51eSKate Stone (reg_set->short_name && 816b9c1b51eSKate Stone strcasecmp(reg_set->short_name, name) == 0))) { 817b9c1b51eSKate Stone value_sp = 818b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx); 81981e871edSGreg Clayton sb_value.SetSP(value_sp); 82081e871edSGreg Clayton break; 82169b582faSGreg Clayton } 82269b582faSGreg Clayton } 82369b582faSGreg Clayton } 824b9c1b51eSKate Stone } break; 82569b582faSGreg Clayton 82669b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 82769b582faSGreg Clayton { 82869b582faSGreg Clayton ConstString const_name(name); 829b9c1b51eSKate Stone ExpressionVariableSP expr_var_sp( 830b9c1b51eSKate Stone target->GetPersistentVariable(const_name)); 831b9c1b51eSKate Stone if (expr_var_sp) { 83281e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 833e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 83481e871edSGreg Clayton } 835b9c1b51eSKate Stone } break; 83669b582faSGreg Clayton 83769b582faSGreg Clayton default: 83869b582faSGreg Clayton break; 83969b582faSGreg Clayton } 840b9c1b51eSKate Stone } else { 841c9858e4dSGreg Clayton if (log) 842b9c1b51eSKate Stone log->Printf("SBFrame::FindValue () => error: could not reconstruct " 843b9c1b51eSKate Stone "frame object for this SBFrame."); 8447730b9a4SJim Ingham } 845b9c1b51eSKate Stone } else { 8467730b9a4SJim Ingham if (log) 8477730b9a4SJim Ingham log->Printf("SBFrame::FindValue () => error: process is running"); 848c9858e4dSGreg Clayton } 8497fdf9ef1SGreg Clayton } 850dde9cff3SCaroline Tice 8514838131bSGreg Clayton if (log) 852b9c1b51eSKate Stone log->Printf("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) " 853b9c1b51eSKate Stone "=> SBValue(%p)", 854324a1036SSaleem Abdulrasool static_cast<void *>(frame), name, value_type, 855324a1036SSaleem Abdulrasool static_cast<void *>(value_sp.get())); 8564838131bSGreg Clayton 857dde9cff3SCaroline Tice return sb_value; 858dde9cff3SCaroline Tice } 859dde9cff3SCaroline Tice 860b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const { 861b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 862b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 86335e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 86435e2ab60SJohnny Chen } 86535e2ab60SJohnny Chen 866b9c1b51eSKate Stone bool SBFrame::operator==(const SBFrame &rhs) const { return IsEqual(rhs); } 86730fdc8d8SChris Lattner 868b9c1b51eSKate Stone bool SBFrame::operator!=(const SBFrame &rhs) const { return !IsEqual(rhs); } 86930fdc8d8SChris Lattner 870b9c1b51eSKate Stone SBThread SBFrame::GetThread() const { 8715160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 872ceb6b139SCaroline Tice 873c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 874c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 875c481c7eeSJim Ingham 876d9e416c0SGreg Clayton ThreadSP thread_sp(exe_ctx.GetThreadSP()); 877d9e416c0SGreg Clayton SBThread sb_thread(thread_sp); 878ceb6b139SCaroline Tice 879b9c1b51eSKate Stone if (log) { 880750cd175SCaroline Tice SBStream sstr; 881750cd175SCaroline Tice sb_thread.GetDescription(sstr); 882d9e416c0SGreg Clayton log->Printf("SBFrame(%p)::GetThread () => SBThread(%p): %s", 883324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetFramePtr()), 884324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get()), sstr.GetData()); 885750cd175SCaroline Tice } 886ceb6b139SCaroline Tice 88730fdc8d8SChris Lattner return sb_thread; 88830fdc8d8SChris Lattner } 88930fdc8d8SChris Lattner 890b9c1b51eSKate Stone const char *SBFrame::Disassemble() const { 8915160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 892dbb0abbfSEugene Zelenko const char *disassembly = nullptr; 893bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 894bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 8954fc6cb9cSJim Ingham 896dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 897d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 8987730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 899b9c1b51eSKate Stone if (target && process) { 9007fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 901b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9027730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 903b9c1b51eSKate Stone if (frame) { 904d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 905b9c1b51eSKate Stone } else { 906c9858e4dSGreg Clayton if (log) 907b9c1b51eSKate Stone log->Printf("SBFrame::Disassemble () => error: could not reconstruct " 908b9c1b51eSKate Stone "frame object for this SBFrame."); 9097730b9a4SJim Ingham } 910b9c1b51eSKate Stone } else { 9117730b9a4SJim Ingham if (log) 9127730b9a4SJim Ingham log->Printf("SBFrame::Disassemble () => error: process is running"); 9137fdf9ef1SGreg Clayton } 914c9858e4dSGreg Clayton } 9154838131bSGreg Clayton 9164838131bSGreg Clayton if (log) 917b9c1b51eSKate Stone log->Printf("SBFrame(%p)::Disassemble () => %s", static_cast<void *>(frame), 918b9c1b51eSKate Stone disassembly); 9194838131bSGreg Clayton 9204838131bSGreg Clayton return disassembly; 92130fdc8d8SChris Lattner } 92230fdc8d8SChris Lattner 923b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics, 924b9c1b51eSKate Stone bool in_scope_only) { 925316d498bSGreg Clayton SBValueList value_list; 926c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 927c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 928c481c7eeSJim Ingham 929b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 930d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 931b9c1b51eSKate Stone if (frame && target) { 932b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 933b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 934b9c1b51eSKate Stone const bool include_runtime_support_values = 935b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 93651f96eebSZachary Turner 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 94551f96eebSZachary Turner value_list = GetVariables(options); 946316d498bSGreg Clayton } 947316d498bSGreg Clayton return value_list; 94878a685aaSJim Ingham } 94978a685aaSJim Ingham 950b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals, 951b9c1b51eSKate Stone bool statics, bool in_scope_only, 952b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 953c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 954c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 955c481c7eeSJim Ingham 956560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 957b9c1b51eSKate Stone const bool include_runtime_support_values = 958b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 95951f96eebSZachary Turner SBVariablesOptions options; 96051f96eebSZachary Turner options.SetIncludeArguments(arguments); 96151f96eebSZachary Turner options.SetIncludeLocals(locals); 96251f96eebSZachary Turner options.SetIncludeStatics(statics); 96351f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 96451f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 96551f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 96651f96eebSZachary Turner return GetVariables(options); 967560558ebSEnrico Granata } 968560558ebSEnrico Granata 969b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) { 9705160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 971ceb6b139SCaroline Tice 972b9556accSGreg Clayton SBValueList value_list; 973bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 974bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9754fc6cb9cSJim Ingham 976dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 977d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 978b9556accSGreg Clayton 97951f96eebSZachary Turner const bool statics = options.GetIncludeStatics(); 98051f96eebSZachary Turner const bool arguments = options.GetIncludeArguments(); 98151f96eebSZachary Turner const bool locals = options.GetIncludeLocals(); 98251f96eebSZachary Turner const bool in_scope_only = options.GetInScopeOnly(); 983b9c1b51eSKate Stone const bool include_runtime_support_values = 984b9c1b51eSKate Stone options.GetIncludeRuntimeSupportValues(); 98551f96eebSZachary Turner const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 98651f96eebSZachary Turner 987ceb6b139SCaroline Tice if (log) 988b9c1b51eSKate Stone log->Printf("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, " 989b9c1b51eSKate Stone "in_scope_only=%i runtime=%i dynamic=%i)", 990b9c1b51eSKate Stone arguments, locals, statics, in_scope_only, 99151f96eebSZachary Turner include_runtime_support_values, use_dynamic); 992ceb6b139SCaroline Tice 993349213f9SGreg Clayton std::set<VariableSP> variable_set; 9947730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 995b9c1b51eSKate Stone if (target && process) { 9967fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 997b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9987730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 999b9c1b51eSKate Stone if (frame) { 100030fdc8d8SChris Lattner size_t i; 1001dbb0abbfSEugene Zelenko VariableList *variable_list = nullptr; 1002d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 1003b9c1b51eSKate Stone if (variable_list) { 100430fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 1005b9c1b51eSKate Stone if (num_variables) { 1006b9c1b51eSKate Stone for (i = 0; i < num_variables; ++i) { 100730fdc8d8SChris Lattner VariableSP variable_sp(variable_list->GetVariableAtIndex(i)); 1008b9c1b51eSKate Stone if (variable_sp) { 100930fdc8d8SChris Lattner bool add_variable = false; 1010b9c1b51eSKate Stone switch (variable_sp->GetScope()) { 101130fdc8d8SChris Lattner case eValueTypeVariableGlobal: 101230fdc8d8SChris Lattner case eValueTypeVariableStatic: 101363a27afaSGreg Clayton case eValueTypeVariableThreadLocal: 101430fdc8d8SChris Lattner add_variable = statics; 101530fdc8d8SChris Lattner break; 101630fdc8d8SChris Lattner 101730fdc8d8SChris Lattner case eValueTypeVariableArgument: 101830fdc8d8SChris Lattner add_variable = arguments; 101930fdc8d8SChris Lattner break; 102030fdc8d8SChris Lattner 102130fdc8d8SChris Lattner case eValueTypeVariableLocal: 102230fdc8d8SChris Lattner add_variable = locals; 102330fdc8d8SChris Lattner break; 1024c982c768SGreg Clayton 1025c982c768SGreg Clayton default: 1026c982c768SGreg Clayton break; 102730fdc8d8SChris Lattner } 1028b9c1b51eSKate Stone if (add_variable) { 1029349213f9SGreg Clayton // Only add variables once so we don't end up with duplicates 1030349213f9SGreg Clayton if (variable_set.find(variable_sp) == variable_set.end()) 1031349213f9SGreg Clayton variable_set.insert(variable_sp); 1032349213f9SGreg Clayton else 1033349213f9SGreg Clayton continue; 1034349213f9SGreg Clayton 1035d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 103630fdc8d8SChris Lattner continue; 103730fdc8d8SChris Lattner 1038b9c1b51eSKate Stone ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable( 1039b9c1b51eSKate Stone variable_sp, eNoDynamicValues)); 1040560558ebSEnrico Granata 1041b9c1b51eSKate Stone if (!include_runtime_support_values && valobj_sp != nullptr && 1042dbb0abbfSEugene Zelenko valobj_sp->IsRuntimeSupportValue()) 1043560558ebSEnrico Granata continue; 1044560558ebSEnrico Granata 1045e3e91517SEnrico Granata SBValue value_sb; 1046e3e91517SEnrico Granata value_sb.SetSP(valobj_sp, use_dynamic); 1047e3e91517SEnrico Granata value_list.Append(value_sb); 104830fdc8d8SChris Lattner } 104930fdc8d8SChris Lattner } 105030fdc8d8SChris Lattner } 105130fdc8d8SChris Lattner } 105230fdc8d8SChris Lattner } 1053b9c1b51eSKate Stone } else { 1054c9858e4dSGreg Clayton if (log) 1055b9c1b51eSKate Stone log->Printf("SBFrame::GetVariables () => error: could not " 1056b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 10577730b9a4SJim Ingham } 1058b9c1b51eSKate Stone } else { 10597730b9a4SJim Ingham if (log) 10607730b9a4SJim Ingham log->Printf("SBFrame::GetVariables () => error: process is running"); 1061c9858e4dSGreg Clayton } 10627fdf9ef1SGreg Clayton } 1063ceb6b139SCaroline Tice 1064ceb6b139SCaroline Tice if (log) 1065324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", 1066324a1036SSaleem Abdulrasool static_cast<void *>(frame), 1067324a1036SSaleem Abdulrasool static_cast<void *>(value_list.opaque_ptr())); 1068ceb6b139SCaroline Tice 106930fdc8d8SChris Lattner return value_list; 107030fdc8d8SChris Lattner } 107130fdc8d8SChris Lattner 1072b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() { 10735160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1074ceb6b139SCaroline Tice 107530fdc8d8SChris Lattner SBValueList value_list; 1076bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1077bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 10784fc6cb9cSJim Ingham 1079dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1080d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 10817730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1082b9c1b51eSKate Stone if (target && process) { 10837fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1084b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 10857730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1086b9c1b51eSKate Stone if (frame) { 1087d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 1088b9c1b51eSKate Stone if (reg_ctx) { 108930fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 1090b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 1091b9c1b51eSKate Stone value_list.Append( 1092b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx)); 109330fdc8d8SChris Lattner } 109430fdc8d8SChris Lattner } 1095b9c1b51eSKate Stone } else { 1096c9858e4dSGreg Clayton if (log) 1097b9c1b51eSKate Stone log->Printf("SBFrame::GetRegisters () => error: could not " 1098b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 10997730b9a4SJim Ingham } 1100b9c1b51eSKate Stone } else { 11017730b9a4SJim Ingham if (log) 11027730b9a4SJim Ingham log->Printf("SBFrame::GetRegisters () => error: process is running"); 1103c9858e4dSGreg Clayton } 11047fdf9ef1SGreg Clayton } 1105ceb6b139SCaroline Tice 1106ceb6b139SCaroline Tice if (log) 1107324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetRegisters () => SBValueList(%p)", 1108324a1036SSaleem Abdulrasool static_cast<void *>(frame), 1109324a1036SSaleem Abdulrasool static_cast<void *>(value_list.opaque_ptr())); 1110ceb6b139SCaroline Tice 111130fdc8d8SChris Lattner return value_list; 111230fdc8d8SChris Lattner } 111330fdc8d8SChris Lattner 1114b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) { 1115ad9a53c5SJason Molenda Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1116ad9a53c5SJason Molenda 1117ad9a53c5SJason Molenda SBValue result; 1118ad9a53c5SJason Molenda ValueObjectSP value_sp; 1119bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1120bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1121ad9a53c5SJason Molenda 1122dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1123ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 1124ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1125b9c1b51eSKate Stone if (target && process) { 1126ad9a53c5SJason Molenda Process::StopLocker stop_locker; 1127b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1128ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 1129b9c1b51eSKate Stone if (frame) { 1130ad9a53c5SJason Molenda RegisterContextSP reg_ctx(frame->GetRegisterContext()); 1131b9c1b51eSKate Stone if (reg_ctx) { 1132ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 1133b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 1134b9c1b51eSKate Stone const RegisterInfo *reg_info = 1135b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 1136ad9a53c5SJason Molenda if (reg_info && 1137ad9a53c5SJason Molenda ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 1138b9c1b51eSKate Stone (reg_info->alt_name && 1139b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 1140ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 1141ad9a53c5SJason Molenda result.SetSP(value_sp); 1142ad9a53c5SJason Molenda break; 1143ad9a53c5SJason Molenda } 1144ad9a53c5SJason Molenda } 1145ad9a53c5SJason Molenda } 1146b9c1b51eSKate Stone } else { 1147ad9a53c5SJason Molenda if (log) 1148b9c1b51eSKate Stone log->Printf("SBFrame::FindRegister () => error: could not " 1149b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 1150ad9a53c5SJason Molenda } 1151b9c1b51eSKate Stone } else { 1152ad9a53c5SJason Molenda if (log) 11535d353842SJason Molenda log->Printf("SBFrame::FindRegister () => error: process is running"); 1154ad9a53c5SJason Molenda } 1155ad9a53c5SJason Molenda } 1156ad9a53c5SJason Molenda 1157ad9a53c5SJason Molenda if (log) 1158324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::FindRegister () => SBValue(%p)", 1159324a1036SSaleem Abdulrasool static_cast<void *>(frame), 1160324a1036SSaleem Abdulrasool static_cast<void *>(value_sp.get())); 1161ad9a53c5SJason Molenda 1162ad9a53c5SJason Molenda return result; 1163ad9a53c5SJason Molenda } 1164ad9a53c5SJason Molenda 1165b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) { 11665160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1167da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1168da7bc7d0SGreg Clayton 1169bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1170bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11714fc6cb9cSJim Ingham 1172b57e4a1bSJason Molenda StackFrame *frame; 1173d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 11747730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1175b9c1b51eSKate Stone if (target && process) { 11767fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1177b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11787730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1179b9c1b51eSKate Stone if (frame) { 1180d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&strm); 1181b9c1b51eSKate Stone } else { 1182c9858e4dSGreg Clayton if (log) 1183b9c1b51eSKate Stone log->Printf("SBFrame::GetDescription () => error: could not " 1184b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 11857730b9a4SJim Ingham } 1186b9c1b51eSKate Stone } else { 11877730b9a4SJim Ingham if (log) 11887730b9a4SJim Ingham log->Printf("SBFrame::GetDescription () => error: process is running"); 1189c9858e4dSGreg Clayton } 1190c9858e4dSGreg Clayton 1191b9c1b51eSKate Stone } else 1192da7bc7d0SGreg Clayton strm.PutCString("No value"); 1193dde9cff3SCaroline Tice 1194dde9cff3SCaroline Tice return true; 1195dde9cff3SCaroline Tice } 11961d3afba3SGreg Clayton 1197b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) { 1198316d498bSGreg Clayton SBValue result; 1199c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1200c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1201c481c7eeSJim Ingham 1202b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1203d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1204b9c1b51eSKate Stone if (frame && target) { 120535e1bda6SJim Ingham SBExpressionOptions options; 1206b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value = 1207b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 1208cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 120935e1bda6SJim Ingham options.SetUnwindOnError(true); 121024785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1211998c8a1cSRyan Brown if (target->GetLanguage() != eLanguageTypeUnknown) 1212998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1213998c8a1cSRyan Brown else 1214998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 121535e1bda6SJim Ingham return EvaluateExpression(expr, options); 1216316d498bSGreg Clayton } 1217316d498bSGreg Clayton return result; 121878a685aaSJim Ingham } 121978a685aaSJim Ingham 122078a685aaSJim Ingham SBValue 1221b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr, 1222b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value) { 122335e1bda6SJim Ingham SBExpressionOptions options; 1224cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 122535e1bda6SJim Ingham options.SetUnwindOnError(true); 122624785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1227c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1228c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1229c481c7eeSJim Ingham 1230998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1231998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1232998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1233998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1234998c8a1cSRyan Brown else if (frame) 1235998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 123635e1bda6SJim Ingham return EvaluateExpression(expr, options); 12377ba6e991SJim Ingham } 12387ba6e991SJim Ingham 1239b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr, 1240b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value, 1241b9c1b51eSKate Stone bool unwind_on_error) { 124235e1bda6SJim Ingham SBExpressionOptions options; 1243c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1244c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1245c481c7eeSJim Ingham 1246cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 124735e1bda6SJim Ingham options.SetUnwindOnError(unwind_on_error); 124824785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1249998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1250998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1251998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1252998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1253998c8a1cSRyan Brown else if (frame) 1254998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 125535e1bda6SJim Ingham return EvaluateExpression(expr, options); 125635e1bda6SJim Ingham } 125735e1bda6SJim Ingham 1258b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr, 1259b9c1b51eSKate Stone const SBExpressionOptions &options) { 12605160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 12614838131bSGreg Clayton 1262358efd65SSaleem Abdulrasool #ifndef LLDB_DISABLE_PYTHON 12635160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1264358efd65SSaleem Abdulrasool #endif 1265a162ebafSSean Callanan 12668646d3c1SJim Ingham ExpressionResults exe_results = eExpressionSetupError; 126769b582faSGreg Clayton SBValue expr_result; 12687730b9a4SJim Ingham 1269b9c1b51eSKate Stone if (expr == nullptr || expr[0] == '\0') { 12707730b9a4SJim Ingham if (log) 1271b9c1b51eSKate Stone log->Printf( 1272b9c1b51eSKate Stone "SBFrame::EvaluateExpression called with an empty expression"); 12737730b9a4SJim Ingham return expr_result; 12747730b9a4SJim Ingham } 12757730b9a4SJim Ingham 127681e871edSGreg Clayton ValueObjectSP expr_value_sp; 12774838131bSGreg Clayton 1278bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1279bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 12804fc6cb9cSJim Ingham 1281b9556accSGreg Clayton if (log) 12827730b9a4SJim Ingham log->Printf("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr); 1283b9556accSGreg Clayton 1284dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 12857730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 12867730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 12877730b9a4SJim Ingham 1288b9c1b51eSKate Stone if (target && process) { 12897fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1290b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 12917730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1292b9c1b51eSKate Stone if (frame) { 12938f7db52dSJim Ingham std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace; 1294b9c1b51eSKate Stone if (target->GetDisplayExpressionsInCrashlogs()) { 12951ba7c4d0SGreg Clayton StreamString frame_description; 1296d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&frame_description); 12978f7db52dSJim Ingham stack_trace = llvm::make_unique<llvm::PrettyStackTraceFormat>( 1298b9c1b51eSKate Stone "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value " 1299b9c1b51eSKate Stone "= %u) %s", 1300b9c1b51eSKate Stone expr, options.GetFetchDynamicValue(), 1301c156427dSZachary Turner frame_description.GetData()); 1302fb6621efSGreg Clayton } 1303fb6621efSGreg Clayton 1304b9c1b51eSKate Stone exe_results = target->EvaluateExpression(expr, frame, expr_value_sp, 130535e1bda6SJim Ingham options.ref()); 1306e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1307b9c1b51eSKate Stone } else { 1308c9858e4dSGreg Clayton if (log) 1309b9c1b51eSKate Stone log->Printf("SBFrame::EvaluateExpression () => error: could not " 1310b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 13117730b9a4SJim Ingham } 1312b9c1b51eSKate Stone } else { 13137730b9a4SJim Ingham if (log) 1314b9c1b51eSKate Stone log->Printf( 1315b9c1b51eSKate Stone "SBFrame::EvaluateExpression () => error: process is running"); 1316c9858e4dSGreg Clayton } 13177fdf9ef1SGreg Clayton } 13184838131bSGreg Clayton 1319cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1320a162ebafSSean Callanan if (expr_log) 1321b9c1b51eSKate Stone expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is " 1322b9c1b51eSKate Stone "%s, summary %s **", 1323324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 1324a162ebafSSean Callanan 13254838131bSGreg Clayton if (log) 1326b9c1b51eSKate Stone log->Printf("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) " 1327b9c1b51eSKate Stone "(execution result=%d)", 1328324a1036SSaleem Abdulrasool static_cast<void *>(frame), expr, 1329324a1036SSaleem Abdulrasool static_cast<void *>(expr_value_sp.get()), exe_results); 1330cf7e2dc0SJason Molenda #endif 13314838131bSGreg Clayton 1332cfd1acedSGreg Clayton return expr_result; 13331d3afba3SGreg Clayton } 1334316d498bSGreg Clayton 1335b9c1b51eSKate Stone bool SBFrame::IsInlined() { 133605f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->IsInlined(); 133705f75e9fSOleksiy Vyalov } 133805f75e9fSOleksiy Vyalov 1339b9c1b51eSKate Stone bool SBFrame::IsInlined() const { 13405160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1341c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1342c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1343c481c7eeSJim Ingham 1344dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1345d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 13467730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1347b9c1b51eSKate Stone if (target && process) { 13487fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1349b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 13507730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1351b9c1b51eSKate Stone if (frame) { 13527fdf9ef1SGreg Clayton 1353d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1354316d498bSGreg Clayton if (block) 1355dbb0abbfSEugene Zelenko return block->GetContainingInlinedBlock() != nullptr; 1356b9c1b51eSKate Stone } else { 1357c9858e4dSGreg Clayton if (log) 1358b9c1b51eSKate Stone log->Printf("SBFrame::IsInlined () => error: could not reconstruct " 1359b9c1b51eSKate Stone "frame object for this SBFrame."); 13607730b9a4SJim Ingham } 1361b9c1b51eSKate Stone } else { 13627730b9a4SJim Ingham if (log) 13637730b9a4SJim Ingham log->Printf("SBFrame::IsInlined () => error: process is running"); 1364c9858e4dSGreg Clayton } 13657fdf9ef1SGreg Clayton } 1366316d498bSGreg Clayton return false; 1367316d498bSGreg Clayton } 1368316d498bSGreg Clayton 1369b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() { 137005f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->GetFunctionName(); 137105f75e9fSOleksiy Vyalov } 137205f75e9fSOleksiy Vyalov 1373*bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const { 1374*bdbdd229SJim Ingham std::unique_lock<std::recursive_mutex> lock; 1375*bdbdd229SJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1376*bdbdd229SJim Ingham 1377*bdbdd229SJim Ingham StackFrame *frame = nullptr; 1378*bdbdd229SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1379*bdbdd229SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1380*bdbdd229SJim Ingham if (target && process) { 1381*bdbdd229SJim Ingham Process::StopLocker stop_locker; 1382*bdbdd229SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) { 1383*bdbdd229SJim Ingham frame = exe_ctx.GetFramePtr(); 1384*bdbdd229SJim Ingham if (frame) { 1385*bdbdd229SJim Ingham return frame->GuessLanguage(); 1386*bdbdd229SJim Ingham } 1387*bdbdd229SJim Ingham } 1388*bdbdd229SJim Ingham } 1389*bdbdd229SJim Ingham return eLanguageTypeUnknown; 1390*bdbdd229SJim Ingham } 1391*bdbdd229SJim Ingham 1392b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const { 13935160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1394dbb0abbfSEugene Zelenko const char *name = nullptr; 1395c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1396c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1397c481c7eeSJim Ingham 1398dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1399d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 14007730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1401b9c1b51eSKate Stone if (target && process) { 14027fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1403b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 14047730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1405b9c1b51eSKate Stone if (frame) { 1406b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1407b9c1b51eSKate Stone eSymbolContextBlock | 1408b9c1b51eSKate Stone eSymbolContextSymbol)); 1409b9c1b51eSKate Stone if (sc.block) { 1410316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1411b9c1b51eSKate Stone if (inlined_block) { 1412b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1413b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1414b9c1b51eSKate Stone name = 1415b9c1b51eSKate Stone inlined_info->GetName(sc.function->GetLanguage()).AsCString(); 1416316d498bSGreg Clayton } 1417316d498bSGreg Clayton } 1418316d498bSGreg Clayton 1419b9c1b51eSKate Stone if (name == nullptr) { 1420316d498bSGreg Clayton if (sc.function) 1421316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1422316d498bSGreg Clayton } 1423316d498bSGreg Clayton 1424b9c1b51eSKate Stone if (name == nullptr) { 1425316d498bSGreg Clayton if (sc.symbol) 1426316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1427316d498bSGreg Clayton } 1428b9c1b51eSKate Stone } else { 1429c9858e4dSGreg Clayton if (log) 1430b9c1b51eSKate Stone log->Printf("SBFrame::GetFunctionName () => error: could not " 1431b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 14327730b9a4SJim Ingham } 1433b9c1b51eSKate Stone } else { 14347730b9a4SJim Ingham if (log) 14357730b9a4SJim Ingham log->Printf("SBFrame::GetFunctionName() => error: process is running"); 1436c9858e4dSGreg Clayton } 14377fdf9ef1SGreg Clayton } 1438316d498bSGreg Clayton return name; 1439316d498bSGreg Clayton } 1440c1f705c2SEnrico Granata 1441b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() { 1442c1f705c2SEnrico Granata Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1443dbb0abbfSEugene Zelenko const char *name = nullptr; 1444c481c7eeSJim Ingham 1445c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1446c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1447c481c7eeSJim Ingham 1448dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1449c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1450c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 1451b9c1b51eSKate Stone if (target && process) { 1452c1f705c2SEnrico Granata Process::StopLocker stop_locker; 1453b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1454c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr(); 1455b9c1b51eSKate Stone if (frame) { 1456b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1457b9c1b51eSKate Stone eSymbolContextBlock | 1458b9c1b51eSKate Stone eSymbolContextSymbol)); 1459b9c1b51eSKate Stone if (sc.block) { 1460c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1461b9c1b51eSKate Stone if (inlined_block) { 1462b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1463b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1464b9c1b51eSKate Stone name = inlined_info->GetDisplayName(sc.function->GetLanguage()) 1465b9c1b51eSKate Stone .AsCString(); 1466c1f705c2SEnrico Granata } 1467c1f705c2SEnrico Granata } 1468c1f705c2SEnrico Granata 1469b9c1b51eSKate Stone if (name == nullptr) { 1470c1f705c2SEnrico Granata if (sc.function) 1471c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString(); 1472c1f705c2SEnrico Granata } 1473c1f705c2SEnrico Granata 1474b9c1b51eSKate Stone if (name == nullptr) { 1475c1f705c2SEnrico Granata if (sc.symbol) 1476c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString(); 1477c1f705c2SEnrico Granata } 1478b9c1b51eSKate Stone } else { 1479c1f705c2SEnrico Granata if (log) 1480b9c1b51eSKate Stone log->Printf("SBFrame::GetDisplayFunctionName () => error: could not " 1481b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 1482c1f705c2SEnrico Granata } 1483b9c1b51eSKate Stone } else { 1484c1f705c2SEnrico Granata if (log) 1485b9c1b51eSKate Stone log->Printf( 1486b9c1b51eSKate Stone "SBFrame::GetDisplayFunctionName() => error: process is running"); 1487c1f705c2SEnrico Granata } 1488c1f705c2SEnrico Granata } 1489c1f705c2SEnrico Granata return name; 1490c1f705c2SEnrico Granata } 1491