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 72130fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 72230fdc8d8SChris Lattner { 723b9556accSGreg Clayton return GetFrameSP().get() == rhs.GetFrameSP().get(); 72430fdc8d8SChris Lattner } 72530fdc8d8SChris Lattner 72630fdc8d8SChris Lattner bool 72730fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 72830fdc8d8SChris Lattner { 729b9556accSGreg Clayton return GetFrameSP().get() != rhs.GetFrameSP().get(); 730481cef25SGreg Clayton } 73130fdc8d8SChris Lattner 73230fdc8d8SChris Lattner SBThread 73330fdc8d8SChris Lattner SBFrame::GetThread () const 73430fdc8d8SChris Lattner { 73569b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 736ceb6b139SCaroline Tice 737d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 738d9e416c0SGreg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 739d9e416c0SGreg Clayton SBThread sb_thread (thread_sp); 740ceb6b139SCaroline Tice 741ceb6b139SCaroline Tice if (log) 742750cd175SCaroline Tice { 743750cd175SCaroline Tice SBStream sstr; 744750cd175SCaroline Tice sb_thread.GetDescription (sstr); 745d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", 746d9e416c0SGreg Clayton exe_ctx.GetFramePtr(), 747d9e416c0SGreg Clayton thread_sp.get(), 748d9e416c0SGreg Clayton sstr.GetData()); 749750cd175SCaroline Tice } 750ceb6b139SCaroline Tice 75130fdc8d8SChris Lattner return sb_thread; 75230fdc8d8SChris Lattner } 75330fdc8d8SChris Lattner 75430fdc8d8SChris Lattner const char * 75530fdc8d8SChris Lattner SBFrame::Disassemble () const 75630fdc8d8SChris Lattner { 7574838131bSGreg Clayton const char *disassembly = NULL; 758d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 759d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 760d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 761d9e416c0SGreg Clayton if (frame && target) 762af67cecdSGreg Clayton { 763d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 764d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 765af67cecdSGreg Clayton } 76669b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7674838131bSGreg Clayton 7684838131bSGreg Clayton if (log) 769d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly); 7704838131bSGreg Clayton 7714838131bSGreg Clayton return disassembly; 77230fdc8d8SChris Lattner } 77330fdc8d8SChris Lattner 77430fdc8d8SChris Lattner 77530fdc8d8SChris Lattner SBValueList 77630fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 77730fdc8d8SChris Lattner bool locals, 77830fdc8d8SChris Lattner bool statics, 77930fdc8d8SChris Lattner bool in_scope_only) 78030fdc8d8SChris Lattner { 781316d498bSGreg Clayton SBValueList value_list; 782d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 783d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 784d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 785d9e416c0SGreg Clayton if (frame && target) 786316d498bSGreg Clayton { 787d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 788316d498bSGreg Clayton value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic); 789316d498bSGreg Clayton } 790316d498bSGreg Clayton return value_list; 79178a685aaSJim Ingham } 79278a685aaSJim Ingham 79378a685aaSJim Ingham SBValueList 79478a685aaSJim Ingham SBFrame::GetVariables (bool arguments, 79578a685aaSJim Ingham bool locals, 79678a685aaSJim Ingham bool statics, 79778a685aaSJim Ingham bool in_scope_only, 7982837b766SJim Ingham lldb::DynamicValueType use_dynamic) 79978a685aaSJim Ingham { 80069b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 801ceb6b139SCaroline Tice 802b9556accSGreg Clayton SBValueList value_list; 803d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 804d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 805d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 806b9556accSGreg Clayton 807ceb6b139SCaroline Tice if (log) 8084838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 809d9e416c0SGreg Clayton frame, 8104838131bSGreg Clayton arguments, 8114838131bSGreg Clayton locals, 8124838131bSGreg Clayton statics, 8134838131bSGreg Clayton in_scope_only); 814ceb6b139SCaroline Tice 815d9e416c0SGreg Clayton if (frame && target) 81630fdc8d8SChris Lattner { 817af67cecdSGreg Clayton 81830fdc8d8SChris Lattner size_t i; 819af67cecdSGreg Clayton VariableList *variable_list = NULL; 820af67cecdSGreg Clayton // Scope for locker 821af67cecdSGreg Clayton { 822d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 823d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 824af67cecdSGreg Clayton } 82530fdc8d8SChris Lattner if (variable_list) 82630fdc8d8SChris Lattner { 82730fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 82830fdc8d8SChris Lattner if (num_variables) 82930fdc8d8SChris Lattner { 83030fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 83130fdc8d8SChris Lattner { 83230fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 83330fdc8d8SChris Lattner if (variable_sp) 83430fdc8d8SChris Lattner { 83530fdc8d8SChris Lattner bool add_variable = false; 83630fdc8d8SChris Lattner switch (variable_sp->GetScope()) 83730fdc8d8SChris Lattner { 83830fdc8d8SChris Lattner case eValueTypeVariableGlobal: 83930fdc8d8SChris Lattner case eValueTypeVariableStatic: 84030fdc8d8SChris Lattner add_variable = statics; 84130fdc8d8SChris Lattner break; 84230fdc8d8SChris Lattner 84330fdc8d8SChris Lattner case eValueTypeVariableArgument: 84430fdc8d8SChris Lattner add_variable = arguments; 84530fdc8d8SChris Lattner break; 84630fdc8d8SChris Lattner 84730fdc8d8SChris Lattner case eValueTypeVariableLocal: 84830fdc8d8SChris Lattner add_variable = locals; 84930fdc8d8SChris Lattner break; 850c982c768SGreg Clayton 851c982c768SGreg Clayton default: 852c982c768SGreg Clayton break; 85330fdc8d8SChris Lattner } 85430fdc8d8SChris Lattner if (add_variable) 85530fdc8d8SChris Lattner { 856d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 85730fdc8d8SChris Lattner continue; 85830fdc8d8SChris Lattner 859d9e416c0SGreg Clayton value_list.Append(frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic)); 86030fdc8d8SChris Lattner } 86130fdc8d8SChris Lattner } 86230fdc8d8SChris Lattner } 86330fdc8d8SChris Lattner } 86430fdc8d8SChris Lattner } 86530fdc8d8SChris Lattner } 866ceb6b139SCaroline Tice 867ceb6b139SCaroline Tice if (log) 868ceb6b139SCaroline Tice { 869d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame, 870750cd175SCaroline Tice value_list.get()); 871ceb6b139SCaroline Tice } 872ceb6b139SCaroline Tice 87330fdc8d8SChris Lattner return value_list; 87430fdc8d8SChris Lattner } 87530fdc8d8SChris Lattner 87669b582faSGreg Clayton SBValueList 87730fdc8d8SChris Lattner SBFrame::GetRegisters () 87830fdc8d8SChris Lattner { 87969b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 880ceb6b139SCaroline Tice 88130fdc8d8SChris Lattner SBValueList value_list; 882d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 883d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 884d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 885d9e416c0SGreg Clayton if (frame && target) 88630fdc8d8SChris Lattner { 887d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 888d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 88930fdc8d8SChris Lattner if (reg_ctx) 89030fdc8d8SChris Lattner { 89130fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 89230fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 89330fdc8d8SChris Lattner { 894d9e416c0SGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); 89530fdc8d8SChris Lattner } 89630fdc8d8SChris Lattner } 89730fdc8d8SChris Lattner } 898ceb6b139SCaroline Tice 899ceb6b139SCaroline Tice if (log) 900d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::Registers () => SBValueList(%p)", frame, value_list.get()); 901ceb6b139SCaroline Tice 90230fdc8d8SChris Lattner return value_list; 90330fdc8d8SChris Lattner } 90430fdc8d8SChris Lattner 905dde9cff3SCaroline Tice bool 906dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 907dde9cff3SCaroline Tice { 908da7bc7d0SGreg Clayton Stream &strm = description.ref(); 909da7bc7d0SGreg Clayton 910d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 911d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 912d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 913d9e416c0SGreg Clayton if (frame && target) 914dde9cff3SCaroline Tice { 915d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 916d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 917dde9cff3SCaroline Tice } 918dde9cff3SCaroline Tice else 919da7bc7d0SGreg Clayton strm.PutCString ("No value"); 920dde9cff3SCaroline Tice 921dde9cff3SCaroline Tice return true; 922dde9cff3SCaroline Tice } 9231d3afba3SGreg Clayton 92469b582faSGreg Clayton SBValue 9251d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 9261d3afba3SGreg Clayton { 927316d498bSGreg Clayton SBValue result; 928d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 929d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 930d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 931d9e416c0SGreg Clayton if (frame && target) 932316d498bSGreg Clayton { 933d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 934316d498bSGreg Clayton result = EvaluateExpression (expr, use_dynamic); 935316d498bSGreg Clayton } 936316d498bSGreg Clayton return result; 93778a685aaSJim Ingham } 93878a685aaSJim Ingham 93978a685aaSJim Ingham SBValue 9402837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 94178a685aaSJim Ingham { 94269b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 9434838131bSGreg Clayton 94469b582faSGreg Clayton LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 945a162ebafSSean Callanan 94625f3a3cdSJohnny Chen ExecutionResults exe_results; 94769b582faSGreg Clayton SBValue expr_result; 94881e871edSGreg Clayton ValueObjectSP expr_value_sp; 9494838131bSGreg Clayton 950d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 951d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 952d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 953b9556accSGreg Clayton if (log) 954d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame, expr); 955b9556accSGreg Clayton 956d9e416c0SGreg Clayton if (frame && target) 9571d3afba3SGreg Clayton { 958d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 959316d498bSGreg Clayton 9601ba7c4d0SGreg Clayton 9611ba7c4d0SGreg Clayton StreamString frame_description; 962d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 9631ba7c4d0SGreg Clayton 9641ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 9651ba7c4d0SGreg Clayton expr, fetch_dynamic_value, frame_description.GetString().c_str()); 9661ba7c4d0SGreg Clayton 96720bb3aa5SSean Callanan const bool coerce_to_id = false; 9688b2fe6dcSGreg Clayton const bool unwind_on_error = true; 96992adcac9SSean Callanan const bool keep_in_memory = false; 970322f529bSSean Callanan 971d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 972d9e416c0SGreg Clayton frame, 9733bfdaa2aSSean Callanan eExecutionPolicyOnlyWhenNeeded, 97420bb3aa5SSean Callanan coerce_to_id, 97578a685aaSJim Ingham unwind_on_error, 97678a685aaSJim Ingham keep_in_memory, 9772837b766SJim Ingham fetch_dynamic_value, 97881e871edSGreg Clayton expr_value_sp); 97981e871edSGreg Clayton expr_result.SetSP(expr_value_sp); 980f49e65aeSGreg Clayton Host::SetCrashDescription (NULL); 9811d3afba3SGreg Clayton } 9824838131bSGreg Clayton 983*cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 984a162ebafSSean Callanan if (expr_log) 98578a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 986fe42ac4dSGreg Clayton expr_result.GetValue(), 987fe42ac4dSGreg Clayton expr_result.GetSummary()); 988a162ebafSSean Callanan 9894838131bSGreg Clayton if (log) 990d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 991d9e416c0SGreg Clayton frame, 99278a685aaSJim Ingham expr, 99381e871edSGreg Clayton expr_value_sp.get(), 99425f3a3cdSJohnny Chen exe_results); 995*cf7e2dc0SJason Molenda #endif 9964838131bSGreg Clayton 997cfd1acedSGreg Clayton return expr_result; 9981d3afba3SGreg Clayton } 999316d498bSGreg Clayton 1000316d498bSGreg Clayton bool 1001316d498bSGreg Clayton SBFrame::IsInlined() 1002316d498bSGreg Clayton { 1003d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 1004d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1005d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1006d9e416c0SGreg Clayton if (frame && target) 1007316d498bSGreg Clayton { 1008d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1009316d498bSGreg Clayton if (block) 1010316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 1011316d498bSGreg Clayton } 1012316d498bSGreg Clayton return false; 1013316d498bSGreg Clayton } 1014316d498bSGreg Clayton 1015316d498bSGreg Clayton const char * 1016316d498bSGreg Clayton SBFrame::GetFunctionName() 1017316d498bSGreg Clayton { 1018316d498bSGreg Clayton const char *name = NULL; 1019d9e416c0SGreg Clayton ExecutionContext exe_ctx(GetFrameSP()); 1020d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1021d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1022d9e416c0SGreg Clayton if (frame && target) 1023316d498bSGreg Clayton { 1024d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1025316d498bSGreg Clayton if (sc.block) 1026316d498bSGreg Clayton { 1027316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1028316d498bSGreg Clayton if (inlined_block) 1029316d498bSGreg Clayton { 1030316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1031316d498bSGreg Clayton name = inlined_info->GetName().AsCString(); 1032316d498bSGreg Clayton } 1033316d498bSGreg Clayton } 1034316d498bSGreg Clayton 1035316d498bSGreg Clayton if (name == NULL) 1036316d498bSGreg Clayton { 1037316d498bSGreg Clayton if (sc.function) 1038316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1039316d498bSGreg Clayton } 1040316d498bSGreg Clayton 1041316d498bSGreg Clayton if (name == NULL) 1042316d498bSGreg Clayton { 1043316d498bSGreg Clayton if (sc.symbol) 1044316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1045316d498bSGreg Clayton } 1046316d498bSGreg Clayton } 1047316d498bSGreg Clayton return name; 1048316d498bSGreg Clayton } 1049316d498bSGreg Clayton 1050