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*4dbb271fSSean Callanan #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h" 25151c032cSJim Ingham #include "lldb/Expression/UserExpression.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 457424a5dbcSGreg Clayton lldb::addr_t 458424a5dbcSGreg Clayton SBFrame::GetCFA () const 459424a5dbcSGreg Clayton { 460424a5dbcSGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 461424a5dbcSGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 462424a5dbcSGreg Clayton if (frame) 463424a5dbcSGreg Clayton return frame->GetStackID().GetCallFrameAddress(); 464424a5dbcSGreg Clayton return LLDB_INVALID_ADDRESS; 465424a5dbcSGreg Clayton } 466424a5dbcSGreg Clayton 467424a5dbcSGreg Clayton 46869b582faSGreg Clayton addr_t 46930fdc8d8SChris Lattner SBFrame::GetPC () const 47030fdc8d8SChris Lattner { 4715160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 47269b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 4734fc6cb9cSJim Ingham Mutex::Locker api_locker; 4744fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4754fc6cb9cSJim Ingham 476b57e4a1bSJason Molenda StackFrame *frame = NULL; 477d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4787730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 4797730b9a4SJim Ingham if (target && process) 480af67cecdSGreg Clayton { 4817fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4827730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 4837730b9a4SJim Ingham { 4847730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 4857730b9a4SJim Ingham if (frame) 4867fdf9ef1SGreg Clayton { 48725b9f7ebSTamas Berghammer addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target, eAddressClassCode); 488af67cecdSGreg Clayton } 489c9858e4dSGreg Clayton else 490c9858e4dSGreg Clayton { 491c9858e4dSGreg Clayton if (log) 4927730b9a4SJim Ingham log->Printf ("SBFrame::GetPC () => error: could not reconstruct frame object for this SBFrame."); 4937730b9a4SJim Ingham } 4947730b9a4SJim Ingham } 4957730b9a4SJim Ingham else 4967730b9a4SJim Ingham { 4977730b9a4SJim Ingham if (log) 4987730b9a4SJim Ingham log->Printf ("SBFrame::GetPC () => error: process is running"); 499c9858e4dSGreg Clayton } 5007fdf9ef1SGreg Clayton } 501ceb6b139SCaroline Tice 502ceb6b139SCaroline Tice if (log) 503324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetPC () => 0x%" PRIx64, 504324a1036SSaleem Abdulrasool static_cast<void*>(frame), addr); 505ceb6b139SCaroline Tice 506ceb6b139SCaroline Tice return addr; 50730fdc8d8SChris Lattner } 50830fdc8d8SChris Lattner 50930fdc8d8SChris Lattner bool 51069b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc) 51130fdc8d8SChris Lattner { 5125160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 513ceb6b139SCaroline Tice bool ret_val = false; 5144fc6cb9cSJim Ingham Mutex::Locker api_locker; 5154fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5164fc6cb9cSJim Ingham 517b57e4a1bSJason Molenda StackFrame *frame = NULL; 518d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5197730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 5207730b9a4SJim Ingham if (target && process) 521af67cecdSGreg Clayton { 5227fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5237730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 5247730b9a4SJim Ingham { 5257730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5267730b9a4SJim Ingham if (frame) 5277fdf9ef1SGreg Clayton { 528d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC (new_pc); 529af67cecdSGreg Clayton } 530c9858e4dSGreg Clayton else 531c9858e4dSGreg Clayton { 532c9858e4dSGreg Clayton if (log) 5337730b9a4SJim Ingham log->Printf ("SBFrame::SetPC () => error: could not reconstruct frame object for this SBFrame."); 5347730b9a4SJim Ingham } 5357730b9a4SJim Ingham } 5367730b9a4SJim Ingham else 5377730b9a4SJim Ingham { 5387730b9a4SJim Ingham if (log) 5397730b9a4SJim Ingham log->Printf ("SBFrame::SetPC () => error: process is running"); 540c9858e4dSGreg Clayton } 5417fdf9ef1SGreg Clayton } 542ceb6b139SCaroline Tice 543ceb6b139SCaroline Tice if (log) 544d01b2953SDaniel Malea log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i", 545324a1036SSaleem Abdulrasool static_cast<void*>(frame), new_pc, ret_val); 546ceb6b139SCaroline Tice 547ceb6b139SCaroline Tice return ret_val; 54830fdc8d8SChris Lattner } 54930fdc8d8SChris Lattner 55069b582faSGreg Clayton addr_t 55130fdc8d8SChris Lattner SBFrame::GetSP () const 55230fdc8d8SChris Lattner { 5535160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5544838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 5554fc6cb9cSJim Ingham Mutex::Locker api_locker; 5564fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5574fc6cb9cSJim Ingham 558b57e4a1bSJason Molenda StackFrame *frame = NULL; 559d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5607730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 5617730b9a4SJim Ingham if (target && process) 562af67cecdSGreg Clayton { 5637fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5647730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 5657730b9a4SJim Ingham { 5667730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5677730b9a4SJim Ingham if (frame) 5687fdf9ef1SGreg Clayton { 569d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 570af67cecdSGreg Clayton } 571c9858e4dSGreg Clayton else 572c9858e4dSGreg Clayton { 573c9858e4dSGreg Clayton if (log) 5747730b9a4SJim Ingham log->Printf ("SBFrame::GetSP () => error: could not reconstruct frame object for this SBFrame."); 5757730b9a4SJim Ingham } 5767730b9a4SJim Ingham } 5777730b9a4SJim Ingham else 5787730b9a4SJim Ingham { 5797730b9a4SJim Ingham if (log) 5807730b9a4SJim Ingham log->Printf ("SBFrame::GetSP () => error: process is running"); 5817fdf9ef1SGreg Clayton } 582c9858e4dSGreg Clayton } 5834838131bSGreg Clayton if (log) 584324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetSP () => 0x%" PRIx64, 585324a1036SSaleem Abdulrasool static_cast<void*>(frame), addr); 5864838131bSGreg Clayton 5874838131bSGreg Clayton return addr; 58830fdc8d8SChris Lattner } 58930fdc8d8SChris Lattner 59030fdc8d8SChris Lattner 59169b582faSGreg Clayton addr_t 59230fdc8d8SChris Lattner SBFrame::GetFP () const 59330fdc8d8SChris Lattner { 5945160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 59569b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 5964fc6cb9cSJim Ingham Mutex::Locker api_locker; 5974fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5984fc6cb9cSJim Ingham 599b57e4a1bSJason Molenda StackFrame *frame = NULL; 600d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6017730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 6027730b9a4SJim Ingham if (target && process) 603af67cecdSGreg Clayton { 6047fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6057730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 6067730b9a4SJim Ingham { 6077730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 6087730b9a4SJim Ingham if (frame) 6097fdf9ef1SGreg Clayton { 610d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 611af67cecdSGreg Clayton } 612c9858e4dSGreg Clayton else 613c9858e4dSGreg Clayton { 614c9858e4dSGreg Clayton if (log) 6157730b9a4SJim Ingham log->Printf ("SBFrame::GetFP () => error: could not reconstruct frame object for this SBFrame."); 6167730b9a4SJim Ingham } 6177730b9a4SJim Ingham } 6187730b9a4SJim Ingham else 6197730b9a4SJim Ingham { 6207730b9a4SJim Ingham if (log) 6217730b9a4SJim Ingham log->Printf ("SBFrame::GetFP () => error: process is running"); 622c9858e4dSGreg Clayton } 6237fdf9ef1SGreg Clayton } 624ceb6b139SCaroline Tice 625ceb6b139SCaroline Tice if (log) 626324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetFP () => 0x%" PRIx64, 627324a1036SSaleem Abdulrasool static_cast<void*>(frame), addr); 628ceb6b139SCaroline Tice return addr; 62930fdc8d8SChris Lattner } 63030fdc8d8SChris Lattner 63130fdc8d8SChris Lattner 63230fdc8d8SChris Lattner SBAddress 63330fdc8d8SChris Lattner SBFrame::GetPCAddress () const 63430fdc8d8SChris Lattner { 6355160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 63630fdc8d8SChris Lattner SBAddress sb_addr; 6374fc6cb9cSJim Ingham Mutex::Locker api_locker; 6384fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 6394fc6cb9cSJim Ingham 640b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 641d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6427730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 6437730b9a4SJim Ingham if (target && process) 644af67cecdSGreg Clayton { 6457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6467730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 6477730b9a4SJim Ingham { 6487730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 6497730b9a4SJim Ingham if (frame) 6507fdf9ef1SGreg Clayton { 651d9e416c0SGreg Clayton sb_addr.SetAddress (&frame->GetFrameCodeAddress()); 652af67cecdSGreg Clayton } 653c9858e4dSGreg Clayton else 654c9858e4dSGreg Clayton { 655c9858e4dSGreg Clayton if (log) 6567730b9a4SJim Ingham log->Printf ("SBFrame::GetPCAddress () => error: could not reconstruct frame object for this SBFrame."); 6577730b9a4SJim Ingham } 6587730b9a4SJim Ingham } 6597730b9a4SJim Ingham else 6607730b9a4SJim Ingham { 6617730b9a4SJim Ingham if (log) 6627730b9a4SJim Ingham log->Printf ("SBFrame::GetPCAddress () => error: process is running"); 6637fdf9ef1SGreg Clayton } 664c9858e4dSGreg Clayton } 6654838131bSGreg Clayton if (log) 666324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", 667324a1036SSaleem Abdulrasool static_cast<void*>(frame), 668324a1036SSaleem Abdulrasool static_cast<void*>(sb_addr.get())); 66930fdc8d8SChris Lattner return sb_addr; 67030fdc8d8SChris Lattner } 67130fdc8d8SChris Lattner 67230fdc8d8SChris Lattner void 67330fdc8d8SChris Lattner SBFrame::Clear() 67430fdc8d8SChris Lattner { 675af2589eaSGreg Clayton m_opaque_sp->Clear(); 67630fdc8d8SChris Lattner } 67730fdc8d8SChris Lattner 6787edbdfc9SGreg Clayton lldb::SBValue 6797edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path) 6807edbdfc9SGreg Clayton { 6817edbdfc9SGreg Clayton SBValue sb_value; 6827fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 683b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 684d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 685d9e416c0SGreg Clayton if (frame && target) 6867edbdfc9SGreg Clayton { 687d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 6887edbdfc9SGreg Clayton sb_value = GetValueForVariablePath (var_path, use_dynamic); 6897edbdfc9SGreg Clayton } 6907edbdfc9SGreg Clayton return sb_value; 6917edbdfc9SGreg Clayton } 6927edbdfc9SGreg Clayton 6937edbdfc9SGreg Clayton lldb::SBValue 6947edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic) 6957edbdfc9SGreg Clayton { 6967edbdfc9SGreg Clayton SBValue sb_value; 6974fc6cb9cSJim Ingham Mutex::Locker api_locker; 6985160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6997730b9a4SJim Ingham if (var_path == NULL || var_path[0] == '\0') 7007730b9a4SJim Ingham { 7017730b9a4SJim Ingham if (log) 7027730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath called with empty variable path."); 7037730b9a4SJim Ingham return sb_value; 7047730b9a4SJim Ingham } 7057730b9a4SJim Ingham 7064fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 7074fc6cb9cSJim Ingham 708b57e4a1bSJason Molenda StackFrame *frame = NULL; 709d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7107730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 7117730b9a4SJim Ingham if (target && process) 7127edbdfc9SGreg Clayton { 7137fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7147730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 7157730b9a4SJim Ingham { 7167730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 7177730b9a4SJim Ingham if (frame) 7187fdf9ef1SGreg Clayton { 7197edbdfc9SGreg Clayton VariableSP var_sp; 7207edbdfc9SGreg Clayton Error error; 721d9e416c0SGreg Clayton ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path, 722e3e91517SEnrico Granata eNoDynamicValues, 723b57e4a1bSJason Molenda StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 7247edbdfc9SGreg Clayton var_sp, 7257edbdfc9SGreg Clayton error)); 726e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 7277edbdfc9SGreg Clayton } 728c9858e4dSGreg Clayton else 729c9858e4dSGreg Clayton { 730c9858e4dSGreg Clayton if (log) 7317730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath () => error: could not reconstruct frame object for this SBFrame."); 7327730b9a4SJim Ingham } 7337730b9a4SJim Ingham } 7347730b9a4SJim Ingham else 7357730b9a4SJim Ingham { 7367730b9a4SJim Ingham if (log) 7377730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath () => error: process is running"); 738c9858e4dSGreg Clayton } 7397fdf9ef1SGreg Clayton } 7407edbdfc9SGreg Clayton return sb_value; 7417edbdfc9SGreg Clayton } 7427edbdfc9SGreg Clayton 74330fdc8d8SChris Lattner SBValue 74469b582faSGreg Clayton SBFrame::FindVariable (const char *name) 74530fdc8d8SChris Lattner { 746316d498bSGreg Clayton SBValue value; 7477fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 748b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 749d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 750d9e416c0SGreg Clayton if (frame && target) 751316d498bSGreg Clayton { 752d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 753316d498bSGreg Clayton value = FindVariable (name, use_dynamic); 754316d498bSGreg Clayton } 755316d498bSGreg Clayton return value; 75678a685aaSJim Ingham } 75778a685aaSJim Ingham 75878a685aaSJim Ingham SBValue 7592837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic) 76078a685aaSJim Ingham { 7615160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 76269b582faSGreg Clayton VariableSP var_sp; 76358b59f95SJim Ingham SBValue sb_value; 7647730b9a4SJim Ingham 7657730b9a4SJim Ingham if (name == NULL || name[0] == '\0') 7667730b9a4SJim Ingham { 7677730b9a4SJim Ingham if (log) 7687730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable called with empty name"); 7697730b9a4SJim Ingham return sb_value; 7707730b9a4SJim Ingham } 7717730b9a4SJim Ingham 77281e871edSGreg Clayton ValueObjectSP value_sp; 7734fc6cb9cSJim Ingham Mutex::Locker api_locker; 7744fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 7754fc6cb9cSJim Ingham 776b57e4a1bSJason Molenda StackFrame *frame = NULL; 777d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7787730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 7797730b9a4SJim Ingham if (target && process) 78030fdc8d8SChris Lattner { 7817fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7827730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 7837730b9a4SJim Ingham { 7847730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 7857730b9a4SJim Ingham if (frame) 7867fdf9ef1SGreg Clayton { 78769b582faSGreg Clayton VariableList variable_list; 788d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 78930fdc8d8SChris Lattner 79072eff18aSGreg Clayton if (sc.block) 79130fdc8d8SChris Lattner { 79272eff18aSGreg Clayton const bool can_create = true; 79372eff18aSGreg Clayton const bool get_parent_variables = true; 79472eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 79572eff18aSGreg Clayton 79672eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 79772eff18aSGreg Clayton get_parent_variables, 79872eff18aSGreg Clayton stop_if_block_is_inlined_function, 79972eff18aSGreg Clayton &variable_list)) 80072eff18aSGreg Clayton { 80169b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 80230fdc8d8SChris Lattner } 80372eff18aSGreg Clayton } 80430fdc8d8SChris Lattner 8054838131bSGreg Clayton if (var_sp) 80681e871edSGreg Clayton { 807e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues); 808e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 80981e871edSGreg Clayton } 8107fdf9ef1SGreg Clayton } 811c9858e4dSGreg Clayton else 812c9858e4dSGreg Clayton { 813c9858e4dSGreg Clayton if (log) 8147730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame."); 8157730b9a4SJim Ingham } 8167730b9a4SJim Ingham } 8177730b9a4SJim Ingham else 8187730b9a4SJim Ingham { 8197730b9a4SJim Ingham if (log) 8207730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable () => error: process is running"); 821c9858e4dSGreg Clayton } 822316d498bSGreg Clayton } 823316d498bSGreg Clayton 8244838131bSGreg Clayton if (log) 82569b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 826324a1036SSaleem Abdulrasool static_cast<void*>(frame), name, 827324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 8284838131bSGreg Clayton 829dde9cff3SCaroline Tice return sb_value; 830dde9cff3SCaroline Tice } 831dde9cff3SCaroline Tice 83230fdc8d8SChris Lattner SBValue 83369b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 83430fdc8d8SChris Lattner { 835316d498bSGreg Clayton SBValue value; 8367fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 837b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 838d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 839d9e416c0SGreg Clayton if (frame && target) 840316d498bSGreg Clayton { 841d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 842316d498bSGreg Clayton value = FindValue (name, value_type, use_dynamic); 843316d498bSGreg Clayton } 844316d498bSGreg Clayton return value; 84578a685aaSJim Ingham } 84678a685aaSJim Ingham 84778a685aaSJim Ingham SBValue 8482837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) 84978a685aaSJim Ingham { 8505160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 85169b582faSGreg Clayton SBValue sb_value; 8527730b9a4SJim Ingham 8537730b9a4SJim Ingham if (name == NULL || name[0] == '\0') 8547730b9a4SJim Ingham { 8557730b9a4SJim Ingham if (log) 8567730b9a4SJim Ingham log->Printf ("SBFrame::FindValue called with empty name."); 8577730b9a4SJim Ingham return sb_value; 8587730b9a4SJim Ingham } 8597730b9a4SJim Ingham 86081e871edSGreg Clayton ValueObjectSP value_sp; 8614fc6cb9cSJim Ingham Mutex::Locker api_locker; 8624fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 8634fc6cb9cSJim Ingham 864b57e4a1bSJason Molenda StackFrame *frame = NULL; 865d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 8667730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 8677730b9a4SJim Ingham if (target && process) 86830fdc8d8SChris Lattner { 8697fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8707730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 8717730b9a4SJim Ingham { 8727730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 8737730b9a4SJim Ingham if (frame) 8747fdf9ef1SGreg Clayton { 8758a2a0dfbSEnrico Granata VariableList variable_list; 8768a2a0dfbSEnrico Granata 87769b582faSGreg Clayton switch (value_type) 87830fdc8d8SChris Lattner { 87969b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 88069b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 88169b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 88269b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 88369b582faSGreg Clayton { 884d9e416c0SGreg Clayton SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 88572eff18aSGreg Clayton 88672eff18aSGreg Clayton const bool can_create = true; 88772eff18aSGreg Clayton const bool get_parent_variables = true; 88872eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 88972eff18aSGreg Clayton 8900efb51a0SChaoren Lin if (sc.block) 8910efb51a0SChaoren Lin sc.block->AppendVariables(can_create, 89272eff18aSGreg Clayton get_parent_variables, 89372eff18aSGreg Clayton stop_if_block_is_inlined_function, 8940efb51a0SChaoren Lin &variable_list); 8958a2a0dfbSEnrico Granata if (value_type == eValueTypeVariableGlobal) 8968a2a0dfbSEnrico Granata { 8978a2a0dfbSEnrico Granata const bool get_file_globals = true; 8988a2a0dfbSEnrico Granata VariableList *frame_vars = frame->GetVariableList(get_file_globals); 8998a2a0dfbSEnrico Granata if (frame_vars) 9008a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 9018a2a0dfbSEnrico Granata } 90269b582faSGreg Clayton ConstString const_name(name); 90308a04327SEnrico Granata VariableSP variable_sp(variable_list.FindVariable(const_name, value_type)); 90408a04327SEnrico Granata if (variable_sp) 905beae523aSJohnny Chen { 906e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable(variable_sp, eNoDynamicValues); 907e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 90830fdc8d8SChris Lattner } 90930fdc8d8SChris Lattner } 91069b582faSGreg Clayton break; 91169b582faSGreg Clayton 91269b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 91369b582faSGreg Clayton { 914d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 91569b582faSGreg Clayton if (reg_ctx) 91669b582faSGreg Clayton { 91769b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 91869b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 91969b582faSGreg Clayton { 92069b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 92169b582faSGreg Clayton if (reg_info && 92269b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 92369b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 92469b582faSGreg Clayton { 925d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 92681e871edSGreg Clayton sb_value.SetSP (value_sp); 92781e871edSGreg Clayton break; 92869b582faSGreg Clayton } 92969b582faSGreg Clayton } 93069b582faSGreg Clayton } 93169b582faSGreg Clayton } 93269b582faSGreg Clayton break; 93369b582faSGreg Clayton 93469b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 93569b582faSGreg Clayton { 936d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 93769b582faSGreg Clayton if (reg_ctx) 93869b582faSGreg Clayton { 93969b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 94069b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 94169b582faSGreg Clayton { 94269b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 94369b582faSGreg Clayton if (reg_set && 94469b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 94569b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 94669b582faSGreg Clayton { 947d9e416c0SGreg Clayton value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx); 94881e871edSGreg Clayton sb_value.SetSP (value_sp); 94981e871edSGreg Clayton break; 95069b582faSGreg Clayton } 95169b582faSGreg Clayton } 95269b582faSGreg Clayton } 95369b582faSGreg Clayton } 95469b582faSGreg Clayton break; 95569b582faSGreg Clayton 95669b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 95769b582faSGreg Clayton { 95869b582faSGreg Clayton ConstString const_name(name); 959bc8ac34eSSean Callanan ExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name)); 96069b582faSGreg Clayton if (expr_var_sp) 96181e871edSGreg Clayton { 96281e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 963e3e91517SEnrico Granata sb_value.SetSP (value_sp, use_dynamic); 96481e871edSGreg Clayton } 96569b582faSGreg Clayton } 96669b582faSGreg Clayton break; 96769b582faSGreg Clayton 96869b582faSGreg Clayton default: 96969b582faSGreg Clayton break; 97069b582faSGreg Clayton } 971beae523aSJohnny Chen } 972c9858e4dSGreg Clayton else 973c9858e4dSGreg Clayton { 974c9858e4dSGreg Clayton if (log) 9757730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame."); 9767730b9a4SJim Ingham } 9777730b9a4SJim Ingham } 9787730b9a4SJim Ingham else 9797730b9a4SJim Ingham { 9807730b9a4SJim Ingham if (log) 9817730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: process is running"); 982c9858e4dSGreg Clayton } 9837fdf9ef1SGreg Clayton } 984dde9cff3SCaroline Tice 9854838131bSGreg Clayton if (log) 98669b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 987324a1036SSaleem Abdulrasool static_cast<void*>(frame), name, value_type, 988324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 9894838131bSGreg Clayton 990dde9cff3SCaroline Tice return sb_value; 991dde9cff3SCaroline Tice } 992dde9cff3SCaroline Tice 99330fdc8d8SChris Lattner bool 99435e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const 99535e2ab60SJohnny Chen { 996b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 997b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 99835e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 99935e2ab60SJohnny Chen } 100035e2ab60SJohnny Chen 100135e2ab60SJohnny Chen bool 100230fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 100330fdc8d8SChris Lattner { 100435e2ab60SJohnny Chen return IsEqual(rhs); 100530fdc8d8SChris Lattner } 100630fdc8d8SChris Lattner 100730fdc8d8SChris Lattner bool 100830fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 100930fdc8d8SChris Lattner { 101035e2ab60SJohnny Chen return !IsEqual(rhs); 1011481cef25SGreg Clayton } 101230fdc8d8SChris Lattner 101330fdc8d8SChris Lattner SBThread 101430fdc8d8SChris Lattner SBFrame::GetThread () const 101530fdc8d8SChris Lattner { 10165160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1017ceb6b139SCaroline Tice 10187fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1019d9e416c0SGreg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 1020d9e416c0SGreg Clayton SBThread sb_thread (thread_sp); 1021ceb6b139SCaroline Tice 1022ceb6b139SCaroline Tice if (log) 1023750cd175SCaroline Tice { 1024750cd175SCaroline Tice SBStream sstr; 1025750cd175SCaroline Tice sb_thread.GetDescription (sstr); 1026d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", 1027324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetFramePtr()), 1028324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get()), sstr.GetData()); 1029750cd175SCaroline Tice } 1030ceb6b139SCaroline Tice 103130fdc8d8SChris Lattner return sb_thread; 103230fdc8d8SChris Lattner } 103330fdc8d8SChris Lattner 103430fdc8d8SChris Lattner const char * 103530fdc8d8SChris Lattner SBFrame::Disassemble () const 103630fdc8d8SChris Lattner { 10375160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 10384838131bSGreg Clayton const char *disassembly = NULL; 10394fc6cb9cSJim Ingham Mutex::Locker api_locker; 10404fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10414fc6cb9cSJim Ingham 1042b57e4a1bSJason Molenda StackFrame *frame = NULL; 1043d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 10447730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10457730b9a4SJim Ingham if (target && process) 1046af67cecdSGreg Clayton { 10477fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10487730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 10497730b9a4SJim Ingham { 10507730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 10517730b9a4SJim Ingham if (frame) 10527fdf9ef1SGreg Clayton { 1053d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 1054af67cecdSGreg Clayton } 1055c9858e4dSGreg Clayton else 1056c9858e4dSGreg Clayton { 1057c9858e4dSGreg Clayton if (log) 10587730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame."); 10597730b9a4SJim Ingham } 10607730b9a4SJim Ingham } 10617730b9a4SJim Ingham else 10627730b9a4SJim Ingham { 10637730b9a4SJim Ingham if (log) 10647730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: process is running"); 10657fdf9ef1SGreg Clayton } 1066c9858e4dSGreg Clayton } 10674838131bSGreg Clayton 10684838131bSGreg Clayton if (log) 1069324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::Disassemble () => %s", 1070324a1036SSaleem Abdulrasool static_cast<void*>(frame), disassembly); 10714838131bSGreg Clayton 10724838131bSGreg Clayton return disassembly; 107330fdc8d8SChris Lattner } 107430fdc8d8SChris Lattner 107530fdc8d8SChris Lattner 107630fdc8d8SChris Lattner SBValueList 107730fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 107830fdc8d8SChris Lattner bool locals, 107930fdc8d8SChris Lattner bool statics, 108030fdc8d8SChris Lattner bool in_scope_only) 108130fdc8d8SChris Lattner { 1082316d498bSGreg Clayton SBValueList value_list; 10837fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1084b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1085d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1086d9e416c0SGreg Clayton if (frame && target) 1087316d498bSGreg Clayton { 1088d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 108951f96eebSZachary Turner const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false; 109051f96eebSZachary Turner 109151f96eebSZachary Turner SBVariablesOptions options; 109251f96eebSZachary Turner options.SetIncludeArguments(arguments); 109351f96eebSZachary Turner options.SetIncludeLocals(locals); 109451f96eebSZachary Turner options.SetIncludeStatics(statics); 109551f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 109651f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 109751f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 109851f96eebSZachary Turner 109951f96eebSZachary Turner value_list = GetVariables (options); 1100316d498bSGreg Clayton } 1101316d498bSGreg Clayton return value_list; 110278a685aaSJim Ingham } 110378a685aaSJim Ingham 1104560558ebSEnrico Granata lldb::SBValueList 1105560558ebSEnrico Granata SBFrame::GetVariables (bool arguments, 1106560558ebSEnrico Granata bool locals, 1107560558ebSEnrico Granata bool statics, 1108560558ebSEnrico Granata bool in_scope_only, 1109560558ebSEnrico Granata lldb::DynamicValueType use_dynamic) 1110560558ebSEnrico Granata { 1111560558ebSEnrico Granata ExecutionContext exe_ctx(m_opaque_sp.get()); 1112560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 111351f96eebSZachary Turner const bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false; 111451f96eebSZachary Turner SBVariablesOptions options; 111551f96eebSZachary Turner options.SetIncludeArguments(arguments); 111651f96eebSZachary Turner options.SetIncludeLocals(locals); 111751f96eebSZachary Turner options.SetIncludeStatics(statics); 111851f96eebSZachary Turner options.SetInScopeOnly(in_scope_only); 111951f96eebSZachary Turner options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 112051f96eebSZachary Turner options.SetUseDynamic(use_dynamic); 112151f96eebSZachary Turner return GetVariables(options); 1122560558ebSEnrico Granata } 1123560558ebSEnrico Granata 112478a685aaSJim Ingham SBValueList 112551f96eebSZachary Turner SBFrame::GetVariables (const lldb::SBVariablesOptions& options) 112678a685aaSJim Ingham { 11275160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1128ceb6b139SCaroline Tice 1129b9556accSGreg Clayton SBValueList value_list; 11304fc6cb9cSJim Ingham Mutex::Locker api_locker; 11314fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 11324fc6cb9cSJim Ingham 1133b57e4a1bSJason Molenda StackFrame *frame = NULL; 1134d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1135b9556accSGreg Clayton 113651f96eebSZachary Turner const bool statics = options.GetIncludeStatics(); 113751f96eebSZachary Turner const bool arguments = options.GetIncludeArguments(); 113851f96eebSZachary Turner const bool locals = options.GetIncludeLocals(); 113951f96eebSZachary Turner const bool in_scope_only = options.GetInScopeOnly(); 114051f96eebSZachary Turner const bool include_runtime_support_values = options.GetIncludeRuntimeSupportValues(); 114151f96eebSZachary Turner const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 114251f96eebSZachary Turner 1143ceb6b139SCaroline Tice if (log) 114451f96eebSZachary Turner log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i runtime=%i dynamic=%i)", 114551f96eebSZachary Turner arguments, locals, 114651f96eebSZachary Turner statics, in_scope_only, 114751f96eebSZachary Turner include_runtime_support_values, use_dynamic); 1148ceb6b139SCaroline Tice 11497730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 11507730b9a4SJim Ingham if (target && process) 115130fdc8d8SChris Lattner { 11527fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11537730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 11547fdf9ef1SGreg Clayton { 11557730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 11567730b9a4SJim Ingham if (frame) 11577730b9a4SJim Ingham { 115830fdc8d8SChris Lattner size_t i; 1159af67cecdSGreg Clayton VariableList *variable_list = NULL; 1160d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 116130fdc8d8SChris Lattner if (variable_list) 116230fdc8d8SChris Lattner { 116330fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 116430fdc8d8SChris Lattner if (num_variables) 116530fdc8d8SChris Lattner { 116630fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 116730fdc8d8SChris Lattner { 116830fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 116930fdc8d8SChris Lattner if (variable_sp) 117030fdc8d8SChris Lattner { 117130fdc8d8SChris Lattner bool add_variable = false; 117230fdc8d8SChris Lattner switch (variable_sp->GetScope()) 117330fdc8d8SChris Lattner { 117430fdc8d8SChris Lattner case eValueTypeVariableGlobal: 117530fdc8d8SChris Lattner case eValueTypeVariableStatic: 117630fdc8d8SChris Lattner add_variable = statics; 117730fdc8d8SChris Lattner break; 117830fdc8d8SChris Lattner 117930fdc8d8SChris Lattner case eValueTypeVariableArgument: 118030fdc8d8SChris Lattner add_variable = arguments; 118130fdc8d8SChris Lattner break; 118230fdc8d8SChris Lattner 118330fdc8d8SChris Lattner case eValueTypeVariableLocal: 118430fdc8d8SChris Lattner add_variable = locals; 118530fdc8d8SChris Lattner break; 1186c982c768SGreg Clayton 1187c982c768SGreg Clayton default: 1188c982c768SGreg Clayton break; 118930fdc8d8SChris Lattner } 119030fdc8d8SChris Lattner if (add_variable) 119130fdc8d8SChris Lattner { 1192d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 119330fdc8d8SChris Lattner continue; 119430fdc8d8SChris Lattner 1195e3e91517SEnrico Granata ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues)); 1196560558ebSEnrico Granata 1197560558ebSEnrico Granata if (false == include_runtime_support_values && 1198560558ebSEnrico Granata valobj_sp && 1199560558ebSEnrico Granata true == valobj_sp->IsRuntimeSupportValue()) 1200560558ebSEnrico Granata continue; 1201560558ebSEnrico Granata 1202e3e91517SEnrico Granata SBValue value_sb; 1203e3e91517SEnrico Granata value_sb.SetSP(valobj_sp,use_dynamic); 1204e3e91517SEnrico Granata value_list.Append(value_sb); 120530fdc8d8SChris Lattner } 120630fdc8d8SChris Lattner } 120730fdc8d8SChris Lattner } 120830fdc8d8SChris Lattner } 120930fdc8d8SChris Lattner } 121030fdc8d8SChris Lattner } 1211c9858e4dSGreg Clayton else 1212c9858e4dSGreg Clayton { 1213c9858e4dSGreg Clayton if (log) 12147730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame."); 12157730b9a4SJim Ingham } 12167730b9a4SJim Ingham } 12177730b9a4SJim Ingham else 12187730b9a4SJim Ingham { 12197730b9a4SJim Ingham if (log) 12207730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: process is running"); 1221c9858e4dSGreg Clayton } 12227fdf9ef1SGreg Clayton } 1223ceb6b139SCaroline Tice 1224ceb6b139SCaroline Tice if (log) 1225324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", 1226324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1227324a1036SSaleem Abdulrasool static_cast<void*>(value_list.opaque_ptr())); 1228ceb6b139SCaroline Tice 122930fdc8d8SChris Lattner return value_list; 123030fdc8d8SChris Lattner } 123130fdc8d8SChris Lattner 123269b582faSGreg Clayton SBValueList 123330fdc8d8SChris Lattner SBFrame::GetRegisters () 123430fdc8d8SChris Lattner { 12355160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1236ceb6b139SCaroline Tice 123730fdc8d8SChris Lattner SBValueList value_list; 12384fc6cb9cSJim Ingham Mutex::Locker api_locker; 12394fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 12404fc6cb9cSJim Ingham 1241b57e4a1bSJason Molenda StackFrame *frame = NULL; 1242d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 12437730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 12447730b9a4SJim Ingham if (target && process) 124530fdc8d8SChris Lattner { 12467fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12477730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 12487730b9a4SJim Ingham { 12497730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 12507730b9a4SJim Ingham if (frame) 12517fdf9ef1SGreg Clayton { 1252d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 125330fdc8d8SChris Lattner if (reg_ctx) 125430fdc8d8SChris Lattner { 125530fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 125630fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 125730fdc8d8SChris Lattner { 1258d9e416c0SGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); 125930fdc8d8SChris Lattner } 126030fdc8d8SChris Lattner } 126130fdc8d8SChris Lattner } 1262c9858e4dSGreg Clayton else 1263c9858e4dSGreg Clayton { 1264c9858e4dSGreg Clayton if (log) 12657730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame."); 12667730b9a4SJim Ingham } 12677730b9a4SJim Ingham } 12687730b9a4SJim Ingham else 12697730b9a4SJim Ingham { 12707730b9a4SJim Ingham if (log) 12717730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: process is running"); 1272c9858e4dSGreg Clayton } 12737fdf9ef1SGreg Clayton } 1274ceb6b139SCaroline Tice 1275ceb6b139SCaroline Tice if (log) 1276324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", 1277324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1278324a1036SSaleem Abdulrasool static_cast<void*>(value_list.opaque_ptr())); 1279ceb6b139SCaroline Tice 128030fdc8d8SChris Lattner return value_list; 128130fdc8d8SChris Lattner } 128230fdc8d8SChris Lattner 1283ad9a53c5SJason Molenda SBValue 1284ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name) 1285ad9a53c5SJason Molenda { 1286ad9a53c5SJason Molenda Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1287ad9a53c5SJason Molenda 1288ad9a53c5SJason Molenda SBValue result; 1289ad9a53c5SJason Molenda ValueObjectSP value_sp; 1290ad9a53c5SJason Molenda Mutex::Locker api_locker; 1291ad9a53c5SJason Molenda ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1292ad9a53c5SJason Molenda 1293b57e4a1bSJason Molenda StackFrame *frame = NULL; 1294ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 1295ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1296ad9a53c5SJason Molenda if (target && process) 1297ad9a53c5SJason Molenda { 1298ad9a53c5SJason Molenda Process::StopLocker stop_locker; 1299ad9a53c5SJason Molenda if (stop_locker.TryLock(&process->GetRunLock())) 1300ad9a53c5SJason Molenda { 1301ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 1302ad9a53c5SJason Molenda if (frame) 1303ad9a53c5SJason Molenda { 1304ad9a53c5SJason Molenda RegisterContextSP reg_ctx (frame->GetRegisterContext()); 1305ad9a53c5SJason Molenda if (reg_ctx) 1306ad9a53c5SJason Molenda { 1307ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 1308ad9a53c5SJason Molenda for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 1309ad9a53c5SJason Molenda { 1310ad9a53c5SJason Molenda const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 1311ad9a53c5SJason Molenda if (reg_info && 1312ad9a53c5SJason Molenda ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 1313ad9a53c5SJason Molenda (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 1314ad9a53c5SJason Molenda { 1315ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 1316ad9a53c5SJason Molenda result.SetSP (value_sp); 1317ad9a53c5SJason Molenda break; 1318ad9a53c5SJason Molenda } 1319ad9a53c5SJason Molenda } 1320ad9a53c5SJason Molenda } 1321ad9a53c5SJason Molenda } 1322ad9a53c5SJason Molenda else 1323ad9a53c5SJason Molenda { 1324ad9a53c5SJason Molenda if (log) 13255d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame."); 1326ad9a53c5SJason Molenda } 1327ad9a53c5SJason Molenda } 1328ad9a53c5SJason Molenda else 1329ad9a53c5SJason Molenda { 1330ad9a53c5SJason Molenda if (log) 13315d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: process is running"); 1332ad9a53c5SJason Molenda } 1333ad9a53c5SJason Molenda } 1334ad9a53c5SJason Molenda 1335ad9a53c5SJason Molenda if (log) 1336324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)", 1337324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1338324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 1339ad9a53c5SJason Molenda 1340ad9a53c5SJason Molenda return result; 1341ad9a53c5SJason Molenda } 1342ad9a53c5SJason Molenda 1343dde9cff3SCaroline Tice bool 1344dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 1345dde9cff3SCaroline Tice { 13465160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1347da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1348da7bc7d0SGreg Clayton 13494fc6cb9cSJim Ingham Mutex::Locker api_locker; 13504fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 13514fc6cb9cSJim Ingham 1352b57e4a1bSJason Molenda StackFrame *frame; 1353d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 13547730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 13557730b9a4SJim Ingham if (target && process) 1356dde9cff3SCaroline Tice { 13577fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13587730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 13597730b9a4SJim Ingham { 13607730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 13617730b9a4SJim Ingham if (frame) 13627fdf9ef1SGreg Clayton { 1363d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 1364dde9cff3SCaroline Tice } 1365c9858e4dSGreg Clayton else 1366c9858e4dSGreg Clayton { 1367c9858e4dSGreg Clayton if (log) 13687730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame."); 13697730b9a4SJim Ingham } 13707730b9a4SJim Ingham } 13717730b9a4SJim Ingham else 13727730b9a4SJim Ingham { 13737730b9a4SJim Ingham if (log) 13747730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: process is running"); 1375c9858e4dSGreg Clayton } 1376c9858e4dSGreg Clayton 13777fdf9ef1SGreg Clayton } 1378dde9cff3SCaroline Tice else 1379da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1380dde9cff3SCaroline Tice 1381dde9cff3SCaroline Tice return true; 1382dde9cff3SCaroline Tice } 13831d3afba3SGreg Clayton 138469b582faSGreg Clayton SBValue 13851d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 13861d3afba3SGreg Clayton { 1387316d498bSGreg Clayton SBValue result; 13887fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1389b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1390d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1391d9e416c0SGreg Clayton if (frame && target) 1392316d498bSGreg Clayton { 139335e1bda6SJim Ingham SBExpressionOptions options; 139435e1bda6SJim Ingham lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue(); 1395cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 139635e1bda6SJim Ingham options.SetUnwindOnError (true); 139735e1bda6SJim Ingham return EvaluateExpression (expr, options); 1398316d498bSGreg Clayton } 1399316d498bSGreg Clayton return result; 140078a685aaSJim Ingham } 140178a685aaSJim Ingham 140278a685aaSJim Ingham SBValue 14032837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 140478a685aaSJim Ingham { 140535e1bda6SJim Ingham SBExpressionOptions options; 1406cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 140735e1bda6SJim Ingham options.SetUnwindOnError (true); 140835e1bda6SJim Ingham return EvaluateExpression (expr, options); 14097ba6e991SJim Ingham } 14107ba6e991SJim Ingham 14117ba6e991SJim Ingham SBValue 14127ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error) 14137ba6e991SJim Ingham { 141435e1bda6SJim Ingham SBExpressionOptions options; 1415cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 141635e1bda6SJim Ingham options.SetUnwindOnError (unwind_on_error); 141735e1bda6SJim Ingham return EvaluateExpression (expr, options); 141835e1bda6SJim Ingham } 141935e1bda6SJim Ingham 142035e1bda6SJim Ingham lldb::SBValue 142135e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options) 142235e1bda6SJim Ingham { 14235160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14244838131bSGreg Clayton 14255160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1426a162ebafSSean Callanan 14278646d3c1SJim Ingham ExpressionResults exe_results = eExpressionSetupError; 142869b582faSGreg Clayton SBValue expr_result; 14297730b9a4SJim Ingham 14307730b9a4SJim Ingham if (expr == NULL || expr[0] == '\0') 14317730b9a4SJim Ingham { 14327730b9a4SJim Ingham if (log) 14337730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression called with an empty expression"); 14347730b9a4SJim Ingham return expr_result; 14357730b9a4SJim Ingham } 14367730b9a4SJim Ingham 143781e871edSGreg Clayton ValueObjectSP expr_value_sp; 14384838131bSGreg Clayton 14394fc6cb9cSJim Ingham Mutex::Locker api_locker; 14404fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 14414fc6cb9cSJim Ingham 1442b9556accSGreg Clayton if (log) 14437730b9a4SJim Ingham log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr); 1444b9556accSGreg Clayton 1445b57e4a1bSJason Molenda StackFrame *frame = NULL; 14467730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 14477730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 14487730b9a4SJim Ingham 14497730b9a4SJim Ingham if (target && process) 14501d3afba3SGreg Clayton { 14517fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 14527730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 14537730b9a4SJim Ingham { 14547730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 14557730b9a4SJim Ingham if (frame) 14567fdf9ef1SGreg Clayton { 1457fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1458fb6621efSGreg Clayton { 14591ba7c4d0SGreg Clayton StreamString frame_description; 1460d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 14611ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 1462cced1566SGreg Clayton expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str()); 1463fb6621efSGreg Clayton } 1464fb6621efSGreg Clayton 1465d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 1466d9e416c0SGreg Clayton frame, 1467d4439aa9SEnrico Granata expr_value_sp, 146835e1bda6SJim Ingham options.ref()); 1469e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1470fb6621efSGreg Clayton 1471fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1472f49e65aeSGreg Clayton Host::SetCrashDescription (NULL); 14731d3afba3SGreg Clayton } 1474c9858e4dSGreg Clayton else 1475c9858e4dSGreg Clayton { 1476c9858e4dSGreg Clayton if (log) 14777730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame."); 14787730b9a4SJim Ingham } 14797730b9a4SJim Ingham } 14807730b9a4SJim Ingham else 14817730b9a4SJim Ingham { 14827730b9a4SJim Ingham if (log) 14837730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: process is running"); 1484c9858e4dSGreg Clayton } 14857fdf9ef1SGreg Clayton } 14864838131bSGreg Clayton 1487cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1488a162ebafSSean Callanan if (expr_log) 148978a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 1490324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 1491a162ebafSSean Callanan 14924838131bSGreg Clayton if (log) 1493d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 1494324a1036SSaleem Abdulrasool static_cast<void*>(frame), expr, 1495324a1036SSaleem Abdulrasool static_cast<void*>(expr_value_sp.get()), exe_results); 1496cf7e2dc0SJason Molenda #endif 14974838131bSGreg Clayton 1498cfd1acedSGreg Clayton return expr_result; 14991d3afba3SGreg Clayton } 1500316d498bSGreg Clayton 1501316d498bSGreg Clayton bool 15026345fe3eSOleksiy Vyalov SBFrame::IsInlined() 1503316d498bSGreg Clayton { 150405f75e9fSOleksiy Vyalov return static_cast<const SBFrame*>(this)->IsInlined(); 150505f75e9fSOleksiy Vyalov } 150605f75e9fSOleksiy Vyalov 150705f75e9fSOleksiy Vyalov bool 150805f75e9fSOleksiy Vyalov SBFrame::IsInlined() const 150905f75e9fSOleksiy Vyalov { 15105160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 15117fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1512b57e4a1bSJason Molenda StackFrame *frame = NULL; 1513d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 15147730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 15157730b9a4SJim Ingham if (target && process) 1516316d498bSGreg Clayton { 15177fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 15187730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 15197730b9a4SJim Ingham { 15207730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 15217730b9a4SJim Ingham if (frame) 15227fdf9ef1SGreg Clayton { 15237fdf9ef1SGreg Clayton 1524d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1525316d498bSGreg Clayton if (block) 1526316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 1527316d498bSGreg Clayton } 1528c9858e4dSGreg Clayton else 1529c9858e4dSGreg Clayton { 1530c9858e4dSGreg Clayton if (log) 15317730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame."); 15327730b9a4SJim Ingham } 15337730b9a4SJim Ingham } 15347730b9a4SJim Ingham else 15357730b9a4SJim Ingham { 15367730b9a4SJim Ingham if (log) 15377730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: process is running"); 1538c9858e4dSGreg Clayton } 1539c9858e4dSGreg Clayton 15407fdf9ef1SGreg Clayton } 1541316d498bSGreg Clayton return false; 1542316d498bSGreg Clayton } 1543316d498bSGreg Clayton 1544316d498bSGreg Clayton const char * 15456345fe3eSOleksiy Vyalov SBFrame::GetFunctionName() 1546316d498bSGreg Clayton { 154705f75e9fSOleksiy Vyalov return static_cast<const SBFrame*>(this)->GetFunctionName(); 154805f75e9fSOleksiy Vyalov } 154905f75e9fSOleksiy Vyalov 155005f75e9fSOleksiy Vyalov const char * 155105f75e9fSOleksiy Vyalov SBFrame::GetFunctionName() const 155205f75e9fSOleksiy Vyalov { 15535160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1554316d498bSGreg Clayton const char *name = NULL; 15557fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1556b57e4a1bSJason Molenda StackFrame *frame = NULL; 1557d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 15587730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 15597730b9a4SJim Ingham if (target && process) 1560316d498bSGreg Clayton { 15617fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 15627730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 15637730b9a4SJim Ingham { 15647730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 15657730b9a4SJim Ingham if (frame) 15667fdf9ef1SGreg Clayton { 1567d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1568316d498bSGreg Clayton if (sc.block) 1569316d498bSGreg Clayton { 1570316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1571316d498bSGreg Clayton if (inlined_block) 1572316d498bSGreg Clayton { 1573316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1574ddaf6a72SGreg Clayton name = inlined_info->GetName(sc.function->GetLanguage()).AsCString(); 1575316d498bSGreg Clayton } 1576316d498bSGreg Clayton } 1577316d498bSGreg Clayton 1578316d498bSGreg Clayton if (name == NULL) 1579316d498bSGreg Clayton { 1580316d498bSGreg Clayton if (sc.function) 1581316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1582316d498bSGreg Clayton } 1583316d498bSGreg Clayton 1584316d498bSGreg Clayton if (name == NULL) 1585316d498bSGreg Clayton { 1586316d498bSGreg Clayton if (sc.symbol) 1587316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1588316d498bSGreg Clayton } 1589316d498bSGreg Clayton } 1590c9858e4dSGreg Clayton else 1591c9858e4dSGreg Clayton { 1592c9858e4dSGreg Clayton if (log) 15937730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame."); 15947730b9a4SJim Ingham } 15957730b9a4SJim Ingham } 15967730b9a4SJim Ingham else 15977730b9a4SJim Ingham { 15987730b9a4SJim Ingham if (log) 15997730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName() => error: process is running"); 1600c9858e4dSGreg Clayton 1601c9858e4dSGreg Clayton } 16027fdf9ef1SGreg Clayton } 1603316d498bSGreg Clayton return name; 1604316d498bSGreg Clayton } 1605c1f705c2SEnrico Granata 1606c1f705c2SEnrico Granata const char * 1607c1f705c2SEnrico Granata SBFrame::GetDisplayFunctionName() 1608c1f705c2SEnrico Granata { 1609c1f705c2SEnrico Granata Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1610c1f705c2SEnrico Granata const char *name = NULL; 1611c1f705c2SEnrico Granata ExecutionContext exe_ctx(m_opaque_sp.get()); 1612c1f705c2SEnrico Granata StackFrame *frame = NULL; 1613c1f705c2SEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1614c1f705c2SEnrico Granata Process *process = exe_ctx.GetProcessPtr(); 1615c1f705c2SEnrico Granata if (target && process) 1616c1f705c2SEnrico Granata { 1617c1f705c2SEnrico Granata Process::StopLocker stop_locker; 1618c1f705c2SEnrico Granata if (stop_locker.TryLock(&process->GetRunLock())) 1619c1f705c2SEnrico Granata { 1620c1f705c2SEnrico Granata frame = exe_ctx.GetFramePtr(); 1621c1f705c2SEnrico Granata if (frame) 1622c1f705c2SEnrico Granata { 1623c1f705c2SEnrico Granata SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1624c1f705c2SEnrico Granata if (sc.block) 1625c1f705c2SEnrico Granata { 1626c1f705c2SEnrico Granata Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1627c1f705c2SEnrico Granata if (inlined_block) 1628c1f705c2SEnrico Granata { 1629c1f705c2SEnrico Granata const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1630ddaf6a72SGreg Clayton name = inlined_info->GetDisplayName(sc.function->GetLanguage()).AsCString(); 1631c1f705c2SEnrico Granata } 1632c1f705c2SEnrico Granata } 1633c1f705c2SEnrico Granata 1634c1f705c2SEnrico Granata if (name == NULL) 1635c1f705c2SEnrico Granata { 1636c1f705c2SEnrico Granata if (sc.function) 1637c1f705c2SEnrico Granata name = sc.function->GetDisplayName().GetCString(); 1638c1f705c2SEnrico Granata } 1639c1f705c2SEnrico Granata 1640c1f705c2SEnrico Granata if (name == NULL) 1641c1f705c2SEnrico Granata { 1642c1f705c2SEnrico Granata if (sc.symbol) 1643c1f705c2SEnrico Granata name = sc.symbol->GetDisplayName().GetCString(); 1644c1f705c2SEnrico Granata } 1645c1f705c2SEnrico Granata } 1646c1f705c2SEnrico Granata else 1647c1f705c2SEnrico Granata { 1648c1f705c2SEnrico Granata if (log) 1649c1f705c2SEnrico Granata log->Printf ("SBFrame::GetDisplayFunctionName () => error: could not reconstruct frame object for this SBFrame."); 1650c1f705c2SEnrico Granata } 1651c1f705c2SEnrico Granata } 1652c1f705c2SEnrico Granata else 1653c1f705c2SEnrico Granata { 1654c1f705c2SEnrico Granata if (log) 1655c1f705c2SEnrico Granata log->Printf ("SBFrame::GetDisplayFunctionName() => error: process is running"); 1656c1f705c2SEnrico Granata 1657c1f705c2SEnrico Granata } 1658c1f705c2SEnrico Granata } 1659c1f705c2SEnrico Granata return name; 1660c1f705c2SEnrico Granata } 1661