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; 225acdbe816SGreg 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()); 230acdbe816SGreg Clayton module_sp = frame_sp->GetSymbolContext (eSymbolContextModule).module_sp; 231acdbe816SGreg 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)", 237acdbe816SGreg 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 4587edbdfc9SGreg Clayton lldb::SBValue 4597edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path) 4607edbdfc9SGreg Clayton { 4617edbdfc9SGreg Clayton SBValue sb_value; 4627edbdfc9SGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 4637edbdfc9SGreg Clayton if (frame_sp) 4647edbdfc9SGreg Clayton { 4657edbdfc9SGreg Clayton lldb::DynamicValueType use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue(); 4667edbdfc9SGreg Clayton sb_value = GetValueForVariablePath (var_path, use_dynamic); 4677edbdfc9SGreg Clayton } 4687edbdfc9SGreg Clayton return sb_value; 4697edbdfc9SGreg Clayton } 4707edbdfc9SGreg Clayton 4717edbdfc9SGreg Clayton lldb::SBValue 4727edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic) 4737edbdfc9SGreg Clayton { 4747edbdfc9SGreg Clayton SBValue sb_value; 4757edbdfc9SGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 4767edbdfc9SGreg Clayton if (frame_sp && var_path && var_path[0]) 4777edbdfc9SGreg Clayton { 4787edbdfc9SGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 4797edbdfc9SGreg Clayton VariableSP var_sp; 4807edbdfc9SGreg Clayton Error error; 4817edbdfc9SGreg Clayton ValueObjectSP value_sp (frame_sp->GetValueForVariableExpressionPath (var_path, 4827edbdfc9SGreg Clayton use_dynamic, 4837edbdfc9SGreg Clayton StackFrame::eExpressionPathOptionCheckPtrVsMember, 4847edbdfc9SGreg Clayton var_sp, 4857edbdfc9SGreg Clayton error)); 486*81e871edSGreg Clayton sb_value.SetSP(value_sp); 4877edbdfc9SGreg Clayton } 4887edbdfc9SGreg Clayton return sb_value; 4897edbdfc9SGreg Clayton } 4907edbdfc9SGreg Clayton 49130fdc8d8SChris Lattner SBValue 49269b582faSGreg Clayton SBFrame::FindVariable (const char *name) 49330fdc8d8SChris Lattner { 494316d498bSGreg Clayton SBValue value; 495b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 496b9556accSGreg Clayton if (frame_sp) 497316d498bSGreg Clayton { 498b9556accSGreg Clayton lldb::DynamicValueType use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue(); 499316d498bSGreg Clayton value = FindVariable (name, use_dynamic); 500316d498bSGreg Clayton } 501316d498bSGreg Clayton return value; 50278a685aaSJim Ingham } 50378a685aaSJim Ingham 5047edbdfc9SGreg Clayton 50578a685aaSJim Ingham SBValue 5062837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic) 50778a685aaSJim Ingham { 50869b582faSGreg Clayton VariableSP var_sp; 50958b59f95SJim Ingham SBValue sb_value; 510*81e871edSGreg Clayton ValueObjectSP value_sp; 511b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 512b9556accSGreg Clayton if (frame_sp && name && name[0]) 51330fdc8d8SChris Lattner { 51469b582faSGreg Clayton VariableList variable_list; 515b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 516b9556accSGreg Clayton SymbolContext sc (frame_sp->GetSymbolContext (eSymbolContextBlock)); 51730fdc8d8SChris Lattner 51872eff18aSGreg Clayton if (sc.block) 51930fdc8d8SChris Lattner { 52072eff18aSGreg Clayton const bool can_create = true; 52172eff18aSGreg Clayton const bool get_parent_variables = true; 52272eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 52372eff18aSGreg Clayton 52472eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 52572eff18aSGreg Clayton get_parent_variables, 52672eff18aSGreg Clayton stop_if_block_is_inlined_function, 52772eff18aSGreg Clayton &variable_list)) 52872eff18aSGreg Clayton { 52969b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 53030fdc8d8SChris Lattner } 53172eff18aSGreg Clayton } 53230fdc8d8SChris Lattner 5334838131bSGreg Clayton if (var_sp) 534*81e871edSGreg Clayton { 535*81e871edSGreg Clayton value_sp = frame_sp->GetValueObjectForFrameVariable(var_sp, use_dynamic); 536*81e871edSGreg Clayton sb_value.SetSP(value_sp); 537*81e871edSGreg Clayton } 5384838131bSGreg Clayton 539316d498bSGreg Clayton } 540316d498bSGreg Clayton 54169b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5424838131bSGreg Clayton if (log) 54369b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 544*81e871edSGreg Clayton frame_sp.get(), name, value_sp.get()); 5454838131bSGreg Clayton 546dde9cff3SCaroline Tice return sb_value; 547dde9cff3SCaroline Tice } 548dde9cff3SCaroline Tice 54930fdc8d8SChris Lattner SBValue 55069b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 55130fdc8d8SChris Lattner { 552316d498bSGreg Clayton SBValue value; 553b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 554b9556accSGreg Clayton if (frame_sp) 555316d498bSGreg Clayton { 556b9556accSGreg Clayton lldb::DynamicValueType use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue(); 557316d498bSGreg Clayton value = FindValue (name, value_type, use_dynamic); 558316d498bSGreg Clayton } 559316d498bSGreg Clayton return value; 56078a685aaSJim Ingham } 56178a685aaSJim Ingham 56278a685aaSJim Ingham SBValue 5632837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) 56478a685aaSJim Ingham { 56569b582faSGreg Clayton SBValue sb_value; 566*81e871edSGreg Clayton ValueObjectSP value_sp; 567b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 568b9556accSGreg Clayton if (frame_sp && name && name[0]) 56930fdc8d8SChris Lattner { 570b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 57130fdc8d8SChris Lattner 57269b582faSGreg Clayton switch (value_type) 57330fdc8d8SChris Lattner { 57469b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 57569b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 57669b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 57769b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 57869b582faSGreg Clayton { 579b9556accSGreg Clayton VariableList *variable_list = frame_sp->GetVariableList(true); 58072eff18aSGreg Clayton 581b9556accSGreg Clayton SymbolContext sc (frame_sp->GetSymbolContext (eSymbolContextBlock)); 58272eff18aSGreg Clayton 58372eff18aSGreg Clayton const bool can_create = true; 58472eff18aSGreg Clayton const bool get_parent_variables = true; 58572eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 58672eff18aSGreg Clayton 58772eff18aSGreg Clayton if (sc.block && sc.block->AppendVariables (can_create, 58872eff18aSGreg Clayton get_parent_variables, 58972eff18aSGreg Clayton stop_if_block_is_inlined_function, 590e85d9cb8SJohnny Chen variable_list)) 591beae523aSJohnny Chen { 59269b582faSGreg Clayton ConstString const_name(name); 593e85d9cb8SJohnny Chen const uint32_t num_variables = variable_list->GetSize(); 59472eff18aSGreg Clayton for (uint32_t i = 0; i < num_variables; ++i) 59530fdc8d8SChris Lattner { 59669b582faSGreg Clayton VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 59769b582faSGreg Clayton if (variable_sp && 59869b582faSGreg Clayton variable_sp->GetScope() == value_type && 59969b582faSGreg Clayton variable_sp->GetName() == const_name) 600beae523aSJohnny Chen { 601*81e871edSGreg Clayton value_sp = frame_sp->GetValueObjectForFrameVariable (variable_sp, use_dynamic); 602*81e871edSGreg Clayton sb_value.SetSP (value_sp); 603beae523aSJohnny Chen break; 604beae523aSJohnny Chen } 60530fdc8d8SChris Lattner } 60630fdc8d8SChris Lattner } 60730fdc8d8SChris Lattner } 60869b582faSGreg Clayton break; 60969b582faSGreg Clayton 61069b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 61169b582faSGreg Clayton { 612b9556accSGreg Clayton RegisterContextSP reg_ctx (frame_sp->GetRegisterContext()); 61369b582faSGreg Clayton if (reg_ctx) 61469b582faSGreg Clayton { 61569b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 61669b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 61769b582faSGreg Clayton { 61869b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 61969b582faSGreg Clayton if (reg_info && 62069b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 62169b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 62269b582faSGreg Clayton { 623*81e871edSGreg Clayton value_sp = ValueObjectRegister::Create (frame_sp.get(), reg_ctx, reg_idx); 624*81e871edSGreg Clayton sb_value.SetSP (value_sp); 625*81e871edSGreg Clayton break; 62669b582faSGreg Clayton } 62769b582faSGreg Clayton } 62869b582faSGreg Clayton } 62969b582faSGreg Clayton } 63069b582faSGreg Clayton break; 63169b582faSGreg Clayton 63269b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 63369b582faSGreg Clayton { 634b9556accSGreg Clayton RegisterContextSP reg_ctx (frame_sp->GetRegisterContext()); 63569b582faSGreg Clayton if (reg_ctx) 63669b582faSGreg Clayton { 63769b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 63869b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 63969b582faSGreg Clayton { 64069b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 64169b582faSGreg Clayton if (reg_set && 64269b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 64369b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 64469b582faSGreg Clayton { 645*81e871edSGreg Clayton value_sp = ValueObjectRegisterSet::Create (frame_sp.get(), reg_ctx, set_idx); 646*81e871edSGreg Clayton sb_value.SetSP (value_sp); 647*81e871edSGreg Clayton break; 64869b582faSGreg Clayton } 64969b582faSGreg Clayton } 65069b582faSGreg Clayton } 65169b582faSGreg Clayton } 65269b582faSGreg Clayton break; 65369b582faSGreg Clayton 65469b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 65569b582faSGreg Clayton { 65669b582faSGreg Clayton ConstString const_name(name); 657b9556accSGreg Clayton ClangExpressionVariableSP expr_var_sp (frame_sp->GetThread().GetProcess().GetTarget().GetPersistentVariables().GetVariable (const_name)); 65869b582faSGreg Clayton if (expr_var_sp) 659*81e871edSGreg Clayton { 660*81e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 661*81e871edSGreg Clayton sb_value.SetSP (value_sp); 662*81e871edSGreg Clayton } 66369b582faSGreg Clayton } 66469b582faSGreg Clayton break; 66569b582faSGreg Clayton 66669b582faSGreg Clayton default: 66769b582faSGreg Clayton break; 66869b582faSGreg Clayton } 669beae523aSJohnny Chen } 670dde9cff3SCaroline Tice 67169b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6724838131bSGreg Clayton if (log) 67369b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 674*81e871edSGreg Clayton frame_sp.get(), name, value_type, value_sp.get()); 6754838131bSGreg Clayton 6764838131bSGreg Clayton 677dde9cff3SCaroline Tice return sb_value; 678dde9cff3SCaroline Tice } 679dde9cff3SCaroline Tice 68030fdc8d8SChris Lattner bool 68130fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 68230fdc8d8SChris Lattner { 683b9556accSGreg Clayton return GetFrameSP().get() == rhs.GetFrameSP().get(); 68430fdc8d8SChris Lattner } 68530fdc8d8SChris Lattner 68630fdc8d8SChris Lattner bool 68730fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 68830fdc8d8SChris Lattner { 689b9556accSGreg Clayton return GetFrameSP().get() != rhs.GetFrameSP().get(); 690481cef25SGreg Clayton } 69130fdc8d8SChris Lattner 69230fdc8d8SChris Lattner SBThread 69330fdc8d8SChris Lattner SBFrame::GetThread () const 69430fdc8d8SChris Lattner { 69569b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 696ceb6b139SCaroline Tice 69772eff18aSGreg Clayton SBThread sb_thread; 69817a6ad05SGreg Clayton ThreadSP thread_sp; 699b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 700b9556accSGreg Clayton if (frame_sp) 701af67cecdSGreg Clayton { 702b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 703b9556accSGreg Clayton thread_sp = frame_sp->GetThread().shared_from_this(); 70417a6ad05SGreg Clayton sb_thread.SetThread (thread_sp); 705af67cecdSGreg Clayton } 706ceb6b139SCaroline Tice 707ceb6b139SCaroline Tice if (log) 708750cd175SCaroline Tice { 709750cd175SCaroline Tice SBStream sstr; 710750cd175SCaroline Tice sb_thread.GetDescription (sstr); 711b9556accSGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", frame_sp.get(), 71217a6ad05SGreg Clayton thread_sp.get(), sstr.GetData()); 713750cd175SCaroline Tice } 714ceb6b139SCaroline Tice 71530fdc8d8SChris Lattner return sb_thread; 71630fdc8d8SChris Lattner } 71730fdc8d8SChris Lattner 71830fdc8d8SChris Lattner const char * 71930fdc8d8SChris Lattner SBFrame::Disassemble () const 72030fdc8d8SChris Lattner { 7214838131bSGreg Clayton const char *disassembly = NULL; 722b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 723b9556accSGreg Clayton if (frame_sp) 724af67cecdSGreg Clayton { 725b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 726b9556accSGreg Clayton disassembly = frame_sp->Disassemble(); 727af67cecdSGreg Clayton } 72869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7294838131bSGreg Clayton 7304838131bSGreg Clayton if (log) 731b9556accSGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => %s", frame_sp.get(), disassembly); 7324838131bSGreg Clayton 7334838131bSGreg Clayton return disassembly; 73430fdc8d8SChris Lattner } 73530fdc8d8SChris Lattner 73630fdc8d8SChris Lattner 73730fdc8d8SChris Lattner SBValueList 73830fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 73930fdc8d8SChris Lattner bool locals, 74030fdc8d8SChris Lattner bool statics, 74130fdc8d8SChris Lattner bool in_scope_only) 74230fdc8d8SChris Lattner { 743316d498bSGreg Clayton SBValueList value_list; 744b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 745b9556accSGreg Clayton if (frame_sp) 746316d498bSGreg Clayton { 747b9556accSGreg Clayton lldb::DynamicValueType use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue(); 748316d498bSGreg Clayton value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic); 749316d498bSGreg Clayton } 750316d498bSGreg Clayton return value_list; 75178a685aaSJim Ingham } 75278a685aaSJim Ingham 75378a685aaSJim Ingham SBValueList 75478a685aaSJim Ingham SBFrame::GetVariables (bool arguments, 75578a685aaSJim Ingham bool locals, 75678a685aaSJim Ingham bool statics, 75778a685aaSJim Ingham bool in_scope_only, 7582837b766SJim Ingham lldb::DynamicValueType use_dynamic) 75978a685aaSJim Ingham { 76069b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 761ceb6b139SCaroline Tice 762b9556accSGreg Clayton SBValueList value_list; 763b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 764b9556accSGreg Clayton 765ceb6b139SCaroline Tice if (log) 7664838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 767b9556accSGreg Clayton frame_sp.get(), 7684838131bSGreg Clayton arguments, 7694838131bSGreg Clayton locals, 7704838131bSGreg Clayton statics, 7714838131bSGreg Clayton in_scope_only); 772ceb6b139SCaroline Tice 773b9556accSGreg Clayton if (frame_sp) 77430fdc8d8SChris Lattner { 775af67cecdSGreg Clayton 77630fdc8d8SChris Lattner size_t i; 777af67cecdSGreg Clayton VariableList *variable_list = NULL; 778af67cecdSGreg Clayton // Scope for locker 779af67cecdSGreg Clayton { 780b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 781b9556accSGreg Clayton variable_list = frame_sp->GetVariableList(true); 782af67cecdSGreg Clayton } 78330fdc8d8SChris Lattner if (variable_list) 78430fdc8d8SChris Lattner { 78530fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 78630fdc8d8SChris Lattner if (num_variables) 78730fdc8d8SChris Lattner { 78830fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 78930fdc8d8SChris Lattner { 79030fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 79130fdc8d8SChris Lattner if (variable_sp) 79230fdc8d8SChris Lattner { 79330fdc8d8SChris Lattner bool add_variable = false; 79430fdc8d8SChris Lattner switch (variable_sp->GetScope()) 79530fdc8d8SChris Lattner { 79630fdc8d8SChris Lattner case eValueTypeVariableGlobal: 79730fdc8d8SChris Lattner case eValueTypeVariableStatic: 79830fdc8d8SChris Lattner add_variable = statics; 79930fdc8d8SChris Lattner break; 80030fdc8d8SChris Lattner 80130fdc8d8SChris Lattner case eValueTypeVariableArgument: 80230fdc8d8SChris Lattner add_variable = arguments; 80330fdc8d8SChris Lattner break; 80430fdc8d8SChris Lattner 80530fdc8d8SChris Lattner case eValueTypeVariableLocal: 80630fdc8d8SChris Lattner add_variable = locals; 80730fdc8d8SChris Lattner break; 808c982c768SGreg Clayton 809c982c768SGreg Clayton default: 810c982c768SGreg Clayton break; 81130fdc8d8SChris Lattner } 81230fdc8d8SChris Lattner if (add_variable) 81330fdc8d8SChris Lattner { 814b9556accSGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame_sp.get())) 81530fdc8d8SChris Lattner continue; 81630fdc8d8SChris Lattner 817b9556accSGreg Clayton value_list.Append(frame_sp->GetValueObjectForFrameVariable (variable_sp, use_dynamic)); 81830fdc8d8SChris Lattner } 81930fdc8d8SChris Lattner } 82030fdc8d8SChris Lattner } 82130fdc8d8SChris Lattner } 82230fdc8d8SChris Lattner } 82330fdc8d8SChris Lattner } 824ceb6b139SCaroline Tice 825ceb6b139SCaroline Tice if (log) 826ceb6b139SCaroline Tice { 827b9556accSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame_sp.get(), 828750cd175SCaroline Tice value_list.get()); 829ceb6b139SCaroline Tice } 830ceb6b139SCaroline Tice 83130fdc8d8SChris Lattner return value_list; 83230fdc8d8SChris Lattner } 83330fdc8d8SChris Lattner 83469b582faSGreg Clayton SBValueList 83530fdc8d8SChris Lattner SBFrame::GetRegisters () 83630fdc8d8SChris Lattner { 83769b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 838ceb6b139SCaroline Tice 83930fdc8d8SChris Lattner SBValueList value_list; 840b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 841b9556accSGreg Clayton if (frame_sp) 84230fdc8d8SChris Lattner { 843b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 844b9556accSGreg Clayton RegisterContextSP reg_ctx (frame_sp->GetRegisterContext()); 84530fdc8d8SChris Lattner if (reg_ctx) 84630fdc8d8SChris Lattner { 84730fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 84830fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 84930fdc8d8SChris Lattner { 850b9556accSGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame_sp.get(), reg_ctx, set_idx)); 85130fdc8d8SChris Lattner } 85230fdc8d8SChris Lattner } 85330fdc8d8SChris Lattner } 854ceb6b139SCaroline Tice 855ceb6b139SCaroline Tice if (log) 856b9556accSGreg Clayton log->Printf ("SBFrame(%p)::Registers () => SBValueList(%p)", frame_sp.get(), value_list.get()); 857ceb6b139SCaroline Tice 85830fdc8d8SChris Lattner return value_list; 85930fdc8d8SChris Lattner } 86030fdc8d8SChris Lattner 861dde9cff3SCaroline Tice bool 862dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 863dde9cff3SCaroline Tice { 864da7bc7d0SGreg Clayton Stream &strm = description.ref(); 865da7bc7d0SGreg Clayton 866b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 867b9556accSGreg Clayton if (frame_sp) 868dde9cff3SCaroline Tice { 869b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 870b9556accSGreg Clayton frame_sp->DumpUsingSettingsFormat (&strm); 871dde9cff3SCaroline Tice } 872dde9cff3SCaroline Tice else 873da7bc7d0SGreg Clayton strm.PutCString ("No value"); 874dde9cff3SCaroline Tice 875dde9cff3SCaroline Tice return true; 876dde9cff3SCaroline Tice } 8771d3afba3SGreg Clayton 87869b582faSGreg Clayton SBValue 8791d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 8801d3afba3SGreg Clayton { 881316d498bSGreg Clayton SBValue result; 882b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 883b9556accSGreg Clayton if (frame_sp) 884316d498bSGreg Clayton { 885b9556accSGreg Clayton lldb::DynamicValueType use_dynamic = frame_sp->CalculateTarget()->GetPreferDynamicValue(); 886316d498bSGreg Clayton result = EvaluateExpression (expr, use_dynamic); 887316d498bSGreg Clayton } 888316d498bSGreg Clayton return result; 88978a685aaSJim Ingham } 89078a685aaSJim Ingham 89178a685aaSJim Ingham SBValue 8922837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 89378a685aaSJim Ingham { 89469b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8954838131bSGreg Clayton 89669b582faSGreg Clayton LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 897a162ebafSSean Callanan 89825f3a3cdSJohnny Chen ExecutionResults exe_results; 89969b582faSGreg Clayton SBValue expr_result; 900*81e871edSGreg Clayton ValueObjectSP expr_value_sp; 9014838131bSGreg Clayton 902b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 903b9556accSGreg Clayton if (log) 904b9556accSGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame_sp.get(), expr); 905b9556accSGreg Clayton 906b9556accSGreg Clayton if (frame_sp) 9071d3afba3SGreg Clayton { 908b9556accSGreg Clayton Mutex::Locker api_locker (frame_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 909316d498bSGreg Clayton 9101ba7c4d0SGreg Clayton 9111ba7c4d0SGreg Clayton StreamString frame_description; 912b9556accSGreg Clayton frame_sp->DumpUsingSettingsFormat (&frame_description); 9131ba7c4d0SGreg Clayton 9141ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 9151ba7c4d0SGreg Clayton expr, fetch_dynamic_value, frame_description.GetString().c_str()); 9161ba7c4d0SGreg Clayton 91720bb3aa5SSean Callanan const bool coerce_to_id = false; 9188b2fe6dcSGreg Clayton const bool unwind_on_error = true; 91992adcac9SSean Callanan const bool keep_in_memory = false; 920322f529bSSean Callanan 921b9556accSGreg Clayton exe_results = frame_sp->GetThread().GetProcess().GetTarget().EvaluateExpression(expr, 922b9556accSGreg Clayton frame_sp.get(), 9233bfdaa2aSSean Callanan eExecutionPolicyOnlyWhenNeeded, 92420bb3aa5SSean Callanan coerce_to_id, 92578a685aaSJim Ingham unwind_on_error, 92678a685aaSJim Ingham keep_in_memory, 9272837b766SJim Ingham fetch_dynamic_value, 928*81e871edSGreg Clayton expr_value_sp); 929*81e871edSGreg Clayton expr_result.SetSP(expr_value_sp); 930f49e65aeSGreg Clayton Host::SetCrashDescription (NULL); 9311d3afba3SGreg Clayton } 9324838131bSGreg Clayton 933a162ebafSSean Callanan if (expr_log) 93478a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 935fe42ac4dSGreg Clayton expr_result.GetValue(), 936fe42ac4dSGreg Clayton expr_result.GetSummary()); 937a162ebafSSean Callanan 9384838131bSGreg Clayton if (log) 939b9556accSGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", frame_sp.get(), 94078a685aaSJim Ingham expr, 941*81e871edSGreg Clayton expr_value_sp.get(), 94225f3a3cdSJohnny Chen exe_results); 9434838131bSGreg Clayton 944cfd1acedSGreg Clayton return expr_result; 9451d3afba3SGreg Clayton } 946316d498bSGreg Clayton 947316d498bSGreg Clayton bool 948316d498bSGreg Clayton SBFrame::IsInlined() 949316d498bSGreg Clayton { 950b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 951b9556accSGreg Clayton if (frame_sp) 952316d498bSGreg Clayton { 953b9556accSGreg Clayton Block *block = frame_sp->GetSymbolContext(eSymbolContextBlock).block; 954316d498bSGreg Clayton if (block) 955316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 956316d498bSGreg Clayton } 957316d498bSGreg Clayton return false; 958316d498bSGreg Clayton } 959316d498bSGreg Clayton 960316d498bSGreg Clayton const char * 961316d498bSGreg Clayton SBFrame::GetFunctionName() 962316d498bSGreg Clayton { 963316d498bSGreg Clayton const char *name = NULL; 964b9556accSGreg Clayton StackFrameSP frame_sp(GetFrameSP()); 965b9556accSGreg Clayton if (frame_sp) 966316d498bSGreg Clayton { 967b9556accSGreg Clayton SymbolContext sc (frame_sp->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 968316d498bSGreg Clayton if (sc.block) 969316d498bSGreg Clayton { 970316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 971316d498bSGreg Clayton if (inlined_block) 972316d498bSGreg Clayton { 973316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 974316d498bSGreg Clayton name = inlined_info->GetName().AsCString(); 975316d498bSGreg Clayton } 976316d498bSGreg Clayton } 977316d498bSGreg Clayton 978316d498bSGreg Clayton if (name == NULL) 979316d498bSGreg Clayton { 980316d498bSGreg Clayton if (sc.function) 981316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 982316d498bSGreg Clayton } 983316d498bSGreg Clayton 984316d498bSGreg Clayton if (name == NULL) 985316d498bSGreg Clayton { 986316d498bSGreg Clayton if (sc.symbol) 987316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 988316d498bSGreg Clayton } 989316d498bSGreg Clayton } 990316d498bSGreg Clayton return name; 991316d498bSGreg Clayton } 992316d498bSGreg Clayton 993