130fdc8d8SChris Lattner //===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 930fdc8d8SChris Lattner #include <algorithm> 10349213f9SGreg Clayton #include <set> 11dbb0abbfSEugene Zelenko #include <string> 12dbb0abbfSEugene Zelenko 13dbb0abbfSEugene Zelenko #include "lldb/API/SBFrame.h" 1430fdc8d8SChris Lattner 1530fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1630fdc8d8SChris Lattner 17b9c1b51eSKate Stone #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h" 18*bd4bf82aSJonas Devlieghere #include "Utils.h" 1930fdc8d8SChris Lattner #include "lldb/Core/Address.h" 2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2130fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h" 2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h" 23151c032cSJim Ingham #include "lldb/Expression/UserExpression.h" 241ba7c4d0SGreg Clayton #include "lldb/Host/Host.h" 2530fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 261f746071SGreg Clayton #include "lldb/Symbol/Function.h" 271f746071SGreg Clayton #include "lldb/Symbol/Symbol.h" 2830fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 2930fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h" 30b9c1b51eSKate Stone #include "lldb/Symbol/VariableList.h" 3130fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h" 3230fdc8d8SChris Lattner #include "lldb/Target/Process.h" 3330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 34b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h" 3541ae8e74SKuba Mracek #include "lldb/Target/StackFrameRecognizer.h" 36b9556accSGreg Clayton #include "lldb/Target/StackID.h" 37b9c1b51eSKate Stone #include "lldb/Target/Target.h" 3830fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 39bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h" 406f9e6901SZachary Turner #include "lldb/Utility/Log.h" 41bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 4230fdc8d8SChris Lattner 434c5de699SEli Friedman #include "lldb/API/SBAddress.h" 44b9c1b51eSKate Stone #include "lldb/API/SBDebugger.h" 4535e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h" 46dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 474c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h" 484c5de699SEli Friedman #include "lldb/API/SBThread.h" 49b9c1b51eSKate Stone #include "lldb/API/SBValue.h" 5051f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h" 5130fdc8d8SChris Lattner 52237c3ed9SSean Callanan #include "llvm/Support/PrettyStackTrace.h" 53237c3ed9SSean Callanan 5430fdc8d8SChris Lattner using namespace lldb; 5530fdc8d8SChris Lattner using namespace lldb_private; 5630fdc8d8SChris Lattner 57b9c1b51eSKate Stone SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) {} 5830fdc8d8SChris Lattner 59b9c1b51eSKate Stone SBFrame::SBFrame(const StackFrameSP &lldb_object_sp) 60b9c1b51eSKate Stone : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) { 615160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 62ceb6b139SCaroline Tice 63b9c1b51eSKate Stone if (log) { 64ceb6b139SCaroline Tice SBStream sstr; 65ceb6b139SCaroline Tice GetDescription(sstr); 664838131bSGreg Clayton log->Printf("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s", 67324a1036SSaleem Abdulrasool static_cast<void *>(lldb_object_sp.get()), 68324a1036SSaleem Abdulrasool static_cast<void *>(lldb_object_sp.get()), sstr.GetData()); 69ceb6b139SCaroline Tice } 7030fdc8d8SChris Lattner } 7130fdc8d8SChris Lattner 72*bd4bf82aSJonas Devlieghere SBFrame::SBFrame(const SBFrame &rhs) : m_opaque_sp() { 73*bd4bf82aSJonas Devlieghere m_opaque_sp = clone(rhs.m_opaque_sp); 74*bd4bf82aSJonas Devlieghere } 75efabb123SGreg Clayton 76dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default; 77dbb0abbfSEugene Zelenko 78b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) { 79efabb123SGreg Clayton if (this != &rhs) 80*bd4bf82aSJonas Devlieghere m_opaque_sp = clone(rhs.m_opaque_sp); 81efabb123SGreg Clayton return *this; 82efabb123SGreg Clayton } 83efabb123SGreg Clayton 84b9c1b51eSKate Stone StackFrameSP SBFrame::GetFrameSP() const { 85dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP()); 86b9556accSGreg Clayton } 8730fdc8d8SChris Lattner 88b9c1b51eSKate Stone void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) { 897fdf9ef1SGreg Clayton return m_opaque_sp->SetFrameSP(lldb_object_sp); 90b9556accSGreg Clayton } 9130fdc8d8SChris Lattner 92b9c1b51eSKate Stone bool SBFrame::IsValid() const { 93bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 94bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 957fa7dc36SJim Ingham 967fa7dc36SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 977fa7dc36SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 98b9c1b51eSKate Stone if (target && process) { 997fa7dc36SJim Ingham Process::StopLocker stop_locker; 1007fa7dc36SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 101dbb0abbfSEugene Zelenko return GetFrameSP().get() != nullptr; 10230fdc8d8SChris Lattner } 10330fdc8d8SChris Lattner 1047fa7dc36SJim Ingham // Without a target & process we can't have a valid stack frame. 1057fa7dc36SJim Ingham return false; 1067fa7dc36SJim Ingham } 1077fa7dc36SJim Ingham 108b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const { 1095160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 11030fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 111bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 112bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 113991e4453SZachary Turner SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope); 114dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 115d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1167730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 117b9c1b51eSKate Stone if (target && process) { 1187fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 119b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1207730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 121b9c1b51eSKate Stone if (frame) { 122991e4453SZachary Turner sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext(scope)); 123b9c1b51eSKate Stone } else { 124c9858e4dSGreg Clayton if (log) 125b9c1b51eSKate Stone log->Printf("SBFrame::GetVariables () => error: could not " 126b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 1277730b9a4SJim Ingham } 128b9c1b51eSKate Stone } else { 1297730b9a4SJim Ingham if (log) 130b9c1b51eSKate Stone log->Printf( 131b9c1b51eSKate Stone "SBFrame::GetSymbolContext () => error: process is running"); 132c9858e4dSGreg Clayton } 1337fdf9ef1SGreg Clayton } 134ceb6b139SCaroline Tice 135ceb6b139SCaroline Tice if (log) 136b9c1b51eSKate Stone log->Printf("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => " 137b9c1b51eSKate Stone "SBSymbolContext(%p)", 138324a1036SSaleem Abdulrasool static_cast<void *>(frame), resolve_scope, 139324a1036SSaleem Abdulrasool static_cast<void *>(sb_sym_ctx.get())); 140ceb6b139SCaroline Tice 14130fdc8d8SChris Lattner return sb_sym_ctx; 14230fdc8d8SChris Lattner } 14330fdc8d8SChris Lattner 144b9c1b51eSKate Stone SBModule SBFrame::GetModule() const { 1455160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 14672eff18aSGreg Clayton SBModule sb_module; 147acdbe816SGreg Clayton ModuleSP module_sp; 148bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 149bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1504fc6cb9cSJim Ingham 151dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 152d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1537730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 154b9c1b51eSKate Stone if (target && process) { 1557fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 156b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1577730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 158b9c1b51eSKate Stone if (frame) { 159d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp; 160acdbe816SGreg Clayton sb_module.SetSP(module_sp); 161b9c1b51eSKate Stone } else { 162c9858e4dSGreg Clayton if (log) 163b9c1b51eSKate Stone log->Printf("SBFrame::GetModule () => error: could not reconstruct " 164b9c1b51eSKate Stone "frame object for this SBFrame."); 1657730b9a4SJim Ingham } 166b9c1b51eSKate Stone } else { 1677730b9a4SJim Ingham if (log) 1687730b9a4SJim Ingham log->Printf("SBFrame::GetModule () => error: process is running"); 169c9858e4dSGreg Clayton } 1707fdf9ef1SGreg Clayton } 17172eff18aSGreg Clayton 1724838131bSGreg Clayton if (log) 1734838131bSGreg Clayton log->Printf("SBFrame(%p)::GetModule () => SBModule(%p)", 174324a1036SSaleem Abdulrasool static_cast<void *>(frame), 175324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get())); 1764838131bSGreg Clayton 17730fdc8d8SChris Lattner return sb_module; 17830fdc8d8SChris Lattner } 17930fdc8d8SChris Lattner 180b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const { 1815160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 18272eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 183bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 184bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1854fc6cb9cSJim Ingham 186dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 187d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1887730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 189b9c1b51eSKate Stone if (target && process) { 1907fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 191b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1927730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 193b9c1b51eSKate Stone if (frame) { 194b9c1b51eSKate Stone sb_comp_unit.reset( 195b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit); 196b9c1b51eSKate Stone } else { 197ceb6b139SCaroline Tice if (log) 198b9c1b51eSKate Stone log->Printf("SBFrame::GetCompileUnit () => error: could not " 199b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 2007730b9a4SJim Ingham } 201b9c1b51eSKate Stone } else { 2027730b9a4SJim Ingham if (log) 2037730b9a4SJim Ingham log->Printf("SBFrame::GetCompileUnit () => error: process is running"); 204c9858e4dSGreg Clayton } 205c9858e4dSGreg Clayton } 206c9858e4dSGreg Clayton if (log) 207c9858e4dSGreg Clayton log->Printf("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)", 208324a1036SSaleem Abdulrasool static_cast<void *>(frame), 209324a1036SSaleem Abdulrasool static_cast<void *>(sb_comp_unit.get())); 210ceb6b139SCaroline Tice 21130fdc8d8SChris Lattner return sb_comp_unit; 21230fdc8d8SChris Lattner } 21330fdc8d8SChris Lattner 214b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const { 2155160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 21672eff18aSGreg Clayton SBFunction sb_function; 217bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 218bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2194fc6cb9cSJim Ingham 220dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 221d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2227730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 223b9c1b51eSKate Stone if (target && process) { 2247fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 225b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2267730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 227b9c1b51eSKate Stone if (frame) { 228b9c1b51eSKate Stone sb_function.reset( 229b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextFunction).function); 230b9c1b51eSKate Stone } else { 231c9858e4dSGreg Clayton if (log) 232b9c1b51eSKate Stone log->Printf("SBFrame::GetFunction () => error: could not reconstruct " 233b9c1b51eSKate Stone "frame object for this SBFrame."); 2347730b9a4SJim Ingham } 235b9c1b51eSKate Stone } else { 2367730b9a4SJim Ingham if (log) 2377730b9a4SJim Ingham log->Printf("SBFrame::GetFunction () => error: process is running"); 2387fdf9ef1SGreg Clayton } 239c9858e4dSGreg Clayton } 2404838131bSGreg Clayton if (log) 2414838131bSGreg Clayton log->Printf("SBFrame(%p)::GetFunction () => SBFunction(%p)", 242324a1036SSaleem Abdulrasool static_cast<void *>(frame), 243324a1036SSaleem Abdulrasool static_cast<void *>(sb_function.get())); 2444838131bSGreg Clayton 24530fdc8d8SChris Lattner return sb_function; 24630fdc8d8SChris Lattner } 24730fdc8d8SChris Lattner 248b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const { 2495160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 25072eff18aSGreg Clayton SBSymbol sb_symbol; 251bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 252bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2534fc6cb9cSJim Ingham 254dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 255d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2567730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 257b9c1b51eSKate Stone if (target && process) { 2587fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 259b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2607730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 261b9c1b51eSKate Stone if (frame) { 262d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol); 263b9c1b51eSKate Stone } else { 264c9858e4dSGreg Clayton if (log) 265b9c1b51eSKate Stone log->Printf("SBFrame::GetSymbol () => error: could not reconstruct " 266b9c1b51eSKate Stone "frame object for this SBFrame."); 2677730b9a4SJim Ingham } 268b9c1b51eSKate Stone } else { 2697730b9a4SJim Ingham if (log) 2707730b9a4SJim Ingham log->Printf("SBFrame::GetSymbol () => error: process is running"); 2717fdf9ef1SGreg Clayton } 272c9858e4dSGreg Clayton } 2734838131bSGreg Clayton if (log) 2744838131bSGreg Clayton log->Printf("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 275324a1036SSaleem Abdulrasool static_cast<void *>(frame), 276324a1036SSaleem Abdulrasool static_cast<void *>(sb_symbol.get())); 2773b06557eSGreg Clayton return sb_symbol; 2783b06557eSGreg Clayton } 2793b06557eSGreg Clayton 280b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const { 2815160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 28272eff18aSGreg Clayton SBBlock sb_block; 283bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 284bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2854fc6cb9cSJim Ingham 286dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 287d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2887730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 289b9c1b51eSKate Stone if (target && process) { 2907fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 291b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2927730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 293b9c1b51eSKate Stone if (frame) { 294d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block); 295b9c1b51eSKate Stone } else { 296c9858e4dSGreg Clayton if (log) 297b9c1b51eSKate Stone log->Printf("SBFrame::GetBlock () => error: could not reconstruct " 298b9c1b51eSKate Stone "frame object for this SBFrame."); 2997730b9a4SJim Ingham } 300b9c1b51eSKate Stone } else { 3017730b9a4SJim Ingham if (log) 302324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetBlock () => error: process is running", 303324a1036SSaleem Abdulrasool static_cast<void *>(frame)); 3047fdf9ef1SGreg Clayton } 305c9858e4dSGreg Clayton } 3064838131bSGreg Clayton if (log) 3074838131bSGreg Clayton log->Printf("SBFrame(%p)::GetBlock () => SBBlock(%p)", 308324a1036SSaleem Abdulrasool static_cast<void *>(frame), 309324a1036SSaleem Abdulrasool static_cast<void *>(sb_block.GetPtr())); 31030fdc8d8SChris Lattner return sb_block; 31130fdc8d8SChris Lattner } 31230fdc8d8SChris Lattner 313b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const { 31472eff18aSGreg Clayton SBBlock sb_block; 315bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 316bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3174fc6cb9cSJim Ingham 318dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 319d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3205160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3217730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 322b9c1b51eSKate Stone if (target && process) { 3237fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 324b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3257730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 326b9c1b51eSKate Stone if (frame) { 327d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock()); 328b9c1b51eSKate Stone } else { 329c9858e4dSGreg Clayton if (log) 330b9c1b51eSKate Stone log->Printf("SBFrame::GetFrameBlock () => error: could not " 331b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 3327730b9a4SJim Ingham } 333b9c1b51eSKate Stone } else { 3347730b9a4SJim Ingham if (log) 3357730b9a4SJim Ingham log->Printf("SBFrame::GetFrameBlock () => error: process is running"); 3367fdf9ef1SGreg Clayton } 337c9858e4dSGreg Clayton } 3384838131bSGreg Clayton if (log) 3394838131bSGreg Clayton log->Printf("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 340324a1036SSaleem Abdulrasool static_cast<void *>(frame), 341324a1036SSaleem Abdulrasool static_cast<void *>(sb_block.GetPtr())); 34295897c6aSGreg Clayton return sb_block; 34395897c6aSGreg Clayton } 34495897c6aSGreg Clayton 345b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const { 3465160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 34772eff18aSGreg Clayton SBLineEntry sb_line_entry; 348bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 349bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3504fc6cb9cSJim Ingham 351dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 352d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3537730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 354b9c1b51eSKate Stone if (target && process) { 3557fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 356b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3577730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 358b9c1b51eSKate Stone if (frame) { 359b9c1b51eSKate Stone sb_line_entry.SetLineEntry( 360b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextLineEntry).line_entry); 361b9c1b51eSKate Stone } else { 362c9858e4dSGreg Clayton if (log) 363b9c1b51eSKate Stone log->Printf("SBFrame::GetLineEntry () => error: could not " 364b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 3657730b9a4SJim Ingham } 366b9c1b51eSKate Stone } else { 3677730b9a4SJim Ingham if (log) 3687730b9a4SJim Ingham log->Printf("SBFrame::GetLineEntry () => error: process is running"); 3697fdf9ef1SGreg Clayton } 370c9858e4dSGreg Clayton } 3714838131bSGreg Clayton if (log) 3724838131bSGreg Clayton log->Printf("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 373324a1036SSaleem Abdulrasool static_cast<void *>(frame), 374324a1036SSaleem Abdulrasool static_cast<void *>(sb_line_entry.get())); 37530fdc8d8SChris Lattner return sb_line_entry; 37630fdc8d8SChris Lattner } 37730fdc8d8SChris Lattner 378b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const { 379b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 380b9556accSGreg Clayton 381c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 382c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 383c481c7eeSJim Ingham 384b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 3857fdf9ef1SGreg Clayton if (frame) 386d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex(); 3874838131bSGreg Clayton 3885160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3894838131bSGreg Clayton if (log) 390b9c1b51eSKate Stone log->Printf("SBFrame(%p)::GetFrameID () => %u", static_cast<void *>(frame), 391b9c1b51eSKate Stone frame_idx); 3924838131bSGreg Clayton return frame_idx; 39330fdc8d8SChris Lattner } 39430fdc8d8SChris Lattner 395b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const { 396c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 397c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 398c481c7eeSJim Ingham 399424a5dbcSGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 400424a5dbcSGreg Clayton if (frame) 401424a5dbcSGreg Clayton return frame->GetStackID().GetCallFrameAddress(); 402424a5dbcSGreg Clayton return LLDB_INVALID_ADDRESS; 403424a5dbcSGreg Clayton } 404424a5dbcSGreg Clayton 405b9c1b51eSKate Stone addr_t SBFrame::GetPC() const { 4065160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 40769b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 408bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 409bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4104fc6cb9cSJim Ingham 411dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 412d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4137730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 414b9c1b51eSKate Stone if (target && process) { 4157fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 416b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4177730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 418b9c1b51eSKate Stone if (frame) { 419b9c1b51eSKate Stone addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress( 42004803b3eSTatyana Krasnukha target, AddressClass::eCode); 421b9c1b51eSKate Stone } else { 422c9858e4dSGreg Clayton if (log) 423b9c1b51eSKate Stone log->Printf("SBFrame::GetPC () => error: could not reconstruct frame " 424b9c1b51eSKate Stone "object for this SBFrame."); 4257730b9a4SJim Ingham } 426b9c1b51eSKate Stone } else { 4277730b9a4SJim Ingham if (log) 4287730b9a4SJim Ingham log->Printf("SBFrame::GetPC () => error: process is running"); 429c9858e4dSGreg Clayton } 4307fdf9ef1SGreg Clayton } 431ceb6b139SCaroline Tice 432ceb6b139SCaroline Tice if (log) 433324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetPC () => 0x%" PRIx64, 434324a1036SSaleem Abdulrasool static_cast<void *>(frame), addr); 435ceb6b139SCaroline Tice 436ceb6b139SCaroline Tice return addr; 43730fdc8d8SChris Lattner } 43830fdc8d8SChris Lattner 439b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) { 4405160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 441ceb6b139SCaroline Tice bool ret_val = false; 442bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 443bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4444fc6cb9cSJim Ingham 445dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 446d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4477730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 448b9c1b51eSKate Stone if (target && process) { 4497fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 450b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4517730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 452b9c1b51eSKate Stone if (frame) { 453d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC(new_pc); 454b9c1b51eSKate Stone } else { 455c9858e4dSGreg Clayton if (log) 456b9c1b51eSKate Stone log->Printf("SBFrame::SetPC () => error: could not reconstruct frame " 457b9c1b51eSKate Stone "object for this SBFrame."); 4587730b9a4SJim Ingham } 459b9c1b51eSKate Stone } else { 4607730b9a4SJim Ingham if (log) 4617730b9a4SJim Ingham log->Printf("SBFrame::SetPC () => error: process is running"); 462c9858e4dSGreg Clayton } 4637fdf9ef1SGreg Clayton } 464ceb6b139SCaroline Tice 465ceb6b139SCaroline Tice if (log) 466d01b2953SDaniel Malea log->Printf("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i", 467324a1036SSaleem Abdulrasool static_cast<void *>(frame), new_pc, ret_val); 468ceb6b139SCaroline Tice 469ceb6b139SCaroline Tice return ret_val; 47030fdc8d8SChris Lattner } 47130fdc8d8SChris Lattner 472b9c1b51eSKate Stone addr_t SBFrame::GetSP() const { 4735160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4744838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 475bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 476bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4774fc6cb9cSJim Ingham 478dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 479d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4807730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 481b9c1b51eSKate Stone if (target && process) { 4827fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 483b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4847730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 485b9c1b51eSKate Stone if (frame) { 486d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 487b9c1b51eSKate Stone } else { 488c9858e4dSGreg Clayton if (log) 489b9c1b51eSKate Stone log->Printf("SBFrame::GetSP () => error: could not reconstruct frame " 490b9c1b51eSKate Stone "object for this SBFrame."); 4917730b9a4SJim Ingham } 492b9c1b51eSKate Stone } else { 4937730b9a4SJim Ingham if (log) 4947730b9a4SJim Ingham log->Printf("SBFrame::GetSP () => error: process is running"); 4957fdf9ef1SGreg Clayton } 496c9858e4dSGreg Clayton } 4974838131bSGreg Clayton if (log) 498324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetSP () => 0x%" PRIx64, 499324a1036SSaleem Abdulrasool static_cast<void *>(frame), addr); 5004838131bSGreg Clayton 5014838131bSGreg Clayton return addr; 50230fdc8d8SChris Lattner } 50330fdc8d8SChris Lattner 504b9c1b51eSKate Stone addr_t SBFrame::GetFP() const { 5055160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 50669b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 507bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 508bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5094fc6cb9cSJim Ingham 510dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 511d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5127730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 513b9c1b51eSKate Stone if (target && process) { 5147fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 515b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5167730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 517b9c1b51eSKate Stone if (frame) { 518d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 519b9c1b51eSKate Stone } else { 520c9858e4dSGreg Clayton if (log) 521b9c1b51eSKate Stone log->Printf("SBFrame::GetFP () => error: could not reconstruct frame " 522b9c1b51eSKate Stone "object for this SBFrame."); 5237730b9a4SJim Ingham } 524b9c1b51eSKate Stone } else { 5257730b9a4SJim Ingham if (log) 5267730b9a4SJim Ingham log->Printf("SBFrame::GetFP () => error: process is running"); 527c9858e4dSGreg Clayton } 5287fdf9ef1SGreg Clayton } 529ceb6b139SCaroline Tice 530ceb6b139SCaroline Tice if (log) 531324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetFP () => 0x%" PRIx64, 532324a1036SSaleem Abdulrasool static_cast<void *>(frame), addr); 533ceb6b139SCaroline Tice return addr; 53430fdc8d8SChris Lattner } 53530fdc8d8SChris Lattner 536b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const { 5375160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 53830fdc8d8SChris Lattner SBAddress sb_addr; 539bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 540bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5414fc6cb9cSJim Ingham 542b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 543d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5447730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 545b9c1b51eSKate Stone if (target && process) { 5467fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 547b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5487730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 549b9c1b51eSKate Stone if (frame) { 550d9e416c0SGreg Clayton sb_addr.SetAddress(&frame->GetFrameCodeAddress()); 551b9c1b51eSKate Stone } else { 552c9858e4dSGreg Clayton if (log) 553b9c1b51eSKate Stone log->Printf("SBFrame::GetPCAddress () => error: could not " 554b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 5557730b9a4SJim Ingham } 556b9c1b51eSKate Stone } else { 5577730b9a4SJim Ingham if (log) 5587730b9a4SJim Ingham log->Printf("SBFrame::GetPCAddress () => error: process is running"); 5597fdf9ef1SGreg Clayton } 560c9858e4dSGreg Clayton } 5614838131bSGreg Clayton if (log) 562324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", 563b9c1b51eSKate Stone static_cast<void *>(frame), static_cast<void *>(sb_addr.get())); 56430fdc8d8SChris Lattner return sb_addr; 56530fdc8d8SChris Lattner } 56630fdc8d8SChris Lattner 567b9c1b51eSKate Stone void SBFrame::Clear() { m_opaque_sp->Clear(); } 56830fdc8d8SChris Lattner 569b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) { 5707edbdfc9SGreg Clayton SBValue sb_value; 571c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 572c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 573c481c7eeSJim Ingham 574b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 575d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 576b9c1b51eSKate Stone if (frame && target) { 577b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 578b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 5797edbdfc9SGreg Clayton sb_value = GetValueForVariablePath(var_path, use_dynamic); 5807edbdfc9SGreg Clayton } 5817edbdfc9SGreg Clayton return sb_value; 5827edbdfc9SGreg Clayton } 5837edbdfc9SGreg Clayton 584b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path, 585b9c1b51eSKate Stone DynamicValueType use_dynamic) { 5867edbdfc9SGreg Clayton SBValue sb_value; 5875160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 588b9c1b51eSKate Stone if (var_path == nullptr || var_path[0] == '\0') { 5897730b9a4SJim Ingham if (log) 590b9c1b51eSKate Stone log->Printf( 591b9c1b51eSKate Stone "SBFrame::GetValueForVariablePath called with empty variable path."); 5927730b9a4SJim Ingham return sb_value; 5937730b9a4SJim Ingham } 5947730b9a4SJim Ingham 595bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 596bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5974fc6cb9cSJim Ingham 598dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 599d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6007730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 601b9c1b51eSKate Stone if (target && process) { 6027fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 603b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 6047730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 605b9c1b51eSKate Stone if (frame) { 6067edbdfc9SGreg Clayton VariableSP var_sp; 60797206d57SZachary Turner Status error; 608b9c1b51eSKate Stone ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath( 609b9c1b51eSKate Stone var_path, eNoDynamicValues, 610b9c1b51eSKate Stone StackFrame::eExpressionPathOptionCheckPtrVsMember | 611b9c1b51eSKate Stone StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 612b9c1b51eSKate Stone var_sp, error)); 613e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 614b9c1b51eSKate Stone } else { 615c9858e4dSGreg Clayton if (log) 616b9c1b51eSKate Stone log->Printf("SBFrame::GetValueForVariablePath () => error: could not " 617b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 6187730b9a4SJim Ingham } 619b9c1b51eSKate Stone } else { 6207730b9a4SJim Ingham if (log) 621b9c1b51eSKate Stone log->Printf( 622b9c1b51eSKate Stone "SBFrame::GetValueForVariablePath () => error: process is running"); 623c9858e4dSGreg Clayton } 6247fdf9ef1SGreg Clayton } 6257edbdfc9SGreg Clayton return sb_value; 6267edbdfc9SGreg Clayton } 6277edbdfc9SGreg Clayton 628b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) { 629316d498bSGreg Clayton SBValue value; 630c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 631c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 632c481c7eeSJim Ingham 633b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 634d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 635b9c1b51eSKate Stone if (frame && target) { 636b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 637b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 638316d498bSGreg Clayton value = FindVariable(name, use_dynamic); 639316d498bSGreg Clayton } 640316d498bSGreg Clayton return value; 64178a685aaSJim Ingham } 64278a685aaSJim Ingham 643b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name, 644b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 6455160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 64669b582faSGreg Clayton VariableSP var_sp; 64758b59f95SJim Ingham SBValue sb_value; 6487730b9a4SJim Ingham 649b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 6507730b9a4SJim Ingham if (log) 6517730b9a4SJim Ingham log->Printf("SBFrame::FindVariable called with empty name"); 6527730b9a4SJim Ingham return sb_value; 6537730b9a4SJim Ingham } 6547730b9a4SJim Ingham 65581e871edSGreg Clayton ValueObjectSP value_sp; 656bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 657bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 6584fc6cb9cSJim Ingham 659dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 660d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6617730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 662b9c1b51eSKate Stone if (target && process) { 6637fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 664b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 6657730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 666b9c1b51eSKate Stone if (frame) { 667e23d0b63SShafik Yaghmour value_sp = frame->FindVariable(ConstString(name)); 66830fdc8d8SChris Lattner 669e23d0b63SShafik Yaghmour if (value_sp) 670e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 671b9c1b51eSKate Stone } else { 672c9858e4dSGreg Clayton if (log) 673b9c1b51eSKate Stone log->Printf("SBFrame::FindVariable () => error: could not " 674b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 6757730b9a4SJim Ingham } 676b9c1b51eSKate Stone } else { 6777730b9a4SJim Ingham if (log) 6787730b9a4SJim Ingham log->Printf("SBFrame::FindVariable () => error: process is running"); 679c9858e4dSGreg Clayton } 680316d498bSGreg Clayton } 681316d498bSGreg Clayton 6824838131bSGreg Clayton if (log) 68369b582faSGreg Clayton log->Printf("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 684324a1036SSaleem Abdulrasool static_cast<void *>(frame), name, 685324a1036SSaleem Abdulrasool static_cast<void *>(value_sp.get())); 6864838131bSGreg Clayton 687dde9cff3SCaroline Tice return sb_value; 688dde9cff3SCaroline Tice } 689dde9cff3SCaroline Tice 690b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) { 691316d498bSGreg Clayton SBValue value; 692c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 693c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 694c481c7eeSJim Ingham 695b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 696d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 697b9c1b51eSKate Stone if (frame && target) { 698b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 699b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 700316d498bSGreg Clayton value = FindValue(name, value_type, use_dynamic); 701316d498bSGreg Clayton } 702316d498bSGreg Clayton return value; 70378a685aaSJim Ingham } 70478a685aaSJim Ingham 705b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type, 706b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 7075160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 70869b582faSGreg Clayton SBValue sb_value; 7097730b9a4SJim Ingham 710b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 7117730b9a4SJim Ingham if (log) 7127730b9a4SJim Ingham log->Printf("SBFrame::FindValue called with empty name."); 7137730b9a4SJim Ingham return sb_value; 7147730b9a4SJim Ingham } 7157730b9a4SJim Ingham 71681e871edSGreg Clayton ValueObjectSP value_sp; 717bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 718bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7194fc6cb9cSJim Ingham 720dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 721d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7227730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 723b9c1b51eSKate Stone if (target && process) { 7247fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 725b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 7267730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 727b9c1b51eSKate Stone if (frame) { 7288a2a0dfbSEnrico Granata VariableList variable_list; 7298a2a0dfbSEnrico Granata 730b9c1b51eSKate Stone switch (value_type) { 73169b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 73269b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 73369b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 73469b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 73563a27afaSGreg Clayton case eValueTypeVariableThreadLocal: // thread local variables 73669b582faSGreg Clayton { 737d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 73872eff18aSGreg Clayton 73972eff18aSGreg Clayton const bool can_create = true; 74072eff18aSGreg Clayton const bool get_parent_variables = true; 74172eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 74272eff18aSGreg Clayton 7430efb51a0SChaoren Lin if (sc.block) 744b9c1b51eSKate Stone sc.block->AppendVariables( 745b9c1b51eSKate Stone can_create, get_parent_variables, 746b9c1b51eSKate Stone stop_if_block_is_inlined_function, 747b9c1b51eSKate Stone [frame](Variable *v) { return v->IsInScope(frame); }, 748b9c1b51eSKate Stone &variable_list); 749b9c1b51eSKate Stone if (value_type == eValueTypeVariableGlobal) { 7508a2a0dfbSEnrico Granata const bool get_file_globals = true; 7518a2a0dfbSEnrico Granata VariableList *frame_vars = frame->GetVariableList(get_file_globals); 7528a2a0dfbSEnrico Granata if (frame_vars) 7538a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 7548a2a0dfbSEnrico Granata } 75569b582faSGreg Clayton ConstString const_name(name); 756b9c1b51eSKate Stone VariableSP variable_sp( 757b9c1b51eSKate Stone variable_list.FindVariable(const_name, value_type)); 758b9c1b51eSKate Stone if (variable_sp) { 759b9c1b51eSKate Stone value_sp = frame->GetValueObjectForFrameVariable(variable_sp, 760b9c1b51eSKate Stone eNoDynamicValues); 761e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 76230fdc8d8SChris Lattner } 763b9c1b51eSKate Stone } break; 76469b582faSGreg Clayton 76569b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 76669b582faSGreg Clayton { 767d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 768b9c1b51eSKate Stone if (reg_ctx) { 76969b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 770b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 771b9c1b51eSKate Stone const RegisterInfo *reg_info = 772b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 77369b582faSGreg Clayton if (reg_info && 77469b582faSGreg Clayton ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 775b9c1b51eSKate Stone (reg_info->alt_name && 776b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 777d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 77881e871edSGreg Clayton sb_value.SetSP(value_sp); 77981e871edSGreg Clayton break; 78069b582faSGreg Clayton } 78169b582faSGreg Clayton } 78269b582faSGreg Clayton } 783b9c1b51eSKate Stone } break; 78469b582faSGreg Clayton 785b9c1b51eSKate Stone case eValueTypeRegisterSet: // A collection of stack frame register 786b9c1b51eSKate Stone // values 78769b582faSGreg Clayton { 788d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 789b9c1b51eSKate Stone if (reg_ctx) { 79069b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 791b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 79269b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx); 79369b582faSGreg Clayton if (reg_set && 79469b582faSGreg Clayton ((reg_set->name && strcasecmp(reg_set->name, name) == 0) || 795b9c1b51eSKate Stone (reg_set->short_name && 796b9c1b51eSKate Stone strcasecmp(reg_set->short_name, name) == 0))) { 797b9c1b51eSKate Stone value_sp = 798b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx); 79981e871edSGreg Clayton sb_value.SetSP(value_sp); 80081e871edSGreg Clayton break; 80169b582faSGreg Clayton } 80269b582faSGreg Clayton } 80369b582faSGreg Clayton } 804b9c1b51eSKate Stone } break; 80569b582faSGreg Clayton 80669b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 80769b582faSGreg Clayton { 80869b582faSGreg Clayton ConstString const_name(name); 809b9c1b51eSKate Stone ExpressionVariableSP expr_var_sp( 810b9c1b51eSKate Stone target->GetPersistentVariable(const_name)); 811b9c1b51eSKate Stone if (expr_var_sp) { 81281e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 813e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 81481e871edSGreg Clayton } 815b9c1b51eSKate Stone } break; 81669b582faSGreg Clayton 81769b582faSGreg Clayton default: 81869b582faSGreg Clayton break; 81969b582faSGreg Clayton } 820b9c1b51eSKate Stone } else { 821c9858e4dSGreg Clayton if (log) 822b9c1b51eSKate Stone log->Printf("SBFrame::FindValue () => error: could not reconstruct " 823b9c1b51eSKate Stone "frame object for this SBFrame."); 8247730b9a4SJim Ingham } 825b9c1b51eSKate Stone } else { 8267730b9a4SJim Ingham if (log) 8277730b9a4SJim Ingham log->Printf("SBFrame::FindValue () => error: process is running"); 828c9858e4dSGreg Clayton } 8297fdf9ef1SGreg Clayton } 830dde9cff3SCaroline Tice 8314838131bSGreg Clayton if (log) 832b9c1b51eSKate Stone log->Printf("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) " 833b9c1b51eSKate Stone "=> SBValue(%p)", 834324a1036SSaleem Abdulrasool static_cast<void *>(frame), name, value_type, 835324a1036SSaleem Abdulrasool static_cast<void *>(value_sp.get())); 8364838131bSGreg Clayton 837dde9cff3SCaroline Tice return sb_value; 838dde9cff3SCaroline Tice } 839dde9cff3SCaroline Tice 840b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const { 841b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 842b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 84335e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 84435e2ab60SJohnny Chen } 84535e2ab60SJohnny Chen 846b9c1b51eSKate Stone bool SBFrame::operator==(const SBFrame &rhs) const { return IsEqual(rhs); } 84730fdc8d8SChris Lattner 848b9c1b51eSKate Stone bool SBFrame::operator!=(const SBFrame &rhs) const { return !IsEqual(rhs); } 84930fdc8d8SChris Lattner 850b9c1b51eSKate Stone SBThread SBFrame::GetThread() const { 8515160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 852ceb6b139SCaroline Tice 853c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 854c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 855c481c7eeSJim Ingham 856d9e416c0SGreg Clayton ThreadSP thread_sp(exe_ctx.GetThreadSP()); 857d9e416c0SGreg Clayton SBThread sb_thread(thread_sp); 858ceb6b139SCaroline Tice 859b9c1b51eSKate Stone if (log) { 860750cd175SCaroline Tice SBStream sstr; 861750cd175SCaroline Tice sb_thread.GetDescription(sstr); 862d9e416c0SGreg Clayton log->Printf("SBFrame(%p)::GetThread () => SBThread(%p): %s", 863324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetFramePtr()), 864324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get()), sstr.GetData()); 865750cd175SCaroline Tice } 866ceb6b139SCaroline Tice 86730fdc8d8SChris Lattner return sb_thread; 86830fdc8d8SChris Lattner } 86930fdc8d8SChris Lattner 870b9c1b51eSKate Stone const char *SBFrame::Disassemble() const { 8715160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 872dbb0abbfSEugene Zelenko const char *disassembly = nullptr; 873bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 874bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 8754fc6cb9cSJim Ingham 876dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 877d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 8787730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 879b9c1b51eSKate Stone if (target && process) { 8807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 881b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 8827730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 883b9c1b51eSKate Stone if (frame) { 884d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 885b9c1b51eSKate Stone } else { 886c9858e4dSGreg Clayton if (log) 887b9c1b51eSKate Stone log->Printf("SBFrame::Disassemble () => error: could not reconstruct " 888b9c1b51eSKate Stone "frame object for this SBFrame."); 8897730b9a4SJim Ingham } 890b9c1b51eSKate Stone } else { 8917730b9a4SJim Ingham if (log) 8927730b9a4SJim Ingham log->Printf("SBFrame::Disassemble () => error: process is running"); 8937fdf9ef1SGreg Clayton } 894c9858e4dSGreg Clayton } 8954838131bSGreg Clayton 8964838131bSGreg Clayton if (log) 897b9c1b51eSKate Stone log->Printf("SBFrame(%p)::Disassemble () => %s", static_cast<void *>(frame), 898b9c1b51eSKate Stone disassembly); 8994838131bSGreg Clayton 9004838131bSGreg Clayton return disassembly; 90130fdc8d8SChris Lattner } 90230fdc8d8SChris Lattner 903b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics, 904b9c1b51eSKate Stone bool in_scope_only) { 905316d498bSGreg Clayton SBValueList value_list; 906c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 907c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 908c481c7eeSJim Ingham 909b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 910d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 911b9c1b51eSKate Stone if (frame && target) { 912b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 913b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 914b9c1b51eSKate Stone const bool include_runtime_support_values = 915b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 91651f96eebSZachary Turner 91751f96eebSZachary Turner SBVariablesOptions options; 91851f96eebSZachary Turner options.SetIncludeArguments(arguments); 91951f96eebSZachary Turner options.SetIncludeLocals(locals); 92051f96eebSZachary Turner options.SetIncludeStatics(statics); 92151f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 92251f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 92351f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 92451f96eebSZachary Turner 92551f96eebSZachary Turner value_list = GetVariables(options); 926316d498bSGreg Clayton } 927316d498bSGreg Clayton return value_list; 92878a685aaSJim Ingham } 92978a685aaSJim Ingham 930b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals, 931b9c1b51eSKate Stone bool statics, bool in_scope_only, 932b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 933c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 934c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 935c481c7eeSJim Ingham 936560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 937b9c1b51eSKate Stone const bool include_runtime_support_values = 938b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 93951f96eebSZachary Turner SBVariablesOptions options; 94051f96eebSZachary Turner options.SetIncludeArguments(arguments); 94151f96eebSZachary Turner options.SetIncludeLocals(locals); 94251f96eebSZachary Turner options.SetIncludeStatics(statics); 94351f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 94451f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 94551f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 94651f96eebSZachary Turner return GetVariables(options); 947560558ebSEnrico Granata } 948560558ebSEnrico Granata 949b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) { 9505160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 951ceb6b139SCaroline Tice 952b9556accSGreg Clayton SBValueList value_list; 953bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 954bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9554fc6cb9cSJim Ingham 956dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 957d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 958b9556accSGreg Clayton 95951f96eebSZachary Turner const bool statics = options.GetIncludeStatics(); 96051f96eebSZachary Turner const bool arguments = options.GetIncludeArguments(); 9614c7f5d5cSKuba Mracek const bool recognized_arguments = 9624c7f5d5cSKuba Mracek options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP())); 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) 97041ae8e74SKuba Mracek log->Printf( 97141ae8e74SKuba Mracek "SBFrame::GetVariables (arguments=%i, recognized_arguments=%i, " 97241ae8e74SKuba Mracek "locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)", 97341ae8e74SKuba Mracek arguments, recognized_arguments, locals, statics, in_scope_only, 97451f96eebSZachary Turner include_runtime_support_values, use_dynamic); 975ceb6b139SCaroline Tice 976349213f9SGreg Clayton std::set<VariableSP> variable_set; 9777730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 978b9c1b51eSKate Stone if (target && process) { 9797fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 980b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9817730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 982b9c1b51eSKate Stone if (frame) { 98330fdc8d8SChris Lattner size_t i; 984dbb0abbfSEugene Zelenko VariableList *variable_list = nullptr; 985d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 986b9c1b51eSKate Stone if (variable_list) { 98730fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 988b9c1b51eSKate Stone if (num_variables) { 989b9c1b51eSKate Stone for (i = 0; i < num_variables; ++i) { 99030fdc8d8SChris Lattner VariableSP variable_sp(variable_list->GetVariableAtIndex(i)); 991b9c1b51eSKate Stone if (variable_sp) { 99230fdc8d8SChris Lattner bool add_variable = false; 993b9c1b51eSKate Stone switch (variable_sp->GetScope()) { 99430fdc8d8SChris Lattner case eValueTypeVariableGlobal: 99530fdc8d8SChris Lattner case eValueTypeVariableStatic: 99663a27afaSGreg Clayton case eValueTypeVariableThreadLocal: 99730fdc8d8SChris Lattner add_variable = statics; 99830fdc8d8SChris Lattner break; 99930fdc8d8SChris Lattner 100030fdc8d8SChris Lattner case eValueTypeVariableArgument: 100130fdc8d8SChris Lattner add_variable = arguments; 100230fdc8d8SChris Lattner break; 100330fdc8d8SChris Lattner 100430fdc8d8SChris Lattner case eValueTypeVariableLocal: 100530fdc8d8SChris Lattner add_variable = locals; 100630fdc8d8SChris Lattner break; 1007c982c768SGreg Clayton 1008c982c768SGreg Clayton default: 1009c982c768SGreg Clayton break; 101030fdc8d8SChris Lattner } 1011b9c1b51eSKate Stone if (add_variable) { 1012349213f9SGreg Clayton // Only add variables once so we don't end up with duplicates 1013349213f9SGreg Clayton if (variable_set.find(variable_sp) == variable_set.end()) 1014349213f9SGreg Clayton variable_set.insert(variable_sp); 1015349213f9SGreg Clayton else 1016349213f9SGreg Clayton continue; 1017349213f9SGreg Clayton 1018d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 101930fdc8d8SChris Lattner continue; 102030fdc8d8SChris Lattner 1021b9c1b51eSKate Stone ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable( 1022b9c1b51eSKate Stone variable_sp, eNoDynamicValues)); 1023560558ebSEnrico Granata 1024b9c1b51eSKate Stone if (!include_runtime_support_values && valobj_sp != nullptr && 1025dbb0abbfSEugene Zelenko valobj_sp->IsRuntimeSupportValue()) 1026560558ebSEnrico Granata continue; 1027560558ebSEnrico Granata 1028e3e91517SEnrico Granata SBValue value_sb; 1029e3e91517SEnrico Granata value_sb.SetSP(valobj_sp, use_dynamic); 1030e3e91517SEnrico Granata value_list.Append(value_sb); 103130fdc8d8SChris Lattner } 103230fdc8d8SChris Lattner } 103330fdc8d8SChris Lattner } 103430fdc8d8SChris Lattner } 103530fdc8d8SChris Lattner } 103641ae8e74SKuba Mracek if (recognized_arguments) { 103741ae8e74SKuba Mracek auto recognized_frame = frame->GetRecognizedFrame(); 103841ae8e74SKuba Mracek if (recognized_frame) { 103941ae8e74SKuba Mracek ValueObjectListSP recognized_arg_list = 104041ae8e74SKuba Mracek recognized_frame->GetRecognizedArguments(); 104141ae8e74SKuba Mracek if (recognized_arg_list) { 104241ae8e74SKuba Mracek for (auto &rec_value_sp : recognized_arg_list->GetObjects()) { 104341ae8e74SKuba Mracek SBValue value_sb; 104441ae8e74SKuba Mracek value_sb.SetSP(rec_value_sp, use_dynamic); 104541ae8e74SKuba Mracek value_list.Append(value_sb); 104641ae8e74SKuba Mracek } 104741ae8e74SKuba Mracek } 104841ae8e74SKuba Mracek } 104941ae8e74SKuba Mracek } 1050b9c1b51eSKate Stone } else { 1051c9858e4dSGreg Clayton if (log) 1052b9c1b51eSKate Stone log->Printf("SBFrame::GetVariables () => error: could not " 1053b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 10547730b9a4SJim Ingham } 1055b9c1b51eSKate Stone } else { 10567730b9a4SJim Ingham if (log) 10577730b9a4SJim Ingham log->Printf("SBFrame::GetVariables () => error: process is running"); 1058c9858e4dSGreg Clayton } 10597fdf9ef1SGreg Clayton } 1060ceb6b139SCaroline Tice 1061ceb6b139SCaroline Tice if (log) 1062324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", 1063324a1036SSaleem Abdulrasool static_cast<void *>(frame), 1064324a1036SSaleem Abdulrasool static_cast<void *>(value_list.opaque_ptr())); 1065ceb6b139SCaroline Tice 106630fdc8d8SChris Lattner return value_list; 106730fdc8d8SChris Lattner } 106830fdc8d8SChris Lattner 1069b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() { 10705160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1071ceb6b139SCaroline Tice 107230fdc8d8SChris Lattner SBValueList value_list; 1073bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1074bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 10754fc6cb9cSJim Ingham 1076dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1077d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 10787730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1079b9c1b51eSKate Stone if (target && process) { 10807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1081b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 10827730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1083b9c1b51eSKate Stone if (frame) { 1084d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 1085b9c1b51eSKate Stone if (reg_ctx) { 108630fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 1087b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 1088b9c1b51eSKate Stone value_list.Append( 1089b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx)); 109030fdc8d8SChris Lattner } 109130fdc8d8SChris Lattner } 1092b9c1b51eSKate Stone } else { 1093c9858e4dSGreg Clayton if (log) 1094b9c1b51eSKate Stone log->Printf("SBFrame::GetRegisters () => error: could not " 1095b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 10967730b9a4SJim Ingham } 1097b9c1b51eSKate Stone } else { 10987730b9a4SJim Ingham if (log) 10997730b9a4SJim Ingham log->Printf("SBFrame::GetRegisters () => error: process is running"); 1100c9858e4dSGreg Clayton } 11017fdf9ef1SGreg Clayton } 1102ceb6b139SCaroline Tice 1103ceb6b139SCaroline Tice if (log) 1104324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetRegisters () => SBValueList(%p)", 1105324a1036SSaleem Abdulrasool static_cast<void *>(frame), 1106324a1036SSaleem Abdulrasool static_cast<void *>(value_list.opaque_ptr())); 1107ceb6b139SCaroline Tice 110830fdc8d8SChris Lattner return value_list; 110930fdc8d8SChris Lattner } 111030fdc8d8SChris Lattner 1111b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) { 1112ad9a53c5SJason Molenda Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1113ad9a53c5SJason Molenda 1114ad9a53c5SJason Molenda SBValue result; 1115ad9a53c5SJason Molenda ValueObjectSP value_sp; 1116bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1117bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1118ad9a53c5SJason Molenda 1119dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1120ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 1121ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1122b9c1b51eSKate Stone if (target && process) { 1123ad9a53c5SJason Molenda Process::StopLocker stop_locker; 1124b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1125ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 1126b9c1b51eSKate Stone if (frame) { 1127ad9a53c5SJason Molenda RegisterContextSP reg_ctx(frame->GetRegisterContext()); 1128b9c1b51eSKate Stone if (reg_ctx) { 1129ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 1130b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 1131b9c1b51eSKate Stone const RegisterInfo *reg_info = 1132b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 1133ad9a53c5SJason Molenda if (reg_info && 1134ad9a53c5SJason Molenda ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 1135b9c1b51eSKate Stone (reg_info->alt_name && 1136b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 1137ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 1138ad9a53c5SJason Molenda result.SetSP(value_sp); 1139ad9a53c5SJason Molenda break; 1140ad9a53c5SJason Molenda } 1141ad9a53c5SJason Molenda } 1142ad9a53c5SJason Molenda } 1143b9c1b51eSKate Stone } else { 1144ad9a53c5SJason Molenda if (log) 1145b9c1b51eSKate Stone log->Printf("SBFrame::FindRegister () => error: could not " 1146b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 1147ad9a53c5SJason Molenda } 1148b9c1b51eSKate Stone } else { 1149ad9a53c5SJason Molenda if (log) 11505d353842SJason Molenda log->Printf("SBFrame::FindRegister () => error: process is running"); 1151ad9a53c5SJason Molenda } 1152ad9a53c5SJason Molenda } 1153ad9a53c5SJason Molenda 1154ad9a53c5SJason Molenda if (log) 1155324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::FindRegister () => SBValue(%p)", 1156324a1036SSaleem Abdulrasool static_cast<void *>(frame), 1157324a1036SSaleem Abdulrasool static_cast<void *>(value_sp.get())); 1158ad9a53c5SJason Molenda 1159ad9a53c5SJason Molenda return result; 1160ad9a53c5SJason Molenda } 1161ad9a53c5SJason Molenda 1162b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) { 11635160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1164da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1165da7bc7d0SGreg Clayton 1166bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1167bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11684fc6cb9cSJim Ingham 1169b57e4a1bSJason Molenda StackFrame *frame; 1170d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 11717730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1172b9c1b51eSKate Stone if (target && process) { 11737fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1174b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11757730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1176b9c1b51eSKate Stone if (frame) { 1177d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&strm); 1178b9c1b51eSKate Stone } else { 1179c9858e4dSGreg Clayton if (log) 1180b9c1b51eSKate Stone log->Printf("SBFrame::GetDescription () => error: could not " 1181b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 11827730b9a4SJim Ingham } 1183b9c1b51eSKate Stone } else { 11847730b9a4SJim Ingham if (log) 11857730b9a4SJim Ingham log->Printf("SBFrame::GetDescription () => error: process is running"); 1186c9858e4dSGreg Clayton } 1187c9858e4dSGreg Clayton 1188b9c1b51eSKate Stone } else 1189da7bc7d0SGreg Clayton strm.PutCString("No value"); 1190dde9cff3SCaroline Tice 1191dde9cff3SCaroline Tice return true; 1192dde9cff3SCaroline Tice } 11931d3afba3SGreg Clayton 1194b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) { 1195316d498bSGreg Clayton SBValue result; 1196c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1197c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1198c481c7eeSJim Ingham 1199b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1200d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1201b9c1b51eSKate Stone if (frame && target) { 120235e1bda6SJim Ingham SBExpressionOptions options; 1203b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value = 1204b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 1205cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 120635e1bda6SJim Ingham options.SetUnwindOnError(true); 120724785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1208998c8a1cSRyan Brown if (target->GetLanguage() != eLanguageTypeUnknown) 1209998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1210998c8a1cSRyan Brown else 1211998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 121235e1bda6SJim Ingham return EvaluateExpression(expr, options); 1213316d498bSGreg Clayton } 1214316d498bSGreg Clayton return result; 121578a685aaSJim Ingham } 121678a685aaSJim Ingham 121778a685aaSJim Ingham SBValue 1218b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr, 1219b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value) { 122035e1bda6SJim Ingham SBExpressionOptions options; 1221cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 122235e1bda6SJim Ingham options.SetUnwindOnError(true); 122324785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1224c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1225c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1226c481c7eeSJim Ingham 1227998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1228998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1229998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1230998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1231998c8a1cSRyan Brown else if (frame) 1232998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 123335e1bda6SJim Ingham return EvaluateExpression(expr, options); 12347ba6e991SJim Ingham } 12357ba6e991SJim Ingham 1236b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr, 1237b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value, 1238b9c1b51eSKate Stone bool unwind_on_error) { 123935e1bda6SJim Ingham SBExpressionOptions options; 1240c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1241c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1242c481c7eeSJim Ingham 1243cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 124435e1bda6SJim Ingham options.SetUnwindOnError(unwind_on_error); 124524785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1246998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1247998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1248998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1249998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1250998c8a1cSRyan Brown else if (frame) 1251998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 125235e1bda6SJim Ingham return EvaluateExpression(expr, options); 125335e1bda6SJim Ingham } 125435e1bda6SJim Ingham 1255b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr, 1256b9c1b51eSKate Stone const SBExpressionOptions &options) { 12575160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 12584838131bSGreg Clayton 1259358efd65SSaleem Abdulrasool #ifndef LLDB_DISABLE_PYTHON 12605160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1261358efd65SSaleem Abdulrasool #endif 1262a162ebafSSean Callanan 12638646d3c1SJim Ingham ExpressionResults exe_results = eExpressionSetupError; 126469b582faSGreg Clayton SBValue expr_result; 12657730b9a4SJim Ingham 1266b9c1b51eSKate Stone if (expr == nullptr || expr[0] == '\0') { 12677730b9a4SJim Ingham if (log) 1268b9c1b51eSKate Stone log->Printf( 1269b9c1b51eSKate Stone "SBFrame::EvaluateExpression called with an empty expression"); 12707730b9a4SJim Ingham return expr_result; 12717730b9a4SJim Ingham } 12727730b9a4SJim Ingham 127381e871edSGreg Clayton ValueObjectSP expr_value_sp; 12744838131bSGreg Clayton 1275bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1276bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 12774fc6cb9cSJim Ingham 1278b9556accSGreg Clayton if (log) 12797730b9a4SJim Ingham log->Printf("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr); 1280b9556accSGreg Clayton 1281dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 12827730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 12837730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 12847730b9a4SJim Ingham 1285b9c1b51eSKate Stone if (target && process) { 12867fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1287b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 12887730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1289b9c1b51eSKate Stone if (frame) { 12908f7db52dSJim Ingham std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace; 1291b9c1b51eSKate Stone if (target->GetDisplayExpressionsInCrashlogs()) { 12921ba7c4d0SGreg Clayton StreamString frame_description; 1293d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&frame_description); 12948f7db52dSJim Ingham stack_trace = llvm::make_unique<llvm::PrettyStackTraceFormat>( 1295b9c1b51eSKate Stone "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value " 1296b9c1b51eSKate Stone "= %u) %s", 1297b9c1b51eSKate Stone expr, options.GetFetchDynamicValue(), 1298c156427dSZachary Turner frame_description.GetData()); 1299fb6621efSGreg Clayton } 1300fb6621efSGreg Clayton 1301b9c1b51eSKate Stone exe_results = target->EvaluateExpression(expr, frame, expr_value_sp, 130235e1bda6SJim Ingham options.ref()); 1303e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1304b9c1b51eSKate Stone } else { 1305c9858e4dSGreg Clayton if (log) 1306b9c1b51eSKate Stone log->Printf("SBFrame::EvaluateExpression () => error: could not " 1307b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 13087730b9a4SJim Ingham } 1309b9c1b51eSKate Stone } else { 13107730b9a4SJim Ingham if (log) 1311b9c1b51eSKate Stone log->Printf( 1312b9c1b51eSKate Stone "SBFrame::EvaluateExpression () => error: process is running"); 1313c9858e4dSGreg Clayton } 13147fdf9ef1SGreg Clayton } 13154838131bSGreg Clayton 1316cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1317a162ebafSSean Callanan if (expr_log) 1318b9c1b51eSKate Stone expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is " 1319b9c1b51eSKate Stone "%s, summary %s **", 1320324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 1321a162ebafSSean Callanan 13224838131bSGreg Clayton if (log) 1323b9c1b51eSKate Stone log->Printf("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) " 1324b9c1b51eSKate Stone "(execution result=%d)", 1325324a1036SSaleem Abdulrasool static_cast<void *>(frame), expr, 1326324a1036SSaleem Abdulrasool static_cast<void *>(expr_value_sp.get()), exe_results); 1327cf7e2dc0SJason Molenda #endif 13284838131bSGreg Clayton 1329cfd1acedSGreg Clayton return expr_result; 13301d3afba3SGreg Clayton } 1331316d498bSGreg Clayton 1332b9c1b51eSKate Stone bool SBFrame::IsInlined() { 133305f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->IsInlined(); 133405f75e9fSOleksiy Vyalov } 133505f75e9fSOleksiy Vyalov 1336b9c1b51eSKate Stone bool SBFrame::IsInlined() const { 13375160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1338c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1339c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1340c481c7eeSJim Ingham 1341dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1342d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 13437730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1344b9c1b51eSKate Stone if (target && process) { 13457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1346b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 13477730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1348b9c1b51eSKate Stone if (frame) { 13497fdf9ef1SGreg Clayton 1350d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1351316d498bSGreg Clayton if (block) 1352dbb0abbfSEugene Zelenko return block->GetContainingInlinedBlock() != nullptr; 1353b9c1b51eSKate Stone } else { 1354c9858e4dSGreg Clayton if (log) 1355b9c1b51eSKate Stone log->Printf("SBFrame::IsInlined () => error: could not reconstruct " 1356b9c1b51eSKate Stone "frame object for this SBFrame."); 13577730b9a4SJim Ingham } 1358b9c1b51eSKate Stone } else { 13597730b9a4SJim Ingham if (log) 13607730b9a4SJim Ingham log->Printf("SBFrame::IsInlined () => error: process is running"); 1361c9858e4dSGreg Clayton } 13627fdf9ef1SGreg Clayton } 1363316d498bSGreg Clayton return false; 1364316d498bSGreg Clayton } 1365316d498bSGreg Clayton 13664b36f791SVedant Kumar bool SBFrame::IsArtificial() { 13674b36f791SVedant Kumar return static_cast<const SBFrame *>(this)->IsArtificial(); 13684b36f791SVedant Kumar } 13694b36f791SVedant Kumar 13704b36f791SVedant Kumar bool SBFrame::IsArtificial() const { 13714b36f791SVedant Kumar std::unique_lock<std::recursive_mutex> lock; 13724b36f791SVedant Kumar ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 13734b36f791SVedant Kumar 13744b36f791SVedant Kumar StackFrame *frame = exe_ctx.GetFramePtr(); 13754b36f791SVedant Kumar if (frame) 13764b36f791SVedant Kumar return frame->IsArtificial(); 13774b36f791SVedant Kumar 13784b36f791SVedant Kumar return false; 13794b36f791SVedant Kumar } 13804b36f791SVedant Kumar 1381b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() { 138205f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->GetFunctionName(); 138305f75e9fSOleksiy Vyalov } 138405f75e9fSOleksiy Vyalov 1385bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const { 1386bdbdd229SJim Ingham std::unique_lock<std::recursive_mutex> lock; 1387bdbdd229SJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1388bdbdd229SJim Ingham 1389bdbdd229SJim Ingham StackFrame *frame = nullptr; 1390bdbdd229SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1391bdbdd229SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1392bdbdd229SJim Ingham if (target && process) { 1393bdbdd229SJim Ingham Process::StopLocker stop_locker; 1394bdbdd229SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) { 1395bdbdd229SJim Ingham frame = exe_ctx.GetFramePtr(); 1396bdbdd229SJim Ingham if (frame) { 1397bdbdd229SJim Ingham return frame->GuessLanguage(); 1398bdbdd229SJim Ingham } 1399bdbdd229SJim Ingham } 1400bdbdd229SJim Ingham } 1401bdbdd229SJim Ingham return eLanguageTypeUnknown; 1402bdbdd229SJim Ingham } 1403bdbdd229SJim Ingham 1404b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const { 14055160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1406dbb0abbfSEugene Zelenko const char *name = nullptr; 1407c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1408c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1409c481c7eeSJim Ingham 1410dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1411d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 14127730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1413b9c1b51eSKate Stone if (target && process) { 14147fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1415b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 14167730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1417b9c1b51eSKate Stone if (frame) { 1418b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1419b9c1b51eSKate Stone eSymbolContextBlock | 1420b9c1b51eSKate Stone eSymbolContextSymbol)); 1421b9c1b51eSKate Stone if (sc.block) { 1422316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1423b9c1b51eSKate Stone if (inlined_block) { 1424b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1425b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1426b9c1b51eSKate Stone name = 1427b9c1b51eSKate Stone inlined_info->GetName(sc.function->GetLanguage()).AsCString(); 1428316d498bSGreg Clayton } 1429316d498bSGreg Clayton } 1430316d498bSGreg Clayton 1431b9c1b51eSKate Stone if (name == nullptr) { 1432316d498bSGreg Clayton if (sc.function) 1433316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1434316d498bSGreg Clayton } 1435316d498bSGreg Clayton 1436b9c1b51eSKate Stone if (name == nullptr) { 1437316d498bSGreg Clayton if (sc.symbol) 1438316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1439316d498bSGreg Clayton } 1440b9c1b51eSKate Stone } else { 1441c9858e4dSGreg Clayton if (log) 1442b9c1b51eSKate Stone log->Printf("SBFrame::GetFunctionName () => error: could not " 1443b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 14447730b9a4SJim Ingham } 1445b9c1b51eSKate Stone } else { 14467730b9a4SJim Ingham if (log) 14477730b9a4SJim Ingham log->Printf("SBFrame::GetFunctionName() => error: process is running"); 1448c9858e4dSGreg Clayton } 14497fdf9ef1SGreg Clayton } 1450316d498bSGreg Clayton return name; 1451316d498bSGreg Clayton } 1452c1f705c2SEnrico Granata 1453b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() { 1454c1f705c2SEnrico Granata Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1455dbb0abbfSEugene Zelenko const char *name = nullptr; 1456c481c7eeSJim Ingham 1457c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1458c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1459c481c7eeSJim Ingham 1460dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1461c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1462c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 1463b9c1b51eSKate Stone if (target && process) { 1464c1f705c2SEnrico Granata Process::StopLocker stop_locker; 1465b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1466c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr(); 1467b9c1b51eSKate Stone if (frame) { 1468b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1469b9c1b51eSKate Stone eSymbolContextBlock | 1470b9c1b51eSKate Stone eSymbolContextSymbol)); 1471b9c1b51eSKate Stone if (sc.block) { 1472c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1473b9c1b51eSKate Stone if (inlined_block) { 1474b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1475b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1476b9c1b51eSKate Stone name = inlined_info->GetDisplayName(sc.function->GetLanguage()) 1477b9c1b51eSKate Stone .AsCString(); 1478c1f705c2SEnrico Granata } 1479c1f705c2SEnrico Granata } 1480c1f705c2SEnrico Granata 1481b9c1b51eSKate Stone if (name == nullptr) { 1482c1f705c2SEnrico Granata if (sc.function) 1483c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString(); 1484c1f705c2SEnrico Granata } 1485c1f705c2SEnrico Granata 1486b9c1b51eSKate Stone if (name == nullptr) { 1487c1f705c2SEnrico Granata if (sc.symbol) 1488c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString(); 1489c1f705c2SEnrico Granata } 1490b9c1b51eSKate Stone } else { 1491c1f705c2SEnrico Granata if (log) 1492b9c1b51eSKate Stone log->Printf("SBFrame::GetDisplayFunctionName () => error: could not " 1493b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 1494c1f705c2SEnrico Granata } 1495b9c1b51eSKate Stone } else { 1496c1f705c2SEnrico Granata if (log) 1497b9c1b51eSKate Stone log->Printf( 1498b9c1b51eSKate Stone "SBFrame::GetDisplayFunctionName() => error: process is running"); 1499c1f705c2SEnrico Granata } 1500c1f705c2SEnrico Granata } 1501c1f705c2SEnrico Granata return name; 1502c1f705c2SEnrico Granata } 1503