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" 18baf5664fSJonas 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" 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 57baf5664fSJonas Devlieghere SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) { 58baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBFrame); 59baf5664fSJonas Devlieghere } 6030fdc8d8SChris Lattner 61b9c1b51eSKate Stone SBFrame::SBFrame(const StackFrameSP &lldb_object_sp) 62b9c1b51eSKate Stone : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) { 63baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBFrame, (const lldb::StackFrameSP &), 64baf5664fSJonas Devlieghere lldb_object_sp); 6530fdc8d8SChris Lattner } 6630fdc8d8SChris Lattner 67bd4bf82aSJonas Devlieghere SBFrame::SBFrame(const SBFrame &rhs) : m_opaque_sp() { 68baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBFrame, (const lldb::SBFrame &), rhs); 69baf5664fSJonas Devlieghere 70bd4bf82aSJonas Devlieghere m_opaque_sp = clone(rhs.m_opaque_sp); 71bd4bf82aSJonas Devlieghere } 72efabb123SGreg Clayton 73dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default; 74dbb0abbfSEugene Zelenko 75b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) { 76baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBFrame &, 77baf5664fSJonas Devlieghere SBFrame, operator=,(const lldb::SBFrame &), rhs); 78baf5664fSJonas Devlieghere 79efabb123SGreg Clayton if (this != &rhs) 80bd4bf82aSJonas 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 { 93baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsValid); 94baf5664fSJonas Devlieghere 95bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 96bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 977fa7dc36SJim Ingham 987fa7dc36SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 997fa7dc36SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 100b9c1b51eSKate Stone if (target && process) { 1017fa7dc36SJim Ingham Process::StopLocker stop_locker; 1027fa7dc36SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 103dbb0abbfSEugene Zelenko return GetFrameSP().get() != nullptr; 10430fdc8d8SChris Lattner } 10530fdc8d8SChris Lattner 1067fa7dc36SJim Ingham // Without a target & process we can't have a valid stack frame. 1077fa7dc36SJim Ingham return false; 1087fa7dc36SJim Ingham } 1097fa7dc36SJim Ingham 110b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const { 111baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext, 112baf5664fSJonas Devlieghere (uint32_t), resolve_scope); 113baf5664fSJonas Devlieghere 11430fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 115bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 116bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 117991e4453SZachary Turner SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope); 118dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 119d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1207730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 121b9c1b51eSKate Stone if (target && process) { 1227fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 123b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1247730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 125*581af8b0SJonas Devlieghere if (frame) 126991e4453SZachary Turner sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext(scope)); 127c9858e4dSGreg Clayton } 1287fdf9ef1SGreg Clayton } 129ceb6b139SCaroline Tice 130baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_sym_ctx); 13130fdc8d8SChris Lattner } 13230fdc8d8SChris Lattner 133b9c1b51eSKate Stone SBModule SBFrame::GetModule() const { 134baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBModule, SBFrame, GetModule); 135baf5664fSJonas Devlieghere 13672eff18aSGreg Clayton SBModule sb_module; 137acdbe816SGreg Clayton ModuleSP module_sp; 138bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 139bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1404fc6cb9cSJim Ingham 141dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 142d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1437730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 144b9c1b51eSKate Stone if (target && process) { 1457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 146b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1477730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 148b9c1b51eSKate Stone if (frame) { 149d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp; 150acdbe816SGreg Clayton sb_module.SetSP(module_sp); 151c9858e4dSGreg Clayton } 1527fdf9ef1SGreg Clayton } 153*581af8b0SJonas Devlieghere } 1544838131bSGreg Clayton 155baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_module); 15630fdc8d8SChris Lattner } 15730fdc8d8SChris Lattner 158b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const { 159baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBCompileUnit, SBFrame, 160baf5664fSJonas Devlieghere GetCompileUnit); 161baf5664fSJonas Devlieghere 16272eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 163bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 164bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1654fc6cb9cSJim Ingham 166dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 167d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1687730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 169b9c1b51eSKate Stone if (target && process) { 1707fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 171b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1727730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 173b9c1b51eSKate Stone if (frame) { 174b9c1b51eSKate Stone sb_comp_unit.reset( 175b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit); 176c9858e4dSGreg Clayton } 177c9858e4dSGreg Clayton } 178*581af8b0SJonas Devlieghere } 179ceb6b139SCaroline Tice 180baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_comp_unit); 18130fdc8d8SChris Lattner } 18230fdc8d8SChris Lattner 183b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const { 184baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFunction, SBFrame, GetFunction); 185baf5664fSJonas Devlieghere 18672eff18aSGreg Clayton SBFunction sb_function; 187bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 188bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1894fc6cb9cSJim Ingham 190dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 191d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1927730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 193b9c1b51eSKate Stone if (target && process) { 1947fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 195b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1967730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 197b9c1b51eSKate Stone if (frame) { 198b9c1b51eSKate Stone sb_function.reset( 199b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextFunction).function); 2007fdf9ef1SGreg Clayton } 201c9858e4dSGreg Clayton } 202*581af8b0SJonas Devlieghere } 2034838131bSGreg Clayton 204baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_function); 20530fdc8d8SChris Lattner } 20630fdc8d8SChris Lattner 207b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const { 208baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBSymbol, SBFrame, GetSymbol); 209baf5664fSJonas Devlieghere 21072eff18aSGreg Clayton SBSymbol sb_symbol; 211bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 212bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2134fc6cb9cSJim Ingham 214dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 215d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2167730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 217b9c1b51eSKate Stone if (target && process) { 2187fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 219b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2207730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 221b9c1b51eSKate Stone if (frame) { 222d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol); 2237fdf9ef1SGreg Clayton } 224c9858e4dSGreg Clayton } 225*581af8b0SJonas Devlieghere } 226*581af8b0SJonas Devlieghere 227baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_symbol); 2283b06557eSGreg Clayton } 2293b06557eSGreg Clayton 230b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const { 231baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetBlock); 232baf5664fSJonas Devlieghere 23372eff18aSGreg Clayton SBBlock sb_block; 234bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 235bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2364fc6cb9cSJim Ingham 237dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 238d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2397730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 240b9c1b51eSKate Stone if (target && process) { 2417fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 242b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2437730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 244*581af8b0SJonas Devlieghere if (frame) 245d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block); 2467fdf9ef1SGreg Clayton } 247c9858e4dSGreg Clayton } 248baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_block); 24930fdc8d8SChris Lattner } 25030fdc8d8SChris Lattner 251b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const { 252baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetFrameBlock); 253baf5664fSJonas Devlieghere 25472eff18aSGreg Clayton SBBlock sb_block; 255bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 256bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2574fc6cb9cSJim Ingham 258dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 259d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2607730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 261b9c1b51eSKate Stone if (target && process) { 2627fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 263b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2647730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 265*581af8b0SJonas Devlieghere if (frame) 266d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock()); 2677fdf9ef1SGreg Clayton } 268c9858e4dSGreg Clayton } 269baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_block); 27095897c6aSGreg Clayton } 27195897c6aSGreg Clayton 272b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const { 273baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBLineEntry, SBFrame, GetLineEntry); 274baf5664fSJonas Devlieghere 27572eff18aSGreg Clayton SBLineEntry sb_line_entry; 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) { 287b9c1b51eSKate Stone sb_line_entry.SetLineEntry( 288b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextLineEntry).line_entry); 2897fdf9ef1SGreg Clayton } 290c9858e4dSGreg Clayton } 291*581af8b0SJonas Devlieghere } 292baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_line_entry); 29330fdc8d8SChris Lattner } 29430fdc8d8SChris Lattner 295b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const { 296baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBFrame, GetFrameID); 297baf5664fSJonas Devlieghere 298b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 299b9556accSGreg Clayton 300c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 301c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 302c481c7eeSJim Ingham 303b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 3047fdf9ef1SGreg Clayton if (frame) 305d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex(); 3064838131bSGreg Clayton 3074838131bSGreg Clayton return frame_idx; 30830fdc8d8SChris Lattner } 30930fdc8d8SChris Lattner 310b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const { 311baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetCFA); 312baf5664fSJonas Devlieghere 313c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 314c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 315c481c7eeSJim Ingham 316424a5dbcSGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 317424a5dbcSGreg Clayton if (frame) 318424a5dbcSGreg Clayton return frame->GetStackID().GetCallFrameAddress(); 319424a5dbcSGreg Clayton return LLDB_INVALID_ADDRESS; 320424a5dbcSGreg Clayton } 321424a5dbcSGreg Clayton 322b9c1b51eSKate Stone addr_t SBFrame::GetPC() const { 323baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetPC); 324baf5664fSJonas Devlieghere 32569b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 326bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 327bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3284fc6cb9cSJim Ingham 329dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 330d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3317730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 332b9c1b51eSKate Stone if (target && process) { 3337fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 334b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3357730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 336b9c1b51eSKate Stone if (frame) { 337b9c1b51eSKate Stone addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress( 33804803b3eSTatyana Krasnukha target, AddressClass::eCode); 339c9858e4dSGreg Clayton } 3407fdf9ef1SGreg Clayton } 341*581af8b0SJonas Devlieghere } 342ceb6b139SCaroline Tice 343ceb6b139SCaroline Tice return addr; 34430fdc8d8SChris Lattner } 34530fdc8d8SChris Lattner 346b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) { 347baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBFrame, SetPC, (lldb::addr_t), new_pc); 348baf5664fSJonas Devlieghere 349ceb6b139SCaroline Tice bool ret_val = false; 350bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 351bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3524fc6cb9cSJim Ingham 353dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 354d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3557730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 356b9c1b51eSKate Stone if (target && process) { 3577fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 358b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3597730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 360b9c1b51eSKate Stone if (frame) { 361d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC(new_pc); 362c9858e4dSGreg Clayton } 3637fdf9ef1SGreg Clayton } 364*581af8b0SJonas Devlieghere } 365ceb6b139SCaroline Tice 366ceb6b139SCaroline Tice return ret_val; 36730fdc8d8SChris Lattner } 36830fdc8d8SChris Lattner 369b9c1b51eSKate Stone addr_t SBFrame::GetSP() const { 370baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetSP); 371baf5664fSJonas Devlieghere 3724838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 373bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 374bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3754fc6cb9cSJim Ingham 376dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 377d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3787730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 379b9c1b51eSKate Stone if (target && process) { 3807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 381b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3827730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 383b9c1b51eSKate Stone if (frame) { 384d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 3857fdf9ef1SGreg Clayton } 386c9858e4dSGreg Clayton } 387*581af8b0SJonas Devlieghere } 3884838131bSGreg Clayton 3894838131bSGreg Clayton return addr; 39030fdc8d8SChris Lattner } 39130fdc8d8SChris Lattner 392b9c1b51eSKate Stone addr_t SBFrame::GetFP() const { 393baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetFP); 394baf5664fSJonas Devlieghere 39569b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 396bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 397bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3984fc6cb9cSJim Ingham 399dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 400d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4017730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 402b9c1b51eSKate Stone if (target && process) { 4037fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 404b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4057730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 406*581af8b0SJonas Devlieghere if (frame) 407d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 408c9858e4dSGreg Clayton } 4097fdf9ef1SGreg Clayton } 410ceb6b139SCaroline Tice 411ceb6b139SCaroline Tice return addr; 41230fdc8d8SChris Lattner } 41330fdc8d8SChris Lattner 414b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const { 415baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBFrame, GetPCAddress); 416baf5664fSJonas Devlieghere 41730fdc8d8SChris Lattner SBAddress sb_addr; 418bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 419bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4204fc6cb9cSJim Ingham 421b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 422d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4237730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 424b9c1b51eSKate Stone if (target && process) { 4257fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 426b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4277730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 428*581af8b0SJonas Devlieghere if (frame) 429d9e416c0SGreg Clayton sb_addr.SetAddress(&frame->GetFrameCodeAddress()); 4307fdf9ef1SGreg Clayton } 431c9858e4dSGreg Clayton } 432baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_addr); 43330fdc8d8SChris Lattner } 43430fdc8d8SChris Lattner 435baf5664fSJonas Devlieghere void SBFrame::Clear() { 436baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBFrame, Clear); 437baf5664fSJonas Devlieghere 438baf5664fSJonas Devlieghere m_opaque_sp->Clear(); 439baf5664fSJonas Devlieghere } 44030fdc8d8SChris Lattner 441b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) { 442baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 443baf5664fSJonas Devlieghere (const char *), var_path); 444baf5664fSJonas Devlieghere 4457edbdfc9SGreg Clayton SBValue sb_value; 446c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 447c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 448c481c7eeSJim Ingham 449b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 450d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 451b9c1b51eSKate Stone if (frame && target) { 452b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 453b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 4547edbdfc9SGreg Clayton sb_value = GetValueForVariablePath(var_path, use_dynamic); 4557edbdfc9SGreg Clayton } 456baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 4577edbdfc9SGreg Clayton } 4587edbdfc9SGreg Clayton 459b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path, 460b9c1b51eSKate Stone DynamicValueType use_dynamic) { 461baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 462baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), var_path, 463baf5664fSJonas Devlieghere use_dynamic); 464baf5664fSJonas Devlieghere 4657edbdfc9SGreg Clayton SBValue sb_value; 466b9c1b51eSKate Stone if (var_path == nullptr || var_path[0] == '\0') { 467baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 4687730b9a4SJim Ingham } 4697730b9a4SJim Ingham 470bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 471bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4724fc6cb9cSJim Ingham 473dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 474d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4757730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 476b9c1b51eSKate Stone if (target && process) { 4777fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 478b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4797730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 480b9c1b51eSKate Stone if (frame) { 4817edbdfc9SGreg Clayton VariableSP var_sp; 48297206d57SZachary Turner Status error; 483b9c1b51eSKate Stone ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath( 484b9c1b51eSKate Stone var_path, eNoDynamicValues, 485b9c1b51eSKate Stone StackFrame::eExpressionPathOptionCheckPtrVsMember | 486b9c1b51eSKate Stone StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 487b9c1b51eSKate Stone var_sp, error)); 488e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 4897730b9a4SJim Ingham } 490c9858e4dSGreg Clayton } 4917fdf9ef1SGreg Clayton } 492baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 4937edbdfc9SGreg Clayton } 4947edbdfc9SGreg Clayton 495b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) { 496baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *), 497baf5664fSJonas Devlieghere name); 498baf5664fSJonas Devlieghere 499316d498bSGreg Clayton SBValue value; 500c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 501c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 502c481c7eeSJim Ingham 503b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 504d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 505b9c1b51eSKate Stone if (frame && target) { 506b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 507b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 508316d498bSGreg Clayton value = FindVariable(name, use_dynamic); 509316d498bSGreg Clayton } 510baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value); 51178a685aaSJim Ingham } 51278a685aaSJim Ingham 513b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name, 514b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 515baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, 516baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), name, use_dynamic); 517baf5664fSJonas Devlieghere 51869b582faSGreg Clayton VariableSP var_sp; 51958b59f95SJim Ingham SBValue sb_value; 5207730b9a4SJim Ingham 521b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 522baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 5237730b9a4SJim Ingham } 5247730b9a4SJim Ingham 52581e871edSGreg Clayton ValueObjectSP value_sp; 526bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 527bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5284fc6cb9cSJim Ingham 529dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 530d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5317730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 532b9c1b51eSKate Stone if (target && process) { 5337fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 534b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5357730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 536b9c1b51eSKate Stone if (frame) { 537e23d0b63SShafik Yaghmour value_sp = frame->FindVariable(ConstString(name)); 53830fdc8d8SChris Lattner 539e23d0b63SShafik Yaghmour if (value_sp) 540e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 541c9858e4dSGreg Clayton } 542316d498bSGreg Clayton } 543*581af8b0SJonas Devlieghere } 5444838131bSGreg Clayton 545baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 546dde9cff3SCaroline Tice } 547dde9cff3SCaroline Tice 548b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) { 549baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue, 550baf5664fSJonas Devlieghere (const char *, lldb::ValueType), name, value_type); 551baf5664fSJonas Devlieghere 552316d498bSGreg Clayton SBValue value; 553c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 554c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 555c481c7eeSJim Ingham 556b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 557d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 558b9c1b51eSKate Stone if (frame && target) { 559b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 560b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 561316d498bSGreg Clayton value = FindValue(name, value_type, use_dynamic); 562316d498bSGreg Clayton } 563baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value); 56478a685aaSJim Ingham } 56578a685aaSJim Ingham 566b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type, 567b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 568baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue, 569baf5664fSJonas Devlieghere (const char *, lldb::ValueType, lldb::DynamicValueType), 570baf5664fSJonas Devlieghere name, value_type, use_dynamic); 571baf5664fSJonas Devlieghere 57269b582faSGreg Clayton SBValue sb_value; 5737730b9a4SJim Ingham 574b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 575baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 5767730b9a4SJim Ingham } 5777730b9a4SJim Ingham 57881e871edSGreg Clayton ValueObjectSP value_sp; 579bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 580bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5814fc6cb9cSJim Ingham 582dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 583d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5847730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 585b9c1b51eSKate Stone if (target && process) { 5867fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 587b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5887730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 589b9c1b51eSKate Stone if (frame) { 5908a2a0dfbSEnrico Granata VariableList variable_list; 5918a2a0dfbSEnrico Granata 592b9c1b51eSKate Stone switch (value_type) { 59369b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 59469b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 59569b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 59669b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 59763a27afaSGreg Clayton case eValueTypeVariableThreadLocal: // thread local variables 59869b582faSGreg Clayton { 599d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 60072eff18aSGreg Clayton 60172eff18aSGreg Clayton const bool can_create = true; 60272eff18aSGreg Clayton const bool get_parent_variables = true; 60372eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 60472eff18aSGreg Clayton 6050efb51a0SChaoren Lin if (sc.block) 606b9c1b51eSKate Stone sc.block->AppendVariables( 607b9c1b51eSKate Stone can_create, get_parent_variables, 608b9c1b51eSKate Stone stop_if_block_is_inlined_function, 609b9c1b51eSKate Stone [frame](Variable *v) { return v->IsInScope(frame); }, 610b9c1b51eSKate Stone &variable_list); 611b9c1b51eSKate Stone if (value_type == eValueTypeVariableGlobal) { 6128a2a0dfbSEnrico Granata const bool get_file_globals = true; 6138a2a0dfbSEnrico Granata VariableList *frame_vars = frame->GetVariableList(get_file_globals); 6148a2a0dfbSEnrico Granata if (frame_vars) 6158a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 6168a2a0dfbSEnrico Granata } 61769b582faSGreg Clayton ConstString const_name(name); 618b9c1b51eSKate Stone VariableSP variable_sp( 619b9c1b51eSKate Stone variable_list.FindVariable(const_name, value_type)); 620b9c1b51eSKate Stone if (variable_sp) { 621b9c1b51eSKate Stone value_sp = frame->GetValueObjectForFrameVariable(variable_sp, 622b9c1b51eSKate Stone eNoDynamicValues); 623e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 62430fdc8d8SChris Lattner } 625b9c1b51eSKate Stone } break; 62669b582faSGreg Clayton 62769b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 62869b582faSGreg Clayton { 629d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 630b9c1b51eSKate Stone if (reg_ctx) { 63169b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 632b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 633b9c1b51eSKate Stone const RegisterInfo *reg_info = 634b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 63569b582faSGreg Clayton if (reg_info && 63669b582faSGreg Clayton ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 637b9c1b51eSKate Stone (reg_info->alt_name && 638b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 639d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 64081e871edSGreg Clayton sb_value.SetSP(value_sp); 64181e871edSGreg Clayton break; 64269b582faSGreg Clayton } 64369b582faSGreg Clayton } 64469b582faSGreg Clayton } 645b9c1b51eSKate Stone } break; 64669b582faSGreg Clayton 647b9c1b51eSKate Stone case eValueTypeRegisterSet: // A collection of stack frame register 648b9c1b51eSKate Stone // values 64969b582faSGreg Clayton { 650d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 651b9c1b51eSKate Stone if (reg_ctx) { 65269b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 653b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 65469b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx); 65569b582faSGreg Clayton if (reg_set && 65669b582faSGreg Clayton ((reg_set->name && strcasecmp(reg_set->name, name) == 0) || 657b9c1b51eSKate Stone (reg_set->short_name && 658b9c1b51eSKate Stone strcasecmp(reg_set->short_name, name) == 0))) { 659b9c1b51eSKate Stone value_sp = 660b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx); 66181e871edSGreg Clayton sb_value.SetSP(value_sp); 66281e871edSGreg Clayton break; 66369b582faSGreg Clayton } 66469b582faSGreg Clayton } 66569b582faSGreg Clayton } 666b9c1b51eSKate Stone } break; 66769b582faSGreg Clayton 66869b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 66969b582faSGreg Clayton { 67069b582faSGreg Clayton ConstString const_name(name); 671b9c1b51eSKate Stone ExpressionVariableSP expr_var_sp( 672b9c1b51eSKate Stone target->GetPersistentVariable(const_name)); 673b9c1b51eSKate Stone if (expr_var_sp) { 67481e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 675e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 67681e871edSGreg Clayton } 677b9c1b51eSKate Stone } break; 67869b582faSGreg Clayton 67969b582faSGreg Clayton default: 68069b582faSGreg Clayton break; 68169b582faSGreg Clayton } 682c9858e4dSGreg Clayton } 6837fdf9ef1SGreg Clayton } 684*581af8b0SJonas Devlieghere } 6854838131bSGreg Clayton 686baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value); 687dde9cff3SCaroline Tice } 688dde9cff3SCaroline Tice 689b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const { 690baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &), 691baf5664fSJonas Devlieghere that); 692baf5664fSJonas Devlieghere 693b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 694b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 69535e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 69635e2ab60SJohnny Chen } 69735e2ab60SJohnny Chen 698baf5664fSJonas Devlieghere bool SBFrame::operator==(const SBFrame &rhs) const { 699baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator==,(const lldb::SBFrame &), 700baf5664fSJonas Devlieghere rhs); 70130fdc8d8SChris Lattner 702baf5664fSJonas Devlieghere return IsEqual(rhs); 703baf5664fSJonas Devlieghere } 704baf5664fSJonas Devlieghere 705baf5664fSJonas Devlieghere bool SBFrame::operator!=(const SBFrame &rhs) const { 706baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator!=,(const lldb::SBFrame &), 707baf5664fSJonas Devlieghere rhs); 708baf5664fSJonas Devlieghere 709baf5664fSJonas Devlieghere return !IsEqual(rhs); 710baf5664fSJonas Devlieghere } 71130fdc8d8SChris Lattner 712b9c1b51eSKate Stone SBThread SBFrame::GetThread() const { 713baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBFrame, GetThread); 714baf5664fSJonas Devlieghere 715c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 716c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 717c481c7eeSJim Ingham 718d9e416c0SGreg Clayton ThreadSP thread_sp(exe_ctx.GetThreadSP()); 719d9e416c0SGreg Clayton SBThread sb_thread(thread_sp); 720ceb6b139SCaroline Tice 721baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_thread); 72230fdc8d8SChris Lattner } 72330fdc8d8SChris Lattner 724b9c1b51eSKate Stone const char *SBFrame::Disassemble() const { 725baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, Disassemble); 726baf5664fSJonas Devlieghere 727dbb0abbfSEugene Zelenko const char *disassembly = nullptr; 728bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 729bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7304fc6cb9cSJim Ingham 731dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 732d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7337730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 734b9c1b51eSKate Stone if (target && process) { 7357fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 736b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 7377730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 738b9c1b51eSKate Stone if (frame) { 739d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 7407fdf9ef1SGreg Clayton } 741c9858e4dSGreg Clayton } 742*581af8b0SJonas Devlieghere } 7434838131bSGreg Clayton 7444838131bSGreg Clayton return disassembly; 74530fdc8d8SChris Lattner } 74630fdc8d8SChris Lattner 747b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics, 748b9c1b51eSKate Stone bool in_scope_only) { 749baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 750baf5664fSJonas Devlieghere (bool, bool, bool, bool), arguments, locals, statics, 751baf5664fSJonas Devlieghere in_scope_only); 752baf5664fSJonas Devlieghere 753316d498bSGreg Clayton SBValueList value_list; 754c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 755c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 756c481c7eeSJim Ingham 757b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 758d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 759b9c1b51eSKate Stone if (frame && target) { 760b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 761b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 762b9c1b51eSKate Stone const bool include_runtime_support_values = 763b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 76451f96eebSZachary Turner 76551f96eebSZachary Turner SBVariablesOptions options; 76651f96eebSZachary Turner options.SetIncludeArguments(arguments); 76751f96eebSZachary Turner options.SetIncludeLocals(locals); 76851f96eebSZachary Turner options.SetIncludeStatics(statics); 76951f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 77051f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 77151f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 77251f96eebSZachary Turner 77351f96eebSZachary Turner value_list = GetVariables(options); 774316d498bSGreg Clayton } 775baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value_list); 77678a685aaSJim Ingham } 77778a685aaSJim Ingham 778b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals, 779b9c1b51eSKate Stone bool statics, bool in_scope_only, 780b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 781baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 782baf5664fSJonas Devlieghere (bool, bool, bool, bool, lldb::DynamicValueType), 783baf5664fSJonas Devlieghere arguments, locals, statics, in_scope_only, use_dynamic); 784baf5664fSJonas Devlieghere 785c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 786c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 787c481c7eeSJim Ingham 788560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 789b9c1b51eSKate Stone const bool include_runtime_support_values = 790b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 79151f96eebSZachary Turner SBVariablesOptions options; 79251f96eebSZachary Turner options.SetIncludeArguments(arguments); 79351f96eebSZachary Turner options.SetIncludeLocals(locals); 79451f96eebSZachary Turner options.SetIncludeStatics(statics); 79551f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 79651f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 79751f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 798baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(GetVariables(options)); 799560558ebSEnrico Granata } 800560558ebSEnrico Granata 801b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) { 802baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 803baf5664fSJonas Devlieghere (const lldb::SBVariablesOptions &), options); 804baf5664fSJonas Devlieghere 805b9556accSGreg Clayton SBValueList value_list; 806bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 807bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 8084fc6cb9cSJim Ingham 809dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 810d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 811b9556accSGreg Clayton 81251f96eebSZachary Turner const bool statics = options.GetIncludeStatics(); 81351f96eebSZachary Turner const bool arguments = options.GetIncludeArguments(); 8144c7f5d5cSKuba Mracek const bool recognized_arguments = 8154c7f5d5cSKuba Mracek options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP())); 81651f96eebSZachary Turner const bool locals = options.GetIncludeLocals(); 81751f96eebSZachary Turner const bool in_scope_only = options.GetInScopeOnly(); 818b9c1b51eSKate Stone const bool include_runtime_support_values = 819b9c1b51eSKate Stone options.GetIncludeRuntimeSupportValues(); 82051f96eebSZachary Turner const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 82151f96eebSZachary Turner 822ceb6b139SCaroline Tice 823349213f9SGreg Clayton std::set<VariableSP> variable_set; 8247730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 825b9c1b51eSKate Stone if (target && process) { 8267fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 827b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 8287730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 829b9c1b51eSKate Stone if (frame) { 83030fdc8d8SChris Lattner size_t i; 831dbb0abbfSEugene Zelenko VariableList *variable_list = nullptr; 832d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 833b9c1b51eSKate Stone if (variable_list) { 83430fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 835b9c1b51eSKate Stone if (num_variables) { 836b9c1b51eSKate Stone for (i = 0; i < num_variables; ++i) { 83730fdc8d8SChris Lattner VariableSP variable_sp(variable_list->GetVariableAtIndex(i)); 838b9c1b51eSKate Stone if (variable_sp) { 83930fdc8d8SChris Lattner bool add_variable = false; 840b9c1b51eSKate Stone switch (variable_sp->GetScope()) { 84130fdc8d8SChris Lattner case eValueTypeVariableGlobal: 84230fdc8d8SChris Lattner case eValueTypeVariableStatic: 84363a27afaSGreg Clayton case eValueTypeVariableThreadLocal: 84430fdc8d8SChris Lattner add_variable = statics; 84530fdc8d8SChris Lattner break; 84630fdc8d8SChris Lattner 84730fdc8d8SChris Lattner case eValueTypeVariableArgument: 84830fdc8d8SChris Lattner add_variable = arguments; 84930fdc8d8SChris Lattner break; 85030fdc8d8SChris Lattner 85130fdc8d8SChris Lattner case eValueTypeVariableLocal: 85230fdc8d8SChris Lattner add_variable = locals; 85330fdc8d8SChris Lattner break; 854c982c768SGreg Clayton 855c982c768SGreg Clayton default: 856c982c768SGreg Clayton break; 85730fdc8d8SChris Lattner } 858b9c1b51eSKate Stone if (add_variable) { 859349213f9SGreg Clayton // Only add variables once so we don't end up with duplicates 860349213f9SGreg Clayton if (variable_set.find(variable_sp) == variable_set.end()) 861349213f9SGreg Clayton variable_set.insert(variable_sp); 862349213f9SGreg Clayton else 863349213f9SGreg Clayton continue; 864349213f9SGreg Clayton 865d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 86630fdc8d8SChris Lattner continue; 86730fdc8d8SChris Lattner 868b9c1b51eSKate Stone ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable( 869b9c1b51eSKate Stone variable_sp, eNoDynamicValues)); 870560558ebSEnrico Granata 871b9c1b51eSKate Stone if (!include_runtime_support_values && valobj_sp != nullptr && 872dbb0abbfSEugene Zelenko valobj_sp->IsRuntimeSupportValue()) 873560558ebSEnrico Granata continue; 874560558ebSEnrico Granata 875e3e91517SEnrico Granata SBValue value_sb; 876e3e91517SEnrico Granata value_sb.SetSP(valobj_sp, use_dynamic); 877e3e91517SEnrico Granata value_list.Append(value_sb); 87830fdc8d8SChris Lattner } 87930fdc8d8SChris Lattner } 88030fdc8d8SChris Lattner } 88130fdc8d8SChris Lattner } 88230fdc8d8SChris Lattner } 88341ae8e74SKuba Mracek if (recognized_arguments) { 88441ae8e74SKuba Mracek auto recognized_frame = frame->GetRecognizedFrame(); 88541ae8e74SKuba Mracek if (recognized_frame) { 88641ae8e74SKuba Mracek ValueObjectListSP recognized_arg_list = 88741ae8e74SKuba Mracek recognized_frame->GetRecognizedArguments(); 88841ae8e74SKuba Mracek if (recognized_arg_list) { 88941ae8e74SKuba Mracek for (auto &rec_value_sp : recognized_arg_list->GetObjects()) { 89041ae8e74SKuba Mracek SBValue value_sb; 89141ae8e74SKuba Mracek value_sb.SetSP(rec_value_sp, use_dynamic); 89241ae8e74SKuba Mracek value_list.Append(value_sb); 89341ae8e74SKuba Mracek } 89441ae8e74SKuba Mracek } 89541ae8e74SKuba Mracek } 89641ae8e74SKuba Mracek } 897c9858e4dSGreg Clayton } 8987fdf9ef1SGreg Clayton } 899*581af8b0SJonas Devlieghere } 900ceb6b139SCaroline Tice 901baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value_list); 90230fdc8d8SChris Lattner } 90330fdc8d8SChris Lattner 904b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() { 905baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValueList, SBFrame, GetRegisters); 906baf5664fSJonas Devlieghere 90730fdc8d8SChris Lattner SBValueList value_list; 908bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 909bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9104fc6cb9cSJim Ingham 911dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 912d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 9137730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 914b9c1b51eSKate Stone if (target && process) { 9157fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 916b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9177730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 918b9c1b51eSKate Stone if (frame) { 919d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 920b9c1b51eSKate Stone if (reg_ctx) { 92130fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 922b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 923b9c1b51eSKate Stone value_list.Append( 924b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx)); 92530fdc8d8SChris Lattner } 92630fdc8d8SChris Lattner } 927c9858e4dSGreg Clayton } 9287fdf9ef1SGreg Clayton } 929*581af8b0SJonas Devlieghere } 930ceb6b139SCaroline Tice 931baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(value_list); 93230fdc8d8SChris Lattner } 93330fdc8d8SChris Lattner 934b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) { 935baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *), 936baf5664fSJonas Devlieghere name); 937baf5664fSJonas Devlieghere 938ad9a53c5SJason Molenda SBValue result; 939ad9a53c5SJason Molenda ValueObjectSP value_sp; 940bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 941bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 942ad9a53c5SJason Molenda 943dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 944ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 945ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 946b9c1b51eSKate Stone if (target && process) { 947ad9a53c5SJason Molenda Process::StopLocker stop_locker; 948b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 949ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 950b9c1b51eSKate Stone if (frame) { 951ad9a53c5SJason Molenda RegisterContextSP reg_ctx(frame->GetRegisterContext()); 952b9c1b51eSKate Stone if (reg_ctx) { 953ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 954b9c1b51eSKate Stone for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) { 955b9c1b51eSKate Stone const RegisterInfo *reg_info = 956b9c1b51eSKate Stone reg_ctx->GetRegisterInfoAtIndex(reg_idx); 957ad9a53c5SJason Molenda if (reg_info && 958ad9a53c5SJason Molenda ((reg_info->name && strcasecmp(reg_info->name, name) == 0) || 959b9c1b51eSKate Stone (reg_info->alt_name && 960b9c1b51eSKate Stone strcasecmp(reg_info->alt_name, name) == 0))) { 961ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_idx); 962ad9a53c5SJason Molenda result.SetSP(value_sp); 963ad9a53c5SJason Molenda break; 964ad9a53c5SJason Molenda } 965ad9a53c5SJason Molenda } 966ad9a53c5SJason Molenda } 967ad9a53c5SJason Molenda } 968ad9a53c5SJason Molenda } 969*581af8b0SJonas Devlieghere } 970ad9a53c5SJason Molenda 971baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(result); 972ad9a53c5SJason Molenda } 973ad9a53c5SJason Molenda 974b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) { 975baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &), 976baf5664fSJonas Devlieghere description); 977baf5664fSJonas Devlieghere 978da7bc7d0SGreg Clayton Stream &strm = description.ref(); 979da7bc7d0SGreg Clayton 980bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 981bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9824fc6cb9cSJim Ingham 983b57e4a1bSJason Molenda StackFrame *frame; 984d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 9857730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 986b9c1b51eSKate Stone if (target && process) { 9877fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 988b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9897730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 990b9c1b51eSKate Stone if (frame) { 991d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&strm); 9927730b9a4SJim Ingham } 993c9858e4dSGreg Clayton } 994c9858e4dSGreg Clayton 995b9c1b51eSKate Stone } else 996da7bc7d0SGreg Clayton strm.PutCString("No value"); 997dde9cff3SCaroline Tice 998dde9cff3SCaroline Tice return true; 999dde9cff3SCaroline Tice } 10001d3afba3SGreg Clayton 1001b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) { 1002baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, (const char *), 1003baf5664fSJonas Devlieghere expr); 1004baf5664fSJonas Devlieghere 1005316d498bSGreg Clayton SBValue result; 1006c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1007c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1008c481c7eeSJim Ingham 1009b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1010d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1011b9c1b51eSKate Stone if (frame && target) { 101235e1bda6SJim Ingham SBExpressionOptions options; 1013b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value = 1014b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 1015cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 101635e1bda6SJim Ingham options.SetUnwindOnError(true); 101724785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1018998c8a1cSRyan Brown if (target->GetLanguage() != eLanguageTypeUnknown) 1019998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1020998c8a1cSRyan Brown else 1021998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1022baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 1023316d498bSGreg Clayton } 1024baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(result); 102578a685aaSJim Ingham } 102678a685aaSJim Ingham 102778a685aaSJim Ingham SBValue 1028b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr, 1029b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value) { 1030baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1031baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), expr, 1032baf5664fSJonas Devlieghere fetch_dynamic_value); 1033baf5664fSJonas Devlieghere 103435e1bda6SJim Ingham SBExpressionOptions options; 1035cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 103635e1bda6SJim Ingham options.SetUnwindOnError(true); 103724785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1038c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1039c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1040c481c7eeSJim Ingham 1041998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1042998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1043998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1044998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1045998c8a1cSRyan Brown else if (frame) 1046998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1047baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 10487ba6e991SJim Ingham } 10497ba6e991SJim Ingham 1050b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr, 1051b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value, 1052b9c1b51eSKate Stone bool unwind_on_error) { 1053baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1054baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType, bool), expr, 1055baf5664fSJonas Devlieghere fetch_dynamic_value, unwind_on_error); 1056baf5664fSJonas Devlieghere 105735e1bda6SJim Ingham SBExpressionOptions options; 1058c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1059c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1060c481c7eeSJim Ingham 1061cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 106235e1bda6SJim Ingham options.SetUnwindOnError(unwind_on_error); 106324785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1064998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1065998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1066998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1067998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1068998c8a1cSRyan Brown else if (frame) 1069998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1070baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(EvaluateExpression(expr, options)); 107135e1bda6SJim Ingham } 107235e1bda6SJim Ingham 1073b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr, 1074b9c1b51eSKate Stone const SBExpressionOptions &options) { 1075baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1076baf5664fSJonas Devlieghere (const char *, const lldb::SBExpressionOptions &), expr, 1077baf5664fSJonas Devlieghere options); 1078baf5664fSJonas Devlieghere 1079358efd65SSaleem Abdulrasool #ifndef LLDB_DISABLE_PYTHON 10805160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1081358efd65SSaleem Abdulrasool #endif 1082a162ebafSSean Callanan 10838646d3c1SJim Ingham ExpressionResults exe_results = eExpressionSetupError; 108469b582faSGreg Clayton SBValue expr_result; 10857730b9a4SJim Ingham 1086b9c1b51eSKate Stone if (expr == nullptr || expr[0] == '\0') { 1087baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(expr_result); 10887730b9a4SJim Ingham } 10897730b9a4SJim Ingham 109081e871edSGreg Clayton ValueObjectSP expr_value_sp; 10914838131bSGreg Clayton 1092bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1093bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 10944fc6cb9cSJim Ingham 1095b9556accSGreg Clayton 1096dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 10977730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 10987730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10997730b9a4SJim Ingham 1100b9c1b51eSKate Stone if (target && process) { 11017fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1102b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11037730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1104b9c1b51eSKate Stone if (frame) { 11058f7db52dSJim Ingham std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace; 1106b9c1b51eSKate Stone if (target->GetDisplayExpressionsInCrashlogs()) { 11071ba7c4d0SGreg Clayton StreamString frame_description; 1108d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&frame_description); 11098f7db52dSJim Ingham stack_trace = llvm::make_unique<llvm::PrettyStackTraceFormat>( 1110b9c1b51eSKate Stone "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value " 1111b9c1b51eSKate Stone "= %u) %s", 1112b9c1b51eSKate Stone expr, options.GetFetchDynamicValue(), 1113c156427dSZachary Turner frame_description.GetData()); 1114fb6621efSGreg Clayton } 1115fb6621efSGreg Clayton 1116b9c1b51eSKate Stone exe_results = target->EvaluateExpression(expr, frame, expr_value_sp, 111735e1bda6SJim Ingham options.ref()); 1118e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 11197730b9a4SJim Ingham } 1120c9858e4dSGreg Clayton } 11217fdf9ef1SGreg Clayton } 11224838131bSGreg Clayton 1123cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1124a162ebafSSean Callanan if (expr_log) 1125b9c1b51eSKate Stone expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is " 1126b9c1b51eSKate Stone "%s, summary %s **", 1127324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 1128cf7e2dc0SJason Molenda #endif 11294838131bSGreg Clayton 1130baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(expr_result); 11311d3afba3SGreg Clayton } 1132316d498bSGreg Clayton 1133b9c1b51eSKate Stone bool SBFrame::IsInlined() { 1134baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsInlined); 1135baf5664fSJonas Devlieghere 113605f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->IsInlined(); 113705f75e9fSOleksiy Vyalov } 113805f75e9fSOleksiy Vyalov 1139b9c1b51eSKate Stone bool SBFrame::IsInlined() const { 1140baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsInlined); 1141baf5664fSJonas Devlieghere 1142c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1143c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1144c481c7eeSJim Ingham 1145dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1146d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 11477730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1148b9c1b51eSKate Stone if (target && process) { 11497fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1150b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11517730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1152b9c1b51eSKate Stone if (frame) { 11537fdf9ef1SGreg Clayton 1154d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1155316d498bSGreg Clayton if (block) 1156dbb0abbfSEugene Zelenko return block->GetContainingInlinedBlock() != nullptr; 11577730b9a4SJim Ingham } 1158c9858e4dSGreg Clayton } 11597fdf9ef1SGreg Clayton } 1160316d498bSGreg Clayton return false; 1161316d498bSGreg Clayton } 1162316d498bSGreg Clayton 11634b36f791SVedant Kumar bool SBFrame::IsArtificial() { 1164baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsArtificial); 1165baf5664fSJonas Devlieghere 11664b36f791SVedant Kumar return static_cast<const SBFrame *>(this)->IsArtificial(); 11674b36f791SVedant Kumar } 11684b36f791SVedant Kumar 11694b36f791SVedant Kumar bool SBFrame::IsArtificial() const { 1170baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsArtificial); 1171baf5664fSJonas Devlieghere 11724b36f791SVedant Kumar std::unique_lock<std::recursive_mutex> lock; 11734b36f791SVedant Kumar ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11744b36f791SVedant Kumar 11754b36f791SVedant Kumar StackFrame *frame = exe_ctx.GetFramePtr(); 11764b36f791SVedant Kumar if (frame) 11774b36f791SVedant Kumar return frame->IsArtificial(); 11784b36f791SVedant Kumar 11794b36f791SVedant Kumar return false; 11804b36f791SVedant Kumar } 11814b36f791SVedant Kumar 1182b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() { 1183baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetFunctionName); 1184baf5664fSJonas Devlieghere 118505f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->GetFunctionName(); 118605f75e9fSOleksiy Vyalov } 118705f75e9fSOleksiy Vyalov 1188bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const { 1189baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBFrame, GuessLanguage); 1190baf5664fSJonas Devlieghere 1191bdbdd229SJim Ingham std::unique_lock<std::recursive_mutex> lock; 1192bdbdd229SJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1193bdbdd229SJim Ingham 1194bdbdd229SJim Ingham StackFrame *frame = nullptr; 1195bdbdd229SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1196bdbdd229SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1197bdbdd229SJim Ingham if (target && process) { 1198bdbdd229SJim Ingham Process::StopLocker stop_locker; 1199bdbdd229SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) { 1200bdbdd229SJim Ingham frame = exe_ctx.GetFramePtr(); 1201bdbdd229SJim Ingham if (frame) { 1202bdbdd229SJim Ingham return frame->GuessLanguage(); 1203bdbdd229SJim Ingham } 1204bdbdd229SJim Ingham } 1205bdbdd229SJim Ingham } 1206bdbdd229SJim Ingham return eLanguageTypeUnknown; 1207bdbdd229SJim Ingham } 1208bdbdd229SJim Ingham 1209b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const { 1210baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, GetFunctionName); 1211baf5664fSJonas Devlieghere 1212dbb0abbfSEugene Zelenko const char *name = nullptr; 1213c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1214c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1215c481c7eeSJim Ingham 1216dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1217d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 12187730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1219b9c1b51eSKate Stone if (target && process) { 12207fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1221b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 12227730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1223b9c1b51eSKate Stone if (frame) { 1224b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1225b9c1b51eSKate Stone eSymbolContextBlock | 1226b9c1b51eSKate Stone eSymbolContextSymbol)); 1227b9c1b51eSKate Stone if (sc.block) { 1228316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1229b9c1b51eSKate Stone if (inlined_block) { 1230b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1231b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1232b9c1b51eSKate Stone name = 1233b9c1b51eSKate Stone inlined_info->GetName(sc.function->GetLanguage()).AsCString(); 1234316d498bSGreg Clayton } 1235316d498bSGreg Clayton } 1236316d498bSGreg Clayton 1237b9c1b51eSKate Stone if (name == nullptr) { 1238316d498bSGreg Clayton if (sc.function) 1239316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1240316d498bSGreg Clayton } 1241316d498bSGreg Clayton 1242b9c1b51eSKate Stone if (name == nullptr) { 1243316d498bSGreg Clayton if (sc.symbol) 1244316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1245316d498bSGreg Clayton } 12467730b9a4SJim Ingham } 1247c9858e4dSGreg Clayton } 12487fdf9ef1SGreg Clayton } 1249316d498bSGreg Clayton return name; 1250316d498bSGreg Clayton } 1251c1f705c2SEnrico Granata 1252b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() { 1253baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetDisplayFunctionName); 1254baf5664fSJonas Devlieghere 1255dbb0abbfSEugene Zelenko const char *name = nullptr; 1256c481c7eeSJim Ingham 1257c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1258c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1259c481c7eeSJim Ingham 1260dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1261c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1262c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 1263b9c1b51eSKate Stone if (target && process) { 1264c1f705c2SEnrico Granata Process::StopLocker stop_locker; 1265b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1266c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr(); 1267b9c1b51eSKate Stone if (frame) { 1268b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1269b9c1b51eSKate Stone eSymbolContextBlock | 1270b9c1b51eSKate Stone eSymbolContextSymbol)); 1271b9c1b51eSKate Stone if (sc.block) { 1272c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1273b9c1b51eSKate Stone if (inlined_block) { 1274b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1275b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 1276b9c1b51eSKate Stone name = inlined_info->GetDisplayName(sc.function->GetLanguage()) 1277b9c1b51eSKate Stone .AsCString(); 1278c1f705c2SEnrico Granata } 1279c1f705c2SEnrico Granata } 1280c1f705c2SEnrico Granata 1281b9c1b51eSKate Stone if (name == nullptr) { 1282c1f705c2SEnrico Granata if (sc.function) 1283c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString(); 1284c1f705c2SEnrico Granata } 1285c1f705c2SEnrico Granata 1286b9c1b51eSKate Stone if (name == nullptr) { 1287c1f705c2SEnrico Granata if (sc.symbol) 1288c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString(); 1289c1f705c2SEnrico Granata } 1290c1f705c2SEnrico Granata } 1291c1f705c2SEnrico Granata } 1292c1f705c2SEnrico Granata } 1293c1f705c2SEnrico Granata return name; 1294c1f705c2SEnrico Granata } 1295