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( 42204803b3eSTatyana Krasnukha target, AddressClass::eCode); 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; 60997206d57SZachary Turner Status 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) { 669*e23d0b63SShafik Yaghmour value_sp = frame->FindVariable(ConstString(name)); 67030fdc8d8SChris Lattner 671*e23d0b63SShafik Yaghmour if (value_sp) 672e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 673b9c1b51eSKate Stone } else { 674c9858e4dSGreg Clayton if (log) 675b9c1b51eSKate Stone log->Printf("SBFrame::FindVariable () => error: could not " 676b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 6777730b9a4SJim Ingham } 678b9c1b51eSKate Stone } else { 6797730b9a4SJim Ingham if (log) 6807730b9a4SJim Ingham log->Printf("SBFrame::FindVariable () => error: process is running"); 681c9858e4dSGreg Clayton } 682316d498bSGreg Clayton } 683316d498bSGreg Clayton 6844838131bSGreg Clayton if (log) 68569b582faSGreg Clayton log->Printf("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 686324a1036SSaleem Abdulrasool static_cast<void *>(frame), name, 687324a1036SSaleem Abdulrasool static_cast<void *>(value_sp.get())); 6884838131bSGreg Clayton 689dde9cff3SCaroline Tice return sb_value; 690dde9cff3SCaroline Tice } 691dde9cff3SCaroline Tice 692b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) { 693316d498bSGreg Clayton SBValue value; 694c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 695c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 696c481c7eeSJim Ingham 697b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 698d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 699b9c1b51eSKate Stone if (frame && target) { 700b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 701b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 702316d498bSGreg Clayton value = FindValue(name, value_type, use_dynamic); 703316d498bSGreg Clayton } 704316d498bSGreg Clayton return value; 70578a685aaSJim Ingham } 70678a685aaSJim Ingham 707b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type, 708b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 7095160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 71069b582faSGreg Clayton SBValue sb_value; 7117730b9a4SJim Ingham 712b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 7137730b9a4SJim Ingham if (log) 7147730b9a4SJim Ingham log->Printf("SBFrame::FindValue called with empty name."); 7157730b9a4SJim Ingham return sb_value; 7167730b9a4SJim Ingham } 7177730b9a4SJim Ingham 71881e871edSGreg Clayton ValueObjectSP value_sp; 719bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 720bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7214fc6cb9cSJim Ingham 722dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 723d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7247730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 725b9c1b51eSKate Stone if (target && process) { 7267fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 727b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 7287730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 729b9c1b51eSKate Stone if (frame) { 7308a2a0dfbSEnrico Granata VariableList variable_list; 7318a2a0dfbSEnrico Granata 732b9c1b51eSKate Stone switch (value_type) { 73369b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 73469b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 73569b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 73669b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 73763a27afaSGreg Clayton case eValueTypeVariableThreadLocal: // thread local variables 73869b582faSGreg Clayton { 739d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 74072eff18aSGreg Clayton 74172eff18aSGreg Clayton const bool can_create = true; 74272eff18aSGreg Clayton const bool get_parent_variables = true; 74372eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 74472eff18aSGreg Clayton 7450efb51a0SChaoren Lin if (sc.block) 746b9c1b51eSKate Stone sc.block->AppendVariables( 747b9c1b51eSKate Stone can_create, get_parent_variables, 748b9c1b51eSKate Stone stop_if_block_is_inlined_function, 749b9c1b51eSKate Stone [frame](Variable *v) { return v->IsInScope(frame); }, 750b9c1b51eSKate Stone &variable_list); 751b9c1b51eSKate Stone if (value_type == eValueTypeVariableGlobal) { 7528a2a0dfbSEnrico Granata const bool get_file_globals = true; 7538a2a0dfbSEnrico Granata VariableList *frame_vars = frame->GetVariableList(get_file_globals); 7548a2a0dfbSEnrico Granata if (frame_vars) 7558a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 7568a2a0dfbSEnrico Granata } 75769b582faSGreg Clayton ConstString const_name(name); 758b9c1b51eSKate Stone VariableSP variable_sp( 759b9c1b51eSKate Stone variable_list.FindVariable(const_name, value_type)); 760b9c1b51eSKate Stone if (variable_sp) { 761b9c1b51eSKate Stone value_sp = frame->GetValueObjectForFrameVariable(variable_sp, 762b9c1b51eSKate Stone eNoDynamicValues); 763e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 76430fdc8d8SChris Lattner } 765b9c1b51eSKate Stone } break; 76669b582faSGreg Clayton 76769b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 76869b582faSGreg Clayton { 769d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 770b9c1b51eSKate Stone if (reg_ctx) { 77169b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 772b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 773b9c1b51eSKate Stone const RegisterInfo *reg_info = 774b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 77569b582faSGreg Clayton if (reg_info && 77669b582faSGreg Clayton ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 777b9c1b51eSKate Stone (reg_info->alt_name && 778b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 779d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 78081e871edSGreg Clayton sb_value.SetSP(value_sp); 78181e871edSGreg Clayton break; 78269b582faSGreg Clayton } 78369b582faSGreg Clayton } 78469b582faSGreg Clayton } 785b9c1b51eSKate Stone } break; 78669b582faSGreg Clayton 787b9c1b51eSKate Stone case eValueTypeRegisterSet: // A collection of stack frame register 788b9c1b51eSKate Stone // values 78969b582faSGreg Clayton { 790d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 791b9c1b51eSKate Stone if (reg_ctx) { 79269b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 793b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 79469b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx); 79569b582faSGreg Clayton if (reg_set && 79669b582faSGreg Clayton ((reg_set->name && strcasecmp(reg_set->name, name) == 0) || 797b9c1b51eSKate Stone (reg_set->short_name && 798b9c1b51eSKate Stone strcasecmp(reg_set->short_name, name) == 0))) { 799b9c1b51eSKate Stone value_sp = 800b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx); 80181e871edSGreg Clayton sb_value.SetSP(value_sp); 80281e871edSGreg Clayton break; 80369b582faSGreg Clayton } 80469b582faSGreg Clayton } 80569b582faSGreg Clayton } 806b9c1b51eSKate Stone } break; 80769b582faSGreg Clayton 80869b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 80969b582faSGreg Clayton { 81069b582faSGreg Clayton ConstString const_name(name); 811b9c1b51eSKate Stone ExpressionVariableSP expr_var_sp( 812b9c1b51eSKate Stone target->GetPersistentVariable(const_name)); 813b9c1b51eSKate Stone if (expr_var_sp) { 81481e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 815e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 81681e871edSGreg Clayton } 817b9c1b51eSKate Stone } break; 81869b582faSGreg Clayton 81969b582faSGreg Clayton default: 82069b582faSGreg Clayton break; 82169b582faSGreg Clayton } 822b9c1b51eSKate Stone } else { 823c9858e4dSGreg Clayton if (log) 824b9c1b51eSKate Stone log->Printf("SBFrame::FindValue () => error: could not reconstruct " 825b9c1b51eSKate Stone "frame object for this SBFrame."); 8267730b9a4SJim Ingham } 827b9c1b51eSKate Stone } else { 8287730b9a4SJim Ingham if (log) 8297730b9a4SJim Ingham log->Printf("SBFrame::FindValue () => error: process is running"); 830c9858e4dSGreg Clayton } 8317fdf9ef1SGreg Clayton } 832dde9cff3SCaroline Tice 8334838131bSGreg Clayton if (log) 834b9c1b51eSKate Stone log->Printf("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) " 835b9c1b51eSKate Stone "=> SBValue(%p)", 836324a1036SSaleem Abdulrasool static_cast<void *>(frame), name, value_type, 837324a1036SSaleem Abdulrasool static_cast<void *>(value_sp.get())); 8384838131bSGreg Clayton 839dde9cff3SCaroline Tice return sb_value; 840dde9cff3SCaroline Tice } 841dde9cff3SCaroline Tice 842b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const { 843b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 844b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 84535e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 84635e2ab60SJohnny Chen } 84735e2ab60SJohnny Chen 848b9c1b51eSKate Stone bool SBFrame::operator==(const SBFrame &rhs) const { return IsEqual(rhs); } 84930fdc8d8SChris Lattner 850b9c1b51eSKate Stone bool SBFrame::operator!=(const SBFrame &rhs) const { return !IsEqual(rhs); } 85130fdc8d8SChris Lattner 852b9c1b51eSKate Stone SBThread SBFrame::GetThread() const { 8535160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 854ceb6b139SCaroline Tice 855c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 856c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 857c481c7eeSJim Ingham 858d9e416c0SGreg Clayton ThreadSP thread_sp(exe_ctx.GetThreadSP()); 859d9e416c0SGreg Clayton SBThread sb_thread(thread_sp); 860ceb6b139SCaroline Tice 861b9c1b51eSKate Stone if (log) { 862750cd175SCaroline Tice SBStream sstr; 863750cd175SCaroline Tice sb_thread.GetDescription(sstr); 864d9e416c0SGreg Clayton log->Printf("SBFrame(%p)::GetThread () => SBThread(%p): %s", 865324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetFramePtr()), 866324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get()), sstr.GetData()); 867750cd175SCaroline Tice } 868ceb6b139SCaroline Tice 86930fdc8d8SChris Lattner return sb_thread; 87030fdc8d8SChris Lattner } 87130fdc8d8SChris Lattner 872b9c1b51eSKate Stone const char *SBFrame::Disassemble() const { 8735160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 874dbb0abbfSEugene Zelenko const char *disassembly = nullptr; 875bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 876bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 8774fc6cb9cSJim Ingham 878dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 879d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 8807730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 881b9c1b51eSKate Stone if (target && process) { 8827fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 883b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 8847730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 885b9c1b51eSKate Stone if (frame) { 886d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 887b9c1b51eSKate Stone } else { 888c9858e4dSGreg Clayton if (log) 889b9c1b51eSKate Stone log->Printf("SBFrame::Disassemble () => error: could not reconstruct " 890b9c1b51eSKate Stone "frame object for this SBFrame."); 8917730b9a4SJim Ingham } 892b9c1b51eSKate Stone } else { 8937730b9a4SJim Ingham if (log) 8947730b9a4SJim Ingham log->Printf("SBFrame::Disassemble () => error: process is running"); 8957fdf9ef1SGreg Clayton } 896c9858e4dSGreg Clayton } 8974838131bSGreg Clayton 8984838131bSGreg Clayton if (log) 899b9c1b51eSKate Stone log->Printf("SBFrame(%p)::Disassemble () => %s", static_cast<void *>(frame), 900b9c1b51eSKate Stone disassembly); 9014838131bSGreg Clayton 9024838131bSGreg Clayton return disassembly; 90330fdc8d8SChris Lattner } 90430fdc8d8SChris Lattner 905b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics, 906b9c1b51eSKate Stone bool in_scope_only) { 907316d498bSGreg Clayton SBValueList value_list; 908c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 909c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 910c481c7eeSJim Ingham 911b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 912d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 913b9c1b51eSKate Stone if (frame && target) { 914b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 915b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 916b9c1b51eSKate Stone const bool include_runtime_support_values = 917b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 91851f96eebSZachary Turner 91951f96eebSZachary Turner SBVariablesOptions options; 92051f96eebSZachary Turner options.SetIncludeArguments(arguments); 92151f96eebSZachary Turner options.SetIncludeLocals(locals); 92251f96eebSZachary Turner options.SetIncludeStatics(statics); 92351f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 92451f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 92551f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 92651f96eebSZachary Turner 92751f96eebSZachary Turner value_list = GetVariables(options); 928316d498bSGreg Clayton } 929316d498bSGreg Clayton return value_list; 93078a685aaSJim Ingham } 93178a685aaSJim Ingham 932b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals, 933b9c1b51eSKate Stone bool statics, bool in_scope_only, 934b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 935c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 936c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 937c481c7eeSJim Ingham 938560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 939b9c1b51eSKate Stone const bool include_runtime_support_values = 940b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 94151f96eebSZachary Turner SBVariablesOptions options; 94251f96eebSZachary Turner options.SetIncludeArguments(arguments); 94351f96eebSZachary Turner options.SetIncludeLocals(locals); 94451f96eebSZachary Turner options.SetIncludeStatics(statics); 94551f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 94651f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 94751f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 94851f96eebSZachary Turner return GetVariables(options); 949560558ebSEnrico Granata } 950560558ebSEnrico Granata 951b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) { 9525160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 953ceb6b139SCaroline Tice 954b9556accSGreg Clayton SBValueList value_list; 955bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 956bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9574fc6cb9cSJim Ingham 958dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 959d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 960b9556accSGreg Clayton 96151f96eebSZachary Turner const bool statics = options.GetIncludeStatics(); 96251f96eebSZachary Turner const bool arguments = options.GetIncludeArguments(); 96351f96eebSZachary Turner const bool locals = options.GetIncludeLocals(); 96451f96eebSZachary Turner const bool in_scope_only = options.GetInScopeOnly(); 965b9c1b51eSKate Stone const bool include_runtime_support_values = 966b9c1b51eSKate Stone options.GetIncludeRuntimeSupportValues(); 96751f96eebSZachary Turner const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 96851f96eebSZachary Turner 969ceb6b139SCaroline Tice if (log) 970b9c1b51eSKate Stone log->Printf("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, " 971b9c1b51eSKate Stone "in_scope_only=%i runtime=%i dynamic=%i)", 972b9c1b51eSKate Stone arguments, locals, statics, in_scope_only, 97351f96eebSZachary Turner include_runtime_support_values, use_dynamic); 974ceb6b139SCaroline Tice 975349213f9SGreg Clayton std::set<VariableSP> variable_set; 9767730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 977b9c1b51eSKate Stone if (target && process) { 9787fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 979b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9807730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 981b9c1b51eSKate Stone if (frame) { 98230fdc8d8SChris Lattner size_t i; 983dbb0abbfSEugene Zelenko VariableList *variable_list = nullptr; 984d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 985b9c1b51eSKate Stone if (variable_list) { 98630fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 987b9c1b51eSKate Stone if (num_variables) { 988b9c1b51eSKate Stone for (i = 0; i < num_variables; ++i) { 98930fdc8d8SChris Lattner VariableSP variable_sp(variable_list->GetVariableAtIndex(i)); 990b9c1b51eSKate Stone if (variable_sp) { 99130fdc8d8SChris Lattner bool add_variable = false; 992b9c1b51eSKate Stone switch (variable_sp->GetScope()) { 99330fdc8d8SChris Lattner case eValueTypeVariableGlobal: 99430fdc8d8SChris Lattner case eValueTypeVariableStatic: 99563a27afaSGreg Clayton case eValueTypeVariableThreadLocal: 99630fdc8d8SChris Lattner add_variable = statics; 99730fdc8d8SChris Lattner break; 99830fdc8d8SChris Lattner 99930fdc8d8SChris Lattner case eValueTypeVariableArgument: 100030fdc8d8SChris Lattner add_variable = arguments; 100130fdc8d8SChris Lattner break; 100230fdc8d8SChris Lattner 100330fdc8d8SChris Lattner case eValueTypeVariableLocal: 100430fdc8d8SChris Lattner add_variable = locals; 100530fdc8d8SChris Lattner break; 1006c982c768SGreg Clayton 1007c982c768SGreg Clayton default: 1008c982c768SGreg Clayton break; 100930fdc8d8SChris Lattner } 1010b9c1b51eSKate Stone if (add_variable) { 1011349213f9SGreg Clayton // Only add variables once so we don't end up with duplicates 1012349213f9SGreg Clayton if (variable_set.find(variable_sp) == variable_set.end()) 1013349213f9SGreg Clayton variable_set.insert(variable_sp); 1014349213f9SGreg Clayton else 1015349213f9SGreg Clayton continue; 1016349213f9SGreg Clayton 1017d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 101830fdc8d8SChris Lattner continue; 101930fdc8d8SChris Lattner 1020b9c1b51eSKate Stone ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable( 1021b9c1b51eSKate Stone variable_sp, eNoDynamicValues)); 1022560558ebSEnrico Granata 1023b9c1b51eSKate Stone if (!include_runtime_support_values && valobj_sp != nullptr && 1024dbb0abbfSEugene Zelenko valobj_sp->IsRuntimeSupportValue()) 1025560558ebSEnrico Granata continue; 1026560558ebSEnrico Granata 1027e3e91517SEnrico Granata SBValue value_sb; 1028e3e91517SEnrico Granata value_sb.SetSP(valobj_sp, use_dynamic); 1029e3e91517SEnrico Granata value_list.Append(value_sb); 103030fdc8d8SChris Lattner } 103130fdc8d8SChris Lattner } 103230fdc8d8SChris Lattner } 103330fdc8d8SChris Lattner } 103430fdc8d8SChris Lattner } 1035b9c1b51eSKate Stone } else { 1036c9858e4dSGreg Clayton if (log) 1037b9c1b51eSKate Stone log->Printf("SBFrame::GetVariables () => error: could not " 1038b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 10397730b9a4SJim Ingham } 1040b9c1b51eSKate Stone } else { 10417730b9a4SJim Ingham if (log) 10427730b9a4SJim Ingham log->Printf("SBFrame::GetVariables () => error: process is running"); 1043c9858e4dSGreg Clayton } 10447fdf9ef1SGreg Clayton } 1045ceb6b139SCaroline Tice 1046ceb6b139SCaroline Tice if (log) 1047324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", 1048324a1036SSaleem Abdulrasool static_cast<void *>(frame), 1049324a1036SSaleem Abdulrasool static_cast<void *>(value_list.opaque_ptr())); 1050ceb6b139SCaroline Tice 105130fdc8d8SChris Lattner return value_list; 105230fdc8d8SChris Lattner } 105330fdc8d8SChris Lattner 1054b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() { 10555160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1056ceb6b139SCaroline Tice 105730fdc8d8SChris Lattner SBValueList value_list; 1058bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1059bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 10604fc6cb9cSJim Ingham 1061dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1062d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 10637730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1064b9c1b51eSKate Stone if (target && process) { 10657fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1066b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 10677730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1068b9c1b51eSKate Stone if (frame) { 1069d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 1070b9c1b51eSKate Stone if (reg_ctx) { 107130fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 1072b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 1073b9c1b51eSKate Stone value_list.Append( 1074b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx)); 107530fdc8d8SChris Lattner } 107630fdc8d8SChris Lattner } 1077b9c1b51eSKate Stone } else { 1078c9858e4dSGreg Clayton if (log) 1079b9c1b51eSKate Stone log->Printf("SBFrame::GetRegisters () => error: could not " 1080b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 10817730b9a4SJim Ingham } 1082b9c1b51eSKate Stone } else { 10837730b9a4SJim Ingham if (log) 10847730b9a4SJim Ingham log->Printf("SBFrame::GetRegisters () => error: process is running"); 1085c9858e4dSGreg Clayton } 10867fdf9ef1SGreg Clayton } 1087ceb6b139SCaroline Tice 1088ceb6b139SCaroline Tice if (log) 1089324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetRegisters () => SBValueList(%p)", 1090324a1036SSaleem Abdulrasool static_cast<void *>(frame), 1091324a1036SSaleem Abdulrasool static_cast<void *>(value_list.opaque_ptr())); 1092ceb6b139SCaroline Tice 109330fdc8d8SChris Lattner return value_list; 109430fdc8d8SChris Lattner } 109530fdc8d8SChris Lattner 1096b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) { 1097ad9a53c5SJason Molenda Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1098ad9a53c5SJason Molenda 1099ad9a53c5SJason Molenda SBValue result; 1100ad9a53c5SJason Molenda ValueObjectSP value_sp; 1101bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1102bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1103ad9a53c5SJason Molenda 1104dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1105ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 1106ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1107b9c1b51eSKate Stone if (target && process) { 1108ad9a53c5SJason Molenda Process::StopLocker stop_locker; 1109b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1110ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 1111b9c1b51eSKate Stone if (frame) { 1112ad9a53c5SJason Molenda RegisterContextSP reg_ctx(frame->GetRegisterContext()); 1113b9c1b51eSKate Stone if (reg_ctx) { 1114ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 1115b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 1116b9c1b51eSKate Stone const RegisterInfo *reg_info = 1117b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 1118ad9a53c5SJason Molenda if (reg_info && 1119ad9a53c5SJason Molenda ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 1120b9c1b51eSKate Stone (reg_info->alt_name && 1121b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 1122ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 1123ad9a53c5SJason Molenda result.SetSP(value_sp); 1124ad9a53c5SJason Molenda break; 1125ad9a53c5SJason Molenda } 1126ad9a53c5SJason Molenda } 1127ad9a53c5SJason Molenda } 1128b9c1b51eSKate Stone } else { 1129ad9a53c5SJason Molenda if (log) 1130b9c1b51eSKate Stone log->Printf("SBFrame::FindRegister () => error: could not " 1131b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 1132ad9a53c5SJason Molenda } 1133b9c1b51eSKate Stone } else { 1134ad9a53c5SJason Molenda if (log) 11355d353842SJason Molenda log->Printf("SBFrame::FindRegister () => error: process is running"); 1136ad9a53c5SJason Molenda } 1137ad9a53c5SJason Molenda } 1138ad9a53c5SJason Molenda 1139ad9a53c5SJason Molenda if (log) 1140324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::FindRegister () => SBValue(%p)", 1141324a1036SSaleem Abdulrasool static_cast<void *>(frame), 1142324a1036SSaleem Abdulrasool static_cast<void *>(value_sp.get())); 1143ad9a53c5SJason Molenda 1144ad9a53c5SJason Molenda return result; 1145ad9a53c5SJason Molenda } 1146ad9a53c5SJason Molenda 1147b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) { 11485160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1149da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1150da7bc7d0SGreg Clayton 1151bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1152bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11534fc6cb9cSJim Ingham 1154b57e4a1bSJason Molenda StackFrame *frame; 1155d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 11567730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1157b9c1b51eSKate Stone if (target && process) { 11587fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1159b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11607730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1161b9c1b51eSKate Stone if (frame) { 1162d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&strm); 1163b9c1b51eSKate Stone } else { 1164c9858e4dSGreg Clayton if (log) 1165b9c1b51eSKate Stone log->Printf("SBFrame::GetDescription () => error: could not " 1166b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 11677730b9a4SJim Ingham } 1168b9c1b51eSKate Stone } else { 11697730b9a4SJim Ingham if (log) 11707730b9a4SJim Ingham log->Printf("SBFrame::GetDescription () => error: process is running"); 1171c9858e4dSGreg Clayton } 1172c9858e4dSGreg Clayton 1173b9c1b51eSKate Stone } else 1174da7bc7d0SGreg Clayton strm.PutCString("No value"); 1175dde9cff3SCaroline Tice 1176dde9cff3SCaroline Tice return true; 1177dde9cff3SCaroline Tice } 11781d3afba3SGreg Clayton 1179b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) { 1180316d498bSGreg Clayton SBValue result; 1181c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1182c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1183c481c7eeSJim Ingham 1184b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1185d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1186b9c1b51eSKate Stone if (frame && target) { 118735e1bda6SJim Ingham SBExpressionOptions options; 1188b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value = 1189b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 1190cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 119135e1bda6SJim Ingham options.SetUnwindOnError(true); 119224785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1193998c8a1cSRyan Brown if (target->GetLanguage() != eLanguageTypeUnknown) 1194998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1195998c8a1cSRyan Brown else 1196998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 119735e1bda6SJim Ingham return EvaluateExpression(expr, options); 1198316d498bSGreg Clayton } 1199316d498bSGreg Clayton return result; 120078a685aaSJim Ingham } 120178a685aaSJim Ingham 120278a685aaSJim Ingham SBValue 1203b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr, 1204b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value) { 120535e1bda6SJim Ingham SBExpressionOptions options; 1206cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 120735e1bda6SJim Ingham options.SetUnwindOnError(true); 120824785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1209c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1210c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1211c481c7eeSJim Ingham 1212998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1213998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1214998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1215998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1216998c8a1cSRyan Brown else if (frame) 1217998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 121835e1bda6SJim Ingham return EvaluateExpression(expr, options); 12197ba6e991SJim Ingham } 12207ba6e991SJim Ingham 1221b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr, 1222b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value, 1223b9c1b51eSKate Stone bool unwind_on_error) { 122435e1bda6SJim Ingham SBExpressionOptions options; 1225c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1226c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1227c481c7eeSJim Ingham 1228cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 122935e1bda6SJim Ingham options.SetUnwindOnError(unwind_on_error); 123024785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1231998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1232998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1233998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1234998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1235998c8a1cSRyan Brown else if (frame) 1236998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 123735e1bda6SJim Ingham return EvaluateExpression(expr, options); 123835e1bda6SJim Ingham } 123935e1bda6SJim Ingham 1240b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr, 1241b9c1b51eSKate Stone const SBExpressionOptions &options) { 12425160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 12434838131bSGreg Clayton 1244358efd65SSaleem Abdulrasool #ifndef LLDB_DISABLE_PYTHON 12455160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1246358efd65SSaleem Abdulrasool #endif 1247a162ebafSSean Callanan 12488646d3c1SJim Ingham ExpressionResults exe_results = eExpressionSetupError; 124969b582faSGreg Clayton SBValue expr_result; 12507730b9a4SJim Ingham 1251b9c1b51eSKate Stone if (expr == nullptr || expr[0] == '\0') { 12527730b9a4SJim Ingham if (log) 1253b9c1b51eSKate Stone log->Printf( 1254b9c1b51eSKate Stone "SBFrame::EvaluateExpression called with an empty expression"); 12557730b9a4SJim Ingham return expr_result; 12567730b9a4SJim Ingham } 12577730b9a4SJim Ingham 125881e871edSGreg Clayton ValueObjectSP expr_value_sp; 12594838131bSGreg Clayton 1260bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1261bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 12624fc6cb9cSJim Ingham 1263b9556accSGreg Clayton if (log) 12647730b9a4SJim Ingham log->Printf("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr); 1265b9556accSGreg Clayton 1266dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 12677730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 12687730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 12697730b9a4SJim Ingham 1270b9c1b51eSKate Stone if (target && process) { 12717fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1272b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 12737730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1274b9c1b51eSKate Stone if (frame) { 12758f7db52dSJim Ingham std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace; 1276b9c1b51eSKate Stone if (target->GetDisplayExpressionsInCrashlogs()) { 12771ba7c4d0SGreg Clayton StreamString frame_description; 1278d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&frame_description); 12798f7db52dSJim Ingham stack_trace = llvm::make_unique<llvm::PrettyStackTraceFormat>( 1280b9c1b51eSKate Stone "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value " 1281b9c1b51eSKate Stone "= %u) %s", 1282b9c1b51eSKate Stone expr, options.GetFetchDynamicValue(), 1283c156427dSZachary Turner frame_description.GetData()); 1284fb6621efSGreg Clayton } 1285fb6621efSGreg Clayton 1286b9c1b51eSKate Stone exe_results = target->EvaluateExpression(expr, frame, expr_value_sp, 128735e1bda6SJim Ingham options.ref()); 1288e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1289b9c1b51eSKate Stone } else { 1290c9858e4dSGreg Clayton if (log) 1291b9c1b51eSKate Stone log->Printf("SBFrame::EvaluateExpression () => error: could not " 1292b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 12937730b9a4SJim Ingham } 1294b9c1b51eSKate Stone } else { 12957730b9a4SJim Ingham if (log) 1296b9c1b51eSKate Stone log->Printf( 1297b9c1b51eSKate Stone "SBFrame::EvaluateExpression () => error: process is running"); 1298c9858e4dSGreg Clayton } 12997fdf9ef1SGreg Clayton } 13004838131bSGreg Clayton 1301cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1302a162ebafSSean Callanan if (expr_log) 1303b9c1b51eSKate Stone expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is " 1304b9c1b51eSKate Stone "%s, summary %s **", 1305324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 1306a162ebafSSean Callanan 13074838131bSGreg Clayton if (log) 1308b9c1b51eSKate Stone log->Printf("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) " 1309b9c1b51eSKate Stone "(execution result=%d)", 1310324a1036SSaleem Abdulrasool static_cast<void *>(frame), expr, 1311324a1036SSaleem Abdulrasool static_cast<void *>(expr_value_sp.get()), exe_results); 1312cf7e2dc0SJason Molenda #endif 13134838131bSGreg Clayton 1314cfd1acedSGreg Clayton return expr_result; 13151d3afba3SGreg Clayton } 1316316d498bSGreg Clayton 1317b9c1b51eSKate Stone bool SBFrame::IsInlined() { 131805f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->IsInlined(); 131905f75e9fSOleksiy Vyalov } 132005f75e9fSOleksiy Vyalov 1321b9c1b51eSKate Stone bool SBFrame::IsInlined() const { 13225160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1323c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1324c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1325c481c7eeSJim Ingham 1326dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1327d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 13287730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1329b9c1b51eSKate Stone if (target && process) { 13307fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1331b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 13327730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1333b9c1b51eSKate Stone if (frame) { 13347fdf9ef1SGreg Clayton 1335d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1336316d498bSGreg Clayton if (block) 1337dbb0abbfSEugene Zelenko return block->GetContainingInlinedBlock() != nullptr; 1338b9c1b51eSKate Stone } else { 1339c9858e4dSGreg Clayton if (log) 1340b9c1b51eSKate Stone log->Printf("SBFrame::IsInlined () => error: could not reconstruct " 1341b9c1b51eSKate Stone "frame object for this SBFrame."); 13427730b9a4SJim Ingham } 1343b9c1b51eSKate Stone } else { 13447730b9a4SJim Ingham if (log) 13457730b9a4SJim Ingham log->Printf("SBFrame::IsInlined () => error: process is running"); 1346c9858e4dSGreg Clayton } 13477fdf9ef1SGreg Clayton } 1348316d498bSGreg Clayton return false; 1349316d498bSGreg Clayton } 1350316d498bSGreg Clayton 1351b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() { 135205f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->GetFunctionName(); 135305f75e9fSOleksiy Vyalov } 135405f75e9fSOleksiy Vyalov 1355bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const { 1356bdbdd229SJim Ingham std::unique_lock<std::recursive_mutex> lock; 1357bdbdd229SJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1358bdbdd229SJim Ingham 1359bdbdd229SJim Ingham StackFrame *frame = nullptr; 1360bdbdd229SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1361bdbdd229SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1362bdbdd229SJim Ingham if (target && process) { 1363bdbdd229SJim Ingham Process::StopLocker stop_locker; 1364bdbdd229SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) { 1365bdbdd229SJim Ingham frame = exe_ctx.GetFramePtr(); 1366bdbdd229SJim Ingham if (frame) { 1367bdbdd229SJim Ingham return frame->GuessLanguage(); 1368bdbdd229SJim Ingham } 1369bdbdd229SJim Ingham } 1370bdbdd229SJim Ingham } 1371bdbdd229SJim Ingham return eLanguageTypeUnknown; 1372bdbdd229SJim Ingham } 1373bdbdd229SJim Ingham 1374b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const { 13755160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1376dbb0abbfSEugene Zelenko const char *name = nullptr; 1377c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1378c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1379c481c7eeSJim Ingham 1380dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1381d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 13827730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1383b9c1b51eSKate Stone if (target && process) { 13847fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1385b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 13867730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1387b9c1b51eSKate Stone if (frame) { 1388b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1389b9c1b51eSKate Stone eSymbolContextBlock | 1390b9c1b51eSKate Stone eSymbolContextSymbol)); 1391b9c1b51eSKate Stone if (sc.block) { 1392316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1393b9c1b51eSKate Stone if (inlined_block) { 1394b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1395b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1396b9c1b51eSKate Stone name = 1397b9c1b51eSKate Stone inlined_info->GetName(sc.function->GetLanguage()).AsCString(); 1398316d498bSGreg Clayton } 1399316d498bSGreg Clayton } 1400316d498bSGreg Clayton 1401b9c1b51eSKate Stone if (name == nullptr) { 1402316d498bSGreg Clayton if (sc.function) 1403316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1404316d498bSGreg Clayton } 1405316d498bSGreg Clayton 1406b9c1b51eSKate Stone if (name == nullptr) { 1407316d498bSGreg Clayton if (sc.symbol) 1408316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1409316d498bSGreg Clayton } 1410b9c1b51eSKate Stone } else { 1411c9858e4dSGreg Clayton if (log) 1412b9c1b51eSKate Stone log->Printf("SBFrame::GetFunctionName () => error: could not " 1413b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 14147730b9a4SJim Ingham } 1415b9c1b51eSKate Stone } else { 14167730b9a4SJim Ingham if (log) 14177730b9a4SJim Ingham log->Printf("SBFrame::GetFunctionName() => error: process is running"); 1418c9858e4dSGreg Clayton } 14197fdf9ef1SGreg Clayton } 1420316d498bSGreg Clayton return name; 1421316d498bSGreg Clayton } 1422c1f705c2SEnrico Granata 1423b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() { 1424c1f705c2SEnrico Granata Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1425dbb0abbfSEugene Zelenko const char *name = nullptr; 1426c481c7eeSJim Ingham 1427c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1428c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1429c481c7eeSJim Ingham 1430dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1431c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1432c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 1433b9c1b51eSKate Stone if (target && process) { 1434c1f705c2SEnrico Granata Process::StopLocker stop_locker; 1435b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1436c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr(); 1437b9c1b51eSKate Stone if (frame) { 1438b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1439b9c1b51eSKate Stone eSymbolContextBlock | 1440b9c1b51eSKate Stone eSymbolContextSymbol)); 1441b9c1b51eSKate Stone if (sc.block) { 1442c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1443b9c1b51eSKate Stone if (inlined_block) { 1444b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1445b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1446b9c1b51eSKate Stone name = inlined_info->GetDisplayName(sc.function->GetLanguage()) 1447b9c1b51eSKate Stone .AsCString(); 1448c1f705c2SEnrico Granata } 1449c1f705c2SEnrico Granata } 1450c1f705c2SEnrico Granata 1451b9c1b51eSKate Stone if (name == nullptr) { 1452c1f705c2SEnrico Granata if (sc.function) 1453c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString(); 1454c1f705c2SEnrico Granata } 1455c1f705c2SEnrico Granata 1456b9c1b51eSKate Stone if (name == nullptr) { 1457c1f705c2SEnrico Granata if (sc.symbol) 1458c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString(); 1459c1f705c2SEnrico Granata } 1460b9c1b51eSKate Stone } else { 1461c1f705c2SEnrico Granata if (log) 1462b9c1b51eSKate Stone log->Printf("SBFrame::GetDisplayFunctionName () => error: could not " 1463b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 1464c1f705c2SEnrico Granata } 1465b9c1b51eSKate Stone } else { 1466c1f705c2SEnrico Granata if (log) 1467b9c1b51eSKate Stone log->Printf( 1468b9c1b51eSKate Stone "SBFrame::GetDisplayFunctionName() => error: process is running"); 1469c1f705c2SEnrico Granata } 1470c1f705c2SEnrico Granata } 1471c1f705c2SEnrico Granata return name; 1472c1f705c2SEnrico Granata } 1473