130fdc8d8SChris Lattner //===-- SBFrame.cpp ---------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 104c5de699SEli Friedman #include "lldb/API/SBFrame.h" 1130fdc8d8SChris Lattner 1230fdc8d8SChris Lattner #include <string> 1330fdc8d8SChris Lattner #include <algorithm> 1430fdc8d8SChris Lattner 1530fdc8d8SChris Lattner #include "lldb/lldb-types.h" 1630fdc8d8SChris Lattner 1730fdc8d8SChris Lattner #include "lldb/Core/Address.h" 1830fdc8d8SChris Lattner #include "lldb/Core/ConstString.h" 19ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 2030fdc8d8SChris Lattner #include "lldb/Core/Stream.h" 2130fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h" 2230fdc8d8SChris Lattner #include "lldb/Core/ValueObjectRegister.h" 2330fdc8d8SChris Lattner #include "lldb/Core/ValueObjectVariable.h" 24b71f3844SGreg Clayton #include "lldb/Expression/ClangUserExpression.h" 251ba7c4d0SGreg Clayton #include "lldb/Host/Host.h" 2630fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 2730fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 2830fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h" 2930fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h" 3030fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h" 3130fdc8d8SChris Lattner #include "lldb/Target/Target.h" 3230fdc8d8SChris Lattner #include "lldb/Target/Process.h" 3330fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 3430fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h" 35b9556accSGreg Clayton #include "lldb/Target/StackID.h" 3630fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 3730fdc8d8SChris Lattner 384c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 394c5de699SEli Friedman #include "lldb/API/SBValue.h" 404c5de699SEli Friedman #include "lldb/API/SBAddress.h" 41dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 424c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h" 434c5de699SEli Friedman #include "lldb/API/SBThread.h" 4430fdc8d8SChris Lattner 4530fdc8d8SChris Lattner using namespace lldb; 4630fdc8d8SChris Lattner using namespace lldb_private; 4730fdc8d8SChris Lattner 48b9556accSGreg Clayton 4930fdc8d8SChris Lattner SBFrame::SBFrame () : 507fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef()) 5130fdc8d8SChris Lattner { 5230fdc8d8SChris Lattner } 5330fdc8d8SChris Lattner 5469b582faSGreg Clayton SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) : 557fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (lldb_object_sp)) 5630fdc8d8SChris Lattner { 5769b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 58ceb6b139SCaroline Tice 59ceb6b139SCaroline Tice if (log) 60ceb6b139SCaroline Tice { 61ceb6b139SCaroline Tice SBStream sstr; 62ceb6b139SCaroline Tice GetDescription (sstr); 634838131bSGreg Clayton log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s", 64b9556accSGreg Clayton lldb_object_sp.get(), lldb_object_sp.get(), sstr.GetData()); 65750cd175SCaroline Tice 66ceb6b139SCaroline Tice } 6730fdc8d8SChris Lattner } 6830fdc8d8SChris Lattner 69efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) : 707fdf9ef1SGreg Clayton m_opaque_sp (new ExecutionContextRef (*rhs.m_opaque_sp)) 71efabb123SGreg Clayton { 72efabb123SGreg Clayton } 73efabb123SGreg Clayton 74efabb123SGreg Clayton const SBFrame & 75efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs) 76efabb123SGreg Clayton { 77efabb123SGreg Clayton if (this != &rhs) 787fdf9ef1SGreg Clayton *m_opaque_sp = *rhs.m_opaque_sp; 79efabb123SGreg Clayton return *this; 80efabb123SGreg Clayton } 81efabb123SGreg Clayton 8230fdc8d8SChris Lattner SBFrame::~SBFrame() 8330fdc8d8SChris Lattner { 8430fdc8d8SChris Lattner } 8530fdc8d8SChris Lattner 86b9556accSGreg Clayton StackFrameSP 87b9556accSGreg Clayton SBFrame::GetFrameSP() const 88b9556accSGreg Clayton { 897fdf9ef1SGreg Clayton return m_opaque_sp->GetFrameSP(); 90b9556accSGreg Clayton } 9130fdc8d8SChris Lattner 9230fdc8d8SChris Lattner void 93b9556accSGreg Clayton SBFrame::SetFrameSP (const StackFrameSP &lldb_object_sp) 9430fdc8d8SChris Lattner { 957fdf9ef1SGreg Clayton return m_opaque_sp->SetFrameSP(lldb_object_sp); 96b9556accSGreg Clayton } 9730fdc8d8SChris Lattner 9830fdc8d8SChris Lattner bool 9930fdc8d8SChris Lattner SBFrame::IsValid() const 10030fdc8d8SChris Lattner { 1017fdf9ef1SGreg Clayton return GetFrameSP().get() != NULL; 10230fdc8d8SChris Lattner } 10330fdc8d8SChris Lattner 10430fdc8d8SChris Lattner SBSymbolContext 10530fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const 10630fdc8d8SChris Lattner { 107*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 10830fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 1097fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 110d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 111d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 112d9e416c0SGreg Clayton if (frame && target) 113af67cecdSGreg Clayton { 1147fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1157fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1167fdf9ef1SGreg Clayton { 117d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 118d9e416c0SGreg Clayton sb_sym_ctx.SetSymbolContext(&frame->GetSymbolContext (resolve_scope)); 119af67cecdSGreg Clayton } 120*c9858e4dSGreg Clayton else 121*c9858e4dSGreg Clayton { 122*c9858e4dSGreg Clayton if (log) 123*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext () => error: process is running", frame); 124*c9858e4dSGreg Clayton } 1257fdf9ef1SGreg Clayton } 126ceb6b139SCaroline Tice 127ceb6b139SCaroline Tice if (log) 1284838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)", 129d9e416c0SGreg Clayton frame, resolve_scope, sb_sym_ctx.get()); 130ceb6b139SCaroline Tice 13130fdc8d8SChris Lattner return sb_sym_ctx; 13230fdc8d8SChris Lattner } 13330fdc8d8SChris Lattner 13430fdc8d8SChris Lattner SBModule 13530fdc8d8SChris Lattner SBFrame::GetModule () const 13630fdc8d8SChris Lattner { 137*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 13872eff18aSGreg Clayton SBModule sb_module; 139acdbe816SGreg Clayton ModuleSP module_sp; 1407fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 141d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 142d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 143d9e416c0SGreg Clayton if (frame && target) 144af67cecdSGreg Clayton { 1457fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1467fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1477fdf9ef1SGreg Clayton { 148d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 149d9e416c0SGreg Clayton module_sp = frame->GetSymbolContext (eSymbolContextModule).module_sp; 150acdbe816SGreg Clayton sb_module.SetSP (module_sp); 151af67cecdSGreg Clayton } 152*c9858e4dSGreg Clayton else 153*c9858e4dSGreg Clayton { 154*c9858e4dSGreg Clayton if (log) 155*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => error: process is running", frame); 156*c9858e4dSGreg Clayton } 1577fdf9ef1SGreg Clayton } 15872eff18aSGreg Clayton 1594838131bSGreg Clayton if (log) 1604838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)", 161d9e416c0SGreg Clayton frame, module_sp.get()); 1624838131bSGreg Clayton 16330fdc8d8SChris Lattner return sb_module; 16430fdc8d8SChris Lattner } 16530fdc8d8SChris Lattner 16630fdc8d8SChris Lattner SBCompileUnit 16730fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 16830fdc8d8SChris Lattner { 169*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 17072eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 1717fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 172d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 173d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 174d9e416c0SGreg Clayton if (frame && target) 175af67cecdSGreg Clayton { 1767fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 1777fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 1787fdf9ef1SGreg Clayton { 179d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 180d9e416c0SGreg Clayton sb_comp_unit.reset (frame->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 181af67cecdSGreg Clayton } 182*c9858e4dSGreg Clayton else 183*c9858e4dSGreg Clayton { 184ceb6b139SCaroline Tice if (log) 185*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetCompileUnit () => error: process is running", frame); 186*c9858e4dSGreg Clayton } 187*c9858e4dSGreg Clayton } 188*c9858e4dSGreg Clayton if (log) 189*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetCompileUnit () => SBCompileUnit(%p)", 190d9e416c0SGreg Clayton frame, sb_comp_unit.get()); 191ceb6b139SCaroline Tice 19230fdc8d8SChris Lattner return sb_comp_unit; 19330fdc8d8SChris Lattner } 19430fdc8d8SChris Lattner 19530fdc8d8SChris Lattner SBFunction 19630fdc8d8SChris Lattner SBFrame::GetFunction () const 19730fdc8d8SChris Lattner { 198*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 19972eff18aSGreg Clayton SBFunction sb_function; 2007fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 201d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 202d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 203d9e416c0SGreg Clayton if (frame && target) 204af67cecdSGreg Clayton { 2057fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2067fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2077fdf9ef1SGreg Clayton { 208d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 209d9e416c0SGreg Clayton sb_function.reset(frame->GetSymbolContext (eSymbolContextFunction).function); 210af67cecdSGreg Clayton } 211*c9858e4dSGreg Clayton else 212*c9858e4dSGreg Clayton { 213*c9858e4dSGreg Clayton if (log) 214*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => error: process is running", frame); 2157fdf9ef1SGreg Clayton } 216*c9858e4dSGreg Clayton } 2174838131bSGreg Clayton if (log) 2184838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)", 219d9e416c0SGreg Clayton frame, sb_function.get()); 2204838131bSGreg Clayton 22130fdc8d8SChris Lattner return sb_function; 22230fdc8d8SChris Lattner } 22330fdc8d8SChris Lattner 2243b06557eSGreg Clayton SBSymbol 2253b06557eSGreg Clayton SBFrame::GetSymbol () const 2263b06557eSGreg Clayton { 227*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 22872eff18aSGreg Clayton SBSymbol sb_symbol; 2297fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 230d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 231d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 232d9e416c0SGreg Clayton if (frame && target) 233af67cecdSGreg Clayton { 2347fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2357fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2367fdf9ef1SGreg Clayton { 237d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 238d9e416c0SGreg Clayton sb_symbol.reset(frame->GetSymbolContext (eSymbolContextSymbol).symbol); 239af67cecdSGreg Clayton } 240*c9858e4dSGreg Clayton else 241*c9858e4dSGreg Clayton { 242*c9858e4dSGreg Clayton if (log) 243*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => error: process is running", frame); 2447fdf9ef1SGreg Clayton } 245*c9858e4dSGreg Clayton } 2464838131bSGreg Clayton if (log) 2474838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 248d9e416c0SGreg Clayton frame, sb_symbol.get()); 2493b06557eSGreg Clayton return sb_symbol; 2503b06557eSGreg Clayton } 2513b06557eSGreg Clayton 25230fdc8d8SChris Lattner SBBlock 25330fdc8d8SChris Lattner SBFrame::GetBlock () const 25430fdc8d8SChris Lattner { 255*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 25672eff18aSGreg Clayton SBBlock sb_block; 2577fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 258d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 259d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 260d9e416c0SGreg Clayton if (frame && target) 261af67cecdSGreg Clayton { 2627fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2637fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2647fdf9ef1SGreg Clayton { 265d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 266d9e416c0SGreg Clayton sb_block.SetPtr (frame->GetSymbolContext (eSymbolContextBlock).block); 267af67cecdSGreg Clayton } 268*c9858e4dSGreg Clayton else 269*c9858e4dSGreg Clayton { 270*c9858e4dSGreg Clayton if (log) 271*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => error: process is running", frame); 2727fdf9ef1SGreg Clayton } 273*c9858e4dSGreg Clayton } 2744838131bSGreg Clayton if (log) 2754838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)", 276d9e416c0SGreg Clayton frame, sb_block.GetPtr()); 27730fdc8d8SChris Lattner return sb_block; 27830fdc8d8SChris Lattner } 27930fdc8d8SChris Lattner 28095897c6aSGreg Clayton SBBlock 28195897c6aSGreg Clayton SBFrame::GetFrameBlock () const 28295897c6aSGreg Clayton { 28372eff18aSGreg Clayton SBBlock sb_block; 2847fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 285d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 286d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 287*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 288d9e416c0SGreg Clayton if (frame && target) 289af67cecdSGreg Clayton { 2907fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 2917fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 2927fdf9ef1SGreg Clayton { 293d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 294d9e416c0SGreg Clayton sb_block.SetPtr(frame->GetFrameBlock ()); 295af67cecdSGreg Clayton } 296*c9858e4dSGreg Clayton else 297*c9858e4dSGreg Clayton { 298*c9858e4dSGreg Clayton if (log) 299*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => error: process is running", frame); 3007fdf9ef1SGreg Clayton } 301*c9858e4dSGreg Clayton } 3024838131bSGreg Clayton if (log) 3034838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 304d9e416c0SGreg Clayton frame, sb_block.GetPtr()); 30595897c6aSGreg Clayton return sb_block; 30695897c6aSGreg Clayton } 30795897c6aSGreg Clayton 30830fdc8d8SChris Lattner SBLineEntry 30930fdc8d8SChris Lattner SBFrame::GetLineEntry () const 31030fdc8d8SChris Lattner { 311*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 31272eff18aSGreg Clayton SBLineEntry sb_line_entry; 3137fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 314d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 315d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 316d9e416c0SGreg Clayton if (frame && target) 317af67cecdSGreg Clayton { 3187fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3197fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 3207fdf9ef1SGreg Clayton { 321d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 322d9e416c0SGreg Clayton sb_line_entry.SetLineEntry (frame->GetSymbolContext (eSymbolContextLineEntry).line_entry); 323af67cecdSGreg Clayton } 324*c9858e4dSGreg Clayton else 325*c9858e4dSGreg Clayton { 326*c9858e4dSGreg Clayton if (log) 327*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => error: process is running", frame); 3287fdf9ef1SGreg Clayton } 329*c9858e4dSGreg Clayton } 3304838131bSGreg Clayton if (log) 3314838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 332d9e416c0SGreg Clayton frame, sb_line_entry.get()); 33330fdc8d8SChris Lattner return sb_line_entry; 33430fdc8d8SChris Lattner } 33530fdc8d8SChris Lattner 33630fdc8d8SChris Lattner uint32_t 33730fdc8d8SChris Lattner SBFrame::GetFrameID () const 33830fdc8d8SChris Lattner { 339b9556accSGreg Clayton uint32_t frame_idx = UINT32_MAX; 340b9556accSGreg Clayton 3417fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 342d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 3437fdf9ef1SGreg Clayton if (frame) 344d9e416c0SGreg Clayton frame_idx = frame->GetFrameIndex (); 3454838131bSGreg Clayton 34669b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3474838131bSGreg Clayton if (log) 3484838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameID () => %u", 349d9e416c0SGreg Clayton frame, frame_idx); 3504838131bSGreg Clayton return frame_idx; 35130fdc8d8SChris Lattner } 35230fdc8d8SChris Lattner 35369b582faSGreg Clayton addr_t 35430fdc8d8SChris Lattner SBFrame::GetPC () const 35530fdc8d8SChris Lattner { 356*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 35769b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 3587fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 359d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 360d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 361d9e416c0SGreg Clayton if (frame && target) 362af67cecdSGreg Clayton { 3637fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3647fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 3657fdf9ef1SGreg Clayton { 366d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 367d9e416c0SGreg Clayton addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress (target); 368af67cecdSGreg Clayton } 369*c9858e4dSGreg Clayton else 370*c9858e4dSGreg Clayton { 371*c9858e4dSGreg Clayton if (log) 372*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetPC () => error: process is running", frame); 373*c9858e4dSGreg Clayton } 3747fdf9ef1SGreg Clayton } 375ceb6b139SCaroline Tice 376ceb6b139SCaroline Tice if (log) 377d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", frame, addr); 378ceb6b139SCaroline Tice 379ceb6b139SCaroline Tice return addr; 38030fdc8d8SChris Lattner } 38130fdc8d8SChris Lattner 38230fdc8d8SChris Lattner bool 38369b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc) 38430fdc8d8SChris Lattner { 385*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 386ceb6b139SCaroline Tice bool ret_val = false; 3877fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 388d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 389d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 390d9e416c0SGreg Clayton if (frame && target) 391af67cecdSGreg Clayton { 3927fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 3937fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 3947fdf9ef1SGreg Clayton { 395d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 396d9e416c0SGreg Clayton ret_val = frame->GetRegisterContext()->SetPC (new_pc); 397af67cecdSGreg Clayton } 398*c9858e4dSGreg Clayton else 399*c9858e4dSGreg Clayton { 400*c9858e4dSGreg Clayton if (log) 401*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::SetPC () => error: process is running", frame); 402*c9858e4dSGreg Clayton } 4037fdf9ef1SGreg Clayton } 404ceb6b139SCaroline Tice 405ceb6b139SCaroline Tice if (log) 4064838131bSGreg Clayton log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i", 407d9e416c0SGreg Clayton frame, new_pc, ret_val); 408ceb6b139SCaroline Tice 409ceb6b139SCaroline Tice return ret_val; 41030fdc8d8SChris Lattner } 41130fdc8d8SChris Lattner 41269b582faSGreg Clayton addr_t 41330fdc8d8SChris Lattner SBFrame::GetSP () const 41430fdc8d8SChris Lattner { 415*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4164838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 4177fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 418d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 419d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 420d9e416c0SGreg Clayton if (frame && target) 421af67cecdSGreg Clayton { 4227fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4237fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4247fdf9ef1SGreg Clayton { 425d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 426d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetSP(); 427af67cecdSGreg Clayton } 428*c9858e4dSGreg Clayton else 429*c9858e4dSGreg Clayton { 430*c9858e4dSGreg Clayton if (log) 431*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetSP () => error: process is running", frame); 4327fdf9ef1SGreg Clayton } 433*c9858e4dSGreg Clayton } 4344838131bSGreg Clayton if (log) 435d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", frame, addr); 4364838131bSGreg Clayton 4374838131bSGreg Clayton return addr; 43830fdc8d8SChris Lattner } 43930fdc8d8SChris Lattner 44030fdc8d8SChris Lattner 44169b582faSGreg Clayton addr_t 44230fdc8d8SChris Lattner SBFrame::GetFP () const 44330fdc8d8SChris Lattner { 444*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 44569b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 4467fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 447d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 448d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 449d9e416c0SGreg Clayton if (frame && target) 450af67cecdSGreg Clayton { 4517fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4527fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4537fdf9ef1SGreg Clayton { 454d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 455d9e416c0SGreg Clayton addr = frame->GetRegisterContext()->GetFP(); 456af67cecdSGreg Clayton } 457*c9858e4dSGreg Clayton else 458*c9858e4dSGreg Clayton { 459*c9858e4dSGreg Clayton if (log) 460*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFP () => error: process is running", frame); 461*c9858e4dSGreg Clayton } 4627fdf9ef1SGreg Clayton } 463ceb6b139SCaroline Tice 464ceb6b139SCaroline Tice if (log) 465d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", frame, addr); 466ceb6b139SCaroline Tice return addr; 46730fdc8d8SChris Lattner } 46830fdc8d8SChris Lattner 46930fdc8d8SChris Lattner 47030fdc8d8SChris Lattner SBAddress 47130fdc8d8SChris Lattner SBFrame::GetPCAddress () const 47230fdc8d8SChris Lattner { 473*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 47430fdc8d8SChris Lattner SBAddress sb_addr; 4757fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 476d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 477d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 478d9e416c0SGreg Clayton if (frame && target) 479af67cecdSGreg Clayton { 4807fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 4817fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 4827fdf9ef1SGreg Clayton { 483d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 484d9e416c0SGreg Clayton sb_addr.SetAddress (&frame->GetFrameCodeAddress()); 485af67cecdSGreg Clayton } 486*c9858e4dSGreg Clayton else 487*c9858e4dSGreg Clayton { 488*c9858e4dSGreg Clayton if (log) 489*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetPCAddress () => error: process is running", frame); 4907fdf9ef1SGreg Clayton } 491*c9858e4dSGreg Clayton } 4924838131bSGreg Clayton if (log) 493d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", frame, sb_addr.get()); 49430fdc8d8SChris Lattner return sb_addr; 49530fdc8d8SChris Lattner } 49630fdc8d8SChris Lattner 49730fdc8d8SChris Lattner void 49830fdc8d8SChris Lattner SBFrame::Clear() 49930fdc8d8SChris Lattner { 5006611103cSGreg Clayton m_opaque_sp.reset(); 50130fdc8d8SChris Lattner } 50230fdc8d8SChris Lattner 5037edbdfc9SGreg Clayton lldb::SBValue 5047edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path) 5057edbdfc9SGreg Clayton { 5067edbdfc9SGreg Clayton SBValue sb_value; 5077fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 508d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 509d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 510d9e416c0SGreg Clayton if (frame && target) 5117edbdfc9SGreg Clayton { 512d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 5137edbdfc9SGreg Clayton sb_value = GetValueForVariablePath (var_path, use_dynamic); 5147edbdfc9SGreg Clayton } 5157edbdfc9SGreg Clayton return sb_value; 5167edbdfc9SGreg Clayton } 5177edbdfc9SGreg Clayton 5187edbdfc9SGreg Clayton lldb::SBValue 5197edbdfc9SGreg Clayton SBFrame::GetValueForVariablePath (const char *var_path, DynamicValueType use_dynamic) 5207edbdfc9SGreg Clayton { 5217edbdfc9SGreg Clayton SBValue sb_value; 5227fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 523d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 524d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 525d9e416c0SGreg Clayton if (frame && target && var_path && var_path[0]) 5267edbdfc9SGreg Clayton { 5277fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5287fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 5297fdf9ef1SGreg Clayton { 530d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 5317edbdfc9SGreg Clayton VariableSP var_sp; 5327edbdfc9SGreg Clayton Error error; 533d9e416c0SGreg Clayton ValueObjectSP value_sp (frame->GetValueForVariableExpressionPath (var_path, 5347edbdfc9SGreg Clayton use_dynamic, 5357edbdfc9SGreg Clayton StackFrame::eExpressionPathOptionCheckPtrVsMember, 5367edbdfc9SGreg Clayton var_sp, 5377edbdfc9SGreg Clayton error)); 53881e871edSGreg Clayton sb_value.SetSP(value_sp); 5397edbdfc9SGreg Clayton } 540*c9858e4dSGreg Clayton else 541*c9858e4dSGreg Clayton { 542*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 543*c9858e4dSGreg Clayton if (log) 544*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetValueForVariablePath () => error: process is running", frame); 545*c9858e4dSGreg Clayton } 5467fdf9ef1SGreg Clayton } 5477edbdfc9SGreg Clayton return sb_value; 5487edbdfc9SGreg Clayton } 5497edbdfc9SGreg Clayton 55030fdc8d8SChris Lattner SBValue 55169b582faSGreg Clayton SBFrame::FindVariable (const char *name) 55230fdc8d8SChris Lattner { 553316d498bSGreg Clayton SBValue value; 5547fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 555d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 556d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 557d9e416c0SGreg Clayton if (frame && target) 558316d498bSGreg Clayton { 559d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 560316d498bSGreg Clayton value = FindVariable (name, use_dynamic); 561316d498bSGreg Clayton } 562316d498bSGreg Clayton return value; 56378a685aaSJim Ingham } 56478a685aaSJim Ingham 5657edbdfc9SGreg Clayton 56678a685aaSJim Ingham SBValue 5672837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic) 56878a685aaSJim Ingham { 569*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 57069b582faSGreg Clayton VariableSP var_sp; 57158b59f95SJim Ingham SBValue sb_value; 57281e871edSGreg Clayton ValueObjectSP value_sp; 5737fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 574d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 575d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 576d9e416c0SGreg Clayton if (frame && target && name && name[0]) 57730fdc8d8SChris Lattner { 5787fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 5797fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 5807fdf9ef1SGreg Clayton { 58169b582faSGreg Clayton VariableList variable_list; 582d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 583d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 58430fdc8d8SChris Lattner 58572eff18aSGreg Clayton if (sc.block) 58630fdc8d8SChris Lattner { 58772eff18aSGreg Clayton const bool can_create = true; 58872eff18aSGreg Clayton const bool get_parent_variables = true; 58972eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 59072eff18aSGreg Clayton 59172eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 59272eff18aSGreg Clayton get_parent_variables, 59372eff18aSGreg Clayton stop_if_block_is_inlined_function, 59472eff18aSGreg Clayton &variable_list)) 59572eff18aSGreg Clayton { 59669b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 59730fdc8d8SChris Lattner } 59872eff18aSGreg Clayton } 59930fdc8d8SChris Lattner 6004838131bSGreg Clayton if (var_sp) 60181e871edSGreg Clayton { 602d9e416c0SGreg Clayton value_sp = frame->GetValueObjectForFrameVariable(var_sp, use_dynamic); 60381e871edSGreg Clayton sb_value.SetSP(value_sp); 60481e871edSGreg Clayton } 6057fdf9ef1SGreg Clayton } 606*c9858e4dSGreg Clayton else 607*c9858e4dSGreg Clayton { 608*c9858e4dSGreg Clayton if (log) 609*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable () => error: process is running", frame); 610*c9858e4dSGreg Clayton } 611316d498bSGreg Clayton } 612316d498bSGreg Clayton 6134838131bSGreg Clayton if (log) 61469b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 615d9e416c0SGreg Clayton frame, name, value_sp.get()); 6164838131bSGreg Clayton 617dde9cff3SCaroline Tice return sb_value; 618dde9cff3SCaroline Tice } 619dde9cff3SCaroline Tice 62030fdc8d8SChris Lattner SBValue 62169b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 62230fdc8d8SChris Lattner { 623316d498bSGreg Clayton SBValue value; 6247fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 625d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 626d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 627d9e416c0SGreg Clayton if (frame && target) 628316d498bSGreg Clayton { 629d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 630316d498bSGreg Clayton value = FindValue (name, value_type, use_dynamic); 631316d498bSGreg Clayton } 632316d498bSGreg Clayton return value; 63378a685aaSJim Ingham } 63478a685aaSJim Ingham 63578a685aaSJim Ingham SBValue 6362837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) 63778a685aaSJim Ingham { 638*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 63969b582faSGreg Clayton SBValue sb_value; 64081e871edSGreg Clayton ValueObjectSP value_sp; 6417fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 642d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 643d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 644d9e416c0SGreg Clayton if (frame && target && name && name[0]) 64530fdc8d8SChris Lattner { 6467fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 6477fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 6487fdf9ef1SGreg Clayton { 649d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 65030fdc8d8SChris Lattner 65169b582faSGreg Clayton switch (value_type) 65230fdc8d8SChris Lattner { 65369b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 65469b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 65569b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 65669b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 65769b582faSGreg Clayton { 658d9e416c0SGreg Clayton VariableList *variable_list = frame->GetVariableList(true); 65972eff18aSGreg Clayton 660d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext (eSymbolContextBlock)); 66172eff18aSGreg Clayton 66272eff18aSGreg Clayton const bool can_create = true; 66372eff18aSGreg Clayton const bool get_parent_variables = true; 66472eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 66572eff18aSGreg Clayton 66672eff18aSGreg Clayton if (sc.block && sc.block->AppendVariables (can_create, 66772eff18aSGreg Clayton get_parent_variables, 66872eff18aSGreg Clayton stop_if_block_is_inlined_function, 669e85d9cb8SJohnny Chen variable_list)) 670beae523aSJohnny Chen { 67169b582faSGreg Clayton ConstString const_name(name); 672e85d9cb8SJohnny Chen const uint32_t num_variables = variable_list->GetSize(); 67372eff18aSGreg Clayton for (uint32_t i = 0; i < num_variables; ++i) 67430fdc8d8SChris Lattner { 67569b582faSGreg Clayton VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 67669b582faSGreg Clayton if (variable_sp && 67769b582faSGreg Clayton variable_sp->GetScope() == value_type && 67869b582faSGreg Clayton variable_sp->GetName() == const_name) 679beae523aSJohnny Chen { 680d9e416c0SGreg Clayton value_sp = frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic); 68181e871edSGreg Clayton sb_value.SetSP (value_sp); 682beae523aSJohnny Chen break; 683beae523aSJohnny Chen } 68430fdc8d8SChris Lattner } 68530fdc8d8SChris Lattner } 68630fdc8d8SChris Lattner } 68769b582faSGreg Clayton break; 68869b582faSGreg Clayton 68969b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 69069b582faSGreg Clayton { 691d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 69269b582faSGreg Clayton if (reg_ctx) 69369b582faSGreg Clayton { 69469b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 69569b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 69669b582faSGreg Clayton { 69769b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 69869b582faSGreg Clayton if (reg_info && 69969b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 70069b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 70169b582faSGreg Clayton { 702d9e416c0SGreg Clayton value_sp = ValueObjectRegister::Create (frame, reg_ctx, reg_idx); 70381e871edSGreg Clayton sb_value.SetSP (value_sp); 70481e871edSGreg Clayton break; 70569b582faSGreg Clayton } 70669b582faSGreg Clayton } 70769b582faSGreg Clayton } 70869b582faSGreg Clayton } 70969b582faSGreg Clayton break; 71069b582faSGreg Clayton 71169b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 71269b582faSGreg Clayton { 713d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 71469b582faSGreg Clayton if (reg_ctx) 71569b582faSGreg Clayton { 71669b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 71769b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 71869b582faSGreg Clayton { 71969b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 72069b582faSGreg Clayton if (reg_set && 72169b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 72269b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 72369b582faSGreg Clayton { 724d9e416c0SGreg Clayton value_sp = ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx); 72581e871edSGreg Clayton sb_value.SetSP (value_sp); 72681e871edSGreg Clayton break; 72769b582faSGreg Clayton } 72869b582faSGreg Clayton } 72969b582faSGreg Clayton } 73069b582faSGreg Clayton } 73169b582faSGreg Clayton break; 73269b582faSGreg Clayton 73369b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 73469b582faSGreg Clayton { 73569b582faSGreg Clayton ConstString const_name(name); 736d9e416c0SGreg Clayton ClangExpressionVariableSP expr_var_sp (target->GetPersistentVariables().GetVariable (const_name)); 73769b582faSGreg Clayton if (expr_var_sp) 73881e871edSGreg Clayton { 73981e871edSGreg Clayton value_sp = expr_var_sp->GetValueObject(); 74081e871edSGreg Clayton sb_value.SetSP (value_sp); 74181e871edSGreg Clayton } 74269b582faSGreg Clayton } 74369b582faSGreg Clayton break; 74469b582faSGreg Clayton 74569b582faSGreg Clayton default: 74669b582faSGreg Clayton break; 74769b582faSGreg Clayton } 748beae523aSJohnny Chen } 749*c9858e4dSGreg Clayton else 750*c9858e4dSGreg Clayton { 751*c9858e4dSGreg Clayton if (log) 752*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::FindValue () => error: process is running", frame); 753*c9858e4dSGreg Clayton } 7547fdf9ef1SGreg Clayton } 755dde9cff3SCaroline Tice 7564838131bSGreg Clayton if (log) 75769b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 758d9e416c0SGreg Clayton frame, name, value_type, value_sp.get()); 7594838131bSGreg Clayton 7604838131bSGreg Clayton 761dde9cff3SCaroline Tice return sb_value; 762dde9cff3SCaroline Tice } 763dde9cff3SCaroline Tice 76430fdc8d8SChris Lattner bool 76535e2ab60SJohnny Chen SBFrame::IsEqual (const SBFrame &that) const 76635e2ab60SJohnny Chen { 76735e2ab60SJohnny Chen lldb::StackFrameSP this_sp = GetFrameSP(); 76835e2ab60SJohnny Chen lldb::StackFrameSP that_sp = that.GetFrameSP(); 76935e2ab60SJohnny Chen return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 77035e2ab60SJohnny Chen } 77135e2ab60SJohnny Chen 77235e2ab60SJohnny Chen bool 77330fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 77430fdc8d8SChris Lattner { 77535e2ab60SJohnny Chen return IsEqual(rhs); 77630fdc8d8SChris Lattner } 77730fdc8d8SChris Lattner 77830fdc8d8SChris Lattner bool 77930fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 78030fdc8d8SChris Lattner { 78135e2ab60SJohnny Chen return !IsEqual(rhs); 782481cef25SGreg Clayton } 78330fdc8d8SChris Lattner 78430fdc8d8SChris Lattner SBThread 78530fdc8d8SChris Lattner SBFrame::GetThread () const 78630fdc8d8SChris Lattner { 78769b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 788ceb6b139SCaroline Tice 7897fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 790d9e416c0SGreg Clayton ThreadSP thread_sp (exe_ctx.GetThreadSP()); 791d9e416c0SGreg Clayton SBThread sb_thread (thread_sp); 792ceb6b139SCaroline Tice 793ceb6b139SCaroline Tice if (log) 794750cd175SCaroline Tice { 795750cd175SCaroline Tice SBStream sstr; 796750cd175SCaroline Tice sb_thread.GetDescription (sstr); 797d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", 798d9e416c0SGreg Clayton exe_ctx.GetFramePtr(), 799d9e416c0SGreg Clayton thread_sp.get(), 800d9e416c0SGreg Clayton sstr.GetData()); 801750cd175SCaroline Tice } 802ceb6b139SCaroline Tice 80330fdc8d8SChris Lattner return sb_thread; 80430fdc8d8SChris Lattner } 80530fdc8d8SChris Lattner 80630fdc8d8SChris Lattner const char * 80730fdc8d8SChris Lattner SBFrame::Disassemble () const 80830fdc8d8SChris Lattner { 809*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 8104838131bSGreg Clayton const char *disassembly = NULL; 8117fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 812d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 813d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 814d9e416c0SGreg Clayton if (frame && target) 815af67cecdSGreg Clayton { 8167fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8177fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 8187fdf9ef1SGreg Clayton { 819d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 820d9e416c0SGreg Clayton disassembly = frame->Disassemble(); 821af67cecdSGreg Clayton } 822*c9858e4dSGreg Clayton else 823*c9858e4dSGreg Clayton { 824*c9858e4dSGreg Clayton if (log) 825*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => error: process is running", frame); 8267fdf9ef1SGreg Clayton } 827*c9858e4dSGreg Clayton } 8284838131bSGreg Clayton 8294838131bSGreg Clayton if (log) 830d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => %s", frame, disassembly); 8314838131bSGreg Clayton 8324838131bSGreg Clayton return disassembly; 83330fdc8d8SChris Lattner } 83430fdc8d8SChris Lattner 83530fdc8d8SChris Lattner 83630fdc8d8SChris Lattner SBValueList 83730fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 83830fdc8d8SChris Lattner bool locals, 83930fdc8d8SChris Lattner bool statics, 84030fdc8d8SChris Lattner bool in_scope_only) 84130fdc8d8SChris Lattner { 842316d498bSGreg Clayton SBValueList value_list; 8437fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 844d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 845d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 846d9e416c0SGreg Clayton if (frame && target) 847316d498bSGreg Clayton { 848d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 849316d498bSGreg Clayton value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic); 850316d498bSGreg Clayton } 851316d498bSGreg Clayton return value_list; 85278a685aaSJim Ingham } 85378a685aaSJim Ingham 85478a685aaSJim Ingham SBValueList 85578a685aaSJim Ingham SBFrame::GetVariables (bool arguments, 85678a685aaSJim Ingham bool locals, 85778a685aaSJim Ingham bool statics, 85878a685aaSJim Ingham bool in_scope_only, 8592837b766SJim Ingham lldb::DynamicValueType use_dynamic) 86078a685aaSJim Ingham { 86169b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 862ceb6b139SCaroline Tice 863b9556accSGreg Clayton SBValueList value_list; 8647fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 865d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 866d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 867b9556accSGreg Clayton 868ceb6b139SCaroline Tice if (log) 8694838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 870d9e416c0SGreg Clayton frame, 8714838131bSGreg Clayton arguments, 8724838131bSGreg Clayton locals, 8734838131bSGreg Clayton statics, 8744838131bSGreg Clayton in_scope_only); 875ceb6b139SCaroline Tice 876d9e416c0SGreg Clayton if (frame && target) 87730fdc8d8SChris Lattner { 8787fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 8797fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 8807fdf9ef1SGreg Clayton { 881af67cecdSGreg Clayton 88230fdc8d8SChris Lattner size_t i; 883af67cecdSGreg Clayton VariableList *variable_list = NULL; 884af67cecdSGreg Clayton // Scope for locker 885af67cecdSGreg Clayton { 886d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 887d9e416c0SGreg Clayton variable_list = frame->GetVariableList(true); 888af67cecdSGreg Clayton } 88930fdc8d8SChris Lattner if (variable_list) 89030fdc8d8SChris Lattner { 89130fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 89230fdc8d8SChris Lattner if (num_variables) 89330fdc8d8SChris Lattner { 89430fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 89530fdc8d8SChris Lattner { 89630fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 89730fdc8d8SChris Lattner if (variable_sp) 89830fdc8d8SChris Lattner { 89930fdc8d8SChris Lattner bool add_variable = false; 90030fdc8d8SChris Lattner switch (variable_sp->GetScope()) 90130fdc8d8SChris Lattner { 90230fdc8d8SChris Lattner case eValueTypeVariableGlobal: 90330fdc8d8SChris Lattner case eValueTypeVariableStatic: 90430fdc8d8SChris Lattner add_variable = statics; 90530fdc8d8SChris Lattner break; 90630fdc8d8SChris Lattner 90730fdc8d8SChris Lattner case eValueTypeVariableArgument: 90830fdc8d8SChris Lattner add_variable = arguments; 90930fdc8d8SChris Lattner break; 91030fdc8d8SChris Lattner 91130fdc8d8SChris Lattner case eValueTypeVariableLocal: 91230fdc8d8SChris Lattner add_variable = locals; 91330fdc8d8SChris Lattner break; 914c982c768SGreg Clayton 915c982c768SGreg Clayton default: 916c982c768SGreg Clayton break; 91730fdc8d8SChris Lattner } 91830fdc8d8SChris Lattner if (add_variable) 91930fdc8d8SChris Lattner { 920d9e416c0SGreg Clayton if (in_scope_only && !variable_sp->IsInScope(frame)) 92130fdc8d8SChris Lattner continue; 92230fdc8d8SChris Lattner 923d9e416c0SGreg Clayton value_list.Append(frame->GetValueObjectForFrameVariable (variable_sp, use_dynamic)); 92430fdc8d8SChris Lattner } 92530fdc8d8SChris Lattner } 92630fdc8d8SChris Lattner } 92730fdc8d8SChris Lattner } 92830fdc8d8SChris Lattner } 92930fdc8d8SChris Lattner } 930*c9858e4dSGreg Clayton else 931*c9858e4dSGreg Clayton { 932*c9858e4dSGreg Clayton if (log) 933*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables () => error: process is running", frame); 934*c9858e4dSGreg Clayton } 9357fdf9ef1SGreg Clayton } 936ceb6b139SCaroline Tice 937ceb6b139SCaroline Tice if (log) 938ceb6b139SCaroline Tice { 939d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", frame, 940750cd175SCaroline Tice value_list.get()); 941ceb6b139SCaroline Tice } 942ceb6b139SCaroline Tice 94330fdc8d8SChris Lattner return value_list; 94430fdc8d8SChris Lattner } 94530fdc8d8SChris Lattner 94669b582faSGreg Clayton SBValueList 94730fdc8d8SChris Lattner SBFrame::GetRegisters () 94830fdc8d8SChris Lattner { 94969b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 950ceb6b139SCaroline Tice 95130fdc8d8SChris Lattner SBValueList value_list; 9527fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 953d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 954d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 955d9e416c0SGreg Clayton if (frame && target) 95630fdc8d8SChris Lattner { 9577fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9587fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 9597fdf9ef1SGreg Clayton { 960d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 961d9e416c0SGreg Clayton RegisterContextSP reg_ctx (frame->GetRegisterContext()); 96230fdc8d8SChris Lattner if (reg_ctx) 96330fdc8d8SChris Lattner { 96430fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 96530fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 96630fdc8d8SChris Lattner { 967d9e416c0SGreg Clayton value_list.Append(ValueObjectRegisterSet::Create (frame, reg_ctx, set_idx)); 96830fdc8d8SChris Lattner } 96930fdc8d8SChris Lattner } 97030fdc8d8SChris Lattner } 971*c9858e4dSGreg Clayton else 972*c9858e4dSGreg Clayton { 973*c9858e4dSGreg Clayton if (log) 974*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetRegisters () => error: process is running", frame); 975*c9858e4dSGreg Clayton } 9767fdf9ef1SGreg Clayton } 977ceb6b139SCaroline Tice 978ceb6b139SCaroline Tice if (log) 979*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetRegisters () => SBValueList(%p)", frame, value_list.get()); 980ceb6b139SCaroline Tice 98130fdc8d8SChris Lattner return value_list; 98230fdc8d8SChris Lattner } 98330fdc8d8SChris Lattner 984dde9cff3SCaroline Tice bool 985dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 986dde9cff3SCaroline Tice { 987da7bc7d0SGreg Clayton Stream &strm = description.ref(); 988da7bc7d0SGreg Clayton 9897fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 990d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 991d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 992d9e416c0SGreg Clayton if (frame && target) 993dde9cff3SCaroline Tice { 9947fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 9957fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 9967fdf9ef1SGreg Clayton { 997d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 998d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&strm); 999dde9cff3SCaroline Tice } 1000*c9858e4dSGreg Clayton else 1001*c9858e4dSGreg Clayton { 1002*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1003*c9858e4dSGreg Clayton if (log) 1004*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetDescription () => error: process is running", frame); 1005*c9858e4dSGreg Clayton } 1006*c9858e4dSGreg Clayton 10077fdf9ef1SGreg Clayton } 1008dde9cff3SCaroline Tice else 1009da7bc7d0SGreg Clayton strm.PutCString ("No value"); 1010dde9cff3SCaroline Tice 1011dde9cff3SCaroline Tice return true; 1012dde9cff3SCaroline Tice } 10131d3afba3SGreg Clayton 101469b582faSGreg Clayton SBValue 10151d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 10161d3afba3SGreg Clayton { 1017316d498bSGreg Clayton SBValue result; 10187fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1019d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1020d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1021d9e416c0SGreg Clayton if (frame && target) 1022316d498bSGreg Clayton { 1023d9e416c0SGreg Clayton lldb::DynamicValueType use_dynamic = frame->CalculateTarget()->GetPreferDynamicValue(); 1024316d498bSGreg Clayton result = EvaluateExpression (expr, use_dynamic); 1025316d498bSGreg Clayton } 1026316d498bSGreg Clayton return result; 102778a685aaSJim Ingham } 102878a685aaSJim Ingham 102978a685aaSJim Ingham SBValue 10302837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 103178a685aaSJim Ingham { 103269b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 10334838131bSGreg Clayton 103469b582faSGreg Clayton LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 1035a162ebafSSean Callanan 103625f3a3cdSJohnny Chen ExecutionResults exe_results; 103769b582faSGreg Clayton SBValue expr_result; 103881e871edSGreg Clayton ValueObjectSP expr_value_sp; 10394838131bSGreg Clayton 10407fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1041d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1042d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1043b9556accSGreg Clayton if (log) 1044d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", frame, expr); 1045b9556accSGreg Clayton 1046d9e416c0SGreg Clayton if (frame && target) 10471d3afba3SGreg Clayton { 10487fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 10497fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 10507fdf9ef1SGreg Clayton { 10517fdf9ef1SGreg Clayton 1052d9e416c0SGreg Clayton Mutex::Locker api_locker (target->GetAPIMutex()); 1053316d498bSGreg Clayton 10541ba7c4d0SGreg Clayton 10551ba7c4d0SGreg Clayton StreamString frame_description; 1056d9e416c0SGreg Clayton frame->DumpUsingSettingsFormat (&frame_description); 10571ba7c4d0SGreg Clayton 10581ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 10591ba7c4d0SGreg Clayton expr, fetch_dynamic_value, frame_description.GetString().c_str()); 10601ba7c4d0SGreg Clayton 106120bb3aa5SSean Callanan const bool coerce_to_id = false; 10628b2fe6dcSGreg Clayton const bool unwind_on_error = true; 106392adcac9SSean Callanan const bool keep_in_memory = false; 1064322f529bSSean Callanan 1065d9e416c0SGreg Clayton exe_results = target->EvaluateExpression (expr, 1066d9e416c0SGreg Clayton frame, 10673bfdaa2aSSean Callanan eExecutionPolicyOnlyWhenNeeded, 106820bb3aa5SSean Callanan coerce_to_id, 106978a685aaSJim Ingham unwind_on_error, 107078a685aaSJim Ingham keep_in_memory, 10712837b766SJim Ingham fetch_dynamic_value, 107281e871edSGreg Clayton expr_value_sp); 107381e871edSGreg Clayton expr_result.SetSP(expr_value_sp); 1074f49e65aeSGreg Clayton Host::SetCrashDescription (NULL); 10751d3afba3SGreg Clayton } 1076*c9858e4dSGreg Clayton else 1077*c9858e4dSGreg Clayton { 1078*c9858e4dSGreg Clayton if (log) 1079*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression () => error: process is running", frame); 1080*c9858e4dSGreg Clayton } 10817fdf9ef1SGreg Clayton } 10824838131bSGreg Clayton 1083cf7e2dc0SJason Molenda #ifndef LLDB_DISABLE_PYTHON 1084a162ebafSSean Callanan if (expr_log) 108578a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 1086fe42ac4dSGreg Clayton expr_result.GetValue(), 1087fe42ac4dSGreg Clayton expr_result.GetSummary()); 1088a162ebafSSean Callanan 10894838131bSGreg Clayton if (log) 1090d9e416c0SGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", 1091d9e416c0SGreg Clayton frame, 109278a685aaSJim Ingham expr, 109381e871edSGreg Clayton expr_value_sp.get(), 109425f3a3cdSJohnny Chen exe_results); 1095cf7e2dc0SJason Molenda #endif 10964838131bSGreg Clayton 1097cfd1acedSGreg Clayton return expr_result; 10981d3afba3SGreg Clayton } 1099316d498bSGreg Clayton 1100316d498bSGreg Clayton bool 1101316d498bSGreg Clayton SBFrame::IsInlined() 1102316d498bSGreg Clayton { 11037fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1104d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1105d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1106d9e416c0SGreg Clayton if (frame && target) 1107316d498bSGreg Clayton { 11087fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11097fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 11107fdf9ef1SGreg Clayton { 11117fdf9ef1SGreg Clayton 1112d9e416c0SGreg Clayton Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1113316d498bSGreg Clayton if (block) 1114316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 1115316d498bSGreg Clayton } 1116*c9858e4dSGreg Clayton else 1117*c9858e4dSGreg Clayton { 1118*c9858e4dSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1119*c9858e4dSGreg Clayton if (log) 1120*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::IsInlined () => error: process is running", frame); 1121*c9858e4dSGreg Clayton } 1122*c9858e4dSGreg Clayton 11237fdf9ef1SGreg Clayton } 1124316d498bSGreg Clayton return false; 1125316d498bSGreg Clayton } 1126316d498bSGreg Clayton 1127316d498bSGreg Clayton const char * 1128316d498bSGreg Clayton SBFrame::GetFunctionName() 1129316d498bSGreg Clayton { 1130316d498bSGreg Clayton const char *name = NULL; 11317fdf9ef1SGreg Clayton ExecutionContext exe_ctx(m_opaque_sp.get()); 1132d9e416c0SGreg Clayton StackFrame *frame = exe_ctx.GetFramePtr(); 1133d9e416c0SGreg Clayton Target *target = exe_ctx.GetTargetPtr(); 1134d9e416c0SGreg Clayton if (frame && target) 1135316d498bSGreg Clayton { 11367fdf9ef1SGreg Clayton Process::StopLocker stop_locker; 11377fdf9ef1SGreg Clayton if (stop_locker.TryLock(&exe_ctx.GetProcessPtr()->GetRunLock())) 11387fdf9ef1SGreg Clayton { 1139d9e416c0SGreg Clayton SymbolContext sc (frame->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 1140316d498bSGreg Clayton if (sc.block) 1141316d498bSGreg Clayton { 1142316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 1143316d498bSGreg Clayton if (inlined_block) 1144316d498bSGreg Clayton { 1145316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 1146316d498bSGreg Clayton name = inlined_info->GetName().AsCString(); 1147316d498bSGreg Clayton } 1148316d498bSGreg Clayton } 1149316d498bSGreg Clayton 1150316d498bSGreg Clayton if (name == NULL) 1151316d498bSGreg Clayton { 1152316d498bSGreg Clayton if (sc.function) 1153316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 1154316d498bSGreg Clayton } 1155316d498bSGreg Clayton 1156316d498bSGreg Clayton if (name == NULL) 1157316d498bSGreg Clayton { 1158316d498bSGreg Clayton if (sc.symbol) 1159316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 1160316d498bSGreg Clayton } 1161316d498bSGreg Clayton } 1162*c9858e4dSGreg Clayton else 1163*c9858e4dSGreg Clayton { 1164*c9858e4dSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1165*c9858e4dSGreg Clayton if (log) 1166*c9858e4dSGreg Clayton log->Printf ("SBFrame(%p)::GetFunctionName() => error: process is running", frame); 1167*c9858e4dSGreg Clayton 1168*c9858e4dSGreg Clayton } 11697fdf9ef1SGreg Clayton } 1170316d498bSGreg Clayton return name; 1171316d498bSGreg Clayton } 1172316d498bSGreg Clayton 1173