180814287SRaphael Isemann //===-- SBFrame.cpp -------------------------------------------------------===// 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 17d51402acSJonas Devlieghere #include "lldb/Utility/ReproducerInstrumentation.h" 18bd4bf82aSJonas Devlieghere #include "Utils.h" 1930fdc8d8SChris Lattner #include "lldb/Core/Address.h" 2030fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2130fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h" 2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h" 23347ec0faSAlex Langford #include "lldb/Expression/ExpressionVariable.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 67a3436f73SKazu Hirata SBFrame::SBFrame(const SBFrame &rhs) { 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); 81*d232abc3SJonas Devlieghere 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); 947f5237bcSPavel Labath return this->operator bool(); 957f5237bcSPavel Labath } 967f5237bcSPavel Labath SBFrame::operator bool() const { 977f5237bcSPavel Labath LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, operator bool); 98baf5664fSJonas Devlieghere 99bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 100bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1017fa7dc36SJim Ingham 1027fa7dc36SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1037fa7dc36SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 104b9c1b51eSKate Stone if (target && process) { 1057fa7dc36SJim Ingham Process::StopLocker stop_locker; 1067fa7dc36SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 107dbb0abbfSEugene Zelenko return GetFrameSP().get() != nullptr; 10830fdc8d8SChris Lattner } 10930fdc8d8SChris Lattner 1107fa7dc36SJim Ingham // Without a target & process we can't have a valid stack frame. 1117fa7dc36SJim Ingham return false; 1127fa7dc36SJim Ingham } 1137fa7dc36SJim Ingham 114b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const { 115baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBSymbolContext, SBFrame, GetSymbolContext, 116baf5664fSJonas Devlieghere (uint32_t), resolve_scope); 117baf5664fSJonas Devlieghere 11830fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 119bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 120bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 121991e4453SZachary Turner SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope); 122d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1237730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 124b9c1b51eSKate Stone if (target && process) { 1257fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 126b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1272efc6892SPavel Labath if (StackFrame *frame = exe_ctx.GetFramePtr()) 1282efc6892SPavel Labath sb_sym_ctx = frame->GetSymbolContext(scope); 129c9858e4dSGreg Clayton } 1307fdf9ef1SGreg Clayton } 131ceb6b139SCaroline Tice 132*d232abc3SJonas Devlieghere return sb_sym_ctx; 13330fdc8d8SChris Lattner } 13430fdc8d8SChris Lattner 135b9c1b51eSKate Stone SBModule SBFrame::GetModule() const { 136baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBModule, SBFrame, GetModule); 137baf5664fSJonas Devlieghere 13872eff18aSGreg Clayton SBModule sb_module; 139acdbe816SGreg Clayton ModuleSP module_sp; 140bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 141bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1424fc6cb9cSJim Ingham 143dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 144d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1457730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 146b9c1b51eSKate Stone if (target && process) { 1477fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 148b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1497730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 150b9c1b51eSKate Stone if (frame) { 151d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp; 152acdbe816SGreg Clayton sb_module.SetSP(module_sp); 153c9858e4dSGreg Clayton } 1547fdf9ef1SGreg Clayton } 155581af8b0SJonas Devlieghere } 1564838131bSGreg Clayton 157*d232abc3SJonas Devlieghere return sb_module; 15830fdc8d8SChris Lattner } 15930fdc8d8SChris Lattner 160b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const { 161baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBCompileUnit, SBFrame, 162baf5664fSJonas Devlieghere GetCompileUnit); 163baf5664fSJonas Devlieghere 16472eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 165bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 166bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1674fc6cb9cSJim Ingham 168dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 169d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1707730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 171b9c1b51eSKate Stone if (target && process) { 1727fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 173b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1747730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 175b9c1b51eSKate Stone if (frame) { 176b9c1b51eSKate Stone sb_comp_unit.reset( 177b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit); 178c9858e4dSGreg Clayton } 179c9858e4dSGreg Clayton } 180581af8b0SJonas Devlieghere } 181ceb6b139SCaroline Tice 182*d232abc3SJonas Devlieghere return sb_comp_unit; 18330fdc8d8SChris Lattner } 18430fdc8d8SChris Lattner 185b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const { 186baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFunction, SBFrame, GetFunction); 187baf5664fSJonas Devlieghere 18872eff18aSGreg Clayton SBFunction sb_function; 189bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 190bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1914fc6cb9cSJim Ingham 192dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 193d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1947730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 195b9c1b51eSKate Stone if (target && process) { 1967fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 197b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1987730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 199b9c1b51eSKate Stone if (frame) { 200b9c1b51eSKate Stone sb_function.reset( 201b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextFunction).function); 2027fdf9ef1SGreg Clayton } 203c9858e4dSGreg Clayton } 204581af8b0SJonas Devlieghere } 2054838131bSGreg Clayton 206*d232abc3SJonas Devlieghere return sb_function; 20730fdc8d8SChris Lattner } 20830fdc8d8SChris Lattner 209b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const { 210baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBSymbol, SBFrame, GetSymbol); 211baf5664fSJonas Devlieghere 21272eff18aSGreg Clayton SBSymbol sb_symbol; 213bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 214bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2154fc6cb9cSJim Ingham 216dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 217d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2187730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 219b9c1b51eSKate Stone if (target && process) { 2207fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 221b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2227730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 223b9c1b51eSKate Stone if (frame) { 224d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol); 2257fdf9ef1SGreg Clayton } 226c9858e4dSGreg Clayton } 227581af8b0SJonas Devlieghere } 228581af8b0SJonas Devlieghere 229*d232abc3SJonas Devlieghere return sb_symbol; 2303b06557eSGreg Clayton } 2313b06557eSGreg Clayton 232b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const { 233baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetBlock); 234baf5664fSJonas Devlieghere 23572eff18aSGreg Clayton SBBlock sb_block; 236bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 237bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2384fc6cb9cSJim Ingham 239dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 240d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2417730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 242b9c1b51eSKate Stone if (target && process) { 2437fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 244b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2457730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 246581af8b0SJonas Devlieghere if (frame) 247d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block); 2487fdf9ef1SGreg Clayton } 249c9858e4dSGreg Clayton } 250*d232abc3SJonas Devlieghere return sb_block; 25130fdc8d8SChris Lattner } 25230fdc8d8SChris Lattner 253b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const { 254baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBBlock, SBFrame, GetFrameBlock); 255baf5664fSJonas Devlieghere 25672eff18aSGreg Clayton SBBlock sb_block; 257bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 258bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2594fc6cb9cSJim Ingham 260dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 261d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2627730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 263b9c1b51eSKate Stone if (target && process) { 2647fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 265b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2667730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 267581af8b0SJonas Devlieghere if (frame) 268d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock()); 2697fdf9ef1SGreg Clayton } 270c9858e4dSGreg Clayton } 271*d232abc3SJonas Devlieghere return sb_block; 27295897c6aSGreg Clayton } 27395897c6aSGreg Clayton 274b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const { 275baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBLineEntry, SBFrame, GetLineEntry); 276baf5664fSJonas Devlieghere 27772eff18aSGreg Clayton SBLineEntry sb_line_entry; 278bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 279bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2804fc6cb9cSJim Ingham 281dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 282d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2837730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 284b9c1b51eSKate Stone if (target && process) { 2857fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 286b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2877730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 288b9c1b51eSKate Stone if (frame) { 289b9c1b51eSKate Stone sb_line_entry.SetLineEntry( 290b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextLineEntry).line_entry); 2917fdf9ef1SGreg Clayton } 292c9858e4dSGreg Clayton } 293581af8b0SJonas Devlieghere } 294*d232abc3SJonas Devlieghere return sb_line_entry; 29530fdc8d8SChris Lattner } 29630fdc8d8SChris Lattner 297b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const { 298baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBFrame, GetFrameID); 299baf5664fSJonas Devlieghere 300b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 301b9556accSGreg Clayton 302c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 303c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 304c481c7eeSJim Ingham 305b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 3067fdf9ef1SGreg Clayton if (frame) 307d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex(); 3084838131bSGreg Clayton 3094838131bSGreg Clayton return frame_idx; 31030fdc8d8SChris Lattner } 31130fdc8d8SChris Lattner 312b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const { 313baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetCFA); 314baf5664fSJonas Devlieghere 315c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 316c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 317c481c7eeSJim Ingham 318424a5dbcSGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 319424a5dbcSGreg Clayton if (frame) 320424a5dbcSGreg Clayton return frame->GetStackID().GetCallFrameAddress(); 321424a5dbcSGreg Clayton return LLDB_INVALID_ADDRESS; 322424a5dbcSGreg Clayton } 323424a5dbcSGreg Clayton 324b9c1b51eSKate Stone addr_t SBFrame::GetPC() const { 325baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetPC); 326baf5664fSJonas Devlieghere 32769b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 328bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 329bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3304fc6cb9cSJim Ingham 331dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 332d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3337730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 334b9c1b51eSKate Stone if (target && process) { 3357fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 336b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3377730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 338b9c1b51eSKate Stone if (frame) { 339b9c1b51eSKate Stone addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress( 34004803b3eSTatyana Krasnukha target, AddressClass::eCode); 341c9858e4dSGreg Clayton } 3427fdf9ef1SGreg Clayton } 343581af8b0SJonas Devlieghere } 344ceb6b139SCaroline Tice 345ceb6b139SCaroline Tice return addr; 34630fdc8d8SChris Lattner } 34730fdc8d8SChris Lattner 348b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) { 349baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBFrame, SetPC, (lldb::addr_t), new_pc); 350baf5664fSJonas Devlieghere 351ceb6b139SCaroline Tice bool ret_val = false; 352bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 353bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3544fc6cb9cSJim Ingham 355d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3567730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 357b9c1b51eSKate Stone if (target && process) { 3587fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 359b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3600d7401cfSMed Ismail Bennani if (StackFrame *frame = exe_ctx.GetFramePtr()) { 3610d7401cfSMed Ismail Bennani if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) { 3620d7401cfSMed Ismail Bennani ret_val = reg_ctx_sp->SetPC(new_pc); 3630d7401cfSMed Ismail Bennani } 364c9858e4dSGreg Clayton } 3657fdf9ef1SGreg Clayton } 366581af8b0SJonas Devlieghere } 367ceb6b139SCaroline Tice 368ceb6b139SCaroline Tice return ret_val; 36930fdc8d8SChris Lattner } 37030fdc8d8SChris Lattner 371b9c1b51eSKate Stone addr_t SBFrame::GetSP() const { 372baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetSP); 373baf5664fSJonas Devlieghere 3744838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 375bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 376bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3774fc6cb9cSJim Ingham 378d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3797730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 380b9c1b51eSKate Stone if (target && process) { 3817fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 382b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3830d7401cfSMed Ismail Bennani if (StackFrame *frame = exe_ctx.GetFramePtr()) { 3840d7401cfSMed Ismail Bennani if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) { 3850d7401cfSMed Ismail Bennani addr = reg_ctx_sp->GetSP(); 3860d7401cfSMed Ismail Bennani } 3877fdf9ef1SGreg Clayton } 388c9858e4dSGreg Clayton } 389581af8b0SJonas Devlieghere } 3904838131bSGreg Clayton 3914838131bSGreg Clayton return addr; 39230fdc8d8SChris Lattner } 39330fdc8d8SChris Lattner 394b9c1b51eSKate Stone addr_t SBFrame::GetFP() const { 395baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::addr_t, SBFrame, GetFP); 396baf5664fSJonas Devlieghere 39769b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 398bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 399bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4004fc6cb9cSJim Ingham 401d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4027730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 403b9c1b51eSKate Stone if (target && process) { 4047fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 405b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4060d7401cfSMed Ismail Bennani if (StackFrame *frame = exe_ctx.GetFramePtr()) { 4070d7401cfSMed Ismail Bennani if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) { 4080d7401cfSMed Ismail Bennani addr = reg_ctx_sp->GetFP(); 4090d7401cfSMed Ismail Bennani } 4100d7401cfSMed Ismail Bennani } 411c9858e4dSGreg Clayton } 4127fdf9ef1SGreg Clayton } 413ceb6b139SCaroline Tice 414ceb6b139SCaroline Tice return addr; 41530fdc8d8SChris Lattner } 41630fdc8d8SChris Lattner 417b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const { 418baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBFrame, GetPCAddress); 419baf5664fSJonas Devlieghere 42030fdc8d8SChris Lattner SBAddress sb_addr; 421bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 422bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4234fc6cb9cSJim Ingham 424b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 425d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4267730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 427b9c1b51eSKate Stone if (target && process) { 4287fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 429b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4307730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 431581af8b0SJonas Devlieghere if (frame) 4326cd4a4cdSJonas Devlieghere sb_addr.SetAddress(frame->GetFrameCodeAddress()); 4337fdf9ef1SGreg Clayton } 434c9858e4dSGreg Clayton } 435*d232abc3SJonas Devlieghere return sb_addr; 43630fdc8d8SChris Lattner } 43730fdc8d8SChris Lattner 438baf5664fSJonas Devlieghere void SBFrame::Clear() { 439baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBFrame, Clear); 440baf5664fSJonas Devlieghere 441baf5664fSJonas Devlieghere m_opaque_sp->Clear(); 442baf5664fSJonas Devlieghere } 44330fdc8d8SChris Lattner 444b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) { 445baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 446baf5664fSJonas Devlieghere (const char *), var_path); 447baf5664fSJonas Devlieghere 4487edbdfc9SGreg Clayton SBValue sb_value; 449c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 450c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 451c481c7eeSJim Ingham 452b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 453d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 454b9c1b51eSKate Stone if (frame && target) { 455b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 456b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 4577edbdfc9SGreg Clayton sb_value = GetValueForVariablePath(var_path, use_dynamic); 4587edbdfc9SGreg Clayton } 459*d232abc3SJonas Devlieghere return sb_value; 4607edbdfc9SGreg Clayton } 4617edbdfc9SGreg Clayton 462b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path, 463b9c1b51eSKate Stone DynamicValueType use_dynamic) { 464baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, GetValueForVariablePath, 465baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), var_path, 466baf5664fSJonas Devlieghere use_dynamic); 467baf5664fSJonas Devlieghere 4687edbdfc9SGreg Clayton SBValue sb_value; 469b9c1b51eSKate Stone if (var_path == nullptr || var_path[0] == '\0') { 470*d232abc3SJonas Devlieghere return sb_value; 4717730b9a4SJim Ingham } 4727730b9a4SJim Ingham 473bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 474bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4754fc6cb9cSJim Ingham 476dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 477d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4787730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 479b9c1b51eSKate Stone if (target && process) { 4807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 481b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4827730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 483b9c1b51eSKate Stone if (frame) { 4847edbdfc9SGreg Clayton VariableSP var_sp; 48597206d57SZachary Turner Status error; 486b9c1b51eSKate Stone ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath( 487b9c1b51eSKate Stone var_path, eNoDynamicValues, 488b9c1b51eSKate Stone StackFrame::eExpressionPathOptionCheckPtrVsMember | 489b9c1b51eSKate Stone StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 490b9c1b51eSKate Stone var_sp, error)); 491e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 4927730b9a4SJim Ingham } 493c9858e4dSGreg Clayton } 4947fdf9ef1SGreg Clayton } 495*d232abc3SJonas Devlieghere return sb_value; 4967edbdfc9SGreg Clayton } 4977edbdfc9SGreg Clayton 498b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) { 499baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, (const char *), 500baf5664fSJonas Devlieghere name); 501baf5664fSJonas Devlieghere 502316d498bSGreg Clayton SBValue value; 503c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 504c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 505c481c7eeSJim Ingham 506b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 507d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 508b9c1b51eSKate Stone if (frame && target) { 509b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 510b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 511316d498bSGreg Clayton value = FindVariable(name, use_dynamic); 512316d498bSGreg Clayton } 513*d232abc3SJonas Devlieghere return value; 51478a685aaSJim Ingham } 51578a685aaSJim Ingham 516b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name, 517b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 518baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindVariable, 519baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), name, use_dynamic); 520baf5664fSJonas Devlieghere 52169b582faSGreg Clayton VariableSP var_sp; 52258b59f95SJim Ingham SBValue sb_value; 5237730b9a4SJim Ingham 524b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 525*d232abc3SJonas Devlieghere return sb_value; 5267730b9a4SJim Ingham } 5277730b9a4SJim Ingham 52881e871edSGreg Clayton ValueObjectSP value_sp; 529bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 530bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5314fc6cb9cSJim Ingham 532dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 533d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5347730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 535b9c1b51eSKate Stone if (target && process) { 5367fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 537b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5387730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 539b9c1b51eSKate Stone if (frame) { 540e23d0b63SShafik Yaghmour value_sp = frame->FindVariable(ConstString(name)); 54130fdc8d8SChris Lattner 542e23d0b63SShafik Yaghmour if (value_sp) 543e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 544c9858e4dSGreg Clayton } 545316d498bSGreg Clayton } 546581af8b0SJonas Devlieghere } 5474838131bSGreg Clayton 548*d232abc3SJonas Devlieghere return sb_value; 549dde9cff3SCaroline Tice } 550dde9cff3SCaroline Tice 551b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) { 552baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue, 553baf5664fSJonas Devlieghere (const char *, lldb::ValueType), name, value_type); 554baf5664fSJonas Devlieghere 555316d498bSGreg Clayton SBValue value; 556c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 557c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 558c481c7eeSJim Ingham 559b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 560d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 561b9c1b51eSKate Stone if (frame && target) { 562b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 563b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 564316d498bSGreg Clayton value = FindValue(name, value_type, use_dynamic); 565316d498bSGreg Clayton } 566*d232abc3SJonas Devlieghere return value; 56778a685aaSJim Ingham } 56878a685aaSJim Ingham 569b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type, 570b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 571baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindValue, 572baf5664fSJonas Devlieghere (const char *, lldb::ValueType, lldb::DynamicValueType), 573baf5664fSJonas Devlieghere name, value_type, use_dynamic); 574baf5664fSJonas Devlieghere 57569b582faSGreg Clayton SBValue sb_value; 5767730b9a4SJim Ingham 577b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 578*d232abc3SJonas Devlieghere return sb_value; 5797730b9a4SJim Ingham } 5807730b9a4SJim Ingham 58181e871edSGreg Clayton ValueObjectSP value_sp; 582bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 583bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5844fc6cb9cSJim Ingham 585dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 586d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5877730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 588b9c1b51eSKate Stone if (target && process) { 5897fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 590b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5917730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 592b9c1b51eSKate Stone if (frame) { 5938a2a0dfbSEnrico Granata VariableList variable_list; 5948a2a0dfbSEnrico Granata 595b9c1b51eSKate Stone switch (value_type) { 59669b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 59769b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 59869b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 59969b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 60063a27afaSGreg Clayton case eValueTypeVariableThreadLocal: // thread local variables 60169b582faSGreg Clayton { 602d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 60372eff18aSGreg Clayton 60472eff18aSGreg Clayton const bool can_create = true; 60572eff18aSGreg Clayton const bool get_parent_variables = true; 60672eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 60772eff18aSGreg Clayton 6080efb51a0SChaoren Lin if (sc.block) 609b9c1b51eSKate Stone sc.block->AppendVariables( 610b9c1b51eSKate Stone can_create, get_parent_variables, 611b9c1b51eSKate Stone stop_if_block_is_inlined_function, 612b9c1b51eSKate Stone [frame](Variable *v) { return v->IsInScope(frame); }, 613b9c1b51eSKate Stone &variable_list); 614b9c1b51eSKate Stone if (value_type == eValueTypeVariableGlobal) { 6158a2a0dfbSEnrico Granata const bool get_file_globals = true; 6168a2a0dfbSEnrico Granata VariableList *frame_vars = frame->GetVariableList(get_file_globals); 6178a2a0dfbSEnrico Granata if (frame_vars) 6188a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 6198a2a0dfbSEnrico Granata } 62069b582faSGreg Clayton ConstString const_name(name); 621b9c1b51eSKate Stone VariableSP variable_sp( 622b9c1b51eSKate Stone variable_list.FindVariable(const_name, value_type)); 623b9c1b51eSKate Stone if (variable_sp) { 624b9c1b51eSKate Stone value_sp = frame->GetValueObjectForFrameVariable(variable_sp, 625b9c1b51eSKate Stone eNoDynamicValues); 626e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 62730fdc8d8SChris Lattner } 628b9c1b51eSKate Stone } break; 62969b582faSGreg Clayton 63069b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 63169b582faSGreg Clayton { 632d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 633b9c1b51eSKate Stone if (reg_ctx) { 6348567f4d4SMichał Górny if (const RegisterInfo *reg_info = 6358567f4d4SMichał Górny reg_ctx->GetRegisterInfoByName(name)) { 6368567f4d4SMichał Górny value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info); 63781e871edSGreg Clayton sb_value.SetSP(value_sp); 63869b582faSGreg Clayton } 63969b582faSGreg Clayton } 640b9c1b51eSKate Stone } break; 64169b582faSGreg Clayton 642b9c1b51eSKate Stone case eValueTypeRegisterSet: // A collection of stack frame register 643b9c1b51eSKate Stone // values 64469b582faSGreg Clayton { 645d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 646b9c1b51eSKate Stone if (reg_ctx) { 64769b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 648b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 64969b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx); 65069b582faSGreg Clayton if (reg_set && 65169b582faSGreg Clayton ((reg_set->name && strcasecmp(reg_set->name, name) == 0) || 652b9c1b51eSKate Stone (reg_set->short_name && 653b9c1b51eSKate Stone strcasecmp(reg_set->short_name, name) == 0))) { 654b9c1b51eSKate Stone value_sp = 655b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx); 65681e871edSGreg Clayton sb_value.SetSP(value_sp); 65781e871edSGreg Clayton break; 65869b582faSGreg Clayton } 65969b582faSGreg Clayton } 66069b582faSGreg Clayton } 661b9c1b51eSKate Stone } break; 66269b582faSGreg Clayton 66369b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 66469b582faSGreg Clayton { 66569b582faSGreg Clayton ConstString const_name(name); 666b9c1b51eSKate Stone ExpressionVariableSP expr_var_sp( 667b9c1b51eSKate Stone target->GetPersistentVariable(const_name)); 668b9c1b51eSKate Stone if (expr_var_sp) { 66981e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 670e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 67181e871edSGreg Clayton } 672b9c1b51eSKate Stone } break; 67369b582faSGreg Clayton 67469b582faSGreg Clayton default: 67569b582faSGreg Clayton break; 67669b582faSGreg Clayton } 677c9858e4dSGreg Clayton } 6787fdf9ef1SGreg Clayton } 679581af8b0SJonas Devlieghere } 6804838131bSGreg Clayton 681*d232abc3SJonas Devlieghere return sb_value; 682dde9cff3SCaroline Tice } 683dde9cff3SCaroline Tice 684b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const { 685baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFrame, IsEqual, (const lldb::SBFrame &), 686baf5664fSJonas Devlieghere that); 687baf5664fSJonas Devlieghere 688b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 689b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 69035e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 69135e2ab60SJohnny Chen } 69235e2ab60SJohnny Chen 693baf5664fSJonas Devlieghere bool SBFrame::operator==(const SBFrame &rhs) const { 694baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator==,(const lldb::SBFrame &), 695baf5664fSJonas Devlieghere rhs); 69630fdc8d8SChris Lattner 697baf5664fSJonas Devlieghere return IsEqual(rhs); 698baf5664fSJonas Devlieghere } 699baf5664fSJonas Devlieghere 700baf5664fSJonas Devlieghere bool SBFrame::operator!=(const SBFrame &rhs) const { 701baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBFrame, operator!=,(const lldb::SBFrame &), 702baf5664fSJonas Devlieghere rhs); 703baf5664fSJonas Devlieghere 704baf5664fSJonas Devlieghere return !IsEqual(rhs); 705baf5664fSJonas Devlieghere } 70630fdc8d8SChris Lattner 707b9c1b51eSKate Stone SBThread SBFrame::GetThread() const { 708baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBThread, SBFrame, GetThread); 709baf5664fSJonas Devlieghere 710c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 711c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 712c481c7eeSJim Ingham 713d9e416c0SGreg Clayton ThreadSP thread_sp(exe_ctx.GetThreadSP()); 714d9e416c0SGreg Clayton SBThread sb_thread(thread_sp); 715ceb6b139SCaroline Tice 716*d232abc3SJonas Devlieghere return sb_thread; 71730fdc8d8SChris Lattner } 71830fdc8d8SChris Lattner 719b9c1b51eSKate Stone const char *SBFrame::Disassemble() const { 720baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, Disassemble); 721baf5664fSJonas Devlieghere 722dbb0abbfSEugene Zelenko const char *disassembly = nullptr; 723bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 724bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7254fc6cb9cSJim Ingham 726dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 727d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7287730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 729b9c1b51eSKate Stone if (target && process) { 7307fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 731b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 7327730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 733b9c1b51eSKate Stone if (frame) { 734d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 7357fdf9ef1SGreg Clayton } 736c9858e4dSGreg Clayton } 737581af8b0SJonas Devlieghere } 7384838131bSGreg Clayton 7394838131bSGreg Clayton return disassembly; 74030fdc8d8SChris Lattner } 74130fdc8d8SChris Lattner 742b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics, 743b9c1b51eSKate Stone bool in_scope_only) { 744baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 745baf5664fSJonas Devlieghere (bool, bool, bool, bool), arguments, locals, statics, 746baf5664fSJonas Devlieghere in_scope_only); 747baf5664fSJonas Devlieghere 748316d498bSGreg Clayton SBValueList value_list; 749c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 750c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 751c481c7eeSJim Ingham 752b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 753d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 754b9c1b51eSKate Stone if (frame && target) { 755b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 756b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 757b9c1b51eSKate Stone const bool include_runtime_support_values = 758b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 75951f96eebSZachary Turner 76051f96eebSZachary Turner SBVariablesOptions options; 76151f96eebSZachary Turner options.SetIncludeArguments(arguments); 76251f96eebSZachary Turner options.SetIncludeLocals(locals); 76351f96eebSZachary Turner options.SetIncludeStatics(statics); 76451f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 76551f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 76651f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 76751f96eebSZachary Turner 76851f96eebSZachary Turner value_list = GetVariables(options); 769316d498bSGreg Clayton } 770*d232abc3SJonas Devlieghere return value_list; 77178a685aaSJim Ingham } 77278a685aaSJim Ingham 773b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals, 774b9c1b51eSKate Stone bool statics, bool in_scope_only, 775b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 776baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 777baf5664fSJonas Devlieghere (bool, bool, bool, bool, lldb::DynamicValueType), 778baf5664fSJonas Devlieghere arguments, locals, statics, in_scope_only, use_dynamic); 779baf5664fSJonas Devlieghere 780c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 781c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 782c481c7eeSJim Ingham 783560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 784b9c1b51eSKate Stone const bool include_runtime_support_values = 785b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 78651f96eebSZachary Turner SBVariablesOptions options; 78751f96eebSZachary Turner options.SetIncludeArguments(arguments); 78851f96eebSZachary Turner options.SetIncludeLocals(locals); 78951f96eebSZachary Turner options.SetIncludeStatics(statics); 79051f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 79151f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 79251f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 793*d232abc3SJonas Devlieghere return GetVariables(options); 794560558ebSEnrico Granata } 795560558ebSEnrico Granata 796b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) { 797baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBFrame, GetVariables, 798baf5664fSJonas Devlieghere (const lldb::SBVariablesOptions &), options); 799baf5664fSJonas Devlieghere 800b9556accSGreg Clayton SBValueList value_list; 801bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 802bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 8034fc6cb9cSJim Ingham 804dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 805d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 806b9556accSGreg Clayton 80751f96eebSZachary Turner const bool statics = options.GetIncludeStatics(); 80851f96eebSZachary Turner const bool arguments = options.GetIncludeArguments(); 8094c7f5d5cSKuba Mracek const bool recognized_arguments = 8104c7f5d5cSKuba Mracek options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP())); 81151f96eebSZachary Turner const bool locals = options.GetIncludeLocals(); 81251f96eebSZachary Turner const bool in_scope_only = options.GetInScopeOnly(); 813b9c1b51eSKate Stone const bool include_runtime_support_values = 814b9c1b51eSKate Stone options.GetIncludeRuntimeSupportValues(); 81551f96eebSZachary Turner const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 81651f96eebSZachary Turner 817ceb6b139SCaroline Tice 818349213f9SGreg Clayton std::set<VariableSP> variable_set; 8197730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 820b9c1b51eSKate Stone if (target && process) { 8217fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 822b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 8237730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 824b9c1b51eSKate Stone if (frame) { 825dbb0abbfSEugene Zelenko VariableList *variable_list = nullptr; 826d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 827b9c1b51eSKate Stone if (variable_list) { 82830fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 829b9c1b51eSKate Stone if (num_variables) { 830d1782133SRaphael Isemann for (const VariableSP &variable_sp : *variable_list) { 831b9c1b51eSKate Stone if (variable_sp) { 83230fdc8d8SChris Lattner bool add_variable = false; 833b9c1b51eSKate Stone switch (variable_sp->GetScope()) { 83430fdc8d8SChris Lattner case eValueTypeVariableGlobal: 83530fdc8d8SChris Lattner case eValueTypeVariableStatic: 83663a27afaSGreg Clayton case eValueTypeVariableThreadLocal: 83730fdc8d8SChris Lattner add_variable = statics; 83830fdc8d8SChris Lattner break; 83930fdc8d8SChris Lattner 84030fdc8d8SChris Lattner case eValueTypeVariableArgument: 84130fdc8d8SChris Lattner add_variable = arguments; 84230fdc8d8SChris Lattner break; 84330fdc8d8SChris Lattner 84430fdc8d8SChris Lattner case eValueTypeVariableLocal: 84530fdc8d8SChris Lattner add_variable = locals; 84630fdc8d8SChris Lattner break; 847c982c768SGreg Clayton 848c982c768SGreg Clayton default: 849c982c768SGreg Clayton break; 85030fdc8d8SChris Lattner } 851b9c1b51eSKate Stone if (add_variable) { 852349213f9SGreg Clayton // Only add variables once so we don't end up with duplicates 853349213f9SGreg Clayton if (variable_set.find(variable_sp) == variable_set.end()) 854349213f9SGreg Clayton variable_set.insert(variable_sp); 855349213f9SGreg Clayton else 856349213f9SGreg Clayton continue; 857349213f9SGreg Clayton 858d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 85930fdc8d8SChris Lattner continue; 86030fdc8d8SChris Lattner 861b9c1b51eSKate Stone ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable( 862b9c1b51eSKate Stone variable_sp, eNoDynamicValues)); 863560558ebSEnrico Granata 864b9c1b51eSKate Stone if (!include_runtime_support_values && valobj_sp != nullptr && 865dbb0abbfSEugene Zelenko valobj_sp->IsRuntimeSupportValue()) 866560558ebSEnrico Granata continue; 867560558ebSEnrico Granata 868e3e91517SEnrico Granata SBValue value_sb; 869e3e91517SEnrico Granata value_sb.SetSP(valobj_sp, use_dynamic); 870e3e91517SEnrico Granata value_list.Append(value_sb); 87130fdc8d8SChris Lattner } 87230fdc8d8SChris Lattner } 87330fdc8d8SChris Lattner } 87430fdc8d8SChris Lattner } 87530fdc8d8SChris Lattner } 87641ae8e74SKuba Mracek if (recognized_arguments) { 87741ae8e74SKuba Mracek auto recognized_frame = frame->GetRecognizedFrame(); 87841ae8e74SKuba Mracek if (recognized_frame) { 87941ae8e74SKuba Mracek ValueObjectListSP recognized_arg_list = 88041ae8e74SKuba Mracek recognized_frame->GetRecognizedArguments(); 88141ae8e74SKuba Mracek if (recognized_arg_list) { 88241ae8e74SKuba Mracek for (auto &rec_value_sp : recognized_arg_list->GetObjects()) { 88341ae8e74SKuba Mracek SBValue value_sb; 88441ae8e74SKuba Mracek value_sb.SetSP(rec_value_sp, use_dynamic); 88541ae8e74SKuba Mracek value_list.Append(value_sb); 88641ae8e74SKuba Mracek } 88741ae8e74SKuba Mracek } 88841ae8e74SKuba Mracek } 88941ae8e74SKuba Mracek } 890c9858e4dSGreg Clayton } 8917fdf9ef1SGreg Clayton } 892581af8b0SJonas Devlieghere } 893ceb6b139SCaroline Tice 894*d232abc3SJonas Devlieghere return value_list; 89530fdc8d8SChris Lattner } 89630fdc8d8SChris Lattner 897b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() { 898baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBValueList, SBFrame, GetRegisters); 899baf5664fSJonas Devlieghere 90030fdc8d8SChris Lattner SBValueList value_list; 901bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 902bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9034fc6cb9cSJim Ingham 904dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 905d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 9067730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 907b9c1b51eSKate Stone if (target && process) { 9087fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 909b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9107730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 911b9c1b51eSKate Stone if (frame) { 912d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 913b9c1b51eSKate Stone if (reg_ctx) { 91430fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 915b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 916b9c1b51eSKate Stone value_list.Append( 917b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx)); 91830fdc8d8SChris Lattner } 91930fdc8d8SChris Lattner } 920c9858e4dSGreg Clayton } 9217fdf9ef1SGreg Clayton } 922581af8b0SJonas Devlieghere } 923ceb6b139SCaroline Tice 924*d232abc3SJonas Devlieghere return value_list; 92530fdc8d8SChris Lattner } 92630fdc8d8SChris Lattner 927b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) { 928baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, FindRegister, (const char *), 929baf5664fSJonas Devlieghere name); 930baf5664fSJonas Devlieghere 931ad9a53c5SJason Molenda SBValue result; 932ad9a53c5SJason Molenda ValueObjectSP value_sp; 933bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 934bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 935ad9a53c5SJason Molenda 936dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 937ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 938ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 939b9c1b51eSKate Stone if (target && process) { 940ad9a53c5SJason Molenda Process::StopLocker stop_locker; 941b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 942ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 943b9c1b51eSKate Stone if (frame) { 944ad9a53c5SJason Molenda RegisterContextSP reg_ctx(frame->GetRegisterContext()); 945b9c1b51eSKate Stone if (reg_ctx) { 9468567f4d4SMichał Górny if (const RegisterInfo *reg_info = 9478567f4d4SMichał Górny reg_ctx->GetRegisterInfoByName(name)) { 9488567f4d4SMichał Górny value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info); 949ad9a53c5SJason Molenda result.SetSP(value_sp); 950ad9a53c5SJason Molenda } 951ad9a53c5SJason Molenda } 952ad9a53c5SJason Molenda } 953ad9a53c5SJason Molenda } 954581af8b0SJonas Devlieghere } 955ad9a53c5SJason Molenda 956*d232abc3SJonas Devlieghere return result; 957ad9a53c5SJason Molenda } 958ad9a53c5SJason Molenda 959b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) { 960baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBFrame, GetDescription, (lldb::SBStream &), 961baf5664fSJonas Devlieghere description); 962baf5664fSJonas Devlieghere 963da7bc7d0SGreg Clayton Stream &strm = description.ref(); 964da7bc7d0SGreg Clayton 965bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 966bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9674fc6cb9cSJim Ingham 968b57e4a1bSJason Molenda StackFrame *frame; 969d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 9707730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 971b9c1b51eSKate Stone if (target && process) { 9727fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 973b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9747730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 975b9c1b51eSKate Stone if (frame) { 976d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&strm); 9777730b9a4SJim Ingham } 978c9858e4dSGreg Clayton } 979c9858e4dSGreg Clayton 980b9c1b51eSKate Stone } else 981da7bc7d0SGreg Clayton strm.PutCString("No value"); 982dde9cff3SCaroline Tice 983dde9cff3SCaroline Tice return true; 984dde9cff3SCaroline Tice } 9851d3afba3SGreg Clayton 986b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) { 987baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, (const char *), 988baf5664fSJonas Devlieghere expr); 989baf5664fSJonas Devlieghere 990316d498bSGreg Clayton SBValue result; 991c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 992c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 993c481c7eeSJim Ingham 994b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 995d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 996b9c1b51eSKate Stone if (frame && target) { 99735e1bda6SJim Ingham SBExpressionOptions options; 998b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value = 999b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 1000cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 100135e1bda6SJim Ingham options.SetUnwindOnError(true); 100224785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1003998c8a1cSRyan Brown if (target->GetLanguage() != eLanguageTypeUnknown) 1004998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1005998c8a1cSRyan Brown else 1006998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1007*d232abc3SJonas Devlieghere return EvaluateExpression(expr, options); 1008316d498bSGreg Clayton } 1009*d232abc3SJonas Devlieghere return result; 101078a685aaSJim Ingham } 101178a685aaSJim Ingham 101278a685aaSJim Ingham SBValue 1013b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr, 1014b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value) { 1015baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1016baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType), expr, 1017baf5664fSJonas Devlieghere fetch_dynamic_value); 1018baf5664fSJonas Devlieghere 101935e1bda6SJim Ingham SBExpressionOptions options; 1020cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 102135e1bda6SJim Ingham options.SetUnwindOnError(true); 102224785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1023c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1024c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1025c481c7eeSJim Ingham 1026998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1027998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1028998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1029998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1030998c8a1cSRyan Brown else if (frame) 1031998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1032*d232abc3SJonas Devlieghere return EvaluateExpression(expr, options); 10337ba6e991SJim Ingham } 10347ba6e991SJim Ingham 1035b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr, 1036b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value, 1037b9c1b51eSKate Stone bool unwind_on_error) { 1038baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1039baf5664fSJonas Devlieghere (const char *, lldb::DynamicValueType, bool), expr, 1040baf5664fSJonas Devlieghere fetch_dynamic_value, unwind_on_error); 1041baf5664fSJonas Devlieghere 104235e1bda6SJim Ingham SBExpressionOptions options; 1043c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1044c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1045c481c7eeSJim Ingham 1046cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 104735e1bda6SJim Ingham options.SetUnwindOnError(unwind_on_error); 104824785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1049998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1050998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1051998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1052998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1053998c8a1cSRyan Brown else if (frame) 1054998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1055*d232abc3SJonas Devlieghere return EvaluateExpression(expr, options); 105635e1bda6SJim Ingham } 105735e1bda6SJim Ingham 1058b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr, 1059b9c1b51eSKate Stone const SBExpressionOptions &options) { 1060baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBFrame, EvaluateExpression, 1061baf5664fSJonas Devlieghere (const char *, const lldb::SBExpressionOptions &), expr, 1062baf5664fSJonas Devlieghere options); 1063baf5664fSJonas Devlieghere 10645160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_EXPRESSIONS)); 1065a162ebafSSean Callanan 106669b582faSGreg Clayton SBValue expr_result; 10677730b9a4SJim Ingham 1068b9c1b51eSKate Stone if (expr == nullptr || expr[0] == '\0') { 1069*d232abc3SJonas Devlieghere return expr_result; 10707730b9a4SJim Ingham } 10717730b9a4SJim Ingham 107281e871edSGreg Clayton ValueObjectSP expr_value_sp; 10734838131bSGreg Clayton 1074bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1075bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 10764fc6cb9cSJim Ingham 1077b9556accSGreg Clayton 1078dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 10797730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 10807730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10817730b9a4SJim Ingham 1082b9c1b51eSKate Stone if (target && process) { 10837fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1084b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 10857730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1086b9c1b51eSKate Stone if (frame) { 10878f7db52dSJim Ingham std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace; 1088b9c1b51eSKate Stone if (target->GetDisplayExpressionsInCrashlogs()) { 10891ba7c4d0SGreg Clayton StreamString frame_description; 1090d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&frame_description); 1091a8f3ae7cSJonas Devlieghere stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>( 1092b9c1b51eSKate Stone "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value " 1093b9c1b51eSKate Stone "= %u) %s", 1094b9c1b51eSKate Stone expr, options.GetFetchDynamicValue(), 1095c156427dSZachary Turner frame_description.GetData()); 1096fb6621efSGreg Clayton } 1097fb6621efSGreg Clayton 1098370e5dbaSPavel Labath target->EvaluateExpression(expr, frame, expr_value_sp, options.ref()); 1099e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 11007730b9a4SJim Ingham } 1101c9858e4dSGreg Clayton } 11027fdf9ef1SGreg Clayton } 11034838131bSGreg Clayton 110463e5fb76SJonas Devlieghere LLDB_LOGF(expr_log, 110563e5fb76SJonas Devlieghere "** [SBFrame::EvaluateExpression] Expression result is " 1106b9c1b51eSKate Stone "%s, summary %s **", 1107324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 11084838131bSGreg Clayton 1109*d232abc3SJonas Devlieghere return expr_result; 11101d3afba3SGreg Clayton } 1111316d498bSGreg Clayton 1112b9c1b51eSKate Stone bool SBFrame::IsInlined() { 1113baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsInlined); 1114baf5664fSJonas Devlieghere 111505f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->IsInlined(); 111605f75e9fSOleksiy Vyalov } 111705f75e9fSOleksiy Vyalov 1118b9c1b51eSKate Stone bool SBFrame::IsInlined() const { 1119baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsInlined); 1120baf5664fSJonas Devlieghere 1121c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1122c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1123c481c7eeSJim Ingham 1124dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1125d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 11267730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1127b9c1b51eSKate Stone if (target && process) { 11287fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1129b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11307730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1131b9c1b51eSKate Stone if (frame) { 11327fdf9ef1SGreg Clayton 1133d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1134316d498bSGreg Clayton if (block) 1135dbb0abbfSEugene Zelenko return block->GetContainingInlinedBlock() != nullptr; 11367730b9a4SJim Ingham } 1137c9858e4dSGreg Clayton } 11387fdf9ef1SGreg Clayton } 1139316d498bSGreg Clayton return false; 1140316d498bSGreg Clayton } 1141316d498bSGreg Clayton 11424b36f791SVedant Kumar bool SBFrame::IsArtificial() { 1143baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(bool, SBFrame, IsArtificial); 1144baf5664fSJonas Devlieghere 11454b36f791SVedant Kumar return static_cast<const SBFrame *>(this)->IsArtificial(); 11464b36f791SVedant Kumar } 11474b36f791SVedant Kumar 11484b36f791SVedant Kumar bool SBFrame::IsArtificial() const { 1149baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFrame, IsArtificial); 1150baf5664fSJonas Devlieghere 11514b36f791SVedant Kumar std::unique_lock<std::recursive_mutex> lock; 11524b36f791SVedant Kumar ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11534b36f791SVedant Kumar 11544b36f791SVedant Kumar StackFrame *frame = exe_ctx.GetFramePtr(); 11554b36f791SVedant Kumar if (frame) 11564b36f791SVedant Kumar return frame->IsArtificial(); 11574b36f791SVedant Kumar 11584b36f791SVedant Kumar return false; 11594b36f791SVedant Kumar } 11604b36f791SVedant Kumar 1161b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() { 1162baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetFunctionName); 1163baf5664fSJonas Devlieghere 116405f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->GetFunctionName(); 116505f75e9fSOleksiy Vyalov } 116605f75e9fSOleksiy Vyalov 1167bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const { 1168baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::LanguageType, SBFrame, GuessLanguage); 1169baf5664fSJonas Devlieghere 1170bdbdd229SJim Ingham std::unique_lock<std::recursive_mutex> lock; 1171bdbdd229SJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1172bdbdd229SJim Ingham 1173bdbdd229SJim Ingham StackFrame *frame = nullptr; 1174bdbdd229SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1175bdbdd229SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1176bdbdd229SJim Ingham if (target && process) { 1177bdbdd229SJim Ingham Process::StopLocker stop_locker; 1178bdbdd229SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) { 1179bdbdd229SJim Ingham frame = exe_ctx.GetFramePtr(); 1180bdbdd229SJim Ingham if (frame) { 1181bdbdd229SJim Ingham return frame->GuessLanguage(); 1182bdbdd229SJim Ingham } 1183bdbdd229SJim Ingham } 1184bdbdd229SJim Ingham } 1185bdbdd229SJim Ingham return eLanguageTypeUnknown; 1186bdbdd229SJim Ingham } 1187bdbdd229SJim Ingham 1188b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const { 1189baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBFrame, GetFunctionName); 1190baf5664fSJonas Devlieghere 1191dbb0abbfSEugene Zelenko const char *name = nullptr; 1192c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1193c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1194c481c7eeSJim Ingham 1195dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1196d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 11977730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1198b9c1b51eSKate Stone if (target && process) { 11997fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1200b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 12017730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1202b9c1b51eSKate Stone if (frame) { 1203b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1204b9c1b51eSKate Stone eSymbolContextBlock | 1205b9c1b51eSKate Stone eSymbolContextSymbol)); 1206b9c1b51eSKate Stone if (sc.block) { 1207316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1208b9c1b51eSKate Stone if (inlined_block) { 1209b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1210b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 121122b04487SAlex Langford name = inlined_info->GetName().AsCString(); 1212316d498bSGreg Clayton } 1213316d498bSGreg Clayton } 1214316d498bSGreg Clayton 1215b9c1b51eSKate Stone if (name == nullptr) { 1216316d498bSGreg Clayton if (sc.function) 1217316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1218316d498bSGreg Clayton } 1219316d498bSGreg Clayton 1220b9c1b51eSKate Stone if (name == nullptr) { 1221316d498bSGreg Clayton if (sc.symbol) 1222316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1223316d498bSGreg Clayton } 12247730b9a4SJim Ingham } 1225c9858e4dSGreg Clayton } 12267fdf9ef1SGreg Clayton } 1227316d498bSGreg Clayton return name; 1228316d498bSGreg Clayton } 1229c1f705c2SEnrico Granata 1230b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() { 1231baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBFrame, GetDisplayFunctionName); 1232baf5664fSJonas Devlieghere 1233dbb0abbfSEugene Zelenko const char *name = nullptr; 1234c481c7eeSJim Ingham 1235c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1236c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1237c481c7eeSJim Ingham 1238dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1239c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1240c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 1241b9c1b51eSKate Stone if (target && process) { 1242c1f705c2SEnrico Granata Process::StopLocker stop_locker; 1243b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1244c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr(); 1245b9c1b51eSKate Stone if (frame) { 1246b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1247b9c1b51eSKate Stone eSymbolContextBlock | 1248b9c1b51eSKate Stone eSymbolContextSymbol)); 1249b9c1b51eSKate Stone if (sc.block) { 1250c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1251b9c1b51eSKate Stone if (inlined_block) { 1252b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1253b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 125422b04487SAlex Langford name = inlined_info->GetDisplayName().AsCString(); 1255c1f705c2SEnrico Granata } 1256c1f705c2SEnrico Granata } 1257c1f705c2SEnrico Granata 1258b9c1b51eSKate Stone if (name == nullptr) { 1259c1f705c2SEnrico Granata if (sc.function) 1260c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString(); 1261c1f705c2SEnrico Granata } 1262c1f705c2SEnrico Granata 1263b9c1b51eSKate Stone if (name == nullptr) { 1264c1f705c2SEnrico Granata if (sc.symbol) 1265c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString(); 1266c1f705c2SEnrico Granata } 1267c1f705c2SEnrico Granata } 1268c1f705c2SEnrico Granata } 1269c1f705c2SEnrico Granata } 1270c1f705c2SEnrico Granata return name; 1271c1f705c2SEnrico Granata } 1272