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" 3530fdc8d8SChris Lattner #include "lldb/Target/Thread.h" 3630fdc8d8SChris Lattner 374c5de699SEli Friedman #include "lldb/API/SBDebugger.h" 384c5de699SEli Friedman #include "lldb/API/SBValue.h" 394c5de699SEli Friedman #include "lldb/API/SBAddress.h" 40dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 414c5de699SEli Friedman #include "lldb/API/SBSymbolContext.h" 424c5de699SEli Friedman #include "lldb/API/SBThread.h" 4330fdc8d8SChris Lattner 4430fdc8d8SChris Lattner using namespace lldb; 4530fdc8d8SChris Lattner using namespace lldb_private; 4630fdc8d8SChris Lattner 4730fdc8d8SChris Lattner SBFrame::SBFrame () : 486611103cSGreg Clayton m_opaque_sp () 4930fdc8d8SChris Lattner { 5030fdc8d8SChris Lattner } 5130fdc8d8SChris Lattner 5269b582faSGreg Clayton SBFrame::SBFrame (const StackFrameSP &lldb_object_sp) : 536611103cSGreg Clayton m_opaque_sp (lldb_object_sp) 5430fdc8d8SChris Lattner { 5569b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 56ceb6b139SCaroline Tice 57ceb6b139SCaroline Tice if (log) 58ceb6b139SCaroline Tice { 59ceb6b139SCaroline Tice SBStream sstr; 60ceb6b139SCaroline Tice GetDescription (sstr); 614838131bSGreg Clayton log->Printf ("SBFrame::SBFrame (sp=%p) => SBFrame(%p): %s", 624838131bSGreg Clayton lldb_object_sp.get(), m_opaque_sp.get(), sstr.GetData()); 63750cd175SCaroline Tice 64ceb6b139SCaroline Tice } 6530fdc8d8SChris Lattner } 6630fdc8d8SChris Lattner 67efabb123SGreg Clayton SBFrame::SBFrame(const SBFrame &rhs) : 68efabb123SGreg Clayton m_opaque_sp (rhs.m_opaque_sp) 69efabb123SGreg Clayton { 70efabb123SGreg Clayton } 71efabb123SGreg Clayton 72efabb123SGreg Clayton const SBFrame & 73efabb123SGreg Clayton SBFrame::operator = (const SBFrame &rhs) 74efabb123SGreg Clayton { 75efabb123SGreg Clayton if (this != &rhs) 76efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 77efabb123SGreg Clayton return *this; 78efabb123SGreg Clayton } 79efabb123SGreg Clayton 8030fdc8d8SChris Lattner SBFrame::~SBFrame() 8130fdc8d8SChris Lattner { 8230fdc8d8SChris Lattner } 8330fdc8d8SChris Lattner 8430fdc8d8SChris Lattner 8530fdc8d8SChris Lattner void 8669b582faSGreg Clayton SBFrame::SetFrame (const StackFrameSP &lldb_object_sp) 8730fdc8d8SChris Lattner { 884838131bSGreg Clayton void *old_ptr = m_opaque_sp.get(); 896611103cSGreg Clayton m_opaque_sp = lldb_object_sp; 9069b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 914838131bSGreg Clayton 924838131bSGreg Clayton if (log) 934838131bSGreg Clayton { 944838131bSGreg Clayton log->Printf ("SBFrame(%p)::SetFrame(sp=%p) := SBFrame(%p)", 954838131bSGreg Clayton old_ptr, lldb_object_sp.get(), m_opaque_sp.get()); 964838131bSGreg Clayton } 974838131bSGreg Clayton 9830fdc8d8SChris Lattner } 9930fdc8d8SChris Lattner 10030fdc8d8SChris Lattner 10130fdc8d8SChris Lattner bool 10230fdc8d8SChris Lattner SBFrame::IsValid() const 10330fdc8d8SChris Lattner { 1046611103cSGreg Clayton return (m_opaque_sp.get() != NULL); 10530fdc8d8SChris Lattner } 10630fdc8d8SChris Lattner 10730fdc8d8SChris Lattner SBSymbolContext 10830fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const 10930fdc8d8SChris Lattner { 110ceb6b139SCaroline Tice 11130fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 1126611103cSGreg Clayton if (m_opaque_sp) 113af67cecdSGreg Clayton { 114af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 1156611103cSGreg Clayton sb_sym_ctx.SetSymbolContext(&m_opaque_sp->GetSymbolContext (resolve_scope)); 116af67cecdSGreg Clayton } 117ceb6b139SCaroline Tice 11869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 119ceb6b139SCaroline Tice if (log) 1204838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)", 121750cd175SCaroline Tice m_opaque_sp.get(), resolve_scope, sb_sym_ctx.get()); 122ceb6b139SCaroline Tice 12330fdc8d8SChris Lattner return sb_sym_ctx; 12430fdc8d8SChris Lattner } 12530fdc8d8SChris Lattner 12630fdc8d8SChris Lattner SBModule 12730fdc8d8SChris Lattner SBFrame::GetModule () const 12830fdc8d8SChris Lattner { 12972eff18aSGreg Clayton SBModule sb_module; 13072eff18aSGreg Clayton if (m_opaque_sp) 131af67cecdSGreg Clayton { 132af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 13372eff18aSGreg Clayton *sb_module = m_opaque_sp->GetSymbolContext (eSymbolContextModule).module_sp; 134af67cecdSGreg Clayton } 13572eff18aSGreg Clayton 13669b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1374838131bSGreg Clayton if (log) 1384838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)", 1394838131bSGreg Clayton m_opaque_sp.get(), sb_module.get()); 1404838131bSGreg Clayton 14130fdc8d8SChris Lattner return sb_module; 14230fdc8d8SChris Lattner } 14330fdc8d8SChris Lattner 14430fdc8d8SChris Lattner SBCompileUnit 14530fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 14630fdc8d8SChris Lattner { 14772eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 14872eff18aSGreg Clayton if (m_opaque_sp) 149af67cecdSGreg Clayton { 150af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 15172eff18aSGreg Clayton sb_comp_unit.reset (m_opaque_sp->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 152af67cecdSGreg Clayton } 15369b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 154ceb6b139SCaroline Tice if (log) 1554838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBCompileUnit(%p)", 1564838131bSGreg Clayton m_opaque_sp.get(), sb_comp_unit.get()); 157ceb6b139SCaroline Tice 15830fdc8d8SChris Lattner return sb_comp_unit; 15930fdc8d8SChris Lattner } 16030fdc8d8SChris Lattner 16130fdc8d8SChris Lattner SBFunction 16230fdc8d8SChris Lattner SBFrame::GetFunction () const 16330fdc8d8SChris Lattner { 16472eff18aSGreg Clayton SBFunction sb_function; 16572eff18aSGreg Clayton if (m_opaque_sp) 166af67cecdSGreg Clayton { 167af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 16872eff18aSGreg Clayton sb_function.reset(m_opaque_sp->GetSymbolContext (eSymbolContextFunction).function); 169af67cecdSGreg Clayton } 17069b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1714838131bSGreg Clayton if (log) 1724838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)", 1734838131bSGreg Clayton m_opaque_sp.get(), sb_function.get()); 1744838131bSGreg Clayton 17530fdc8d8SChris Lattner return sb_function; 17630fdc8d8SChris Lattner } 17730fdc8d8SChris Lattner 1783b06557eSGreg Clayton SBSymbol 1793b06557eSGreg Clayton SBFrame::GetSymbol () const 1803b06557eSGreg Clayton { 18172eff18aSGreg Clayton SBSymbol sb_symbol; 18272eff18aSGreg Clayton if (m_opaque_sp) 183af67cecdSGreg Clayton { 184af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 18572eff18aSGreg Clayton sb_symbol.reset(m_opaque_sp->GetSymbolContext (eSymbolContextSymbol).symbol); 186af67cecdSGreg Clayton } 18769b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1884838131bSGreg Clayton if (log) 1894838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 1904838131bSGreg Clayton m_opaque_sp.get(), sb_symbol.get()); 1913b06557eSGreg Clayton return sb_symbol; 1923b06557eSGreg Clayton } 1933b06557eSGreg Clayton 19430fdc8d8SChris Lattner SBBlock 19530fdc8d8SChris Lattner SBFrame::GetBlock () const 19630fdc8d8SChris Lattner { 19772eff18aSGreg Clayton SBBlock sb_block; 19872eff18aSGreg Clayton if (m_opaque_sp) 199af67cecdSGreg Clayton { 200af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 20172eff18aSGreg Clayton sb_block.reset (m_opaque_sp->GetSymbolContext (eSymbolContextBlock).block); 202af67cecdSGreg Clayton } 20369b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2044838131bSGreg Clayton if (log) 2054838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)", 2064838131bSGreg Clayton m_opaque_sp.get(), sb_block.get()); 20730fdc8d8SChris Lattner return sb_block; 20830fdc8d8SChris Lattner } 20930fdc8d8SChris Lattner 21095897c6aSGreg Clayton SBBlock 21195897c6aSGreg Clayton SBFrame::GetFrameBlock () const 21295897c6aSGreg Clayton { 21372eff18aSGreg Clayton SBBlock sb_block; 21472eff18aSGreg Clayton if (m_opaque_sp) 215af67cecdSGreg Clayton { 216af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 21772eff18aSGreg Clayton sb_block.reset(m_opaque_sp->GetFrameBlock ()); 218af67cecdSGreg Clayton } 21969b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2204838131bSGreg Clayton if (log) 2214838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 2224838131bSGreg Clayton m_opaque_sp.get(), sb_block.get()); 22395897c6aSGreg Clayton return sb_block; 22495897c6aSGreg Clayton } 22595897c6aSGreg Clayton 22630fdc8d8SChris Lattner SBLineEntry 22730fdc8d8SChris Lattner SBFrame::GetLineEntry () const 22830fdc8d8SChris Lattner { 22972eff18aSGreg Clayton SBLineEntry sb_line_entry; 23072eff18aSGreg Clayton if (m_opaque_sp) 231af67cecdSGreg Clayton { 232af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 23372eff18aSGreg Clayton sb_line_entry.SetLineEntry (m_opaque_sp->GetSymbolContext (eSymbolContextLineEntry).line_entry); 234af67cecdSGreg Clayton } 23569b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2364838131bSGreg Clayton if (log) 2374838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 2384838131bSGreg Clayton m_opaque_sp.get(), sb_line_entry.get()); 23930fdc8d8SChris Lattner return sb_line_entry; 24030fdc8d8SChris Lattner } 24130fdc8d8SChris Lattner 24230fdc8d8SChris Lattner uint32_t 24330fdc8d8SChris Lattner SBFrame::GetFrameID () const 24430fdc8d8SChris Lattner { 2454838131bSGreg Clayton uint32_t frame_idx = m_opaque_sp ? m_opaque_sp->GetFrameIndex () : UINT32_MAX; 2464838131bSGreg Clayton 24769b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2484838131bSGreg Clayton if (log) 2494838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameID () => %u", 2504838131bSGreg Clayton m_opaque_sp.get(), frame_idx); 2514838131bSGreg Clayton return frame_idx; 25230fdc8d8SChris Lattner } 25330fdc8d8SChris Lattner 25469b582faSGreg Clayton addr_t 25530fdc8d8SChris Lattner SBFrame::GetPC () const 25630fdc8d8SChris Lattner { 25769b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 2586611103cSGreg Clayton if (m_opaque_sp) 259af67cecdSGreg Clayton { 260af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 26134132754SGreg Clayton addr = m_opaque_sp->GetFrameCodeAddress().GetOpcodeLoadAddress (&m_opaque_sp->GetThread().GetProcess().GetTarget()); 262af67cecdSGreg Clayton } 263ceb6b139SCaroline Tice 26469b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 265ceb6b139SCaroline Tice if (log) 266cfd1acedSGreg Clayton log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", m_opaque_sp.get(), addr); 267ceb6b139SCaroline Tice 268ceb6b139SCaroline Tice return addr; 26930fdc8d8SChris Lattner } 27030fdc8d8SChris Lattner 27130fdc8d8SChris Lattner bool 27269b582faSGreg Clayton SBFrame::SetPC (addr_t new_pc) 27330fdc8d8SChris Lattner { 274ceb6b139SCaroline Tice bool ret_val = false; 2756611103cSGreg Clayton if (m_opaque_sp) 276af67cecdSGreg Clayton { 277af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 278ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetRegisterContext()->SetPC (new_pc); 279af67cecdSGreg Clayton } 280ceb6b139SCaroline Tice 28169b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 282ceb6b139SCaroline Tice if (log) 2834838131bSGreg Clayton log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i", 2844838131bSGreg Clayton m_opaque_sp.get(), new_pc, ret_val); 285ceb6b139SCaroline Tice 286ceb6b139SCaroline Tice return ret_val; 28730fdc8d8SChris Lattner } 28830fdc8d8SChris Lattner 28969b582faSGreg Clayton addr_t 29030fdc8d8SChris Lattner SBFrame::GetSP () const 29130fdc8d8SChris Lattner { 2924838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 2936611103cSGreg Clayton if (m_opaque_sp) 294af67cecdSGreg Clayton { 295af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 2964838131bSGreg Clayton addr = m_opaque_sp->GetRegisterContext()->GetSP(); 297af67cecdSGreg Clayton } 29869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2994838131bSGreg Clayton if (log) 300cfd1acedSGreg Clayton log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", m_opaque_sp.get(), addr); 3014838131bSGreg Clayton 3024838131bSGreg Clayton return addr; 30330fdc8d8SChris Lattner } 30430fdc8d8SChris Lattner 30530fdc8d8SChris Lattner 30669b582faSGreg Clayton addr_t 30730fdc8d8SChris Lattner SBFrame::GetFP () const 30830fdc8d8SChris Lattner { 30969b582faSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 3106611103cSGreg Clayton if (m_opaque_sp) 311af67cecdSGreg Clayton { 312af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 313ceb6b139SCaroline Tice addr = m_opaque_sp->GetRegisterContext()->GetFP(); 314af67cecdSGreg Clayton } 315ceb6b139SCaroline Tice 31669b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 317ceb6b139SCaroline Tice if (log) 318cfd1acedSGreg Clayton log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", m_opaque_sp.get(), addr); 319ceb6b139SCaroline Tice return addr; 32030fdc8d8SChris Lattner } 32130fdc8d8SChris Lattner 32230fdc8d8SChris Lattner 32330fdc8d8SChris Lattner SBAddress 32430fdc8d8SChris Lattner SBFrame::GetPCAddress () const 32530fdc8d8SChris Lattner { 32630fdc8d8SChris Lattner SBAddress sb_addr; 3276611103cSGreg Clayton if (m_opaque_sp) 328af67cecdSGreg Clayton { 329af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 3309da7bd07SGreg Clayton sb_addr.SetAddress (&m_opaque_sp->GetFrameCodeAddress()); 331af67cecdSGreg Clayton } 33269b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3334838131bSGreg Clayton if (log) 3344838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", m_opaque_sp.get(), sb_addr.get()); 33530fdc8d8SChris Lattner return sb_addr; 33630fdc8d8SChris Lattner } 33730fdc8d8SChris Lattner 33830fdc8d8SChris Lattner void 33930fdc8d8SChris Lattner SBFrame::Clear() 34030fdc8d8SChris Lattner { 3416611103cSGreg Clayton m_opaque_sp.reset(); 34230fdc8d8SChris Lattner } 34330fdc8d8SChris Lattner 34430fdc8d8SChris Lattner SBValue 34569b582faSGreg Clayton SBFrame::FindVariable (const char *name) 34630fdc8d8SChris Lattner { 347316d498bSGreg Clayton SBValue value; 348316d498bSGreg Clayton if (m_opaque_sp) 349316d498bSGreg Clayton { 3502837b766SJim Ingham lldb::DynamicValueType use_dynamic = m_opaque_sp->CalculateTarget()->GetPreferDynamicValue(); 351316d498bSGreg Clayton value = FindVariable (name, use_dynamic); 352316d498bSGreg Clayton } 353316d498bSGreg Clayton return value; 35478a685aaSJim Ingham } 35578a685aaSJim Ingham 35678a685aaSJim Ingham SBValue 3572837b766SJim Ingham SBFrame::FindVariable (const char *name, lldb::DynamicValueType use_dynamic) 35878a685aaSJim Ingham { 35969b582faSGreg Clayton VariableSP var_sp; 36058b59f95SJim Ingham SBValue sb_value; 36158b59f95SJim Ingham 36269b582faSGreg Clayton if (m_opaque_sp && name && name[0]) 36330fdc8d8SChris Lattner { 36469b582faSGreg Clayton VariableList variable_list; 365af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 36672eff18aSGreg Clayton SymbolContext sc (m_opaque_sp->GetSymbolContext (eSymbolContextBlock)); 36730fdc8d8SChris Lattner 36872eff18aSGreg Clayton if (sc.block) 36930fdc8d8SChris Lattner { 37072eff18aSGreg Clayton const bool can_create = true; 37172eff18aSGreg Clayton const bool get_parent_variables = true; 37272eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 37372eff18aSGreg Clayton 37472eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 37572eff18aSGreg Clayton get_parent_variables, 37672eff18aSGreg Clayton stop_if_block_is_inlined_function, 37772eff18aSGreg Clayton &variable_list)) 37872eff18aSGreg Clayton { 37969b582faSGreg Clayton var_sp = variable_list.FindVariable (ConstString(name)); 38030fdc8d8SChris Lattner } 38172eff18aSGreg Clayton } 38230fdc8d8SChris Lattner 3834838131bSGreg Clayton if (var_sp) 38478a685aaSJim Ingham *sb_value = ValueObjectSP (m_opaque_sp->GetValueObjectForFrameVariable(var_sp, use_dynamic)); 3854838131bSGreg Clayton 386316d498bSGreg Clayton } 387316d498bSGreg Clayton 38869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3894838131bSGreg Clayton if (log) 39069b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariable (name=\"%s\") => SBValue(%p)", 39169b582faSGreg Clayton m_opaque_sp.get(), name, sb_value.get()); 3924838131bSGreg Clayton 393dde9cff3SCaroline Tice return sb_value; 394dde9cff3SCaroline Tice } 395dde9cff3SCaroline Tice 39630fdc8d8SChris Lattner SBValue 39769b582faSGreg Clayton SBFrame::FindValue (const char *name, ValueType value_type) 39830fdc8d8SChris Lattner { 399316d498bSGreg Clayton SBValue value; 400316d498bSGreg Clayton if (m_opaque_sp) 401316d498bSGreg Clayton { 4022837b766SJim Ingham lldb::DynamicValueType use_dynamic = m_opaque_sp->CalculateTarget()->GetPreferDynamicValue(); 403316d498bSGreg Clayton value = FindValue (name, value_type, use_dynamic); 404316d498bSGreg Clayton } 405316d498bSGreg Clayton return value; 40678a685aaSJim Ingham } 40778a685aaSJim Ingham 40878a685aaSJim Ingham SBValue 4092837b766SJim Ingham SBFrame::FindValue (const char *name, ValueType value_type, lldb::DynamicValueType use_dynamic) 41078a685aaSJim Ingham { 41169b582faSGreg Clayton SBValue sb_value; 41269b582faSGreg Clayton if (m_opaque_sp && name && name[0]) 41330fdc8d8SChris Lattner { 414af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 41530fdc8d8SChris Lattner 41669b582faSGreg Clayton switch (value_type) 41730fdc8d8SChris Lattner { 41869b582faSGreg Clayton case eValueTypeVariableGlobal: // global variable 41969b582faSGreg Clayton case eValueTypeVariableStatic: // static variable 42069b582faSGreg Clayton case eValueTypeVariableArgument: // function argument variables 42169b582faSGreg Clayton case eValueTypeVariableLocal: // function local variables 42269b582faSGreg Clayton { 42369b582faSGreg Clayton VariableList *variable_list = m_opaque_sp->GetVariableList(true); 42472eff18aSGreg Clayton 42572eff18aSGreg Clayton SymbolContext sc (m_opaque_sp->GetSymbolContext (eSymbolContextBlock)); 42672eff18aSGreg Clayton 42772eff18aSGreg Clayton const bool can_create = true; 42872eff18aSGreg Clayton const bool get_parent_variables = true; 42972eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 43072eff18aSGreg Clayton 43172eff18aSGreg Clayton if (sc.block && sc.block->AppendVariables (can_create, 43272eff18aSGreg Clayton get_parent_variables, 43372eff18aSGreg Clayton stop_if_block_is_inlined_function, 434e85d9cb8SJohnny Chen variable_list)) 435beae523aSJohnny Chen { 43669b582faSGreg Clayton ConstString const_name(name); 437e85d9cb8SJohnny Chen const uint32_t num_variables = variable_list->GetSize(); 43872eff18aSGreg Clayton for (uint32_t i = 0; i < num_variables; ++i) 43930fdc8d8SChris Lattner { 44069b582faSGreg Clayton VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 44169b582faSGreg Clayton if (variable_sp && 44269b582faSGreg Clayton variable_sp->GetScope() == value_type && 44369b582faSGreg Clayton variable_sp->GetName() == const_name) 444beae523aSJohnny Chen { 44578a685aaSJim Ingham *sb_value = ValueObjectSP (m_opaque_sp->GetValueObjectForFrameVariable(variable_sp, 44678a685aaSJim Ingham use_dynamic)); 447beae523aSJohnny Chen break; 448beae523aSJohnny Chen } 44930fdc8d8SChris Lattner } 45030fdc8d8SChris Lattner } 45130fdc8d8SChris Lattner } 45269b582faSGreg Clayton break; 45369b582faSGreg Clayton 45469b582faSGreg Clayton case eValueTypeRegister: // stack frame register value 45569b582faSGreg Clayton { 4565ccbd294SGreg Clayton RegisterContextSP reg_ctx (m_opaque_sp->GetRegisterContext()); 45769b582faSGreg Clayton if (reg_ctx) 45869b582faSGreg Clayton { 45969b582faSGreg Clayton const uint32_t num_regs = reg_ctx->GetRegisterCount(); 46069b582faSGreg Clayton for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx) 46169b582faSGreg Clayton { 46269b582faSGreg Clayton const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoAtIndex (reg_idx); 46369b582faSGreg Clayton if (reg_info && 46469b582faSGreg Clayton ((reg_info->name && strcasecmp (reg_info->name, name) == 0) || 46569b582faSGreg Clayton (reg_info->alt_name && strcasecmp (reg_info->alt_name, name) == 0))) 46669b582faSGreg Clayton { 46758b59f95SJim Ingham *sb_value = ValueObjectRegister::Create (m_opaque_sp.get(), reg_ctx, reg_idx); 46869b582faSGreg Clayton } 46969b582faSGreg Clayton } 47069b582faSGreg Clayton } 47169b582faSGreg Clayton } 47269b582faSGreg Clayton break; 47369b582faSGreg Clayton 47469b582faSGreg Clayton case eValueTypeRegisterSet: // A collection of stack frame register values 47569b582faSGreg Clayton { 4765ccbd294SGreg Clayton RegisterContextSP reg_ctx (m_opaque_sp->GetRegisterContext()); 47769b582faSGreg Clayton if (reg_ctx) 47869b582faSGreg Clayton { 47969b582faSGreg Clayton const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 48069b582faSGreg Clayton for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 48169b582faSGreg Clayton { 48269b582faSGreg Clayton const RegisterSet *reg_set = reg_ctx->GetRegisterSet (set_idx); 48369b582faSGreg Clayton if (reg_set && 48469b582faSGreg Clayton ((reg_set->name && strcasecmp (reg_set->name, name) == 0) || 48569b582faSGreg Clayton (reg_set->short_name && strcasecmp (reg_set->short_name, name) == 0))) 48669b582faSGreg Clayton { 48758b59f95SJim Ingham *sb_value = ValueObjectRegisterSet::Create (m_opaque_sp.get(), reg_ctx, set_idx); 48869b582faSGreg Clayton } 48969b582faSGreg Clayton } 49069b582faSGreg Clayton } 49169b582faSGreg Clayton } 49269b582faSGreg Clayton break; 49369b582faSGreg Clayton 49469b582faSGreg Clayton case eValueTypeConstResult: // constant result variables 49569b582faSGreg Clayton { 49669b582faSGreg Clayton ConstString const_name(name); 49769b582faSGreg Clayton ClangExpressionVariableSP expr_var_sp (m_opaque_sp->GetThread().GetProcess().GetTarget().GetPersistentVariables().GetVariable (const_name)); 49869b582faSGreg Clayton if (expr_var_sp) 49969b582faSGreg Clayton *sb_value = expr_var_sp->GetValueObject(); 50069b582faSGreg Clayton } 50169b582faSGreg Clayton break; 50269b582faSGreg Clayton 50369b582faSGreg Clayton default: 50469b582faSGreg Clayton break; 50569b582faSGreg Clayton } 506beae523aSJohnny Chen } 507dde9cff3SCaroline Tice 50869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5094838131bSGreg Clayton if (log) 51069b582faSGreg Clayton log->Printf ("SBFrame(%p)::FindVariableInScope (name=\"%s\", value_type=%i) => SBValue(%p)", 51169b582faSGreg Clayton m_opaque_sp.get(), name, value_type, sb_value.get()); 5124838131bSGreg Clayton 5134838131bSGreg Clayton 514dde9cff3SCaroline Tice return sb_value; 515dde9cff3SCaroline Tice } 516dde9cff3SCaroline Tice 51730fdc8d8SChris Lattner bool 51830fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 51930fdc8d8SChris Lattner { 5206611103cSGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 52130fdc8d8SChris Lattner } 52230fdc8d8SChris Lattner 52330fdc8d8SChris Lattner bool 52430fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 52530fdc8d8SChris Lattner { 5266611103cSGreg Clayton return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 52730fdc8d8SChris Lattner } 52830fdc8d8SChris Lattner 52930fdc8d8SChris Lattner lldb_private::StackFrame * 53030fdc8d8SChris Lattner SBFrame::operator->() const 53130fdc8d8SChris Lattner { 5326611103cSGreg Clayton return m_opaque_sp.get(); 53330fdc8d8SChris Lattner } 53430fdc8d8SChris Lattner 53530fdc8d8SChris Lattner lldb_private::StackFrame * 53630fdc8d8SChris Lattner SBFrame::get() const 53730fdc8d8SChris Lattner { 5386611103cSGreg Clayton return m_opaque_sp.get(); 53930fdc8d8SChris Lattner } 54030fdc8d8SChris Lattner 541bf2331c4SGreg Clayton lldb::StackFrameSP & 542bf2331c4SGreg Clayton SBFrame::get_sp() 543481cef25SGreg Clayton { 544481cef25SGreg Clayton return m_opaque_sp; 545481cef25SGreg Clayton } 54630fdc8d8SChris Lattner 54730fdc8d8SChris Lattner SBThread 54830fdc8d8SChris Lattner SBFrame::GetThread () const 54930fdc8d8SChris Lattner { 55069b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 551ceb6b139SCaroline Tice 55272eff18aSGreg Clayton SBThread sb_thread; 55372eff18aSGreg Clayton if (m_opaque_sp) 554af67cecdSGreg Clayton { 555af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 55672eff18aSGreg Clayton sb_thread.SetThread (m_opaque_sp->GetThread().GetSP()); 557af67cecdSGreg Clayton } 558ceb6b139SCaroline Tice 559ceb6b139SCaroline Tice if (log) 560750cd175SCaroline Tice { 561750cd175SCaroline Tice SBStream sstr; 562750cd175SCaroline Tice sb_thread.GetDescription (sstr); 5634838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", m_opaque_sp.get(), 5644838131bSGreg Clayton sb_thread.get(), sstr.GetData()); 565750cd175SCaroline Tice } 566ceb6b139SCaroline Tice 56730fdc8d8SChris Lattner return sb_thread; 56830fdc8d8SChris Lattner } 56930fdc8d8SChris Lattner 57030fdc8d8SChris Lattner const char * 57130fdc8d8SChris Lattner SBFrame::Disassemble () const 57230fdc8d8SChris Lattner { 5734838131bSGreg Clayton const char *disassembly = NULL; 5746611103cSGreg Clayton if (m_opaque_sp) 575af67cecdSGreg Clayton { 576af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 5774838131bSGreg Clayton disassembly = m_opaque_sp->Disassemble(); 578af67cecdSGreg Clayton } 57969b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5804838131bSGreg Clayton 5814838131bSGreg Clayton if (log) 5824838131bSGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => %s", m_opaque_sp.get(), disassembly); 5834838131bSGreg Clayton 5844838131bSGreg Clayton return disassembly; 58530fdc8d8SChris Lattner } 58630fdc8d8SChris Lattner 58730fdc8d8SChris Lattner 58830fdc8d8SChris Lattner SBValueList 58930fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 59030fdc8d8SChris Lattner bool locals, 59130fdc8d8SChris Lattner bool statics, 59230fdc8d8SChris Lattner bool in_scope_only) 59330fdc8d8SChris Lattner { 594316d498bSGreg Clayton SBValueList value_list; 595316d498bSGreg Clayton if (m_opaque_sp) 596316d498bSGreg Clayton { 5972837b766SJim Ingham lldb::DynamicValueType use_dynamic = m_opaque_sp->CalculateTarget()->GetPreferDynamicValue(); 598316d498bSGreg Clayton value_list = GetVariables (arguments, locals, statics, in_scope_only, use_dynamic); 599316d498bSGreg Clayton } 600316d498bSGreg Clayton return value_list; 60178a685aaSJim Ingham } 60278a685aaSJim Ingham 60378a685aaSJim Ingham SBValueList 60478a685aaSJim Ingham SBFrame::GetVariables (bool arguments, 60578a685aaSJim Ingham bool locals, 60678a685aaSJim Ingham bool statics, 60778a685aaSJim Ingham bool in_scope_only, 6082837b766SJim Ingham lldb::DynamicValueType use_dynamic) 60978a685aaSJim Ingham { 61069b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 611ceb6b139SCaroline Tice 612ceb6b139SCaroline Tice if (log) 6134838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 614750cd175SCaroline Tice m_opaque_sp.get(), 6154838131bSGreg Clayton arguments, 6164838131bSGreg Clayton locals, 6174838131bSGreg Clayton statics, 6184838131bSGreg Clayton in_scope_only); 619ceb6b139SCaroline Tice 62030fdc8d8SChris Lattner SBValueList value_list; 6216611103cSGreg Clayton if (m_opaque_sp) 62230fdc8d8SChris Lattner { 623af67cecdSGreg Clayton 62430fdc8d8SChris Lattner size_t i; 625af67cecdSGreg Clayton VariableList *variable_list = NULL; 626af67cecdSGreg Clayton // Scope for locker 627af67cecdSGreg Clayton { 628af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 629af67cecdSGreg Clayton variable_list = m_opaque_sp->GetVariableList(true); 630af67cecdSGreg Clayton } 63130fdc8d8SChris Lattner if (variable_list) 63230fdc8d8SChris Lattner { 63330fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 63430fdc8d8SChris Lattner if (num_variables) 63530fdc8d8SChris Lattner { 63630fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 63730fdc8d8SChris Lattner { 63830fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 63930fdc8d8SChris Lattner if (variable_sp) 64030fdc8d8SChris Lattner { 64130fdc8d8SChris Lattner bool add_variable = false; 64230fdc8d8SChris Lattner switch (variable_sp->GetScope()) 64330fdc8d8SChris Lattner { 64430fdc8d8SChris Lattner case eValueTypeVariableGlobal: 64530fdc8d8SChris Lattner case eValueTypeVariableStatic: 64630fdc8d8SChris Lattner add_variable = statics; 64730fdc8d8SChris Lattner break; 64830fdc8d8SChris Lattner 64930fdc8d8SChris Lattner case eValueTypeVariableArgument: 65030fdc8d8SChris Lattner add_variable = arguments; 65130fdc8d8SChris Lattner break; 65230fdc8d8SChris Lattner 65330fdc8d8SChris Lattner case eValueTypeVariableLocal: 65430fdc8d8SChris Lattner add_variable = locals; 65530fdc8d8SChris Lattner break; 656c982c768SGreg Clayton 657c982c768SGreg Clayton default: 658c982c768SGreg Clayton break; 65930fdc8d8SChris Lattner } 66030fdc8d8SChris Lattner if (add_variable) 66130fdc8d8SChris Lattner { 6626611103cSGreg Clayton if (in_scope_only && !variable_sp->IsInScope(m_opaque_sp.get())) 66330fdc8d8SChris Lattner continue; 66430fdc8d8SChris Lattner 66578a685aaSJim Ingham value_list.Append(m_opaque_sp->GetValueObjectForFrameVariable (variable_sp, use_dynamic)); 66630fdc8d8SChris Lattner } 66730fdc8d8SChris Lattner } 66830fdc8d8SChris Lattner } 66930fdc8d8SChris Lattner } 67030fdc8d8SChris Lattner } 67130fdc8d8SChris Lattner } 672ceb6b139SCaroline Tice 673ceb6b139SCaroline Tice if (log) 674ceb6b139SCaroline Tice { 6754838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", m_opaque_sp.get(), 676750cd175SCaroline Tice value_list.get()); 677ceb6b139SCaroline Tice } 678ceb6b139SCaroline Tice 67930fdc8d8SChris Lattner return value_list; 68030fdc8d8SChris Lattner } 68130fdc8d8SChris Lattner 68269b582faSGreg Clayton SBValueList 68330fdc8d8SChris Lattner SBFrame::GetRegisters () 68430fdc8d8SChris Lattner { 68569b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 686ceb6b139SCaroline Tice 68730fdc8d8SChris Lattner SBValueList value_list; 6886611103cSGreg Clayton if (m_opaque_sp) 68930fdc8d8SChris Lattner { 690af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 6915ccbd294SGreg Clayton RegisterContextSP reg_ctx (m_opaque_sp->GetRegisterContext()); 69230fdc8d8SChris Lattner if (reg_ctx) 69330fdc8d8SChris Lattner { 69430fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 69530fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 69630fdc8d8SChris Lattner { 69758b59f95SJim Ingham value_list.Append(ValueObjectRegisterSet::Create (m_opaque_sp.get(), reg_ctx, set_idx)); 69830fdc8d8SChris Lattner } 69930fdc8d8SChris Lattner } 70030fdc8d8SChris Lattner } 701ceb6b139SCaroline Tice 702ceb6b139SCaroline Tice if (log) 7034838131bSGreg Clayton log->Printf ("SBFrame(%p)::Registers () => SBValueList(%p)", m_opaque_sp.get(), value_list.get()); 704ceb6b139SCaroline Tice 70530fdc8d8SChris Lattner return value_list; 70630fdc8d8SChris Lattner } 70730fdc8d8SChris Lattner 708dde9cff3SCaroline Tice bool 709dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 710dde9cff3SCaroline Tice { 711dde9cff3SCaroline Tice if (m_opaque_sp) 712dde9cff3SCaroline Tice { 713af67cecdSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 714cfd1acedSGreg Clayton Stream &s = description.ref(); 715cfd1acedSGreg Clayton m_opaque_sp->DumpUsingSettingsFormat (&s); 716dde9cff3SCaroline Tice } 717dde9cff3SCaroline Tice else 718dde9cff3SCaroline Tice description.Printf ("No value"); 719dde9cff3SCaroline Tice 720dde9cff3SCaroline Tice return true; 721dde9cff3SCaroline Tice } 7221d3afba3SGreg Clayton 72369b582faSGreg Clayton SBValue 7241d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 7251d3afba3SGreg Clayton { 726316d498bSGreg Clayton SBValue result; 727316d498bSGreg Clayton if (m_opaque_sp) 728316d498bSGreg Clayton { 7292837b766SJim Ingham lldb::DynamicValueType use_dynamic = m_opaque_sp->CalculateTarget()->GetPreferDynamicValue(); 730316d498bSGreg Clayton result = EvaluateExpression (expr, use_dynamic); 731316d498bSGreg Clayton } 732316d498bSGreg Clayton return result; 73378a685aaSJim Ingham } 73478a685aaSJim Ingham 73578a685aaSJim Ingham SBValue 7362837b766SJim Ingham SBFrame::EvaluateExpression (const char *expr, lldb::DynamicValueType fetch_dynamic_value) 73778a685aaSJim Ingham { 73869b582faSGreg Clayton LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 7394838131bSGreg Clayton 74069b582faSGreg Clayton LogSP expr_log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 741a162ebafSSean Callanan 74225f3a3cdSJohnny Chen ExecutionResults exe_results; 74369b582faSGreg Clayton SBValue expr_result; 7444838131bSGreg Clayton if (log) 7454838131bSGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", m_opaque_sp.get(), expr); 7464838131bSGreg Clayton 7471d3afba3SGreg Clayton if (m_opaque_sp) 7481d3afba3SGreg Clayton { 749316d498bSGreg Clayton Mutex::Locker api_locker (m_opaque_sp->GetThread().GetProcess().GetTarget().GetAPIMutex()); 750316d498bSGreg Clayton 7511ba7c4d0SGreg Clayton 7521ba7c4d0SGreg Clayton StreamString frame_description; 7531ba7c4d0SGreg Clayton m_opaque_sp->DumpUsingSettingsFormat (&frame_description); 7541ba7c4d0SGreg Clayton 7551ba7c4d0SGreg Clayton Host::SetCrashDescriptionWithFormat ("SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value = %u) %s", 7561ba7c4d0SGreg Clayton expr, fetch_dynamic_value, frame_description.GetString().c_str()); 7571ba7c4d0SGreg Clayton 7588b2fe6dcSGreg Clayton const bool unwind_on_error = true; 75992adcac9SSean Callanan const bool keep_in_memory = false; 760322f529bSSean Callanan 76178a685aaSJim Ingham exe_results = m_opaque_sp->GetThread().GetProcess().GetTarget().EvaluateExpression(expr, 76278a685aaSJim Ingham m_opaque_sp.get(), 763*3bfdaa2aSSean Callanan eExecutionPolicyOnlyWhenNeeded, 76478a685aaSJim Ingham unwind_on_error, 76578a685aaSJim Ingham keep_in_memory, 7662837b766SJim Ingham fetch_dynamic_value, 76778a685aaSJim Ingham *expr_result); 7681d3afba3SGreg Clayton } 7694838131bSGreg Clayton 770a162ebafSSean Callanan if (expr_log) 77178a685aaSJim Ingham expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", 772fe42ac4dSGreg Clayton expr_result.GetValue(), 773fe42ac4dSGreg Clayton expr_result.GetSummary()); 774a162ebafSSean Callanan 7754838131bSGreg Clayton if (log) 77625f3a3cdSJohnny Chen log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p) (execution result=%d)", m_opaque_sp.get(), 77778a685aaSJim Ingham expr, 77825f3a3cdSJohnny Chen expr_result.get(), 77925f3a3cdSJohnny Chen exe_results); 7804838131bSGreg Clayton 781cfd1acedSGreg Clayton return expr_result; 7821d3afba3SGreg Clayton } 783316d498bSGreg Clayton 784316d498bSGreg Clayton bool 785316d498bSGreg Clayton SBFrame::IsInlined() 786316d498bSGreg Clayton { 787316d498bSGreg Clayton if (m_opaque_sp) 788316d498bSGreg Clayton { 789316d498bSGreg Clayton Block *block = m_opaque_sp->GetSymbolContext(eSymbolContextBlock).block; 790316d498bSGreg Clayton if (block) 791316d498bSGreg Clayton return block->GetContainingInlinedBlock () != NULL; 792316d498bSGreg Clayton } 793316d498bSGreg Clayton return false; 794316d498bSGreg Clayton } 795316d498bSGreg Clayton 796316d498bSGreg Clayton const char * 797316d498bSGreg Clayton SBFrame::GetFunctionName() 798316d498bSGreg Clayton { 799316d498bSGreg Clayton const char *name = NULL; 800316d498bSGreg Clayton if (m_opaque_sp) 801316d498bSGreg Clayton { 802316d498bSGreg Clayton SymbolContext sc (m_opaque_sp->GetSymbolContext(eSymbolContextFunction | eSymbolContextBlock | eSymbolContextSymbol)); 803316d498bSGreg Clayton if (sc.block) 804316d498bSGreg Clayton { 805316d498bSGreg Clayton Block *inlined_block = sc.block->GetContainingInlinedBlock (); 806316d498bSGreg Clayton if (inlined_block) 807316d498bSGreg Clayton { 808316d498bSGreg Clayton const InlineFunctionInfo* inlined_info = inlined_block->GetInlinedFunctionInfo(); 809316d498bSGreg Clayton name = inlined_info->GetName().AsCString(); 810316d498bSGreg Clayton } 811316d498bSGreg Clayton } 812316d498bSGreg Clayton 813316d498bSGreg Clayton if (name == NULL) 814316d498bSGreg Clayton { 815316d498bSGreg Clayton if (sc.function) 816316d498bSGreg Clayton name = sc.function->GetName().GetCString(); 817316d498bSGreg Clayton } 818316d498bSGreg Clayton 819316d498bSGreg Clayton if (name == NULL) 820316d498bSGreg Clayton { 821316d498bSGreg Clayton if (sc.symbol) 822316d498bSGreg Clayton name = sc.symbol->GetName().GetCString(); 823316d498bSGreg Clayton } 824316d498bSGreg Clayton } 825316d498bSGreg Clayton return name; 826316d498bSGreg Clayton } 827316d498bSGreg Clayton 828