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 { 57b9556accSGreg Clayton m_thread_wp = frame_sp->GetThread().shared_from_this(); 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())); 84b9556accSGreg Clayton if (tmp_frame_sp.get() == frame_sp.get()) 85b9556accSGreg Clayton return frame_sp; 86b9556accSGreg Clayton } 87b9556accSGreg Clayton // The original stack frame might have gone away, 88b9556accSGreg Clayton // we need to check for the stac 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; 101b9556accSGreg Clayton m_thread_wp = frame_sp->GetThread().shared_from_this(); 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; 206b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 207b9556accSGreg Clayton if (frame_sp) 208af67cecdSGreg Clayton { 209b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 210b9556accSGreg Clayton sb_sym_ctx.SetSymbolContext(&frame_sp->GetSymbolContext (resolve_scope)); 211af67cecdSGreg Clayton } 212ceb6b139SCaroline Tice 21369b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 214ceb6b139SCaroline Tice if (log) 2154838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)", 216b9556accSGreg Clayton frame_sp.get(), resolve_scope, sb_sym_ctx.get()); 217ceb6b139SCaroline Tice 21830fdc8d8SChris Lattner return sb_sym_ctx; 21930fdc8d8SChris Lattner } 22030fdc8d8SChris Lattner 22130fdc8d8SChris Lattner SBModule 22230fdc8d8SChris Lattner SBFrame::GetModule () const 22330fdc8d8SChris Lattner { 22472eff18aSGreg Clayton SBModule sb_module; 225*acdbe816SGreg Clayton ModuleSP module_sp; 226b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 227b9556accSGreg Clayton if (frame_sp) 228af67cecdSGreg Clayton { 229b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 230*acdbe816SGreg Clayton module_sp = frame_sp->GetSymbolContext (eSymbolContextModule).module_sp; 231*acdbe816SGreg Clayton sb_module.SetSP (module_sp); 232af67cecdSGreg Clayton } 23372eff18aSGreg Clayton 23469b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2354838131bSGreg Clayton if (log) 2364838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)", 237*acdbe816SGreg Clayton frame_sp.get(), module_sp.get()); 2384838131bSGreg Clayton 23930fdc8d8SChris Lattner return sb_module; 24030fdc8d8SChris Lattner } 24130fdc8d8SChris Lattner 24230fdc8d8SChris Lattner SBCompileUnit 24330fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 24430fdc8d8SChris Lattner { 24572eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 246b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 247b9556accSGreg Clayton if (frame_sp) 248af67cecdSGreg Clayton { 249b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 250b9556accSGreg Clayton sb_comp_unit.reset (frame_sp->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 251af67cecdSGreg Clayton } 25269b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 253ceb6b139SCaroline Tice if (log) 2544838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBCompileUnit(%p)", 255b9556accSGreg Clayton frame_sp.get(), sb_comp_unit.get()); 256ceb6b139SCaroline Tice 25730fdc8d8SChris Lattner return sb_comp_unit; 25830fdc8d8SChris Lattner } 25930fdc8d8SChris Lattner 26030fdc8d8SChris Lattner SBFunction 26130fdc8d8SChris Lattner SBFrame::GetFunction () const 26230fdc8d8SChris Lattner { 26372eff18aSGreg Clayton SBFunction sb_function; 264b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 265b9556accSGreg Clayton if (frame_sp) 266af67cecdSGreg Clayton { 267b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 268b9556accSGreg Clayton sb_function.reset(frame_sp->GetSymbolContext (eSymbolContextFunction).function); 269af67cecdSGreg Clayton } 27069b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2714838131bSGreg Clayton if (log) 2724838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)", 273b9556accSGreg Clayton frame_sp.get(), sb_function.get()); 2744838131bSGreg Clayton 27530fdc8d8SChris Lattner return sb_function; 27630fdc8d8SChris Lattner } 27730fdc8d8SChris Lattner 2783b06557eSGreg Clayton SBSymbol 2793b06557eSGreg Clayton SBFrame::GetSymbol () const 2803b06557eSGreg Clayton { 28172eff18aSGreg Clayton SBSymbol sb_symbol; 282b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 283b9556accSGreg Clayton if (frame_sp) 284af67cecdSGreg Clayton { 285b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 286b9556accSGreg Clayton sb_symbol.reset(frame_sp->GetSymbolContext (eSymbolContextSymbol).symbol); 287af67cecdSGreg Clayton } 28869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2894838131bSGreg Clayton if (log) 2904838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 291b9556accSGreg Clayton frame_sp.get(), sb_symbol.get()); 2923b06557eSGreg Clayton return sb_symbol; 2933b06557eSGreg Clayton } 2943b06557eSGreg Clayton 29530fdc8d8SChris Lattner SBBlock 29630fdc8d8SChris Lattner SBFrame::GetBlock () const 29730fdc8d8SChris Lattner { 29872eff18aSGreg Clayton SBBlock sb_block; 299b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 300b9556accSGreg Clayton if (frame_sp) 301af67cecdSGreg Clayton { 302b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 303b9556accSGreg Clayton sb_block.reset (frame_sp->GetSymbolContext (eSymbolContextBlock).block); 304af67cecdSGreg Clayton } 30569b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3064838131bSGreg Clayton if (log) 3074838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)", 308b9556accSGreg Clayton frame_sp.get(), sb_block.get()); 30930fdc8d8SChris Lattner return sb_block; 31030fdc8d8SChris Lattner } 31130fdc8d8SChris Lattner 31295897c6aSGreg Clayton SBBlock 31395897c6aSGreg Clayton SBFrame::GetFrameBlock () const 31495897c6aSGreg Clayton { 31572eff18aSGreg Clayton SBBlock sb_block; 316b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 317b9556accSGreg Clayton if (frame_sp) 318af67cecdSGreg Clayton { 319b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 320b9556accSGreg Clayton sb_block.reset(frame_sp->GetFrameBlock ()); 321af67cecdSGreg Clayton } 32269b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3234838131bSGreg Clayton if (log) 3244838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 325b9556accSGreg Clayton frame_sp.get(), sb_block.get()); 32695897c6aSGreg Clayton return sb_block; 32795897c6aSGreg Clayton } 32895897c6aSGreg Clayton 32930fdc8d8SChris Lattner SBLineEntry 33030fdc8d8SChris Lattner SBFrame::GetLineEntry () const 33130fdc8d8SChris Lattner { 33272eff18aSGreg Clayton SBLineEntry sb_line_entry; 333b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 334b9556accSGreg Clayton if (frame_sp) 335af67cecdSGreg Clayton { 336b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 337b9556accSGreg Clayton sb_line_entry.SetLineEntry (frame_sp->GetSymbolContext (eSymbolContextLineEntry).line_entry); 338af67cecdSGreg Clayton } 33969b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3404838131bSGreg Clayton if (log) 3414838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 342b9556accSGreg Clayton frame_sp.get(), sb_line_entry.get()); 34330fdc8d8SChris Lattner return sb_line_entry; 34430fdc8d8SChris Lattner } 34530fdc8d8SChris Lattner 34630fdc8d8SChris Lattner uint32_t 34730fdc8d8SChris Lattner SBFrame::GetFrameID () const 34830fdc8d8SChris Lattner { 349b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 350b9556accSGreg Clayton 351b9556accSGreg Clayton 352b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 353b9556accSGreg Clayton if (frame_sp) 354b9556accSGreg Clayton frame_idx = frame_sp->GetFrameIndex (); 3554838131bSGreg Clayton 35669b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3574838131bSGreg Clayton if (log) 3584838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameID () => %u", 359b9556accSGreg Clayton frame_sp.get(), frame_idx); 3604838131bSGreg Clayton return frame_idx; 36130fdc8d8SChris Lattner } 36230fdc8d8SChris Lattner 36369b582faSGreg Clayton addr_t 36430fdc8d8SChris Lattner SBFrame::GetPC () const 36530fdc8d8SChris Lattner { 36669b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 367b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 368b9556accSGreg Clayton if (frame_sp) 369af67cecdSGreg Clayton { 370b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 371b9556accSGreg Clayton addr = frame_sp->GetFrameCodeAddress().GetOpcodeLoadAddress (&frame_sp->GetThread().GetProcess().GetTarget()); 372af67cecdSGreg Clayton } 373ceb6b139SCaroline Tice 37469b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 375ceb6b139SCaroline Tice if (log) 376b9556accSGreg Clayton log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", frame_sp.get(), addr); 377ceb6b139SCaroline Tice 378ceb6b139SCaroline Tice return addr; 37930fdc8d8SChris Lattner } 38030fdc8d8SChris Lattner 38130fdc8d8SChris Lattner bool 38269b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc) 38330fdc8d8SChris Lattner { 384ceb6b139SCaroline Tice bool ret_val = false; 385b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 386b9556accSGreg Clayton if (frame_sp) 387af67cecdSGreg Clayton { 388b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 389b9556accSGreg Clayton ret_val = frame_sp->GetRegisterContext()->SetPC (new_pc); 390af67cecdSGreg Clayton } 391ceb6b139SCaroline Tice 39269b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 393ceb6b139SCaroline Tice if (log) 3944838131bSGreg Clayton log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i", 395b9556accSGreg Clayton frame_sp.get(), new_pc, ret_val); 396ceb6b139SCaroline Tice 397ceb6b139SCaroline Tice return ret_val; 39830fdc8d8SChris Lattner } 39930fdc8d8SChris Lattner 40069b582faSGreg Clayton addr_t 40130fdc8d8SChris Lattner SBFrame::GetSP () const 40230fdc8d8SChris Lattner { 4034838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 404b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 405b9556accSGreg Clayton if (frame_sp) 406af67cecdSGreg Clayton { 407b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 408b9556accSGreg Clayton addr = frame_sp->GetRegisterContext()->GetSP(); 409af67cecdSGreg Clayton } 41069b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4114838131bSGreg Clayton if (log) 412b9556accSGreg Clayton log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", frame_sp.get(), addr); 4134838131bSGreg Clayton 4144838131bSGreg Clayton return addr; 41530fdc8d8SChris Lattner } 41630fdc8d8SChris Lattner 41730fdc8d8SChris Lattner 41869b582faSGreg Clayton addr_t 41930fdc8d8SChris Lattner SBFrame::GetFP () const 42030fdc8d8SChris Lattner { 42169b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 422b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 423b9556accSGreg Clayton if (frame_sp) 424af67cecdSGreg Clayton { 425b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 426b9556accSGreg Clayton addr = frame_sp->GetRegisterContext()->GetFP(); 427af67cecdSGreg Clayton } 428ceb6b139SCaroline Tice 42969b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 430ceb6b139SCaroline Tice if (log) 431b9556accSGreg Clayton log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", frame_sp.get(), addr); 432ceb6b139SCaroline Tice return addr; 43330fdc8d8SChris Lattner } 43430fdc8d8SChris Lattner 43530fdc8d8SChris Lattner 43630fdc8d8SChris Lattner SBAddress 43730fdc8d8SChris Lattner SBFrame::GetPCAddress () const 43830fdc8d8SChris Lattner { 43930fdc8d8SChris Lattner SBAddress sb_addr; 440b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 441b9556accSGreg Clayton if (frame_sp) 442af67cecdSGreg Clayton { 443b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 444b9556accSGreg Clayton sb_addr.SetAddress (&frame_sp->GetFrameCodeAddress()); 445af67cecdSGreg Clayton } 44669b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4474838131bSGreg Clayton if (log) 448b9556accSGreg Clayton log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame_sp.get(), sb_addr.get()); 44930fdc8d8SChris Lattner return sb_addr; 45030fdc8d8SChris Lattner } 45130fdc8d8SChris Lattner 45230fdc8d8SChris Lattner void 45330fdc8d8SChris Lattner SBFrame::Clear() 45430fdc8d8SChris Lattner { 4556611103cSGreg Clayton m_opaque_sp.reset(); 45630fdc8d8SChris Lattner } 45730fdc8d8SChris Lattner 45830fdc8d8SChris Lattner SBValue 45969b582faSGreg Clayton SBFrame::FindVariable (const char *name) 46030fdc8d8SChris Lattner { 461316d498bSGreg Clayton SBValue value; 462b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 463b9556accSGreg Clayton if (frame_sp) 464316d498bSGreg Clayton { 465b9556accSGreg Clayton lldb::DynamicValueType use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue(); 466316d498bSGreg Clayton value = FindVariable (name, use_dynamic); 467316d498bSGreg Clayton } 468316d498bSGreg Clayton return value; 46978a685aaSJim Ingham } 47078a685aaSJim Ingham 47178a685aaSJim Ingham SBValue 4722837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic) 47378a685aaSJim Ingham { 47469b582faSGreg Clayton VariableSP var_sp; 47558b59f95SJim Ingham SBValue sb_value; 476b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 477b9556accSGreg Clayton if (frame_sp && name && name[0]) 47830fdc8d8SChris Lattner { 47969b582faSGreg Clayton VariableList variable_list; 480b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 481b9556accSGreg Clayton SymbolContext sc (frame_sp->GetSymbolContext (eSymbolContextBlock)); 48230fdc8d8SChris Lattner 48372eff18aSGreg Clayton if (sc.block) 48430fdc8d8SChris Lattner { 48572eff18aSGreg Clayton const bool can_create = true; 48672eff18aSGreg Clayton const bool get_parent_variables = true; 48772eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 48872eff18aSGreg Clayton 48972eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 49072eff18aSGreg Clayton get_parent_variables, 49172eff18aSGreg Clayton stop_if_block_is_inlined_function, 49272eff18aSGreg Clayton &variable_list)) 49372eff18aSGreg Clayton { 49469b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 49530fdc8d8SChris Lattner } 49672eff18aSGreg Clayton } 49730fdc8d8SChris Lattner 4984838131bSGreg Clayton if (var_sp) 499b9556accSGreg Clayton *sb_value = ValueObjectSP (frame_sp->GetValueObjectForFrameVariable(var_sp, use_dynamic)); 5004838131bSGreg Clayton 501316d498bSGreg Clayton } 502316d498bSGreg Clayton 50369b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5044838131bSGreg Clayton if (log) 50569b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 506b9556accSGreg Clayton frame_sp.get(), name, sb_value.get()); 5074838131bSGreg Clayton 508dde9cff3SCaroline Tice return sb_value; 509dde9cff3SCaroline Tice } 510dde9cff3SCaroline Tice 51130fdc8d8SChris Lattner SBValue 51269b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 51330fdc8d8SChris Lattner { 514316d498bSGreg Clayton SBValue value; 515b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 516b9556accSGreg Clayton if (frame_sp) 517316d498bSGreg Clayton { 518b9556accSGreg Clayton lldb::DynamicValueType use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue(); 519316d498bSGreg Clayton value = FindValue (name, value_type, use_dynamic); 520316d498bSGreg Clayton } 521316d498bSGreg Clayton return value; 52278a685aaSJim Ingham } 52378a685aaSJim Ingham 52478a685aaSJim Ingham SBValue 5252837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) 52678a685aaSJim Ingham { 52769b582faSGreg Clayton SBValue sb_value; 528b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 529b9556accSGreg Clayton if (frame_sp && name && name[0]) 53030fdc8d8SChris Lattner { 531b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 53230fdc8d8SChris Lattner 53369b582faSGreg Clayton switch (value_type) 53430fdc8d8SChris Lattner { 53569b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 53669b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 53769b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 53869b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 53969b582faSGreg Clayton { 540b9556accSGreg Clayton VariableList *variable_list = frame_sp->GetVariableList(true); 54172eff18aSGreg Clayton 542b9556accSGreg Clayton SymbolContext sc (frame_sp->GetSymbolContext (eSymbolContextBlock)); 54372eff18aSGreg Clayton 54472eff18aSGreg Clayton const bool can_create = true; 54572eff18aSGreg Clayton const bool get_parent_variables = true; 54672eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 54772eff18aSGreg Clayton 54872eff18aSGreg Clayton if (sc.block && sc.block->AppendVariables (can_create, 54972eff18aSGreg Clayton get_parent_variables, 55072eff18aSGreg Clayton stop_if_block_is_inlined_function, 551e85d9cb8SJohnny Chen variable_list)) 552beae523aSJohnny Chen { 55369b582faSGreg Clayton ConstString const_name(name); 554e85d9cb8SJohnny Chen const uint32_t num_variables = variable_list->GetSize(); 55572eff18aSGreg Clayton for (uint32_t i = 0; i < num_variables; ++i) 55630fdc8d8SChris Lattner { 55769b582faSGreg Clayton VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 55869b582faSGreg Clayton if (variable_sp && 55969b582faSGreg Clayton variable_sp->GetScope() == value_type && 56069b582faSGreg Clayton variable_sp->GetName() == const_name) 561beae523aSJohnny Chen { 562b9556accSGreg Clayton *sb_value = ValueObjectSP (frame_sp->GetValueObjectForFrameVariable(variable_sp, 56378a685aaSJim Ingham use_dynamic)); 564beae523aSJohnny Chen break; 565beae523aSJohnny Chen } 56630fdc8d8SChris Lattner } 56730fdc8d8SChris Lattner } 56830fdc8d8SChris Lattner } 56969b582faSGreg Clayton break; 57069b582faSGreg Clayton 57169b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 57269b582faSGreg Clayton { 573b9556accSGreg Clayton RegisterContextSP reg_ctx (frame_sp->GetRegisterContext()); 57469b582faSGreg Clayton if (reg_ctx) 57569b582faSGreg Clayton { 57669b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 57769b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 57869b582faSGreg Clayton { 57969b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 58069b582faSGreg Clayton if (reg_info && 58169b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 58269b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 58369b582faSGreg Clayton { 584b9556accSGreg Clayton *sb_value = ValueObjectRegister::Create (frame_sp.get(), reg_ctx, reg_idx); 58569b582faSGreg Clayton } 58669b582faSGreg Clayton } 58769b582faSGreg Clayton } 58869b582faSGreg Clayton } 58969b582faSGreg Clayton break; 59069b582faSGreg Clayton 59169b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 59269b582faSGreg Clayton { 593b9556accSGreg Clayton RegisterContextSP reg_ctx (frame_sp->GetRegisterContext()); 59469b582faSGreg Clayton if (reg_ctx) 59569b582faSGreg Clayton { 59669b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 59769b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 59869b582faSGreg Clayton { 59969b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 60069b582faSGreg Clayton if (reg_set && 60169b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 60269b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 60369b582faSGreg Clayton { 604b9556accSGreg Clayton *sb_value = ValueObjectRegisterSet::Create (frame_sp.get(), reg_ctx, set_idx); 60569b582faSGreg Clayton } 60669b582faSGreg Clayton } 60769b582faSGreg Clayton } 60869b582faSGreg Clayton } 60969b582faSGreg Clayton break; 61069b582faSGreg Clayton 61169b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 61269b582faSGreg Clayton { 61369b582faSGreg Clayton ConstString const_name(name); 614b9556accSGreg Clayton ClangExpressionVariableSP expr_var_sp (frame_sp->GetThread().GetProcess().GetTarget().GetPersistentVariables().GetVariable (const_name)); 61569b582faSGreg Clayton if (expr_var_sp) 61669b582faSGreg Clayton *sb_value = expr_var_sp->GetValueObject(); 61769b582faSGreg Clayton } 61869b582faSGreg Clayton break; 61969b582faSGreg Clayton 62069b582faSGreg Clayton default: 62169b582faSGreg Clayton break; 62269b582faSGreg Clayton } 623beae523aSJohnny Chen } 624dde9cff3SCaroline Tice 62569b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6264838131bSGreg Clayton if (log) 62769b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 628b9556accSGreg Clayton frame_sp.get(), name, value_type, sb_value.get()); 6294838131bSGreg Clayton 6304838131bSGreg Clayton 631dde9cff3SCaroline Tice return sb_value; 632dde9cff3SCaroline Tice } 633dde9cff3SCaroline Tice 63430fdc8d8SChris Lattner bool 63530fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 63630fdc8d8SChris Lattner { 637b9556accSGreg Clayton return GetFrameSP().get() == rhs.GetFrameSP().get(); 63830fdc8d8SChris Lattner } 63930fdc8d8SChris Lattner 64030fdc8d8SChris Lattner bool 64130fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 64230fdc8d8SChris Lattner { 643b9556accSGreg Clayton return GetFrameSP().get() != rhs.GetFrameSP().get(); 644481cef25SGreg Clayton } 64530fdc8d8SChris Lattner 64630fdc8d8SChris Lattner SBThread 64730fdc8d8SChris Lattner SBFrame::GetThread () const 64830fdc8d8SChris Lattner { 64969b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 650ceb6b139SCaroline Tice 65172eff18aSGreg Clayton SBThread sb_thread; 65217a6ad05SGreg Clayton ThreadSP thread_sp; 653b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 654b9556accSGreg Clayton if (frame_sp) 655af67cecdSGreg Clayton { 656b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 657b9556accSGreg Clayton thread_sp = frame_sp->GetThread().shared_from_this(); 65817a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 659af67cecdSGreg Clayton } 660ceb6b139SCaroline Tice 661ceb6b139SCaroline Tice if (log) 662750cd175SCaroline Tice { 663750cd175SCaroline Tice SBStream sstr; 664750cd175SCaroline Tice sb_thread.GetDescription (sstr); 665b9556accSGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", frame_sp.get(), 66617a6ad05SGreg Clayton thread_sp.get(), sstr.GetData()); 667750cd175SCaroline Tice } 668ceb6b139SCaroline Tice 66930fdc8d8SChris Lattner return sb_thread; 67030fdc8d8SChris Lattner } 67130fdc8d8SChris Lattner 67230fdc8d8SChris Lattner const char * 67330fdc8d8SChris Lattner SBFrame::Disassemble () const 67430fdc8d8SChris Lattner { 6754838131bSGreg Clayton const char *disassembly = NULL; 676b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 677b9556accSGreg Clayton if (frame_sp) 678af67cecdSGreg Clayton { 679b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 680b9556accSGreg Clayton disassembly = frame_sp->Disassemble(); 681af67cecdSGreg Clayton } 68269b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6834838131bSGreg Clayton 6844838131bSGreg Clayton if (log) 685b9556accSGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => %s", frame_sp.get(), disassembly); 6864838131bSGreg Clayton 6874838131bSGreg Clayton return disassembly; 68830fdc8d8SChris Lattner } 68930fdc8d8SChris Lattner 69030fdc8d8SChris Lattner 69130fdc8d8SChris Lattner SBValueList 69230fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 69330fdc8d8SChris Lattner bool locals, 69430fdc8d8SChris Lattner bool statics, 69530fdc8d8SChris Lattner bool in_scope_only) 69630fdc8d8SChris Lattner { 697316d498bSGreg Clayton SBValueList value_list; 698b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 699b9556accSGreg Clayton if (frame_sp) 700316d498bSGreg Clayton { 701b9556accSGreg Clayton lldb::DynamicValueType use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue(); 702316d498bSGreg Clayton value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic); 703316d498bSGreg Clayton } 704316d498bSGreg Clayton return value_list; 70578a685aaSJim Ingham } 70678a685aaSJim Ingham 70778a685aaSJim Ingham SBValueList 70878a685aaSJim Ingham SBFrame::GetVariables (bool arguments, 70978a685aaSJim Ingham bool locals, 71078a685aaSJim Ingham bool statics, 71178a685aaSJim Ingham bool in_scope_only, 7122837b766SJim Ingham lldb::DynamicValueType use_dynamic) 71378a685aaSJim Ingham { 71469b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 715ceb6b139SCaroline Tice 716b9556accSGreg Clayton SBValueList value_list; 717b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 718b9556accSGreg Clayton 719ceb6b139SCaroline Tice if (log) 7204838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 721b9556accSGreg Clayton frame_sp.get(), 7224838131bSGreg Clayton arguments, 7234838131bSGreg Clayton locals, 7244838131bSGreg Clayton statics, 7254838131bSGreg Clayton in_scope_only); 726ceb6b139SCaroline Tice 727b9556accSGreg Clayton if (frame_sp) 72830fdc8d8SChris Lattner { 729af67cecdSGreg Clayton 73030fdc8d8SChris Lattner size_t i; 731af67cecdSGreg Clayton VariableList *variable_list = NULL; 732af67cecdSGreg Clayton // Scope for locker 733af67cecdSGreg Clayton { 734b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 735b9556accSGreg Clayton variable_list = frame_sp->GetVariableList(true); 736af67cecdSGreg Clayton } 73730fdc8d8SChris Lattner if (variable_list) 73830fdc8d8SChris Lattner { 73930fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 74030fdc8d8SChris Lattner if (num_variables) 74130fdc8d8SChris Lattner { 74230fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 74330fdc8d8SChris Lattner { 74430fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 74530fdc8d8SChris Lattner if (variable_sp) 74630fdc8d8SChris Lattner { 74730fdc8d8SChris Lattner bool add_variable = false; 74830fdc8d8SChris Lattner switch (variable_sp->GetScope()) 74930fdc8d8SChris Lattner { 75030fdc8d8SChris Lattner case eValueTypeVariableGlobal: 75130fdc8d8SChris Lattner case eValueTypeVariableStatic: 75230fdc8d8SChris Lattner add_variable = statics; 75330fdc8d8SChris Lattner break; 75430fdc8d8SChris Lattner 75530fdc8d8SChris Lattner case eValueTypeVariableArgument: 75630fdc8d8SChris Lattner add_variable = arguments; 75730fdc8d8SChris Lattner break; 75830fdc8d8SChris Lattner 75930fdc8d8SChris Lattner case eValueTypeVariableLocal: 76030fdc8d8SChris Lattner add_variable = locals; 76130fdc8d8SChris Lattner break; 762c982c768SGreg Clayton 763c982c768SGreg Clayton default: 764c982c768SGreg Clayton break; 76530fdc8d8SChris Lattner } 76630fdc8d8SChris Lattner if (add_variable) 76730fdc8d8SChris Lattner { 768b9556accSGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame_sp.get())) 76930fdc8d8SChris Lattner continue; 77030fdc8d8SChris Lattner 771b9556accSGreg Clayton value_list.Append(frame_sp->GetValueObjectForFrameVariable (variable_sp, use_dynamic)); 77230fdc8d8SChris Lattner } 77330fdc8d8SChris Lattner } 77430fdc8d8SChris Lattner } 77530fdc8d8SChris Lattner } 77630fdc8d8SChris Lattner } 77730fdc8d8SChris Lattner } 778ceb6b139SCaroline Tice 779ceb6b139SCaroline Tice if (log) 780ceb6b139SCaroline Tice { 781b9556accSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame_sp.get(), 782750cd175SCaroline Tice value_list.get()); 783ceb6b139SCaroline Tice } 784ceb6b139SCaroline Tice 78530fdc8d8SChris Lattner return value_list; 78630fdc8d8SChris Lattner } 78730fdc8d8SChris Lattner 78869b582faSGreg Clayton SBValueList 78930fdc8d8SChris Lattner SBFrame::GetRegisters () 79030fdc8d8SChris Lattner { 79169b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 792ceb6b139SCaroline Tice 79330fdc8d8SChris Lattner SBValueList value_list; 794b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 795b9556accSGreg Clayton if (frame_sp) 79630fdc8d8SChris Lattner { 797b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 798b9556accSGreg Clayton RegisterContextSP reg_ctx (frame_sp->GetRegisterContext()); 79930fdc8d8SChris Lattner if (reg_ctx) 80030fdc8d8SChris Lattner { 80130fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 80230fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 80330fdc8d8SChris Lattner { 804b9556accSGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame_sp.get(), reg_ctx, set_idx)); 80530fdc8d8SChris Lattner } 80630fdc8d8SChris Lattner } 80730fdc8d8SChris Lattner } 808ceb6b139SCaroline Tice 809ceb6b139SCaroline Tice if (log) 810b9556accSGreg Clayton log->Printf ("SBFrame(%p)::Registers () => SBValueList(%p)", frame_sp.get(), value_list.get()); 811ceb6b139SCaroline Tice 81230fdc8d8SChris Lattner return value_list; 81330fdc8d8SChris Lattner } 81430fdc8d8SChris Lattner 815dde9cff3SCaroline Tice bool 816dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 817dde9cff3SCaroline Tice { 818da7bc7d0SGreg Clayton Stream &strm = description.ref(); 819da7bc7d0SGreg Clayton 820b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 821b9556accSGreg Clayton if (frame_sp) 822dde9cff3SCaroline Tice { 823b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 824b9556accSGreg Clayton frame_sp->DumpUsingSettingsFormat (&strm); 825dde9cff3SCaroline Tice } 826dde9cff3SCaroline Tice else 827da7bc7d0SGreg Clayton strm.PutCString ("No value"); 828dde9cff3SCaroline Tice 829dde9cff3SCaroline Tice return true; 830dde9cff3SCaroline Tice } 8311d3afba3SGreg Clayton 83269b582faSGreg Clayton SBValue 8331d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 8341d3afba3SGreg Clayton { 835316d498bSGreg Clayton SBValue result; 836b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 837b9556accSGreg Clayton if (frame_sp) 838316d498bSGreg Clayton { 839b9556accSGreg Clayton lldb::DynamicValueType use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue(); 840316d498bSGreg Clayton result = EvaluateExpression (expr, use_dynamic); 841316d498bSGreg Clayton } 842316d498bSGreg Clayton return result; 84378a685aaSJim Ingham } 84478a685aaSJim Ingham 84578a685aaSJim Ingham SBValue 8462837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 84778a685aaSJim Ingham { 84869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8494838131bSGreg Clayton 85069b582faSGreg Clayton LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 851a162ebafSSean Callanan 85225f3a3cdSJohnny Chen ExecutionResults exe_results; 85369b582faSGreg Clayton SBValue expr_result; 8544838131bSGreg Clayton 855b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 856b9556accSGreg Clayton if (log) 857b9556accSGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame_sp.get(), expr); 858b9556accSGreg Clayton 859b9556accSGreg Clayton if (frame_sp) 8601d3afba3SGreg Clayton { 861b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 862316d498bSGreg Clayton 8631ba7c4d0SGreg Clayton 8641ba7c4d0SGreg Clayton StreamString frame_description; 865b9556accSGreg Clayton frame_sp->DumpUsingSettingsFormat (&frame_description); 8661ba7c4d0SGreg Clayton 8671ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 8681ba7c4d0SGreg Clayton expr, fetch_dynamic_value, frame_description.GetString().c_str()); 8691ba7c4d0SGreg Clayton 87020bb3aa5SSean Callanan const bool coerce_to_id = false; 8718b2fe6dcSGreg Clayton const bool unwind_on_error = true; 87292adcac9SSean Callanan const bool keep_in_memory = false; 873322f529bSSean Callanan 874b9556accSGreg Clayton exe_results = frame_sp->GetThread().GetProcess().GetTarget().EvaluateExpression(expr, 875b9556accSGreg Clayton frame_sp.get(), 8763bfdaa2aSSean Callanan eExecutionPolicyOnlyWhenNeeded, 87720bb3aa5SSean Callanan coerce_to_id, 87878a685aaSJim Ingham unwind_on_error, 87978a685aaSJim Ingham keep_in_memory, 8802837b766SJim Ingham fetch_dynamic_value, 88178a685aaSJim Ingham *expr_result); 882f49e65aeSGreg Clayton 883f49e65aeSGreg Clayton Host::SetCrashDescription (NULL); 8841d3afba3SGreg Clayton } 8854838131bSGreg Clayton 886a162ebafSSean Callanan if (expr_log) 88778a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 888fe42ac4dSGreg Clayton expr_result.GetValue(), 889fe42ac4dSGreg Clayton expr_result.GetSummary()); 890a162ebafSSean Callanan 8914838131bSGreg Clayton if (log) 892b9556accSGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", frame_sp.get(), 89378a685aaSJim Ingham expr, 89425f3a3cdSJohnny Chen expr_result.get(), 89525f3a3cdSJohnny Chen exe_results); 8964838131bSGreg Clayton 897cfd1acedSGreg Clayton return expr_result; 8981d3afba3SGreg Clayton } 899316d498bSGreg Clayton 900316d498bSGreg Clayton bool 901316d498bSGreg Clayton SBFrame::IsInlined() 902316d498bSGreg Clayton { 903b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 904b9556accSGreg Clayton if (frame_sp) 905316d498bSGreg Clayton { 906b9556accSGreg Clayton Block *block = frame_sp->GetSymbolContext(eSymbolContextBlock).block; 907316d498bSGreg Clayton if (block) 908316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 909316d498bSGreg Clayton } 910316d498bSGreg Clayton return false; 911316d498bSGreg Clayton } 912316d498bSGreg Clayton 913316d498bSGreg Clayton const char * 914316d498bSGreg Clayton SBFrame::GetFunctionName() 915316d498bSGreg Clayton { 916316d498bSGreg Clayton const char *name = NULL; 917b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 918b9556accSGreg Clayton if (frame_sp) 919316d498bSGreg Clayton { 920b9556accSGreg Clayton SymbolContext sc (frame_sp->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 921316d498bSGreg Clayton if (sc.block) 922316d498bSGreg Clayton { 923316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 924316d498bSGreg Clayton if (inlined_block) 925316d498bSGreg Clayton { 926316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 927316d498bSGreg Clayton name = inlined_info->GetName().AsCString(); 928316d498bSGreg Clayton } 929316d498bSGreg Clayton } 930316d498bSGreg Clayton 931316d498bSGreg Clayton if (name == NULL) 932316d498bSGreg Clayton { 933316d498bSGreg Clayton if (sc.function) 934316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 935316d498bSGreg Clayton } 936316d498bSGreg Clayton 937316d498bSGreg Clayton if (name == NULL) 938316d498bSGreg Clayton { 939316d498bSGreg Clayton if (sc.symbol) 940316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 941316d498bSGreg Clayton } 942316d498bSGreg Clayton } 943316d498bSGreg Clayton return name; 944316d498bSGreg Clayton } 945316d498bSGreg Clayton 946