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 17bd4bf82aSJonas Devlieghere #include "Utils.h" 1830fdc8d8SChris Lattner #include "lldb/Core/Address.h" 1930fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2030fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h" 2130fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h" 22347ec0faSAlex Langford #include "lldb/Expression/ExpressionVariable.h" 23151c032cSJim Ingham #include "lldb/Expression/UserExpression.h" 241ba7c4d0SGreg Clayton #include "lldb/Host/Host.h" 2530fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 261f746071SGreg Clayton #include "lldb/Symbol/Function.h" 271f746071SGreg Clayton #include "lldb/Symbol/Symbol.h" 2830fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 2930fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h" 30b9c1b51eSKate Stone #include "lldb/Symbol/VariableList.h" 3130fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h" 3230fdc8d8SChris Lattner #include "lldb/Target/Process.h" 3330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 34b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h" 3541ae8e74SKuba Mracek #include "lldb/Target/StackFrameRecognizer.h" 36b9556accSGreg Clayton #include "lldb/Target/StackID.h" 37b9c1b51eSKate Stone #include "lldb/Target/Target.h" 3830fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 39bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h" 401755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.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()) { 581755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 59baf5664fSJonas Devlieghere } 6030fdc8d8SChris Lattner 61b9c1b51eSKate Stone SBFrame::SBFrame(const StackFrameSP &lldb_object_sp) 62b9c1b51eSKate Stone : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) { 631755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, lldb_object_sp); 6430fdc8d8SChris Lattner } 6530fdc8d8SChris Lattner 66a3436f73SKazu Hirata SBFrame::SBFrame(const SBFrame &rhs) { 671755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs); 68baf5664fSJonas Devlieghere 69bd4bf82aSJonas Devlieghere m_opaque_sp = clone(rhs.m_opaque_sp); 70bd4bf82aSJonas Devlieghere } 71efabb123SGreg Clayton 72dbb0abbfSEugene Zelenko SBFrame::~SBFrame() = default; 73dbb0abbfSEugene Zelenko 74b9c1b51eSKate Stone const SBFrame &SBFrame::operator=(const SBFrame &rhs) { 751755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs); 76baf5664fSJonas Devlieghere 77efabb123SGreg Clayton if (this != &rhs) 78bd4bf82aSJonas Devlieghere m_opaque_sp = clone(rhs.m_opaque_sp); 79d232abc3SJonas Devlieghere return *this; 80efabb123SGreg Clayton } 81efabb123SGreg Clayton 82b9c1b51eSKate Stone StackFrameSP SBFrame::GetFrameSP() const { 83dbb0abbfSEugene Zelenko return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP()); 84b9556accSGreg Clayton } 8530fdc8d8SChris Lattner 86b9c1b51eSKate Stone void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) { 877fdf9ef1SGreg Clayton return m_opaque_sp->SetFrameSP(lldb_object_sp); 88b9556accSGreg Clayton } 8930fdc8d8SChris Lattner 90b9c1b51eSKate Stone bool SBFrame::IsValid() const { 911755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 927f5237bcSPavel Labath return this->operator bool(); 937f5237bcSPavel Labath } 947f5237bcSPavel Labath SBFrame::operator bool() const { 951755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 96baf5664fSJonas Devlieghere 97bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 98bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 997fa7dc36SJim Ingham 1007fa7dc36SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1017fa7dc36SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 102b9c1b51eSKate Stone if (target && process) { 1037fa7dc36SJim Ingham Process::StopLocker stop_locker; 1047fa7dc36SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 105dbb0abbfSEugene Zelenko return GetFrameSP().get() != nullptr; 10630fdc8d8SChris Lattner } 10730fdc8d8SChris Lattner 1087fa7dc36SJim Ingham // Without a target & process we can't have a valid stack frame. 1097fa7dc36SJim Ingham return false; 1107fa7dc36SJim Ingham } 1117fa7dc36SJim Ingham 112b9c1b51eSKate Stone SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const { 1131755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, resolve_scope); 114baf5664fSJonas Devlieghere 11530fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 116bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 117bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 118991e4453SZachary Turner SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope); 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())) { 1242efc6892SPavel Labath if (StackFrame *frame = exe_ctx.GetFramePtr()) 1252efc6892SPavel Labath sb_sym_ctx = frame->GetSymbolContext(scope); 126c9858e4dSGreg Clayton } 1277fdf9ef1SGreg Clayton } 128ceb6b139SCaroline Tice 129d232abc3SJonas Devlieghere return sb_sym_ctx; 13030fdc8d8SChris Lattner } 13130fdc8d8SChris Lattner 132b9c1b51eSKate Stone SBModule SBFrame::GetModule() const { 1331755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 134baf5664fSJonas Devlieghere 13572eff18aSGreg Clayton SBModule sb_module; 136acdbe816SGreg Clayton ModuleSP module_sp; 137bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 138bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1394fc6cb9cSJim Ingham 140dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 141d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1427730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 143b9c1b51eSKate Stone if (target && process) { 1447fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 145b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1467730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 147b9c1b51eSKate Stone if (frame) { 148d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp; 149acdbe816SGreg Clayton sb_module.SetSP(module_sp); 150c9858e4dSGreg Clayton } 1517fdf9ef1SGreg Clayton } 152581af8b0SJonas Devlieghere } 1534838131bSGreg Clayton 154d232abc3SJonas Devlieghere return sb_module; 15530fdc8d8SChris Lattner } 15630fdc8d8SChris Lattner 157b9c1b51eSKate Stone SBCompileUnit SBFrame::GetCompileUnit() const { 1581755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 159baf5664fSJonas Devlieghere 16072eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 161bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 162bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1634fc6cb9cSJim Ingham 164dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 165d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1667730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 167b9c1b51eSKate Stone if (target && process) { 1687fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 169b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1707730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 171b9c1b51eSKate Stone if (frame) { 172b9c1b51eSKate Stone sb_comp_unit.reset( 173b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit); 174c9858e4dSGreg Clayton } 175c9858e4dSGreg Clayton } 176581af8b0SJonas Devlieghere } 177ceb6b139SCaroline Tice 178d232abc3SJonas Devlieghere return sb_comp_unit; 17930fdc8d8SChris Lattner } 18030fdc8d8SChris Lattner 181b9c1b51eSKate Stone SBFunction SBFrame::GetFunction() const { 1821755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 183baf5664fSJonas Devlieghere 18472eff18aSGreg Clayton SBFunction sb_function; 185bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 186bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1874fc6cb9cSJim Ingham 188dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 189d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1907730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 191b9c1b51eSKate Stone if (target && process) { 1927fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 193b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1947730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 195b9c1b51eSKate Stone if (frame) { 196b9c1b51eSKate Stone sb_function.reset( 197b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextFunction).function); 1987fdf9ef1SGreg Clayton } 199c9858e4dSGreg Clayton } 200581af8b0SJonas Devlieghere } 2014838131bSGreg Clayton 202d232abc3SJonas Devlieghere return sb_function; 20330fdc8d8SChris Lattner } 20430fdc8d8SChris Lattner 205b9c1b51eSKate Stone SBSymbol SBFrame::GetSymbol() const { 2061755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 207baf5664fSJonas Devlieghere 20872eff18aSGreg Clayton SBSymbol sb_symbol; 209bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 210bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2114fc6cb9cSJim Ingham 212dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 213d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2147730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 215b9c1b51eSKate Stone if (target && process) { 2167fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 217b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2187730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 219b9c1b51eSKate Stone if (frame) { 220d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol); 2217fdf9ef1SGreg Clayton } 222c9858e4dSGreg Clayton } 223581af8b0SJonas Devlieghere } 224581af8b0SJonas Devlieghere 225d232abc3SJonas Devlieghere return sb_symbol; 2263b06557eSGreg Clayton } 2273b06557eSGreg Clayton 228b9c1b51eSKate Stone SBBlock SBFrame::GetBlock() const { 2291755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 230baf5664fSJonas Devlieghere 23172eff18aSGreg Clayton SBBlock sb_block; 232bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 233bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2344fc6cb9cSJim Ingham 235dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 236d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2377730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 238b9c1b51eSKate Stone if (target && process) { 2397fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 240b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2417730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 242581af8b0SJonas Devlieghere if (frame) 243d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block); 2447fdf9ef1SGreg Clayton } 245c9858e4dSGreg Clayton } 246d232abc3SJonas Devlieghere return sb_block; 24730fdc8d8SChris Lattner } 24830fdc8d8SChris Lattner 249b9c1b51eSKate Stone SBBlock SBFrame::GetFrameBlock() const { 2501755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 251baf5664fSJonas Devlieghere 25272eff18aSGreg Clayton SBBlock sb_block; 253bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 254bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2554fc6cb9cSJim Ingham 256dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 257d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2587730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 259b9c1b51eSKate Stone if (target && process) { 2607fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 261b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2627730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 263581af8b0SJonas Devlieghere if (frame) 264d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock()); 2657fdf9ef1SGreg Clayton } 266c9858e4dSGreg Clayton } 267d232abc3SJonas Devlieghere return sb_block; 26895897c6aSGreg Clayton } 26995897c6aSGreg Clayton 270b9c1b51eSKate Stone SBLineEntry SBFrame::GetLineEntry() const { 2711755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 272baf5664fSJonas Devlieghere 27372eff18aSGreg Clayton SBLineEntry sb_line_entry; 274bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 275bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 2764fc6cb9cSJim Ingham 277dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 278d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2797730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 280b9c1b51eSKate Stone if (target && process) { 2817fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 282b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 2837730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 284b9c1b51eSKate Stone if (frame) { 285b9c1b51eSKate Stone sb_line_entry.SetLineEntry( 286b9c1b51eSKate Stone frame->GetSymbolContext(eSymbolContextLineEntry).line_entry); 2877fdf9ef1SGreg Clayton } 288c9858e4dSGreg Clayton } 289581af8b0SJonas Devlieghere } 290d232abc3SJonas Devlieghere return sb_line_entry; 29130fdc8d8SChris Lattner } 29230fdc8d8SChris Lattner 293b9c1b51eSKate Stone uint32_t SBFrame::GetFrameID() const { 2941755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 295baf5664fSJonas Devlieghere 296b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 297b9556accSGreg Clayton 298c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 299c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 300c481c7eeSJim Ingham 301b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 3027fdf9ef1SGreg Clayton if (frame) 303d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex(); 3044838131bSGreg Clayton 3054838131bSGreg Clayton return frame_idx; 30630fdc8d8SChris Lattner } 30730fdc8d8SChris Lattner 308b9c1b51eSKate Stone lldb::addr_t SBFrame::GetCFA() const { 3091755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 310baf5664fSJonas Devlieghere 311c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 312c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 313c481c7eeSJim Ingham 314424a5dbcSGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 315424a5dbcSGreg Clayton if (frame) 316424a5dbcSGreg Clayton return frame->GetStackID().GetCallFrameAddress(); 317424a5dbcSGreg Clayton return LLDB_INVALID_ADDRESS; 318424a5dbcSGreg Clayton } 319424a5dbcSGreg Clayton 320b9c1b51eSKate Stone addr_t SBFrame::GetPC() const { 3211755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 322baf5664fSJonas Devlieghere 32369b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 324bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 325bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3264fc6cb9cSJim Ingham 327dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 328d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3297730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 330b9c1b51eSKate Stone if (target && process) { 3317fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 332b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3337730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 334b9c1b51eSKate Stone if (frame) { 335b9c1b51eSKate Stone addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress( 33604803b3eSTatyana Krasnukha target, AddressClass::eCode); 337c9858e4dSGreg Clayton } 3387fdf9ef1SGreg Clayton } 339581af8b0SJonas Devlieghere } 340ceb6b139SCaroline Tice 341ceb6b139SCaroline Tice return addr; 34230fdc8d8SChris Lattner } 34330fdc8d8SChris Lattner 344b9c1b51eSKate Stone bool SBFrame::SetPC(addr_t new_pc) { 3451755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, new_pc); 346baf5664fSJonas Devlieghere 347ceb6b139SCaroline Tice bool ret_val = false; 348bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 349bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3504fc6cb9cSJim Ingham 351d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3527730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 353b9c1b51eSKate Stone if (target && process) { 3547fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 355b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3560d7401cfSMed Ismail Bennani if (StackFrame *frame = exe_ctx.GetFramePtr()) { 3570d7401cfSMed Ismail Bennani if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) { 3580d7401cfSMed Ismail Bennani ret_val = reg_ctx_sp->SetPC(new_pc); 3590d7401cfSMed Ismail Bennani } 360c9858e4dSGreg Clayton } 3617fdf9ef1SGreg Clayton } 362581af8b0SJonas Devlieghere } 363ceb6b139SCaroline Tice 364ceb6b139SCaroline Tice return ret_val; 36530fdc8d8SChris Lattner } 36630fdc8d8SChris Lattner 367b9c1b51eSKate Stone addr_t SBFrame::GetSP() const { 3681755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 369baf5664fSJonas Devlieghere 3704838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 371bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 372bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3734fc6cb9cSJim Ingham 374d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3757730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 376b9c1b51eSKate Stone if (target && process) { 3777fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 378b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 3790d7401cfSMed Ismail Bennani if (StackFrame *frame = exe_ctx.GetFramePtr()) { 3800d7401cfSMed Ismail Bennani if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) { 3810d7401cfSMed Ismail Bennani addr = reg_ctx_sp->GetSP(); 3820d7401cfSMed Ismail Bennani } 3837fdf9ef1SGreg Clayton } 384c9858e4dSGreg Clayton } 385581af8b0SJonas Devlieghere } 3864838131bSGreg Clayton 3874838131bSGreg Clayton return addr; 38830fdc8d8SChris Lattner } 38930fdc8d8SChris Lattner 390b9c1b51eSKate Stone addr_t SBFrame::GetFP() const { 3911755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 392baf5664fSJonas Devlieghere 39369b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 394bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 395bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 3964fc6cb9cSJim Ingham 397d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3987730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 399b9c1b51eSKate Stone if (target && process) { 4007fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 401b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4020d7401cfSMed Ismail Bennani if (StackFrame *frame = exe_ctx.GetFramePtr()) { 4030d7401cfSMed Ismail Bennani if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) { 4040d7401cfSMed Ismail Bennani addr = reg_ctx_sp->GetFP(); 4050d7401cfSMed Ismail Bennani } 4060d7401cfSMed Ismail Bennani } 407c9858e4dSGreg Clayton } 4087fdf9ef1SGreg Clayton } 409ceb6b139SCaroline Tice 410ceb6b139SCaroline Tice return addr; 41130fdc8d8SChris Lattner } 41230fdc8d8SChris Lattner 413b9c1b51eSKate Stone SBAddress SBFrame::GetPCAddress() const { 4141755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 415baf5664fSJonas Devlieghere 41630fdc8d8SChris Lattner SBAddress sb_addr; 417bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 418bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4194fc6cb9cSJim Ingham 420b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 421d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4227730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 423b9c1b51eSKate Stone if (target && process) { 4247fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 425b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4267730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 427581af8b0SJonas Devlieghere if (frame) 4286cd4a4cdSJonas Devlieghere sb_addr.SetAddress(frame->GetFrameCodeAddress()); 4297fdf9ef1SGreg Clayton } 430c9858e4dSGreg Clayton } 431d232abc3SJonas Devlieghere return sb_addr; 43230fdc8d8SChris Lattner } 43330fdc8d8SChris Lattner 434baf5664fSJonas Devlieghere void SBFrame::Clear() { 4351755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 436baf5664fSJonas Devlieghere 437baf5664fSJonas Devlieghere m_opaque_sp->Clear(); 438baf5664fSJonas Devlieghere } 43930fdc8d8SChris Lattner 440b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) { 4411755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, var_path); 442baf5664fSJonas Devlieghere 4437edbdfc9SGreg Clayton SBValue sb_value; 444c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 445c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 446c481c7eeSJim Ingham 447b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 448d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 449b9c1b51eSKate Stone if (frame && target) { 450b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 451b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 4527edbdfc9SGreg Clayton sb_value = GetValueForVariablePath(var_path, use_dynamic); 4537edbdfc9SGreg Clayton } 454d232abc3SJonas Devlieghere return sb_value; 4557edbdfc9SGreg Clayton } 4567edbdfc9SGreg Clayton 457b9c1b51eSKate Stone lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path, 458b9c1b51eSKate Stone DynamicValueType use_dynamic) { 4591755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, var_path, use_dynamic); 460baf5664fSJonas Devlieghere 4617edbdfc9SGreg Clayton SBValue sb_value; 462b9c1b51eSKate Stone if (var_path == nullptr || var_path[0] == '\0') { 463d232abc3SJonas Devlieghere return sb_value; 4647730b9a4SJim Ingham } 4657730b9a4SJim Ingham 466bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 467bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 4684fc6cb9cSJim Ingham 469dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 470d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4717730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 472b9c1b51eSKate Stone if (target && process) { 4737fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 474b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 4757730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 476b9c1b51eSKate Stone if (frame) { 4777edbdfc9SGreg Clayton VariableSP var_sp; 47897206d57SZachary Turner Status error; 479b9c1b51eSKate Stone ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath( 480b9c1b51eSKate Stone var_path, eNoDynamicValues, 481b9c1b51eSKate Stone StackFrame::eExpressionPathOptionCheckPtrVsMember | 482b9c1b51eSKate Stone StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 483b9c1b51eSKate Stone var_sp, error)); 484e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 4857730b9a4SJim Ingham } 486c9858e4dSGreg Clayton } 4877fdf9ef1SGreg Clayton } 488d232abc3SJonas Devlieghere return sb_value; 4897edbdfc9SGreg Clayton } 4907edbdfc9SGreg Clayton 491b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name) { 4921755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name); 493baf5664fSJonas Devlieghere 494316d498bSGreg Clayton SBValue value; 495c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 496c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 497c481c7eeSJim Ingham 498b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 499d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 500b9c1b51eSKate Stone if (frame && target) { 501b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 502b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 503316d498bSGreg Clayton value = FindVariable(name, use_dynamic); 504316d498bSGreg Clayton } 505d232abc3SJonas Devlieghere return value; 50678a685aaSJim Ingham } 50778a685aaSJim Ingham 508b9c1b51eSKate Stone SBValue SBFrame::FindVariable(const char *name, 509b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 5101755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, use_dynamic); 511baf5664fSJonas Devlieghere 51269b582faSGreg Clayton VariableSP var_sp; 51358b59f95SJim Ingham SBValue sb_value; 5147730b9a4SJim Ingham 515b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 516d232abc3SJonas Devlieghere return sb_value; 5177730b9a4SJim Ingham } 5187730b9a4SJim Ingham 51981e871edSGreg Clayton ValueObjectSP value_sp; 520bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 521bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5224fc6cb9cSJim Ingham 523dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 524d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5257730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 526b9c1b51eSKate Stone if (target && process) { 5277fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 528b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5297730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 530b9c1b51eSKate Stone if (frame) { 531e23d0b63SShafik Yaghmour value_sp = frame->FindVariable(ConstString(name)); 53230fdc8d8SChris Lattner 533e23d0b63SShafik Yaghmour if (value_sp) 534e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 535c9858e4dSGreg Clayton } 536316d498bSGreg Clayton } 537581af8b0SJonas Devlieghere } 5384838131bSGreg Clayton 539d232abc3SJonas Devlieghere return sb_value; 540dde9cff3SCaroline Tice } 541dde9cff3SCaroline Tice 542b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type) { 5431755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, value_type); 544baf5664fSJonas Devlieghere 545316d498bSGreg Clayton SBValue value; 546c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 547c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 548c481c7eeSJim Ingham 549b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 550d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 551b9c1b51eSKate Stone if (frame && target) { 552b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 553b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 554316d498bSGreg Clayton value = FindValue(name, value_type, use_dynamic); 555316d498bSGreg Clayton } 556d232abc3SJonas Devlieghere return value; 55778a685aaSJim Ingham } 55878a685aaSJim Ingham 559b9c1b51eSKate Stone SBValue SBFrame::FindValue(const char *name, ValueType value_type, 560b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 5611755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, value_type, use_dynamic); 562baf5664fSJonas Devlieghere 56369b582faSGreg Clayton SBValue sb_value; 5647730b9a4SJim Ingham 565b9c1b51eSKate Stone if (name == nullptr || name[0] == '\0') { 566d232abc3SJonas Devlieghere return sb_value; 5677730b9a4SJim Ingham } 5687730b9a4SJim Ingham 56981e871edSGreg Clayton ValueObjectSP value_sp; 570bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 571bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 5724fc6cb9cSJim Ingham 573dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 574d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5757730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 576b9c1b51eSKate Stone if (target && process) { 5777fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 578b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 5797730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 580b9c1b51eSKate Stone if (frame) { 5818a2a0dfbSEnrico Granata VariableList variable_list; 5828a2a0dfbSEnrico Granata 583b9c1b51eSKate Stone switch (value_type) { 58469b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 58569b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 58669b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 58769b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 58863a27afaSGreg Clayton case eValueTypeVariableThreadLocal: // thread local variables 58969b582faSGreg Clayton { 590d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 59172eff18aSGreg Clayton 59272eff18aSGreg Clayton const bool can_create = true; 59372eff18aSGreg Clayton const bool get_parent_variables = true; 59472eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 59572eff18aSGreg Clayton 5960efb51a0SChaoren Lin if (sc.block) 597b9c1b51eSKate Stone sc.block->AppendVariables( 598b9c1b51eSKate Stone can_create, get_parent_variables, 599b9c1b51eSKate Stone stop_if_block_is_inlined_function, 600b9c1b51eSKate Stone [frame](Variable *v) { return v->IsInScope(frame); }, 601b9c1b51eSKate Stone &variable_list); 602b9c1b51eSKate Stone if (value_type == eValueTypeVariableGlobal) { 6038a2a0dfbSEnrico Granata const bool get_file_globals = true; 6048a2a0dfbSEnrico Granata VariableList *frame_vars = frame->GetVariableList(get_file_globals); 6058a2a0dfbSEnrico Granata if (frame_vars) 6068a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 6078a2a0dfbSEnrico Granata } 60869b582faSGreg Clayton ConstString const_name(name); 609b9c1b51eSKate Stone VariableSP variable_sp( 610b9c1b51eSKate Stone variable_list.FindVariable(const_name, value_type)); 611b9c1b51eSKate Stone if (variable_sp) { 612b9c1b51eSKate Stone value_sp = frame->GetValueObjectForFrameVariable(variable_sp, 613b9c1b51eSKate Stone eNoDynamicValues); 614e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 61530fdc8d8SChris Lattner } 616b9c1b51eSKate Stone } break; 61769b582faSGreg Clayton 61869b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 61969b582faSGreg Clayton { 620d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 621b9c1b51eSKate Stone if (reg_ctx) { 6228567f4d4SMichał Górny if (const RegisterInfo *reg_info = 6238567f4d4SMichał Górny reg_ctx->GetRegisterInfoByName(name)) { 6248567f4d4SMichał Górny value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info); 62581e871edSGreg Clayton sb_value.SetSP(value_sp); 62669b582faSGreg Clayton } 62769b582faSGreg Clayton } 628b9c1b51eSKate Stone } break; 62969b582faSGreg Clayton 630b9c1b51eSKate Stone case eValueTypeRegisterSet: // A collection of stack frame register 631b9c1b51eSKate Stone // values 63269b582faSGreg Clayton { 633d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 634b9c1b51eSKate Stone if (reg_ctx) { 63569b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 636b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 63769b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx); 63869b582faSGreg Clayton if (reg_set && 63969b582faSGreg Clayton ((reg_set->name && strcasecmp(reg_set->name, name) == 0) || 640b9c1b51eSKate Stone (reg_set->short_name && 641b9c1b51eSKate Stone strcasecmp(reg_set->short_name, name) == 0))) { 642b9c1b51eSKate Stone value_sp = 643b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx); 64481e871edSGreg Clayton sb_value.SetSP(value_sp); 64581e871edSGreg Clayton break; 64669b582faSGreg Clayton } 64769b582faSGreg Clayton } 64869b582faSGreg Clayton } 649b9c1b51eSKate Stone } break; 65069b582faSGreg Clayton 65169b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 65269b582faSGreg Clayton { 65369b582faSGreg Clayton ConstString const_name(name); 654b9c1b51eSKate Stone ExpressionVariableSP expr_var_sp( 655b9c1b51eSKate Stone target->GetPersistentVariable(const_name)); 656b9c1b51eSKate Stone if (expr_var_sp) { 65781e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 658e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 65981e871edSGreg Clayton } 660b9c1b51eSKate Stone } break; 66169b582faSGreg Clayton 66269b582faSGreg Clayton default: 66369b582faSGreg Clayton break; 66469b582faSGreg Clayton } 665c9858e4dSGreg Clayton } 6667fdf9ef1SGreg Clayton } 667581af8b0SJonas Devlieghere } 6684838131bSGreg Clayton 669d232abc3SJonas Devlieghere return sb_value; 670dde9cff3SCaroline Tice } 671dde9cff3SCaroline Tice 672b9c1b51eSKate Stone bool SBFrame::IsEqual(const SBFrame &that) const { 6731755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, that); 674baf5664fSJonas Devlieghere 675b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 676b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 67735e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 67835e2ab60SJohnny Chen } 67935e2ab60SJohnny Chen 680baf5664fSJonas Devlieghere bool SBFrame::operator==(const SBFrame &rhs) const { 6811755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs); 68230fdc8d8SChris Lattner 683baf5664fSJonas Devlieghere return IsEqual(rhs); 684baf5664fSJonas Devlieghere } 685baf5664fSJonas Devlieghere 686baf5664fSJonas Devlieghere bool SBFrame::operator!=(const SBFrame &rhs) const { 6871755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs); 688baf5664fSJonas Devlieghere 689baf5664fSJonas Devlieghere return !IsEqual(rhs); 690baf5664fSJonas Devlieghere } 69130fdc8d8SChris Lattner 692b9c1b51eSKate Stone SBThread SBFrame::GetThread() const { 6931755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 694baf5664fSJonas Devlieghere 695c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 696c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 697c481c7eeSJim Ingham 698d9e416c0SGreg Clayton ThreadSP thread_sp(exe_ctx.GetThreadSP()); 699d9e416c0SGreg Clayton SBThread sb_thread(thread_sp); 700ceb6b139SCaroline Tice 701d232abc3SJonas Devlieghere return sb_thread; 70230fdc8d8SChris Lattner } 70330fdc8d8SChris Lattner 704b9c1b51eSKate Stone const char *SBFrame::Disassemble() const { 7051755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 706baf5664fSJonas Devlieghere 707dbb0abbfSEugene Zelenko const char *disassembly = nullptr; 708bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 709bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7104fc6cb9cSJim Ingham 711dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 712d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7137730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 714b9c1b51eSKate Stone if (target && process) { 7157fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 716b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 7177730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 718b9c1b51eSKate Stone if (frame) { 719d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 7207fdf9ef1SGreg Clayton } 721c9858e4dSGreg Clayton } 722581af8b0SJonas Devlieghere } 7234838131bSGreg Clayton 7244838131bSGreg Clayton return disassembly; 72530fdc8d8SChris Lattner } 72630fdc8d8SChris Lattner 727b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics, 728b9c1b51eSKate Stone bool in_scope_only) { 7291755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, arguments, locals, statics, in_scope_only); 730baf5664fSJonas Devlieghere 731316d498bSGreg Clayton SBValueList value_list; 732c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 733c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 734c481c7eeSJim Ingham 735b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 736d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 737b9c1b51eSKate Stone if (frame && target) { 738b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic = 739b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 740b9c1b51eSKate Stone const bool include_runtime_support_values = 741b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 74251f96eebSZachary Turner 74351f96eebSZachary Turner SBVariablesOptions options; 74451f96eebSZachary Turner options.SetIncludeArguments(arguments); 74551f96eebSZachary Turner options.SetIncludeLocals(locals); 74651f96eebSZachary Turner options.SetIncludeStatics(statics); 74751f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 74851f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 74951f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 75051f96eebSZachary Turner 75151f96eebSZachary Turner value_list = GetVariables(options); 752316d498bSGreg Clayton } 753d232abc3SJonas Devlieghere return value_list; 75478a685aaSJim Ingham } 75578a685aaSJim Ingham 756b9c1b51eSKate Stone lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals, 757b9c1b51eSKate Stone bool statics, bool in_scope_only, 758b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 7591755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, arguments, locals, statics, in_scope_only, 7601755f5b1SJonas Devlieghere use_dynamic); 761baf5664fSJonas Devlieghere 762c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 763c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 764c481c7eeSJim Ingham 765560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 766b9c1b51eSKate Stone const bool include_runtime_support_values = 767b9c1b51eSKate Stone target ? target->GetDisplayRuntimeSupportValues() : false; 76851f96eebSZachary Turner SBVariablesOptions options; 76951f96eebSZachary Turner options.SetIncludeArguments(arguments); 77051f96eebSZachary Turner options.SetIncludeLocals(locals); 77151f96eebSZachary Turner options.SetIncludeStatics(statics); 77251f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 77351f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 77451f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 775d232abc3SJonas Devlieghere return GetVariables(options); 776560558ebSEnrico Granata } 777560558ebSEnrico Granata 778b9c1b51eSKate Stone SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) { 7791755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, options); 780baf5664fSJonas Devlieghere 781b9556accSGreg Clayton SBValueList value_list; 782bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 783bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 7844fc6cb9cSJim Ingham 785dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 786d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 787b9556accSGreg Clayton 78851f96eebSZachary Turner const bool statics = options.GetIncludeStatics(); 78951f96eebSZachary Turner const bool arguments = options.GetIncludeArguments(); 7904c7f5d5cSKuba Mracek const bool recognized_arguments = 7914c7f5d5cSKuba Mracek options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP())); 79251f96eebSZachary Turner const bool locals = options.GetIncludeLocals(); 79351f96eebSZachary Turner const bool in_scope_only = options.GetInScopeOnly(); 794b9c1b51eSKate Stone const bool include_runtime_support_values = 795b9c1b51eSKate Stone options.GetIncludeRuntimeSupportValues(); 79651f96eebSZachary Turner const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 79751f96eebSZachary Turner 798ceb6b139SCaroline Tice 799349213f9SGreg Clayton std::set<VariableSP> variable_set; 8007730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 801b9c1b51eSKate Stone if (target && process) { 8027fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 803b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 8047730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 805b9c1b51eSKate Stone if (frame) { 806dbb0abbfSEugene Zelenko VariableList *variable_list = nullptr; 807d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 808b9c1b51eSKate Stone if (variable_list) { 80930fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 810b9c1b51eSKate Stone if (num_variables) { 811d1782133SRaphael Isemann for (const VariableSP &variable_sp : *variable_list) { 812b9c1b51eSKate Stone if (variable_sp) { 81330fdc8d8SChris Lattner bool add_variable = false; 814b9c1b51eSKate Stone switch (variable_sp->GetScope()) { 81530fdc8d8SChris Lattner case eValueTypeVariableGlobal: 81630fdc8d8SChris Lattner case eValueTypeVariableStatic: 81763a27afaSGreg Clayton case eValueTypeVariableThreadLocal: 81830fdc8d8SChris Lattner add_variable = statics; 81930fdc8d8SChris Lattner break; 82030fdc8d8SChris Lattner 82130fdc8d8SChris Lattner case eValueTypeVariableArgument: 82230fdc8d8SChris Lattner add_variable = arguments; 82330fdc8d8SChris Lattner break; 82430fdc8d8SChris Lattner 82530fdc8d8SChris Lattner case eValueTypeVariableLocal: 82630fdc8d8SChris Lattner add_variable = locals; 82730fdc8d8SChris Lattner break; 828c982c768SGreg Clayton 829c982c768SGreg Clayton default: 830c982c768SGreg Clayton break; 83130fdc8d8SChris Lattner } 832b9c1b51eSKate Stone if (add_variable) { 833349213f9SGreg Clayton // Only add variables once so we don't end up with duplicates 834349213f9SGreg Clayton if (variable_set.find(variable_sp) == variable_set.end()) 835349213f9SGreg Clayton variable_set.insert(variable_sp); 836349213f9SGreg Clayton else 837349213f9SGreg Clayton continue; 838349213f9SGreg Clayton 839d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 84030fdc8d8SChris Lattner continue; 84130fdc8d8SChris Lattner 842b9c1b51eSKate Stone ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable( 843b9c1b51eSKate Stone variable_sp, eNoDynamicValues)); 844560558ebSEnrico Granata 845b9c1b51eSKate Stone if (!include_runtime_support_values && valobj_sp != nullptr && 846dbb0abbfSEugene Zelenko valobj_sp->IsRuntimeSupportValue()) 847560558ebSEnrico Granata continue; 848560558ebSEnrico Granata 849e3e91517SEnrico Granata SBValue value_sb; 850e3e91517SEnrico Granata value_sb.SetSP(valobj_sp, use_dynamic); 851e3e91517SEnrico Granata value_list.Append(value_sb); 85230fdc8d8SChris Lattner } 85330fdc8d8SChris Lattner } 85430fdc8d8SChris Lattner } 85530fdc8d8SChris Lattner } 85630fdc8d8SChris Lattner } 85741ae8e74SKuba Mracek if (recognized_arguments) { 85841ae8e74SKuba Mracek auto recognized_frame = frame->GetRecognizedFrame(); 85941ae8e74SKuba Mracek if (recognized_frame) { 86041ae8e74SKuba Mracek ValueObjectListSP recognized_arg_list = 86141ae8e74SKuba Mracek recognized_frame->GetRecognizedArguments(); 86241ae8e74SKuba Mracek if (recognized_arg_list) { 86341ae8e74SKuba Mracek for (auto &rec_value_sp : recognized_arg_list->GetObjects()) { 86441ae8e74SKuba Mracek SBValue value_sb; 86541ae8e74SKuba Mracek value_sb.SetSP(rec_value_sp, use_dynamic); 86641ae8e74SKuba Mracek value_list.Append(value_sb); 86741ae8e74SKuba Mracek } 86841ae8e74SKuba Mracek } 86941ae8e74SKuba Mracek } 87041ae8e74SKuba Mracek } 871c9858e4dSGreg Clayton } 8727fdf9ef1SGreg Clayton } 873581af8b0SJonas Devlieghere } 874ceb6b139SCaroline Tice 875d232abc3SJonas Devlieghere return value_list; 87630fdc8d8SChris Lattner } 87730fdc8d8SChris Lattner 878b9c1b51eSKate Stone SBValueList SBFrame::GetRegisters() { 8791755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 880baf5664fSJonas Devlieghere 88130fdc8d8SChris Lattner SBValueList value_list; 882bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 883bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 8844fc6cb9cSJim Ingham 885dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 886d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 8877730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 888b9c1b51eSKate Stone if (target && process) { 8897fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 890b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 8917730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 892b9c1b51eSKate Stone if (frame) { 893d9e416c0SGreg Clayton RegisterContextSP reg_ctx(frame->GetRegisterContext()); 894b9c1b51eSKate Stone if (reg_ctx) { 89530fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 896b9c1b51eSKate Stone for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 897b9c1b51eSKate Stone value_list.Append( 898b9c1b51eSKate Stone ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx)); 89930fdc8d8SChris Lattner } 90030fdc8d8SChris Lattner } 901c9858e4dSGreg Clayton } 9027fdf9ef1SGreg Clayton } 903581af8b0SJonas Devlieghere } 904ceb6b139SCaroline Tice 905d232abc3SJonas Devlieghere return value_list; 90630fdc8d8SChris Lattner } 90730fdc8d8SChris Lattner 908b9c1b51eSKate Stone SBValue SBFrame::FindRegister(const char *name) { 9091755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name); 910baf5664fSJonas Devlieghere 911ad9a53c5SJason Molenda SBValue result; 912ad9a53c5SJason Molenda ValueObjectSP value_sp; 913bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 914bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 915ad9a53c5SJason Molenda 916dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 917ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 918ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 919b9c1b51eSKate Stone if (target && process) { 920ad9a53c5SJason Molenda Process::StopLocker stop_locker; 921b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 922ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 923b9c1b51eSKate Stone if (frame) { 924ad9a53c5SJason Molenda RegisterContextSP reg_ctx(frame->GetRegisterContext()); 925b9c1b51eSKate Stone if (reg_ctx) { 9268567f4d4SMichał Górny if (const RegisterInfo *reg_info = 9278567f4d4SMichał Górny reg_ctx->GetRegisterInfoByName(name)) { 9288567f4d4SMichał Górny value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info); 929ad9a53c5SJason Molenda result.SetSP(value_sp); 930ad9a53c5SJason Molenda } 931ad9a53c5SJason Molenda } 932ad9a53c5SJason Molenda } 933ad9a53c5SJason Molenda } 934581af8b0SJonas Devlieghere } 935ad9a53c5SJason Molenda 936d232abc3SJonas Devlieghere return result; 937ad9a53c5SJason Molenda } 938ad9a53c5SJason Molenda 939b9c1b51eSKate Stone bool SBFrame::GetDescription(SBStream &description) { 9401755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, description); 941baf5664fSJonas Devlieghere 942da7bc7d0SGreg Clayton Stream &strm = description.ref(); 943da7bc7d0SGreg Clayton 944bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 945bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 9464fc6cb9cSJim Ingham 947b57e4a1bSJason Molenda StackFrame *frame; 948d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 9497730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 950b9c1b51eSKate Stone if (target && process) { 9517fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 952b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 9537730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 954b9c1b51eSKate Stone if (frame) { 955d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&strm); 9567730b9a4SJim Ingham } 957c9858e4dSGreg Clayton } 958c9858e4dSGreg Clayton 959b9c1b51eSKate Stone } else 960da7bc7d0SGreg Clayton strm.PutCString("No value"); 961dde9cff3SCaroline Tice 962dde9cff3SCaroline Tice return true; 963dde9cff3SCaroline Tice } 9641d3afba3SGreg Clayton 965b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr) { 9661755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, expr); 967baf5664fSJonas Devlieghere 968316d498bSGreg Clayton SBValue result; 969c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 970c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 971c481c7eeSJim Ingham 972b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 973d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 974b9c1b51eSKate Stone if (frame && target) { 97535e1bda6SJim Ingham SBExpressionOptions options; 976b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value = 977b9c1b51eSKate Stone frame->CalculateTarget()->GetPreferDynamicValue(); 978cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 97935e1bda6SJim Ingham options.SetUnwindOnError(true); 98024785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 981998c8a1cSRyan Brown if (target->GetLanguage() != eLanguageTypeUnknown) 982998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 983998c8a1cSRyan Brown else 984998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 985d232abc3SJonas Devlieghere return EvaluateExpression(expr, options); 986316d498bSGreg Clayton } 987d232abc3SJonas Devlieghere return result; 98878a685aaSJim Ingham } 98978a685aaSJim Ingham 99078a685aaSJim Ingham SBValue 991b9c1b51eSKate Stone SBFrame::EvaluateExpression(const char *expr, 992b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value) { 9931755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, expr, fetch_dynamic_value); 994baf5664fSJonas Devlieghere 99535e1bda6SJim Ingham SBExpressionOptions options; 996cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 99735e1bda6SJim Ingham options.SetUnwindOnError(true); 99824785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 999c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1000c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1001c481c7eeSJim Ingham 1002998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1003998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1004998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1005998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1006998c8a1cSRyan Brown else if (frame) 1007998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1008d232abc3SJonas Devlieghere return EvaluateExpression(expr, options); 10097ba6e991SJim Ingham } 10107ba6e991SJim Ingham 1011b9c1b51eSKate Stone SBValue SBFrame::EvaluateExpression(const char *expr, 1012b9c1b51eSKate Stone lldb::DynamicValueType fetch_dynamic_value, 1013b9c1b51eSKate Stone bool unwind_on_error) { 10141755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, expr, fetch_dynamic_value, unwind_on_error); 1015baf5664fSJonas Devlieghere 101635e1bda6SJim Ingham SBExpressionOptions options; 1017c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1018c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1019c481c7eeSJim Ingham 1020cced1566SGreg Clayton options.SetFetchDynamicValue(fetch_dynamic_value); 102135e1bda6SJim Ingham options.SetUnwindOnError(unwind_on_error); 102224785bd0SEugene Leviant options.SetIgnoreBreakpoints(true); 1023998c8a1cSRyan Brown StackFrame *frame = exe_ctx.GetFramePtr(); 1024998c8a1cSRyan Brown Target *target = exe_ctx.GetTargetPtr(); 1025998c8a1cSRyan Brown if (target && target->GetLanguage() != eLanguageTypeUnknown) 1026998c8a1cSRyan Brown options.SetLanguage(target->GetLanguage()); 1027998c8a1cSRyan Brown else if (frame) 1028998c8a1cSRyan Brown options.SetLanguage(frame->GetLanguage()); 1029d232abc3SJonas Devlieghere return EvaluateExpression(expr, options); 103035e1bda6SJim Ingham } 103135e1bda6SJim Ingham 1032b9c1b51eSKate Stone lldb::SBValue SBFrame::EvaluateExpression(const char *expr, 1033b9c1b51eSKate Stone const SBExpressionOptions &options) { 10341755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, expr, options); 1035baf5664fSJonas Devlieghere 1036*a007a6d8SPavel Labath Log *expr_log = GetLog(LLDBLog::Expressions); 1037a162ebafSSean Callanan 103869b582faSGreg Clayton SBValue expr_result; 10397730b9a4SJim Ingham 1040b9c1b51eSKate Stone if (expr == nullptr || expr[0] == '\0') { 1041d232abc3SJonas Devlieghere return expr_result; 10427730b9a4SJim Ingham } 10437730b9a4SJim Ingham 104481e871edSGreg Clayton ValueObjectSP expr_value_sp; 10454838131bSGreg Clayton 1046bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock; 1047bb19a13cSSaleem Abdulrasool ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 10484fc6cb9cSJim Ingham 1049b9556accSGreg Clayton 1050dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 10517730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 10527730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10537730b9a4SJim Ingham 1054b9c1b51eSKate Stone if (target && process) { 10557fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1056b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 10577730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1058b9c1b51eSKate Stone if (frame) { 10598f7db52dSJim Ingham std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace; 1060b9c1b51eSKate Stone if (target->GetDisplayExpressionsInCrashlogs()) { 10611ba7c4d0SGreg Clayton StreamString frame_description; 1062d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat(&frame_description); 1063a8f3ae7cSJonas Devlieghere stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>( 1064b9c1b51eSKate Stone "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value " 1065b9c1b51eSKate Stone "= %u) %s", 1066b9c1b51eSKate Stone expr, options.GetFetchDynamicValue(), 1067c156427dSZachary Turner frame_description.GetData()); 1068fb6621efSGreg Clayton } 1069fb6621efSGreg Clayton 1070370e5dbaSPavel Labath target->EvaluateExpression(expr, frame, expr_value_sp, options.ref()); 1071e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 10727730b9a4SJim Ingham } 1073c9858e4dSGreg Clayton } 10747fdf9ef1SGreg Clayton } 10754838131bSGreg Clayton 107663e5fb76SJonas Devlieghere LLDB_LOGF(expr_log, 107763e5fb76SJonas Devlieghere "** [SBFrame::EvaluateExpression] Expression result is " 1078b9c1b51eSKate Stone "%s, summary %s **", 1079324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 10804838131bSGreg Clayton 1081d232abc3SJonas Devlieghere return expr_result; 10821d3afba3SGreg Clayton } 1083316d498bSGreg Clayton 1084b9c1b51eSKate Stone bool SBFrame::IsInlined() { 10851755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 1086baf5664fSJonas Devlieghere 108705f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->IsInlined(); 108805f75e9fSOleksiy Vyalov } 108905f75e9fSOleksiy Vyalov 1090b9c1b51eSKate Stone bool SBFrame::IsInlined() const { 10911755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 1092baf5664fSJonas Devlieghere 1093c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1094c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1095c481c7eeSJim Ingham 1096dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1097d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 10987730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1099b9c1b51eSKate Stone if (target && process) { 11007fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1101b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11027730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1103b9c1b51eSKate Stone if (frame) { 11047fdf9ef1SGreg Clayton 1105d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1106316d498bSGreg Clayton if (block) 1107dbb0abbfSEugene Zelenko return block->GetContainingInlinedBlock() != nullptr; 11087730b9a4SJim Ingham } 1109c9858e4dSGreg Clayton } 11107fdf9ef1SGreg Clayton } 1111316d498bSGreg Clayton return false; 1112316d498bSGreg Clayton } 1113316d498bSGreg Clayton 11144b36f791SVedant Kumar bool SBFrame::IsArtificial() { 11151755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 1116baf5664fSJonas Devlieghere 11174b36f791SVedant Kumar return static_cast<const SBFrame *>(this)->IsArtificial(); 11184b36f791SVedant Kumar } 11194b36f791SVedant Kumar 11204b36f791SVedant Kumar bool SBFrame::IsArtificial() const { 11211755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 1122baf5664fSJonas Devlieghere 11234b36f791SVedant Kumar std::unique_lock<std::recursive_mutex> lock; 11244b36f791SVedant Kumar ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 11254b36f791SVedant Kumar 11264b36f791SVedant Kumar StackFrame *frame = exe_ctx.GetFramePtr(); 11274b36f791SVedant Kumar if (frame) 11284b36f791SVedant Kumar return frame->IsArtificial(); 11294b36f791SVedant Kumar 11304b36f791SVedant Kumar return false; 11314b36f791SVedant Kumar } 11324b36f791SVedant Kumar 1133b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() { 11341755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 1135baf5664fSJonas Devlieghere 113605f75e9fSOleksiy Vyalov return static_cast<const SBFrame *>(this)->GetFunctionName(); 113705f75e9fSOleksiy Vyalov } 113805f75e9fSOleksiy Vyalov 1139bdbdd229SJim Ingham lldb::LanguageType SBFrame::GuessLanguage() const { 11401755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 1141baf5664fSJonas Devlieghere 1142bdbdd229SJim Ingham std::unique_lock<std::recursive_mutex> lock; 1143bdbdd229SJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1144bdbdd229SJim Ingham 1145bdbdd229SJim Ingham StackFrame *frame = nullptr; 1146bdbdd229SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 1147bdbdd229SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1148bdbdd229SJim Ingham if (target && process) { 1149bdbdd229SJim Ingham Process::StopLocker stop_locker; 1150bdbdd229SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) { 1151bdbdd229SJim Ingham frame = exe_ctx.GetFramePtr(); 1152bdbdd229SJim Ingham if (frame) { 1153bdbdd229SJim Ingham return frame->GuessLanguage(); 1154bdbdd229SJim Ingham } 1155bdbdd229SJim Ingham } 1156bdbdd229SJim Ingham } 1157bdbdd229SJim Ingham return eLanguageTypeUnknown; 1158bdbdd229SJim Ingham } 1159bdbdd229SJim Ingham 1160b9c1b51eSKate Stone const char *SBFrame::GetFunctionName() const { 11611755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 1162baf5664fSJonas Devlieghere 1163dbb0abbfSEugene Zelenko const char *name = nullptr; 1164c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1165c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1166c481c7eeSJim Ingham 1167dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1168d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 11697730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1170b9c1b51eSKate Stone if (target && process) { 11717fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1172b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 11737730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1174b9c1b51eSKate Stone if (frame) { 1175b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1176b9c1b51eSKate Stone eSymbolContextBlock | 1177b9c1b51eSKate Stone eSymbolContextSymbol)); 1178b9c1b51eSKate Stone if (sc.block) { 1179316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1180b9c1b51eSKate Stone if (inlined_block) { 1181b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1182b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 118322b04487SAlex Langford name = inlined_info->GetName().AsCString(); 1184316d498bSGreg Clayton } 1185316d498bSGreg Clayton } 1186316d498bSGreg Clayton 1187b9c1b51eSKate Stone if (name == nullptr) { 1188316d498bSGreg Clayton if (sc.function) 1189316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1190316d498bSGreg Clayton } 1191316d498bSGreg Clayton 1192b9c1b51eSKate Stone if (name == nullptr) { 1193316d498bSGreg Clayton if (sc.symbol) 1194316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1195316d498bSGreg Clayton } 11967730b9a4SJim Ingham } 1197c9858e4dSGreg Clayton } 11987fdf9ef1SGreg Clayton } 1199316d498bSGreg Clayton return name; 1200316d498bSGreg Clayton } 1201c1f705c2SEnrico Granata 1202b9c1b51eSKate Stone const char *SBFrame::GetDisplayFunctionName() { 12031755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 1204baf5664fSJonas Devlieghere 1205dbb0abbfSEugene Zelenko const char *name = nullptr; 1206c481c7eeSJim Ingham 1207c481c7eeSJim Ingham std::unique_lock<std::recursive_mutex> lock; 1208c481c7eeSJim Ingham ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1209c481c7eeSJim Ingham 1210dbb0abbfSEugene Zelenko StackFrame *frame = nullptr; 1211c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1212c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 1213b9c1b51eSKate Stone if (target && process) { 1214c1f705c2SEnrico Granata Process::StopLocker stop_locker; 1215b9c1b51eSKate Stone if (stop_locker.TryLock(&process->GetRunLock())) { 1216c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr(); 1217b9c1b51eSKate Stone if (frame) { 1218b9c1b51eSKate Stone SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1219b9c1b51eSKate Stone eSymbolContextBlock | 1220b9c1b51eSKate Stone eSymbolContextSymbol)); 1221b9c1b51eSKate Stone if (sc.block) { 1222c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1223b9c1b51eSKate Stone if (inlined_block) { 1224b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 1225b9c1b51eSKate Stone inlined_block->GetInlinedFunctionInfo(); 122622b04487SAlex Langford name = inlined_info->GetDisplayName().AsCString(); 1227c1f705c2SEnrico Granata } 1228c1f705c2SEnrico Granata } 1229c1f705c2SEnrico Granata 1230b9c1b51eSKate Stone if (name == nullptr) { 1231c1f705c2SEnrico Granata if (sc.function) 1232c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString(); 1233c1f705c2SEnrico Granata } 1234c1f705c2SEnrico Granata 1235b9c1b51eSKate Stone if (name == nullptr) { 1236c1f705c2SEnrico Granata if (sc.symbol) 1237c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString(); 1238c1f705c2SEnrico Granata } 1239c1f705c2SEnrico Granata } 1240c1f705c2SEnrico Granata } 1241c1f705c2SEnrico Granata } 1242c1f705c2SEnrico Granata return name; 1243c1f705c2SEnrico Granata } 1244