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*baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h" 19bd4bf82aSJonas Devlieghere #include "Utils.h" 2030fdc8d8SChris Lattner #include "lldb/Core/Address.h" 2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h" 2330fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h" 24151c032cSJim Ingham #include "lldb/Expression/UserExpression.h" 251ba7c4d0SGreg Clayton #include "lldb/Host/Host.h" 2630fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 271f746071SGreg Clayton #include "lldb/Symbol/Function.h" 281f746071SGreg Clayton #include "lldb/Symbol/Symbol.h" 2930fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 3030fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h" 31b9c1b51eSKate Stone #include "lldb/Symbol/VariableList.h" 3230fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h" 3330fdc8d8SChris Lattner #include "lldb/Target/Process.h" 3430fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 35b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h" 3641ae8e74SKuba Mracek #include "lldb/Target/StackFrameRecognizer.h" 37b9556accSGreg Clayton #include "lldb/Target/StackID.h" 38b9c1b51eSKate Stone #include "lldb/Target/Target.h" 3930fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 40bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h" 416f9e6901SZachary Turner #include "lldb/Utility/Log.h" 42bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 4330fdc8d8SChris Lattner 444c5de699SEli Friedman #include "lldb/API/SBAddress.h" 45b9c1b51eSKate Stone #include "lldb/API/SBDebugger.h" 4635e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h" 47dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 484c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h" 494c5de699SEli Friedman #include "lldb/API/SBThread.h" 50b9c1b51eSKate Stone #include "lldb/API/SBValue.h" 5151f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h" 5230fdc8d8SChris Lattner 53237c3ed9SSean Callanan #include "llvm/Support/PrettyStackTrace.h" 54237c3ed9SSean Callanan 5530fdc8d8SChris Lattner using namespace lldb; 5630fdc8d8SChris Lattner using namespace lldb_private; 5730fdc8d8SChris Lattner 58*baf5664fSJonas Devlieghere SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) { 59*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBFrame); 60*baf5664fSJonas Devlieghere } 6130fdc8d8SChris Lattner 62b9c1b51eSKate Stone SBFrame::SBFrame(const StackFrameSP &lldb_object_sp) 63b9c1b51eSKate Stone : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) { 64*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &), 65*baf5664fSJonas Devlieghere lldb_object_sp); 66*baf5664fSJonas Devlieghere 675160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 68ceb6b139SCaroline Tice 69b9c1b51eSKate Stone if (log) { 70ceb6b139SCaroline Tice SBStream sstr; 71ceb6b139SCaroline Tice GetDescription(sstr); 724838131bSGreg Clayton log->Printf("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s", 73324a1036SSaleem Abdulrasool static_cast<void *>(lldb_object_sp.get()), 74324a1036SSaleem Abdulrasool static_cast<void *>(lldb_object_sp.get()), sstr.GetData()); 75ceb6b139SCaroline Tice } 7630fdc8d8SChris Lattner } 7730fdc8d8SChris Lattner 78bd4bf82aSJonas Devlieghere SBFrame::SBFrame(const SBFrame &rhs) : m_opaque_sp() { 79*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &), rhs); 80*baf5664fSJonas Devlieghere 81bd4bf82aSJonas Devlieghere m_opaque_sp = clone(rhs.m_opaque_sp); 82bd4bf82aSJonas Devlieghere } 83efabb123SGreg Clayton 84dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default; 85dbb0abbfSEugene Zelenko 86b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) { 87*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBFrame &, 88*baf5664fSJonas Devlieghere SBFrame, operator=,(const lldb::SBFrame &), rhs); 89*baf5664fSJonas Devlieghere 90efabb123SGreg Clayton if (this != &rhs) 91bd4bf82aSJonas Devlieghere m_opaque_sp = clone(rhs.m_opaque_sp); 92efabb123SGreg Clayton return *this; 93efabb123SGreg Clayton } 94efabb123SGreg Clayton 95b9c1b51eSKate Stone StackFrameSP SBFrame::GetFrameSP() const { 96dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP()); 97b9556accSGreg Clayton } 9830fdc8d8SChris Lattner 99b9c1b51eSKate Stone void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) { 1007fdf9ef1SGreg Clayton return m_opaque_sp->SetFrameSP(lldb_object_sp); 101b9556accSGreg Clayton } 10230fdc8d8SChris Lattner 103b9c1b51eSKate Stone bool SBFrame::IsValid() const { 104*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsValid); 105*baf5664fSJonas Devlieghere 106bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 107bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1087fa7dc36SJim Ingham 1097fa7dc36SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1107fa7dc36SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 111b9c1b51eSKate Stone if (target && process) { 1127fa7dc36SJim Ingham Process::StopLocker stop_locker; 1137fa7dc36SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 114dbb0abbfSEugene Zelenko return GetFrameSP().get() != nullptr; 11530fdc8d8SChris Lattner } 11630fdc8d8SChris Lattner 1177fa7dc36SJim Ingham // Without a target & process we can't have a valid stack frame. 1187fa7dc36SJim Ingham return false; 1197fa7dc36SJim Ingham } 1207fa7dc36SJim Ingham 121b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const { 122*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext, 123*baf5664fSJonas Devlieghere (uint32_t), resolve_scope); 124*baf5664fSJonas Devlieghere 1255160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 12630fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 127bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 128bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 129991e4453SZachary Turner SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope); 130dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 131d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1327730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 133b9c1b51eSKate Stone if (target && process) { 1347fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 135b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1367730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 137b9c1b51eSKate Stone if (frame) { 138991e4453SZachary Turner sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext(scope)); 139b9c1b51eSKate Stone } else { 140c9858e4dSGreg Clayton if (log) 141b9c1b51eSKate Stone log->Printf("SBFrame::GetVariables () => error: could not " 142b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 1437730b9a4SJim Ingham } 144b9c1b51eSKate Stone } else { 1457730b9a4SJim Ingham if (log) 146b9c1b51eSKate Stone log->Printf( 147b9c1b51eSKate Stone "SBFrame::GetSymbolContext () => error: process is running"); 148c9858e4dSGreg Clayton } 1497fdf9ef1SGreg Clayton } 150ceb6b139SCaroline Tice 151ceb6b139SCaroline Tice if (log) 152b9c1b51eSKate Stone log->Printf("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => " 153b9c1b51eSKate Stone "SBSymbolContext(%p)", 154324a1036SSaleem Abdulrasool static_cast<void *>(frame), resolve_scope, 155324a1036SSaleem Abdulrasool static_cast<void *>(sb_sym_ctx.get())); 156ceb6b139SCaroline Tice 157*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_sym_ctx); 15830fdc8d8SChris Lattner } 15930fdc8d8SChris Lattner 160b9c1b51eSKate Stone SBModule SBFrame::GetModule() const { 161*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBModule, SBFrame, GetModule); 162*baf5664fSJonas Devlieghere 1635160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 16472eff18aSGreg Clayton SBModule sb_module; 165acdbe816SGreg Clayton ModuleSP module_sp; 166bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 167bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1684fc6cb9cSJim Ingham 169dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 170d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1717730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 172b9c1b51eSKate Stone if (target && process) { 1737fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 174b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1757730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 176b9c1b51eSKate Stone if (frame) { 177d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp; 178acdbe816SGreg Clayton sb_module.SetSP(module_sp); 179b9c1b51eSKate Stone } else { 180c9858e4dSGreg Clayton if (log) 181b9c1b51eSKate Stone log->Printf("SBFrame::GetModule () => error: could not reconstruct " 182b9c1b51eSKate Stone "frame object for this SBFrame."); 1837730b9a4SJim Ingham } 184b9c1b51eSKate Stone } else { 1857730b9a4SJim Ingham if (log) 1867730b9a4SJim Ingham log->Printf("SBFrame::GetModule () => error: process is running"); 187c9858e4dSGreg Clayton } 1887fdf9ef1SGreg Clayton } 18972eff18aSGreg Clayton 1904838131bSGreg Clayton if (log) 1914838131bSGreg Clayton log->Printf("SBFrame(%p)::GetModule () => SBModule(%p)", 192324a1036SSaleem Abdulrasool static_cast<void *>(frame), 193324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get())); 1944838131bSGreg Clayton 195*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_module); 19630fdc8d8SChris Lattner } 19730fdc8d8SChris Lattner 198b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const { 199*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBCompileUnit, SBFrame, 200*baf5664fSJonas Devlieghere GetCompileUnit); 201*baf5664fSJonas Devlieghere 2025160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 20372eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 204bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 205bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2064fc6cb9cSJim Ingham 207dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 208d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2097730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 210b9c1b51eSKate Stone if (target && process) { 2117fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 212b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2137730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 214b9c1b51eSKate Stone if (frame) { 215b9c1b51eSKate Stone sb_comp_unit.reset( 216b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit); 217b9c1b51eSKate Stone } else { 218ceb6b139SCaroline Tice if (log) 219b9c1b51eSKate Stone log->Printf("SBFrame::GetCompileUnit () => error: could not " 220b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 2217730b9a4SJim Ingham } 222b9c1b51eSKate Stone } else { 2237730b9a4SJim Ingham if (log) 2247730b9a4SJim Ingham log->Printf("SBFrame::GetCompileUnit () => error: process is running"); 225c9858e4dSGreg Clayton } 226c9858e4dSGreg Clayton } 227c9858e4dSGreg Clayton if (log) 228c9858e4dSGreg Clayton log->Printf("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)", 229324a1036SSaleem Abdulrasool static_cast<void *>(frame), 230324a1036SSaleem Abdulrasool static_cast<void *>(sb_comp_unit.get())); 231ceb6b139SCaroline Tice 232*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_comp_unit); 23330fdc8d8SChris Lattner } 23430fdc8d8SChris Lattner 235b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const { 236*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFunction, SBFrame, GetFunction); 237*baf5664fSJonas Devlieghere 2385160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 23972eff18aSGreg Clayton SBFunction sb_function; 240bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 241bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2424fc6cb9cSJim Ingham 243dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 244d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2457730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 246b9c1b51eSKate Stone if (target && process) { 2477fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 248b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2497730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 250b9c1b51eSKate Stone if (frame) { 251b9c1b51eSKate Stone sb_function.reset( 252b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextFunction).function); 253b9c1b51eSKate Stone } else { 254c9858e4dSGreg Clayton if (log) 255b9c1b51eSKate Stone log->Printf("SBFrame::GetFunction () => error: could not reconstruct " 256b9c1b51eSKate Stone "frame object for this SBFrame."); 2577730b9a4SJim Ingham } 258b9c1b51eSKate Stone } else { 2597730b9a4SJim Ingham if (log) 2607730b9a4SJim Ingham log->Printf("SBFrame::GetFunction () => error: process is running"); 2617fdf9ef1SGreg Clayton } 262c9858e4dSGreg Clayton } 2634838131bSGreg Clayton if (log) 2644838131bSGreg Clayton log->Printf("SBFrame(%p)::GetFunction () => SBFunction(%p)", 265324a1036SSaleem Abdulrasool static_cast<void *>(frame), 266324a1036SSaleem Abdulrasool static_cast<void *>(sb_function.get())); 2674838131bSGreg Clayton 268*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_function); 26930fdc8d8SChris Lattner } 27030fdc8d8SChris Lattner 271b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const { 272*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBSymbol, SBFrame, GetSymbol); 273*baf5664fSJonas Devlieghere 2745160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 27572eff18aSGreg Clayton SBSymbol sb_symbol; 276bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 277bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2784fc6cb9cSJim Ingham 279dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 280d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2817730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 282b9c1b51eSKate Stone if (target && process) { 2837fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 284b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2857730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 286b9c1b51eSKate Stone if (frame) { 287d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol); 288b9c1b51eSKate Stone } else { 289c9858e4dSGreg Clayton if (log) 290b9c1b51eSKate Stone log->Printf("SBFrame::GetSymbol () => error: could not reconstruct " 291b9c1b51eSKate Stone "frame object for this SBFrame."); 2927730b9a4SJim Ingham } 293b9c1b51eSKate Stone } else { 2947730b9a4SJim Ingham if (log) 2957730b9a4SJim Ingham log->Printf("SBFrame::GetSymbol () => error: process is running"); 2967fdf9ef1SGreg Clayton } 297c9858e4dSGreg Clayton } 2984838131bSGreg Clayton if (log) 2994838131bSGreg Clayton log->Printf("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 300324a1036SSaleem Abdulrasool static_cast<void *>(frame), 301324a1036SSaleem Abdulrasool static_cast<void *>(sb_symbol.get())); 302*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_symbol); 3033b06557eSGreg Clayton } 3043b06557eSGreg Clayton 305b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const { 306*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetBlock); 307*baf5664fSJonas Devlieghere 3085160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 30972eff18aSGreg Clayton SBBlock sb_block; 310bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 311bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3124fc6cb9cSJim Ingham 313dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 314d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3157730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 316b9c1b51eSKate Stone if (target && process) { 3177fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 318b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3197730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 320b9c1b51eSKate Stone if (frame) { 321d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block); 322b9c1b51eSKate Stone } else { 323c9858e4dSGreg Clayton if (log) 324b9c1b51eSKate Stone log->Printf("SBFrame::GetBlock () => error: could not reconstruct " 325b9c1b51eSKate Stone "frame object for this SBFrame."); 3267730b9a4SJim Ingham } 327b9c1b51eSKate Stone } else { 3287730b9a4SJim Ingham if (log) 329324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetBlock () => error: process is running", 330324a1036SSaleem Abdulrasool static_cast<void *>(frame)); 3317fdf9ef1SGreg Clayton } 332c9858e4dSGreg Clayton } 3334838131bSGreg Clayton if (log) 3344838131bSGreg Clayton log->Printf("SBFrame(%p)::GetBlock () => SBBlock(%p)", 335324a1036SSaleem Abdulrasool static_cast<void *>(frame), 336324a1036SSaleem Abdulrasool static_cast<void *>(sb_block.GetPtr())); 337*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_block); 33830fdc8d8SChris Lattner } 33930fdc8d8SChris Lattner 340b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const { 341*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetFrameBlock); 342*baf5664fSJonas Devlieghere 34372eff18aSGreg Clayton SBBlock sb_block; 344bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 345bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3464fc6cb9cSJim Ingham 347dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 348d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3495160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 3507730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 351b9c1b51eSKate Stone if (target && process) { 3527fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 353b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3547730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 355b9c1b51eSKate Stone if (frame) { 356d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock()); 357b9c1b51eSKate Stone } else { 358c9858e4dSGreg Clayton if (log) 359b9c1b51eSKate Stone log->Printf("SBFrame::GetFrameBlock () => error: could not " 360b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 3617730b9a4SJim Ingham } 362b9c1b51eSKate Stone } else { 3637730b9a4SJim Ingham if (log) 3647730b9a4SJim Ingham log->Printf("SBFrame::GetFrameBlock () => error: process is running"); 3657fdf9ef1SGreg Clayton } 366c9858e4dSGreg Clayton } 3674838131bSGreg Clayton if (log) 3684838131bSGreg Clayton log->Printf("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 369324a1036SSaleem Abdulrasool static_cast<void *>(frame), 370324a1036SSaleem Abdulrasool static_cast<void *>(sb_block.GetPtr())); 371*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_block); 37295897c6aSGreg Clayton } 37395897c6aSGreg Clayton 374b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const { 375*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBLineEntry, SBFrame, GetLineEntry); 376*baf5664fSJonas Devlieghere 3775160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 37872eff18aSGreg Clayton SBLineEntry sb_line_entry; 379bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 380bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3814fc6cb9cSJim Ingham 382dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 383d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3847730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 385b9c1b51eSKate Stone if (target && process) { 3867fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 387b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3887730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 389b9c1b51eSKate Stone if (frame) { 390b9c1b51eSKate Stone sb_line_entry.SetLineEntry( 391b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextLineEntry).line_entry); 392b9c1b51eSKate Stone } else { 393c9858e4dSGreg Clayton if (log) 394b9c1b51eSKate Stone log->Printf("SBFrame::GetLineEntry () => error: could not " 395b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 3967730b9a4SJim Ingham } 397b9c1b51eSKate Stone } else { 3987730b9a4SJim Ingham if (log) 3997730b9a4SJim Ingham log->Printf("SBFrame::GetLineEntry () => error: process is running"); 4007fdf9ef1SGreg Clayton } 401c9858e4dSGreg Clayton } 4024838131bSGreg Clayton if (log) 4034838131bSGreg Clayton log->Printf("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 404324a1036SSaleem Abdulrasool static_cast<void *>(frame), 405324a1036SSaleem Abdulrasool static_cast<void *>(sb_line_entry.get())); 406*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_line_entry); 40730fdc8d8SChris Lattner } 40830fdc8d8SChris Lattner 409b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const { 410*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBFrame, GetFrameID); 411*baf5664fSJonas Devlieghere 412b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 413b9556accSGreg Clayton 414c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 415c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 416c481c7eeSJim Ingham 417b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 4187fdf9ef1SGreg Clayton if (frame) 419d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex(); 4204838131bSGreg Clayton 4215160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 4224838131bSGreg Clayton if (log) 423b9c1b51eSKate Stone log->Printf("SBFrame(%p)::GetFrameID () => %u", static_cast<void *>(frame), 424b9c1b51eSKate Stone frame_idx); 4254838131bSGreg Clayton return frame_idx; 42630fdc8d8SChris Lattner } 42730fdc8d8SChris Lattner 428b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const { 429*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetCFA); 430*baf5664fSJonas Devlieghere 431c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 432c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 433c481c7eeSJim Ingham 434424a5dbcSGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 435424a5dbcSGreg Clayton if (frame) 436424a5dbcSGreg Clayton return frame->GetStackID().GetCallFrameAddress(); 437424a5dbcSGreg Clayton return LLDB_INVALID_ADDRESS; 438424a5dbcSGreg Clayton } 439424a5dbcSGreg Clayton 440b9c1b51eSKate Stone addr_t SBFrame::GetPC() const { 441*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetPC); 442*baf5664fSJonas Devlieghere 4435160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 44469b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 445bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 446bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4474fc6cb9cSJim Ingham 448dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 449d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4507730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 451b9c1b51eSKate Stone if (target && process) { 4527fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 453b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4547730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 455b9c1b51eSKate Stone if (frame) { 456b9c1b51eSKate Stone addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress( 45704803b3eSTatyana Krasnukha target, AddressClass::eCode); 458b9c1b51eSKate Stone } else { 459c9858e4dSGreg Clayton if (log) 460b9c1b51eSKate Stone log->Printf("SBFrame::GetPC () => error: could not reconstruct frame " 461b9c1b51eSKate Stone "object for this SBFrame."); 4627730b9a4SJim Ingham } 463b9c1b51eSKate Stone } else { 4647730b9a4SJim Ingham if (log) 4657730b9a4SJim Ingham log->Printf("SBFrame::GetPC () => error: process is running"); 466c9858e4dSGreg Clayton } 4677fdf9ef1SGreg Clayton } 468ceb6b139SCaroline Tice 469ceb6b139SCaroline Tice if (log) 470324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetPC () => 0x%" PRIx64, 471324a1036SSaleem Abdulrasool static_cast<void *>(frame), addr); 472ceb6b139SCaroline Tice 473ceb6b139SCaroline Tice return addr; 47430fdc8d8SChris Lattner } 47530fdc8d8SChris Lattner 476b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) { 477*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBFrame, SetPC, (lldb::addr_t), new_pc); 478*baf5664fSJonas Devlieghere 4795160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 480ceb6b139SCaroline Tice bool ret_val = false; 481bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 482bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4834fc6cb9cSJim Ingham 484dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 485d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4867730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 487b9c1b51eSKate Stone if (target && process) { 4887fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 489b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4907730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 491b9c1b51eSKate Stone if (frame) { 492d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC(new_pc); 493b9c1b51eSKate Stone } else { 494c9858e4dSGreg Clayton if (log) 495b9c1b51eSKate Stone log->Printf("SBFrame::SetPC () => error: could not reconstruct frame " 496b9c1b51eSKate Stone "object for this SBFrame."); 4977730b9a4SJim Ingham } 498b9c1b51eSKate Stone } else { 4997730b9a4SJim Ingham if (log) 5007730b9a4SJim Ingham log->Printf("SBFrame::SetPC () => error: process is running"); 501c9858e4dSGreg Clayton } 5027fdf9ef1SGreg Clayton } 503ceb6b139SCaroline Tice 504ceb6b139SCaroline Tice if (log) 505d01b2953SDaniel Malea log->Printf("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i", 506324a1036SSaleem Abdulrasool static_cast<void *>(frame), new_pc, ret_val); 507ceb6b139SCaroline Tice 508ceb6b139SCaroline Tice return ret_val; 50930fdc8d8SChris Lattner } 51030fdc8d8SChris Lattner 511b9c1b51eSKate Stone addr_t SBFrame::GetSP() const { 512*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetSP); 513*baf5664fSJonas Devlieghere 5145160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 5154838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 516bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 517bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5184fc6cb9cSJim Ingham 519dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 520d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5217730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 522b9c1b51eSKate Stone if (target && process) { 5237fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 524b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5257730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 526b9c1b51eSKate Stone if (frame) { 527d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 528b9c1b51eSKate Stone } else { 529c9858e4dSGreg Clayton if (log) 530b9c1b51eSKate Stone log->Printf("SBFrame::GetSP () => error: could not reconstruct frame " 531b9c1b51eSKate Stone "object for this SBFrame."); 5327730b9a4SJim Ingham } 533b9c1b51eSKate Stone } else { 5347730b9a4SJim Ingham if (log) 5357730b9a4SJim Ingham log->Printf("SBFrame::GetSP () => error: process is running"); 5367fdf9ef1SGreg Clayton } 537c9858e4dSGreg Clayton } 5384838131bSGreg Clayton if (log) 539324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetSP () => 0x%" PRIx64, 540324a1036SSaleem Abdulrasool static_cast<void *>(frame), addr); 5414838131bSGreg Clayton 5424838131bSGreg Clayton return addr; 54330fdc8d8SChris Lattner } 54430fdc8d8SChris Lattner 545b9c1b51eSKate Stone addr_t SBFrame::GetFP() const { 546*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetFP); 547*baf5664fSJonas Devlieghere 5485160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 54969b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 550bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 551bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5524fc6cb9cSJim Ingham 553dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 554d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5557730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 556b9c1b51eSKate Stone if (target && process) { 5577fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 558b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5597730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 560b9c1b51eSKate Stone if (frame) { 561d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 562b9c1b51eSKate Stone } else { 563c9858e4dSGreg Clayton if (log) 564b9c1b51eSKate Stone log->Printf("SBFrame::GetFP () => error: could not reconstruct frame " 565b9c1b51eSKate Stone "object for this SBFrame."); 5667730b9a4SJim Ingham } 567b9c1b51eSKate Stone } else { 5687730b9a4SJim Ingham if (log) 5697730b9a4SJim Ingham log->Printf("SBFrame::GetFP () => error: process is running"); 570c9858e4dSGreg Clayton } 5717fdf9ef1SGreg Clayton } 572ceb6b139SCaroline Tice 573ceb6b139SCaroline Tice if (log) 574324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetFP () => 0x%" PRIx64, 575324a1036SSaleem Abdulrasool static_cast<void *>(frame), addr); 576ceb6b139SCaroline Tice return addr; 57730fdc8d8SChris Lattner } 57830fdc8d8SChris Lattner 579b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const { 580*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBFrame, GetPCAddress); 581*baf5664fSJonas Devlieghere 5825160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 58330fdc8d8SChris Lattner SBAddress sb_addr; 584bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 585bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5864fc6cb9cSJim Ingham 587b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 588d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5897730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 590b9c1b51eSKate Stone if (target && process) { 5917fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 592b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5937730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 594b9c1b51eSKate Stone if (frame) { 595d9e416c0SGreg Clayton sb_addr.SetAddress(&frame->GetFrameCodeAddress()); 596b9c1b51eSKate Stone } else { 597c9858e4dSGreg Clayton if (log) 598b9c1b51eSKate Stone log->Printf("SBFrame::GetPCAddress () => error: could not " 599b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 6007730b9a4SJim Ingham } 601b9c1b51eSKate Stone } else { 6027730b9a4SJim Ingham if (log) 6037730b9a4SJim Ingham log->Printf("SBFrame::GetPCAddress () => error: process is running"); 6047fdf9ef1SGreg Clayton } 605c9858e4dSGreg Clayton } 6064838131bSGreg Clayton if (log) 607324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", 608b9c1b51eSKate Stone static_cast<void *>(frame), static_cast<void *>(sb_addr.get())); 609*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_addr); 61030fdc8d8SChris Lattner } 61130fdc8d8SChris Lattner 612*baf5664fSJonas Devlieghere void SBFrame::Clear() { 613*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBFrame, Clear); 614*baf5664fSJonas Devlieghere 615*baf5664fSJonas Devlieghere m_opaque_sp->Clear(); 616*baf5664fSJonas Devlieghere } 61730fdc8d8SChris Lattner 618b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) { 619*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 620*baf5664fSJonas Devlieghere (const char *), var_path); 621*baf5664fSJonas Devlieghere 6227edbdfc9SGreg Clayton SBValue sb_value; 623c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 624c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 625c481c7eeSJim Ingham 626b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 627d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 628b9c1b51eSKate Stone if (frame && target) { 629b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 630b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 6317edbdfc9SGreg Clayton sb_value = GetValueForVariablePath(var_path, use_dynamic); 6327edbdfc9SGreg Clayton } 633*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 6347edbdfc9SGreg Clayton } 6357edbdfc9SGreg Clayton 636b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path, 637b9c1b51eSKate Stone DynamicValueType use_dynamic) { 638*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 639*baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), var_path, 640*baf5664fSJonas Devlieghere use_dynamic); 641*baf5664fSJonas Devlieghere 6427edbdfc9SGreg Clayton SBValue sb_value; 6435160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 644b9c1b51eSKate Stone if (var_path == nullptr || var_path[0] == '\0') { 6457730b9a4SJim Ingham if (log) 646b9c1b51eSKate Stone log->Printf( 647b9c1b51eSKate Stone "SBFrame::GetValueForVariablePath called with empty variable path."); 648*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 6497730b9a4SJim Ingham } 6507730b9a4SJim Ingham 651bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 652bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 6534fc6cb9cSJim Ingham 654dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 655d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6567730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 657b9c1b51eSKate Stone if (target && process) { 6587fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 659b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 6607730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 661b9c1b51eSKate Stone if (frame) { 6627edbdfc9SGreg Clayton VariableSP var_sp; 66397206d57SZachary Turner Status error; 664b9c1b51eSKate Stone ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath( 665b9c1b51eSKate Stone var_path, eNoDynamicValues, 666b9c1b51eSKate Stone StackFrame::eExpressionPathOptionCheckPtrVsMember | 667b9c1b51eSKate Stone StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 668b9c1b51eSKate Stone var_sp, error)); 669e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 670b9c1b51eSKate Stone } else { 671c9858e4dSGreg Clayton if (log) 672b9c1b51eSKate Stone log->Printf("SBFrame::GetValueForVariablePath () => error: could not " 673b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 6747730b9a4SJim Ingham } 675b9c1b51eSKate Stone } else { 6767730b9a4SJim Ingham if (log) 677b9c1b51eSKate Stone log->Printf( 678b9c1b51eSKate Stone "SBFrame::GetValueForVariablePath () => error: process is running"); 679c9858e4dSGreg Clayton } 6807fdf9ef1SGreg Clayton } 681*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 6827edbdfc9SGreg Clayton } 6837edbdfc9SGreg Clayton 684b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) { 685*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *), 686*baf5664fSJonas Devlieghere name); 687*baf5664fSJonas Devlieghere 688316d498bSGreg Clayton SBValue value; 689c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 690c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 691c481c7eeSJim Ingham 692b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 693d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 694b9c1b51eSKate Stone if (frame && target) { 695b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 696b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 697316d498bSGreg Clayton value = FindVariable(name, use_dynamic); 698316d498bSGreg Clayton } 699*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value); 70078a685aaSJim Ingham } 70178a685aaSJim Ingham 702b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name, 703b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 704*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, 705*baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), name, use_dynamic); 706*baf5664fSJonas Devlieghere 7075160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 70869b582faSGreg Clayton VariableSP var_sp; 70958b59f95SJim Ingham SBValue sb_value; 7107730b9a4SJim Ingham 711b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 7127730b9a4SJim Ingham if (log) 7137730b9a4SJim Ingham log->Printf("SBFrame::FindVariable called with empty name"); 714*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 7157730b9a4SJim Ingham } 7167730b9a4SJim Ingham 71781e871edSGreg Clayton ValueObjectSP value_sp; 718bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 719bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7204fc6cb9cSJim Ingham 721dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 722d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7237730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 724b9c1b51eSKate Stone if (target && process) { 7257fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 726b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 7277730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 728b9c1b51eSKate Stone if (frame) { 729e23d0b63SShafik Yaghmour value_sp = frame->FindVariable(ConstString(name)); 73030fdc8d8SChris Lattner 731e23d0b63SShafik Yaghmour if (value_sp) 732e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 733b9c1b51eSKate Stone } else { 734c9858e4dSGreg Clayton if (log) 735b9c1b51eSKate Stone log->Printf("SBFrame::FindVariable () => error: could not " 736b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 7377730b9a4SJim Ingham } 738b9c1b51eSKate Stone } else { 7397730b9a4SJim Ingham if (log) 7407730b9a4SJim Ingham log->Printf("SBFrame::FindVariable () => error: process is running"); 741c9858e4dSGreg Clayton } 742316d498bSGreg Clayton } 743316d498bSGreg Clayton 7444838131bSGreg Clayton if (log) 74569b582faSGreg Clayton log->Printf("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 746324a1036SSaleem Abdulrasool static_cast<void *>(frame), name, 747324a1036SSaleem Abdulrasool static_cast<void *>(value_sp.get())); 7484838131bSGreg Clayton 749*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 750dde9cff3SCaroline Tice } 751dde9cff3SCaroline Tice 752b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) { 753*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue, 754*baf5664fSJonas Devlieghere (const char *, lldb::ValueType), name, value_type); 755*baf5664fSJonas Devlieghere 756316d498bSGreg Clayton SBValue value; 757c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 758c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 759c481c7eeSJim Ingham 760b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 761d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 762b9c1b51eSKate Stone if (frame && target) { 763b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 764b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 765316d498bSGreg Clayton value = FindValue(name, value_type, use_dynamic); 766316d498bSGreg Clayton } 767*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value); 76878a685aaSJim Ingham } 76978a685aaSJim Ingham 770b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type, 771b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 772*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue, 773*baf5664fSJonas Devlieghere (const char *, lldb::ValueType, lldb::DynamicValueType), 774*baf5664fSJonas Devlieghere name, value_type, use_dynamic); 775*baf5664fSJonas Devlieghere 7765160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 77769b582faSGreg Clayton SBValue sb_value; 7787730b9a4SJim Ingham 779b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 7807730b9a4SJim Ingham if (log) 7817730b9a4SJim Ingham log->Printf("SBFrame::FindValue called with empty name."); 782*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 7837730b9a4SJim Ingham } 7847730b9a4SJim Ingham 78581e871edSGreg Clayton ValueObjectSP value_sp; 786bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 787bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7884fc6cb9cSJim Ingham 789dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 790d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7917730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 792b9c1b51eSKate Stone if (target && process) { 7937fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 794b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 7957730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 796b9c1b51eSKate Stone if (frame) { 7978a2a0dfbSEnrico Granata VariableList variable_list; 7988a2a0dfbSEnrico Granata 799b9c1b51eSKate Stone switch (value_type) { 80069b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 80169b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 80269b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 80369b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 80463a27afaSGreg Clayton case eValueTypeVariableThreadLocal: // thread local variables 80569b582faSGreg Clayton { 806d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 80772eff18aSGreg Clayton 80872eff18aSGreg Clayton const bool can_create = true; 80972eff18aSGreg Clayton const bool get_parent_variables = true; 81072eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 81172eff18aSGreg Clayton 8120efb51a0SChaoren Lin if (sc.block) 813b9c1b51eSKate Stone sc.block->AppendVariables( 814b9c1b51eSKate Stone can_create, get_parent_variables, 815b9c1b51eSKate Stone stop_if_block_is_inlined_function, 816b9c1b51eSKate Stone [frame](Variable *v) { return v->IsInScope(frame); }, 817b9c1b51eSKate Stone &variable_list); 818b9c1b51eSKate Stone if (value_type == eValueTypeVariableGlobal) { 8198a2a0dfbSEnrico Granata const bool get_file_globals = true; 8208a2a0dfbSEnrico Granata VariableList *frame_vars = frame->GetVariableList(get_file_globals); 8218a2a0dfbSEnrico Granata if (frame_vars) 8228a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 8238a2a0dfbSEnrico Granata } 82469b582faSGreg Clayton ConstString const_name(name); 825b9c1b51eSKate Stone VariableSP variable_sp( 826b9c1b51eSKate Stone variable_list.FindVariable(const_name, value_type)); 827b9c1b51eSKate Stone if (variable_sp) { 828b9c1b51eSKate Stone value_sp = frame->GetValueObjectForFrameVariable(variable_sp, 829b9c1b51eSKate Stone eNoDynamicValues); 830e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 83130fdc8d8SChris Lattner } 832b9c1b51eSKate Stone } break; 83369b582faSGreg Clayton 83469b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 83569b582faSGreg Clayton { 836d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 837b9c1b51eSKate Stone if (reg_ctx) { 83869b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 839b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 840b9c1b51eSKate Stone const RegisterInfo *reg_info = 841b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 84269b582faSGreg Clayton if (reg_info && 84369b582faSGreg Clayton ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 844b9c1b51eSKate Stone (reg_info->alt_name && 845b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 846d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 84781e871edSGreg Clayton sb_value.SetSP(value_sp); 84881e871edSGreg Clayton break; 84969b582faSGreg Clayton } 85069b582faSGreg Clayton } 85169b582faSGreg Clayton } 852b9c1b51eSKate Stone } break; 85369b582faSGreg Clayton 854b9c1b51eSKate Stone case eValueTypeRegisterSet: // A collection of stack frame register 855b9c1b51eSKate Stone // values 85669b582faSGreg Clayton { 857d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 858b9c1b51eSKate Stone if (reg_ctx) { 85969b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 860b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 86169b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx); 86269b582faSGreg Clayton if (reg_set && 86369b582faSGreg Clayton ((reg_set->name && strcasecmp(reg_set->name, name) == 0) || 864b9c1b51eSKate Stone (reg_set->short_name && 865b9c1b51eSKate Stone strcasecmp(reg_set->short_name, name) == 0))) { 866b9c1b51eSKate Stone value_sp = 867b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx); 86881e871edSGreg Clayton sb_value.SetSP(value_sp); 86981e871edSGreg Clayton break; 87069b582faSGreg Clayton } 87169b582faSGreg Clayton } 87269b582faSGreg Clayton } 873b9c1b51eSKate Stone } break; 87469b582faSGreg Clayton 87569b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 87669b582faSGreg Clayton { 87769b582faSGreg Clayton ConstString const_name(name); 878b9c1b51eSKate Stone ExpressionVariableSP expr_var_sp( 879b9c1b51eSKate Stone target->GetPersistentVariable(const_name)); 880b9c1b51eSKate Stone if (expr_var_sp) { 88181e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 882e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 88381e871edSGreg Clayton } 884b9c1b51eSKate Stone } break; 88569b582faSGreg Clayton 88669b582faSGreg Clayton default: 88769b582faSGreg Clayton break; 88869b582faSGreg Clayton } 889b9c1b51eSKate Stone } else { 890c9858e4dSGreg Clayton if (log) 891b9c1b51eSKate Stone log->Printf("SBFrame::FindValue () => error: could not reconstruct " 892b9c1b51eSKate Stone "frame object for this SBFrame."); 8937730b9a4SJim Ingham } 894b9c1b51eSKate Stone } else { 8957730b9a4SJim Ingham if (log) 8967730b9a4SJim Ingham log->Printf("SBFrame::FindValue () => error: process is running"); 897c9858e4dSGreg Clayton } 8987fdf9ef1SGreg Clayton } 899dde9cff3SCaroline Tice 9004838131bSGreg Clayton if (log) 901b9c1b51eSKate Stone log->Printf("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) " 902b9c1b51eSKate Stone "=> SBValue(%p)", 903324a1036SSaleem Abdulrasool static_cast<void *>(frame), name, value_type, 904324a1036SSaleem Abdulrasool static_cast<void *>(value_sp.get())); 9054838131bSGreg Clayton 906*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 907dde9cff3SCaroline Tice } 908dde9cff3SCaroline Tice 909b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const { 910*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &), 911*baf5664fSJonas Devlieghere that); 912*baf5664fSJonas Devlieghere 913b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 914b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 91535e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 91635e2ab60SJohnny Chen } 91735e2ab60SJohnny Chen 918*baf5664fSJonas Devlieghere bool SBFrame::operator==(const SBFrame &rhs) const { 919*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator==,(const lldb::SBFrame &), 920*baf5664fSJonas Devlieghere rhs); 92130fdc8d8SChris Lattner 922*baf5664fSJonas Devlieghere return IsEqual(rhs); 923*baf5664fSJonas Devlieghere } 924*baf5664fSJonas Devlieghere 925*baf5664fSJonas Devlieghere bool SBFrame::operator!=(const SBFrame &rhs) const { 926*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator!=,(const lldb::SBFrame &), 927*baf5664fSJonas Devlieghere rhs); 928*baf5664fSJonas Devlieghere 929*baf5664fSJonas Devlieghere return !IsEqual(rhs); 930*baf5664fSJonas Devlieghere } 93130fdc8d8SChris Lattner 932b9c1b51eSKate Stone SBThread SBFrame::GetThread() const { 933*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBFrame, GetThread); 934*baf5664fSJonas Devlieghere 9355160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 936ceb6b139SCaroline Tice 937c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 938c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 939c481c7eeSJim Ingham 940d9e416c0SGreg Clayton ThreadSP thread_sp(exe_ctx.GetThreadSP()); 941d9e416c0SGreg Clayton SBThread sb_thread(thread_sp); 942ceb6b139SCaroline Tice 943b9c1b51eSKate Stone if (log) { 944750cd175SCaroline Tice SBStream sstr; 945750cd175SCaroline Tice sb_thread.GetDescription(sstr); 946d9e416c0SGreg Clayton log->Printf("SBFrame(%p)::GetThread () => SBThread(%p): %s", 947324a1036SSaleem Abdulrasool static_cast<void *>(exe_ctx.GetFramePtr()), 948324a1036SSaleem Abdulrasool static_cast<void *>(thread_sp.get()), sstr.GetData()); 949750cd175SCaroline Tice } 950ceb6b139SCaroline Tice 951*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_thread); 95230fdc8d8SChris Lattner } 95330fdc8d8SChris Lattner 954b9c1b51eSKate Stone const char *SBFrame::Disassemble() const { 955*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, Disassemble); 956*baf5664fSJonas Devlieghere 9575160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 958dbb0abbfSEugene Zelenko const char *disassembly = nullptr; 959bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 960bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9614fc6cb9cSJim Ingham 962dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 963d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 9647730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 965b9c1b51eSKate Stone if (target && process) { 9667fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 967b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9687730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 969b9c1b51eSKate Stone if (frame) { 970d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 971b9c1b51eSKate Stone } else { 972c9858e4dSGreg Clayton if (log) 973b9c1b51eSKate Stone log->Printf("SBFrame::Disassemble () => error: could not reconstruct " 974b9c1b51eSKate Stone "frame object for this SBFrame."); 9757730b9a4SJim Ingham } 976b9c1b51eSKate Stone } else { 9777730b9a4SJim Ingham if (log) 9787730b9a4SJim Ingham log->Printf("SBFrame::Disassemble () => error: process is running"); 9797fdf9ef1SGreg Clayton } 980c9858e4dSGreg Clayton } 9814838131bSGreg Clayton 9824838131bSGreg Clayton if (log) 983b9c1b51eSKate Stone log->Printf("SBFrame(%p)::Disassemble () => %s", static_cast<void *>(frame), 984b9c1b51eSKate Stone disassembly); 9854838131bSGreg Clayton 9864838131bSGreg Clayton return disassembly; 98730fdc8d8SChris Lattner } 98830fdc8d8SChris Lattner 989b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics, 990b9c1b51eSKate Stone bool in_scope_only) { 991*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 992*baf5664fSJonas Devlieghere (bool, bool, bool, bool), arguments, locals, statics, 993*baf5664fSJonas Devlieghere in_scope_only); 994*baf5664fSJonas Devlieghere 995316d498bSGreg Clayton SBValueList value_list; 996c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 997c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 998c481c7eeSJim Ingham 999b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1000d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1001b9c1b51eSKate Stone if (frame && target) { 1002b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 1003b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 1004b9c1b51eSKate Stone const bool include_runtime_support_values = 1005b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 100651f96eebSZachary Turner 100751f96eebSZachary Turner SBVariablesOptions options; 100851f96eebSZachary Turner options.SetIncludeArguments(arguments); 100951f96eebSZachary Turner options.SetIncludeLocals(locals); 101051f96eebSZachary Turner options.SetIncludeStatics(statics); 101151f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 101251f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 101351f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 101451f96eebSZachary Turner 101551f96eebSZachary Turner value_list = GetVariables(options); 1016316d498bSGreg Clayton } 1017*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value_list); 101878a685aaSJim Ingham } 101978a685aaSJim Ingham 1020b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals, 1021b9c1b51eSKate Stone bool statics, bool in_scope_only, 1022b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 1023*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1024*baf5664fSJonas Devlieghere (bool, bool, bool, bool, lldb::DynamicValueType), 1025*baf5664fSJonas Devlieghere arguments, locals, statics, in_scope_only, use_dynamic); 1026*baf5664fSJonas Devlieghere 1027c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1028c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1029c481c7eeSJim Ingham 1030560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1031b9c1b51eSKate Stone const bool include_runtime_support_values = 1032b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 103351f96eebSZachary Turner SBVariablesOptions options; 103451f96eebSZachary Turner options.SetIncludeArguments(arguments); 103551f96eebSZachary Turner options.SetIncludeLocals(locals); 103651f96eebSZachary Turner options.SetIncludeStatics(statics); 103751f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 103851f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 103951f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 1040*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(GetVariables(options)); 1041560558ebSEnrico Granata } 1042560558ebSEnrico Granata 1043b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) { 1044*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 1045*baf5664fSJonas Devlieghere (const lldb::SBVariablesOptions &), options); 1046*baf5664fSJonas Devlieghere 10475160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1048ceb6b139SCaroline Tice 1049b9556accSGreg Clayton SBValueList value_list; 1050bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1051bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 10524fc6cb9cSJim Ingham 1053dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1054d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1055b9556accSGreg Clayton 105651f96eebSZachary Turner const bool statics = options.GetIncludeStatics(); 105751f96eebSZachary Turner const bool arguments = options.GetIncludeArguments(); 10584c7f5d5cSKuba Mracek const bool recognized_arguments = 10594c7f5d5cSKuba Mracek options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP())); 106051f96eebSZachary Turner const bool locals = options.GetIncludeLocals(); 106151f96eebSZachary Turner const bool in_scope_only = options.GetInScopeOnly(); 1062b9c1b51eSKate Stone const bool include_runtime_support_values = 1063b9c1b51eSKate Stone options.GetIncludeRuntimeSupportValues(); 106451f96eebSZachary Turner const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 106551f96eebSZachary Turner 1066ceb6b139SCaroline Tice if (log) 106741ae8e74SKuba Mracek log->Printf( 106841ae8e74SKuba Mracek "SBFrame::GetVariables (arguments=%i, recognized_arguments=%i, " 106941ae8e74SKuba Mracek "locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)", 107041ae8e74SKuba Mracek arguments, recognized_arguments, locals, statics, in_scope_only, 107151f96eebSZachary Turner include_runtime_support_values, use_dynamic); 1072ceb6b139SCaroline Tice 1073349213f9SGreg Clayton std::set<VariableSP> variable_set; 10747730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1075b9c1b51eSKate Stone if (target && process) { 10767fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1077b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 10787730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1079b9c1b51eSKate Stone if (frame) { 108030fdc8d8SChris Lattner size_t i; 1081dbb0abbfSEugene Zelenko VariableList *variable_list = nullptr; 1082d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 1083b9c1b51eSKate Stone if (variable_list) { 108430fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 1085b9c1b51eSKate Stone if (num_variables) { 1086b9c1b51eSKate Stone for (i = 0; i < num_variables; ++i) { 108730fdc8d8SChris Lattner VariableSP variable_sp(variable_list->GetVariableAtIndex(i)); 1088b9c1b51eSKate Stone if (variable_sp) { 108930fdc8d8SChris Lattner bool add_variable = false; 1090b9c1b51eSKate Stone switch (variable_sp->GetScope()) { 109130fdc8d8SChris Lattner case eValueTypeVariableGlobal: 109230fdc8d8SChris Lattner case eValueTypeVariableStatic: 109363a27afaSGreg Clayton case eValueTypeVariableThreadLocal: 109430fdc8d8SChris Lattner add_variable = statics; 109530fdc8d8SChris Lattner break; 109630fdc8d8SChris Lattner 109730fdc8d8SChris Lattner case eValueTypeVariableArgument: 109830fdc8d8SChris Lattner add_variable = arguments; 109930fdc8d8SChris Lattner break; 110030fdc8d8SChris Lattner 110130fdc8d8SChris Lattner case eValueTypeVariableLocal: 110230fdc8d8SChris Lattner add_variable = locals; 110330fdc8d8SChris Lattner break; 1104c982c768SGreg Clayton 1105c982c768SGreg Clayton default: 1106c982c768SGreg Clayton break; 110730fdc8d8SChris Lattner } 1108b9c1b51eSKate Stone if (add_variable) { 1109349213f9SGreg Clayton // Only add variables once so we don't end up with duplicates 1110349213f9SGreg Clayton if (variable_set.find(variable_sp) == variable_set.end()) 1111349213f9SGreg Clayton variable_set.insert(variable_sp); 1112349213f9SGreg Clayton else 1113349213f9SGreg Clayton continue; 1114349213f9SGreg Clayton 1115d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 111630fdc8d8SChris Lattner continue; 111730fdc8d8SChris Lattner 1118b9c1b51eSKate Stone ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable( 1119b9c1b51eSKate Stone variable_sp, eNoDynamicValues)); 1120560558ebSEnrico Granata 1121b9c1b51eSKate Stone if (!include_runtime_support_values && valobj_sp != nullptr && 1122dbb0abbfSEugene Zelenko valobj_sp->IsRuntimeSupportValue()) 1123560558ebSEnrico Granata continue; 1124560558ebSEnrico Granata 1125e3e91517SEnrico Granata SBValue value_sb; 1126e3e91517SEnrico Granata value_sb.SetSP(valobj_sp, use_dynamic); 1127e3e91517SEnrico Granata value_list.Append(value_sb); 112830fdc8d8SChris Lattner } 112930fdc8d8SChris Lattner } 113030fdc8d8SChris Lattner } 113130fdc8d8SChris Lattner } 113230fdc8d8SChris Lattner } 113341ae8e74SKuba Mracek if (recognized_arguments) { 113441ae8e74SKuba Mracek auto recognized_frame = frame->GetRecognizedFrame(); 113541ae8e74SKuba Mracek if (recognized_frame) { 113641ae8e74SKuba Mracek ValueObjectListSP recognized_arg_list = 113741ae8e74SKuba Mracek recognized_frame->GetRecognizedArguments(); 113841ae8e74SKuba Mracek if (recognized_arg_list) { 113941ae8e74SKuba Mracek for (auto &rec_value_sp : recognized_arg_list->GetObjects()) { 114041ae8e74SKuba Mracek SBValue value_sb; 114141ae8e74SKuba Mracek value_sb.SetSP(rec_value_sp, use_dynamic); 114241ae8e74SKuba Mracek value_list.Append(value_sb); 114341ae8e74SKuba Mracek } 114441ae8e74SKuba Mracek } 114541ae8e74SKuba Mracek } 114641ae8e74SKuba Mracek } 1147b9c1b51eSKate Stone } else { 1148c9858e4dSGreg Clayton if (log) 1149b9c1b51eSKate Stone log->Printf("SBFrame::GetVariables () => error: could not " 1150b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 11517730b9a4SJim Ingham } 1152b9c1b51eSKate Stone } else { 11537730b9a4SJim Ingham if (log) 11547730b9a4SJim Ingham log->Printf("SBFrame::GetVariables () => error: process is running"); 1155c9858e4dSGreg Clayton } 11567fdf9ef1SGreg Clayton } 1157ceb6b139SCaroline Tice 1158ceb6b139SCaroline Tice if (log) 1159324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", 1160324a1036SSaleem Abdulrasool static_cast<void *>(frame), 1161324a1036SSaleem Abdulrasool static_cast<void *>(value_list.opaque_ptr())); 1162ceb6b139SCaroline Tice 1163*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value_list); 116430fdc8d8SChris Lattner } 116530fdc8d8SChris Lattner 1166b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() { 1167*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValueList, SBFrame, GetRegisters); 1168*baf5664fSJonas Devlieghere 11695160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1170ceb6b139SCaroline Tice 117130fdc8d8SChris Lattner SBValueList value_list; 1172bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1173bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11744fc6cb9cSJim Ingham 1175dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1176d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 11777730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1178b9c1b51eSKate Stone if (target && process) { 11797fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1180b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11817730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1182b9c1b51eSKate Stone if (frame) { 1183d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 1184b9c1b51eSKate Stone if (reg_ctx) { 118530fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 1186b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 1187b9c1b51eSKate Stone value_list.Append( 1188b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx)); 118930fdc8d8SChris Lattner } 119030fdc8d8SChris Lattner } 1191b9c1b51eSKate Stone } else { 1192c9858e4dSGreg Clayton if (log) 1193b9c1b51eSKate Stone log->Printf("SBFrame::GetRegisters () => error: could not " 1194b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 11957730b9a4SJim Ingham } 1196b9c1b51eSKate Stone } else { 11977730b9a4SJim Ingham if (log) 11987730b9a4SJim Ingham log->Printf("SBFrame::GetRegisters () => error: process is running"); 1199c9858e4dSGreg Clayton } 12007fdf9ef1SGreg Clayton } 1201ceb6b139SCaroline Tice 1202ceb6b139SCaroline Tice if (log) 1203324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::GetRegisters () => SBValueList(%p)", 1204324a1036SSaleem Abdulrasool static_cast<void *>(frame), 1205324a1036SSaleem Abdulrasool static_cast<void *>(value_list.opaque_ptr())); 1206ceb6b139SCaroline Tice 1207*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value_list); 120830fdc8d8SChris Lattner } 120930fdc8d8SChris Lattner 1210b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) { 1211*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *), 1212*baf5664fSJonas Devlieghere name); 1213*baf5664fSJonas Devlieghere 1214ad9a53c5SJason Molenda Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1215ad9a53c5SJason Molenda 1216ad9a53c5SJason Molenda SBValue result; 1217ad9a53c5SJason Molenda ValueObjectSP value_sp; 1218bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1219bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1220ad9a53c5SJason Molenda 1221dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1222ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 1223ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1224b9c1b51eSKate Stone if (target && process) { 1225ad9a53c5SJason Molenda Process::StopLocker stop_locker; 1226b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1227ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 1228b9c1b51eSKate Stone if (frame) { 1229ad9a53c5SJason Molenda RegisterContextSP reg_ctx(frame->GetRegisterContext()); 1230b9c1b51eSKate Stone if (reg_ctx) { 1231ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 1232b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 1233b9c1b51eSKate Stone const RegisterInfo *reg_info = 1234b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 1235ad9a53c5SJason Molenda if (reg_info && 1236ad9a53c5SJason Molenda ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 1237b9c1b51eSKate Stone (reg_info->alt_name && 1238b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 1239ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 1240ad9a53c5SJason Molenda result.SetSP(value_sp); 1241ad9a53c5SJason Molenda break; 1242ad9a53c5SJason Molenda } 1243ad9a53c5SJason Molenda } 1244ad9a53c5SJason Molenda } 1245b9c1b51eSKate Stone } else { 1246ad9a53c5SJason Molenda if (log) 1247b9c1b51eSKate Stone log->Printf("SBFrame::FindRegister () => error: could not " 1248b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 1249ad9a53c5SJason Molenda } 1250b9c1b51eSKate Stone } else { 1251ad9a53c5SJason Molenda if (log) 12525d353842SJason Molenda log->Printf("SBFrame::FindRegister () => error: process is running"); 1253ad9a53c5SJason Molenda } 1254ad9a53c5SJason Molenda } 1255ad9a53c5SJason Molenda 1256ad9a53c5SJason Molenda if (log) 1257324a1036SSaleem Abdulrasool log->Printf("SBFrame(%p)::FindRegister () => SBValue(%p)", 1258324a1036SSaleem Abdulrasool static_cast<void *>(frame), 1259324a1036SSaleem Abdulrasool static_cast<void *>(value_sp.get())); 1260ad9a53c5SJason Molenda 1261*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(result); 1262ad9a53c5SJason Molenda } 1263ad9a53c5SJason Molenda 1264b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) { 1265*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &), 1266*baf5664fSJonas Devlieghere description); 1267*baf5664fSJonas Devlieghere 12685160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1269da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1270da7bc7d0SGreg Clayton 1271bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1272bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 12734fc6cb9cSJim Ingham 1274b57e4a1bSJason Molenda StackFrame *frame; 1275d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 12767730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1277b9c1b51eSKate Stone if (target && process) { 12787fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1279b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 12807730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1281b9c1b51eSKate Stone if (frame) { 1282d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&strm); 1283b9c1b51eSKate Stone } else { 1284c9858e4dSGreg Clayton if (log) 1285b9c1b51eSKate Stone log->Printf("SBFrame::GetDescription () => error: could not " 1286b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 12877730b9a4SJim Ingham } 1288b9c1b51eSKate Stone } else { 12897730b9a4SJim Ingham if (log) 12907730b9a4SJim Ingham log->Printf("SBFrame::GetDescription () => error: process is running"); 1291c9858e4dSGreg Clayton } 1292c9858e4dSGreg Clayton 1293b9c1b51eSKate Stone } else 1294da7bc7d0SGreg Clayton strm.PutCString("No value"); 1295dde9cff3SCaroline Tice 1296dde9cff3SCaroline Tice return true; 1297dde9cff3SCaroline Tice } 12981d3afba3SGreg Clayton 1299b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) { 1300*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, (const char *), 1301*baf5664fSJonas Devlieghere expr); 1302*baf5664fSJonas Devlieghere 1303316d498bSGreg Clayton SBValue result; 1304c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1305c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1306c481c7eeSJim Ingham 1307b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1308d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1309b9c1b51eSKate Stone if (frame && target) { 131035e1bda6SJim Ingham SBExpressionOptions options; 1311b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value = 1312b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 1313cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 131435e1bda6SJim Ingham options.SetUnwindOnError(true); 131524785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1316998c8a1cSRyan Brown if (target->GetLanguage() != eLanguageTypeUnknown) 1317998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1318998c8a1cSRyan Brown else 1319998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1320*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 1321316d498bSGreg Clayton } 1322*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(result); 132378a685aaSJim Ingham } 132478a685aaSJim Ingham 132578a685aaSJim Ingham SBValue 1326b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr, 1327b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value) { 1328*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1329*baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), expr, 1330*baf5664fSJonas Devlieghere fetch_dynamic_value); 1331*baf5664fSJonas Devlieghere 133235e1bda6SJim Ingham SBExpressionOptions options; 1333cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 133435e1bda6SJim Ingham options.SetUnwindOnError(true); 133524785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1336c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1337c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1338c481c7eeSJim Ingham 1339998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1340998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1341998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1342998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1343998c8a1cSRyan Brown else if (frame) 1344998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1345*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 13467ba6e991SJim Ingham } 13477ba6e991SJim Ingham 1348b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr, 1349b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value, 1350b9c1b51eSKate Stone bool unwind_on_error) { 1351*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1352*baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType, bool), expr, 1353*baf5664fSJonas Devlieghere fetch_dynamic_value, unwind_on_error); 1354*baf5664fSJonas Devlieghere 135535e1bda6SJim Ingham SBExpressionOptions options; 1356c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1357c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1358c481c7eeSJim Ingham 1359cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 136035e1bda6SJim Ingham options.SetUnwindOnError(unwind_on_error); 136124785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1362998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1363998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1364998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1365998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1366998c8a1cSRyan Brown else if (frame) 1367998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1368*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 136935e1bda6SJim Ingham } 137035e1bda6SJim Ingham 1371b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr, 1372b9c1b51eSKate Stone const SBExpressionOptions &options) { 1373*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1374*baf5664fSJonas Devlieghere (const char *, const lldb::SBExpressionOptions &), expr, 1375*baf5664fSJonas Devlieghere options); 1376*baf5664fSJonas Devlieghere 13775160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 13784838131bSGreg Clayton 1379358efd65SSaleem Abdulrasool #ifndef LLDB_DISABLE_PYTHON 13805160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1381358efd65SSaleem Abdulrasool #endif 1382a162ebafSSean Callanan 13838646d3c1SJim Ingham ExpressionResults exe_results = eExpressionSetupError; 138469b582faSGreg Clayton SBValue expr_result; 13857730b9a4SJim Ingham 1386b9c1b51eSKate Stone if (expr == nullptr || expr[0] == '\0') { 13877730b9a4SJim Ingham if (log) 1388b9c1b51eSKate Stone log->Printf( 1389b9c1b51eSKate Stone "SBFrame::EvaluateExpression called with an empty expression"); 1390*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(expr_result); 13917730b9a4SJim Ingham } 13927730b9a4SJim Ingham 139381e871edSGreg Clayton ValueObjectSP expr_value_sp; 13944838131bSGreg Clayton 1395bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1396bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 13974fc6cb9cSJim Ingham 1398b9556accSGreg Clayton if (log) 13997730b9a4SJim Ingham log->Printf("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr); 1400b9556accSGreg Clayton 1401dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 14027730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 14037730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 14047730b9a4SJim Ingham 1405b9c1b51eSKate Stone if (target && process) { 14067fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1407b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 14087730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1409b9c1b51eSKate Stone if (frame) { 14108f7db52dSJim Ingham std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace; 1411b9c1b51eSKate Stone if (target->GetDisplayExpressionsInCrashlogs()) { 14121ba7c4d0SGreg Clayton StreamString frame_description; 1413d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&frame_description); 14148f7db52dSJim Ingham stack_trace = llvm::make_unique<llvm::PrettyStackTraceFormat>( 1415b9c1b51eSKate Stone "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value " 1416b9c1b51eSKate Stone "= %u) %s", 1417b9c1b51eSKate Stone expr, options.GetFetchDynamicValue(), 1418c156427dSZachary Turner frame_description.GetData()); 1419fb6621efSGreg Clayton } 1420fb6621efSGreg Clayton 1421b9c1b51eSKate Stone exe_results = target->EvaluateExpression(expr, frame, expr_value_sp, 142235e1bda6SJim Ingham options.ref()); 1423e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1424b9c1b51eSKate Stone } else { 1425c9858e4dSGreg Clayton if (log) 1426b9c1b51eSKate Stone log->Printf("SBFrame::EvaluateExpression () => error: could not " 1427b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 14287730b9a4SJim Ingham } 1429b9c1b51eSKate Stone } else { 14307730b9a4SJim Ingham if (log) 1431b9c1b51eSKate Stone log->Printf( 1432b9c1b51eSKate Stone "SBFrame::EvaluateExpression () => error: process is running"); 1433c9858e4dSGreg Clayton } 14347fdf9ef1SGreg Clayton } 14354838131bSGreg Clayton 1436cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1437a162ebafSSean Callanan if (expr_log) 1438b9c1b51eSKate Stone expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is " 1439b9c1b51eSKate Stone "%s, summary %s **", 1440324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 1441a162ebafSSean Callanan 14424838131bSGreg Clayton if (log) 1443b9c1b51eSKate Stone log->Printf("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) " 1444b9c1b51eSKate Stone "(execution result=%d)", 1445324a1036SSaleem Abdulrasool static_cast<void *>(frame), expr, 1446324a1036SSaleem Abdulrasool static_cast<void *>(expr_value_sp.get()), exe_results); 1447cf7e2dc0SJason Molenda #endif 14484838131bSGreg Clayton 1449*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(expr_result); 14501d3afba3SGreg Clayton } 1451316d498bSGreg Clayton 1452b9c1b51eSKate Stone bool SBFrame::IsInlined() { 1453*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsInlined); 1454*baf5664fSJonas Devlieghere 145505f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->IsInlined(); 145605f75e9fSOleksiy Vyalov } 145705f75e9fSOleksiy Vyalov 1458b9c1b51eSKate Stone bool SBFrame::IsInlined() const { 1459*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsInlined); 1460*baf5664fSJonas Devlieghere 14615160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1462c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1463c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1464c481c7eeSJim Ingham 1465dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1466d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 14677730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1468b9c1b51eSKate Stone if (target && process) { 14697fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1470b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 14717730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1472b9c1b51eSKate Stone if (frame) { 14737fdf9ef1SGreg Clayton 1474d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1475316d498bSGreg Clayton if (block) 1476dbb0abbfSEugene Zelenko return block->GetContainingInlinedBlock() != nullptr; 1477b9c1b51eSKate Stone } else { 1478c9858e4dSGreg Clayton if (log) 1479b9c1b51eSKate Stone log->Printf("SBFrame::IsInlined () => error: could not reconstruct " 1480b9c1b51eSKate Stone "frame object for this SBFrame."); 14817730b9a4SJim Ingham } 1482b9c1b51eSKate Stone } else { 14837730b9a4SJim Ingham if (log) 14847730b9a4SJim Ingham log->Printf("SBFrame::IsInlined () => error: process is running"); 1485c9858e4dSGreg Clayton } 14867fdf9ef1SGreg Clayton } 1487316d498bSGreg Clayton return false; 1488316d498bSGreg Clayton } 1489316d498bSGreg Clayton 14904b36f791SVedant Kumar bool SBFrame::IsArtificial() { 1491*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsArtificial); 1492*baf5664fSJonas Devlieghere 14934b36f791SVedant Kumar return static_cast<const SBFrame *>(this)->IsArtificial(); 14944b36f791SVedant Kumar } 14954b36f791SVedant Kumar 14964b36f791SVedant Kumar bool SBFrame::IsArtificial() const { 1497*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsArtificial); 1498*baf5664fSJonas Devlieghere 14994b36f791SVedant Kumar std::unique_lock<std::recursive_mutex> lock; 15004b36f791SVedant Kumar ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 15014b36f791SVedant Kumar 15024b36f791SVedant Kumar StackFrame *frame = exe_ctx.GetFramePtr(); 15034b36f791SVedant Kumar if (frame) 15044b36f791SVedant Kumar return frame->IsArtificial(); 15054b36f791SVedant Kumar 15064b36f791SVedant Kumar return false; 15074b36f791SVedant Kumar } 15084b36f791SVedant Kumar 1509b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() { 1510*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetFunctionName); 1511*baf5664fSJonas Devlieghere 151205f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->GetFunctionName(); 151305f75e9fSOleksiy Vyalov } 151405f75e9fSOleksiy Vyalov 1515bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const { 1516*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBFrame, GuessLanguage); 1517*baf5664fSJonas Devlieghere 1518bdbdd229SJim Ingham std::unique_lock<std::recursive_mutex> lock; 1519bdbdd229SJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1520bdbdd229SJim Ingham 1521bdbdd229SJim Ingham StackFrame *frame = nullptr; 1522bdbdd229SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1523bdbdd229SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1524bdbdd229SJim Ingham if (target && process) { 1525bdbdd229SJim Ingham Process::StopLocker stop_locker; 1526bdbdd229SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) { 1527bdbdd229SJim Ingham frame = exe_ctx.GetFramePtr(); 1528bdbdd229SJim Ingham if (frame) { 1529bdbdd229SJim Ingham return frame->GuessLanguage(); 1530bdbdd229SJim Ingham } 1531bdbdd229SJim Ingham } 1532bdbdd229SJim Ingham } 1533bdbdd229SJim Ingham return eLanguageTypeUnknown; 1534bdbdd229SJim Ingham } 1535bdbdd229SJim Ingham 1536b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const { 1537*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, GetFunctionName); 1538*baf5664fSJonas Devlieghere 15395160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1540dbb0abbfSEugene Zelenko const char *name = nullptr; 1541c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1542c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1543c481c7eeSJim Ingham 1544dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1545d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 15467730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1547b9c1b51eSKate Stone if (target && process) { 15487fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1549b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 15507730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1551b9c1b51eSKate Stone if (frame) { 1552b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1553b9c1b51eSKate Stone eSymbolContextBlock | 1554b9c1b51eSKate Stone eSymbolContextSymbol)); 1555b9c1b51eSKate Stone if (sc.block) { 1556316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1557b9c1b51eSKate Stone if (inlined_block) { 1558b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1559b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1560b9c1b51eSKate Stone name = 1561b9c1b51eSKate Stone inlined_info->GetName(sc.function->GetLanguage()).AsCString(); 1562316d498bSGreg Clayton } 1563316d498bSGreg Clayton } 1564316d498bSGreg Clayton 1565b9c1b51eSKate Stone if (name == nullptr) { 1566316d498bSGreg Clayton if (sc.function) 1567316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1568316d498bSGreg Clayton } 1569316d498bSGreg Clayton 1570b9c1b51eSKate Stone if (name == nullptr) { 1571316d498bSGreg Clayton if (sc.symbol) 1572316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1573316d498bSGreg Clayton } 1574b9c1b51eSKate Stone } else { 1575c9858e4dSGreg Clayton if (log) 1576b9c1b51eSKate Stone log->Printf("SBFrame::GetFunctionName () => error: could not " 1577b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 15787730b9a4SJim Ingham } 1579b9c1b51eSKate Stone } else { 15807730b9a4SJim Ingham if (log) 15817730b9a4SJim Ingham log->Printf("SBFrame::GetFunctionName() => error: process is running"); 1582c9858e4dSGreg Clayton } 15837fdf9ef1SGreg Clayton } 1584316d498bSGreg Clayton return name; 1585316d498bSGreg Clayton } 1586c1f705c2SEnrico Granata 1587b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() { 1588*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetDisplayFunctionName); 1589*baf5664fSJonas Devlieghere 1590c1f705c2SEnrico Granata Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1591dbb0abbfSEugene Zelenko const char *name = nullptr; 1592c481c7eeSJim Ingham 1593c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1594c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1595c481c7eeSJim Ingham 1596dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1597c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1598c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 1599b9c1b51eSKate Stone if (target && process) { 1600c1f705c2SEnrico Granata Process::StopLocker stop_locker; 1601b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1602c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr(); 1603b9c1b51eSKate Stone if (frame) { 1604b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1605b9c1b51eSKate Stone eSymbolContextBlock | 1606b9c1b51eSKate Stone eSymbolContextSymbol)); 1607b9c1b51eSKate Stone if (sc.block) { 1608c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1609b9c1b51eSKate Stone if (inlined_block) { 1610b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1611b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1612b9c1b51eSKate Stone name = inlined_info->GetDisplayName(sc.function->GetLanguage()) 1613b9c1b51eSKate Stone .AsCString(); 1614c1f705c2SEnrico Granata } 1615c1f705c2SEnrico Granata } 1616c1f705c2SEnrico Granata 1617b9c1b51eSKate Stone if (name == nullptr) { 1618c1f705c2SEnrico Granata if (sc.function) 1619c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString(); 1620c1f705c2SEnrico Granata } 1621c1f705c2SEnrico Granata 1622b9c1b51eSKate Stone if (name == nullptr) { 1623c1f705c2SEnrico Granata if (sc.symbol) 1624c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString(); 1625c1f705c2SEnrico Granata } 1626b9c1b51eSKate Stone } else { 1627c1f705c2SEnrico Granata if (log) 1628b9c1b51eSKate Stone log->Printf("SBFrame::GetDisplayFunctionName () => error: could not " 1629b9c1b51eSKate Stone "reconstruct frame object for this SBFrame."); 1630c1f705c2SEnrico Granata } 1631b9c1b51eSKate Stone } else { 1632c1f705c2SEnrico Granata if (log) 1633b9c1b51eSKate Stone log->Printf( 1634b9c1b51eSKate Stone "SBFrame::GetDisplayFunctionName() => error: process is running"); 1635c1f705c2SEnrico Granata } 1636c1f705c2SEnrico Granata } 1637c1f705c2SEnrico Granata return name; 1638c1f705c2SEnrico Granata } 1639