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" 2530fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 2630fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 2730fdc8d8SChris Lattner #include "lldb/Symbol/VariableList.h" 2830fdc8d8SChris Lattner #include "lldb/Symbol/Variable.h" 2930fdc8d8SChris Lattner #include "lldb/Target/ExecutionContext.h" 3030fdc8d8SChris Lattner #include "lldb/Target/Target.h" 3130fdc8d8SChris Lattner #include "lldb/Target/Process.h" 3230fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h" 3330fdc8d8SChris Lattner #include "lldb/Target/StackFrame.h" 3430fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 3530fdc8d8SChris Lattner 364c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 374c5de699SEli Friedman #include "lldb/API/SBValue.h" 384c5de699SEli Friedman #include "lldb/API/SBAddress.h" 39dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 404c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h" 414c5de699SEli Friedman #include "lldb/API/SBThread.h" 4230fdc8d8SChris Lattner 4330fdc8d8SChris Lattner using namespace lldb; 4430fdc8d8SChris Lattner using namespace lldb_private; 4530fdc8d8SChris Lattner 4630fdc8d8SChris Lattner SBFrame::SBFrame () : 476611103cSGreg Clayton m_opaque_sp () 4830fdc8d8SChris Lattner { 4930fdc8d8SChris Lattner } 5030fdc8d8SChris Lattner 5169b582faSGreg Clayton SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) : 526611103cSGreg Clayton m_opaque_sp (lldb_object_sp) 5330fdc8d8SChris Lattner { 5469b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 55ceb6b139SCaroline Tice 56ceb6b139SCaroline Tice if (log) 57ceb6b139SCaroline Tice { 58ceb6b139SCaroline Tice SBStream sstr; 59ceb6b139SCaroline Tice GetDescription (sstr); 604838131bSGreg Clayton log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s", 614838131bSGreg Clayton lldb_object_sp.get(), m_opaque_sp.get(), sstr.GetData()); 62750cd175SCaroline Tice 63ceb6b139SCaroline Tice } 6430fdc8d8SChris Lattner } 6530fdc8d8SChris Lattner 66efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) : 67efabb123SGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 68efabb123SGreg Clayton { 69efabb123SGreg Clayton } 70efabb123SGreg Clayton 71efabb123SGreg Clayton const SBFrame & 72efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs) 73efabb123SGreg Clayton { 74efabb123SGreg Clayton if (this != &rhs) 75efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 76efabb123SGreg Clayton return *this; 77efabb123SGreg Clayton } 78efabb123SGreg Clayton 7930fdc8d8SChris Lattner SBFrame::~SBFrame() 8030fdc8d8SChris Lattner { 8130fdc8d8SChris Lattner } 8230fdc8d8SChris Lattner 8330fdc8d8SChris Lattner 8430fdc8d8SChris Lattner void 8569b582faSGreg Clayton SBFrame::SetFrame (const StackFrameSP &lldb_object_sp) 8630fdc8d8SChris Lattner { 874838131bSGreg Clayton void *old_ptr = m_opaque_sp.get(); 886611103cSGreg Clayton m_opaque_sp = lldb_object_sp; 8969b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 904838131bSGreg Clayton 914838131bSGreg Clayton if (log) 924838131bSGreg Clayton { 934838131bSGreg Clayton log->Printf ("SBFrame(%p)::SetFrame(sp=%p) := SBFrame(%p)", 944838131bSGreg Clayton old_ptr, lldb_object_sp.get(), m_opaque_sp.get()); 954838131bSGreg Clayton } 964838131bSGreg Clayton 9730fdc8d8SChris Lattner } 9830fdc8d8SChris Lattner 9930fdc8d8SChris Lattner 10030fdc8d8SChris Lattner bool 10130fdc8d8SChris Lattner SBFrame::IsValid() const 10230fdc8d8SChris Lattner { 1036611103cSGreg Clayton return (m_opaque_sp.get() != NULL); 10430fdc8d8SChris Lattner } 10530fdc8d8SChris Lattner 10630fdc8d8SChris Lattner SBSymbolContext 10730fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const 10830fdc8d8SChris Lattner { 109ceb6b139SCaroline Tice 11030fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 1116611103cSGreg Clayton if (m_opaque_sp) 112af67cecdSGreg Clayton { 113af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 1146611103cSGreg Clayton sb_sym_ctx.SetSymbolContext(&m_opaque_sp->GetSymbolContext (resolve_scope)); 115af67cecdSGreg Clayton } 116ceb6b139SCaroline Tice 11769b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 118ceb6b139SCaroline Tice if (log) 1194838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)", 120750cd175SCaroline Tice m_opaque_sp.get(), resolve_scope, sb_sym_ctx.get()); 121ceb6b139SCaroline Tice 12230fdc8d8SChris Lattner return sb_sym_ctx; 12330fdc8d8SChris Lattner } 12430fdc8d8SChris Lattner 12530fdc8d8SChris Lattner SBModule 12630fdc8d8SChris Lattner SBFrame::GetModule () const 12730fdc8d8SChris Lattner { 12872eff18aSGreg Clayton SBModule sb_module; 12972eff18aSGreg Clayton if (m_opaque_sp) 130af67cecdSGreg Clayton { 131af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 13272eff18aSGreg Clayton *sb_module = m_opaque_sp->GetSymbolContext (eSymbolContextModule).module_sp; 133af67cecdSGreg Clayton } 13472eff18aSGreg Clayton 13569b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1364838131bSGreg Clayton if (log) 1374838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)", 1384838131bSGreg Clayton m_opaque_sp.get(), sb_module.get()); 1394838131bSGreg Clayton 14030fdc8d8SChris Lattner return sb_module; 14130fdc8d8SChris Lattner } 14230fdc8d8SChris Lattner 14330fdc8d8SChris Lattner SBCompileUnit 14430fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 14530fdc8d8SChris Lattner { 14672eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 14772eff18aSGreg Clayton if (m_opaque_sp) 148af67cecdSGreg Clayton { 149af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 15072eff18aSGreg Clayton sb_comp_unit.reset (m_opaque_sp->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 151af67cecdSGreg Clayton } 15269b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 153ceb6b139SCaroline Tice if (log) 1544838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBCompileUnit(%p)", 1554838131bSGreg Clayton m_opaque_sp.get(), sb_comp_unit.get()); 156ceb6b139SCaroline Tice 15730fdc8d8SChris Lattner return sb_comp_unit; 15830fdc8d8SChris Lattner } 15930fdc8d8SChris Lattner 16030fdc8d8SChris Lattner SBFunction 16130fdc8d8SChris Lattner SBFrame::GetFunction () const 16230fdc8d8SChris Lattner { 16372eff18aSGreg Clayton SBFunction sb_function; 16472eff18aSGreg Clayton if (m_opaque_sp) 165af67cecdSGreg Clayton { 166af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 16772eff18aSGreg Clayton sb_function.reset(m_opaque_sp->GetSymbolContext (eSymbolContextFunction).function); 168af67cecdSGreg Clayton } 16969b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1704838131bSGreg Clayton if (log) 1714838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)", 1724838131bSGreg Clayton m_opaque_sp.get(), sb_function.get()); 1734838131bSGreg Clayton 17430fdc8d8SChris Lattner return sb_function; 17530fdc8d8SChris Lattner } 17630fdc8d8SChris Lattner 1773b06557eSGreg Clayton SBSymbol 1783b06557eSGreg Clayton SBFrame::GetSymbol () const 1793b06557eSGreg Clayton { 18072eff18aSGreg Clayton SBSymbol sb_symbol; 18172eff18aSGreg Clayton if (m_opaque_sp) 182af67cecdSGreg Clayton { 183af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 18472eff18aSGreg Clayton sb_symbol.reset(m_opaque_sp->GetSymbolContext (eSymbolContextSymbol).symbol); 185af67cecdSGreg Clayton } 18669b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1874838131bSGreg Clayton if (log) 1884838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 1894838131bSGreg Clayton m_opaque_sp.get(), sb_symbol.get()); 1903b06557eSGreg Clayton return sb_symbol; 1913b06557eSGreg Clayton } 1923b06557eSGreg Clayton 19330fdc8d8SChris Lattner SBBlock 19430fdc8d8SChris Lattner SBFrame::GetBlock () const 19530fdc8d8SChris Lattner { 19672eff18aSGreg Clayton SBBlock sb_block; 19772eff18aSGreg Clayton if (m_opaque_sp) 198af67cecdSGreg Clayton { 199af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 20072eff18aSGreg Clayton sb_block.reset (m_opaque_sp->GetSymbolContext (eSymbolContextBlock).block); 201af67cecdSGreg Clayton } 20269b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2034838131bSGreg Clayton if (log) 2044838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)", 2054838131bSGreg Clayton m_opaque_sp.get(), sb_block.get()); 20630fdc8d8SChris Lattner return sb_block; 20730fdc8d8SChris Lattner } 20830fdc8d8SChris Lattner 20995897c6aSGreg Clayton SBBlock 21095897c6aSGreg Clayton SBFrame::GetFrameBlock () const 21195897c6aSGreg Clayton { 21272eff18aSGreg Clayton SBBlock sb_block; 21372eff18aSGreg Clayton if (m_opaque_sp) 214af67cecdSGreg Clayton { 215af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 21672eff18aSGreg Clayton sb_block.reset(m_opaque_sp->GetFrameBlock ()); 217af67cecdSGreg Clayton } 21869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2194838131bSGreg Clayton if (log) 2204838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 2214838131bSGreg Clayton m_opaque_sp.get(), sb_block.get()); 22295897c6aSGreg Clayton return sb_block; 22395897c6aSGreg Clayton } 22495897c6aSGreg Clayton 22530fdc8d8SChris Lattner SBLineEntry 22630fdc8d8SChris Lattner SBFrame::GetLineEntry () const 22730fdc8d8SChris Lattner { 22872eff18aSGreg Clayton SBLineEntry sb_line_entry; 22972eff18aSGreg Clayton if (m_opaque_sp) 230af67cecdSGreg Clayton { 231af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 23272eff18aSGreg Clayton sb_line_entry.SetLineEntry (m_opaque_sp->GetSymbolContext (eSymbolContextLineEntry).line_entry); 233af67cecdSGreg Clayton } 23469b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2354838131bSGreg Clayton if (log) 2364838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 2374838131bSGreg Clayton m_opaque_sp.get(), sb_line_entry.get()); 23830fdc8d8SChris Lattner return sb_line_entry; 23930fdc8d8SChris Lattner } 24030fdc8d8SChris Lattner 24130fdc8d8SChris Lattner uint32_t 24230fdc8d8SChris Lattner SBFrame::GetFrameID () const 24330fdc8d8SChris Lattner { 2444838131bSGreg Clayton uint32_t frame_idx = m_opaque_sp ? m_opaque_sp->GetFrameIndex () : UINT32_MAX; 2454838131bSGreg Clayton 24669b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2474838131bSGreg Clayton if (log) 2484838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameID () => %u", 2494838131bSGreg Clayton m_opaque_sp.get(), frame_idx); 2504838131bSGreg Clayton return frame_idx; 25130fdc8d8SChris Lattner } 25230fdc8d8SChris Lattner 25369b582faSGreg Clayton addr_t 25430fdc8d8SChris Lattner SBFrame::GetPC () const 25530fdc8d8SChris Lattner { 25669b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 2576611103cSGreg Clayton if (m_opaque_sp) 258af67cecdSGreg Clayton { 259af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 260ceb6b139SCaroline Tice addr = m_opaque_sp->GetFrameCodeAddress().GetLoadAddress (&m_opaque_sp->GetThread().GetProcess().GetTarget()); 261af67cecdSGreg Clayton } 262ceb6b139SCaroline Tice 26369b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 264ceb6b139SCaroline Tice if (log) 265cfd1acedSGreg Clayton log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", m_opaque_sp.get(), addr); 266ceb6b139SCaroline Tice 267ceb6b139SCaroline Tice return addr; 26830fdc8d8SChris Lattner } 26930fdc8d8SChris Lattner 27030fdc8d8SChris Lattner bool 27169b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc) 27230fdc8d8SChris Lattner { 273ceb6b139SCaroline Tice bool ret_val = false; 2746611103cSGreg Clayton if (m_opaque_sp) 275af67cecdSGreg Clayton { 276af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 277ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetRegisterContext()->SetPC (new_pc); 278af67cecdSGreg Clayton } 279ceb6b139SCaroline Tice 28069b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 281ceb6b139SCaroline Tice if (log) 2824838131bSGreg Clayton log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i", 2834838131bSGreg Clayton m_opaque_sp.get(), new_pc, ret_val); 284ceb6b139SCaroline Tice 285ceb6b139SCaroline Tice return ret_val; 28630fdc8d8SChris Lattner } 28730fdc8d8SChris Lattner 28869b582faSGreg Clayton addr_t 28930fdc8d8SChris Lattner SBFrame::GetSP () const 29030fdc8d8SChris Lattner { 2914838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 2926611103cSGreg Clayton if (m_opaque_sp) 293af67cecdSGreg Clayton { 294af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 2954838131bSGreg Clayton addr = m_opaque_sp->GetRegisterContext()->GetSP(); 296af67cecdSGreg Clayton } 29769b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2984838131bSGreg Clayton if (log) 299cfd1acedSGreg Clayton log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", m_opaque_sp.get(), addr); 3004838131bSGreg Clayton 3014838131bSGreg Clayton return addr; 30230fdc8d8SChris Lattner } 30330fdc8d8SChris Lattner 30430fdc8d8SChris Lattner 30569b582faSGreg Clayton addr_t 30630fdc8d8SChris Lattner SBFrame::GetFP () const 30730fdc8d8SChris Lattner { 30869b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 3096611103cSGreg Clayton if (m_opaque_sp) 310af67cecdSGreg Clayton { 311af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 312ceb6b139SCaroline Tice addr = m_opaque_sp->GetRegisterContext()->GetFP(); 313af67cecdSGreg Clayton } 314ceb6b139SCaroline Tice 31569b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 316ceb6b139SCaroline Tice if (log) 317cfd1acedSGreg Clayton log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", m_opaque_sp.get(), addr); 318ceb6b139SCaroline Tice return addr; 31930fdc8d8SChris Lattner } 32030fdc8d8SChris Lattner 32130fdc8d8SChris Lattner 32230fdc8d8SChris Lattner SBAddress 32330fdc8d8SChris Lattner SBFrame::GetPCAddress () const 32430fdc8d8SChris Lattner { 32530fdc8d8SChris Lattner SBAddress sb_addr; 3266611103cSGreg Clayton if (m_opaque_sp) 327af67cecdSGreg Clayton { 328af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 3299da7bd07SGreg Clayton sb_addr.SetAddress (&m_opaque_sp->GetFrameCodeAddress()); 330af67cecdSGreg Clayton } 33169b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3324838131bSGreg Clayton if (log) 3334838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", m_opaque_sp.get(), sb_addr.get()); 33430fdc8d8SChris Lattner return sb_addr; 33530fdc8d8SChris Lattner } 33630fdc8d8SChris Lattner 33730fdc8d8SChris Lattner void 33830fdc8d8SChris Lattner SBFrame::Clear() 33930fdc8d8SChris Lattner { 3406611103cSGreg Clayton m_opaque_sp.reset(); 34130fdc8d8SChris Lattner } 34230fdc8d8SChris Lattner 34330fdc8d8SChris Lattner SBValue 34469b582faSGreg Clayton SBFrame::FindVariable (const char *name) 34530fdc8d8SChris Lattner { 34678a685aaSJim Ingham bool use_dynamic = m_opaque_sp->CalculateTarget()->GetPreferDynamicValue(); 34778a685aaSJim Ingham return FindVariable (name, use_dynamic); 34878a685aaSJim Ingham } 34978a685aaSJim Ingham 35078a685aaSJim Ingham SBValue 35178a685aaSJim Ingham SBFrame::FindVariable (const char *name, bool use_dynamic) 35278a685aaSJim Ingham { 35369b582faSGreg Clayton VariableSP var_sp; 354*58b59f95SJim Ingham SBValue sb_value; 355*58b59f95SJim Ingham 35669b582faSGreg Clayton if (m_opaque_sp && name && name[0]) 35730fdc8d8SChris Lattner { 35869b582faSGreg Clayton VariableList variable_list; 359af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 36072eff18aSGreg Clayton SymbolContext sc (m_opaque_sp->GetSymbolContext (eSymbolContextBlock)); 36130fdc8d8SChris Lattner 36272eff18aSGreg Clayton if (sc.block) 36330fdc8d8SChris Lattner { 36472eff18aSGreg Clayton const bool can_create = true; 36572eff18aSGreg Clayton const bool get_parent_variables = true; 36672eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 36772eff18aSGreg Clayton 36872eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 36972eff18aSGreg Clayton get_parent_variables, 37072eff18aSGreg Clayton stop_if_block_is_inlined_function, 37172eff18aSGreg Clayton &variable_list)) 37272eff18aSGreg Clayton { 37369b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 37430fdc8d8SChris Lattner } 37572eff18aSGreg Clayton } 37630fdc8d8SChris Lattner } 37730fdc8d8SChris Lattner 3784838131bSGreg Clayton if (var_sp) 37978a685aaSJim Ingham *sb_value = ValueObjectSP (m_opaque_sp->GetValueObjectForFrameVariable(var_sp, use_dynamic)); 3804838131bSGreg Clayton 38169b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3824838131bSGreg Clayton if (log) 38369b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 38469b582faSGreg Clayton m_opaque_sp.get(), name, sb_value.get()); 3854838131bSGreg Clayton 386dde9cff3SCaroline Tice return sb_value; 387dde9cff3SCaroline Tice } 388dde9cff3SCaroline Tice 38930fdc8d8SChris Lattner SBValue 39069b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 39130fdc8d8SChris Lattner { 39278a685aaSJim Ingham bool use_dynamic = m_opaque_sp->CalculateTarget()->GetPreferDynamicValue(); 39378a685aaSJim Ingham return FindValue (name, value_type, use_dynamic); 39478a685aaSJim Ingham } 39578a685aaSJim Ingham 39678a685aaSJim Ingham SBValue 39778a685aaSJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, bool use_dynamic) 39878a685aaSJim Ingham { 39969b582faSGreg Clayton SBValue sb_value; 40069b582faSGreg Clayton if (m_opaque_sp && name && name[0]) 40130fdc8d8SChris Lattner { 402af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 40330fdc8d8SChris Lattner 40469b582faSGreg Clayton switch (value_type) 40530fdc8d8SChris Lattner { 40669b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 40769b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 40869b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 40969b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 41069b582faSGreg Clayton { 41169b582faSGreg Clayton VariableList *variable_list = m_opaque_sp->GetVariableList(true); 41272eff18aSGreg Clayton 41372eff18aSGreg Clayton SymbolContext sc (m_opaque_sp->GetSymbolContext (eSymbolContextBlock)); 41472eff18aSGreg Clayton 41572eff18aSGreg Clayton const bool can_create = true; 41672eff18aSGreg Clayton const bool get_parent_variables = true; 41772eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 41872eff18aSGreg Clayton 41972eff18aSGreg Clayton if (sc.block && sc.block->AppendVariables (can_create, 42072eff18aSGreg Clayton get_parent_variables, 42172eff18aSGreg Clayton stop_if_block_is_inlined_function, 422e85d9cb8SJohnny Chen variable_list)) 423beae523aSJohnny Chen { 42469b582faSGreg Clayton ConstString const_name(name); 425e85d9cb8SJohnny Chen const uint32_t num_variables = variable_list->GetSize(); 42672eff18aSGreg Clayton for (uint32_t i = 0; i < num_variables; ++i) 42730fdc8d8SChris Lattner { 42869b582faSGreg Clayton VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 42969b582faSGreg Clayton if (variable_sp && 43069b582faSGreg Clayton variable_sp->GetScope() == value_type && 43169b582faSGreg Clayton variable_sp->GetName() == const_name) 432beae523aSJohnny Chen { 43378a685aaSJim Ingham *sb_value = ValueObjectSP (m_opaque_sp->GetValueObjectForFrameVariable(variable_sp, 43478a685aaSJim Ingham use_dynamic)); 435beae523aSJohnny Chen break; 436beae523aSJohnny Chen } 43730fdc8d8SChris Lattner } 43830fdc8d8SChris Lattner } 43930fdc8d8SChris Lattner } 44069b582faSGreg Clayton break; 44169b582faSGreg Clayton 44269b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 44369b582faSGreg Clayton { 4445ccbd294SGreg Clayton RegisterContextSP reg_ctx (m_opaque_sp->GetRegisterContext()); 44569b582faSGreg Clayton if (reg_ctx) 44669b582faSGreg Clayton { 44769b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 44869b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 44969b582faSGreg Clayton { 45069b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 45169b582faSGreg Clayton if (reg_info && 45269b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 45369b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 45469b582faSGreg Clayton { 455*58b59f95SJim Ingham *sb_value = ValueObjectRegister::Create (m_opaque_sp.get(), reg_ctx, reg_idx); 45669b582faSGreg Clayton } 45769b582faSGreg Clayton } 45869b582faSGreg Clayton } 45969b582faSGreg Clayton } 46069b582faSGreg Clayton break; 46169b582faSGreg Clayton 46269b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 46369b582faSGreg Clayton { 4645ccbd294SGreg Clayton RegisterContextSP reg_ctx (m_opaque_sp->GetRegisterContext()); 46569b582faSGreg Clayton if (reg_ctx) 46669b582faSGreg Clayton { 46769b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 46869b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 46969b582faSGreg Clayton { 47069b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 47169b582faSGreg Clayton if (reg_set && 47269b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 47369b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 47469b582faSGreg Clayton { 475*58b59f95SJim Ingham *sb_value = ValueObjectRegisterSet::Create (m_opaque_sp.get(), reg_ctx, set_idx); 47669b582faSGreg Clayton } 47769b582faSGreg Clayton } 47869b582faSGreg Clayton } 47969b582faSGreg Clayton } 48069b582faSGreg Clayton break; 48169b582faSGreg Clayton 48269b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 48369b582faSGreg Clayton { 48469b582faSGreg Clayton ConstString const_name(name); 48569b582faSGreg Clayton ClangExpressionVariableSP expr_var_sp (m_opaque_sp->GetThread().GetProcess().GetTarget().GetPersistentVariables().GetVariable (const_name)); 48669b582faSGreg Clayton if (expr_var_sp) 48769b582faSGreg Clayton *sb_value = expr_var_sp->GetValueObject(); 48869b582faSGreg Clayton } 48969b582faSGreg Clayton break; 49069b582faSGreg Clayton 49169b582faSGreg Clayton default: 49269b582faSGreg Clayton break; 49369b582faSGreg Clayton } 494beae523aSJohnny Chen } 495dde9cff3SCaroline Tice 49669b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4974838131bSGreg Clayton if (log) 49869b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 49969b582faSGreg Clayton m_opaque_sp.get(), name, value_type, sb_value.get()); 5004838131bSGreg Clayton 5014838131bSGreg Clayton 502dde9cff3SCaroline Tice return sb_value; 503dde9cff3SCaroline Tice } 504dde9cff3SCaroline Tice 50530fdc8d8SChris Lattner bool 50630fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 50730fdc8d8SChris Lattner { 5086611103cSGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 50930fdc8d8SChris Lattner } 51030fdc8d8SChris Lattner 51130fdc8d8SChris Lattner bool 51230fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 51330fdc8d8SChris Lattner { 5146611103cSGreg Clayton return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 51530fdc8d8SChris Lattner } 51630fdc8d8SChris Lattner 51730fdc8d8SChris Lattner lldb_private::StackFrame * 51830fdc8d8SChris Lattner SBFrame::operator->() const 51930fdc8d8SChris Lattner { 5206611103cSGreg Clayton return m_opaque_sp.get(); 52130fdc8d8SChris Lattner } 52230fdc8d8SChris Lattner 52330fdc8d8SChris Lattner lldb_private::StackFrame * 52430fdc8d8SChris Lattner SBFrame::get() const 52530fdc8d8SChris Lattner { 5266611103cSGreg Clayton return m_opaque_sp.get(); 52730fdc8d8SChris Lattner } 52830fdc8d8SChris Lattner 529481cef25SGreg Clayton const lldb::StackFrameSP & 530481cef25SGreg Clayton SBFrame::get_sp() const 531481cef25SGreg Clayton { 532481cef25SGreg Clayton return m_opaque_sp; 533481cef25SGreg Clayton } 53430fdc8d8SChris Lattner 53530fdc8d8SChris Lattner SBThread 53630fdc8d8SChris Lattner SBFrame::GetThread () const 53730fdc8d8SChris Lattner { 53869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 539ceb6b139SCaroline Tice 54072eff18aSGreg Clayton SBThread sb_thread; 54172eff18aSGreg Clayton if (m_opaque_sp) 542af67cecdSGreg Clayton { 543af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 54472eff18aSGreg Clayton sb_thread.SetThread (m_opaque_sp->GetThread().GetSP()); 545af67cecdSGreg Clayton } 546ceb6b139SCaroline Tice 547ceb6b139SCaroline Tice if (log) 548750cd175SCaroline Tice { 549750cd175SCaroline Tice SBStream sstr; 550750cd175SCaroline Tice sb_thread.GetDescription (sstr); 5514838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", m_opaque_sp.get(), 5524838131bSGreg Clayton sb_thread.get(), sstr.GetData()); 553750cd175SCaroline Tice } 554ceb6b139SCaroline Tice 55530fdc8d8SChris Lattner return sb_thread; 55630fdc8d8SChris Lattner } 55730fdc8d8SChris Lattner 55830fdc8d8SChris Lattner const char * 55930fdc8d8SChris Lattner SBFrame::Disassemble () const 56030fdc8d8SChris Lattner { 5614838131bSGreg Clayton const char *disassembly = NULL; 5626611103cSGreg Clayton if (m_opaque_sp) 563af67cecdSGreg Clayton { 564af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 5654838131bSGreg Clayton disassembly = m_opaque_sp->Disassemble(); 566af67cecdSGreg Clayton } 56769b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5684838131bSGreg Clayton 5694838131bSGreg Clayton if (log) 5704838131bSGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => %s", m_opaque_sp.get(), disassembly); 5714838131bSGreg Clayton 5724838131bSGreg Clayton return disassembly; 57330fdc8d8SChris Lattner } 57430fdc8d8SChris Lattner 57530fdc8d8SChris Lattner 57630fdc8d8SChris Lattner SBValueList 57730fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 57830fdc8d8SChris Lattner bool locals, 57930fdc8d8SChris Lattner bool statics, 58030fdc8d8SChris Lattner bool in_scope_only) 58130fdc8d8SChris Lattner { 58278a685aaSJim Ingham bool use_dynamic = m_opaque_sp->CalculateTarget()->GetPreferDynamicValue(); 58378a685aaSJim Ingham return GetVariables (arguments, locals, statics, in_scope_only, use_dynamic); 58478a685aaSJim Ingham } 58578a685aaSJim Ingham 58678a685aaSJim Ingham SBValueList 58778a685aaSJim Ingham SBFrame::GetVariables (bool arguments, 58878a685aaSJim Ingham bool locals, 58978a685aaSJim Ingham bool statics, 59078a685aaSJim Ingham bool in_scope_only, 59178a685aaSJim Ingham bool use_dynamic) 59278a685aaSJim Ingham { 59369b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 594ceb6b139SCaroline Tice 595ceb6b139SCaroline Tice if (log) 5964838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 597750cd175SCaroline Tice m_opaque_sp.get(), 5984838131bSGreg Clayton arguments, 5994838131bSGreg Clayton locals, 6004838131bSGreg Clayton statics, 6014838131bSGreg Clayton in_scope_only); 602ceb6b139SCaroline Tice 60330fdc8d8SChris Lattner SBValueList value_list; 6046611103cSGreg Clayton if (m_opaque_sp) 60530fdc8d8SChris Lattner { 606af67cecdSGreg Clayton 60730fdc8d8SChris Lattner size_t i; 608af67cecdSGreg Clayton VariableList *variable_list = NULL; 609af67cecdSGreg Clayton // Scope for locker 610af67cecdSGreg Clayton { 611af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 612af67cecdSGreg Clayton variable_list = m_opaque_sp->GetVariableList(true); 613af67cecdSGreg Clayton } 61430fdc8d8SChris Lattner if (variable_list) 61530fdc8d8SChris Lattner { 61630fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 61730fdc8d8SChris Lattner if (num_variables) 61830fdc8d8SChris Lattner { 61930fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 62030fdc8d8SChris Lattner { 62130fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 62230fdc8d8SChris Lattner if (variable_sp) 62330fdc8d8SChris Lattner { 62430fdc8d8SChris Lattner bool add_variable = false; 62530fdc8d8SChris Lattner switch (variable_sp->GetScope()) 62630fdc8d8SChris Lattner { 62730fdc8d8SChris Lattner case eValueTypeVariableGlobal: 62830fdc8d8SChris Lattner case eValueTypeVariableStatic: 62930fdc8d8SChris Lattner add_variable = statics; 63030fdc8d8SChris Lattner break; 63130fdc8d8SChris Lattner 63230fdc8d8SChris Lattner case eValueTypeVariableArgument: 63330fdc8d8SChris Lattner add_variable = arguments; 63430fdc8d8SChris Lattner break; 63530fdc8d8SChris Lattner 63630fdc8d8SChris Lattner case eValueTypeVariableLocal: 63730fdc8d8SChris Lattner add_variable = locals; 63830fdc8d8SChris Lattner break; 639c982c768SGreg Clayton 640c982c768SGreg Clayton default: 641c982c768SGreg Clayton break; 64230fdc8d8SChris Lattner } 64330fdc8d8SChris Lattner if (add_variable) 64430fdc8d8SChris Lattner { 6456611103cSGreg Clayton if (in_scope_only && !variable_sp->IsInScope(m_opaque_sp.get())) 64630fdc8d8SChris Lattner continue; 64730fdc8d8SChris Lattner 64878a685aaSJim Ingham value_list.Append(m_opaque_sp->GetValueObjectForFrameVariable (variable_sp, use_dynamic)); 64930fdc8d8SChris Lattner } 65030fdc8d8SChris Lattner } 65130fdc8d8SChris Lattner } 65230fdc8d8SChris Lattner } 65330fdc8d8SChris Lattner } 65430fdc8d8SChris Lattner } 655ceb6b139SCaroline Tice 656ceb6b139SCaroline Tice if (log) 657ceb6b139SCaroline Tice { 6584838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", m_opaque_sp.get(), 659750cd175SCaroline Tice value_list.get()); 660ceb6b139SCaroline Tice } 661ceb6b139SCaroline Tice 66230fdc8d8SChris Lattner return value_list; 66330fdc8d8SChris Lattner } 66430fdc8d8SChris Lattner 66569b582faSGreg Clayton SBValueList 66630fdc8d8SChris Lattner SBFrame::GetRegisters () 66730fdc8d8SChris Lattner { 66869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 669ceb6b139SCaroline Tice 67030fdc8d8SChris Lattner SBValueList value_list; 6716611103cSGreg Clayton if (m_opaque_sp) 67230fdc8d8SChris Lattner { 673af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 6745ccbd294SGreg Clayton RegisterContextSP reg_ctx (m_opaque_sp->GetRegisterContext()); 67530fdc8d8SChris Lattner if (reg_ctx) 67630fdc8d8SChris Lattner { 67730fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 67830fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 67930fdc8d8SChris Lattner { 680*58b59f95SJim Ingham value_list.Append(ValueObjectRegisterSet::Create (m_opaque_sp.get(), reg_ctx, set_idx)); 68130fdc8d8SChris Lattner } 68230fdc8d8SChris Lattner } 68330fdc8d8SChris Lattner } 684ceb6b139SCaroline Tice 685ceb6b139SCaroline Tice if (log) 6864838131bSGreg Clayton log->Printf ("SBFrame(%p)::Registers () => SBValueList(%p)", m_opaque_sp.get(), value_list.get()); 687ceb6b139SCaroline Tice 68830fdc8d8SChris Lattner return value_list; 68930fdc8d8SChris Lattner } 69030fdc8d8SChris Lattner 691dde9cff3SCaroline Tice bool 692dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 693dde9cff3SCaroline Tice { 694dde9cff3SCaroline Tice if (m_opaque_sp) 695dde9cff3SCaroline Tice { 696af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 697cfd1acedSGreg Clayton Stream &s = description.ref(); 698cfd1acedSGreg Clayton m_opaque_sp->DumpUsingSettingsFormat (&s); 699dde9cff3SCaroline Tice } 700dde9cff3SCaroline Tice else 701dde9cff3SCaroline Tice description.Printf ("No value"); 702dde9cff3SCaroline Tice 703dde9cff3SCaroline Tice return true; 704dde9cff3SCaroline Tice } 7051d3afba3SGreg Clayton 70669b582faSGreg Clayton SBValue 7071d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 7081d3afba3SGreg Clayton { 70978a685aaSJim Ingham bool use_dynamic = m_opaque_sp->CalculateTarget()->GetPreferDynamicValue(); 71078a685aaSJim Ingham return EvaluateExpression (expr, use_dynamic); 71178a685aaSJim Ingham } 71278a685aaSJim Ingham 71378a685aaSJim Ingham SBValue 71478a685aaSJim Ingham SBFrame::EvaluateExpression (const char *expr, bool fetch_dynamic_value) 71578a685aaSJim Ingham { 716af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 717af67cecdSGreg Clayton 71869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7194838131bSGreg Clayton 72069b582faSGreg Clayton LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 721a162ebafSSean Callanan 72269b582faSGreg Clayton SBValue expr_result; 7234838131bSGreg Clayton if (log) 7244838131bSGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", m_opaque_sp.get(), expr); 7254838131bSGreg Clayton 7261d3afba3SGreg Clayton if (m_opaque_sp) 7271d3afba3SGreg Clayton { 72869b582faSGreg Clayton ExecutionResults exe_results; 7298b2fe6dcSGreg Clayton const bool unwind_on_error = true; 73092adcac9SSean Callanan const bool keep_in_memory = false; 731322f529bSSean Callanan 73278a685aaSJim Ingham exe_results = m_opaque_sp->GetThread().GetProcess().GetTarget().EvaluateExpression(expr, 73378a685aaSJim Ingham m_opaque_sp.get(), 73478a685aaSJim Ingham unwind_on_error, 73578a685aaSJim Ingham fetch_dynamic_value, 73678a685aaSJim Ingham keep_in_memory, 73778a685aaSJim Ingham *expr_result); 7381d3afba3SGreg Clayton } 7394838131bSGreg Clayton 740a162ebafSSean Callanan if (expr_log) 74178a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 74278a685aaSJim Ingham expr_result.GetValue(*this), 74378a685aaSJim Ingham expr_result.GetSummary(*this)); 744a162ebafSSean Callanan 7454838131bSGreg Clayton if (log) 74678a685aaSJim Ingham log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p)", m_opaque_sp.get(), 74778a685aaSJim Ingham expr, 74878a685aaSJim Ingham expr_result.get()); 7494838131bSGreg Clayton 750cfd1acedSGreg Clayton return expr_result; 7511d3afba3SGreg Clayton } 752