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 4530fdc8d8SChris Lattner using namespace lldb; 4630fdc8d8SChris Lattner using namespace lldb_private; 4730fdc8d8SChris Lattner 48b9556accSGreg Clayton 4930fdc8d8SChris Lattner SBFrame::SBFrame () : 507fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef()) 5130fdc8d8SChris Lattner { 5230fdc8d8SChris Lattner } 5330fdc8d8SChris Lattner 5469b582faSGreg Clayton SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) : 557fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (lldb_object_sp)) 5630fdc8d8SChris Lattner { 5769b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 58ceb6b139SCaroline Tice 59ceb6b139SCaroline Tice if (log) 60ceb6b139SCaroline Tice { 61ceb6b139SCaroline Tice SBStream sstr; 62ceb6b139SCaroline Tice GetDescription (sstr); 634838131bSGreg Clayton log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s", 64b9556accSGreg Clayton lldb_object_sp.get(), lldb_object_sp.get(), sstr.GetData()); 65750cd175SCaroline Tice 66ceb6b139SCaroline Tice } 6730fdc8d8SChris Lattner } 6830fdc8d8SChris Lattner 69efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) : 707fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp)) 71efabb123SGreg Clayton { 72efabb123SGreg Clayton } 73efabb123SGreg Clayton 74efabb123SGreg Clayton const SBFrame & 75efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs) 76efabb123SGreg Clayton { 77efabb123SGreg Clayton if (this != &rhs) 787fdf9ef1SGreg Clayton *m_opaque_sp = *rhs.m_opaque_sp; 79efabb123SGreg Clayton return *this; 80efabb123SGreg Clayton } 81efabb123SGreg Clayton 8230fdc8d8SChris Lattner SBFrame::~SBFrame() 8330fdc8d8SChris Lattner { 8430fdc8d8SChris Lattner } 8530fdc8d8SChris Lattner 86b9556accSGreg Clayton StackFrameSP 87b9556accSGreg Clayton SBFrame::GetFrameSP() const 88b9556accSGreg Clayton { 89*af2589eaSGreg Clayton if (m_opaque_sp) 907fdf9ef1SGreg Clayton return m_opaque_sp->GetFrameSP(); 91*af2589eaSGreg Clayton return StackFrameSP(); 92b9556accSGreg Clayton } 9330fdc8d8SChris Lattner 9430fdc8d8SChris Lattner void 95b9556accSGreg Clayton SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp) 9630fdc8d8SChris Lattner { 977fdf9ef1SGreg Clayton return m_opaque_sp->SetFrameSP(lldb_object_sp); 98b9556accSGreg Clayton } 9930fdc8d8SChris Lattner 10030fdc8d8SChris Lattner bool 10130fdc8d8SChris Lattner SBFrame::IsValid() const 10230fdc8d8SChris Lattner { 1037fdf9ef1SGreg Clayton return GetFrameSP().get() != NULL; 10430fdc8d8SChris Lattner } 10530fdc8d8SChris Lattner 10630fdc8d8SChris Lattner SBSymbolContext 10730fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const 10830fdc8d8SChris Lattner { 109c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 11030fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 1117fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 112d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 113d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 114d9e416c0SGreg Clayton if (frame && target) 115af67cecdSGreg Clayton { 1167fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1177fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1187fdf9ef1SGreg Clayton { 119d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 120d9e416c0SGreg Clayton sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope)); 121af67cecdSGreg Clayton } 122c9858e4dSGreg Clayton else 123c9858e4dSGreg Clayton { 124c9858e4dSGreg Clayton if (log) 125c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext () => error: process is running", frame); 126c9858e4dSGreg Clayton } 1277fdf9ef1SGreg Clayton } 128ceb6b139SCaroline Tice 129ceb6b139SCaroline Tice if (log) 1304838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)", 131d9e416c0SGreg Clayton frame, resolve_scope, sb_sym_ctx.get()); 132ceb6b139SCaroline Tice 13330fdc8d8SChris Lattner return sb_sym_ctx; 13430fdc8d8SChris Lattner } 13530fdc8d8SChris Lattner 13630fdc8d8SChris Lattner SBModule 13730fdc8d8SChris Lattner SBFrame::GetModule () const 13830fdc8d8SChris Lattner { 139c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14072eff18aSGreg Clayton SBModule sb_module; 141acdbe816SGreg Clayton ModuleSP module_sp; 1427fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 143d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 144d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 145d9e416c0SGreg Clayton if (frame && target) 146af67cecdSGreg Clayton { 1477fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1487fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1497fdf9ef1SGreg Clayton { 150d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 151d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp; 152acdbe816SGreg Clayton sb_module.SetSP (module_sp); 153af67cecdSGreg Clayton } 154c9858e4dSGreg Clayton else 155c9858e4dSGreg Clayton { 156c9858e4dSGreg Clayton if (log) 157c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => error: process is running", frame); 158c9858e4dSGreg Clayton } 1597fdf9ef1SGreg Clayton } 16072eff18aSGreg Clayton 1614838131bSGreg Clayton if (log) 1624838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)", 163d9e416c0SGreg Clayton frame, module_sp.get()); 1644838131bSGreg Clayton 16530fdc8d8SChris Lattner return sb_module; 16630fdc8d8SChris Lattner } 16730fdc8d8SChris Lattner 16830fdc8d8SChris Lattner SBCompileUnit 16930fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 17030fdc8d8SChris Lattner { 171c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 17272eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 1737fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 174d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 175d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 176d9e416c0SGreg Clayton if (frame && target) 177af67cecdSGreg Clayton { 1787fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1797fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1807fdf9ef1SGreg Clayton { 181d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 182d9e416c0SGreg Clayton sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 183af67cecdSGreg Clayton } 184c9858e4dSGreg Clayton else 185c9858e4dSGreg Clayton { 186ceb6b139SCaroline Tice if (log) 187c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetCompileUnit () => error: process is running", frame); 188c9858e4dSGreg Clayton } 189c9858e4dSGreg Clayton } 190c9858e4dSGreg Clayton if (log) 191c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)", 192d9e416c0SGreg Clayton frame, sb_comp_unit.get()); 193ceb6b139SCaroline Tice 19430fdc8d8SChris Lattner return sb_comp_unit; 19530fdc8d8SChris Lattner } 19630fdc8d8SChris Lattner 19730fdc8d8SChris Lattner SBFunction 19830fdc8d8SChris Lattner SBFrame::GetFunction () const 19930fdc8d8SChris Lattner { 200c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 20172eff18aSGreg Clayton SBFunction sb_function; 2027fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 203d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 204d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 205d9e416c0SGreg Clayton if (frame && target) 206af67cecdSGreg Clayton { 2077fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2087fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2097fdf9ef1SGreg Clayton { 210d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 211d9e416c0SGreg Clayton sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function); 212af67cecdSGreg Clayton } 213c9858e4dSGreg Clayton else 214c9858e4dSGreg Clayton { 215c9858e4dSGreg Clayton if (log) 216c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => error: process is running", frame); 2177fdf9ef1SGreg Clayton } 218c9858e4dSGreg Clayton } 2194838131bSGreg Clayton if (log) 2204838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)", 221d9e416c0SGreg Clayton frame, sb_function.get()); 2224838131bSGreg Clayton 22330fdc8d8SChris Lattner return sb_function; 22430fdc8d8SChris Lattner } 22530fdc8d8SChris Lattner 2263b06557eSGreg Clayton SBSymbol 2273b06557eSGreg Clayton SBFrame::GetSymbol () const 2283b06557eSGreg Clayton { 229c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 23072eff18aSGreg Clayton SBSymbol sb_symbol; 2317fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 232d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 233d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 234d9e416c0SGreg Clayton if (frame && target) 235af67cecdSGreg Clayton { 2367fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2377fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2387fdf9ef1SGreg Clayton { 239d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 240d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol); 241af67cecdSGreg Clayton } 242c9858e4dSGreg Clayton else 243c9858e4dSGreg Clayton { 244c9858e4dSGreg Clayton if (log) 245c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => error: process is running", frame); 2467fdf9ef1SGreg Clayton } 247c9858e4dSGreg Clayton } 2484838131bSGreg Clayton if (log) 2494838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 250d9e416c0SGreg Clayton frame, sb_symbol.get()); 2513b06557eSGreg Clayton return sb_symbol; 2523b06557eSGreg Clayton } 2533b06557eSGreg Clayton 25430fdc8d8SChris Lattner SBBlock 25530fdc8d8SChris Lattner SBFrame::GetBlock () const 25630fdc8d8SChris Lattner { 257c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 25872eff18aSGreg Clayton SBBlock sb_block; 2597fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 260d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 261d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 262d9e416c0SGreg Clayton if (frame && target) 263af67cecdSGreg Clayton { 2647fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2657fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2667fdf9ef1SGreg Clayton { 267d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 268d9e416c0SGreg Clayton sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block); 269af67cecdSGreg Clayton } 270c9858e4dSGreg Clayton else 271c9858e4dSGreg Clayton { 272c9858e4dSGreg Clayton if (log) 273c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", frame); 2747fdf9ef1SGreg Clayton } 275c9858e4dSGreg Clayton } 2764838131bSGreg Clayton if (log) 2774838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)", 278d9e416c0SGreg Clayton frame, sb_block.GetPtr()); 27930fdc8d8SChris Lattner return sb_block; 28030fdc8d8SChris Lattner } 28130fdc8d8SChris Lattner 28295897c6aSGreg Clayton SBBlock 28395897c6aSGreg Clayton SBFrame::GetFrameBlock () const 28495897c6aSGreg Clayton { 28572eff18aSGreg Clayton SBBlock sb_block; 2867fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 287d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 288d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 289c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 290d9e416c0SGreg Clayton if (frame && target) 291af67cecdSGreg Clayton { 2927fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2937fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2947fdf9ef1SGreg Clayton { 295d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 296d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock ()); 297af67cecdSGreg Clayton } 298c9858e4dSGreg Clayton else 299c9858e4dSGreg Clayton { 300c9858e4dSGreg Clayton if (log) 301c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => error: process is running", frame); 3027fdf9ef1SGreg Clayton } 303c9858e4dSGreg Clayton } 3044838131bSGreg Clayton if (log) 3054838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 306d9e416c0SGreg Clayton frame, sb_block.GetPtr()); 30795897c6aSGreg Clayton return sb_block; 30895897c6aSGreg Clayton } 30995897c6aSGreg Clayton 31030fdc8d8SChris Lattner SBLineEntry 31130fdc8d8SChris Lattner SBFrame::GetLineEntry () const 31230fdc8d8SChris Lattner { 313c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 31472eff18aSGreg Clayton SBLineEntry sb_line_entry; 3157fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 316d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 317d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 318d9e416c0SGreg Clayton if (frame && target) 319af67cecdSGreg Clayton { 3207fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3217fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 3227fdf9ef1SGreg Clayton { 323d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 324d9e416c0SGreg Clayton sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry); 325af67cecdSGreg Clayton } 326c9858e4dSGreg Clayton else 327c9858e4dSGreg Clayton { 328c9858e4dSGreg Clayton if (log) 329c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => error: process is running", frame); 3307fdf9ef1SGreg Clayton } 331c9858e4dSGreg Clayton } 3324838131bSGreg Clayton if (log) 3334838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 334d9e416c0SGreg Clayton frame, sb_line_entry.get()); 33530fdc8d8SChris Lattner return sb_line_entry; 33630fdc8d8SChris Lattner } 33730fdc8d8SChris Lattner 33830fdc8d8SChris Lattner uint32_t 33930fdc8d8SChris Lattner SBFrame::GetFrameID () const 34030fdc8d8SChris Lattner { 341b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 342b9556accSGreg Clayton 3437fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 344d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 3457fdf9ef1SGreg Clayton if (frame) 346d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex (); 3474838131bSGreg Clayton 34869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3494838131bSGreg Clayton if (log) 3504838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameID () => %u", 351d9e416c0SGreg Clayton frame, frame_idx); 3524838131bSGreg Clayton return frame_idx; 35330fdc8d8SChris Lattner } 35430fdc8d8SChris Lattner 35569b582faSGreg Clayton addr_t 35630fdc8d8SChris Lattner SBFrame::GetPC () const 35730fdc8d8SChris Lattner { 358c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 35969b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 3607fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 361d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 362d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 363d9e416c0SGreg Clayton if (frame && target) 364af67cecdSGreg Clayton { 3657fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3667fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 3677fdf9ef1SGreg Clayton { 368d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 369d9e416c0SGreg Clayton addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target); 370af67cecdSGreg Clayton } 371c9858e4dSGreg Clayton else 372c9858e4dSGreg Clayton { 373c9858e4dSGreg Clayton if (log) 374c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetPC () => error: process is running", frame); 375c9858e4dSGreg Clayton } 3767fdf9ef1SGreg Clayton } 377ceb6b139SCaroline Tice 378ceb6b139SCaroline Tice if (log) 379d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", frame, addr); 380ceb6b139SCaroline Tice 381ceb6b139SCaroline Tice return addr; 38230fdc8d8SChris Lattner } 38330fdc8d8SChris Lattner 38430fdc8d8SChris Lattner bool 38569b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc) 38630fdc8d8SChris Lattner { 387c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 388ceb6b139SCaroline Tice bool ret_val = false; 3897fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 390d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 391d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 392d9e416c0SGreg Clayton if (frame && target) 393af67cecdSGreg Clayton { 3947fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3957fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 3967fdf9ef1SGreg Clayton { 397d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 398d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC (new_pc); 399af67cecdSGreg Clayton } 400c9858e4dSGreg Clayton else 401c9858e4dSGreg Clayton { 402c9858e4dSGreg Clayton if (log) 403c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::SetPC () => error: process is running", frame); 404c9858e4dSGreg Clayton } 4057fdf9ef1SGreg Clayton } 406ceb6b139SCaroline Tice 407ceb6b139SCaroline Tice if (log) 4084838131bSGreg Clayton log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i", 409d9e416c0SGreg Clayton frame, new_pc, ret_val); 410ceb6b139SCaroline Tice 411ceb6b139SCaroline Tice return ret_val; 41230fdc8d8SChris Lattner } 41330fdc8d8SChris Lattner 41469b582faSGreg Clayton addr_t 41530fdc8d8SChris Lattner SBFrame::GetSP () const 41630fdc8d8SChris Lattner { 417c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4184838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 4197fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 420d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 421d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 422d9e416c0SGreg Clayton if (frame && target) 423af67cecdSGreg Clayton { 4247fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4257fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4267fdf9ef1SGreg Clayton { 427d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 428d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 429af67cecdSGreg Clayton } 430c9858e4dSGreg Clayton else 431c9858e4dSGreg Clayton { 432c9858e4dSGreg Clayton if (log) 433c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetSP () => error: process is running", frame); 4347fdf9ef1SGreg Clayton } 435c9858e4dSGreg Clayton } 4364838131bSGreg Clayton if (log) 437d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", frame, addr); 4384838131bSGreg Clayton 4394838131bSGreg Clayton return addr; 44030fdc8d8SChris Lattner } 44130fdc8d8SChris Lattner 44230fdc8d8SChris Lattner 44369b582faSGreg Clayton addr_t 44430fdc8d8SChris Lattner SBFrame::GetFP () const 44530fdc8d8SChris Lattner { 446c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 44769b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 4487fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 449d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 450d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 451d9e416c0SGreg Clayton if (frame && target) 452af67cecdSGreg Clayton { 4537fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4547fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4557fdf9ef1SGreg Clayton { 456d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 457d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 458af67cecdSGreg Clayton } 459c9858e4dSGreg Clayton else 460c9858e4dSGreg Clayton { 461c9858e4dSGreg Clayton if (log) 462c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFP () => error: process is running", frame); 463c9858e4dSGreg Clayton } 4647fdf9ef1SGreg Clayton } 465ceb6b139SCaroline Tice 466ceb6b139SCaroline Tice if (log) 467d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", frame, addr); 468ceb6b139SCaroline Tice return addr; 46930fdc8d8SChris Lattner } 47030fdc8d8SChris Lattner 47130fdc8d8SChris Lattner 47230fdc8d8SChris Lattner SBAddress 47330fdc8d8SChris Lattner SBFrame::GetPCAddress () const 47430fdc8d8SChris Lattner { 475c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 47630fdc8d8SChris Lattner SBAddress sb_addr; 4777fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 478d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 479d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 480d9e416c0SGreg Clayton if (frame && target) 481af67cecdSGreg Clayton { 4827fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4837fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4847fdf9ef1SGreg Clayton { 485d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 486d9e416c0SGreg Clayton sb_addr.SetAddress (&frame->GetFrameCodeAddress()); 487af67cecdSGreg Clayton } 488c9858e4dSGreg Clayton else 489c9858e4dSGreg Clayton { 490c9858e4dSGreg Clayton if (log) 491c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetPCAddress () => error: process is running", frame); 4927fdf9ef1SGreg Clayton } 493c9858e4dSGreg Clayton } 4944838131bSGreg Clayton if (log) 495d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get()); 49630fdc8d8SChris Lattner return sb_addr; 49730fdc8d8SChris Lattner } 49830fdc8d8SChris Lattner 49930fdc8d8SChris Lattner void 50030fdc8d8SChris Lattner SBFrame::Clear() 50130fdc8d8SChris Lattner { 502*af2589eaSGreg Clayton m_opaque_sp->Clear(); 50330fdc8d8SChris Lattner } 50430fdc8d8SChris Lattner 5057edbdfc9SGreg Clayton lldb::SBValue 5067edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path) 5077edbdfc9SGreg Clayton { 5087edbdfc9SGreg Clayton SBValue sb_value; 5097fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 510d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 511d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 512d9e416c0SGreg Clayton if (frame && target) 5137edbdfc9SGreg Clayton { 514d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 5157edbdfc9SGreg Clayton sb_value = GetValueForVariablePath (var_path, use_dynamic); 5167edbdfc9SGreg Clayton } 5177edbdfc9SGreg Clayton return sb_value; 5187edbdfc9SGreg Clayton } 5197edbdfc9SGreg Clayton 5207edbdfc9SGreg Clayton lldb::SBValue 5217edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic) 5227edbdfc9SGreg Clayton { 5237edbdfc9SGreg Clayton SBValue sb_value; 5247fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 525d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 526d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 527d9e416c0SGreg Clayton if (frame && target && var_path && var_path[0]) 5287edbdfc9SGreg Clayton { 5297fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5307fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 5317fdf9ef1SGreg Clayton { 532d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 5337edbdfc9SGreg Clayton VariableSP var_sp; 5347edbdfc9SGreg Clayton Error error; 535d9e416c0SGreg Clayton ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path, 5367edbdfc9SGreg Clayton use_dynamic, 5377edbdfc9SGreg Clayton StackFrame::eExpressionPathOptionCheckPtrVsMember, 5387edbdfc9SGreg Clayton var_sp, 5397edbdfc9SGreg Clayton error)); 54081e871edSGreg Clayton sb_value.SetSP(value_sp); 5417edbdfc9SGreg Clayton } 542c9858e4dSGreg Clayton else 543c9858e4dSGreg Clayton { 544c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 545c9858e4dSGreg Clayton if (log) 546c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetValueForVariablePath () => error: process is running", frame); 547c9858e4dSGreg Clayton } 5487fdf9ef1SGreg Clayton } 5497edbdfc9SGreg Clayton return sb_value; 5507edbdfc9SGreg Clayton } 5517edbdfc9SGreg Clayton 55230fdc8d8SChris Lattner SBValue 55369b582faSGreg Clayton SBFrame::FindVariable (const char *name) 55430fdc8d8SChris Lattner { 555316d498bSGreg Clayton SBValue value; 5567fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 557d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 558d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 559d9e416c0SGreg Clayton if (frame && target) 560316d498bSGreg Clayton { 561d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 562316d498bSGreg Clayton value = FindVariable (name, use_dynamic); 563316d498bSGreg Clayton } 564316d498bSGreg Clayton return value; 56578a685aaSJim Ingham } 56678a685aaSJim Ingham 5677edbdfc9SGreg Clayton 56878a685aaSJim Ingham SBValue 5692837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic) 57078a685aaSJim Ingham { 571c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 57269b582faSGreg Clayton VariableSP var_sp; 57358b59f95SJim Ingham SBValue sb_value; 57481e871edSGreg Clayton ValueObjectSP value_sp; 5757fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 576d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 577d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 578d9e416c0SGreg Clayton if (frame && target && name && name[0]) 57930fdc8d8SChris Lattner { 5807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5817fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 5827fdf9ef1SGreg Clayton { 58369b582faSGreg Clayton VariableList variable_list; 584d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 585d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 58630fdc8d8SChris Lattner 58772eff18aSGreg Clayton if (sc.block) 58830fdc8d8SChris Lattner { 58972eff18aSGreg Clayton const bool can_create = true; 59072eff18aSGreg Clayton const bool get_parent_variables = true; 59172eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 59272eff18aSGreg Clayton 59372eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 59472eff18aSGreg Clayton get_parent_variables, 59572eff18aSGreg Clayton stop_if_block_is_inlined_function, 59672eff18aSGreg Clayton &variable_list)) 59772eff18aSGreg Clayton { 59869b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 59930fdc8d8SChris Lattner } 60072eff18aSGreg Clayton } 60130fdc8d8SChris Lattner 6024838131bSGreg Clayton if (var_sp) 60381e871edSGreg Clayton { 604d9e416c0SGreg Clayton value_sp = frame->GetValueObjectForFrameVariable(var_sp, use_dynamic); 60581e871edSGreg Clayton sb_value.SetSP(value_sp); 60681e871edSGreg Clayton } 6077fdf9ef1SGreg Clayton } 608c9858e4dSGreg Clayton else 609c9858e4dSGreg Clayton { 610c9858e4dSGreg Clayton if (log) 611c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable () => error: process is running", frame); 612c9858e4dSGreg Clayton } 613316d498bSGreg Clayton } 614316d498bSGreg Clayton 6154838131bSGreg Clayton if (log) 61669b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 617d9e416c0SGreg Clayton frame, name, value_sp.get()); 6184838131bSGreg Clayton 619dde9cff3SCaroline Tice return sb_value; 620dde9cff3SCaroline Tice } 621dde9cff3SCaroline Tice 62230fdc8d8SChris Lattner SBValue 62369b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 62430fdc8d8SChris Lattner { 625316d498bSGreg Clayton SBValue value; 6267fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 627d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 628d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 629d9e416c0SGreg Clayton if (frame && target) 630316d498bSGreg Clayton { 631d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 632316d498bSGreg Clayton value = FindValue (name, value_type, use_dynamic); 633316d498bSGreg Clayton } 634316d498bSGreg Clayton return value; 63578a685aaSJim Ingham } 63678a685aaSJim Ingham 63778a685aaSJim Ingham SBValue 6382837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) 63978a685aaSJim Ingham { 640c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 64169b582faSGreg Clayton SBValue sb_value; 64281e871edSGreg Clayton ValueObjectSP value_sp; 6437fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 644d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 645d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 646d9e416c0SGreg Clayton if (frame && target && name && name[0]) 64730fdc8d8SChris Lattner { 6487fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6497fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 6507fdf9ef1SGreg Clayton { 651d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 65230fdc8d8SChris Lattner 65369b582faSGreg Clayton switch (value_type) 65430fdc8d8SChris Lattner { 65569b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 65669b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 65769b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 65869b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 65969b582faSGreg Clayton { 660d9e416c0SGreg Clayton VariableList *variable_list = frame->GetVariableList(true); 66172eff18aSGreg Clayton 662d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 66372eff18aSGreg Clayton 66472eff18aSGreg Clayton const bool can_create = true; 66572eff18aSGreg Clayton const bool get_parent_variables = true; 66672eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 66772eff18aSGreg Clayton 66872eff18aSGreg Clayton if (sc.block && sc.block->AppendVariables (can_create, 66972eff18aSGreg Clayton get_parent_variables, 67072eff18aSGreg Clayton stop_if_block_is_inlined_function, 671e85d9cb8SJohnny Chen variable_list)) 672beae523aSJohnny Chen { 67369b582faSGreg Clayton ConstString const_name(name); 674e85d9cb8SJohnny Chen const uint32_t num_variables = variable_list->GetSize(); 67572eff18aSGreg Clayton for (uint32_t i = 0; i < num_variables; ++i) 67630fdc8d8SChris Lattner { 67769b582faSGreg Clayton VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 67869b582faSGreg Clayton if (variable_sp && 67969b582faSGreg Clayton variable_sp->GetScope() == value_type && 68069b582faSGreg Clayton variable_sp->GetName() == const_name) 681beae523aSJohnny Chen { 682d9e416c0SGreg Clayton value_sp = frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic); 68381e871edSGreg Clayton sb_value.SetSP (value_sp); 684beae523aSJohnny Chen break; 685beae523aSJohnny Chen } 68630fdc8d8SChris Lattner } 68730fdc8d8SChris Lattner } 68830fdc8d8SChris Lattner } 68969b582faSGreg Clayton break; 69069b582faSGreg Clayton 69169b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 69269b582faSGreg Clayton { 693d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 69469b582faSGreg Clayton if (reg_ctx) 69569b582faSGreg Clayton { 69669b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 69769b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 69869b582faSGreg Clayton { 69969b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 70069b582faSGreg Clayton if (reg_info && 70169b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 70269b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 70369b582faSGreg Clayton { 704d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 70581e871edSGreg Clayton sb_value.SetSP (value_sp); 70681e871edSGreg Clayton break; 70769b582faSGreg Clayton } 70869b582faSGreg Clayton } 70969b582faSGreg Clayton } 71069b582faSGreg Clayton } 71169b582faSGreg Clayton break; 71269b582faSGreg Clayton 71369b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 71469b582faSGreg Clayton { 715d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 71669b582faSGreg Clayton if (reg_ctx) 71769b582faSGreg Clayton { 71869b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 71969b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 72069b582faSGreg Clayton { 72169b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 72269b582faSGreg Clayton if (reg_set && 72369b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 72469b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 72569b582faSGreg Clayton { 726d9e416c0SGreg Clayton value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx); 72781e871edSGreg Clayton sb_value.SetSP (value_sp); 72881e871edSGreg Clayton break; 72969b582faSGreg Clayton } 73069b582faSGreg Clayton } 73169b582faSGreg Clayton } 73269b582faSGreg Clayton } 73369b582faSGreg Clayton break; 73469b582faSGreg Clayton 73569b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 73669b582faSGreg Clayton { 73769b582faSGreg Clayton ConstString const_name(name); 738d9e416c0SGreg Clayton ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name)); 73969b582faSGreg Clayton if (expr_var_sp) 74081e871edSGreg Clayton { 74181e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 74281e871edSGreg Clayton sb_value.SetSP (value_sp); 74381e871edSGreg Clayton } 74469b582faSGreg Clayton } 74569b582faSGreg Clayton break; 74669b582faSGreg Clayton 74769b582faSGreg Clayton default: 74869b582faSGreg Clayton break; 74969b582faSGreg Clayton } 750beae523aSJohnny Chen } 751c9858e4dSGreg Clayton else 752c9858e4dSGreg Clayton { 753c9858e4dSGreg Clayton if (log) 754c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::FindValue () => error: process is running", frame); 755c9858e4dSGreg Clayton } 7567fdf9ef1SGreg Clayton } 757dde9cff3SCaroline Tice 7584838131bSGreg Clayton if (log) 75969b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 760d9e416c0SGreg Clayton frame, name, value_type, value_sp.get()); 7614838131bSGreg Clayton 7624838131bSGreg Clayton 763dde9cff3SCaroline Tice return sb_value; 764dde9cff3SCaroline Tice } 765dde9cff3SCaroline Tice 76630fdc8d8SChris Lattner bool 76735e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const 76835e2ab60SJohnny Chen { 76935e2ab60SJohnny Chen lldb::StackFrameSP this_sp = GetFrameSP(); 77035e2ab60SJohnny Chen lldb::StackFrameSP that_sp = that.GetFrameSP(); 77135e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 77235e2ab60SJohnny Chen } 77335e2ab60SJohnny Chen 77435e2ab60SJohnny Chen bool 77530fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 77630fdc8d8SChris Lattner { 77735e2ab60SJohnny Chen return IsEqual(rhs); 77830fdc8d8SChris Lattner } 77930fdc8d8SChris Lattner 78030fdc8d8SChris Lattner bool 78130fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 78230fdc8d8SChris Lattner { 78335e2ab60SJohnny Chen return !IsEqual(rhs); 784481cef25SGreg Clayton } 78530fdc8d8SChris Lattner 78630fdc8d8SChris Lattner SBThread 78730fdc8d8SChris Lattner SBFrame::GetThread () const 78830fdc8d8SChris Lattner { 78969b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 790ceb6b139SCaroline Tice 7917fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 792d9e416c0SGreg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 793d9e416c0SGreg Clayton SBThread sb_thread (thread_sp); 794ceb6b139SCaroline Tice 795ceb6b139SCaroline Tice if (log) 796750cd175SCaroline Tice { 797750cd175SCaroline Tice SBStream sstr; 798750cd175SCaroline Tice sb_thread.GetDescription (sstr); 799d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", 800d9e416c0SGreg Clayton exe_ctx.GetFramePtr(), 801d9e416c0SGreg Clayton thread_sp.get(), 802d9e416c0SGreg Clayton sstr.GetData()); 803750cd175SCaroline Tice } 804ceb6b139SCaroline Tice 80530fdc8d8SChris Lattner return sb_thread; 80630fdc8d8SChris Lattner } 80730fdc8d8SChris Lattner 80830fdc8d8SChris Lattner const char * 80930fdc8d8SChris Lattner SBFrame::Disassemble () const 81030fdc8d8SChris Lattner { 811c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8124838131bSGreg Clayton const char *disassembly = NULL; 8137fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 814d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 815d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 816d9e416c0SGreg Clayton if (frame && target) 817af67cecdSGreg Clayton { 8187fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8197fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 8207fdf9ef1SGreg Clayton { 821d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 822d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 823af67cecdSGreg Clayton } 824c9858e4dSGreg Clayton else 825c9858e4dSGreg Clayton { 826c9858e4dSGreg Clayton if (log) 827c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => error: process is running", frame); 8287fdf9ef1SGreg Clayton } 829c9858e4dSGreg Clayton } 8304838131bSGreg Clayton 8314838131bSGreg Clayton if (log) 832d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly); 8334838131bSGreg Clayton 8344838131bSGreg Clayton return disassembly; 83530fdc8d8SChris Lattner } 83630fdc8d8SChris Lattner 83730fdc8d8SChris Lattner 83830fdc8d8SChris Lattner SBValueList 83930fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 84030fdc8d8SChris Lattner bool locals, 84130fdc8d8SChris Lattner bool statics, 84230fdc8d8SChris Lattner bool in_scope_only) 84330fdc8d8SChris Lattner { 844316d498bSGreg Clayton SBValueList value_list; 8457fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 846d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 847d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 848d9e416c0SGreg Clayton if (frame && target) 849316d498bSGreg Clayton { 850d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 851316d498bSGreg Clayton value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic); 852316d498bSGreg Clayton } 853316d498bSGreg Clayton return value_list; 85478a685aaSJim Ingham } 85578a685aaSJim Ingham 85678a685aaSJim Ingham SBValueList 85778a685aaSJim Ingham SBFrame::GetVariables (bool arguments, 85878a685aaSJim Ingham bool locals, 85978a685aaSJim Ingham bool statics, 86078a685aaSJim Ingham bool in_scope_only, 8612837b766SJim Ingham lldb::DynamicValueType use_dynamic) 86278a685aaSJim Ingham { 86369b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 864ceb6b139SCaroline Tice 865b9556accSGreg Clayton SBValueList value_list; 8667fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 867d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 868d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 869b9556accSGreg Clayton 870ceb6b139SCaroline Tice if (log) 8714838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 872d9e416c0SGreg Clayton frame, 8734838131bSGreg Clayton arguments, 8744838131bSGreg Clayton locals, 8754838131bSGreg Clayton statics, 8764838131bSGreg Clayton in_scope_only); 877ceb6b139SCaroline Tice 878d9e416c0SGreg Clayton if (frame && target) 87930fdc8d8SChris Lattner { 8807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8817fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 8827fdf9ef1SGreg Clayton { 883af67cecdSGreg Clayton 88430fdc8d8SChris Lattner size_t i; 885af67cecdSGreg Clayton VariableList *variable_list = NULL; 886af67cecdSGreg Clayton // Scope for locker 887af67cecdSGreg Clayton { 888d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 889d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 890af67cecdSGreg Clayton } 89130fdc8d8SChris Lattner if (variable_list) 89230fdc8d8SChris Lattner { 89330fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 89430fdc8d8SChris Lattner if (num_variables) 89530fdc8d8SChris Lattner { 89630fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 89730fdc8d8SChris Lattner { 89830fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 89930fdc8d8SChris Lattner if (variable_sp) 90030fdc8d8SChris Lattner { 90130fdc8d8SChris Lattner bool add_variable = false; 90230fdc8d8SChris Lattner switch (variable_sp->GetScope()) 90330fdc8d8SChris Lattner { 90430fdc8d8SChris Lattner case eValueTypeVariableGlobal: 90530fdc8d8SChris Lattner case eValueTypeVariableStatic: 90630fdc8d8SChris Lattner add_variable = statics; 90730fdc8d8SChris Lattner break; 90830fdc8d8SChris Lattner 90930fdc8d8SChris Lattner case eValueTypeVariableArgument: 91030fdc8d8SChris Lattner add_variable = arguments; 91130fdc8d8SChris Lattner break; 91230fdc8d8SChris Lattner 91330fdc8d8SChris Lattner case eValueTypeVariableLocal: 91430fdc8d8SChris Lattner add_variable = locals; 91530fdc8d8SChris Lattner break; 916c982c768SGreg Clayton 917c982c768SGreg Clayton default: 918c982c768SGreg Clayton break; 91930fdc8d8SChris Lattner } 92030fdc8d8SChris Lattner if (add_variable) 92130fdc8d8SChris Lattner { 922d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 92330fdc8d8SChris Lattner continue; 92430fdc8d8SChris Lattner 925d9e416c0SGreg Clayton value_list.Append(frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic)); 92630fdc8d8SChris Lattner } 92730fdc8d8SChris Lattner } 92830fdc8d8SChris Lattner } 92930fdc8d8SChris Lattner } 93030fdc8d8SChris Lattner } 93130fdc8d8SChris Lattner } 932c9858e4dSGreg Clayton else 933c9858e4dSGreg Clayton { 934c9858e4dSGreg Clayton if (log) 935c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables () => error: process is running", frame); 936c9858e4dSGreg Clayton } 9377fdf9ef1SGreg Clayton } 938ceb6b139SCaroline Tice 939ceb6b139SCaroline Tice if (log) 940ceb6b139SCaroline Tice { 941d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame, 942750cd175SCaroline Tice value_list.get()); 943ceb6b139SCaroline Tice } 944ceb6b139SCaroline Tice 94530fdc8d8SChris Lattner return value_list; 94630fdc8d8SChris Lattner } 94730fdc8d8SChris Lattner 94869b582faSGreg Clayton SBValueList 94930fdc8d8SChris Lattner SBFrame::GetRegisters () 95030fdc8d8SChris Lattner { 95169b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 952ceb6b139SCaroline Tice 95330fdc8d8SChris Lattner SBValueList value_list; 9547fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 955d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 956d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 957d9e416c0SGreg Clayton if (frame && target) 95830fdc8d8SChris Lattner { 9597fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9607fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 9617fdf9ef1SGreg Clayton { 962d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 963d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 96430fdc8d8SChris Lattner if (reg_ctx) 96530fdc8d8SChris Lattner { 96630fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 96730fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 96830fdc8d8SChris Lattner { 969d9e416c0SGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); 97030fdc8d8SChris Lattner } 97130fdc8d8SChris Lattner } 97230fdc8d8SChris Lattner } 973c9858e4dSGreg Clayton else 974c9858e4dSGreg Clayton { 975c9858e4dSGreg Clayton if (log) 976c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetRegisters () => error: process is running", frame); 977c9858e4dSGreg Clayton } 9787fdf9ef1SGreg Clayton } 979ceb6b139SCaroline Tice 980ceb6b139SCaroline Tice if (log) 981c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.get()); 982ceb6b139SCaroline Tice 98330fdc8d8SChris Lattner return value_list; 98430fdc8d8SChris Lattner } 98530fdc8d8SChris Lattner 986dde9cff3SCaroline Tice bool 987dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 988dde9cff3SCaroline Tice { 989da7bc7d0SGreg Clayton Stream &strm = description.ref(); 990da7bc7d0SGreg Clayton 9917fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 992d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 993d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 994d9e416c0SGreg Clayton if (frame && target) 995dde9cff3SCaroline Tice { 9967fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9977fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 9987fdf9ef1SGreg Clayton { 999d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 1000d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 1001dde9cff3SCaroline Tice } 1002c9858e4dSGreg Clayton else 1003c9858e4dSGreg Clayton { 1004c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1005c9858e4dSGreg Clayton if (log) 1006c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetDescription () => error: process is running", frame); 1007c9858e4dSGreg Clayton } 1008c9858e4dSGreg Clayton 10097fdf9ef1SGreg Clayton } 1010dde9cff3SCaroline Tice else 1011da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1012dde9cff3SCaroline Tice 1013dde9cff3SCaroline Tice return true; 1014dde9cff3SCaroline Tice } 10151d3afba3SGreg Clayton 101669b582faSGreg Clayton SBValue 10171d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 10181d3afba3SGreg Clayton { 1019316d498bSGreg Clayton SBValue result; 10207fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1021d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1022d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1023d9e416c0SGreg Clayton if (frame && target) 1024316d498bSGreg Clayton { 1025d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 1026316d498bSGreg Clayton result = EvaluateExpression (expr, use_dynamic); 1027316d498bSGreg Clayton } 1028316d498bSGreg Clayton return result; 102978a685aaSJim Ingham } 103078a685aaSJim Ingham 103178a685aaSJim Ingham SBValue 10322837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 103378a685aaSJim Ingham { 103469b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 10354838131bSGreg Clayton 103669b582faSGreg Clayton LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1037a162ebafSSean Callanan 103825f3a3cdSJohnny Chen ExecutionResults exe_results; 103969b582faSGreg Clayton SBValue expr_result; 104081e871edSGreg Clayton ValueObjectSP expr_value_sp; 10414838131bSGreg Clayton 10427fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1043d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1044d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1045b9556accSGreg Clayton if (log) 1046d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame, expr); 1047b9556accSGreg Clayton 1048d9e416c0SGreg Clayton if (frame && target) 10491d3afba3SGreg Clayton { 10507fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10517fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 10527fdf9ef1SGreg Clayton { 10537fdf9ef1SGreg Clayton 1054d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 1055316d498bSGreg Clayton 10561ba7c4d0SGreg Clayton 10571ba7c4d0SGreg Clayton StreamString frame_description; 1058d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 10591ba7c4d0SGreg Clayton 10601ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 10611ba7c4d0SGreg Clayton expr, fetch_dynamic_value, frame_description.GetString().c_str()); 10621ba7c4d0SGreg Clayton 106320bb3aa5SSean Callanan const bool coerce_to_id = false; 10648b2fe6dcSGreg Clayton const bool unwind_on_error = true; 106592adcac9SSean Callanan const bool keep_in_memory = false; 1066322f529bSSean Callanan 1067d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 1068d9e416c0SGreg Clayton frame, 10693bfdaa2aSSean Callanan eExecutionPolicyOnlyWhenNeeded, 107020bb3aa5SSean Callanan coerce_to_id, 107178a685aaSJim Ingham unwind_on_error, 107278a685aaSJim Ingham keep_in_memory, 10732837b766SJim Ingham fetch_dynamic_value, 107481e871edSGreg Clayton expr_value_sp); 107581e871edSGreg Clayton expr_result.SetSP(expr_value_sp); 1076f49e65aeSGreg Clayton Host::SetCrashDescription (NULL); 10771d3afba3SGreg Clayton } 1078c9858e4dSGreg Clayton else 1079c9858e4dSGreg Clayton { 1080c9858e4dSGreg Clayton if (log) 1081c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression () => error: process is running", frame); 1082c9858e4dSGreg Clayton } 10837fdf9ef1SGreg Clayton } 10844838131bSGreg Clayton 1085cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1086a162ebafSSean Callanan if (expr_log) 108778a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 1088fe42ac4dSGreg Clayton expr_result.GetValue(), 1089fe42ac4dSGreg Clayton expr_result.GetSummary()); 1090a162ebafSSean Callanan 10914838131bSGreg Clayton if (log) 1092d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 1093d9e416c0SGreg Clayton frame, 109478a685aaSJim Ingham expr, 109581e871edSGreg Clayton expr_value_sp.get(), 109625f3a3cdSJohnny Chen exe_results); 1097cf7e2dc0SJason Molenda #endif 10984838131bSGreg Clayton 1099cfd1acedSGreg Clayton return expr_result; 11001d3afba3SGreg Clayton } 1101316d498bSGreg Clayton 1102316d498bSGreg Clayton bool 1103316d498bSGreg Clayton SBFrame::IsInlined() 1104316d498bSGreg Clayton { 11057fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1106d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1107d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1108d9e416c0SGreg Clayton if (frame && target) 1109316d498bSGreg Clayton { 11107fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11117fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 11127fdf9ef1SGreg Clayton { 11137fdf9ef1SGreg Clayton 1114d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1115316d498bSGreg Clayton if (block) 1116316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 1117316d498bSGreg Clayton } 1118c9858e4dSGreg Clayton else 1119c9858e4dSGreg Clayton { 1120c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1121c9858e4dSGreg Clayton if (log) 1122c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::IsInlined () => error: process is running", frame); 1123c9858e4dSGreg Clayton } 1124c9858e4dSGreg Clayton 11257fdf9ef1SGreg Clayton } 1126316d498bSGreg Clayton return false; 1127316d498bSGreg Clayton } 1128316d498bSGreg Clayton 1129316d498bSGreg Clayton const char * 1130316d498bSGreg Clayton SBFrame::GetFunctionName() 1131316d498bSGreg Clayton { 1132316d498bSGreg Clayton const char *name = NULL; 11337fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1134d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1135d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1136d9e416c0SGreg Clayton if (frame && target) 1137316d498bSGreg Clayton { 11387fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11397fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 11407fdf9ef1SGreg Clayton { 1141d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1142316d498bSGreg Clayton if (sc.block) 1143316d498bSGreg Clayton { 1144316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1145316d498bSGreg Clayton if (inlined_block) 1146316d498bSGreg Clayton { 1147316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1148316d498bSGreg Clayton name = inlined_info->GetName().AsCString(); 1149316d498bSGreg Clayton } 1150316d498bSGreg Clayton } 1151316d498bSGreg Clayton 1152316d498bSGreg Clayton if (name == NULL) 1153316d498bSGreg Clayton { 1154316d498bSGreg Clayton if (sc.function) 1155316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1156316d498bSGreg Clayton } 1157316d498bSGreg Clayton 1158316d498bSGreg Clayton if (name == NULL) 1159316d498bSGreg Clayton { 1160316d498bSGreg Clayton if (sc.symbol) 1161316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1162316d498bSGreg Clayton } 1163316d498bSGreg Clayton } 1164c9858e4dSGreg Clayton else 1165c9858e4dSGreg Clayton { 1166c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1167c9858e4dSGreg Clayton if (log) 1168c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFunctionName() => error: process is running", frame); 1169c9858e4dSGreg Clayton 1170c9858e4dSGreg Clayton } 11717fdf9ef1SGreg Clayton } 1172316d498bSGreg Clayton return name; 1173316d498bSGreg Clayton } 1174316d498bSGreg Clayton 1175