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" 24*af0f45f1SZachary Turner #include "lldb/Expression/ClangPersistentVariables.h" 25b71f3844SGreg Clayton #include "lldb/Expression/ClangUserExpression.h" 261ba7c4d0SGreg Clayton #include "lldb/Host/Host.h" 2730fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 281f746071SGreg Clayton #include "lldb/Symbol/Function.h" 291f746071SGreg Clayton #include "lldb/Symbol/Symbol.h" 3030fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 3130fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h" 3230fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h" 3330fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h" 3430fdc8d8SChris Lattner #include "lldb/Target/Target.h" 3530fdc8d8SChris Lattner #include "lldb/Target/Process.h" 3630fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 37b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h" 38b9556accSGreg Clayton #include "lldb/Target/StackID.h" 3930fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 4030fdc8d8SChris Lattner 414c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 424c5de699SEli Friedman #include "lldb/API/SBValue.h" 434c5de699SEli Friedman #include "lldb/API/SBAddress.h" 4435e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h" 45dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 464c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h" 474c5de699SEli Friedman #include "lldb/API/SBThread.h" 4851f96eebSZachary Turner #include "lldb/API/SBVariablesOptions.h" 4930fdc8d8SChris Lattner 5030fdc8d8SChris Lattner using namespace lldb; 5130fdc8d8SChris Lattner using namespace lldb_private; 5230fdc8d8SChris Lattner 53b9556accSGreg Clayton 5430fdc8d8SChris Lattner SBFrame::SBFrame () : 557fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef()) 5630fdc8d8SChris Lattner { 5730fdc8d8SChris Lattner } 5830fdc8d8SChris Lattner 59b57e4a1bSJason Molenda SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) : 607fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (lldb_object_sp)) 6130fdc8d8SChris Lattner { 625160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 63ceb6b139SCaroline Tice 64ceb6b139SCaroline Tice if (log) 65ceb6b139SCaroline Tice { 66ceb6b139SCaroline Tice SBStream sstr; 67ceb6b139SCaroline Tice GetDescription (sstr); 684838131bSGreg Clayton log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s", 69324a1036SSaleem Abdulrasool static_cast<void*>(lldb_object_sp.get()), 70324a1036SSaleem Abdulrasool static_cast<void*>(lldb_object_sp.get()), sstr.GetData()); 71ceb6b139SCaroline Tice } 7230fdc8d8SChris Lattner } 7330fdc8d8SChris Lattner 74efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) : 757fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp)) 76efabb123SGreg Clayton { 77efabb123SGreg Clayton } 78efabb123SGreg Clayton 79efabb123SGreg Clayton const SBFrame & 80efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs) 81efabb123SGreg Clayton { 82efabb123SGreg Clayton if (this != &rhs) 837fdf9ef1SGreg Clayton *m_opaque_sp = *rhs.m_opaque_sp; 84efabb123SGreg Clayton return *this; 85efabb123SGreg Clayton } 86efabb123SGreg Clayton 8730fdc8d8SChris Lattner SBFrame::~SBFrame() 8830fdc8d8SChris Lattner { 8930fdc8d8SChris Lattner } 9030fdc8d8SChris Lattner 91b57e4a1bSJason Molenda StackFrameSP 92b9556accSGreg Clayton SBFrame::GetFrameSP() const 93b9556accSGreg Clayton { 94af2589eaSGreg Clayton if (m_opaque_sp) 957fdf9ef1SGreg Clayton return m_opaque_sp->GetFrameSP(); 96b57e4a1bSJason Molenda return StackFrameSP(); 97b9556accSGreg Clayton } 9830fdc8d8SChris Lattner 9930fdc8d8SChris Lattner void 100b57e4a1bSJason Molenda SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp) 10130fdc8d8SChris Lattner { 1027fdf9ef1SGreg Clayton return m_opaque_sp->SetFrameSP(lldb_object_sp); 103b9556accSGreg Clayton } 10430fdc8d8SChris Lattner 10530fdc8d8SChris Lattner bool 10630fdc8d8SChris Lattner SBFrame::IsValid() const 10730fdc8d8SChris Lattner { 1087fdf9ef1SGreg Clayton return GetFrameSP().get() != NULL; 10930fdc8d8SChris Lattner } 11030fdc8d8SChris Lattner 11130fdc8d8SChris Lattner SBSymbolContext 11230fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const 11330fdc8d8SChris Lattner { 1145160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 11530fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 1164fc6cb9cSJim Ingham Mutex::Locker api_locker; 1174fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1184fc6cb9cSJim Ingham 119b57e4a1bSJason Molenda StackFrame *frame = NULL; 120d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1217730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1227730b9a4SJim Ingham if (target && process) 123af67cecdSGreg Clayton { 1247fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1257730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 1267730b9a4SJim Ingham { 1277730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1287730b9a4SJim Ingham if (frame) 1297fdf9ef1SGreg Clayton { 130d9e416c0SGreg Clayton sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope)); 131af67cecdSGreg Clayton } 132c9858e4dSGreg Clayton else 133c9858e4dSGreg Clayton { 134c9858e4dSGreg Clayton if (log) 1357730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame."); 1367730b9a4SJim Ingham } 1377730b9a4SJim Ingham } 1387730b9a4SJim Ingham else 1397730b9a4SJim Ingham { 1407730b9a4SJim Ingham if (log) 1417730b9a4SJim Ingham log->Printf ("SBFrame::GetSymbolContext () => error: process is running"); 142c9858e4dSGreg Clayton } 1437fdf9ef1SGreg Clayton } 144ceb6b139SCaroline Tice 145ceb6b139SCaroline Tice if (log) 1464838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)", 147324a1036SSaleem Abdulrasool static_cast<void*>(frame), resolve_scope, 148324a1036SSaleem Abdulrasool static_cast<void*>(sb_sym_ctx.get())); 149ceb6b139SCaroline Tice 15030fdc8d8SChris Lattner return sb_sym_ctx; 15130fdc8d8SChris Lattner } 15230fdc8d8SChris Lattner 15330fdc8d8SChris Lattner SBModule 15430fdc8d8SChris Lattner SBFrame::GetModule () const 15530fdc8d8SChris Lattner { 1565160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 15772eff18aSGreg Clayton SBModule sb_module; 158acdbe816SGreg Clayton ModuleSP module_sp; 1594fc6cb9cSJim Ingham Mutex::Locker api_locker; 1604fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1614fc6cb9cSJim Ingham 162b57e4a1bSJason Molenda StackFrame *frame = NULL; 163d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1647730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1657730b9a4SJim Ingham if (target && process) 166af67cecdSGreg Clayton { 1677fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1687730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 1697730b9a4SJim Ingham { 1707730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1717730b9a4SJim Ingham if (frame) 1727fdf9ef1SGreg Clayton { 173d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp; 174acdbe816SGreg Clayton sb_module.SetSP (module_sp); 175af67cecdSGreg Clayton } 176c9858e4dSGreg Clayton else 177c9858e4dSGreg Clayton { 178c9858e4dSGreg Clayton if (log) 1797730b9a4SJim Ingham log->Printf ("SBFrame::GetModule () => error: could not reconstruct frame object for this SBFrame."); 1807730b9a4SJim Ingham } 1817730b9a4SJim Ingham } 1827730b9a4SJim Ingham else 1837730b9a4SJim Ingham { 1847730b9a4SJim Ingham if (log) 1857730b9a4SJim Ingham log->Printf ("SBFrame::GetModule () => error: process is running"); 186c9858e4dSGreg Clayton } 1877fdf9ef1SGreg Clayton } 18872eff18aSGreg Clayton 1894838131bSGreg Clayton if (log) 1904838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)", 191324a1036SSaleem Abdulrasool static_cast<void*>(frame), 192324a1036SSaleem Abdulrasool static_cast<void*>(module_sp.get())); 1934838131bSGreg Clayton 19430fdc8d8SChris Lattner return sb_module; 19530fdc8d8SChris Lattner } 19630fdc8d8SChris Lattner 19730fdc8d8SChris Lattner SBCompileUnit 19830fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 19930fdc8d8SChris Lattner { 2005160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 20172eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 2024fc6cb9cSJim Ingham Mutex::Locker api_locker; 2034fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2044fc6cb9cSJim Ingham 205b57e4a1bSJason Molenda StackFrame *frame = NULL; 206d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2077730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 2087730b9a4SJim Ingham if (target && process) 209af67cecdSGreg Clayton { 2107fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2117730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 2127730b9a4SJim Ingham { 2137730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 2147730b9a4SJim Ingham if (frame) 2157fdf9ef1SGreg Clayton { 216d9e416c0SGreg Clayton sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 217af67cecdSGreg Clayton } 218c9858e4dSGreg Clayton else 219c9858e4dSGreg Clayton { 220ceb6b139SCaroline Tice if (log) 2217730b9a4SJim Ingham log->Printf ("SBFrame::GetCompileUnit () => error: could not reconstruct frame object for this SBFrame."); 2227730b9a4SJim Ingham } 2237730b9a4SJim Ingham } 2247730b9a4SJim Ingham else 2257730b9a4SJim Ingham { 2267730b9a4SJim Ingham if (log) 2277730b9a4SJim Ingham log->Printf ("SBFrame::GetCompileUnit () => error: process is running"); 228c9858e4dSGreg Clayton } 229c9858e4dSGreg Clayton } 230c9858e4dSGreg Clayton if (log) 231c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)", 232324a1036SSaleem Abdulrasool static_cast<void*>(frame), 233324a1036SSaleem Abdulrasool static_cast<void*>(sb_comp_unit.get())); 234ceb6b139SCaroline Tice 23530fdc8d8SChris Lattner return sb_comp_unit; 23630fdc8d8SChris Lattner } 23730fdc8d8SChris Lattner 23830fdc8d8SChris Lattner SBFunction 23930fdc8d8SChris Lattner SBFrame::GetFunction () const 24030fdc8d8SChris Lattner { 2415160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 24272eff18aSGreg Clayton SBFunction sb_function; 2434fc6cb9cSJim Ingham Mutex::Locker api_locker; 2444fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2454fc6cb9cSJim Ingham 246b57e4a1bSJason Molenda StackFrame *frame = NULL; 247d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2487730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 2497730b9a4SJim Ingham if (target && process) 250af67cecdSGreg Clayton { 2517fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2527730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 2537730b9a4SJim Ingham { 2547730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 2557730b9a4SJim Ingham if (frame) 2567fdf9ef1SGreg Clayton { 257d9e416c0SGreg Clayton sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function); 258af67cecdSGreg Clayton } 259c9858e4dSGreg Clayton else 260c9858e4dSGreg Clayton { 261c9858e4dSGreg Clayton if (log) 2627730b9a4SJim Ingham log->Printf ("SBFrame::GetFunction () => error: could not reconstruct frame object for this SBFrame."); 2637730b9a4SJim Ingham } 2647730b9a4SJim Ingham } 2657730b9a4SJim Ingham else 2667730b9a4SJim Ingham { 2677730b9a4SJim Ingham if (log) 2687730b9a4SJim Ingham log->Printf ("SBFrame::GetFunction () => error: process is running"); 2697fdf9ef1SGreg Clayton } 270c9858e4dSGreg Clayton } 2714838131bSGreg Clayton if (log) 2724838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)", 273324a1036SSaleem Abdulrasool static_cast<void*>(frame), 274324a1036SSaleem Abdulrasool static_cast<void*>(sb_function.get())); 2754838131bSGreg Clayton 27630fdc8d8SChris Lattner return sb_function; 27730fdc8d8SChris Lattner } 27830fdc8d8SChris Lattner 2793b06557eSGreg Clayton SBSymbol 2803b06557eSGreg Clayton SBFrame::GetSymbol () const 2813b06557eSGreg Clayton { 2825160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 28372eff18aSGreg Clayton SBSymbol sb_symbol; 2844fc6cb9cSJim Ingham Mutex::Locker api_locker; 2854fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2864fc6cb9cSJim Ingham 287b57e4a1bSJason Molenda StackFrame *frame = NULL; 288d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2897730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 2907730b9a4SJim Ingham if (target && process) 291af67cecdSGreg Clayton { 2927fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2937730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 2947730b9a4SJim Ingham { 2957730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 2967730b9a4SJim Ingham if (frame) 2977fdf9ef1SGreg Clayton { 298d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol); 299af67cecdSGreg Clayton } 300c9858e4dSGreg Clayton else 301c9858e4dSGreg Clayton { 302c9858e4dSGreg Clayton if (log) 3037730b9a4SJim Ingham log->Printf ("SBFrame::GetSymbol () => error: could not reconstruct frame object for this SBFrame."); 3047730b9a4SJim Ingham } 3057730b9a4SJim Ingham } 3067730b9a4SJim Ingham else 3077730b9a4SJim Ingham { 3087730b9a4SJim Ingham if (log) 3097730b9a4SJim Ingham log->Printf ("SBFrame::GetSymbol () => error: process is running"); 3107fdf9ef1SGreg Clayton } 311c9858e4dSGreg Clayton } 3124838131bSGreg Clayton if (log) 3134838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 314324a1036SSaleem Abdulrasool static_cast<void*>(frame), 315324a1036SSaleem Abdulrasool static_cast<void*>(sb_symbol.get())); 3163b06557eSGreg Clayton return sb_symbol; 3173b06557eSGreg Clayton } 3183b06557eSGreg Clayton 31930fdc8d8SChris Lattner SBBlock 32030fdc8d8SChris Lattner SBFrame::GetBlock () const 32130fdc8d8SChris Lattner { 3225160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 32372eff18aSGreg Clayton SBBlock sb_block; 3244fc6cb9cSJim Ingham Mutex::Locker api_locker; 3254fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3264fc6cb9cSJim Ingham 327b57e4a1bSJason Molenda StackFrame *frame = NULL; 328d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3297730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 3307730b9a4SJim Ingham if (target && process) 331af67cecdSGreg Clayton { 3327fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3337730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 3347730b9a4SJim Ingham { 3357730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 3367730b9a4SJim Ingham if (frame) 3377fdf9ef1SGreg Clayton { 338d9e416c0SGreg Clayton sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block); 339af67cecdSGreg Clayton } 340c9858e4dSGreg Clayton else 341c9858e4dSGreg Clayton { 342c9858e4dSGreg Clayton if (log) 3437730b9a4SJim Ingham log->Printf ("SBFrame::GetBlock () => error: could not reconstruct frame object for this SBFrame."); 3447730b9a4SJim Ingham } 3457730b9a4SJim Ingham } 3467730b9a4SJim Ingham else 3477730b9a4SJim Ingham { 3487730b9a4SJim Ingham if (log) 349324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", 350324a1036SSaleem Abdulrasool static_cast<void*>(frame)); 3517fdf9ef1SGreg Clayton } 352c9858e4dSGreg Clayton } 3534838131bSGreg Clayton if (log) 3544838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)", 355324a1036SSaleem Abdulrasool static_cast<void*>(frame), 356324a1036SSaleem Abdulrasool static_cast<void*>(sb_block.GetPtr())); 35730fdc8d8SChris Lattner return sb_block; 35830fdc8d8SChris Lattner } 35930fdc8d8SChris Lattner 36095897c6aSGreg Clayton SBBlock 36195897c6aSGreg Clayton SBFrame::GetFrameBlock () const 36295897c6aSGreg Clayton { 36372eff18aSGreg Clayton SBBlock sb_block; 3644fc6cb9cSJim Ingham Mutex::Locker api_locker; 3654fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3664fc6cb9cSJim Ingham 367b57e4a1bSJason Molenda StackFrame *frame = NULL; 368d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3695160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3707730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 3717730b9a4SJim Ingham if (target && process) 372af67cecdSGreg Clayton { 3737fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3747730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 3757730b9a4SJim Ingham { 3767730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 3777730b9a4SJim Ingham if (frame) 3787fdf9ef1SGreg Clayton { 379d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock ()); 380af67cecdSGreg Clayton } 381c9858e4dSGreg Clayton else 382c9858e4dSGreg Clayton { 383c9858e4dSGreg Clayton if (log) 3847730b9a4SJim Ingham log->Printf ("SBFrame::GetFrameBlock () => error: could not reconstruct frame object for this SBFrame."); 3857730b9a4SJim Ingham } 3867730b9a4SJim Ingham } 3877730b9a4SJim Ingham else 3887730b9a4SJim Ingham { 3897730b9a4SJim Ingham if (log) 3907730b9a4SJim Ingham log->Printf ("SBFrame::GetFrameBlock () => error: process is running"); 3917fdf9ef1SGreg Clayton } 392c9858e4dSGreg Clayton } 3934838131bSGreg Clayton if (log) 3944838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 395324a1036SSaleem Abdulrasool static_cast<void*>(frame), 396324a1036SSaleem Abdulrasool static_cast<void*>(sb_block.GetPtr())); 39795897c6aSGreg Clayton return sb_block; 39895897c6aSGreg Clayton } 39995897c6aSGreg Clayton 40030fdc8d8SChris Lattner SBLineEntry 40130fdc8d8SChris Lattner SBFrame::GetLineEntry () const 40230fdc8d8SChris Lattner { 4035160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 40472eff18aSGreg Clayton SBLineEntry sb_line_entry; 4054fc6cb9cSJim Ingham Mutex::Locker api_locker; 4064fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4074fc6cb9cSJim Ingham 408b57e4a1bSJason Molenda StackFrame *frame = NULL; 409d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4107730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 4117730b9a4SJim Ingham if (target && process) 412af67cecdSGreg Clayton { 4137fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4147730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 4157730b9a4SJim Ingham { 4167730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 4177730b9a4SJim Ingham if (frame) 4187fdf9ef1SGreg Clayton { 419d9e416c0SGreg Clayton sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry); 420af67cecdSGreg Clayton } 421c9858e4dSGreg Clayton else 422c9858e4dSGreg Clayton { 423c9858e4dSGreg Clayton if (log) 4247730b9a4SJim Ingham log->Printf ("SBFrame::GetLineEntry () => error: could not reconstruct frame object for this SBFrame."); 4257730b9a4SJim Ingham } 4267730b9a4SJim Ingham } 4277730b9a4SJim Ingham else 4287730b9a4SJim Ingham { 4297730b9a4SJim Ingham if (log) 4307730b9a4SJim Ingham log->Printf ("SBFrame::GetLineEntry () => error: process is running"); 4317fdf9ef1SGreg Clayton } 432c9858e4dSGreg Clayton } 4334838131bSGreg Clayton if (log) 4344838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 435324a1036SSaleem Abdulrasool static_cast<void*>(frame), 436324a1036SSaleem Abdulrasool static_cast<void*>(sb_line_entry.get())); 43730fdc8d8SChris Lattner return sb_line_entry; 43830fdc8d8SChris Lattner } 43930fdc8d8SChris Lattner 44030fdc8d8SChris Lattner uint32_t 44130fdc8d8SChris Lattner SBFrame::GetFrameID () const 44230fdc8d8SChris Lattner { 443b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 444b9556accSGreg Clayton 4457fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 446b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 4477fdf9ef1SGreg Clayton if (frame) 448d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex (); 4494838131bSGreg Clayton 4505160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4514838131bSGreg Clayton if (log) 4524838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameID () => %u", 453324a1036SSaleem Abdulrasool static_cast<void*>(frame), frame_idx); 4544838131bSGreg Clayton return frame_idx; 45530fdc8d8SChris Lattner } 45630fdc8d8SChris Lattner 45769b582faSGreg Clayton addr_t 45830fdc8d8SChris Lattner SBFrame::GetPC () const 45930fdc8d8SChris Lattner { 4605160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 46169b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 4624fc6cb9cSJim Ingham Mutex::Locker api_locker; 4634fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4644fc6cb9cSJim Ingham 465b57e4a1bSJason Molenda StackFrame *frame = NULL; 466d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4677730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 4687730b9a4SJim Ingham if (target && process) 469af67cecdSGreg Clayton { 4707fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4717730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 4727730b9a4SJim Ingham { 4737730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 4747730b9a4SJim Ingham if (frame) 4757fdf9ef1SGreg Clayton { 476d9e416c0SGreg Clayton addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target); 477af67cecdSGreg Clayton } 478c9858e4dSGreg Clayton else 479c9858e4dSGreg Clayton { 480c9858e4dSGreg Clayton if (log) 4817730b9a4SJim Ingham log->Printf ("SBFrame::GetPC () => error: could not reconstruct frame object for this SBFrame."); 4827730b9a4SJim Ingham } 4837730b9a4SJim Ingham } 4847730b9a4SJim Ingham else 4857730b9a4SJim Ingham { 4867730b9a4SJim Ingham if (log) 4877730b9a4SJim Ingham log->Printf ("SBFrame::GetPC () => error: process is running"); 488c9858e4dSGreg Clayton } 4897fdf9ef1SGreg Clayton } 490ceb6b139SCaroline Tice 491ceb6b139SCaroline Tice if (log) 492324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetPC () => 0x%" PRIx64, 493324a1036SSaleem Abdulrasool static_cast<void*>(frame), addr); 494ceb6b139SCaroline Tice 495ceb6b139SCaroline Tice return addr; 49630fdc8d8SChris Lattner } 49730fdc8d8SChris Lattner 49830fdc8d8SChris Lattner bool 49969b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc) 50030fdc8d8SChris Lattner { 5015160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 502ceb6b139SCaroline Tice bool ret_val = false; 5034fc6cb9cSJim Ingham Mutex::Locker api_locker; 5044fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5054fc6cb9cSJim Ingham 506b57e4a1bSJason Molenda StackFrame *frame = NULL; 507d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5087730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 5097730b9a4SJim Ingham if (target && process) 510af67cecdSGreg Clayton { 5117fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5127730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 5137730b9a4SJim Ingham { 5147730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5157730b9a4SJim Ingham if (frame) 5167fdf9ef1SGreg Clayton { 517d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC (new_pc); 518af67cecdSGreg Clayton } 519c9858e4dSGreg Clayton else 520c9858e4dSGreg Clayton { 521c9858e4dSGreg Clayton if (log) 5227730b9a4SJim Ingham log->Printf ("SBFrame::SetPC () => error: could not reconstruct frame object for this SBFrame."); 5237730b9a4SJim Ingham } 5247730b9a4SJim Ingham } 5257730b9a4SJim Ingham else 5267730b9a4SJim Ingham { 5277730b9a4SJim Ingham if (log) 5287730b9a4SJim Ingham log->Printf ("SBFrame::SetPC () => error: process is running"); 529c9858e4dSGreg Clayton } 5307fdf9ef1SGreg Clayton } 531ceb6b139SCaroline Tice 532ceb6b139SCaroline Tice if (log) 533d01b2953SDaniel Malea log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i", 534324a1036SSaleem Abdulrasool static_cast<void*>(frame), new_pc, ret_val); 535ceb6b139SCaroline Tice 536ceb6b139SCaroline Tice return ret_val; 53730fdc8d8SChris Lattner } 53830fdc8d8SChris Lattner 53969b582faSGreg Clayton addr_t 54030fdc8d8SChris Lattner SBFrame::GetSP () const 54130fdc8d8SChris Lattner { 5425160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5434838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 5444fc6cb9cSJim Ingham Mutex::Locker api_locker; 5454fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5464fc6cb9cSJim Ingham 547b57e4a1bSJason Molenda StackFrame *frame = NULL; 548d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5497730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 5507730b9a4SJim Ingham if (target && process) 551af67cecdSGreg Clayton { 5527fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5537730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 5547730b9a4SJim Ingham { 5557730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5567730b9a4SJim Ingham if (frame) 5577fdf9ef1SGreg Clayton { 558d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 559af67cecdSGreg Clayton } 560c9858e4dSGreg Clayton else 561c9858e4dSGreg Clayton { 562c9858e4dSGreg Clayton if (log) 5637730b9a4SJim Ingham log->Printf ("SBFrame::GetSP () => error: could not reconstruct frame object for this SBFrame."); 5647730b9a4SJim Ingham } 5657730b9a4SJim Ingham } 5667730b9a4SJim Ingham else 5677730b9a4SJim Ingham { 5687730b9a4SJim Ingham if (log) 5697730b9a4SJim Ingham log->Printf ("SBFrame::GetSP () => error: process is running"); 5707fdf9ef1SGreg Clayton } 571c9858e4dSGreg Clayton } 5724838131bSGreg Clayton if (log) 573324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetSP () => 0x%" PRIx64, 574324a1036SSaleem Abdulrasool static_cast<void*>(frame), addr); 5754838131bSGreg Clayton 5764838131bSGreg Clayton return addr; 57730fdc8d8SChris Lattner } 57830fdc8d8SChris Lattner 57930fdc8d8SChris Lattner 58069b582faSGreg Clayton addr_t 58130fdc8d8SChris Lattner SBFrame::GetFP () const 58230fdc8d8SChris Lattner { 5835160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 58469b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 5854fc6cb9cSJim Ingham Mutex::Locker api_locker; 5864fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5874fc6cb9cSJim Ingham 588b57e4a1bSJason Molenda StackFrame *frame = NULL; 589d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5907730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 5917730b9a4SJim Ingham if (target && process) 592af67cecdSGreg Clayton { 5937fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5947730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 5957730b9a4SJim Ingham { 5967730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5977730b9a4SJim Ingham if (frame) 5987fdf9ef1SGreg Clayton { 599d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 600af67cecdSGreg Clayton } 601c9858e4dSGreg Clayton else 602c9858e4dSGreg Clayton { 603c9858e4dSGreg Clayton if (log) 6047730b9a4SJim Ingham log->Printf ("SBFrame::GetFP () => error: could not reconstruct frame object for this SBFrame."); 6057730b9a4SJim Ingham } 6067730b9a4SJim Ingham } 6077730b9a4SJim Ingham else 6087730b9a4SJim Ingham { 6097730b9a4SJim Ingham if (log) 6107730b9a4SJim Ingham log->Printf ("SBFrame::GetFP () => error: process is running"); 611c9858e4dSGreg Clayton } 6127fdf9ef1SGreg Clayton } 613ceb6b139SCaroline Tice 614ceb6b139SCaroline Tice if (log) 615324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetFP () => 0x%" PRIx64, 616324a1036SSaleem Abdulrasool static_cast<void*>(frame), addr); 617ceb6b139SCaroline Tice return addr; 61830fdc8d8SChris Lattner } 61930fdc8d8SChris Lattner 62030fdc8d8SChris Lattner 62130fdc8d8SChris Lattner SBAddress 62230fdc8d8SChris Lattner SBFrame::GetPCAddress () const 62330fdc8d8SChris Lattner { 6245160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 62530fdc8d8SChris Lattner SBAddress sb_addr; 6264fc6cb9cSJim Ingham Mutex::Locker api_locker; 6274fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 6284fc6cb9cSJim Ingham 629b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 630d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6317730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 6327730b9a4SJim Ingham if (target && process) 633af67cecdSGreg Clayton { 6347fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6357730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 6367730b9a4SJim Ingham { 6377730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 6387730b9a4SJim Ingham if (frame) 6397fdf9ef1SGreg Clayton { 640d9e416c0SGreg Clayton sb_addr.SetAddress (&frame->GetFrameCodeAddress()); 641af67cecdSGreg Clayton } 642c9858e4dSGreg Clayton else 643c9858e4dSGreg Clayton { 644c9858e4dSGreg Clayton if (log) 6457730b9a4SJim Ingham log->Printf ("SBFrame::GetPCAddress () => error: could not reconstruct frame object for this SBFrame."); 6467730b9a4SJim Ingham } 6477730b9a4SJim Ingham } 6487730b9a4SJim Ingham else 6497730b9a4SJim Ingham { 6507730b9a4SJim Ingham if (log) 6517730b9a4SJim Ingham log->Printf ("SBFrame::GetPCAddress () => error: process is running"); 6527fdf9ef1SGreg Clayton } 653c9858e4dSGreg Clayton } 6544838131bSGreg Clayton if (log) 655324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", 656324a1036SSaleem Abdulrasool static_cast<void*>(frame), 657324a1036SSaleem Abdulrasool static_cast<void*>(sb_addr.get())); 65830fdc8d8SChris Lattner return sb_addr; 65930fdc8d8SChris Lattner } 66030fdc8d8SChris Lattner 66130fdc8d8SChris Lattner void 66230fdc8d8SChris Lattner SBFrame::Clear() 66330fdc8d8SChris Lattner { 664af2589eaSGreg Clayton m_opaque_sp->Clear(); 66530fdc8d8SChris Lattner } 66630fdc8d8SChris Lattner 6677edbdfc9SGreg Clayton lldb::SBValue 6687edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path) 6697edbdfc9SGreg Clayton { 6707edbdfc9SGreg Clayton SBValue sb_value; 6717fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 672b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 673d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 674d9e416c0SGreg Clayton if (frame && target) 6757edbdfc9SGreg Clayton { 676d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 6777edbdfc9SGreg Clayton sb_value = GetValueForVariablePath (var_path, use_dynamic); 6787edbdfc9SGreg Clayton } 6797edbdfc9SGreg Clayton return sb_value; 6807edbdfc9SGreg Clayton } 6817edbdfc9SGreg Clayton 6827edbdfc9SGreg Clayton lldb::SBValue 6837edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic) 6847edbdfc9SGreg Clayton { 6857edbdfc9SGreg Clayton SBValue sb_value; 6864fc6cb9cSJim Ingham Mutex::Locker api_locker; 6875160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6887730b9a4SJim Ingham if (var_path == NULL || var_path[0] == '\0') 6897730b9a4SJim Ingham { 6907730b9a4SJim Ingham if (log) 6917730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath called with empty variable path."); 6927730b9a4SJim Ingham return sb_value; 6937730b9a4SJim Ingham } 6947730b9a4SJim Ingham 6954fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 6964fc6cb9cSJim Ingham 697b57e4a1bSJason Molenda StackFrame *frame = NULL; 698d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6997730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 7007730b9a4SJim Ingham if (target && process) 7017edbdfc9SGreg Clayton { 7027fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7037730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 7047730b9a4SJim Ingham { 7057730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 7067730b9a4SJim Ingham if (frame) 7077fdf9ef1SGreg Clayton { 7087edbdfc9SGreg Clayton VariableSP var_sp; 7097edbdfc9SGreg Clayton Error error; 710d9e416c0SGreg Clayton ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path, 711e3e91517SEnrico Granata eNoDynamicValues, 712b57e4a1bSJason Molenda StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 7137edbdfc9SGreg Clayton var_sp, 7147edbdfc9SGreg Clayton error)); 715e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 7167edbdfc9SGreg Clayton } 717c9858e4dSGreg Clayton else 718c9858e4dSGreg Clayton { 719c9858e4dSGreg Clayton if (log) 7207730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath () => error: could not reconstruct frame object for this SBFrame."); 7217730b9a4SJim Ingham } 7227730b9a4SJim Ingham } 7237730b9a4SJim Ingham else 7247730b9a4SJim Ingham { 7257730b9a4SJim Ingham if (log) 7267730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath () => error: process is running"); 727c9858e4dSGreg Clayton } 7287fdf9ef1SGreg Clayton } 7297edbdfc9SGreg Clayton return sb_value; 7307edbdfc9SGreg Clayton } 7317edbdfc9SGreg Clayton 73230fdc8d8SChris Lattner SBValue 73369b582faSGreg Clayton SBFrame::FindVariable (const char *name) 73430fdc8d8SChris Lattner { 735316d498bSGreg Clayton SBValue value; 7367fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 737b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 738d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 739d9e416c0SGreg Clayton if (frame && target) 740316d498bSGreg Clayton { 741d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 742316d498bSGreg Clayton value = FindVariable (name, use_dynamic); 743316d498bSGreg Clayton } 744316d498bSGreg Clayton return value; 74578a685aaSJim Ingham } 74678a685aaSJim Ingham 74778a685aaSJim Ingham SBValue 7482837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic) 74978a685aaSJim Ingham { 7505160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 75169b582faSGreg Clayton VariableSP var_sp; 75258b59f95SJim Ingham SBValue sb_value; 7537730b9a4SJim Ingham 7547730b9a4SJim Ingham if (name == NULL || name[0] == '\0') 7557730b9a4SJim Ingham { 7567730b9a4SJim Ingham if (log) 7577730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable called with empty name"); 7587730b9a4SJim Ingham return sb_value; 7597730b9a4SJim Ingham } 7607730b9a4SJim Ingham 76181e871edSGreg Clayton ValueObjectSP value_sp; 7624fc6cb9cSJim Ingham Mutex::Locker api_locker; 7634fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 7644fc6cb9cSJim Ingham 765b57e4a1bSJason Molenda StackFrame *frame = NULL; 766d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7677730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 7687730b9a4SJim Ingham if (target && process) 76930fdc8d8SChris Lattner { 7707fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7717730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 7727730b9a4SJim Ingham { 7737730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 7747730b9a4SJim Ingham if (frame) 7757fdf9ef1SGreg Clayton { 77669b582faSGreg Clayton VariableList variable_list; 777d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 77830fdc8d8SChris Lattner 77972eff18aSGreg Clayton if (sc.block) 78030fdc8d8SChris Lattner { 78172eff18aSGreg Clayton const bool can_create = true; 78272eff18aSGreg Clayton const bool get_parent_variables = true; 78372eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 78472eff18aSGreg Clayton 78572eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 78672eff18aSGreg Clayton get_parent_variables, 78772eff18aSGreg Clayton stop_if_block_is_inlined_function, 78872eff18aSGreg Clayton &variable_list)) 78972eff18aSGreg Clayton { 79069b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 79130fdc8d8SChris Lattner } 79272eff18aSGreg Clayton } 79330fdc8d8SChris Lattner 7944838131bSGreg Clayton if (var_sp) 79581e871edSGreg Clayton { 796e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues); 797e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 79881e871edSGreg Clayton } 7997fdf9ef1SGreg Clayton } 800c9858e4dSGreg Clayton else 801c9858e4dSGreg Clayton { 802c9858e4dSGreg Clayton if (log) 8037730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame."); 8047730b9a4SJim Ingham } 8057730b9a4SJim Ingham } 8067730b9a4SJim Ingham else 8077730b9a4SJim Ingham { 8087730b9a4SJim Ingham if (log) 8097730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable () => error: process is running"); 810c9858e4dSGreg Clayton } 811316d498bSGreg Clayton } 812316d498bSGreg Clayton 8134838131bSGreg Clayton if (log) 81469b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 815324a1036SSaleem Abdulrasool static_cast<void*>(frame), name, 816324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 8174838131bSGreg Clayton 818dde9cff3SCaroline Tice return sb_value; 819dde9cff3SCaroline Tice } 820dde9cff3SCaroline Tice 82130fdc8d8SChris Lattner SBValue 82269b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 82330fdc8d8SChris Lattner { 824316d498bSGreg Clayton SBValue value; 8257fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 826b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 827d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 828d9e416c0SGreg Clayton if (frame && target) 829316d498bSGreg Clayton { 830d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 831316d498bSGreg Clayton value = FindValue (name, value_type, use_dynamic); 832316d498bSGreg Clayton } 833316d498bSGreg Clayton return value; 83478a685aaSJim Ingham } 83578a685aaSJim Ingham 83678a685aaSJim Ingham SBValue 8372837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) 83878a685aaSJim Ingham { 8395160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 84069b582faSGreg Clayton SBValue sb_value; 8417730b9a4SJim Ingham 8427730b9a4SJim Ingham if (name == NULL || name[0] == '\0') 8437730b9a4SJim Ingham { 8447730b9a4SJim Ingham if (log) 8457730b9a4SJim Ingham log->Printf ("SBFrame::FindValue called with empty name."); 8467730b9a4SJim Ingham return sb_value; 8477730b9a4SJim Ingham } 8487730b9a4SJim Ingham 84981e871edSGreg Clayton ValueObjectSP value_sp; 8504fc6cb9cSJim Ingham Mutex::Locker api_locker; 8514fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 8524fc6cb9cSJim Ingham 853b57e4a1bSJason Molenda StackFrame *frame = NULL; 854d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 8557730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 8567730b9a4SJim Ingham if (target && process) 85730fdc8d8SChris Lattner { 8587fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8597730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 8607730b9a4SJim Ingham { 8617730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 8627730b9a4SJim Ingham if (frame) 8637fdf9ef1SGreg Clayton { 8648a2a0dfbSEnrico Granata VariableList variable_list; 8658a2a0dfbSEnrico Granata 86669b582faSGreg Clayton switch (value_type) 86730fdc8d8SChris Lattner { 86869b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 86969b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 87069b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 87169b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 87269b582faSGreg Clayton { 873d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 87472eff18aSGreg Clayton 87572eff18aSGreg Clayton const bool can_create = true; 87672eff18aSGreg Clayton const bool get_parent_variables = true; 87772eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 87872eff18aSGreg Clayton 87972eff18aSGreg Clayton if (sc.block && sc.block->AppendVariables (can_create, 88072eff18aSGreg Clayton get_parent_variables, 88172eff18aSGreg Clayton stop_if_block_is_inlined_function, 88208a04327SEnrico Granata &variable_list)) 883beae523aSJohnny Chen { 8848a2a0dfbSEnrico Granata if (value_type == eValueTypeVariableGlobal) 8858a2a0dfbSEnrico Granata { 8868a2a0dfbSEnrico Granata const bool get_file_globals = true; 8878a2a0dfbSEnrico Granata VariableList* frame_vars = frame->GetVariableList(get_file_globals); 8888a2a0dfbSEnrico Granata if (frame_vars) 8898a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 8908a2a0dfbSEnrico Granata } 89169b582faSGreg Clayton ConstString const_name(name); 89208a04327SEnrico Granata VariableSP variable_sp(variable_list.FindVariable(const_name,value_type)); 89308a04327SEnrico Granata if (variable_sp) 894beae523aSJohnny Chen { 895e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues); 896e3e91517SEnrico Granata sb_value.SetSP (value_sp, use_dynamic); 897beae523aSJohnny Chen break; 898beae523aSJohnny Chen } 89930fdc8d8SChris Lattner } 90030fdc8d8SChris Lattner } 90169b582faSGreg Clayton break; 90269b582faSGreg Clayton 90369b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 90469b582faSGreg Clayton { 905d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 90669b582faSGreg Clayton if (reg_ctx) 90769b582faSGreg Clayton { 90869b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 90969b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 91069b582faSGreg Clayton { 91169b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 91269b582faSGreg Clayton if (reg_info && 91369b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 91469b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 91569b582faSGreg Clayton { 916d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 91781e871edSGreg Clayton sb_value.SetSP (value_sp); 91881e871edSGreg Clayton break; 91969b582faSGreg Clayton } 92069b582faSGreg Clayton } 92169b582faSGreg Clayton } 92269b582faSGreg Clayton } 92369b582faSGreg Clayton break; 92469b582faSGreg Clayton 92569b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 92669b582faSGreg Clayton { 927d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 92869b582faSGreg Clayton if (reg_ctx) 92969b582faSGreg Clayton { 93069b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 93169b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 93269b582faSGreg Clayton { 93369b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 93469b582faSGreg Clayton if (reg_set && 93569b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 93669b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 93769b582faSGreg Clayton { 938d9e416c0SGreg Clayton value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx); 93981e871edSGreg Clayton sb_value.SetSP (value_sp); 94081e871edSGreg Clayton break; 94169b582faSGreg Clayton } 94269b582faSGreg Clayton } 94369b582faSGreg Clayton } 94469b582faSGreg Clayton } 94569b582faSGreg Clayton break; 94669b582faSGreg Clayton 94769b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 94869b582faSGreg Clayton { 94969b582faSGreg Clayton ConstString const_name(name); 950d9e416c0SGreg Clayton ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name)); 95169b582faSGreg Clayton if (expr_var_sp) 95281e871edSGreg Clayton { 95381e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 954e3e91517SEnrico Granata sb_value.SetSP (value_sp, use_dynamic); 95581e871edSGreg Clayton } 95669b582faSGreg Clayton } 95769b582faSGreg Clayton break; 95869b582faSGreg Clayton 95969b582faSGreg Clayton default: 96069b582faSGreg Clayton break; 96169b582faSGreg Clayton } 962beae523aSJohnny Chen } 963c9858e4dSGreg Clayton else 964c9858e4dSGreg Clayton { 965c9858e4dSGreg Clayton if (log) 9667730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame."); 9677730b9a4SJim Ingham } 9687730b9a4SJim Ingham } 9697730b9a4SJim Ingham else 9707730b9a4SJim Ingham { 9717730b9a4SJim Ingham if (log) 9727730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: process is running"); 973c9858e4dSGreg Clayton } 9747fdf9ef1SGreg Clayton } 975dde9cff3SCaroline Tice 9764838131bSGreg Clayton if (log) 97769b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 978324a1036SSaleem Abdulrasool static_cast<void*>(frame), name, value_type, 979324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 9804838131bSGreg Clayton 981dde9cff3SCaroline Tice return sb_value; 982dde9cff3SCaroline Tice } 983dde9cff3SCaroline Tice 98430fdc8d8SChris Lattner bool 98535e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const 98635e2ab60SJohnny Chen { 987b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 988b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 98935e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 99035e2ab60SJohnny Chen } 99135e2ab60SJohnny Chen 99235e2ab60SJohnny Chen bool 99330fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 99430fdc8d8SChris Lattner { 99535e2ab60SJohnny Chen return IsEqual(rhs); 99630fdc8d8SChris Lattner } 99730fdc8d8SChris Lattner 99830fdc8d8SChris Lattner bool 99930fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 100030fdc8d8SChris Lattner { 100135e2ab60SJohnny Chen return !IsEqual(rhs); 1002481cef25SGreg Clayton } 100330fdc8d8SChris Lattner 100430fdc8d8SChris Lattner SBThread 100530fdc8d8SChris Lattner SBFrame::GetThread () const 100630fdc8d8SChris Lattner { 10075160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1008ceb6b139SCaroline Tice 10097fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1010d9e416c0SGreg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 1011d9e416c0SGreg Clayton SBThread sb_thread (thread_sp); 1012ceb6b139SCaroline Tice 1013ceb6b139SCaroline Tice if (log) 1014750cd175SCaroline Tice { 1015750cd175SCaroline Tice SBStream sstr; 1016750cd175SCaroline Tice sb_thread.GetDescription (sstr); 1017d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", 1018324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetFramePtr()), 1019324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get()), sstr.GetData()); 1020750cd175SCaroline Tice } 1021ceb6b139SCaroline Tice 102230fdc8d8SChris Lattner return sb_thread; 102330fdc8d8SChris Lattner } 102430fdc8d8SChris Lattner 102530fdc8d8SChris Lattner const char * 102630fdc8d8SChris Lattner SBFrame::Disassemble () const 102730fdc8d8SChris Lattner { 10285160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 10294838131bSGreg Clayton const char *disassembly = NULL; 10304fc6cb9cSJim Ingham Mutex::Locker api_locker; 10314fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10324fc6cb9cSJim Ingham 1033b57e4a1bSJason Molenda StackFrame *frame = NULL; 1034d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 10357730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10367730b9a4SJim Ingham if (target && process) 1037af67cecdSGreg Clayton { 10387fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10397730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 10407730b9a4SJim Ingham { 10417730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 10427730b9a4SJim Ingham if (frame) 10437fdf9ef1SGreg Clayton { 1044d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 1045af67cecdSGreg Clayton } 1046c9858e4dSGreg Clayton else 1047c9858e4dSGreg Clayton { 1048c9858e4dSGreg Clayton if (log) 10497730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame."); 10507730b9a4SJim Ingham } 10517730b9a4SJim Ingham } 10527730b9a4SJim Ingham else 10537730b9a4SJim Ingham { 10547730b9a4SJim Ingham if (log) 10557730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: process is running"); 10567fdf9ef1SGreg Clayton } 1057c9858e4dSGreg Clayton } 10584838131bSGreg Clayton 10594838131bSGreg Clayton if (log) 1060324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::Disassemble () => %s", 1061324a1036SSaleem Abdulrasool static_cast<void*>(frame), disassembly); 10624838131bSGreg Clayton 10634838131bSGreg Clayton return disassembly; 106430fdc8d8SChris Lattner } 106530fdc8d8SChris Lattner 106630fdc8d8SChris Lattner 106730fdc8d8SChris Lattner SBValueList 106830fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 106930fdc8d8SChris Lattner bool locals, 107030fdc8d8SChris Lattner bool statics, 107130fdc8d8SChris Lattner bool in_scope_only) 107230fdc8d8SChris Lattner { 1073316d498bSGreg Clayton SBValueList value_list; 10747fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1075b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1076d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1077d9e416c0SGreg Clayton if (frame && target) 1078316d498bSGreg Clayton { 1079d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 108051f96eebSZachary Turner const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false; 108151f96eebSZachary Turner 108251f96eebSZachary Turner SBVariablesOptions options; 108351f96eebSZachary Turner options.SetIncludeArguments(arguments); 108451f96eebSZachary Turner options.SetIncludeLocals(locals); 108551f96eebSZachary Turner options.SetIncludeStatics(statics); 108651f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 108751f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 108851f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 108951f96eebSZachary Turner 109051f96eebSZachary Turner value_list = GetVariables (options); 1091316d498bSGreg Clayton } 1092316d498bSGreg Clayton return value_list; 109378a685aaSJim Ingham } 109478a685aaSJim Ingham 1095560558ebSEnrico Granata lldb::SBValueList 1096560558ebSEnrico Granata SBFrame::GetVariables (bool arguments, 1097560558ebSEnrico Granata bool locals, 1098560558ebSEnrico Granata bool statics, 1099560558ebSEnrico Granata bool in_scope_only, 1100560558ebSEnrico Granata lldb::DynamicValueType use_dynamic) 1101560558ebSEnrico Granata { 1102560558ebSEnrico Granata ExecutionContext exe_ctx(m_opaque_sp.get()); 1103560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 110451f96eebSZachary Turner const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false; 110551f96eebSZachary Turner SBVariablesOptions options; 110651f96eebSZachary Turner options.SetIncludeArguments(arguments); 110751f96eebSZachary Turner options.SetIncludeLocals(locals); 110851f96eebSZachary Turner options.SetIncludeStatics(statics); 110951f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 111051f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 111151f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 111251f96eebSZachary Turner return GetVariables(options); 1113560558ebSEnrico Granata } 1114560558ebSEnrico Granata 111578a685aaSJim Ingham SBValueList 111651f96eebSZachary Turner SBFrame::GetVariables (const lldb::SBVariablesOptions& options) 111778a685aaSJim Ingham { 11185160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1119ceb6b139SCaroline Tice 1120b9556accSGreg Clayton SBValueList value_list; 11214fc6cb9cSJim Ingham Mutex::Locker api_locker; 11224fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 11234fc6cb9cSJim Ingham 1124b57e4a1bSJason Molenda StackFrame *frame = NULL; 1125d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1126b9556accSGreg Clayton 112751f96eebSZachary Turner const bool statics = options.GetIncludeStatics(); 112851f96eebSZachary Turner const bool arguments = options.GetIncludeArguments(); 112951f96eebSZachary Turner const bool locals = options.GetIncludeLocals(); 113051f96eebSZachary Turner const bool in_scope_only = options.GetInScopeOnly(); 113151f96eebSZachary Turner const bool include_runtime_support_values = options.GetIncludeRuntimeSupportValues(); 113251f96eebSZachary Turner const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 113351f96eebSZachary Turner 1134ceb6b139SCaroline Tice if (log) 113551f96eebSZachary Turner log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)", 113651f96eebSZachary Turner arguments, locals, 113751f96eebSZachary Turner statics, in_scope_only, 113851f96eebSZachary Turner include_runtime_support_values, use_dynamic); 1139ceb6b139SCaroline Tice 11407730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 11417730b9a4SJim Ingham if (target && process) 114230fdc8d8SChris Lattner { 11437fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11447730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 11457fdf9ef1SGreg Clayton { 11467730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 11477730b9a4SJim Ingham if (frame) 11487730b9a4SJim Ingham { 114930fdc8d8SChris Lattner size_t i; 1150af67cecdSGreg Clayton VariableList *variable_list = NULL; 1151d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 115230fdc8d8SChris Lattner if (variable_list) 115330fdc8d8SChris Lattner { 115430fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 115530fdc8d8SChris Lattner if (num_variables) 115630fdc8d8SChris Lattner { 115730fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 115830fdc8d8SChris Lattner { 115930fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 116030fdc8d8SChris Lattner if (variable_sp) 116130fdc8d8SChris Lattner { 116230fdc8d8SChris Lattner bool add_variable = false; 116330fdc8d8SChris Lattner switch (variable_sp->GetScope()) 116430fdc8d8SChris Lattner { 116530fdc8d8SChris Lattner case eValueTypeVariableGlobal: 116630fdc8d8SChris Lattner case eValueTypeVariableStatic: 116730fdc8d8SChris Lattner add_variable = statics; 116830fdc8d8SChris Lattner break; 116930fdc8d8SChris Lattner 117030fdc8d8SChris Lattner case eValueTypeVariableArgument: 117130fdc8d8SChris Lattner add_variable = arguments; 117230fdc8d8SChris Lattner break; 117330fdc8d8SChris Lattner 117430fdc8d8SChris Lattner case eValueTypeVariableLocal: 117530fdc8d8SChris Lattner add_variable = locals; 117630fdc8d8SChris Lattner break; 1177c982c768SGreg Clayton 1178c982c768SGreg Clayton default: 1179c982c768SGreg Clayton break; 118030fdc8d8SChris Lattner } 118130fdc8d8SChris Lattner if (add_variable) 118230fdc8d8SChris Lattner { 1183d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 118430fdc8d8SChris Lattner continue; 118530fdc8d8SChris Lattner 1186e3e91517SEnrico Granata ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues)); 1187560558ebSEnrico Granata 1188560558ebSEnrico Granata if (false == include_runtime_support_values && 1189560558ebSEnrico Granata valobj_sp && 1190560558ebSEnrico Granata true == valobj_sp->IsRuntimeSupportValue()) 1191560558ebSEnrico Granata continue; 1192560558ebSEnrico Granata 1193e3e91517SEnrico Granata SBValue value_sb; 1194e3e91517SEnrico Granata value_sb.SetSP(valobj_sp,use_dynamic); 1195e3e91517SEnrico Granata value_list.Append(value_sb); 119630fdc8d8SChris Lattner } 119730fdc8d8SChris Lattner } 119830fdc8d8SChris Lattner } 119930fdc8d8SChris Lattner } 120030fdc8d8SChris Lattner } 120130fdc8d8SChris Lattner } 1202c9858e4dSGreg Clayton else 1203c9858e4dSGreg Clayton { 1204c9858e4dSGreg Clayton if (log) 12057730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame."); 12067730b9a4SJim Ingham } 12077730b9a4SJim Ingham } 12087730b9a4SJim Ingham else 12097730b9a4SJim Ingham { 12107730b9a4SJim Ingham if (log) 12117730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: process is running"); 1212c9858e4dSGreg Clayton } 12137fdf9ef1SGreg Clayton } 1214ceb6b139SCaroline Tice 1215ceb6b139SCaroline Tice if (log) 1216324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", 1217324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1218324a1036SSaleem Abdulrasool static_cast<void*>(value_list.opaque_ptr())); 1219ceb6b139SCaroline Tice 122030fdc8d8SChris Lattner return value_list; 122130fdc8d8SChris Lattner } 122230fdc8d8SChris Lattner 122369b582faSGreg Clayton SBValueList 122430fdc8d8SChris Lattner SBFrame::GetRegisters () 122530fdc8d8SChris Lattner { 12265160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1227ceb6b139SCaroline Tice 122830fdc8d8SChris Lattner SBValueList value_list; 12294fc6cb9cSJim Ingham Mutex::Locker api_locker; 12304fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 12314fc6cb9cSJim Ingham 1232b57e4a1bSJason Molenda StackFrame *frame = NULL; 1233d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 12347730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 12357730b9a4SJim Ingham if (target && process) 123630fdc8d8SChris Lattner { 12377fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12387730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 12397730b9a4SJim Ingham { 12407730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 12417730b9a4SJim Ingham if (frame) 12427fdf9ef1SGreg Clayton { 1243d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 124430fdc8d8SChris Lattner if (reg_ctx) 124530fdc8d8SChris Lattner { 124630fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 124730fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 124830fdc8d8SChris Lattner { 1249d9e416c0SGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); 125030fdc8d8SChris Lattner } 125130fdc8d8SChris Lattner } 125230fdc8d8SChris Lattner } 1253c9858e4dSGreg Clayton else 1254c9858e4dSGreg Clayton { 1255c9858e4dSGreg Clayton if (log) 12567730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame."); 12577730b9a4SJim Ingham } 12587730b9a4SJim Ingham } 12597730b9a4SJim Ingham else 12607730b9a4SJim Ingham { 12617730b9a4SJim Ingham if (log) 12627730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: process is running"); 1263c9858e4dSGreg Clayton } 12647fdf9ef1SGreg Clayton } 1265ceb6b139SCaroline Tice 1266ceb6b139SCaroline Tice if (log) 1267324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", 1268324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1269324a1036SSaleem Abdulrasool static_cast<void*>(value_list.opaque_ptr())); 1270ceb6b139SCaroline Tice 127130fdc8d8SChris Lattner return value_list; 127230fdc8d8SChris Lattner } 127330fdc8d8SChris Lattner 1274ad9a53c5SJason Molenda SBValue 1275ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name) 1276ad9a53c5SJason Molenda { 1277ad9a53c5SJason Molenda Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1278ad9a53c5SJason Molenda 1279ad9a53c5SJason Molenda SBValue result; 1280ad9a53c5SJason Molenda ValueObjectSP value_sp; 1281ad9a53c5SJason Molenda Mutex::Locker api_locker; 1282ad9a53c5SJason Molenda ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1283ad9a53c5SJason Molenda 1284b57e4a1bSJason Molenda StackFrame *frame = NULL; 1285ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 1286ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1287ad9a53c5SJason Molenda if (target && process) 1288ad9a53c5SJason Molenda { 1289ad9a53c5SJason Molenda Process::StopLocker stop_locker; 1290ad9a53c5SJason Molenda if (stop_locker.TryLock(&process->GetRunLock())) 1291ad9a53c5SJason Molenda { 1292ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 1293ad9a53c5SJason Molenda if (frame) 1294ad9a53c5SJason Molenda { 1295ad9a53c5SJason Molenda RegisterContextSP reg_ctx (frame->GetRegisterContext()); 1296ad9a53c5SJason Molenda if (reg_ctx) 1297ad9a53c5SJason Molenda { 1298ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 1299ad9a53c5SJason Molenda for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 1300ad9a53c5SJason Molenda { 1301ad9a53c5SJason Molenda const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 1302ad9a53c5SJason Molenda if (reg_info && 1303ad9a53c5SJason Molenda ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 1304ad9a53c5SJason Molenda (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 1305ad9a53c5SJason Molenda { 1306ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 1307ad9a53c5SJason Molenda result.SetSP (value_sp); 1308ad9a53c5SJason Molenda break; 1309ad9a53c5SJason Molenda } 1310ad9a53c5SJason Molenda } 1311ad9a53c5SJason Molenda } 1312ad9a53c5SJason Molenda } 1313ad9a53c5SJason Molenda else 1314ad9a53c5SJason Molenda { 1315ad9a53c5SJason Molenda if (log) 13165d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame."); 1317ad9a53c5SJason Molenda } 1318ad9a53c5SJason Molenda } 1319ad9a53c5SJason Molenda else 1320ad9a53c5SJason Molenda { 1321ad9a53c5SJason Molenda if (log) 13225d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: process is running"); 1323ad9a53c5SJason Molenda } 1324ad9a53c5SJason Molenda } 1325ad9a53c5SJason Molenda 1326ad9a53c5SJason Molenda if (log) 1327324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)", 1328324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1329324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 1330ad9a53c5SJason Molenda 1331ad9a53c5SJason Molenda return result; 1332ad9a53c5SJason Molenda } 1333ad9a53c5SJason Molenda 1334dde9cff3SCaroline Tice bool 1335dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 1336dde9cff3SCaroline Tice { 13375160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1338da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1339da7bc7d0SGreg Clayton 13404fc6cb9cSJim Ingham Mutex::Locker api_locker; 13414fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 13424fc6cb9cSJim Ingham 1343b57e4a1bSJason Molenda StackFrame *frame; 1344d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 13457730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 13467730b9a4SJim Ingham if (target && process) 1347dde9cff3SCaroline Tice { 13487fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13497730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 13507730b9a4SJim Ingham { 13517730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 13527730b9a4SJim Ingham if (frame) 13537fdf9ef1SGreg Clayton { 1354d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 1355dde9cff3SCaroline Tice } 1356c9858e4dSGreg Clayton else 1357c9858e4dSGreg Clayton { 1358c9858e4dSGreg Clayton if (log) 13597730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame."); 13607730b9a4SJim Ingham } 13617730b9a4SJim Ingham } 13627730b9a4SJim Ingham else 13637730b9a4SJim Ingham { 13647730b9a4SJim Ingham if (log) 13657730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: process is running"); 1366c9858e4dSGreg Clayton } 1367c9858e4dSGreg Clayton 13687fdf9ef1SGreg Clayton } 1369dde9cff3SCaroline Tice else 1370da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1371dde9cff3SCaroline Tice 1372dde9cff3SCaroline Tice return true; 1373dde9cff3SCaroline Tice } 13741d3afba3SGreg Clayton 137569b582faSGreg Clayton SBValue 13761d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 13771d3afba3SGreg Clayton { 1378316d498bSGreg Clayton SBValue result; 13797fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1380b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1381d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1382d9e416c0SGreg Clayton if (frame && target) 1383316d498bSGreg Clayton { 138435e1bda6SJim Ingham SBExpressionOptions options; 138535e1bda6SJim Ingham lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue(); 1386cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 138735e1bda6SJim Ingham options.SetUnwindOnError (true); 138835e1bda6SJim Ingham return EvaluateExpression (expr, options); 1389316d498bSGreg Clayton } 1390316d498bSGreg Clayton return result; 139178a685aaSJim Ingham } 139278a685aaSJim Ingham 139378a685aaSJim Ingham SBValue 13942837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 139578a685aaSJim Ingham { 139635e1bda6SJim Ingham SBExpressionOptions options; 1397cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 139835e1bda6SJim Ingham options.SetUnwindOnError (true); 139935e1bda6SJim Ingham return EvaluateExpression (expr, options); 14007ba6e991SJim Ingham } 14017ba6e991SJim Ingham 14027ba6e991SJim Ingham SBValue 14037ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error) 14047ba6e991SJim Ingham { 140535e1bda6SJim Ingham SBExpressionOptions options; 1406cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 140735e1bda6SJim Ingham options.SetUnwindOnError (unwind_on_error); 140835e1bda6SJim Ingham return EvaluateExpression (expr, options); 140935e1bda6SJim Ingham } 141035e1bda6SJim Ingham 141135e1bda6SJim Ingham lldb::SBValue 141235e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options) 141335e1bda6SJim Ingham { 14145160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14154838131bSGreg Clayton 14165160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1417a162ebafSSean Callanan 14188646d3c1SJim Ingham ExpressionResults exe_results = eExpressionSetupError; 141969b582faSGreg Clayton SBValue expr_result; 14207730b9a4SJim Ingham 14217730b9a4SJim Ingham if (expr == NULL || expr[0] == '\0') 14227730b9a4SJim Ingham { 14237730b9a4SJim Ingham if (log) 14247730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression called with an empty expression"); 14257730b9a4SJim Ingham return expr_result; 14267730b9a4SJim Ingham } 14277730b9a4SJim Ingham 142881e871edSGreg Clayton ValueObjectSP expr_value_sp; 14294838131bSGreg Clayton 14304fc6cb9cSJim Ingham Mutex::Locker api_locker; 14314fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 14324fc6cb9cSJim Ingham 1433b9556accSGreg Clayton if (log) 14347730b9a4SJim Ingham log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr); 1435b9556accSGreg Clayton 1436b57e4a1bSJason Molenda StackFrame *frame = NULL; 14377730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 14387730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 14397730b9a4SJim Ingham 14407730b9a4SJim Ingham if (target && process) 14411d3afba3SGreg Clayton { 14427fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 14437730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 14447730b9a4SJim Ingham { 14457730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 14467730b9a4SJim Ingham if (frame) 14477fdf9ef1SGreg Clayton { 1448fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1449fb6621efSGreg Clayton { 14501ba7c4d0SGreg Clayton StreamString frame_description; 1451d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 14521ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 1453cced1566SGreg Clayton expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str()); 1454fb6621efSGreg Clayton } 1455fb6621efSGreg Clayton 1456d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 1457d9e416c0SGreg Clayton frame, 1458d4439aa9SEnrico Granata expr_value_sp, 145935e1bda6SJim Ingham options.ref()); 1460e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1461fb6621efSGreg Clayton 1462fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1463f49e65aeSGreg Clayton Host::SetCrashDescription (NULL); 14641d3afba3SGreg Clayton } 1465c9858e4dSGreg Clayton else 1466c9858e4dSGreg Clayton { 1467c9858e4dSGreg Clayton if (log) 14687730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame."); 14697730b9a4SJim Ingham } 14707730b9a4SJim Ingham } 14717730b9a4SJim Ingham else 14727730b9a4SJim Ingham { 14737730b9a4SJim Ingham if (log) 14747730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: process is running"); 1475c9858e4dSGreg Clayton } 14767fdf9ef1SGreg Clayton } 14774838131bSGreg Clayton 1478cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1479a162ebafSSean Callanan if (expr_log) 148078a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 1481324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 1482a162ebafSSean Callanan 14834838131bSGreg Clayton if (log) 1484d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 1485324a1036SSaleem Abdulrasool static_cast<void*>(frame), expr, 1486324a1036SSaleem Abdulrasool static_cast<void*>(expr_value_sp.get()), exe_results); 1487cf7e2dc0SJason Molenda #endif 14884838131bSGreg Clayton 1489cfd1acedSGreg Clayton return expr_result; 14901d3afba3SGreg Clayton } 1491316d498bSGreg Clayton 1492316d498bSGreg Clayton bool 1493316d498bSGreg Clayton SBFrame::IsInlined() 1494316d498bSGreg Clayton { 14955160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14967fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1497b57e4a1bSJason Molenda StackFrame *frame = NULL; 1498d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 14997730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 15007730b9a4SJim Ingham if (target && process) 1501316d498bSGreg Clayton { 15027fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 15037730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 15047730b9a4SJim Ingham { 15057730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 15067730b9a4SJim Ingham if (frame) 15077fdf9ef1SGreg Clayton { 15087fdf9ef1SGreg Clayton 1509d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1510316d498bSGreg Clayton if (block) 1511316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 1512316d498bSGreg Clayton } 1513c9858e4dSGreg Clayton else 1514c9858e4dSGreg Clayton { 1515c9858e4dSGreg Clayton if (log) 15167730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame."); 15177730b9a4SJim Ingham } 15187730b9a4SJim Ingham } 15197730b9a4SJim Ingham else 15207730b9a4SJim Ingham { 15217730b9a4SJim Ingham if (log) 15227730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: process is running"); 1523c9858e4dSGreg Clayton } 1524c9858e4dSGreg Clayton 15257fdf9ef1SGreg Clayton } 1526316d498bSGreg Clayton return false; 1527316d498bSGreg Clayton } 1528316d498bSGreg Clayton 1529316d498bSGreg Clayton const char * 1530316d498bSGreg Clayton SBFrame::GetFunctionName() 1531316d498bSGreg Clayton { 15325160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1533316d498bSGreg Clayton const char *name = NULL; 15347fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1535b57e4a1bSJason Molenda StackFrame *frame = NULL; 1536d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 15377730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 15387730b9a4SJim Ingham if (target && process) 1539316d498bSGreg Clayton { 15407fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 15417730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 15427730b9a4SJim Ingham { 15437730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 15447730b9a4SJim Ingham if (frame) 15457fdf9ef1SGreg Clayton { 1546d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1547316d498bSGreg Clayton if (sc.block) 1548316d498bSGreg Clayton { 1549316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1550316d498bSGreg Clayton if (inlined_block) 1551316d498bSGreg Clayton { 1552316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1553316d498bSGreg Clayton name = inlined_info->GetName().AsCString(); 1554316d498bSGreg Clayton } 1555316d498bSGreg Clayton } 1556316d498bSGreg Clayton 1557316d498bSGreg Clayton if (name == NULL) 1558316d498bSGreg Clayton { 1559316d498bSGreg Clayton if (sc.function) 1560316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1561316d498bSGreg Clayton } 1562316d498bSGreg Clayton 1563316d498bSGreg Clayton if (name == NULL) 1564316d498bSGreg Clayton { 1565316d498bSGreg Clayton if (sc.symbol) 1566316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1567316d498bSGreg Clayton } 1568316d498bSGreg Clayton } 1569c9858e4dSGreg Clayton else 1570c9858e4dSGreg Clayton { 1571c9858e4dSGreg Clayton if (log) 15727730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame."); 15737730b9a4SJim Ingham } 15747730b9a4SJim Ingham } 15757730b9a4SJim Ingham else 15767730b9a4SJim Ingham { 15777730b9a4SJim Ingham if (log) 15787730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName() => error: process is running"); 1579c9858e4dSGreg Clayton 1580c9858e4dSGreg Clayton } 15817fdf9ef1SGreg Clayton } 1582316d498bSGreg Clayton return name; 1583316d498bSGreg Clayton } 1584316d498bSGreg Clayton 1585