130fdc8d8SChris Lattner //===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 104c5de699SEli Friedman #include "lldb/API/SBFrame.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner #include <string> 1330fdc8d8SChris Lattner #include <algorithm> 1430fdc8d8SChris Lattner 1530fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1630fdc8d8SChris Lattner 1730fdc8d8SChris Lattner #include "lldb/Core/Address.h" 1830fdc8d8SChris Lattner #include "lldb/Core/ConstString.h" 19ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 2030fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h" 2330fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h" 24b71f3844SGreg Clayton #include "lldb/Expression/ClangUserExpression.h" 251ba7c4d0SGreg Clayton #include "lldb/Host/Host.h" 2630fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 271f746071SGreg Clayton #include "lldb/Symbol/Function.h" 281f746071SGreg Clayton #include "lldb/Symbol/Symbol.h" 2930fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 3030fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h" 3130fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h" 3230fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h" 3330fdc8d8SChris Lattner #include "lldb/Target/Target.h" 3430fdc8d8SChris Lattner #include "lldb/Target/Process.h" 3530fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 36b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h" 37b9556accSGreg Clayton #include "lldb/Target/StackID.h" 3830fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 3930fdc8d8SChris Lattner 404c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 414c5de699SEli Friedman #include "lldb/API/SBValue.h" 424c5de699SEli Friedman #include "lldb/API/SBAddress.h" 4335e1bda6SJim Ingham #include "lldb/API/SBExpressionOptions.h" 44dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 454c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h" 464c5de699SEli Friedman #include "lldb/API/SBThread.h" 4730fdc8d8SChris Lattner 4830fdc8d8SChris Lattner using namespace lldb; 4930fdc8d8SChris Lattner using namespace lldb_private; 5030fdc8d8SChris Lattner 51b9556accSGreg Clayton 5230fdc8d8SChris Lattner SBFrame::SBFrame () : 537fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef()) 5430fdc8d8SChris Lattner { 5530fdc8d8SChris Lattner } 5630fdc8d8SChris Lattner 57b57e4a1bSJason Molenda SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) : 587fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (lldb_object_sp)) 5930fdc8d8SChris Lattner { 605160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 61ceb6b139SCaroline Tice 62ceb6b139SCaroline Tice if (log) 63ceb6b139SCaroline Tice { 64ceb6b139SCaroline Tice SBStream sstr; 65ceb6b139SCaroline Tice GetDescription (sstr); 664838131bSGreg Clayton log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s", 67324a1036SSaleem Abdulrasool static_cast<void*>(lldb_object_sp.get()), 68324a1036SSaleem Abdulrasool static_cast<void*>(lldb_object_sp.get()), sstr.GetData()); 69ceb6b139SCaroline Tice } 7030fdc8d8SChris Lattner } 7130fdc8d8SChris Lattner 72efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) : 737fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp)) 74efabb123SGreg Clayton { 75efabb123SGreg Clayton } 76efabb123SGreg Clayton 77efabb123SGreg Clayton const SBFrame & 78efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs) 79efabb123SGreg Clayton { 80efabb123SGreg Clayton if (this != &rhs) 817fdf9ef1SGreg Clayton *m_opaque_sp = *rhs.m_opaque_sp; 82efabb123SGreg Clayton return *this; 83efabb123SGreg Clayton } 84efabb123SGreg Clayton 8530fdc8d8SChris Lattner SBFrame::~SBFrame() 8630fdc8d8SChris Lattner { 8730fdc8d8SChris Lattner } 8830fdc8d8SChris Lattner 89b57e4a1bSJason Molenda StackFrameSP 90b9556accSGreg Clayton SBFrame::GetFrameSP() const 91b9556accSGreg Clayton { 92af2589eaSGreg Clayton if (m_opaque_sp) 937fdf9ef1SGreg Clayton return m_opaque_sp->GetFrameSP(); 94b57e4a1bSJason Molenda return StackFrameSP(); 95b9556accSGreg Clayton } 9630fdc8d8SChris Lattner 9730fdc8d8SChris Lattner void 98b57e4a1bSJason Molenda SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp) 9930fdc8d8SChris Lattner { 1007fdf9ef1SGreg Clayton return m_opaque_sp->SetFrameSP(lldb_object_sp); 101b9556accSGreg Clayton } 10230fdc8d8SChris Lattner 10330fdc8d8SChris Lattner bool 10430fdc8d8SChris Lattner SBFrame::IsValid() const 10530fdc8d8SChris Lattner { 1067fdf9ef1SGreg Clayton return GetFrameSP().get() != NULL; 10730fdc8d8SChris Lattner } 10830fdc8d8SChris Lattner 10930fdc8d8SChris Lattner SBSymbolContext 11030fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const 11130fdc8d8SChris Lattner { 1125160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 11330fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 1144fc6cb9cSJim Ingham Mutex::Locker api_locker; 1154fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1164fc6cb9cSJim Ingham 117b57e4a1bSJason Molenda StackFrame *frame = NULL; 118d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1197730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1207730b9a4SJim Ingham if (target && process) 121af67cecdSGreg Clayton { 1227fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1237730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 1247730b9a4SJim Ingham { 1257730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1267730b9a4SJim Ingham if (frame) 1277fdf9ef1SGreg Clayton { 128d9e416c0SGreg Clayton sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope)); 129af67cecdSGreg Clayton } 130c9858e4dSGreg Clayton else 131c9858e4dSGreg Clayton { 132c9858e4dSGreg Clayton if (log) 1337730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame."); 1347730b9a4SJim Ingham } 1357730b9a4SJim Ingham } 1367730b9a4SJim Ingham else 1377730b9a4SJim Ingham { 1387730b9a4SJim Ingham if (log) 1397730b9a4SJim Ingham log->Printf ("SBFrame::GetSymbolContext () => error: process is running"); 140c9858e4dSGreg Clayton } 1417fdf9ef1SGreg Clayton } 142ceb6b139SCaroline Tice 143ceb6b139SCaroline Tice if (log) 1444838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)", 145324a1036SSaleem Abdulrasool static_cast<void*>(frame), resolve_scope, 146324a1036SSaleem Abdulrasool static_cast<void*>(sb_sym_ctx.get())); 147ceb6b139SCaroline Tice 14830fdc8d8SChris Lattner return sb_sym_ctx; 14930fdc8d8SChris Lattner } 15030fdc8d8SChris Lattner 15130fdc8d8SChris Lattner SBModule 15230fdc8d8SChris Lattner SBFrame::GetModule () const 15330fdc8d8SChris Lattner { 1545160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 15572eff18aSGreg Clayton SBModule sb_module; 156acdbe816SGreg Clayton ModuleSP module_sp; 1574fc6cb9cSJim Ingham Mutex::Locker api_locker; 1584fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1594fc6cb9cSJim Ingham 160b57e4a1bSJason Molenda StackFrame *frame = NULL; 161d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1627730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 1637730b9a4SJim Ingham if (target && process) 164af67cecdSGreg Clayton { 1657fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1667730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 1677730b9a4SJim Ingham { 1687730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 1697730b9a4SJim Ingham if (frame) 1707fdf9ef1SGreg Clayton { 171d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp; 172acdbe816SGreg Clayton sb_module.SetSP (module_sp); 173af67cecdSGreg Clayton } 174c9858e4dSGreg Clayton else 175c9858e4dSGreg Clayton { 176c9858e4dSGreg Clayton if (log) 1777730b9a4SJim Ingham log->Printf ("SBFrame::GetModule () => error: could not reconstruct frame object for this SBFrame."); 1787730b9a4SJim Ingham } 1797730b9a4SJim Ingham } 1807730b9a4SJim Ingham else 1817730b9a4SJim Ingham { 1827730b9a4SJim Ingham if (log) 1837730b9a4SJim Ingham log->Printf ("SBFrame::GetModule () => error: process is running"); 184c9858e4dSGreg Clayton } 1857fdf9ef1SGreg Clayton } 18672eff18aSGreg Clayton 1874838131bSGreg Clayton if (log) 1884838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)", 189324a1036SSaleem Abdulrasool static_cast<void*>(frame), 190324a1036SSaleem Abdulrasool static_cast<void*>(module_sp.get())); 1914838131bSGreg Clayton 19230fdc8d8SChris Lattner return sb_module; 19330fdc8d8SChris Lattner } 19430fdc8d8SChris Lattner 19530fdc8d8SChris Lattner SBCompileUnit 19630fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 19730fdc8d8SChris Lattner { 1985160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 19972eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 2004fc6cb9cSJim Ingham Mutex::Locker api_locker; 2014fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2024fc6cb9cSJim Ingham 203b57e4a1bSJason Molenda StackFrame *frame = NULL; 204d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2057730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 2067730b9a4SJim Ingham if (target && process) 207af67cecdSGreg Clayton { 2087fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2097730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 2107730b9a4SJim Ingham { 2117730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 2127730b9a4SJim Ingham if (frame) 2137fdf9ef1SGreg Clayton { 214d9e416c0SGreg Clayton sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 215af67cecdSGreg Clayton } 216c9858e4dSGreg Clayton else 217c9858e4dSGreg Clayton { 218ceb6b139SCaroline Tice if (log) 2197730b9a4SJim Ingham log->Printf ("SBFrame::GetCompileUnit () => error: could not reconstruct frame object for this SBFrame."); 2207730b9a4SJim Ingham } 2217730b9a4SJim Ingham } 2227730b9a4SJim Ingham else 2237730b9a4SJim Ingham { 2247730b9a4SJim Ingham if (log) 2257730b9a4SJim Ingham log->Printf ("SBFrame::GetCompileUnit () => error: process is running"); 226c9858e4dSGreg Clayton } 227c9858e4dSGreg Clayton } 228c9858e4dSGreg Clayton if (log) 229c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)", 230324a1036SSaleem Abdulrasool static_cast<void*>(frame), 231324a1036SSaleem Abdulrasool static_cast<void*>(sb_comp_unit.get())); 232ceb6b139SCaroline Tice 23330fdc8d8SChris Lattner return sb_comp_unit; 23430fdc8d8SChris Lattner } 23530fdc8d8SChris Lattner 23630fdc8d8SChris Lattner SBFunction 23730fdc8d8SChris Lattner SBFrame::GetFunction () const 23830fdc8d8SChris Lattner { 2395160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 24072eff18aSGreg Clayton SBFunction sb_function; 2414fc6cb9cSJim Ingham Mutex::Locker api_locker; 2424fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2434fc6cb9cSJim Ingham 244b57e4a1bSJason Molenda StackFrame *frame = NULL; 245d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2467730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 2477730b9a4SJim Ingham if (target && process) 248af67cecdSGreg Clayton { 2497fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2507730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 2517730b9a4SJim Ingham { 2527730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 2537730b9a4SJim Ingham if (frame) 2547fdf9ef1SGreg Clayton { 255d9e416c0SGreg Clayton sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function); 256af67cecdSGreg Clayton } 257c9858e4dSGreg Clayton else 258c9858e4dSGreg Clayton { 259c9858e4dSGreg Clayton if (log) 2607730b9a4SJim Ingham log->Printf ("SBFrame::GetFunction () => error: could not reconstruct frame object for this SBFrame."); 2617730b9a4SJim Ingham } 2627730b9a4SJim Ingham } 2637730b9a4SJim Ingham else 2647730b9a4SJim Ingham { 2657730b9a4SJim Ingham if (log) 2667730b9a4SJim Ingham log->Printf ("SBFrame::GetFunction () => error: process is running"); 2677fdf9ef1SGreg Clayton } 268c9858e4dSGreg Clayton } 2694838131bSGreg Clayton if (log) 2704838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)", 271324a1036SSaleem Abdulrasool static_cast<void*>(frame), 272324a1036SSaleem Abdulrasool static_cast<void*>(sb_function.get())); 2734838131bSGreg Clayton 27430fdc8d8SChris Lattner return sb_function; 27530fdc8d8SChris Lattner } 27630fdc8d8SChris Lattner 2773b06557eSGreg Clayton SBSymbol 2783b06557eSGreg Clayton SBFrame::GetSymbol () const 2793b06557eSGreg Clayton { 2805160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 28172eff18aSGreg Clayton SBSymbol sb_symbol; 2824fc6cb9cSJim Ingham Mutex::Locker api_locker; 2834fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 2844fc6cb9cSJim Ingham 285b57e4a1bSJason Molenda StackFrame *frame = NULL; 286d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 2877730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 2887730b9a4SJim Ingham if (target && process) 289af67cecdSGreg Clayton { 2907fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2917730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 2927730b9a4SJim Ingham { 2937730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 2947730b9a4SJim Ingham if (frame) 2957fdf9ef1SGreg Clayton { 296d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol); 297af67cecdSGreg Clayton } 298c9858e4dSGreg Clayton else 299c9858e4dSGreg Clayton { 300c9858e4dSGreg Clayton if (log) 3017730b9a4SJim Ingham log->Printf ("SBFrame::GetSymbol () => error: could not reconstruct frame object for this SBFrame."); 3027730b9a4SJim Ingham } 3037730b9a4SJim Ingham } 3047730b9a4SJim Ingham else 3057730b9a4SJim Ingham { 3067730b9a4SJim Ingham if (log) 3077730b9a4SJim Ingham log->Printf ("SBFrame::GetSymbol () => error: process is running"); 3087fdf9ef1SGreg Clayton } 309c9858e4dSGreg Clayton } 3104838131bSGreg Clayton if (log) 3114838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 312324a1036SSaleem Abdulrasool static_cast<void*>(frame), 313324a1036SSaleem Abdulrasool static_cast<void*>(sb_symbol.get())); 3143b06557eSGreg Clayton return sb_symbol; 3153b06557eSGreg Clayton } 3163b06557eSGreg Clayton 31730fdc8d8SChris Lattner SBBlock 31830fdc8d8SChris Lattner SBFrame::GetBlock () const 31930fdc8d8SChris Lattner { 3205160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 32172eff18aSGreg Clayton SBBlock sb_block; 3224fc6cb9cSJim Ingham Mutex::Locker api_locker; 3234fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3244fc6cb9cSJim Ingham 325b57e4a1bSJason Molenda StackFrame *frame = NULL; 326d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3277730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 3287730b9a4SJim Ingham if (target && process) 329af67cecdSGreg Clayton { 3307fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3317730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 3327730b9a4SJim Ingham { 3337730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 3347730b9a4SJim Ingham if (frame) 3357fdf9ef1SGreg Clayton { 336d9e416c0SGreg Clayton sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block); 337af67cecdSGreg Clayton } 338c9858e4dSGreg Clayton else 339c9858e4dSGreg Clayton { 340c9858e4dSGreg Clayton if (log) 3417730b9a4SJim Ingham log->Printf ("SBFrame::GetBlock () => error: could not reconstruct frame object for this SBFrame."); 3427730b9a4SJim Ingham } 3437730b9a4SJim Ingham } 3447730b9a4SJim Ingham else 3457730b9a4SJim Ingham { 3467730b9a4SJim Ingham if (log) 347324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", 348324a1036SSaleem Abdulrasool static_cast<void*>(frame)); 3497fdf9ef1SGreg Clayton } 350c9858e4dSGreg Clayton } 3514838131bSGreg Clayton if (log) 3524838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)", 353324a1036SSaleem Abdulrasool static_cast<void*>(frame), 354324a1036SSaleem Abdulrasool static_cast<void*>(sb_block.GetPtr())); 35530fdc8d8SChris Lattner return sb_block; 35630fdc8d8SChris Lattner } 35730fdc8d8SChris Lattner 35895897c6aSGreg Clayton SBBlock 35995897c6aSGreg Clayton SBFrame::GetFrameBlock () const 36095897c6aSGreg Clayton { 36172eff18aSGreg Clayton SBBlock sb_block; 3624fc6cb9cSJim Ingham Mutex::Locker api_locker; 3634fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 3644fc6cb9cSJim Ingham 365b57e4a1bSJason Molenda StackFrame *frame = NULL; 366d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 3675160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3687730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 3697730b9a4SJim Ingham if (target && process) 370af67cecdSGreg Clayton { 3717fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3727730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 3737730b9a4SJim Ingham { 3747730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 3757730b9a4SJim Ingham if (frame) 3767fdf9ef1SGreg Clayton { 377d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock ()); 378af67cecdSGreg Clayton } 379c9858e4dSGreg Clayton else 380c9858e4dSGreg Clayton { 381c9858e4dSGreg Clayton if (log) 3827730b9a4SJim Ingham log->Printf ("SBFrame::GetFrameBlock () => error: could not reconstruct frame object for this SBFrame."); 3837730b9a4SJim Ingham } 3847730b9a4SJim Ingham } 3857730b9a4SJim Ingham else 3867730b9a4SJim Ingham { 3877730b9a4SJim Ingham if (log) 3887730b9a4SJim Ingham log->Printf ("SBFrame::GetFrameBlock () => error: process is running"); 3897fdf9ef1SGreg Clayton } 390c9858e4dSGreg Clayton } 3914838131bSGreg Clayton if (log) 3924838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 393324a1036SSaleem Abdulrasool static_cast<void*>(frame), 394324a1036SSaleem Abdulrasool static_cast<void*>(sb_block.GetPtr())); 39595897c6aSGreg Clayton return sb_block; 39695897c6aSGreg Clayton } 39795897c6aSGreg Clayton 39830fdc8d8SChris Lattner SBLineEntry 39930fdc8d8SChris Lattner SBFrame::GetLineEntry () const 40030fdc8d8SChris Lattner { 4015160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 40272eff18aSGreg Clayton SBLineEntry sb_line_entry; 4034fc6cb9cSJim Ingham Mutex::Locker api_locker; 4044fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4054fc6cb9cSJim Ingham 406b57e4a1bSJason Molenda StackFrame *frame = NULL; 407d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4087730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 4097730b9a4SJim Ingham if (target && process) 410af67cecdSGreg Clayton { 4117fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4127730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 4137730b9a4SJim Ingham { 4147730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 4157730b9a4SJim Ingham if (frame) 4167fdf9ef1SGreg Clayton { 417d9e416c0SGreg Clayton sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry); 418af67cecdSGreg Clayton } 419c9858e4dSGreg Clayton else 420c9858e4dSGreg Clayton { 421c9858e4dSGreg Clayton if (log) 4227730b9a4SJim Ingham log->Printf ("SBFrame::GetLineEntry () => error: could not reconstruct frame object for this SBFrame."); 4237730b9a4SJim Ingham } 4247730b9a4SJim Ingham } 4257730b9a4SJim Ingham else 4267730b9a4SJim Ingham { 4277730b9a4SJim Ingham if (log) 4287730b9a4SJim Ingham log->Printf ("SBFrame::GetLineEntry () => error: process is running"); 4297fdf9ef1SGreg Clayton } 430c9858e4dSGreg Clayton } 4314838131bSGreg Clayton if (log) 4324838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 433324a1036SSaleem Abdulrasool static_cast<void*>(frame), 434324a1036SSaleem Abdulrasool static_cast<void*>(sb_line_entry.get())); 43530fdc8d8SChris Lattner return sb_line_entry; 43630fdc8d8SChris Lattner } 43730fdc8d8SChris Lattner 43830fdc8d8SChris Lattner uint32_t 43930fdc8d8SChris Lattner SBFrame::GetFrameID () const 44030fdc8d8SChris Lattner { 441b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 442b9556accSGreg Clayton 4437fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 444b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 4457fdf9ef1SGreg Clayton if (frame) 446d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex (); 4474838131bSGreg Clayton 4485160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4494838131bSGreg Clayton if (log) 4504838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameID () => %u", 451324a1036SSaleem Abdulrasool static_cast<void*>(frame), frame_idx); 4524838131bSGreg Clayton return frame_idx; 45330fdc8d8SChris Lattner } 45430fdc8d8SChris Lattner 45569b582faSGreg Clayton addr_t 45630fdc8d8SChris Lattner SBFrame::GetPC () const 45730fdc8d8SChris Lattner { 4585160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 45969b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 4604fc6cb9cSJim Ingham Mutex::Locker api_locker; 4614fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 4624fc6cb9cSJim Ingham 463b57e4a1bSJason Molenda StackFrame *frame = NULL; 464d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 4657730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 4667730b9a4SJim Ingham if (target && process) 467af67cecdSGreg Clayton { 4687fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4697730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 4707730b9a4SJim Ingham { 4717730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 4727730b9a4SJim Ingham if (frame) 4737fdf9ef1SGreg Clayton { 474d9e416c0SGreg Clayton addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target); 475af67cecdSGreg Clayton } 476c9858e4dSGreg Clayton else 477c9858e4dSGreg Clayton { 478c9858e4dSGreg Clayton if (log) 4797730b9a4SJim Ingham log->Printf ("SBFrame::GetPC () => error: could not reconstruct frame object for this SBFrame."); 4807730b9a4SJim Ingham } 4817730b9a4SJim Ingham } 4827730b9a4SJim Ingham else 4837730b9a4SJim Ingham { 4847730b9a4SJim Ingham if (log) 4857730b9a4SJim Ingham log->Printf ("SBFrame::GetPC () => error: process is running"); 486c9858e4dSGreg Clayton } 4877fdf9ef1SGreg Clayton } 488ceb6b139SCaroline Tice 489ceb6b139SCaroline Tice if (log) 490324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetPC () => 0x%" PRIx64, 491324a1036SSaleem Abdulrasool static_cast<void*>(frame), addr); 492ceb6b139SCaroline Tice 493ceb6b139SCaroline Tice return addr; 49430fdc8d8SChris Lattner } 49530fdc8d8SChris Lattner 49630fdc8d8SChris Lattner bool 49769b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc) 49830fdc8d8SChris Lattner { 4995160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 500ceb6b139SCaroline Tice bool ret_val = false; 5014fc6cb9cSJim Ingham Mutex::Locker api_locker; 5024fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5034fc6cb9cSJim Ingham 504b57e4a1bSJason Molenda StackFrame *frame = NULL; 505d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5067730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 5077730b9a4SJim Ingham if (target && process) 508af67cecdSGreg Clayton { 5097fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5107730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 5117730b9a4SJim Ingham { 5127730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5137730b9a4SJim Ingham if (frame) 5147fdf9ef1SGreg Clayton { 515d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC (new_pc); 516af67cecdSGreg Clayton } 517c9858e4dSGreg Clayton else 518c9858e4dSGreg Clayton { 519c9858e4dSGreg Clayton if (log) 5207730b9a4SJim Ingham log->Printf ("SBFrame::SetPC () => error: could not reconstruct frame object for this SBFrame."); 5217730b9a4SJim Ingham } 5227730b9a4SJim Ingham } 5237730b9a4SJim Ingham else 5247730b9a4SJim Ingham { 5257730b9a4SJim Ingham if (log) 5267730b9a4SJim Ingham log->Printf ("SBFrame::SetPC () => error: process is running"); 527c9858e4dSGreg Clayton } 5287fdf9ef1SGreg Clayton } 529ceb6b139SCaroline Tice 530ceb6b139SCaroline Tice if (log) 531d01b2953SDaniel Malea log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%" PRIx64 ") => %i", 532324a1036SSaleem Abdulrasool static_cast<void*>(frame), new_pc, ret_val); 533ceb6b139SCaroline Tice 534ceb6b139SCaroline Tice return ret_val; 53530fdc8d8SChris Lattner } 53630fdc8d8SChris Lattner 53769b582faSGreg Clayton addr_t 53830fdc8d8SChris Lattner SBFrame::GetSP () const 53930fdc8d8SChris Lattner { 5405160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5414838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 5424fc6cb9cSJim Ingham Mutex::Locker api_locker; 5434fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5444fc6cb9cSJim Ingham 545b57e4a1bSJason Molenda StackFrame *frame = NULL; 546d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5477730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 5487730b9a4SJim Ingham if (target && process) 549af67cecdSGreg Clayton { 5507fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5517730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 5527730b9a4SJim Ingham { 5537730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5547730b9a4SJim Ingham if (frame) 5557fdf9ef1SGreg Clayton { 556d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 557af67cecdSGreg Clayton } 558c9858e4dSGreg Clayton else 559c9858e4dSGreg Clayton { 560c9858e4dSGreg Clayton if (log) 5617730b9a4SJim Ingham log->Printf ("SBFrame::GetSP () => error: could not reconstruct frame object for this SBFrame."); 5627730b9a4SJim Ingham } 5637730b9a4SJim Ingham } 5647730b9a4SJim Ingham else 5657730b9a4SJim Ingham { 5667730b9a4SJim Ingham if (log) 5677730b9a4SJim Ingham log->Printf ("SBFrame::GetSP () => error: process is running"); 5687fdf9ef1SGreg Clayton } 569c9858e4dSGreg Clayton } 5704838131bSGreg Clayton if (log) 571324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetSP () => 0x%" PRIx64, 572324a1036SSaleem Abdulrasool static_cast<void*>(frame), addr); 5734838131bSGreg Clayton 5744838131bSGreg Clayton return addr; 57530fdc8d8SChris Lattner } 57630fdc8d8SChris Lattner 57730fdc8d8SChris Lattner 57869b582faSGreg Clayton addr_t 57930fdc8d8SChris Lattner SBFrame::GetFP () const 58030fdc8d8SChris Lattner { 5815160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 58269b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 5834fc6cb9cSJim Ingham Mutex::Locker api_locker; 5844fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 5854fc6cb9cSJim Ingham 586b57e4a1bSJason Molenda StackFrame *frame = NULL; 587d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 5887730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 5897730b9a4SJim Ingham if (target && process) 590af67cecdSGreg Clayton { 5917fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5927730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 5937730b9a4SJim Ingham { 5947730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 5957730b9a4SJim Ingham if (frame) 5967fdf9ef1SGreg Clayton { 597d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 598af67cecdSGreg Clayton } 599c9858e4dSGreg Clayton else 600c9858e4dSGreg Clayton { 601c9858e4dSGreg Clayton if (log) 6027730b9a4SJim Ingham log->Printf ("SBFrame::GetFP () => error: could not reconstruct frame object for this SBFrame."); 6037730b9a4SJim Ingham } 6047730b9a4SJim Ingham } 6057730b9a4SJim Ingham else 6067730b9a4SJim Ingham { 6077730b9a4SJim Ingham if (log) 6087730b9a4SJim Ingham log->Printf ("SBFrame::GetFP () => error: process is running"); 609c9858e4dSGreg Clayton } 6107fdf9ef1SGreg Clayton } 611ceb6b139SCaroline Tice 612ceb6b139SCaroline Tice if (log) 613324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetFP () => 0x%" PRIx64, 614324a1036SSaleem Abdulrasool static_cast<void*>(frame), addr); 615ceb6b139SCaroline Tice return addr; 61630fdc8d8SChris Lattner } 61730fdc8d8SChris Lattner 61830fdc8d8SChris Lattner 61930fdc8d8SChris Lattner SBAddress 62030fdc8d8SChris Lattner SBFrame::GetPCAddress () const 62130fdc8d8SChris Lattner { 6225160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 62330fdc8d8SChris Lattner SBAddress sb_addr; 6244fc6cb9cSJim Ingham Mutex::Locker api_locker; 6254fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 6264fc6cb9cSJim Ingham 627b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 628d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6297730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 6307730b9a4SJim Ingham if (target && process) 631af67cecdSGreg Clayton { 6327fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6337730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 6347730b9a4SJim Ingham { 6357730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 6367730b9a4SJim Ingham if (frame) 6377fdf9ef1SGreg Clayton { 638d9e416c0SGreg Clayton sb_addr.SetAddress (&frame->GetFrameCodeAddress()); 639af67cecdSGreg Clayton } 640c9858e4dSGreg Clayton else 641c9858e4dSGreg Clayton { 642c9858e4dSGreg Clayton if (log) 6437730b9a4SJim Ingham log->Printf ("SBFrame::GetPCAddress () => error: could not reconstruct frame object for this SBFrame."); 6447730b9a4SJim Ingham } 6457730b9a4SJim Ingham } 6467730b9a4SJim Ingham else 6477730b9a4SJim Ingham { 6487730b9a4SJim Ingham if (log) 6497730b9a4SJim Ingham log->Printf ("SBFrame::GetPCAddress () => error: process is running"); 6507fdf9ef1SGreg Clayton } 651c9858e4dSGreg Clayton } 6524838131bSGreg Clayton if (log) 653324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", 654324a1036SSaleem Abdulrasool static_cast<void*>(frame), 655324a1036SSaleem Abdulrasool static_cast<void*>(sb_addr.get())); 65630fdc8d8SChris Lattner return sb_addr; 65730fdc8d8SChris Lattner } 65830fdc8d8SChris Lattner 65930fdc8d8SChris Lattner void 66030fdc8d8SChris Lattner SBFrame::Clear() 66130fdc8d8SChris Lattner { 662af2589eaSGreg Clayton m_opaque_sp->Clear(); 66330fdc8d8SChris Lattner } 66430fdc8d8SChris Lattner 6657edbdfc9SGreg Clayton lldb::SBValue 6667edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path) 6677edbdfc9SGreg Clayton { 6687edbdfc9SGreg Clayton SBValue sb_value; 6697fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 670b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 671d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 672d9e416c0SGreg Clayton if (frame && target) 6737edbdfc9SGreg Clayton { 674d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 6757edbdfc9SGreg Clayton sb_value = GetValueForVariablePath (var_path, use_dynamic); 6767edbdfc9SGreg Clayton } 6777edbdfc9SGreg Clayton return sb_value; 6787edbdfc9SGreg Clayton } 6797edbdfc9SGreg Clayton 6807edbdfc9SGreg Clayton lldb::SBValue 6817edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic) 6827edbdfc9SGreg Clayton { 6837edbdfc9SGreg Clayton SBValue sb_value; 6844fc6cb9cSJim Ingham Mutex::Locker api_locker; 6855160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 6867730b9a4SJim Ingham if (var_path == NULL || var_path[0] == '\0') 6877730b9a4SJim Ingham { 6887730b9a4SJim Ingham if (log) 6897730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath called with empty variable path."); 6907730b9a4SJim Ingham return sb_value; 6917730b9a4SJim Ingham } 6927730b9a4SJim Ingham 6934fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 6944fc6cb9cSJim Ingham 695b57e4a1bSJason Molenda StackFrame *frame = NULL; 696d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 6977730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 6987730b9a4SJim Ingham if (target && process) 6997edbdfc9SGreg Clayton { 7007fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7017730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 7027730b9a4SJim Ingham { 7037730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 7047730b9a4SJim Ingham if (frame) 7057fdf9ef1SGreg Clayton { 7067edbdfc9SGreg Clayton VariableSP var_sp; 7077edbdfc9SGreg Clayton Error error; 708d9e416c0SGreg Clayton ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path, 709e3e91517SEnrico Granata eNoDynamicValues, 710b57e4a1bSJason Molenda StackFrame::eExpressionPathOptionCheckPtrVsMember | StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 7117edbdfc9SGreg Clayton var_sp, 7127edbdfc9SGreg Clayton error)); 713e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 7147edbdfc9SGreg Clayton } 715c9858e4dSGreg Clayton else 716c9858e4dSGreg Clayton { 717c9858e4dSGreg Clayton if (log) 7187730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath () => error: could not reconstruct frame object for this SBFrame."); 7197730b9a4SJim Ingham } 7207730b9a4SJim Ingham } 7217730b9a4SJim Ingham else 7227730b9a4SJim Ingham { 7237730b9a4SJim Ingham if (log) 7247730b9a4SJim Ingham log->Printf ("SBFrame::GetValueForVariablePath () => error: process is running"); 725c9858e4dSGreg Clayton } 7267fdf9ef1SGreg Clayton } 7277edbdfc9SGreg Clayton return sb_value; 7287edbdfc9SGreg Clayton } 7297edbdfc9SGreg Clayton 73030fdc8d8SChris Lattner SBValue 73169b582faSGreg Clayton SBFrame::FindVariable (const char *name) 73230fdc8d8SChris Lattner { 733316d498bSGreg Clayton SBValue value; 7347fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 735b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 736d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 737d9e416c0SGreg Clayton if (frame && target) 738316d498bSGreg Clayton { 739d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 740316d498bSGreg Clayton value = FindVariable (name, use_dynamic); 741316d498bSGreg Clayton } 742316d498bSGreg Clayton return value; 74378a685aaSJim Ingham } 74478a685aaSJim Ingham 74578a685aaSJim Ingham SBValue 7462837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic) 74778a685aaSJim Ingham { 7485160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 74969b582faSGreg Clayton VariableSP var_sp; 75058b59f95SJim Ingham SBValue sb_value; 7517730b9a4SJim Ingham 7527730b9a4SJim Ingham if (name == NULL || name[0] == '\0') 7537730b9a4SJim Ingham { 7547730b9a4SJim Ingham if (log) 7557730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable called with empty name"); 7567730b9a4SJim Ingham return sb_value; 7577730b9a4SJim Ingham } 7587730b9a4SJim Ingham 75981e871edSGreg Clayton ValueObjectSP value_sp; 7604fc6cb9cSJim Ingham Mutex::Locker api_locker; 7614fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 7624fc6cb9cSJim Ingham 763b57e4a1bSJason Molenda StackFrame *frame = NULL; 764d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 7657730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 7667730b9a4SJim Ingham if (target && process) 76730fdc8d8SChris Lattner { 7687fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 7697730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 7707730b9a4SJim Ingham { 7717730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 7727730b9a4SJim Ingham if (frame) 7737fdf9ef1SGreg Clayton { 77469b582faSGreg Clayton VariableList variable_list; 775d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 77630fdc8d8SChris Lattner 77772eff18aSGreg Clayton if (sc.block) 77830fdc8d8SChris Lattner { 77972eff18aSGreg Clayton const bool can_create = true; 78072eff18aSGreg Clayton const bool get_parent_variables = true; 78172eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 78272eff18aSGreg Clayton 78372eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 78472eff18aSGreg Clayton get_parent_variables, 78572eff18aSGreg Clayton stop_if_block_is_inlined_function, 78672eff18aSGreg Clayton &variable_list)) 78772eff18aSGreg Clayton { 78869b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 78930fdc8d8SChris Lattner } 79072eff18aSGreg Clayton } 79130fdc8d8SChris Lattner 7924838131bSGreg Clayton if (var_sp) 79381e871edSGreg Clayton { 794e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable(var_sp, eNoDynamicValues); 795e3e91517SEnrico Granata sb_value.SetSP(value_sp, use_dynamic); 79681e871edSGreg Clayton } 7977fdf9ef1SGreg Clayton } 798c9858e4dSGreg Clayton else 799c9858e4dSGreg Clayton { 800c9858e4dSGreg Clayton if (log) 8017730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable () => error: could not reconstruct frame object for this SBFrame."); 8027730b9a4SJim Ingham } 8037730b9a4SJim Ingham } 8047730b9a4SJim Ingham else 8057730b9a4SJim Ingham { 8067730b9a4SJim Ingham if (log) 8077730b9a4SJim Ingham log->Printf ("SBFrame::FindVariable () => error: process is running"); 808c9858e4dSGreg Clayton } 809316d498bSGreg Clayton } 810316d498bSGreg Clayton 8114838131bSGreg Clayton if (log) 81269b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 813324a1036SSaleem Abdulrasool static_cast<void*>(frame), name, 814324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 8154838131bSGreg Clayton 816dde9cff3SCaroline Tice return sb_value; 817dde9cff3SCaroline Tice } 818dde9cff3SCaroline Tice 81930fdc8d8SChris Lattner SBValue 82069b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 82130fdc8d8SChris Lattner { 822316d498bSGreg Clayton SBValue value; 8237fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 824b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 825d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 826d9e416c0SGreg Clayton if (frame && target) 827316d498bSGreg Clayton { 828d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 829316d498bSGreg Clayton value = FindValue (name, value_type, use_dynamic); 830316d498bSGreg Clayton } 831316d498bSGreg Clayton return value; 83278a685aaSJim Ingham } 83378a685aaSJim Ingham 83478a685aaSJim Ingham SBValue 8352837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) 83678a685aaSJim Ingham { 8375160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 83869b582faSGreg Clayton SBValue sb_value; 8397730b9a4SJim Ingham 8407730b9a4SJim Ingham if (name == NULL || name[0] == '\0') 8417730b9a4SJim Ingham { 8427730b9a4SJim Ingham if (log) 8437730b9a4SJim Ingham log->Printf ("SBFrame::FindValue called with empty name."); 8447730b9a4SJim Ingham return sb_value; 8457730b9a4SJim Ingham } 8467730b9a4SJim Ingham 84781e871edSGreg Clayton ValueObjectSP value_sp; 8484fc6cb9cSJim Ingham Mutex::Locker api_locker; 8494fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 8504fc6cb9cSJim Ingham 851b57e4a1bSJason Molenda StackFrame *frame = NULL; 852d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 8537730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 8547730b9a4SJim Ingham if (target && process) 85530fdc8d8SChris Lattner { 8567fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8577730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 8587730b9a4SJim Ingham { 8597730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 8607730b9a4SJim Ingham if (frame) 8617fdf9ef1SGreg Clayton { 8628a2a0dfbSEnrico Granata VariableList variable_list; 8638a2a0dfbSEnrico Granata 86469b582faSGreg Clayton switch (value_type) 86530fdc8d8SChris Lattner { 86669b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 86769b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 86869b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 86969b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 87069b582faSGreg Clayton { 871d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 87272eff18aSGreg Clayton 87372eff18aSGreg Clayton const bool can_create = true; 87472eff18aSGreg Clayton const bool get_parent_variables = true; 87572eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 87672eff18aSGreg Clayton 87772eff18aSGreg Clayton if (sc.block && sc.block->AppendVariables (can_create, 87872eff18aSGreg Clayton get_parent_variables, 87972eff18aSGreg Clayton stop_if_block_is_inlined_function, 88008a04327SEnrico Granata &variable_list)) 881beae523aSJohnny Chen { 8828a2a0dfbSEnrico Granata if (value_type == eValueTypeVariableGlobal) 8838a2a0dfbSEnrico Granata { 8848a2a0dfbSEnrico Granata const bool get_file_globals = true; 8858a2a0dfbSEnrico Granata VariableList* frame_vars = frame->GetVariableList(get_file_globals); 8868a2a0dfbSEnrico Granata if (frame_vars) 8878a2a0dfbSEnrico Granata frame_vars->AppendVariablesIfUnique(variable_list); 8888a2a0dfbSEnrico Granata } 88969b582faSGreg Clayton ConstString const_name(name); 89008a04327SEnrico Granata VariableSP variable_sp(variable_list.FindVariable(const_name,value_type)); 89108a04327SEnrico Granata if (variable_sp) 892beae523aSJohnny Chen { 893e3e91517SEnrico Granata value_sp = frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues); 894e3e91517SEnrico Granata sb_value.SetSP (value_sp, use_dynamic); 895beae523aSJohnny Chen break; 896beae523aSJohnny Chen } 89730fdc8d8SChris Lattner } 89830fdc8d8SChris Lattner } 89969b582faSGreg Clayton break; 90069b582faSGreg Clayton 90169b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 90269b582faSGreg Clayton { 903d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 90469b582faSGreg Clayton if (reg_ctx) 90569b582faSGreg Clayton { 90669b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 90769b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 90869b582faSGreg Clayton { 90969b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 91069b582faSGreg Clayton if (reg_info && 91169b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 91269b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 91369b582faSGreg Clayton { 914d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 91581e871edSGreg Clayton sb_value.SetSP (value_sp); 91681e871edSGreg Clayton break; 91769b582faSGreg Clayton } 91869b582faSGreg Clayton } 91969b582faSGreg Clayton } 92069b582faSGreg Clayton } 92169b582faSGreg Clayton break; 92269b582faSGreg Clayton 92369b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 92469b582faSGreg Clayton { 925d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 92669b582faSGreg Clayton if (reg_ctx) 92769b582faSGreg Clayton { 92869b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 92969b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 93069b582faSGreg Clayton { 93169b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 93269b582faSGreg Clayton if (reg_set && 93369b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 93469b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 93569b582faSGreg Clayton { 936d9e416c0SGreg Clayton value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx); 93781e871edSGreg Clayton sb_value.SetSP (value_sp); 93881e871edSGreg Clayton break; 93969b582faSGreg Clayton } 94069b582faSGreg Clayton } 94169b582faSGreg Clayton } 94269b582faSGreg Clayton } 94369b582faSGreg Clayton break; 94469b582faSGreg Clayton 94569b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 94669b582faSGreg Clayton { 94769b582faSGreg Clayton ConstString const_name(name); 948d9e416c0SGreg Clayton ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name)); 94969b582faSGreg Clayton if (expr_var_sp) 95081e871edSGreg Clayton { 95181e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 952e3e91517SEnrico Granata sb_value.SetSP (value_sp, use_dynamic); 95381e871edSGreg Clayton } 95469b582faSGreg Clayton } 95569b582faSGreg Clayton break; 95669b582faSGreg Clayton 95769b582faSGreg Clayton default: 95869b582faSGreg Clayton break; 95969b582faSGreg Clayton } 960beae523aSJohnny Chen } 961c9858e4dSGreg Clayton else 962c9858e4dSGreg Clayton { 963c9858e4dSGreg Clayton if (log) 9647730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: could not reconstruct frame object for this SBFrame."); 9657730b9a4SJim Ingham } 9667730b9a4SJim Ingham } 9677730b9a4SJim Ingham else 9687730b9a4SJim Ingham { 9697730b9a4SJim Ingham if (log) 9707730b9a4SJim Ingham log->Printf ("SBFrame::FindValue () => error: process is running"); 971c9858e4dSGreg Clayton } 9727fdf9ef1SGreg Clayton } 973dde9cff3SCaroline Tice 9744838131bSGreg Clayton if (log) 97569b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 976324a1036SSaleem Abdulrasool static_cast<void*>(frame), name, value_type, 977324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 9784838131bSGreg Clayton 979dde9cff3SCaroline Tice return sb_value; 980dde9cff3SCaroline Tice } 981dde9cff3SCaroline Tice 98230fdc8d8SChris Lattner bool 98335e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const 98435e2ab60SJohnny Chen { 985b57e4a1bSJason Molenda lldb::StackFrameSP this_sp = GetFrameSP(); 986b57e4a1bSJason Molenda lldb::StackFrameSP that_sp = that.GetFrameSP(); 98735e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 98835e2ab60SJohnny Chen } 98935e2ab60SJohnny Chen 99035e2ab60SJohnny Chen bool 99130fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 99230fdc8d8SChris Lattner { 99335e2ab60SJohnny Chen return IsEqual(rhs); 99430fdc8d8SChris Lattner } 99530fdc8d8SChris Lattner 99630fdc8d8SChris Lattner bool 99730fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 99830fdc8d8SChris Lattner { 99935e2ab60SJohnny Chen return !IsEqual(rhs); 1000481cef25SGreg Clayton } 100130fdc8d8SChris Lattner 100230fdc8d8SChris Lattner SBThread 100330fdc8d8SChris Lattner SBFrame::GetThread () const 100430fdc8d8SChris Lattner { 10055160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1006ceb6b139SCaroline Tice 10077fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1008d9e416c0SGreg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 1009d9e416c0SGreg Clayton SBThread sb_thread (thread_sp); 1010ceb6b139SCaroline Tice 1011ceb6b139SCaroline Tice if (log) 1012750cd175SCaroline Tice { 1013750cd175SCaroline Tice SBStream sstr; 1014750cd175SCaroline Tice sb_thread.GetDescription (sstr); 1015d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", 1016324a1036SSaleem Abdulrasool static_cast<void*>(exe_ctx.GetFramePtr()), 1017324a1036SSaleem Abdulrasool static_cast<void*>(thread_sp.get()), sstr.GetData()); 1018750cd175SCaroline Tice } 1019ceb6b139SCaroline Tice 102030fdc8d8SChris Lattner return sb_thread; 102130fdc8d8SChris Lattner } 102230fdc8d8SChris Lattner 102330fdc8d8SChris Lattner const char * 102430fdc8d8SChris Lattner SBFrame::Disassemble () const 102530fdc8d8SChris Lattner { 10265160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 10274838131bSGreg Clayton const char *disassembly = NULL; 10284fc6cb9cSJim Ingham Mutex::Locker api_locker; 10294fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 10304fc6cb9cSJim Ingham 1031b57e4a1bSJason Molenda StackFrame *frame = NULL; 1032d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 10337730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 10347730b9a4SJim Ingham if (target && process) 1035af67cecdSGreg Clayton { 10367fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10377730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 10387730b9a4SJim Ingham { 10397730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 10407730b9a4SJim Ingham if (frame) 10417fdf9ef1SGreg Clayton { 1042d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 1043af67cecdSGreg Clayton } 1044c9858e4dSGreg Clayton else 1045c9858e4dSGreg Clayton { 1046c9858e4dSGreg Clayton if (log) 10477730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: could not reconstruct frame object for this SBFrame."); 10487730b9a4SJim Ingham } 10497730b9a4SJim Ingham } 10507730b9a4SJim Ingham else 10517730b9a4SJim Ingham { 10527730b9a4SJim Ingham if (log) 10537730b9a4SJim Ingham log->Printf ("SBFrame::Disassemble () => error: process is running"); 10547fdf9ef1SGreg Clayton } 1055c9858e4dSGreg Clayton } 10564838131bSGreg Clayton 10574838131bSGreg Clayton if (log) 1058324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::Disassemble () => %s", 1059324a1036SSaleem Abdulrasool static_cast<void*>(frame), disassembly); 10604838131bSGreg Clayton 10614838131bSGreg Clayton return disassembly; 106230fdc8d8SChris Lattner } 106330fdc8d8SChris Lattner 106430fdc8d8SChris Lattner 106530fdc8d8SChris Lattner SBValueList 106630fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 106730fdc8d8SChris Lattner bool locals, 106830fdc8d8SChris Lattner bool statics, 106930fdc8d8SChris Lattner bool in_scope_only) 107030fdc8d8SChris Lattner { 1071316d498bSGreg Clayton SBValueList value_list; 10727fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1073b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1074d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1075d9e416c0SGreg Clayton if (frame && target) 1076316d498bSGreg Clayton { 1077d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 1078316d498bSGreg Clayton value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic); 1079316d498bSGreg Clayton } 1080316d498bSGreg Clayton return value_list; 108178a685aaSJim Ingham } 108278a685aaSJim Ingham 1083*560558ebSEnrico Granata lldb::SBValueList 1084*560558ebSEnrico Granata SBFrame::GetVariables (bool arguments, 1085*560558ebSEnrico Granata bool locals, 1086*560558ebSEnrico Granata bool statics, 1087*560558ebSEnrico Granata bool in_scope_only, 1088*560558ebSEnrico Granata lldb::DynamicValueType use_dynamic) 1089*560558ebSEnrico Granata { 1090*560558ebSEnrico Granata ExecutionContext exe_ctx(m_opaque_sp.get()); 1091*560558ebSEnrico Granata Target *target = exe_ctx.GetTargetPtr(); 1092*560558ebSEnrico Granata bool include_runtime_support_values = target ? target->GetDisplayRuntimeSupportValues() : false; 1093*560558ebSEnrico Granata return GetVariables(arguments, 1094*560558ebSEnrico Granata locals, 1095*560558ebSEnrico Granata statics, 1096*560558ebSEnrico Granata in_scope_only, 1097*560558ebSEnrico Granata include_runtime_support_values, 1098*560558ebSEnrico Granata use_dynamic); 1099*560558ebSEnrico Granata } 1100*560558ebSEnrico Granata 110178a685aaSJim Ingham SBValueList 110278a685aaSJim Ingham SBFrame::GetVariables (bool arguments, 110378a685aaSJim Ingham bool locals, 110478a685aaSJim Ingham bool statics, 110578a685aaSJim Ingham bool in_scope_only, 1106*560558ebSEnrico Granata bool include_runtime_support_values, 11072837b766SJim Ingham lldb::DynamicValueType use_dynamic) 110878a685aaSJim Ingham { 11095160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1110ceb6b139SCaroline Tice 1111b9556accSGreg Clayton SBValueList value_list; 11124fc6cb9cSJim Ingham Mutex::Locker api_locker; 11134fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 11144fc6cb9cSJim Ingham 1115b57e4a1bSJason Molenda StackFrame *frame = NULL; 1116d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1117b9556accSGreg Clayton 1118ceb6b139SCaroline Tice if (log) 11197730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 1120324a1036SSaleem Abdulrasool arguments, locals, statics, in_scope_only); 1121ceb6b139SCaroline Tice 11227730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 11237730b9a4SJim Ingham if (target && process) 112430fdc8d8SChris Lattner { 11257fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11267730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 11277fdf9ef1SGreg Clayton { 11287730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 11297730b9a4SJim Ingham if (frame) 11307730b9a4SJim Ingham { 113130fdc8d8SChris Lattner size_t i; 1132af67cecdSGreg Clayton VariableList *variable_list = NULL; 1133d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 113430fdc8d8SChris Lattner if (variable_list) 113530fdc8d8SChris Lattner { 113630fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 113730fdc8d8SChris Lattner if (num_variables) 113830fdc8d8SChris Lattner { 113930fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 114030fdc8d8SChris Lattner { 114130fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 114230fdc8d8SChris Lattner if (variable_sp) 114330fdc8d8SChris Lattner { 114430fdc8d8SChris Lattner bool add_variable = false; 114530fdc8d8SChris Lattner switch (variable_sp->GetScope()) 114630fdc8d8SChris Lattner { 114730fdc8d8SChris Lattner case eValueTypeVariableGlobal: 114830fdc8d8SChris Lattner case eValueTypeVariableStatic: 114930fdc8d8SChris Lattner add_variable = statics; 115030fdc8d8SChris Lattner break; 115130fdc8d8SChris Lattner 115230fdc8d8SChris Lattner case eValueTypeVariableArgument: 115330fdc8d8SChris Lattner add_variable = arguments; 115430fdc8d8SChris Lattner break; 115530fdc8d8SChris Lattner 115630fdc8d8SChris Lattner case eValueTypeVariableLocal: 115730fdc8d8SChris Lattner add_variable = locals; 115830fdc8d8SChris Lattner break; 1159c982c768SGreg Clayton 1160c982c768SGreg Clayton default: 1161c982c768SGreg Clayton break; 116230fdc8d8SChris Lattner } 116330fdc8d8SChris Lattner if (add_variable) 116430fdc8d8SChris Lattner { 1165d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 116630fdc8d8SChris Lattner continue; 116730fdc8d8SChris Lattner 1168e3e91517SEnrico Granata ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable (variable_sp, eNoDynamicValues)); 1169*560558ebSEnrico Granata 1170*560558ebSEnrico Granata if (false == include_runtime_support_values && 1171*560558ebSEnrico Granata valobj_sp && 1172*560558ebSEnrico Granata true == valobj_sp->IsRuntimeSupportValue()) 1173*560558ebSEnrico Granata continue; 1174*560558ebSEnrico Granata 1175e3e91517SEnrico Granata SBValue value_sb; 1176e3e91517SEnrico Granata value_sb.SetSP(valobj_sp,use_dynamic); 1177e3e91517SEnrico Granata value_list.Append(value_sb); 117830fdc8d8SChris Lattner } 117930fdc8d8SChris Lattner } 118030fdc8d8SChris Lattner } 118130fdc8d8SChris Lattner } 118230fdc8d8SChris Lattner } 118330fdc8d8SChris Lattner } 1184c9858e4dSGreg Clayton else 1185c9858e4dSGreg Clayton { 1186c9858e4dSGreg Clayton if (log) 11877730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: could not reconstruct frame object for this SBFrame."); 11887730b9a4SJim Ingham } 11897730b9a4SJim Ingham } 11907730b9a4SJim Ingham else 11917730b9a4SJim Ingham { 11927730b9a4SJim Ingham if (log) 11937730b9a4SJim Ingham log->Printf ("SBFrame::GetVariables () => error: process is running"); 1194c9858e4dSGreg Clayton } 11957fdf9ef1SGreg Clayton } 1196ceb6b139SCaroline Tice 1197ceb6b139SCaroline Tice if (log) 1198324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", 1199324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1200324a1036SSaleem Abdulrasool static_cast<void*>(value_list.opaque_ptr())); 1201ceb6b139SCaroline Tice 120230fdc8d8SChris Lattner return value_list; 120330fdc8d8SChris Lattner } 120430fdc8d8SChris Lattner 120569b582faSGreg Clayton SBValueList 120630fdc8d8SChris Lattner SBFrame::GetRegisters () 120730fdc8d8SChris Lattner { 12085160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1209ceb6b139SCaroline Tice 121030fdc8d8SChris Lattner SBValueList value_list; 12114fc6cb9cSJim Ingham Mutex::Locker api_locker; 12124fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 12134fc6cb9cSJim Ingham 1214b57e4a1bSJason Molenda StackFrame *frame = NULL; 1215d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 12167730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 12177730b9a4SJim Ingham if (target && process) 121830fdc8d8SChris Lattner { 12197fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 12207730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 12217730b9a4SJim Ingham { 12227730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 12237730b9a4SJim Ingham if (frame) 12247fdf9ef1SGreg Clayton { 1225d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 122630fdc8d8SChris Lattner if (reg_ctx) 122730fdc8d8SChris Lattner { 122830fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 122930fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 123030fdc8d8SChris Lattner { 1231d9e416c0SGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); 123230fdc8d8SChris Lattner } 123330fdc8d8SChris Lattner } 123430fdc8d8SChris Lattner } 1235c9858e4dSGreg Clayton else 1236c9858e4dSGreg Clayton { 1237c9858e4dSGreg Clayton if (log) 12387730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: could not reconstruct frame object for this SBFrame."); 12397730b9a4SJim Ingham } 12407730b9a4SJim Ingham } 12417730b9a4SJim Ingham else 12427730b9a4SJim Ingham { 12437730b9a4SJim Ingham if (log) 12447730b9a4SJim Ingham log->Printf ("SBFrame::GetRegisters () => error: process is running"); 1245c9858e4dSGreg Clayton } 12467fdf9ef1SGreg Clayton } 1247ceb6b139SCaroline Tice 1248ceb6b139SCaroline Tice if (log) 1249324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", 1250324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1251324a1036SSaleem Abdulrasool static_cast<void*>(value_list.opaque_ptr())); 1252ceb6b139SCaroline Tice 125330fdc8d8SChris Lattner return value_list; 125430fdc8d8SChris Lattner } 125530fdc8d8SChris Lattner 1256ad9a53c5SJason Molenda SBValue 1257ad9a53c5SJason Molenda SBFrame::FindRegister (const char *name) 1258ad9a53c5SJason Molenda { 1259ad9a53c5SJason Molenda Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1260ad9a53c5SJason Molenda 1261ad9a53c5SJason Molenda SBValue result; 1262ad9a53c5SJason Molenda ValueObjectSP value_sp; 1263ad9a53c5SJason Molenda Mutex::Locker api_locker; 1264ad9a53c5SJason Molenda ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 1265ad9a53c5SJason Molenda 1266b57e4a1bSJason Molenda StackFrame *frame = NULL; 1267ad9a53c5SJason Molenda Target *target = exe_ctx.GetTargetPtr(); 1268ad9a53c5SJason Molenda Process *process = exe_ctx.GetProcessPtr(); 1269ad9a53c5SJason Molenda if (target && process) 1270ad9a53c5SJason Molenda { 1271ad9a53c5SJason Molenda Process::StopLocker stop_locker; 1272ad9a53c5SJason Molenda if (stop_locker.TryLock(&process->GetRunLock())) 1273ad9a53c5SJason Molenda { 1274ad9a53c5SJason Molenda frame = exe_ctx.GetFramePtr(); 1275ad9a53c5SJason Molenda if (frame) 1276ad9a53c5SJason Molenda { 1277ad9a53c5SJason Molenda RegisterContextSP reg_ctx (frame->GetRegisterContext()); 1278ad9a53c5SJason Molenda if (reg_ctx) 1279ad9a53c5SJason Molenda { 1280ad9a53c5SJason Molenda const uint32_t num_regs = reg_ctx->GetRegisterCount(); 1281ad9a53c5SJason Molenda for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 1282ad9a53c5SJason Molenda { 1283ad9a53c5SJason Molenda const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 1284ad9a53c5SJason Molenda if (reg_info && 1285ad9a53c5SJason Molenda ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 1286ad9a53c5SJason Molenda (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 1287ad9a53c5SJason Molenda { 1288ad9a53c5SJason Molenda value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 1289ad9a53c5SJason Molenda result.SetSP (value_sp); 1290ad9a53c5SJason Molenda break; 1291ad9a53c5SJason Molenda } 1292ad9a53c5SJason Molenda } 1293ad9a53c5SJason Molenda } 1294ad9a53c5SJason Molenda } 1295ad9a53c5SJason Molenda else 1296ad9a53c5SJason Molenda { 1297ad9a53c5SJason Molenda if (log) 12985d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: could not reconstruct frame object for this SBFrame."); 1299ad9a53c5SJason Molenda } 1300ad9a53c5SJason Molenda } 1301ad9a53c5SJason Molenda else 1302ad9a53c5SJason Molenda { 1303ad9a53c5SJason Molenda if (log) 13045d353842SJason Molenda log->Printf ("SBFrame::FindRegister () => error: process is running"); 1305ad9a53c5SJason Molenda } 1306ad9a53c5SJason Molenda } 1307ad9a53c5SJason Molenda 1308ad9a53c5SJason Molenda if (log) 1309324a1036SSaleem Abdulrasool log->Printf ("SBFrame(%p)::FindRegister () => SBValue(%p)", 1310324a1036SSaleem Abdulrasool static_cast<void*>(frame), 1311324a1036SSaleem Abdulrasool static_cast<void*>(value_sp.get())); 1312ad9a53c5SJason Molenda 1313ad9a53c5SJason Molenda return result; 1314ad9a53c5SJason Molenda } 1315ad9a53c5SJason Molenda 1316dde9cff3SCaroline Tice bool 1317dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 1318dde9cff3SCaroline Tice { 13195160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1320da7bc7d0SGreg Clayton Stream &strm = description.ref(); 1321da7bc7d0SGreg Clayton 13224fc6cb9cSJim Ingham Mutex::Locker api_locker; 13234fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 13244fc6cb9cSJim Ingham 1325b57e4a1bSJason Molenda StackFrame *frame; 1326d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 13277730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 13287730b9a4SJim Ingham if (target && process) 1329dde9cff3SCaroline Tice { 13307fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 13317730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 13327730b9a4SJim Ingham { 13337730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 13347730b9a4SJim Ingham if (frame) 13357fdf9ef1SGreg Clayton { 1336d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 1337dde9cff3SCaroline Tice } 1338c9858e4dSGreg Clayton else 1339c9858e4dSGreg Clayton { 1340c9858e4dSGreg Clayton if (log) 13417730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: could not reconstruct frame object for this SBFrame."); 13427730b9a4SJim Ingham } 13437730b9a4SJim Ingham } 13447730b9a4SJim Ingham else 13457730b9a4SJim Ingham { 13467730b9a4SJim Ingham if (log) 13477730b9a4SJim Ingham log->Printf ("SBFrame::GetDescription () => error: process is running"); 1348c9858e4dSGreg Clayton } 1349c9858e4dSGreg Clayton 13507fdf9ef1SGreg Clayton } 1351dde9cff3SCaroline Tice else 1352da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1353dde9cff3SCaroline Tice 1354dde9cff3SCaroline Tice return true; 1355dde9cff3SCaroline Tice } 13561d3afba3SGreg Clayton 135769b582faSGreg Clayton SBValue 13581d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 13591d3afba3SGreg Clayton { 1360316d498bSGreg Clayton SBValue result; 13617fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1362b57e4a1bSJason Molenda StackFrame *frame = exe_ctx.GetFramePtr(); 1363d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1364d9e416c0SGreg Clayton if (frame && target) 1365316d498bSGreg Clayton { 136635e1bda6SJim Ingham SBExpressionOptions options; 136735e1bda6SJim Ingham lldb::DynamicValueType fetch_dynamic_value = frame->CalculateTarget()->GetPreferDynamicValue(); 1368cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 136935e1bda6SJim Ingham options.SetUnwindOnError (true); 137035e1bda6SJim Ingham return EvaluateExpression (expr, options); 1371316d498bSGreg Clayton } 1372316d498bSGreg Clayton return result; 137378a685aaSJim Ingham } 137478a685aaSJim Ingham 137578a685aaSJim Ingham SBValue 13762837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 137778a685aaSJim Ingham { 137835e1bda6SJim Ingham SBExpressionOptions options; 1379cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 138035e1bda6SJim Ingham options.SetUnwindOnError (true); 138135e1bda6SJim Ingham return EvaluateExpression (expr, options); 13827ba6e991SJim Ingham } 13837ba6e991SJim Ingham 13847ba6e991SJim Ingham SBValue 13857ba6e991SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value, bool unwind_on_error) 13867ba6e991SJim Ingham { 138735e1bda6SJim Ingham SBExpressionOptions options; 1388cced1566SGreg Clayton options.SetFetchDynamicValue (fetch_dynamic_value); 138935e1bda6SJim Ingham options.SetUnwindOnError (unwind_on_error); 139035e1bda6SJim Ingham return EvaluateExpression (expr, options); 139135e1bda6SJim Ingham } 139235e1bda6SJim Ingham 139335e1bda6SJim Ingham lldb::SBValue 139435e1bda6SJim Ingham SBFrame::EvaluateExpression (const char *expr, const SBExpressionOptions &options) 139535e1bda6SJim Ingham { 13965160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 13974838131bSGreg Clayton 13985160ce5cSGreg Clayton Log *expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1399a162ebafSSean Callanan 14008646d3c1SJim Ingham ExpressionResults exe_results = eExpressionSetupError; 140169b582faSGreg Clayton SBValue expr_result; 14027730b9a4SJim Ingham 14037730b9a4SJim Ingham if (expr == NULL || expr[0] == '\0') 14047730b9a4SJim Ingham { 14057730b9a4SJim Ingham if (log) 14067730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression called with an empty expression"); 14077730b9a4SJim Ingham return expr_result; 14087730b9a4SJim Ingham } 14097730b9a4SJim Ingham 141081e871edSGreg Clayton ValueObjectSP expr_value_sp; 14114838131bSGreg Clayton 14124fc6cb9cSJim Ingham Mutex::Locker api_locker; 14134fc6cb9cSJim Ingham ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); 14144fc6cb9cSJim Ingham 1415b9556accSGreg Clayton if (log) 14167730b9a4SJim Ingham log->Printf ("SBFrame()::EvaluateExpression (expr=\"%s\")...", expr); 1417b9556accSGreg Clayton 1418b57e4a1bSJason Molenda StackFrame *frame = NULL; 14197730b9a4SJim Ingham Target *target = exe_ctx.GetTargetPtr(); 14207730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 14217730b9a4SJim Ingham 14227730b9a4SJim Ingham if (target && process) 14231d3afba3SGreg Clayton { 14247fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 14257730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 14267730b9a4SJim Ingham { 14277730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 14287730b9a4SJim Ingham if (frame) 14297fdf9ef1SGreg Clayton { 1430fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1431fb6621efSGreg Clayton { 14321ba7c4d0SGreg Clayton StreamString frame_description; 1433d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 14341ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 1435cced1566SGreg Clayton expr, options.GetFetchDynamicValue(), frame_description.GetString().c_str()); 1436fb6621efSGreg Clayton } 1437fb6621efSGreg Clayton 1438d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 1439d9e416c0SGreg Clayton frame, 1440d4439aa9SEnrico Granata expr_value_sp, 144135e1bda6SJim Ingham options.ref()); 1442e3e91517SEnrico Granata expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1443fb6621efSGreg Clayton 1444fb6621efSGreg Clayton if (target->GetDisplayExpressionsInCrashlogs()) 1445f49e65aeSGreg Clayton Host::SetCrashDescription (NULL); 14461d3afba3SGreg Clayton } 1447c9858e4dSGreg Clayton else 1448c9858e4dSGreg Clayton { 1449c9858e4dSGreg Clayton if (log) 14507730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: could not reconstruct frame object for this SBFrame."); 14517730b9a4SJim Ingham } 14527730b9a4SJim Ingham } 14537730b9a4SJim Ingham else 14547730b9a4SJim Ingham { 14557730b9a4SJim Ingham if (log) 14567730b9a4SJim Ingham log->Printf ("SBFrame::EvaluateExpression () => error: process is running"); 1457c9858e4dSGreg Clayton } 14587fdf9ef1SGreg Clayton } 14594838131bSGreg Clayton 1460cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1461a162ebafSSean Callanan if (expr_log) 146278a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 1463324a1036SSaleem Abdulrasool expr_result.GetValue(), expr_result.GetSummary()); 1464a162ebafSSean Callanan 14654838131bSGreg Clayton if (log) 1466d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 1467324a1036SSaleem Abdulrasool static_cast<void*>(frame), expr, 1468324a1036SSaleem Abdulrasool static_cast<void*>(expr_value_sp.get()), exe_results); 1469cf7e2dc0SJason Molenda #endif 14704838131bSGreg Clayton 1471cfd1acedSGreg Clayton return expr_result; 14721d3afba3SGreg Clayton } 1473316d498bSGreg Clayton 1474316d498bSGreg Clayton bool 1475316d498bSGreg Clayton SBFrame::IsInlined() 1476316d498bSGreg Clayton { 14775160ce5cSGreg Clayton Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 14787fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1479b57e4a1bSJason Molenda StackFrame *frame = NULL; 1480d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 14817730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 14827730b9a4SJim Ingham if (target && process) 1483316d498bSGreg Clayton { 14847fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 14857730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 14867730b9a4SJim Ingham { 14877730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 14887730b9a4SJim Ingham if (frame) 14897fdf9ef1SGreg Clayton { 14907fdf9ef1SGreg Clayton 1491d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1492316d498bSGreg Clayton if (block) 1493316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 1494316d498bSGreg Clayton } 1495c9858e4dSGreg Clayton else 1496c9858e4dSGreg Clayton { 1497c9858e4dSGreg Clayton if (log) 14987730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: could not reconstruct frame object for this SBFrame."); 14997730b9a4SJim Ingham } 15007730b9a4SJim Ingham } 15017730b9a4SJim Ingham else 15027730b9a4SJim Ingham { 15037730b9a4SJim Ingham if (log) 15047730b9a4SJim Ingham log->Printf ("SBFrame::IsInlined () => error: process is running"); 1505c9858e4dSGreg Clayton } 1506c9858e4dSGreg Clayton 15077fdf9ef1SGreg Clayton } 1508316d498bSGreg Clayton return false; 1509316d498bSGreg Clayton } 1510316d498bSGreg Clayton 1511316d498bSGreg Clayton const char * 1512316d498bSGreg Clayton SBFrame::GetFunctionName() 1513316d498bSGreg Clayton { 15145160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1515316d498bSGreg Clayton const char *name = NULL; 15167fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1517b57e4a1bSJason Molenda StackFrame *frame = NULL; 1518d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 15197730b9a4SJim Ingham Process *process = exe_ctx.GetProcessPtr(); 15207730b9a4SJim Ingham if (target && process) 1521316d498bSGreg Clayton { 15227fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 15237730b9a4SJim Ingham if (stop_locker.TryLock(&process->GetRunLock())) 15247730b9a4SJim Ingham { 15257730b9a4SJim Ingham frame = exe_ctx.GetFramePtr(); 15267730b9a4SJim Ingham if (frame) 15277fdf9ef1SGreg Clayton { 1528d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1529316d498bSGreg Clayton if (sc.block) 1530316d498bSGreg Clayton { 1531316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1532316d498bSGreg Clayton if (inlined_block) 1533316d498bSGreg Clayton { 1534316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1535316d498bSGreg Clayton name = inlined_info->GetName().AsCString(); 1536316d498bSGreg Clayton } 1537316d498bSGreg Clayton } 1538316d498bSGreg Clayton 1539316d498bSGreg Clayton if (name == NULL) 1540316d498bSGreg Clayton { 1541316d498bSGreg Clayton if (sc.function) 1542316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1543316d498bSGreg Clayton } 1544316d498bSGreg Clayton 1545316d498bSGreg Clayton if (name == NULL) 1546316d498bSGreg Clayton { 1547316d498bSGreg Clayton if (sc.symbol) 1548316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1549316d498bSGreg Clayton } 1550316d498bSGreg Clayton } 1551c9858e4dSGreg Clayton else 1552c9858e4dSGreg Clayton { 1553c9858e4dSGreg Clayton if (log) 15547730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName () => error: could not reconstruct frame object for this SBFrame."); 15557730b9a4SJim Ingham } 15567730b9a4SJim Ingham } 15577730b9a4SJim Ingham else 15587730b9a4SJim Ingham { 15597730b9a4SJim Ingham if (log) 15607730b9a4SJim Ingham log->Printf ("SBFrame::GetFunctionName() => error: process is running"); 1561c9858e4dSGreg Clayton 1562c9858e4dSGreg Clayton } 15637fdf9ef1SGreg Clayton } 1564316d498bSGreg Clayton return name; 1565316d498bSGreg Clayton } 1566316d498bSGreg Clayton 1567