130fdc8d8SChris Lattner //===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 104c5de699SEli Friedman #include "lldb/API/SBFrame.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner #include <string> 1330fdc8d8SChris Lattner #include <algorithm> 1430fdc8d8SChris Lattner 1530fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1630fdc8d8SChris Lattner 1730fdc8d8SChris Lattner #include "lldb/Core/Address.h" 1830fdc8d8SChris Lattner #include "lldb/Core/ConstString.h" 19ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 2030fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h" 2330fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h" 24b71f3844SGreg Clayton #include "lldb/Expression/ClangUserExpression.h" 251ba7c4d0SGreg Clayton #include "lldb/Host/Host.h" 2630fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 2730fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 2830fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h" 2930fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h" 3030fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h" 3130fdc8d8SChris Lattner #include "lldb/Target/Target.h" 3230fdc8d8SChris Lattner #include "lldb/Target/Process.h" 3330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 3430fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h" 35b9556accSGreg Clayton #include "lldb/Target/StackID.h" 3630fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 3730fdc8d8SChris Lattner 384c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 394c5de699SEli Friedman #include "lldb/API/SBValue.h" 404c5de699SEli Friedman #include "lldb/API/SBAddress.h" 41dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 424c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h" 434c5de699SEli Friedman #include "lldb/API/SBThread.h" 4430fdc8d8SChris Lattner 45b9556accSGreg Clayton namespace lldb_private { 46b9556accSGreg Clayton 47b9556accSGreg Clayton class StackFrameImpl 48b9556accSGreg Clayton { 49b9556accSGreg Clayton public: 50b9556accSGreg Clayton StackFrameImpl (const lldb::StackFrameSP &frame_sp) : 51b9556accSGreg Clayton m_frame_wp (frame_sp), 52b9556accSGreg Clayton m_thread_wp (), 53b9556accSGreg Clayton m_stack_id () 54b9556accSGreg Clayton { 55b9556accSGreg Clayton if (frame_sp) 56b9556accSGreg Clayton { 57d9e416c0SGreg Clayton m_thread_wp = frame_sp->GetThread(); 58b9556accSGreg Clayton m_stack_id = frame_sp->GetStackID(); 59b9556accSGreg Clayton } 60b9556accSGreg Clayton } 61b9556accSGreg Clayton 62b9556accSGreg Clayton ~StackFrameImpl() 63b9556accSGreg Clayton { 64b9556accSGreg Clayton } 65b9556accSGreg Clayton 66b9556accSGreg Clayton lldb::StackFrameSP 67b9556accSGreg Clayton GetFrameSP () 68b9556accSGreg Clayton { 69b9556accSGreg Clayton lldb::StackFrameSP frame_sp; 70b9556accSGreg Clayton // We have a weak pointer to our thread, which might 71b9556accSGreg Clayton // be NULL'ed out if the thread went away, so first 72b9556accSGreg Clayton // make sure our thread is still alive. 73b9556accSGreg Clayton lldb::ThreadSP thread_sp (m_thread_wp.lock()); 74b9556accSGreg Clayton if (thread_sp) 75b9556accSGreg Clayton { 76b9556accSGreg Clayton // Our thread is still here, check if our frame 77b9556accSGreg Clayton // is still alive as well. 78b9556accSGreg Clayton frame_sp = m_frame_wp.lock(); 79b9556accSGreg Clayton if (frame_sp) 80b9556accSGreg Clayton { 81b9556accSGreg Clayton // Our frame is still alive, make sure that our thread 82b9556accSGreg Clayton // still has this exact frame... 83b9556accSGreg Clayton lldb::StackFrameSP tmp_frame_sp (thread_sp->GetStackFrameAtIndex (frame_sp->GetFrameIndex())); 84d9e416c0SGreg Clayton if (tmp_frame_sp == frame_sp) 85b9556accSGreg Clayton return frame_sp; 86b9556accSGreg Clayton } 87b9556accSGreg Clayton // The original stack frame might have gone away, 88d9e416c0SGreg Clayton // we need to check for the frame by stack ID 89b9556accSGreg Clayton frame_sp = thread_sp->GetFrameWithStackID (m_stack_id); 90b9556accSGreg Clayton m_frame_wp = frame_sp; 91b9556accSGreg Clayton } 92b9556accSGreg Clayton return frame_sp; 93b9556accSGreg Clayton } 94b9556accSGreg Clayton 95b9556accSGreg Clayton void 96b9556accSGreg Clayton SetFrameSP (const lldb::StackFrameSP &frame_sp) 97b9556accSGreg Clayton { 98b9556accSGreg Clayton if (frame_sp) 99b9556accSGreg Clayton { 100b9556accSGreg Clayton m_frame_wp = frame_sp; 101d9e416c0SGreg Clayton m_thread_wp = frame_sp->GetThread(); 102b9556accSGreg Clayton m_stack_id = frame_sp->GetStackID(); 103b9556accSGreg Clayton } 104b9556accSGreg Clayton else 105b9556accSGreg Clayton { 106b9556accSGreg Clayton m_frame_wp.reset(); 107b9556accSGreg Clayton m_thread_wp.reset(); 108b9556accSGreg Clayton m_stack_id.Clear(); 109b9556accSGreg Clayton } 110b9556accSGreg Clayton } 111b9556accSGreg Clayton 112b9556accSGreg Clayton protected: 113b9556accSGreg Clayton lldb::StackFrameWP m_frame_wp; 114b9556accSGreg Clayton lldb::ThreadWP m_thread_wp; 115b9556accSGreg Clayton StackID m_stack_id; 116b9556accSGreg Clayton }; 117b9556accSGreg Clayton } // namespace lldb_private 118b9556accSGreg Clayton 11930fdc8d8SChris Lattner using namespace lldb; 12030fdc8d8SChris Lattner using namespace lldb_private; 12130fdc8d8SChris Lattner 122b9556accSGreg Clayton 12330fdc8d8SChris Lattner SBFrame::SBFrame () : 1246611103cSGreg Clayton m_opaque_sp () 12530fdc8d8SChris Lattner { 12630fdc8d8SChris Lattner } 12730fdc8d8SChris Lattner 12869b582faSGreg Clayton SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) : 129b9556accSGreg Clayton m_opaque_sp (new StackFrameImpl (lldb_object_sp)) 13030fdc8d8SChris Lattner { 13169b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 132ceb6b139SCaroline Tice 133ceb6b139SCaroline Tice if (log) 134ceb6b139SCaroline Tice { 135ceb6b139SCaroline Tice SBStream sstr; 136ceb6b139SCaroline Tice GetDescription (sstr); 1374838131bSGreg Clayton log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s", 138b9556accSGreg Clayton lldb_object_sp.get(), lldb_object_sp.get(), sstr.GetData()); 139750cd175SCaroline Tice 140ceb6b139SCaroline Tice } 14130fdc8d8SChris Lattner } 14230fdc8d8SChris Lattner 143efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) : 144efabb123SGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 145efabb123SGreg Clayton { 146efabb123SGreg Clayton } 147efabb123SGreg Clayton 148efabb123SGreg Clayton const SBFrame & 149efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs) 150efabb123SGreg Clayton { 151efabb123SGreg Clayton if (this != &rhs) 152efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 153efabb123SGreg Clayton return *this; 154efabb123SGreg Clayton } 155efabb123SGreg Clayton 15630fdc8d8SChris Lattner SBFrame::~SBFrame() 15730fdc8d8SChris Lattner { 15830fdc8d8SChris Lattner } 15930fdc8d8SChris Lattner 160b9556accSGreg Clayton StackFrameSP 161b9556accSGreg Clayton SBFrame::GetFrameSP() const 162b9556accSGreg Clayton { 163b9556accSGreg Clayton StackFrameImplSP impl_sp (m_opaque_sp); 164b9556accSGreg Clayton StackFrameSP frame_sp; 165b9556accSGreg Clayton if (impl_sp) 166b9556accSGreg Clayton frame_sp = impl_sp->GetFrameSP(); 167b9556accSGreg Clayton return frame_sp; 168b9556accSGreg Clayton } 16930fdc8d8SChris Lattner 17030fdc8d8SChris Lattner void 171b9556accSGreg Clayton SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp) 17230fdc8d8SChris Lattner { 173b9556accSGreg Clayton if (lldb_object_sp) 1744838131bSGreg Clayton { 175b9556accSGreg Clayton if (m_opaque_sp) 176b9556accSGreg Clayton { 177b9556accSGreg Clayton StackFrameImplSP impl_sp (m_opaque_sp); 178b9556accSGreg Clayton if (impl_sp) 179b9556accSGreg Clayton impl_sp->SetFrameSP (lldb_object_sp); 1804838131bSGreg Clayton } 181b9556accSGreg Clayton else 182b9556accSGreg Clayton { 183b9556accSGreg Clayton m_opaque_sp = StackFrameImplSP (new StackFrameImpl(lldb_object_sp)); 18430fdc8d8SChris Lattner } 185b9556accSGreg Clayton } 186b9556accSGreg Clayton else 187b9556accSGreg Clayton { 188b9556accSGreg Clayton m_opaque_sp.reset(); 189b9556accSGreg Clayton } 190b9556accSGreg Clayton } 19130fdc8d8SChris Lattner 19230fdc8d8SChris Lattner bool 19330fdc8d8SChris Lattner SBFrame::IsValid() const 19430fdc8d8SChris Lattner { 195b9556accSGreg Clayton StackFrameImplSP impl_sp (m_opaque_sp); 196b9556accSGreg Clayton if (impl_sp) 197b9556accSGreg Clayton return (impl_sp->GetFrameSP().get() != NULL); 198b9556accSGreg Clayton return false; 19930fdc8d8SChris Lattner } 20030fdc8d8SChris Lattner 20130fdc8d8SChris Lattner SBSymbolContext 20230fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const 20330fdc8d8SChris Lattner { 204ceb6b139SCaroline Tice 20530fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 206d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 207d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 208d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 209d9e416c0SGreg Clayton if (frame && target) 210af67cecdSGreg Clayton { 211d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 212d9e416c0SGreg Clayton sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope)); 213af67cecdSGreg Clayton } 214ceb6b139SCaroline Tice 21569b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 216ceb6b139SCaroline Tice if (log) 2174838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)", 218d9e416c0SGreg Clayton frame, resolve_scope, sb_sym_ctx.get()); 219ceb6b139SCaroline Tice 22030fdc8d8SChris Lattner return sb_sym_ctx; 22130fdc8d8SChris Lattner } 22230fdc8d8SChris Lattner 22330fdc8d8SChris Lattner SBModule 22430fdc8d8SChris Lattner SBFrame::GetModule () const 22530fdc8d8SChris Lattner { 22672eff18aSGreg Clayton SBModule sb_module; 227acdbe816SGreg Clayton ModuleSP module_sp; 228d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 229d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 230d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 231d9e416c0SGreg Clayton if (frame && target) 232af67cecdSGreg Clayton { 233d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 234d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp; 235acdbe816SGreg Clayton sb_module.SetSP (module_sp); 236af67cecdSGreg Clayton } 23772eff18aSGreg Clayton 23869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2394838131bSGreg Clayton if (log) 2404838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)", 241d9e416c0SGreg Clayton frame, module_sp.get()); 2424838131bSGreg Clayton 24330fdc8d8SChris Lattner return sb_module; 24430fdc8d8SChris Lattner } 24530fdc8d8SChris Lattner 24630fdc8d8SChris Lattner SBCompileUnit 24730fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 24830fdc8d8SChris Lattner { 24972eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 250d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 251d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 252d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 253d9e416c0SGreg Clayton if (frame && target) 254af67cecdSGreg Clayton { 255d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 256d9e416c0SGreg Clayton sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 257af67cecdSGreg Clayton } 25869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 259ceb6b139SCaroline Tice if (log) 2604838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBCompileUnit(%p)", 261d9e416c0SGreg Clayton frame, sb_comp_unit.get()); 262ceb6b139SCaroline Tice 26330fdc8d8SChris Lattner return sb_comp_unit; 26430fdc8d8SChris Lattner } 26530fdc8d8SChris Lattner 26630fdc8d8SChris Lattner SBFunction 26730fdc8d8SChris Lattner SBFrame::GetFunction () const 26830fdc8d8SChris Lattner { 26972eff18aSGreg Clayton SBFunction sb_function; 270d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 271d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 272d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 273d9e416c0SGreg Clayton if (frame && target) 274af67cecdSGreg Clayton { 275d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 276d9e416c0SGreg Clayton sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function); 277af67cecdSGreg Clayton } 27869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2794838131bSGreg Clayton if (log) 2804838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)", 281d9e416c0SGreg Clayton frame, sb_function.get()); 2824838131bSGreg Clayton 28330fdc8d8SChris Lattner return sb_function; 28430fdc8d8SChris Lattner } 28530fdc8d8SChris Lattner 2863b06557eSGreg Clayton SBSymbol 2873b06557eSGreg Clayton SBFrame::GetSymbol () const 2883b06557eSGreg Clayton { 28972eff18aSGreg Clayton SBSymbol sb_symbol; 290d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 291d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 292d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 293d9e416c0SGreg Clayton if (frame && target) 294af67cecdSGreg Clayton { 295d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 296d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol); 297af67cecdSGreg Clayton } 29869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2994838131bSGreg Clayton if (log) 3004838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 301d9e416c0SGreg Clayton frame, sb_symbol.get()); 3023b06557eSGreg Clayton return sb_symbol; 3033b06557eSGreg Clayton } 3043b06557eSGreg Clayton 30530fdc8d8SChris Lattner SBBlock 30630fdc8d8SChris Lattner SBFrame::GetBlock () const 30730fdc8d8SChris Lattner { 30872eff18aSGreg Clayton SBBlock sb_block; 309d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 310d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 311d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 312d9e416c0SGreg Clayton if (frame && target) 313af67cecdSGreg Clayton { 314d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 315d9e416c0SGreg Clayton sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block); 316af67cecdSGreg Clayton } 31769b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3184838131bSGreg Clayton if (log) 3194838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)", 320d9e416c0SGreg Clayton frame, sb_block.GetPtr()); 32130fdc8d8SChris Lattner return sb_block; 32230fdc8d8SChris Lattner } 32330fdc8d8SChris Lattner 32495897c6aSGreg Clayton SBBlock 32595897c6aSGreg Clayton SBFrame::GetFrameBlock () const 32695897c6aSGreg Clayton { 32772eff18aSGreg Clayton SBBlock sb_block; 328d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 329d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 330d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 331d9e416c0SGreg Clayton if (frame && target) 332af67cecdSGreg Clayton { 333d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 334d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock ()); 335af67cecdSGreg Clayton } 33669b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3374838131bSGreg Clayton if (log) 3384838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 339d9e416c0SGreg Clayton frame, sb_block.GetPtr()); 34095897c6aSGreg Clayton return sb_block; 34195897c6aSGreg Clayton } 34295897c6aSGreg Clayton 34330fdc8d8SChris Lattner SBLineEntry 34430fdc8d8SChris Lattner SBFrame::GetLineEntry () const 34530fdc8d8SChris Lattner { 34672eff18aSGreg Clayton SBLineEntry sb_line_entry; 347d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 348d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 349d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 350d9e416c0SGreg Clayton if (frame && target) 351af67cecdSGreg Clayton { 352d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 353d9e416c0SGreg Clayton sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry); 354af67cecdSGreg Clayton } 35569b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3564838131bSGreg Clayton if (log) 3574838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 358d9e416c0SGreg Clayton frame, sb_line_entry.get()); 35930fdc8d8SChris Lattner return sb_line_entry; 36030fdc8d8SChris Lattner } 36130fdc8d8SChris Lattner 36230fdc8d8SChris Lattner uint32_t 36330fdc8d8SChris Lattner SBFrame::GetFrameID () const 36430fdc8d8SChris Lattner { 365b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 366b9556accSGreg Clayton 367b9556accSGreg Clayton 368d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 369d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 370d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 371d9e416c0SGreg Clayton if (frame && target) 372d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex (); 3734838131bSGreg Clayton 37469b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3754838131bSGreg Clayton if (log) 3764838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameID () => %u", 377d9e416c0SGreg Clayton frame, frame_idx); 3784838131bSGreg Clayton return frame_idx; 37930fdc8d8SChris Lattner } 38030fdc8d8SChris Lattner 38169b582faSGreg Clayton addr_t 38230fdc8d8SChris Lattner SBFrame::GetPC () const 38330fdc8d8SChris Lattner { 38469b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 385d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 386d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 387d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 388d9e416c0SGreg Clayton if (frame && target) 389af67cecdSGreg Clayton { 390d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 391d9e416c0SGreg Clayton addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target); 392af67cecdSGreg Clayton } 393ceb6b139SCaroline Tice 39469b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 395ceb6b139SCaroline Tice if (log) 396d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", frame, addr); 397ceb6b139SCaroline Tice 398ceb6b139SCaroline Tice return addr; 39930fdc8d8SChris Lattner } 40030fdc8d8SChris Lattner 40130fdc8d8SChris Lattner bool 40269b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc) 40330fdc8d8SChris Lattner { 404ceb6b139SCaroline Tice bool ret_val = false; 405d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 406d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 407d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 408d9e416c0SGreg Clayton if (frame && target) 409af67cecdSGreg Clayton { 410d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 411d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC (new_pc); 412af67cecdSGreg Clayton } 413ceb6b139SCaroline Tice 41469b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 415ceb6b139SCaroline Tice if (log) 4164838131bSGreg Clayton log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i", 417d9e416c0SGreg Clayton frame, new_pc, ret_val); 418ceb6b139SCaroline Tice 419ceb6b139SCaroline Tice return ret_val; 42030fdc8d8SChris Lattner } 42130fdc8d8SChris Lattner 42269b582faSGreg Clayton addr_t 42330fdc8d8SChris Lattner SBFrame::GetSP () const 42430fdc8d8SChris Lattner { 4254838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 426d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 427d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 428d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 429d9e416c0SGreg Clayton if (frame && target) 430af67cecdSGreg Clayton { 431d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 432d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 433af67cecdSGreg Clayton } 43469b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4354838131bSGreg Clayton if (log) 436d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", frame, addr); 4374838131bSGreg Clayton 4384838131bSGreg Clayton return addr; 43930fdc8d8SChris Lattner } 44030fdc8d8SChris Lattner 44130fdc8d8SChris Lattner 44269b582faSGreg Clayton addr_t 44330fdc8d8SChris Lattner SBFrame::GetFP () const 44430fdc8d8SChris Lattner { 44569b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 446d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 447d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 448d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 449d9e416c0SGreg Clayton if (frame && target) 450af67cecdSGreg Clayton { 451d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 452d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 453af67cecdSGreg Clayton } 454ceb6b139SCaroline Tice 45569b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 456ceb6b139SCaroline Tice if (log) 457d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", frame, addr); 458ceb6b139SCaroline Tice return addr; 45930fdc8d8SChris Lattner } 46030fdc8d8SChris Lattner 46130fdc8d8SChris Lattner 46230fdc8d8SChris Lattner SBAddress 46330fdc8d8SChris Lattner SBFrame::GetPCAddress () const 46430fdc8d8SChris Lattner { 46530fdc8d8SChris Lattner SBAddress sb_addr; 466d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 467d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 468d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 469d9e416c0SGreg Clayton if (frame && target) 470af67cecdSGreg Clayton { 471d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 472d9e416c0SGreg Clayton sb_addr.SetAddress (&frame->GetFrameCodeAddress()); 473af67cecdSGreg Clayton } 47469b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4754838131bSGreg Clayton if (log) 476d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get()); 47730fdc8d8SChris Lattner return sb_addr; 47830fdc8d8SChris Lattner } 47930fdc8d8SChris Lattner 48030fdc8d8SChris Lattner void 48130fdc8d8SChris Lattner SBFrame::Clear() 48230fdc8d8SChris Lattner { 4836611103cSGreg Clayton m_opaque_sp.reset(); 48430fdc8d8SChris Lattner } 48530fdc8d8SChris Lattner 4867edbdfc9SGreg Clayton lldb::SBValue 4877edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path) 4887edbdfc9SGreg Clayton { 4897edbdfc9SGreg Clayton SBValue sb_value; 490d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 491d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 492d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 493d9e416c0SGreg Clayton if (frame && target) 4947edbdfc9SGreg Clayton { 495d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 4967edbdfc9SGreg Clayton sb_value = GetValueForVariablePath (var_path, use_dynamic); 4977edbdfc9SGreg Clayton } 4987edbdfc9SGreg Clayton return sb_value; 4997edbdfc9SGreg Clayton } 5007edbdfc9SGreg Clayton 5017edbdfc9SGreg Clayton lldb::SBValue 5027edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic) 5037edbdfc9SGreg Clayton { 5047edbdfc9SGreg Clayton SBValue sb_value; 505d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 506d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 507d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 508d9e416c0SGreg Clayton if (frame && target && var_path && var_path[0]) 5097edbdfc9SGreg Clayton { 510d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 5117edbdfc9SGreg Clayton VariableSP var_sp; 5127edbdfc9SGreg Clayton Error error; 513d9e416c0SGreg Clayton ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path, 5147edbdfc9SGreg Clayton use_dynamic, 5157edbdfc9SGreg Clayton StackFrame::eExpressionPathOptionCheckPtrVsMember, 5167edbdfc9SGreg Clayton var_sp, 5177edbdfc9SGreg Clayton error)); 51881e871edSGreg Clayton sb_value.SetSP(value_sp); 5197edbdfc9SGreg Clayton } 5207edbdfc9SGreg Clayton return sb_value; 5217edbdfc9SGreg Clayton } 5227edbdfc9SGreg Clayton 52330fdc8d8SChris Lattner SBValue 52469b582faSGreg Clayton SBFrame::FindVariable (const char *name) 52530fdc8d8SChris Lattner { 526316d498bSGreg Clayton SBValue value; 527d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 528d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 529d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 530d9e416c0SGreg Clayton if (frame && target) 531316d498bSGreg Clayton { 532d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 533316d498bSGreg Clayton value = FindVariable (name, use_dynamic); 534316d498bSGreg Clayton } 535316d498bSGreg Clayton return value; 53678a685aaSJim Ingham } 53778a685aaSJim Ingham 5387edbdfc9SGreg Clayton 53978a685aaSJim Ingham SBValue 5402837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic) 54178a685aaSJim Ingham { 54269b582faSGreg Clayton VariableSP var_sp; 54358b59f95SJim Ingham SBValue sb_value; 54481e871edSGreg Clayton ValueObjectSP value_sp; 545d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 546d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 547d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 548d9e416c0SGreg Clayton if (frame && target && name && name[0]) 54930fdc8d8SChris Lattner { 55069b582faSGreg Clayton VariableList variable_list; 551d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 552d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 55330fdc8d8SChris Lattner 55472eff18aSGreg Clayton if (sc.block) 55530fdc8d8SChris Lattner { 55672eff18aSGreg Clayton const bool can_create = true; 55772eff18aSGreg Clayton const bool get_parent_variables = true; 55872eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 55972eff18aSGreg Clayton 56072eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 56172eff18aSGreg Clayton get_parent_variables, 56272eff18aSGreg Clayton stop_if_block_is_inlined_function, 56372eff18aSGreg Clayton &variable_list)) 56472eff18aSGreg Clayton { 56569b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 56630fdc8d8SChris Lattner } 56772eff18aSGreg Clayton } 56830fdc8d8SChris Lattner 5694838131bSGreg Clayton if (var_sp) 57081e871edSGreg Clayton { 571d9e416c0SGreg Clayton value_sp = frame->GetValueObjectForFrameVariable(var_sp, use_dynamic); 57281e871edSGreg Clayton sb_value.SetSP(value_sp); 57381e871edSGreg Clayton } 5744838131bSGreg Clayton 575316d498bSGreg Clayton } 576316d498bSGreg Clayton 57769b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5784838131bSGreg Clayton if (log) 57969b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 580d9e416c0SGreg Clayton frame, name, value_sp.get()); 5814838131bSGreg Clayton 582dde9cff3SCaroline Tice return sb_value; 583dde9cff3SCaroline Tice } 584dde9cff3SCaroline Tice 58530fdc8d8SChris Lattner SBValue 58669b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 58730fdc8d8SChris Lattner { 588316d498bSGreg Clayton SBValue value; 589d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 590d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 591d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 592d9e416c0SGreg Clayton if (frame && target) 593316d498bSGreg Clayton { 594d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 595316d498bSGreg Clayton value = FindValue (name, value_type, use_dynamic); 596316d498bSGreg Clayton } 597316d498bSGreg Clayton return value; 59878a685aaSJim Ingham } 59978a685aaSJim Ingham 60078a685aaSJim Ingham SBValue 6012837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) 60278a685aaSJim Ingham { 60369b582faSGreg Clayton SBValue sb_value; 60481e871edSGreg Clayton ValueObjectSP value_sp; 605d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 606d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 607d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 608d9e416c0SGreg Clayton if (frame && target && name && name[0]) 60930fdc8d8SChris Lattner { 610d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 61130fdc8d8SChris Lattner 61269b582faSGreg Clayton switch (value_type) 61330fdc8d8SChris Lattner { 61469b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 61569b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 61669b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 61769b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 61869b582faSGreg Clayton { 619d9e416c0SGreg Clayton VariableList *variable_list = frame->GetVariableList(true); 62072eff18aSGreg Clayton 621d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 62272eff18aSGreg Clayton 62372eff18aSGreg Clayton const bool can_create = true; 62472eff18aSGreg Clayton const bool get_parent_variables = true; 62572eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 62672eff18aSGreg Clayton 62772eff18aSGreg Clayton if (sc.block && sc.block->AppendVariables (can_create, 62872eff18aSGreg Clayton get_parent_variables, 62972eff18aSGreg Clayton stop_if_block_is_inlined_function, 630e85d9cb8SJohnny Chen variable_list)) 631beae523aSJohnny Chen { 63269b582faSGreg Clayton ConstString const_name(name); 633e85d9cb8SJohnny Chen const uint32_t num_variables = variable_list->GetSize(); 63472eff18aSGreg Clayton for (uint32_t i = 0; i < num_variables; ++i) 63530fdc8d8SChris Lattner { 63669b582faSGreg Clayton VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 63769b582faSGreg Clayton if (variable_sp && 63869b582faSGreg Clayton variable_sp->GetScope() == value_type && 63969b582faSGreg Clayton variable_sp->GetName() == const_name) 640beae523aSJohnny Chen { 641d9e416c0SGreg Clayton value_sp = frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic); 64281e871edSGreg Clayton sb_value.SetSP (value_sp); 643beae523aSJohnny Chen break; 644beae523aSJohnny Chen } 64530fdc8d8SChris Lattner } 64630fdc8d8SChris Lattner } 64730fdc8d8SChris Lattner } 64869b582faSGreg Clayton break; 64969b582faSGreg Clayton 65069b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 65169b582faSGreg Clayton { 652d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 65369b582faSGreg Clayton if (reg_ctx) 65469b582faSGreg Clayton { 65569b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 65669b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 65769b582faSGreg Clayton { 65869b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 65969b582faSGreg Clayton if (reg_info && 66069b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 66169b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 66269b582faSGreg Clayton { 663d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 66481e871edSGreg Clayton sb_value.SetSP (value_sp); 66581e871edSGreg Clayton break; 66669b582faSGreg Clayton } 66769b582faSGreg Clayton } 66869b582faSGreg Clayton } 66969b582faSGreg Clayton } 67069b582faSGreg Clayton break; 67169b582faSGreg Clayton 67269b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 67369b582faSGreg Clayton { 674d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 67569b582faSGreg Clayton if (reg_ctx) 67669b582faSGreg Clayton { 67769b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 67869b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 67969b582faSGreg Clayton { 68069b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 68169b582faSGreg Clayton if (reg_set && 68269b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 68369b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 68469b582faSGreg Clayton { 685d9e416c0SGreg Clayton value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx); 68681e871edSGreg Clayton sb_value.SetSP (value_sp); 68781e871edSGreg Clayton break; 68869b582faSGreg Clayton } 68969b582faSGreg Clayton } 69069b582faSGreg Clayton } 69169b582faSGreg Clayton } 69269b582faSGreg Clayton break; 69369b582faSGreg Clayton 69469b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 69569b582faSGreg Clayton { 69669b582faSGreg Clayton ConstString const_name(name); 697d9e416c0SGreg Clayton ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name)); 69869b582faSGreg Clayton if (expr_var_sp) 69981e871edSGreg Clayton { 70081e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 70181e871edSGreg Clayton sb_value.SetSP (value_sp); 70281e871edSGreg Clayton } 70369b582faSGreg Clayton } 70469b582faSGreg Clayton break; 70569b582faSGreg Clayton 70669b582faSGreg Clayton default: 70769b582faSGreg Clayton break; 70869b582faSGreg Clayton } 709beae523aSJohnny Chen } 710dde9cff3SCaroline Tice 71169b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7124838131bSGreg Clayton if (log) 71369b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 714d9e416c0SGreg Clayton frame, name, value_type, value_sp.get()); 7154838131bSGreg Clayton 7164838131bSGreg Clayton 717dde9cff3SCaroline Tice return sb_value; 718dde9cff3SCaroline Tice } 719dde9cff3SCaroline Tice 72030fdc8d8SChris Lattner bool 721*35e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const 722*35e2ab60SJohnny Chen { 723*35e2ab60SJohnny Chen lldb::StackFrameSP this_sp = GetFrameSP(); 724*35e2ab60SJohnny Chen lldb::StackFrameSP that_sp = that.GetFrameSP(); 725*35e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 726*35e2ab60SJohnny Chen } 727*35e2ab60SJohnny Chen 728*35e2ab60SJohnny Chen bool 72930fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 73030fdc8d8SChris Lattner { 731*35e2ab60SJohnny Chen return IsEqual(rhs); 73230fdc8d8SChris Lattner } 73330fdc8d8SChris Lattner 73430fdc8d8SChris Lattner bool 73530fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 73630fdc8d8SChris Lattner { 737*35e2ab60SJohnny Chen return !IsEqual(rhs); 738481cef25SGreg Clayton } 73930fdc8d8SChris Lattner 74030fdc8d8SChris Lattner SBThread 74130fdc8d8SChris Lattner SBFrame::GetThread () const 74230fdc8d8SChris Lattner { 74369b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 744ceb6b139SCaroline Tice 745d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 746d9e416c0SGreg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 747d9e416c0SGreg Clayton SBThread sb_thread (thread_sp); 748ceb6b139SCaroline Tice 749ceb6b139SCaroline Tice if (log) 750750cd175SCaroline Tice { 751750cd175SCaroline Tice SBStream sstr; 752750cd175SCaroline Tice sb_thread.GetDescription (sstr); 753d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", 754d9e416c0SGreg Clayton exe_ctx.GetFramePtr(), 755d9e416c0SGreg Clayton thread_sp.get(), 756d9e416c0SGreg Clayton sstr.GetData()); 757750cd175SCaroline Tice } 758ceb6b139SCaroline Tice 75930fdc8d8SChris Lattner return sb_thread; 76030fdc8d8SChris Lattner } 76130fdc8d8SChris Lattner 76230fdc8d8SChris Lattner const char * 76330fdc8d8SChris Lattner SBFrame::Disassemble () const 76430fdc8d8SChris Lattner { 7654838131bSGreg Clayton const char *disassembly = NULL; 766d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 767d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 768d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 769d9e416c0SGreg Clayton if (frame && target) 770af67cecdSGreg Clayton { 771d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 772d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 773af67cecdSGreg Clayton } 77469b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7754838131bSGreg Clayton 7764838131bSGreg Clayton if (log) 777d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly); 7784838131bSGreg Clayton 7794838131bSGreg Clayton return disassembly; 78030fdc8d8SChris Lattner } 78130fdc8d8SChris Lattner 78230fdc8d8SChris Lattner 78330fdc8d8SChris Lattner SBValueList 78430fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 78530fdc8d8SChris Lattner bool locals, 78630fdc8d8SChris Lattner bool statics, 78730fdc8d8SChris Lattner bool in_scope_only) 78830fdc8d8SChris Lattner { 789316d498bSGreg Clayton SBValueList value_list; 790d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 791d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 792d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 793d9e416c0SGreg Clayton if (frame && target) 794316d498bSGreg Clayton { 795d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 796316d498bSGreg Clayton value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic); 797316d498bSGreg Clayton } 798316d498bSGreg Clayton return value_list; 79978a685aaSJim Ingham } 80078a685aaSJim Ingham 80178a685aaSJim Ingham SBValueList 80278a685aaSJim Ingham SBFrame::GetVariables (bool arguments, 80378a685aaSJim Ingham bool locals, 80478a685aaSJim Ingham bool statics, 80578a685aaSJim Ingham bool in_scope_only, 8062837b766SJim Ingham lldb::DynamicValueType use_dynamic) 80778a685aaSJim Ingham { 80869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 809ceb6b139SCaroline Tice 810b9556accSGreg Clayton SBValueList value_list; 811d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 812d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 813d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 814b9556accSGreg Clayton 815ceb6b139SCaroline Tice if (log) 8164838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 817d9e416c0SGreg Clayton frame, 8184838131bSGreg Clayton arguments, 8194838131bSGreg Clayton locals, 8204838131bSGreg Clayton statics, 8214838131bSGreg Clayton in_scope_only); 822ceb6b139SCaroline Tice 823d9e416c0SGreg Clayton if (frame && target) 82430fdc8d8SChris Lattner { 825af67cecdSGreg Clayton 82630fdc8d8SChris Lattner size_t i; 827af67cecdSGreg Clayton VariableList *variable_list = NULL; 828af67cecdSGreg Clayton // Scope for locker 829af67cecdSGreg Clayton { 830d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 831d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 832af67cecdSGreg Clayton } 83330fdc8d8SChris Lattner if (variable_list) 83430fdc8d8SChris Lattner { 83530fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 83630fdc8d8SChris Lattner if (num_variables) 83730fdc8d8SChris Lattner { 83830fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 83930fdc8d8SChris Lattner { 84030fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 84130fdc8d8SChris Lattner if (variable_sp) 84230fdc8d8SChris Lattner { 84330fdc8d8SChris Lattner bool add_variable = false; 84430fdc8d8SChris Lattner switch (variable_sp->GetScope()) 84530fdc8d8SChris Lattner { 84630fdc8d8SChris Lattner case eValueTypeVariableGlobal: 84730fdc8d8SChris Lattner case eValueTypeVariableStatic: 84830fdc8d8SChris Lattner add_variable = statics; 84930fdc8d8SChris Lattner break; 85030fdc8d8SChris Lattner 85130fdc8d8SChris Lattner case eValueTypeVariableArgument: 85230fdc8d8SChris Lattner add_variable = arguments; 85330fdc8d8SChris Lattner break; 85430fdc8d8SChris Lattner 85530fdc8d8SChris Lattner case eValueTypeVariableLocal: 85630fdc8d8SChris Lattner add_variable = locals; 85730fdc8d8SChris Lattner break; 858c982c768SGreg Clayton 859c982c768SGreg Clayton default: 860c982c768SGreg Clayton break; 86130fdc8d8SChris Lattner } 86230fdc8d8SChris Lattner if (add_variable) 86330fdc8d8SChris Lattner { 864d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 86530fdc8d8SChris Lattner continue; 86630fdc8d8SChris Lattner 867d9e416c0SGreg Clayton value_list.Append(frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic)); 86830fdc8d8SChris Lattner } 86930fdc8d8SChris Lattner } 87030fdc8d8SChris Lattner } 87130fdc8d8SChris Lattner } 87230fdc8d8SChris Lattner } 87330fdc8d8SChris Lattner } 874ceb6b139SCaroline Tice 875ceb6b139SCaroline Tice if (log) 876ceb6b139SCaroline Tice { 877d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame, 878750cd175SCaroline Tice value_list.get()); 879ceb6b139SCaroline Tice } 880ceb6b139SCaroline Tice 88130fdc8d8SChris Lattner return value_list; 88230fdc8d8SChris Lattner } 88330fdc8d8SChris Lattner 88469b582faSGreg Clayton SBValueList 88530fdc8d8SChris Lattner SBFrame::GetRegisters () 88630fdc8d8SChris Lattner { 88769b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 888ceb6b139SCaroline Tice 88930fdc8d8SChris Lattner SBValueList value_list; 890d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 891d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 892d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 893d9e416c0SGreg Clayton if (frame && target) 89430fdc8d8SChris Lattner { 895d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 896d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 89730fdc8d8SChris Lattner if (reg_ctx) 89830fdc8d8SChris Lattner { 89930fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 90030fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 90130fdc8d8SChris Lattner { 902d9e416c0SGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); 90330fdc8d8SChris Lattner } 90430fdc8d8SChris Lattner } 90530fdc8d8SChris Lattner } 906ceb6b139SCaroline Tice 907ceb6b139SCaroline Tice if (log) 908d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::Registers () => SBValueList(%p)", frame, value_list.get()); 909ceb6b139SCaroline Tice 91030fdc8d8SChris Lattner return value_list; 91130fdc8d8SChris Lattner } 91230fdc8d8SChris Lattner 913dde9cff3SCaroline Tice bool 914dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 915dde9cff3SCaroline Tice { 916da7bc7d0SGreg Clayton Stream &strm = description.ref(); 917da7bc7d0SGreg Clayton 918d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 919d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 920d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 921d9e416c0SGreg Clayton if (frame && target) 922dde9cff3SCaroline Tice { 923d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 924d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 925dde9cff3SCaroline Tice } 926dde9cff3SCaroline Tice else 927da7bc7d0SGreg Clayton strm.PutCString ("No value"); 928dde9cff3SCaroline Tice 929dde9cff3SCaroline Tice return true; 930dde9cff3SCaroline Tice } 9311d3afba3SGreg Clayton 93269b582faSGreg Clayton SBValue 9331d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 9341d3afba3SGreg Clayton { 935316d498bSGreg Clayton SBValue result; 936d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 937d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 938d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 939d9e416c0SGreg Clayton if (frame && target) 940316d498bSGreg Clayton { 941d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 942316d498bSGreg Clayton result = EvaluateExpression (expr, use_dynamic); 943316d498bSGreg Clayton } 944316d498bSGreg Clayton return result; 94578a685aaSJim Ingham } 94678a685aaSJim Ingham 94778a685aaSJim Ingham SBValue 9482837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 94978a685aaSJim Ingham { 95069b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9514838131bSGreg Clayton 95269b582faSGreg Clayton LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 953a162ebafSSean Callanan 95425f3a3cdSJohnny Chen ExecutionResults exe_results; 95569b582faSGreg Clayton SBValue expr_result; 95681e871edSGreg Clayton ValueObjectSP expr_value_sp; 9574838131bSGreg Clayton 958d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 959d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 960d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 961b9556accSGreg Clayton if (log) 962d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame, expr); 963b9556accSGreg Clayton 964d9e416c0SGreg Clayton if (frame && target) 9651d3afba3SGreg Clayton { 966d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 967316d498bSGreg Clayton 9681ba7c4d0SGreg Clayton 9691ba7c4d0SGreg Clayton StreamString frame_description; 970d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 9711ba7c4d0SGreg Clayton 9721ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 9731ba7c4d0SGreg Clayton expr, fetch_dynamic_value, frame_description.GetString().c_str()); 9741ba7c4d0SGreg Clayton 97520bb3aa5SSean Callanan const bool coerce_to_id = false; 9768b2fe6dcSGreg Clayton const bool unwind_on_error = true; 97792adcac9SSean Callanan const bool keep_in_memory = false; 978322f529bSSean Callanan 979d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 980d9e416c0SGreg Clayton frame, 9813bfdaa2aSSean Callanan eExecutionPolicyOnlyWhenNeeded, 98220bb3aa5SSean Callanan coerce_to_id, 98378a685aaSJim Ingham unwind_on_error, 98478a685aaSJim Ingham keep_in_memory, 9852837b766SJim Ingham fetch_dynamic_value, 98681e871edSGreg Clayton expr_value_sp); 98781e871edSGreg Clayton expr_result.SetSP(expr_value_sp); 988f49e65aeSGreg Clayton Host::SetCrashDescription (NULL); 9891d3afba3SGreg Clayton } 9904838131bSGreg Clayton 991cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 992a162ebafSSean Callanan if (expr_log) 99378a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 994fe42ac4dSGreg Clayton expr_result.GetValue(), 995fe42ac4dSGreg Clayton expr_result.GetSummary()); 996a162ebafSSean Callanan 9974838131bSGreg Clayton if (log) 998d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 999d9e416c0SGreg Clayton frame, 100078a685aaSJim Ingham expr, 100181e871edSGreg Clayton expr_value_sp.get(), 100225f3a3cdSJohnny Chen exe_results); 1003cf7e2dc0SJason Molenda #endif 10044838131bSGreg Clayton 1005cfd1acedSGreg Clayton return expr_result; 10061d3afba3SGreg Clayton } 1007316d498bSGreg Clayton 1008316d498bSGreg Clayton bool 1009316d498bSGreg Clayton SBFrame::IsInlined() 1010316d498bSGreg Clayton { 1011d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 1012d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1013d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1014d9e416c0SGreg Clayton if (frame && target) 1015316d498bSGreg Clayton { 1016d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1017316d498bSGreg Clayton if (block) 1018316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 1019316d498bSGreg Clayton } 1020316d498bSGreg Clayton return false; 1021316d498bSGreg Clayton } 1022316d498bSGreg Clayton 1023316d498bSGreg Clayton const char * 1024316d498bSGreg Clayton SBFrame::GetFunctionName() 1025316d498bSGreg Clayton { 1026316d498bSGreg Clayton const char *name = NULL; 1027d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 1028d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1029d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1030d9e416c0SGreg Clayton if (frame && target) 1031316d498bSGreg Clayton { 1032d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1033316d498bSGreg Clayton if (sc.block) 1034316d498bSGreg Clayton { 1035316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1036316d498bSGreg Clayton if (inlined_block) 1037316d498bSGreg Clayton { 1038316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1039316d498bSGreg Clayton name = inlined_info->GetName().AsCString(); 1040316d498bSGreg Clayton } 1041316d498bSGreg Clayton } 1042316d498bSGreg Clayton 1043316d498bSGreg Clayton if (name == NULL) 1044316d498bSGreg Clayton { 1045316d498bSGreg Clayton if (sc.function) 1046316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1047316d498bSGreg Clayton } 1048316d498bSGreg Clayton 1049316d498bSGreg Clayton if (name == NULL) 1050316d498bSGreg Clayton { 1051316d498bSGreg Clayton if (sc.symbol) 1052316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1053316d498bSGreg Clayton } 1054316d498bSGreg Clayton } 1055316d498bSGreg Clayton return name; 1056316d498bSGreg Clayton } 1057316d498bSGreg Clayton 1058