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" 271f746071SGreg Clayton #include "lldb/Symbol/Function.h" 281f746071SGreg Clayton #include "lldb/Symbol/Symbol.h" 2930fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 3030fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h" 3130fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h" 3230fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h" 3330fdc8d8SChris Lattner #include "lldb/Target/Target.h" 3430fdc8d8SChris Lattner #include "lldb/Target/Process.h" 3530fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 3630fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h" 37b9556accSGreg Clayton #include "lldb/Target/StackID.h" 3830fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 3930fdc8d8SChris Lattner 404c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 414c5de699SEli Friedman #include "lldb/API/SBValue.h" 424c5de699SEli Friedman #include "lldb/API/SBAddress.h" 43dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 444c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h" 454c5de699SEli Friedman #include "lldb/API/SBThread.h" 4630fdc8d8SChris Lattner 4730fdc8d8SChris Lattner using namespace lldb; 4830fdc8d8SChris Lattner using namespace lldb_private; 4930fdc8d8SChris Lattner 50b9556accSGreg Clayton 5130fdc8d8SChris Lattner SBFrame::SBFrame () : 527fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef()) 5330fdc8d8SChris Lattner { 5430fdc8d8SChris Lattner } 5530fdc8d8SChris Lattner 5669b582faSGreg Clayton SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) : 577fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (lldb_object_sp)) 5830fdc8d8SChris Lattner { 5969b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 60ceb6b139SCaroline Tice 61ceb6b139SCaroline Tice if (log) 62ceb6b139SCaroline Tice { 63ceb6b139SCaroline Tice SBStream sstr; 64ceb6b139SCaroline Tice GetDescription (sstr); 654838131bSGreg Clayton log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s", 66b9556accSGreg Clayton lldb_object_sp.get(), lldb_object_sp.get(), sstr.GetData()); 67750cd175SCaroline Tice 68ceb6b139SCaroline Tice } 6930fdc8d8SChris Lattner } 7030fdc8d8SChris Lattner 71efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) : 727fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp)) 73efabb123SGreg Clayton { 74efabb123SGreg Clayton } 75efabb123SGreg Clayton 76efabb123SGreg Clayton const SBFrame & 77efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs) 78efabb123SGreg Clayton { 79efabb123SGreg Clayton if (this != &rhs) 807fdf9ef1SGreg Clayton *m_opaque_sp = *rhs.m_opaque_sp; 81efabb123SGreg Clayton return *this; 82efabb123SGreg Clayton } 83efabb123SGreg Clayton 8430fdc8d8SChris Lattner SBFrame::~SBFrame() 8530fdc8d8SChris Lattner { 8630fdc8d8SChris Lattner } 8730fdc8d8SChris Lattner 88b9556accSGreg Clayton StackFrameSP 89b9556accSGreg Clayton SBFrame::GetFrameSP() const 90b9556accSGreg Clayton { 91af2589eaSGreg Clayton if (m_opaque_sp) 927fdf9ef1SGreg Clayton return m_opaque_sp->GetFrameSP(); 93af2589eaSGreg Clayton return StackFrameSP(); 94b9556accSGreg Clayton } 9530fdc8d8SChris Lattner 9630fdc8d8SChris Lattner void 97b9556accSGreg Clayton SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp) 9830fdc8d8SChris Lattner { 997fdf9ef1SGreg Clayton return m_opaque_sp->SetFrameSP(lldb_object_sp); 100b9556accSGreg Clayton } 10130fdc8d8SChris Lattner 10230fdc8d8SChris Lattner bool 10330fdc8d8SChris Lattner SBFrame::IsValid() const 10430fdc8d8SChris Lattner { 1057fdf9ef1SGreg Clayton return GetFrameSP().get() != NULL; 10630fdc8d8SChris Lattner } 10730fdc8d8SChris Lattner 10830fdc8d8SChris Lattner SBSymbolContext 10930fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const 11030fdc8d8SChris Lattner { 111c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 11230fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 1134fc6cb9cSJim Ingham Mutex::Locker api_locker; 1144fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1154fc6cb9cSJim Ingham 116d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 117d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 118d9e416c0SGreg Clayton if (frame && target) 119af67cecdSGreg Clayton { 1207fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1217fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1227fdf9ef1SGreg Clayton { 123d9e416c0SGreg Clayton sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope)); 124af67cecdSGreg Clayton } 125c9858e4dSGreg Clayton else 126c9858e4dSGreg Clayton { 127c9858e4dSGreg Clayton if (log) 128c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext () => error: process is running", frame); 129c9858e4dSGreg Clayton } 1307fdf9ef1SGreg Clayton } 131ceb6b139SCaroline Tice 132ceb6b139SCaroline Tice if (log) 1334838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)", 134d9e416c0SGreg Clayton frame, resolve_scope, sb_sym_ctx.get()); 135ceb6b139SCaroline Tice 13630fdc8d8SChris Lattner return sb_sym_ctx; 13730fdc8d8SChris Lattner } 13830fdc8d8SChris Lattner 13930fdc8d8SChris Lattner SBModule 14030fdc8d8SChris Lattner SBFrame::GetModule () const 14130fdc8d8SChris Lattner { 142c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14372eff18aSGreg Clayton SBModule sb_module; 144acdbe816SGreg Clayton ModuleSP module_sp; 1454fc6cb9cSJim Ingham Mutex::Locker api_locker; 1464fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1474fc6cb9cSJim Ingham 148d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 149d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 150d9e416c0SGreg Clayton if (frame && target) 151af67cecdSGreg Clayton { 1527fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1537fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1547fdf9ef1SGreg Clayton { 155d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp; 156acdbe816SGreg Clayton sb_module.SetSP (module_sp); 157af67cecdSGreg Clayton } 158c9858e4dSGreg Clayton else 159c9858e4dSGreg Clayton { 160c9858e4dSGreg Clayton if (log) 161c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => error: process is running", frame); 162c9858e4dSGreg Clayton } 1637fdf9ef1SGreg Clayton } 16472eff18aSGreg Clayton 1654838131bSGreg Clayton if (log) 1664838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)", 167d9e416c0SGreg Clayton frame, module_sp.get()); 1684838131bSGreg Clayton 16930fdc8d8SChris Lattner return sb_module; 17030fdc8d8SChris Lattner } 17130fdc8d8SChris Lattner 17230fdc8d8SChris Lattner SBCompileUnit 17330fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 17430fdc8d8SChris Lattner { 175c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 17672eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 1774fc6cb9cSJim Ingham Mutex::Locker api_locker; 1784fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1794fc6cb9cSJim Ingham 180d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 181d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 182d9e416c0SGreg Clayton if (frame && target) 183af67cecdSGreg Clayton { 1847fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1857fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1867fdf9ef1SGreg Clayton { 187d9e416c0SGreg Clayton sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 188af67cecdSGreg Clayton } 189c9858e4dSGreg Clayton else 190c9858e4dSGreg Clayton { 191ceb6b139SCaroline Tice if (log) 192c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetCompileUnit () => error: process is running", frame); 193c9858e4dSGreg Clayton } 194c9858e4dSGreg Clayton } 195c9858e4dSGreg Clayton if (log) 196c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)", 197d9e416c0SGreg Clayton frame, sb_comp_unit.get()); 198ceb6b139SCaroline Tice 19930fdc8d8SChris Lattner return sb_comp_unit; 20030fdc8d8SChris Lattner } 20130fdc8d8SChris Lattner 20230fdc8d8SChris Lattner SBFunction 20330fdc8d8SChris Lattner SBFrame::GetFunction () const 20430fdc8d8SChris Lattner { 205c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 20672eff18aSGreg Clayton SBFunction sb_function; 2074fc6cb9cSJim Ingham Mutex::Locker api_locker; 2084fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2094fc6cb9cSJim Ingham 210d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 211d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 212d9e416c0SGreg Clayton if (frame && target) 213af67cecdSGreg Clayton { 2147fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2157fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2167fdf9ef1SGreg Clayton { 217d9e416c0SGreg Clayton sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function); 218af67cecdSGreg Clayton } 219c9858e4dSGreg Clayton else 220c9858e4dSGreg Clayton { 221c9858e4dSGreg Clayton if (log) 222c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => error: process is running", frame); 2237fdf9ef1SGreg Clayton } 224c9858e4dSGreg Clayton } 2254838131bSGreg Clayton if (log) 2264838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)", 227d9e416c0SGreg Clayton frame, sb_function.get()); 2284838131bSGreg Clayton 22930fdc8d8SChris Lattner return sb_function; 23030fdc8d8SChris Lattner } 23130fdc8d8SChris Lattner 2323b06557eSGreg Clayton SBSymbol 2333b06557eSGreg Clayton SBFrame::GetSymbol () const 2343b06557eSGreg Clayton { 235c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 23672eff18aSGreg Clayton SBSymbol sb_symbol; 2374fc6cb9cSJim Ingham Mutex::Locker api_locker; 2384fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2394fc6cb9cSJim Ingham 240d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 241d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 242d9e416c0SGreg Clayton if (frame && target) 243af67cecdSGreg Clayton { 2447fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2457fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2467fdf9ef1SGreg Clayton { 247d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol); 248af67cecdSGreg Clayton } 249c9858e4dSGreg Clayton else 250c9858e4dSGreg Clayton { 251c9858e4dSGreg Clayton if (log) 252c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => error: process is running", frame); 2537fdf9ef1SGreg Clayton } 254c9858e4dSGreg Clayton } 2554838131bSGreg Clayton if (log) 2564838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 257d9e416c0SGreg Clayton frame, sb_symbol.get()); 2583b06557eSGreg Clayton return sb_symbol; 2593b06557eSGreg Clayton } 2603b06557eSGreg Clayton 26130fdc8d8SChris Lattner SBBlock 26230fdc8d8SChris Lattner SBFrame::GetBlock () const 26330fdc8d8SChris Lattner { 264c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 26572eff18aSGreg Clayton SBBlock sb_block; 2664fc6cb9cSJim Ingham Mutex::Locker api_locker; 2674fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2684fc6cb9cSJim Ingham 269d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 270d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 271d9e416c0SGreg Clayton if (frame && target) 272af67cecdSGreg Clayton { 2737fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2747fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2757fdf9ef1SGreg Clayton { 276d9e416c0SGreg Clayton sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block); 277af67cecdSGreg Clayton } 278c9858e4dSGreg Clayton else 279c9858e4dSGreg Clayton { 280c9858e4dSGreg Clayton if (log) 281c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", frame); 2827fdf9ef1SGreg Clayton } 283c9858e4dSGreg Clayton } 2844838131bSGreg Clayton if (log) 2854838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)", 286d9e416c0SGreg Clayton frame, sb_block.GetPtr()); 28730fdc8d8SChris Lattner return sb_block; 28830fdc8d8SChris Lattner } 28930fdc8d8SChris Lattner 29095897c6aSGreg Clayton SBBlock 29195897c6aSGreg Clayton SBFrame::GetFrameBlock () const 29295897c6aSGreg Clayton { 29372eff18aSGreg Clayton SBBlock sb_block; 2944fc6cb9cSJim Ingham Mutex::Locker api_locker; 2954fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2964fc6cb9cSJim Ingham 297d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 298d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 299c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 300d9e416c0SGreg Clayton if (frame && target) 301af67cecdSGreg Clayton { 3027fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3037fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 3047fdf9ef1SGreg Clayton { 305d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock ()); 306af67cecdSGreg Clayton } 307c9858e4dSGreg Clayton else 308c9858e4dSGreg Clayton { 309c9858e4dSGreg Clayton if (log) 310c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => error: process is running", frame); 3117fdf9ef1SGreg Clayton } 312c9858e4dSGreg Clayton } 3134838131bSGreg Clayton if (log) 3144838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 315d9e416c0SGreg Clayton frame, sb_block.GetPtr()); 31695897c6aSGreg Clayton return sb_block; 31795897c6aSGreg Clayton } 31895897c6aSGreg Clayton 31930fdc8d8SChris Lattner SBLineEntry 32030fdc8d8SChris Lattner SBFrame::GetLineEntry () const 32130fdc8d8SChris Lattner { 322c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 32372eff18aSGreg Clayton SBLineEntry sb_line_entry; 3244fc6cb9cSJim Ingham Mutex::Locker api_locker; 3254fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3264fc6cb9cSJim Ingham 327d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 328d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 329d9e416c0SGreg Clayton if (frame && target) 330af67cecdSGreg Clayton { 3317fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3327fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 3337fdf9ef1SGreg Clayton { 334d9e416c0SGreg Clayton sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry); 335af67cecdSGreg Clayton } 336c9858e4dSGreg Clayton else 337c9858e4dSGreg Clayton { 338c9858e4dSGreg Clayton if (log) 339c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => error: process is running", frame); 3407fdf9ef1SGreg Clayton } 341c9858e4dSGreg Clayton } 3424838131bSGreg Clayton if (log) 3434838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 344d9e416c0SGreg Clayton frame, sb_line_entry.get()); 34530fdc8d8SChris Lattner return sb_line_entry; 34630fdc8d8SChris Lattner } 34730fdc8d8SChris Lattner 34830fdc8d8SChris Lattner uint32_t 34930fdc8d8SChris Lattner SBFrame::GetFrameID () const 35030fdc8d8SChris Lattner { 351b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 352b9556accSGreg Clayton 3537fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 354d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 3557fdf9ef1SGreg Clayton if (frame) 356d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex (); 3574838131bSGreg Clayton 35869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3594838131bSGreg Clayton if (log) 3604838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameID () => %u", 361d9e416c0SGreg Clayton frame, frame_idx); 3624838131bSGreg Clayton return frame_idx; 36330fdc8d8SChris Lattner } 36430fdc8d8SChris Lattner 36569b582faSGreg Clayton addr_t 36630fdc8d8SChris Lattner SBFrame::GetPC () const 36730fdc8d8SChris Lattner { 368c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 36969b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 3704fc6cb9cSJim Ingham Mutex::Locker api_locker; 3714fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3724fc6cb9cSJim Ingham 373d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 374d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 375d9e416c0SGreg Clayton if (frame && target) 376af67cecdSGreg Clayton { 3777fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3787fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 3797fdf9ef1SGreg Clayton { 380d9e416c0SGreg Clayton addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target); 381af67cecdSGreg Clayton } 382c9858e4dSGreg Clayton else 383c9858e4dSGreg Clayton { 384c9858e4dSGreg Clayton if (log) 385c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetPC () => error: process is running", frame); 386c9858e4dSGreg Clayton } 3877fdf9ef1SGreg Clayton } 388ceb6b139SCaroline Tice 389ceb6b139SCaroline Tice if (log) 390d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", frame, addr); 391ceb6b139SCaroline Tice 392ceb6b139SCaroline Tice return addr; 39330fdc8d8SChris Lattner } 39430fdc8d8SChris Lattner 39530fdc8d8SChris Lattner bool 39669b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc) 39730fdc8d8SChris Lattner { 398c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 399ceb6b139SCaroline Tice bool ret_val = false; 4004fc6cb9cSJim Ingham Mutex::Locker api_locker; 4014fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4024fc6cb9cSJim Ingham 403d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 404d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 405d9e416c0SGreg Clayton if (frame && target) 406af67cecdSGreg Clayton { 4077fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4087fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4097fdf9ef1SGreg Clayton { 410d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC (new_pc); 411af67cecdSGreg Clayton } 412c9858e4dSGreg Clayton else 413c9858e4dSGreg Clayton { 414c9858e4dSGreg Clayton if (log) 415c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::SetPC () => error: process is running", frame); 416c9858e4dSGreg Clayton } 4177fdf9ef1SGreg Clayton } 418ceb6b139SCaroline Tice 419ceb6b139SCaroline Tice if (log) 4204838131bSGreg Clayton log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i", 421d9e416c0SGreg Clayton frame, new_pc, ret_val); 422ceb6b139SCaroline Tice 423ceb6b139SCaroline Tice return ret_val; 42430fdc8d8SChris Lattner } 42530fdc8d8SChris Lattner 42669b582faSGreg Clayton addr_t 42730fdc8d8SChris Lattner SBFrame::GetSP () const 42830fdc8d8SChris Lattner { 429c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4304838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 4314fc6cb9cSJim Ingham Mutex::Locker api_locker; 4324fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4334fc6cb9cSJim Ingham 434d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 435d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 436d9e416c0SGreg Clayton if (frame && target) 437af67cecdSGreg Clayton { 4387fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4397fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4407fdf9ef1SGreg Clayton { 441d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 442af67cecdSGreg Clayton } 443c9858e4dSGreg Clayton else 444c9858e4dSGreg Clayton { 445c9858e4dSGreg Clayton if (log) 446c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetSP () => error: process is running", frame); 4477fdf9ef1SGreg Clayton } 448c9858e4dSGreg Clayton } 4494838131bSGreg Clayton if (log) 450d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", frame, addr); 4514838131bSGreg Clayton 4524838131bSGreg Clayton return addr; 45330fdc8d8SChris Lattner } 45430fdc8d8SChris Lattner 45530fdc8d8SChris Lattner 45669b582faSGreg Clayton addr_t 45730fdc8d8SChris Lattner SBFrame::GetFP () const 45830fdc8d8SChris Lattner { 459c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 46069b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 4614fc6cb9cSJim Ingham Mutex::Locker api_locker; 4624fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4634fc6cb9cSJim Ingham 464d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 465d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 466d9e416c0SGreg Clayton if (frame && target) 467af67cecdSGreg Clayton { 4687fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4697fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4707fdf9ef1SGreg Clayton { 471d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 472af67cecdSGreg Clayton } 473c9858e4dSGreg Clayton else 474c9858e4dSGreg Clayton { 475c9858e4dSGreg Clayton if (log) 476c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFP () => error: process is running", frame); 477c9858e4dSGreg Clayton } 4787fdf9ef1SGreg Clayton } 479ceb6b139SCaroline Tice 480ceb6b139SCaroline Tice if (log) 481d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", frame, addr); 482ceb6b139SCaroline Tice return addr; 48330fdc8d8SChris Lattner } 48430fdc8d8SChris Lattner 48530fdc8d8SChris Lattner 48630fdc8d8SChris Lattner SBAddress 48730fdc8d8SChris Lattner SBFrame::GetPCAddress () const 48830fdc8d8SChris Lattner { 489c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 49030fdc8d8SChris Lattner SBAddress sb_addr; 4914fc6cb9cSJim Ingham Mutex::Locker api_locker; 4924fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4934fc6cb9cSJim Ingham 494d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 495d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 496d9e416c0SGreg Clayton if (frame && target) 497af67cecdSGreg Clayton { 4987fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4997fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 5007fdf9ef1SGreg Clayton { 501d9e416c0SGreg Clayton sb_addr.SetAddress (&frame->GetFrameCodeAddress()); 502af67cecdSGreg Clayton } 503c9858e4dSGreg Clayton else 504c9858e4dSGreg Clayton { 505c9858e4dSGreg Clayton if (log) 506c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetPCAddress () => error: process is running", frame); 5077fdf9ef1SGreg Clayton } 508c9858e4dSGreg Clayton } 5094838131bSGreg Clayton if (log) 510d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get()); 51130fdc8d8SChris Lattner return sb_addr; 51230fdc8d8SChris Lattner } 51330fdc8d8SChris Lattner 51430fdc8d8SChris Lattner void 51530fdc8d8SChris Lattner SBFrame::Clear() 51630fdc8d8SChris Lattner { 517af2589eaSGreg Clayton m_opaque_sp->Clear(); 51830fdc8d8SChris Lattner } 51930fdc8d8SChris Lattner 5207edbdfc9SGreg Clayton lldb::SBValue 5217edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path) 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) 5287edbdfc9SGreg Clayton { 529d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 5307edbdfc9SGreg Clayton sb_value = GetValueForVariablePath (var_path, use_dynamic); 5317edbdfc9SGreg Clayton } 5327edbdfc9SGreg Clayton return sb_value; 5337edbdfc9SGreg Clayton } 5347edbdfc9SGreg Clayton 5357edbdfc9SGreg Clayton lldb::SBValue 5367edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic) 5377edbdfc9SGreg Clayton { 5387edbdfc9SGreg Clayton SBValue sb_value; 5394fc6cb9cSJim Ingham Mutex::Locker api_locker; 5404fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5414fc6cb9cSJim Ingham 542d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 543d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 544d9e416c0SGreg Clayton if (frame && target && var_path && var_path[0]) 5457edbdfc9SGreg Clayton { 5467fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5477fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 5487fdf9ef1SGreg Clayton { 5497edbdfc9SGreg Clayton VariableSP var_sp; 5507edbdfc9SGreg Clayton Error error; 551d9e416c0SGreg Clayton ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path, 5527edbdfc9SGreg Clayton use_dynamic, 553685c88c5SGreg Clayton StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 5547edbdfc9SGreg Clayton var_sp, 5557edbdfc9SGreg Clayton error)); 55681e871edSGreg Clayton sb_value.SetSP(value_sp); 5577edbdfc9SGreg Clayton } 558c9858e4dSGreg Clayton else 559c9858e4dSGreg Clayton { 560c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 561c9858e4dSGreg Clayton if (log) 562c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetValueForVariablePath () => error: process is running", frame); 563c9858e4dSGreg Clayton } 5647fdf9ef1SGreg Clayton } 5657edbdfc9SGreg Clayton return sb_value; 5667edbdfc9SGreg Clayton } 5677edbdfc9SGreg Clayton 56830fdc8d8SChris Lattner SBValue 56969b582faSGreg Clayton SBFrame::FindVariable (const char *name) 57030fdc8d8SChris Lattner { 571316d498bSGreg Clayton SBValue value; 5727fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 573d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 574d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 575d9e416c0SGreg Clayton if (frame && target) 576316d498bSGreg Clayton { 577d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 578316d498bSGreg Clayton value = FindVariable (name, use_dynamic); 579316d498bSGreg Clayton } 580316d498bSGreg Clayton return value; 58178a685aaSJim Ingham } 58278a685aaSJim Ingham 5837edbdfc9SGreg Clayton 58478a685aaSJim Ingham SBValue 5852837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic) 58678a685aaSJim Ingham { 587c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 58869b582faSGreg Clayton VariableSP var_sp; 58958b59f95SJim Ingham SBValue sb_value; 59081e871edSGreg Clayton ValueObjectSP value_sp; 5914fc6cb9cSJim Ingham Mutex::Locker api_locker; 5924fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5934fc6cb9cSJim Ingham 594d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 595d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 596d9e416c0SGreg Clayton if (frame && target && name && name[0]) 59730fdc8d8SChris Lattner { 5987fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5997fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 6007fdf9ef1SGreg Clayton { 60169b582faSGreg Clayton VariableList variable_list; 602d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 60330fdc8d8SChris Lattner 60472eff18aSGreg Clayton if (sc.block) 60530fdc8d8SChris Lattner { 60672eff18aSGreg Clayton const bool can_create = true; 60772eff18aSGreg Clayton const bool get_parent_variables = true; 60872eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 60972eff18aSGreg Clayton 61072eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 61172eff18aSGreg Clayton get_parent_variables, 61272eff18aSGreg Clayton stop_if_block_is_inlined_function, 61372eff18aSGreg Clayton &variable_list)) 61472eff18aSGreg Clayton { 61569b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 61630fdc8d8SChris Lattner } 61772eff18aSGreg Clayton } 61830fdc8d8SChris Lattner 6194838131bSGreg Clayton if (var_sp) 62081e871edSGreg Clayton { 621d9e416c0SGreg Clayton value_sp = frame->GetValueObjectForFrameVariable(var_sp, use_dynamic); 62281e871edSGreg Clayton sb_value.SetSP(value_sp); 62381e871edSGreg Clayton } 6247fdf9ef1SGreg Clayton } 625c9858e4dSGreg Clayton else 626c9858e4dSGreg Clayton { 627c9858e4dSGreg Clayton if (log) 628c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable () => error: process is running", frame); 629c9858e4dSGreg Clayton } 630316d498bSGreg Clayton } 631316d498bSGreg Clayton 6324838131bSGreg Clayton if (log) 63369b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 634d9e416c0SGreg Clayton frame, name, value_sp.get()); 6354838131bSGreg Clayton 636dde9cff3SCaroline Tice return sb_value; 637dde9cff3SCaroline Tice } 638dde9cff3SCaroline Tice 63930fdc8d8SChris Lattner SBValue 64069b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 64130fdc8d8SChris Lattner { 642316d498bSGreg Clayton SBValue value; 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) 647316d498bSGreg Clayton { 648d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 649316d498bSGreg Clayton value = FindValue (name, value_type, use_dynamic); 650316d498bSGreg Clayton } 651316d498bSGreg Clayton return value; 65278a685aaSJim Ingham } 65378a685aaSJim Ingham 65478a685aaSJim Ingham SBValue 6552837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) 65678a685aaSJim Ingham { 657c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 65869b582faSGreg Clayton SBValue sb_value; 65981e871edSGreg Clayton ValueObjectSP value_sp; 6604fc6cb9cSJim Ingham Mutex::Locker api_locker; 6614fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 6624fc6cb9cSJim Ingham 663d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 664d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 665d9e416c0SGreg Clayton if (frame && target && name && name[0]) 66630fdc8d8SChris Lattner { 6677fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6687fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 6697fdf9ef1SGreg Clayton { 67069b582faSGreg Clayton switch (value_type) 67130fdc8d8SChris Lattner { 67269b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 67369b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 67469b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 67569b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 67669b582faSGreg Clayton { 677d9e416c0SGreg Clayton VariableList *variable_list = frame->GetVariableList(true); 67872eff18aSGreg Clayton 679d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 68072eff18aSGreg Clayton 68172eff18aSGreg Clayton const bool can_create = true; 68272eff18aSGreg Clayton const bool get_parent_variables = true; 68372eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 68472eff18aSGreg Clayton 68572eff18aSGreg Clayton if (sc.block && sc.block->AppendVariables (can_create, 68672eff18aSGreg Clayton get_parent_variables, 68772eff18aSGreg Clayton stop_if_block_is_inlined_function, 688e85d9cb8SJohnny Chen variable_list)) 689beae523aSJohnny Chen { 69069b582faSGreg Clayton ConstString const_name(name); 691e85d9cb8SJohnny Chen const uint32_t num_variables = variable_list->GetSize(); 69272eff18aSGreg Clayton for (uint32_t i = 0; i < num_variables; ++i) 69330fdc8d8SChris Lattner { 69469b582faSGreg Clayton VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 69569b582faSGreg Clayton if (variable_sp && 69669b582faSGreg Clayton variable_sp->GetScope() == value_type && 69769b582faSGreg Clayton variable_sp->GetName() == const_name) 698beae523aSJohnny Chen { 699d9e416c0SGreg Clayton value_sp = frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic); 70081e871edSGreg Clayton sb_value.SetSP (value_sp); 701beae523aSJohnny Chen break; 702beae523aSJohnny Chen } 70330fdc8d8SChris Lattner } 70430fdc8d8SChris Lattner } 70530fdc8d8SChris Lattner } 70669b582faSGreg Clayton break; 70769b582faSGreg Clayton 70869b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 70969b582faSGreg Clayton { 710d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 71169b582faSGreg Clayton if (reg_ctx) 71269b582faSGreg Clayton { 71369b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 71469b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 71569b582faSGreg Clayton { 71669b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 71769b582faSGreg Clayton if (reg_info && 71869b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 71969b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 72069b582faSGreg Clayton { 721d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 72281e871edSGreg Clayton sb_value.SetSP (value_sp); 72381e871edSGreg Clayton break; 72469b582faSGreg Clayton } 72569b582faSGreg Clayton } 72669b582faSGreg Clayton } 72769b582faSGreg Clayton } 72869b582faSGreg Clayton break; 72969b582faSGreg Clayton 73069b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 73169b582faSGreg Clayton { 732d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 73369b582faSGreg Clayton if (reg_ctx) 73469b582faSGreg Clayton { 73569b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 73669b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 73769b582faSGreg Clayton { 73869b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 73969b582faSGreg Clayton if (reg_set && 74069b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 74169b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 74269b582faSGreg Clayton { 743d9e416c0SGreg Clayton value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx); 74481e871edSGreg Clayton sb_value.SetSP (value_sp); 74581e871edSGreg Clayton break; 74669b582faSGreg Clayton } 74769b582faSGreg Clayton } 74869b582faSGreg Clayton } 74969b582faSGreg Clayton } 75069b582faSGreg Clayton break; 75169b582faSGreg Clayton 75269b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 75369b582faSGreg Clayton { 75469b582faSGreg Clayton ConstString const_name(name); 755d9e416c0SGreg Clayton ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name)); 75669b582faSGreg Clayton if (expr_var_sp) 75781e871edSGreg Clayton { 75881e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 75981e871edSGreg Clayton sb_value.SetSP (value_sp); 76081e871edSGreg Clayton } 76169b582faSGreg Clayton } 76269b582faSGreg Clayton break; 76369b582faSGreg Clayton 76469b582faSGreg Clayton default: 76569b582faSGreg Clayton break; 76669b582faSGreg Clayton } 767beae523aSJohnny Chen } 768c9858e4dSGreg Clayton else 769c9858e4dSGreg Clayton { 770c9858e4dSGreg Clayton if (log) 771c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::FindValue () => error: process is running", frame); 772c9858e4dSGreg Clayton } 7737fdf9ef1SGreg Clayton } 774dde9cff3SCaroline Tice 7754838131bSGreg Clayton if (log) 77669b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 777d9e416c0SGreg Clayton frame, name, value_type, value_sp.get()); 7784838131bSGreg Clayton 7794838131bSGreg Clayton 780dde9cff3SCaroline Tice return sb_value; 781dde9cff3SCaroline Tice } 782dde9cff3SCaroline Tice 78330fdc8d8SChris Lattner bool 78435e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const 78535e2ab60SJohnny Chen { 78635e2ab60SJohnny Chen lldb::StackFrameSP this_sp = GetFrameSP(); 78735e2ab60SJohnny Chen lldb::StackFrameSP that_sp = that.GetFrameSP(); 78835e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 78935e2ab60SJohnny Chen } 79035e2ab60SJohnny Chen 79135e2ab60SJohnny Chen bool 79230fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 79330fdc8d8SChris Lattner { 79435e2ab60SJohnny Chen return IsEqual(rhs); 79530fdc8d8SChris Lattner } 79630fdc8d8SChris Lattner 79730fdc8d8SChris Lattner bool 79830fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 79930fdc8d8SChris Lattner { 80035e2ab60SJohnny Chen return !IsEqual(rhs); 801481cef25SGreg Clayton } 80230fdc8d8SChris Lattner 80330fdc8d8SChris Lattner SBThread 80430fdc8d8SChris Lattner SBFrame::GetThread () const 80530fdc8d8SChris Lattner { 80669b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 807ceb6b139SCaroline Tice 8087fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 809d9e416c0SGreg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 810d9e416c0SGreg Clayton SBThread sb_thread (thread_sp); 811ceb6b139SCaroline Tice 812ceb6b139SCaroline Tice if (log) 813750cd175SCaroline Tice { 814750cd175SCaroline Tice SBStream sstr; 815750cd175SCaroline Tice sb_thread.GetDescription (sstr); 816d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", 817d9e416c0SGreg Clayton exe_ctx.GetFramePtr(), 818d9e416c0SGreg Clayton thread_sp.get(), 819d9e416c0SGreg Clayton sstr.GetData()); 820750cd175SCaroline Tice } 821ceb6b139SCaroline Tice 82230fdc8d8SChris Lattner return sb_thread; 82330fdc8d8SChris Lattner } 82430fdc8d8SChris Lattner 82530fdc8d8SChris Lattner const char * 82630fdc8d8SChris Lattner SBFrame::Disassemble () const 82730fdc8d8SChris Lattner { 828c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8294838131bSGreg Clayton const char *disassembly = NULL; 8304fc6cb9cSJim Ingham Mutex::Locker api_locker; 8314fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 8324fc6cb9cSJim Ingham 833d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 834d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 835d9e416c0SGreg Clayton if (frame && target) 836af67cecdSGreg Clayton { 8377fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8387fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 8397fdf9ef1SGreg Clayton { 840d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 841af67cecdSGreg Clayton } 842c9858e4dSGreg Clayton else 843c9858e4dSGreg Clayton { 844c9858e4dSGreg Clayton if (log) 845c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => error: process is running", frame); 8467fdf9ef1SGreg Clayton } 847c9858e4dSGreg Clayton } 8484838131bSGreg Clayton 8494838131bSGreg Clayton if (log) 850d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly); 8514838131bSGreg Clayton 8524838131bSGreg Clayton return disassembly; 85330fdc8d8SChris Lattner } 85430fdc8d8SChris Lattner 85530fdc8d8SChris Lattner 85630fdc8d8SChris Lattner SBValueList 85730fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 85830fdc8d8SChris Lattner bool locals, 85930fdc8d8SChris Lattner bool statics, 86030fdc8d8SChris Lattner bool in_scope_only) 86130fdc8d8SChris Lattner { 862316d498bSGreg Clayton SBValueList value_list; 8637fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 864d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 865d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 866d9e416c0SGreg Clayton if (frame && target) 867316d498bSGreg Clayton { 868d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 869316d498bSGreg Clayton value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic); 870316d498bSGreg Clayton } 871316d498bSGreg Clayton return value_list; 87278a685aaSJim Ingham } 87378a685aaSJim Ingham 87478a685aaSJim Ingham SBValueList 87578a685aaSJim Ingham SBFrame::GetVariables (bool arguments, 87678a685aaSJim Ingham bool locals, 87778a685aaSJim Ingham bool statics, 87878a685aaSJim Ingham bool in_scope_only, 8792837b766SJim Ingham lldb::DynamicValueType use_dynamic) 88078a685aaSJim Ingham { 88169b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 882ceb6b139SCaroline Tice 883b9556accSGreg Clayton SBValueList value_list; 8844fc6cb9cSJim Ingham Mutex::Locker api_locker; 8854fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 8864fc6cb9cSJim Ingham 887d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 888d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 889b9556accSGreg Clayton 890ceb6b139SCaroline Tice if (log) 8914838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 892d9e416c0SGreg Clayton frame, 8934838131bSGreg Clayton arguments, 8944838131bSGreg Clayton locals, 8954838131bSGreg Clayton statics, 8964838131bSGreg Clayton in_scope_only); 897ceb6b139SCaroline Tice 898d9e416c0SGreg Clayton if (frame && target) 89930fdc8d8SChris Lattner { 9007fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9017fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 9027fdf9ef1SGreg Clayton { 903af67cecdSGreg Clayton 90430fdc8d8SChris Lattner size_t i; 905af67cecdSGreg Clayton VariableList *variable_list = NULL; 906d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 90730fdc8d8SChris Lattner if (variable_list) 90830fdc8d8SChris Lattner { 90930fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 91030fdc8d8SChris Lattner if (num_variables) 91130fdc8d8SChris Lattner { 91230fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 91330fdc8d8SChris Lattner { 91430fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 91530fdc8d8SChris Lattner if (variable_sp) 91630fdc8d8SChris Lattner { 91730fdc8d8SChris Lattner bool add_variable = false; 91830fdc8d8SChris Lattner switch (variable_sp->GetScope()) 91930fdc8d8SChris Lattner { 92030fdc8d8SChris Lattner case eValueTypeVariableGlobal: 92130fdc8d8SChris Lattner case eValueTypeVariableStatic: 92230fdc8d8SChris Lattner add_variable = statics; 92330fdc8d8SChris Lattner break; 92430fdc8d8SChris Lattner 92530fdc8d8SChris Lattner case eValueTypeVariableArgument: 92630fdc8d8SChris Lattner add_variable = arguments; 92730fdc8d8SChris Lattner break; 92830fdc8d8SChris Lattner 92930fdc8d8SChris Lattner case eValueTypeVariableLocal: 93030fdc8d8SChris Lattner add_variable = locals; 93130fdc8d8SChris Lattner break; 932c982c768SGreg Clayton 933c982c768SGreg Clayton default: 934c982c768SGreg Clayton break; 93530fdc8d8SChris Lattner } 93630fdc8d8SChris Lattner if (add_variable) 93730fdc8d8SChris Lattner { 938d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 93930fdc8d8SChris Lattner continue; 94030fdc8d8SChris Lattner 941d9e416c0SGreg Clayton value_list.Append(frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic)); 94230fdc8d8SChris Lattner } 94330fdc8d8SChris Lattner } 94430fdc8d8SChris Lattner } 94530fdc8d8SChris Lattner } 94630fdc8d8SChris Lattner } 94730fdc8d8SChris Lattner } 948c9858e4dSGreg Clayton else 949c9858e4dSGreg Clayton { 950c9858e4dSGreg Clayton if (log) 951c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables () => error: process is running", frame); 952c9858e4dSGreg Clayton } 9537fdf9ef1SGreg Clayton } 954ceb6b139SCaroline Tice 955ceb6b139SCaroline Tice if (log) 956ceb6b139SCaroline Tice { 957d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame, 958750cd175SCaroline Tice value_list.get()); 959ceb6b139SCaroline Tice } 960ceb6b139SCaroline Tice 96130fdc8d8SChris Lattner return value_list; 96230fdc8d8SChris Lattner } 96330fdc8d8SChris Lattner 96469b582faSGreg Clayton SBValueList 96530fdc8d8SChris Lattner SBFrame::GetRegisters () 96630fdc8d8SChris Lattner { 96769b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 968ceb6b139SCaroline Tice 96930fdc8d8SChris Lattner SBValueList value_list; 9704fc6cb9cSJim Ingham Mutex::Locker api_locker; 9714fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 9724fc6cb9cSJim Ingham 973d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 974d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 975d9e416c0SGreg Clayton if (frame && target) 97630fdc8d8SChris Lattner { 9777fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9787fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 9797fdf9ef1SGreg Clayton { 980d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 98130fdc8d8SChris Lattner if (reg_ctx) 98230fdc8d8SChris Lattner { 98330fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 98430fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 98530fdc8d8SChris Lattner { 986d9e416c0SGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); 98730fdc8d8SChris Lattner } 98830fdc8d8SChris Lattner } 98930fdc8d8SChris Lattner } 990c9858e4dSGreg Clayton else 991c9858e4dSGreg Clayton { 992c9858e4dSGreg Clayton if (log) 993c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetRegisters () => error: process is running", frame); 994c9858e4dSGreg Clayton } 9957fdf9ef1SGreg Clayton } 996ceb6b139SCaroline Tice 997ceb6b139SCaroline Tice if (log) 998c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.get()); 999ceb6b139SCaroline Tice 100030fdc8d8SChris Lattner return value_list; 100130fdc8d8SChris Lattner } 100230fdc8d8SChris Lattner 1003dde9cff3SCaroline Tice bool 1004dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 1005dde9cff3SCaroline Tice { 1006da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1007da7bc7d0SGreg Clayton 10084fc6cb9cSJim Ingham Mutex::Locker api_locker; 10094fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10104fc6cb9cSJim Ingham 1011d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1012d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1013d9e416c0SGreg Clayton if (frame && target) 1014dde9cff3SCaroline Tice { 10157fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10167fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 10177fdf9ef1SGreg Clayton { 1018d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 1019dde9cff3SCaroline Tice } 1020c9858e4dSGreg Clayton else 1021c9858e4dSGreg Clayton { 1022c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1023c9858e4dSGreg Clayton if (log) 1024c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetDescription () => error: process is running", frame); 1025c9858e4dSGreg Clayton } 1026c9858e4dSGreg Clayton 10277fdf9ef1SGreg Clayton } 1028dde9cff3SCaroline Tice else 1029da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1030dde9cff3SCaroline Tice 1031dde9cff3SCaroline Tice return true; 1032dde9cff3SCaroline Tice } 10331d3afba3SGreg Clayton 103469b582faSGreg Clayton SBValue 10351d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 10361d3afba3SGreg Clayton { 1037316d498bSGreg Clayton SBValue result; 10387fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1039d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1040d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1041d9e416c0SGreg Clayton if (frame && target) 1042316d498bSGreg Clayton { 1043d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 1044316d498bSGreg Clayton result = EvaluateExpression (expr, use_dynamic); 1045316d498bSGreg Clayton } 1046316d498bSGreg Clayton return result; 104778a685aaSJim Ingham } 104878a685aaSJim Ingham 104978a685aaSJim Ingham SBValue 10502837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 105178a685aaSJim Ingham { 10527ba6e991SJim Ingham return EvaluateExpression (expr, fetch_dynamic_value, true); 10537ba6e991SJim Ingham } 10547ba6e991SJim Ingham 10557ba6e991SJim Ingham SBValue 10567ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error) 10577ba6e991SJim Ingham { 105869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 10594838131bSGreg Clayton 106069b582faSGreg Clayton LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1061a162ebafSSean Callanan 106223f59509SGreg Clayton ExecutionResults exe_results = eExecutionSetupError; 106369b582faSGreg Clayton SBValue expr_result; 106481e871edSGreg Clayton ValueObjectSP expr_value_sp; 10654838131bSGreg Clayton 10664fc6cb9cSJim Ingham Mutex::Locker api_locker; 10674fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10684fc6cb9cSJim Ingham 1069d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1070d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1071b9556accSGreg Clayton if (log) 1072d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame, expr); 1073b9556accSGreg Clayton 1074d9e416c0SGreg Clayton if (frame && target) 10751d3afba3SGreg Clayton { 10767fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10777fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 10787fdf9ef1SGreg Clayton { 1079de4ca5b7SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 10801ba7c4d0SGreg Clayton StreamString frame_description; 1081d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 10821ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 10831ba7c4d0SGreg Clayton expr, fetch_dynamic_value, frame_description.GetString().c_str()); 1084de4ca5b7SEnrico Granata #endif 1085*d4439aa9SEnrico Granata Target::EvaluateExpressionOptions options; 1086*d4439aa9SEnrico Granata options.SetUnwindOnError(unwind_on_error) 1087*d4439aa9SEnrico Granata .SetUseDynamic(fetch_dynamic_value); 1088322f529bSSean Callanan 1089d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 1090d9e416c0SGreg Clayton frame, 1091*d4439aa9SEnrico Granata expr_value_sp, 1092*d4439aa9SEnrico Granata options); 109381e871edSGreg Clayton expr_result.SetSP(expr_value_sp); 1094de4ca5b7SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1095f49e65aeSGreg Clayton Host::SetCrashDescription (NULL); 1096de4ca5b7SEnrico Granata #endif 10971d3afba3SGreg Clayton } 1098c9858e4dSGreg Clayton else 1099c9858e4dSGreg Clayton { 1100c9858e4dSGreg Clayton if (log) 1101c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression () => error: process is running", frame); 1102c9858e4dSGreg Clayton } 11037fdf9ef1SGreg Clayton } 11044838131bSGreg Clayton 1105cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1106a162ebafSSean Callanan if (expr_log) 110778a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 1108fe42ac4dSGreg Clayton expr_result.GetValue(), 1109fe42ac4dSGreg Clayton expr_result.GetSummary()); 1110a162ebafSSean Callanan 11114838131bSGreg Clayton if (log) 1112d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 1113d9e416c0SGreg Clayton frame, 111478a685aaSJim Ingham expr, 111581e871edSGreg Clayton expr_value_sp.get(), 111625f3a3cdSJohnny Chen exe_results); 1117cf7e2dc0SJason Molenda #endif 11184838131bSGreg Clayton 1119cfd1acedSGreg Clayton return expr_result; 11201d3afba3SGreg Clayton } 1121316d498bSGreg Clayton 1122316d498bSGreg Clayton bool 1123316d498bSGreg Clayton SBFrame::IsInlined() 1124316d498bSGreg Clayton { 11257fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1126d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1127d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1128d9e416c0SGreg Clayton if (frame && target) 1129316d498bSGreg Clayton { 11307fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11317fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 11327fdf9ef1SGreg Clayton { 11337fdf9ef1SGreg Clayton 1134d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1135316d498bSGreg Clayton if (block) 1136316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 1137316d498bSGreg Clayton } 1138c9858e4dSGreg Clayton else 1139c9858e4dSGreg Clayton { 1140c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1141c9858e4dSGreg Clayton if (log) 1142c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::IsInlined () => error: process is running", frame); 1143c9858e4dSGreg Clayton } 1144c9858e4dSGreg Clayton 11457fdf9ef1SGreg Clayton } 1146316d498bSGreg Clayton return false; 1147316d498bSGreg Clayton } 1148316d498bSGreg Clayton 1149316d498bSGreg Clayton const char * 1150316d498bSGreg Clayton SBFrame::GetFunctionName() 1151316d498bSGreg Clayton { 1152316d498bSGreg Clayton const char *name = NULL; 11537fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1154d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1155d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1156d9e416c0SGreg Clayton if (frame && target) 1157316d498bSGreg Clayton { 11587fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11597fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 11607fdf9ef1SGreg Clayton { 1161d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1162316d498bSGreg Clayton if (sc.block) 1163316d498bSGreg Clayton { 1164316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1165316d498bSGreg Clayton if (inlined_block) 1166316d498bSGreg Clayton { 1167316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1168316d498bSGreg Clayton name = inlined_info->GetName().AsCString(); 1169316d498bSGreg Clayton } 1170316d498bSGreg Clayton } 1171316d498bSGreg Clayton 1172316d498bSGreg Clayton if (name == NULL) 1173316d498bSGreg Clayton { 1174316d498bSGreg Clayton if (sc.function) 1175316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1176316d498bSGreg Clayton } 1177316d498bSGreg Clayton 1178316d498bSGreg Clayton if (name == NULL) 1179316d498bSGreg Clayton { 1180316d498bSGreg Clayton if (sc.symbol) 1181316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1182316d498bSGreg Clayton } 1183316d498bSGreg Clayton } 1184c9858e4dSGreg Clayton else 1185c9858e4dSGreg Clayton { 1186c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1187c9858e4dSGreg Clayton if (log) 1188c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFunctionName() => error: process is running", frame); 1189c9858e4dSGreg Clayton 1190c9858e4dSGreg Clayton } 11917fdf9ef1SGreg Clayton } 1192316d498bSGreg Clayton return name; 1193316d498bSGreg Clayton } 1194316d498bSGreg Clayton 1195