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 5130fdc8d8SChris Lattner SBFrame::SBFrame (const lldb::StackFrameSP &lldb_object_sp) : 526611103cSGreg Clayton m_opaque_sp (lldb_object_sp) 5330fdc8d8SChris Lattner { 542d4edfbcSGreg Clayton LogSP log(lldb_private::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 8530fdc8d8SChris Lattner SBFrame::SetFrame (const lldb::StackFrameSP &lldb_object_sp) 8630fdc8d8SChris Lattner { 874838131bSGreg Clayton void *old_ptr = m_opaque_sp.get(); 886611103cSGreg Clayton m_opaque_sp = lldb_object_sp; 892d4edfbcSGreg Clayton LogSP log(lldb_private::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) 1126611103cSGreg Clayton sb_sym_ctx.SetSymbolContext(&m_opaque_sp->GetSymbolContext (resolve_scope)); 113ceb6b139SCaroline Tice 1142d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 115ceb6b139SCaroline Tice if (log) 1164838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)", 117750cd175SCaroline Tice m_opaque_sp.get(), resolve_scope, sb_sym_ctx.get()); 118ceb6b139SCaroline Tice 11930fdc8d8SChris Lattner return sb_sym_ctx; 12030fdc8d8SChris Lattner } 12130fdc8d8SChris Lattner 12230fdc8d8SChris Lattner SBModule 12330fdc8d8SChris Lattner SBFrame::GetModule () const 12430fdc8d8SChris Lattner { 12572eff18aSGreg Clayton SBModule sb_module; 12672eff18aSGreg Clayton if (m_opaque_sp) 12772eff18aSGreg Clayton *sb_module = m_opaque_sp->GetSymbolContext (eSymbolContextModule).module_sp; 12872eff18aSGreg Clayton 1292d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1304838131bSGreg Clayton if (log) 1314838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)", 1324838131bSGreg Clayton m_opaque_sp.get(), sb_module.get()); 1334838131bSGreg Clayton 13430fdc8d8SChris Lattner return sb_module; 13530fdc8d8SChris Lattner } 13630fdc8d8SChris Lattner 13730fdc8d8SChris Lattner SBCompileUnit 13830fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 13930fdc8d8SChris Lattner { 14072eff18aSGreg Clayton SBCompileUnit sb_comp_unit; 14172eff18aSGreg Clayton if (m_opaque_sp) 14272eff18aSGreg Clayton sb_comp_unit.reset (m_opaque_sp->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 1432d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 144ceb6b139SCaroline Tice if (log) 1454838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBCompileUnit(%p)", 1464838131bSGreg Clayton m_opaque_sp.get(), sb_comp_unit.get()); 147ceb6b139SCaroline Tice 14830fdc8d8SChris Lattner return sb_comp_unit; 14930fdc8d8SChris Lattner } 15030fdc8d8SChris Lattner 15130fdc8d8SChris Lattner SBFunction 15230fdc8d8SChris Lattner SBFrame::GetFunction () const 15330fdc8d8SChris Lattner { 15472eff18aSGreg Clayton SBFunction sb_function; 15572eff18aSGreg Clayton if (m_opaque_sp) 15672eff18aSGreg Clayton sb_function.reset(m_opaque_sp->GetSymbolContext (eSymbolContextFunction).function); 1572d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1584838131bSGreg Clayton if (log) 1594838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)", 1604838131bSGreg Clayton m_opaque_sp.get(), sb_function.get()); 1614838131bSGreg Clayton 16230fdc8d8SChris Lattner return sb_function; 16330fdc8d8SChris Lattner } 16430fdc8d8SChris Lattner 1653b06557eSGreg Clayton SBSymbol 1663b06557eSGreg Clayton SBFrame::GetSymbol () const 1673b06557eSGreg Clayton { 16872eff18aSGreg Clayton SBSymbol sb_symbol; 16972eff18aSGreg Clayton if (m_opaque_sp) 17072eff18aSGreg Clayton sb_symbol.reset(m_opaque_sp->GetSymbolContext (eSymbolContextSymbol).symbol); 1712d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1724838131bSGreg Clayton if (log) 1734838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 1744838131bSGreg Clayton m_opaque_sp.get(), sb_symbol.get()); 1753b06557eSGreg Clayton return sb_symbol; 1763b06557eSGreg Clayton } 1773b06557eSGreg Clayton 17830fdc8d8SChris Lattner SBBlock 17930fdc8d8SChris Lattner SBFrame::GetBlock () const 18030fdc8d8SChris Lattner { 18172eff18aSGreg Clayton SBBlock sb_block; 18272eff18aSGreg Clayton if (m_opaque_sp) 18372eff18aSGreg Clayton sb_block.reset (m_opaque_sp->GetSymbolContext (eSymbolContextBlock).block); 1842d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1854838131bSGreg Clayton if (log) 1864838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)", 1874838131bSGreg Clayton m_opaque_sp.get(), sb_block.get()); 18830fdc8d8SChris Lattner return sb_block; 18930fdc8d8SChris Lattner } 19030fdc8d8SChris Lattner 19195897c6aSGreg Clayton SBBlock 19295897c6aSGreg Clayton SBFrame::GetFrameBlock () const 19395897c6aSGreg Clayton { 19472eff18aSGreg Clayton SBBlock sb_block; 19572eff18aSGreg Clayton if (m_opaque_sp) 19672eff18aSGreg Clayton sb_block.reset(m_opaque_sp->GetFrameBlock ()); 1972d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 1984838131bSGreg Clayton if (log) 1994838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 2004838131bSGreg Clayton m_opaque_sp.get(), sb_block.get()); 20195897c6aSGreg Clayton return sb_block; 20295897c6aSGreg Clayton } 20395897c6aSGreg Clayton 20430fdc8d8SChris Lattner SBLineEntry 20530fdc8d8SChris Lattner SBFrame::GetLineEntry () const 20630fdc8d8SChris Lattner { 20772eff18aSGreg Clayton SBLineEntry sb_line_entry; 20872eff18aSGreg Clayton if (m_opaque_sp) 20972eff18aSGreg Clayton sb_line_entry.SetLineEntry (m_opaque_sp->GetSymbolContext (eSymbolContextLineEntry).line_entry); 2102d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2114838131bSGreg Clayton if (log) 2124838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 2134838131bSGreg Clayton m_opaque_sp.get(), sb_line_entry.get()); 21430fdc8d8SChris Lattner return sb_line_entry; 21530fdc8d8SChris Lattner } 21630fdc8d8SChris Lattner 21730fdc8d8SChris Lattner uint32_t 21830fdc8d8SChris Lattner SBFrame::GetFrameID () const 21930fdc8d8SChris Lattner { 2204838131bSGreg Clayton uint32_t frame_idx = m_opaque_sp ? m_opaque_sp->GetFrameIndex () : UINT32_MAX; 2214838131bSGreg Clayton 2222d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2234838131bSGreg Clayton if (log) 2244838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameID () => %u", 2254838131bSGreg Clayton m_opaque_sp.get(), frame_idx); 2264838131bSGreg Clayton return frame_idx; 22730fdc8d8SChris Lattner } 22830fdc8d8SChris Lattner 22930fdc8d8SChris Lattner lldb::addr_t 23030fdc8d8SChris Lattner SBFrame::GetPC () const 23130fdc8d8SChris Lattner { 232ceb6b139SCaroline Tice lldb::addr_t addr = LLDB_INVALID_ADDRESS; 2336611103cSGreg Clayton if (m_opaque_sp) 234ceb6b139SCaroline Tice addr = m_opaque_sp->GetFrameCodeAddress().GetLoadAddress (&m_opaque_sp->GetThread().GetProcess().GetTarget()); 235ceb6b139SCaroline Tice 2362d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 237ceb6b139SCaroline Tice if (log) 238cfd1acedSGreg Clayton log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", m_opaque_sp.get(), addr); 239ceb6b139SCaroline Tice 240ceb6b139SCaroline Tice return addr; 24130fdc8d8SChris Lattner } 24230fdc8d8SChris Lattner 24330fdc8d8SChris Lattner bool 24430fdc8d8SChris Lattner SBFrame::SetPC (lldb::addr_t new_pc) 24530fdc8d8SChris Lattner { 246ceb6b139SCaroline Tice bool ret_val = false; 2476611103cSGreg Clayton if (m_opaque_sp) 248ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetRegisterContext()->SetPC (new_pc); 249ceb6b139SCaroline Tice 2502d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 251ceb6b139SCaroline Tice if (log) 2524838131bSGreg Clayton log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i", 2534838131bSGreg Clayton m_opaque_sp.get(), new_pc, ret_val); 254ceb6b139SCaroline Tice 255ceb6b139SCaroline Tice return ret_val; 25630fdc8d8SChris Lattner } 25730fdc8d8SChris Lattner 25830fdc8d8SChris Lattner lldb::addr_t 25930fdc8d8SChris Lattner SBFrame::GetSP () const 26030fdc8d8SChris Lattner { 2614838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 2626611103cSGreg Clayton if (m_opaque_sp) 2634838131bSGreg Clayton addr = m_opaque_sp->GetRegisterContext()->GetSP(); 2642d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2654838131bSGreg Clayton if (log) 266cfd1acedSGreg Clayton log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", m_opaque_sp.get(), addr); 2674838131bSGreg Clayton 2684838131bSGreg Clayton return addr; 26930fdc8d8SChris Lattner } 27030fdc8d8SChris Lattner 27130fdc8d8SChris Lattner 27230fdc8d8SChris Lattner lldb::addr_t 27330fdc8d8SChris Lattner SBFrame::GetFP () const 27430fdc8d8SChris Lattner { 275ceb6b139SCaroline Tice lldb::addr_t addr = LLDB_INVALID_ADDRESS; 2766611103cSGreg Clayton if (m_opaque_sp) 277ceb6b139SCaroline Tice addr = m_opaque_sp->GetRegisterContext()->GetFP(); 278ceb6b139SCaroline Tice 2792d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 280ceb6b139SCaroline Tice if (log) 281cfd1acedSGreg Clayton log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", m_opaque_sp.get(), addr); 282ceb6b139SCaroline Tice return addr; 28330fdc8d8SChris Lattner } 28430fdc8d8SChris Lattner 28530fdc8d8SChris Lattner 28630fdc8d8SChris Lattner SBAddress 28730fdc8d8SChris Lattner SBFrame::GetPCAddress () const 28830fdc8d8SChris Lattner { 28930fdc8d8SChris Lattner SBAddress sb_addr; 2906611103cSGreg Clayton if (m_opaque_sp) 2919da7bd07SGreg Clayton sb_addr.SetAddress (&m_opaque_sp->GetFrameCodeAddress()); 2922d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 2934838131bSGreg Clayton if (log) 2944838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", m_opaque_sp.get(), sb_addr.get()); 29530fdc8d8SChris Lattner return sb_addr; 29630fdc8d8SChris Lattner } 29730fdc8d8SChris Lattner 29830fdc8d8SChris Lattner void 29930fdc8d8SChris Lattner SBFrame::Clear() 30030fdc8d8SChris Lattner { 3016611103cSGreg Clayton m_opaque_sp.reset(); 30230fdc8d8SChris Lattner } 30330fdc8d8SChris Lattner 30430fdc8d8SChris Lattner SBValue 30530fdc8d8SChris Lattner SBFrame::LookupVar (const char *var_name) 30630fdc8d8SChris Lattner { 30730fdc8d8SChris Lattner lldb::VariableSP var_sp; 30872eff18aSGreg Clayton if (m_opaque_sp && var_name && var_name[0]) 30930fdc8d8SChris Lattner { 31030fdc8d8SChris Lattner lldb_private::VariableList variable_list; 31130fdc8d8SChris Lattner 31272eff18aSGreg Clayton SymbolContext sc (m_opaque_sp->GetSymbolContext (eSymbolContextBlock)); 31330fdc8d8SChris Lattner 31472eff18aSGreg Clayton if (sc.block) 31530fdc8d8SChris Lattner { 31672eff18aSGreg Clayton const bool can_create = true; 31772eff18aSGreg Clayton const bool get_parent_variables = true; 31872eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 31972eff18aSGreg Clayton 32072eff18aSGreg Clayton if (sc.block->AppendVariables (can_create, 32172eff18aSGreg Clayton get_parent_variables, 32272eff18aSGreg Clayton stop_if_block_is_inlined_function, 32372eff18aSGreg Clayton &variable_list)) 32472eff18aSGreg Clayton { 32572eff18aSGreg Clayton var_sp = variable_list.FindVariable (lldb_private::ConstString(var_name)); 32630fdc8d8SChris Lattner } 32772eff18aSGreg Clayton } 32830fdc8d8SChris Lattner } 32930fdc8d8SChris Lattner 330dde9cff3SCaroline Tice SBValue sb_value; 3314838131bSGreg Clayton 3324838131bSGreg Clayton if (var_sp) 3334838131bSGreg Clayton *sb_value = ValueObjectSP (new ValueObjectVariable (var_sp)); 3344838131bSGreg Clayton 3352d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3364838131bSGreg Clayton if (log) 3374838131bSGreg Clayton log->Printf ("SBFrame(%p)::LookupVar (name=\"%s\") => SBValue(%p)", 3384838131bSGreg Clayton m_opaque_sp.get(), var_name, sb_value.get()); 3394838131bSGreg Clayton 340dde9cff3SCaroline Tice return sb_value; 341dde9cff3SCaroline Tice } 342dde9cff3SCaroline Tice 34330fdc8d8SChris Lattner SBValue 34430fdc8d8SChris Lattner SBFrame::LookupVarInScope (const char *var_name, const char *scope) 34530fdc8d8SChris Lattner { 34630fdc8d8SChris Lattner lldb::VariableSP var_sp; 34772eff18aSGreg Clayton if (m_opaque_sp && var_name && var_name[0] && scope && scope[0]) 34830fdc8d8SChris Lattner { 34930fdc8d8SChris Lattner std::string scope_str = scope; 35030fdc8d8SChris Lattner lldb::ValueType var_scope = eValueTypeInvalid; 35130fdc8d8SChris Lattner // Convert scope_str to be all lowercase; 35230fdc8d8SChris Lattner std::transform (scope_str.begin(), scope_str.end(), scope_str.begin(), ::tolower); 35330fdc8d8SChris Lattner 35430fdc8d8SChris Lattner if (scope_str.compare ("global") == 0) 35530fdc8d8SChris Lattner var_scope = eValueTypeVariableGlobal; 35630fdc8d8SChris Lattner else if (scope_str.compare ("local") == 0) 35730fdc8d8SChris Lattner var_scope = eValueTypeVariableLocal; 35830fdc8d8SChris Lattner else if (scope_str.compare ("parameter") == 0) 35930fdc8d8SChris Lattner var_scope = eValueTypeVariableArgument; 36030fdc8d8SChris Lattner 36130fdc8d8SChris Lattner if (var_scope != eValueTypeInvalid) 36230fdc8d8SChris Lattner { 363*e85d9cb8SJohnny Chen lldb_private::VariableList *variable_list = m_opaque_sp->GetVariableList(true); 36472eff18aSGreg Clayton 36572eff18aSGreg Clayton SymbolContext sc (m_opaque_sp->GetSymbolContext (eSymbolContextBlock)); 36672eff18aSGreg Clayton 36772eff18aSGreg Clayton const bool can_create = true; 36872eff18aSGreg Clayton const bool get_parent_variables = true; 36972eff18aSGreg Clayton const bool stop_if_block_is_inlined_function = true; 37072eff18aSGreg Clayton 37172eff18aSGreg Clayton if (sc.block && sc.block->AppendVariables (can_create, 37272eff18aSGreg Clayton get_parent_variables, 37372eff18aSGreg Clayton stop_if_block_is_inlined_function, 374*e85d9cb8SJohnny Chen variable_list)) 375beae523aSJohnny Chen { 37672eff18aSGreg Clayton lldb_private::ConstString const_var_name(var_name); 377*e85d9cb8SJohnny Chen const uint32_t num_variables = variable_list->GetSize(); 37872eff18aSGreg Clayton for (uint32_t i = 0; i < num_variables; ++i) 37930fdc8d8SChris Lattner { 380*e85d9cb8SJohnny Chen lldb::VariableSP curr_var_sp (variable_list->GetVariableAtIndex(i)); 38172eff18aSGreg Clayton if (curr_var_sp && curr_var_sp->GetScope() == var_scope && 38272eff18aSGreg Clayton curr_var_sp->GetName() == const_var_name) 383beae523aSJohnny Chen { 38472eff18aSGreg Clayton var_sp = curr_var_sp; 385beae523aSJohnny Chen break; 386beae523aSJohnny Chen } 38730fdc8d8SChris Lattner } 38830fdc8d8SChris Lattner } 38930fdc8d8SChris Lattner } 390beae523aSJohnny Chen } 391dde9cff3SCaroline Tice 392dde9cff3SCaroline Tice SBValue sb_value; 3934838131bSGreg Clayton if (var_sp) 3944838131bSGreg Clayton *sb_value = ValueObjectSP (new ValueObjectVariable (var_sp)); 3954838131bSGreg Clayton 3962d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 3974838131bSGreg Clayton if (log) 3984838131bSGreg Clayton log->Printf ("SBFrame(%p)::LookupVarInScope (name=\"%s\", scope=%s) => SBValue(%p)", 3994838131bSGreg Clayton m_opaque_sp.get(), var_name, scope, sb_value.get()); 4004838131bSGreg Clayton 4014838131bSGreg Clayton 402dde9cff3SCaroline Tice return sb_value; 403dde9cff3SCaroline Tice } 404dde9cff3SCaroline Tice 40530fdc8d8SChris Lattner bool 40630fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 40730fdc8d8SChris Lattner { 4086611103cSGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 40930fdc8d8SChris Lattner } 41030fdc8d8SChris Lattner 41130fdc8d8SChris Lattner bool 41230fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 41330fdc8d8SChris Lattner { 4146611103cSGreg Clayton return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 41530fdc8d8SChris Lattner } 41630fdc8d8SChris Lattner 41730fdc8d8SChris Lattner lldb_private::StackFrame * 41830fdc8d8SChris Lattner SBFrame::operator->() const 41930fdc8d8SChris Lattner { 4206611103cSGreg Clayton return m_opaque_sp.get(); 42130fdc8d8SChris Lattner } 42230fdc8d8SChris Lattner 42330fdc8d8SChris Lattner lldb_private::StackFrame * 42430fdc8d8SChris Lattner SBFrame::get() const 42530fdc8d8SChris Lattner { 4266611103cSGreg Clayton return m_opaque_sp.get(); 42730fdc8d8SChris Lattner } 42830fdc8d8SChris Lattner 42930fdc8d8SChris Lattner 43030fdc8d8SChris Lattner SBThread 43130fdc8d8SChris Lattner SBFrame::GetThread () const 43230fdc8d8SChris Lattner { 4332d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 434ceb6b139SCaroline Tice 43572eff18aSGreg Clayton SBThread sb_thread; 43672eff18aSGreg Clayton if (m_opaque_sp) 43772eff18aSGreg Clayton sb_thread.SetThread (m_opaque_sp->GetThread().GetSP()); 438ceb6b139SCaroline Tice 439ceb6b139SCaroline Tice if (log) 440750cd175SCaroline Tice { 441750cd175SCaroline Tice SBStream sstr; 442750cd175SCaroline Tice sb_thread.GetDescription (sstr); 4434838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", m_opaque_sp.get(), 4444838131bSGreg Clayton sb_thread.get(), sstr.GetData()); 445750cd175SCaroline Tice } 446ceb6b139SCaroline Tice 44730fdc8d8SChris Lattner return sb_thread; 44830fdc8d8SChris Lattner } 44930fdc8d8SChris Lattner 45030fdc8d8SChris Lattner const char * 45130fdc8d8SChris Lattner SBFrame::Disassemble () const 45230fdc8d8SChris Lattner { 4534838131bSGreg Clayton const char *disassembly = NULL; 4546611103cSGreg Clayton if (m_opaque_sp) 4554838131bSGreg Clayton disassembly = m_opaque_sp->Disassemble(); 4562d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 4574838131bSGreg Clayton 4584838131bSGreg Clayton if (log) 4594838131bSGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => %s", m_opaque_sp.get(), disassembly); 4604838131bSGreg Clayton 4614838131bSGreg Clayton return disassembly; 46230fdc8d8SChris Lattner } 46330fdc8d8SChris Lattner 46430fdc8d8SChris Lattner 46530fdc8d8SChris Lattner SBValueList 46630fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 46730fdc8d8SChris Lattner bool locals, 46830fdc8d8SChris Lattner bool statics, 46930fdc8d8SChris Lattner bool in_scope_only) 47030fdc8d8SChris Lattner { 4712d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 472ceb6b139SCaroline Tice 473ceb6b139SCaroline Tice if (log) 4744838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 475750cd175SCaroline Tice m_opaque_sp.get(), 4764838131bSGreg Clayton arguments, 4774838131bSGreg Clayton locals, 4784838131bSGreg Clayton statics, 4794838131bSGreg Clayton in_scope_only); 480ceb6b139SCaroline Tice 48130fdc8d8SChris Lattner SBValueList value_list; 4826611103cSGreg Clayton if (m_opaque_sp) 48330fdc8d8SChris Lattner { 48430fdc8d8SChris Lattner size_t i; 485288bdf9cSGreg Clayton VariableList *variable_list = m_opaque_sp->GetVariableList(true); 48630fdc8d8SChris Lattner if (variable_list) 48730fdc8d8SChris Lattner { 48830fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 48930fdc8d8SChris Lattner if (num_variables) 49030fdc8d8SChris Lattner { 49130fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 49230fdc8d8SChris Lattner { 49330fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 49430fdc8d8SChris Lattner if (variable_sp) 49530fdc8d8SChris Lattner { 49630fdc8d8SChris Lattner bool add_variable = false; 49730fdc8d8SChris Lattner switch (variable_sp->GetScope()) 49830fdc8d8SChris Lattner { 49930fdc8d8SChris Lattner case eValueTypeVariableGlobal: 50030fdc8d8SChris Lattner case eValueTypeVariableStatic: 50130fdc8d8SChris Lattner add_variable = statics; 50230fdc8d8SChris Lattner break; 50330fdc8d8SChris Lattner 50430fdc8d8SChris Lattner case eValueTypeVariableArgument: 50530fdc8d8SChris Lattner add_variable = arguments; 50630fdc8d8SChris Lattner break; 50730fdc8d8SChris Lattner 50830fdc8d8SChris Lattner case eValueTypeVariableLocal: 50930fdc8d8SChris Lattner add_variable = locals; 51030fdc8d8SChris Lattner break; 511c982c768SGreg Clayton 512c982c768SGreg Clayton default: 513c982c768SGreg Clayton break; 51430fdc8d8SChris Lattner } 51530fdc8d8SChris Lattner if (add_variable) 51630fdc8d8SChris Lattner { 5176611103cSGreg Clayton if (in_scope_only && !variable_sp->IsInScope(m_opaque_sp.get())) 51830fdc8d8SChris Lattner continue; 51930fdc8d8SChris Lattner 520288bdf9cSGreg Clayton value_list.Append(m_opaque_sp->GetValueObjectForFrameVariable (variable_sp)); 52130fdc8d8SChris Lattner } 52230fdc8d8SChris Lattner } 52330fdc8d8SChris Lattner } 52430fdc8d8SChris Lattner } 52530fdc8d8SChris Lattner } 52630fdc8d8SChris Lattner } 527ceb6b139SCaroline Tice 528ceb6b139SCaroline Tice if (log) 529ceb6b139SCaroline Tice { 5304838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", m_opaque_sp.get(), 531750cd175SCaroline Tice value_list.get()); 532ceb6b139SCaroline Tice } 533ceb6b139SCaroline Tice 53430fdc8d8SChris Lattner return value_list; 53530fdc8d8SChris Lattner } 53630fdc8d8SChris Lattner 53730fdc8d8SChris Lattner lldb::SBValueList 53830fdc8d8SChris Lattner SBFrame::GetRegisters () 53930fdc8d8SChris Lattner { 5402d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 541ceb6b139SCaroline Tice 54230fdc8d8SChris Lattner SBValueList value_list; 5436611103cSGreg Clayton if (m_opaque_sp) 54430fdc8d8SChris Lattner { 5456611103cSGreg Clayton RegisterContext *reg_ctx = m_opaque_sp->GetRegisterContext(); 54630fdc8d8SChris Lattner if (reg_ctx) 54730fdc8d8SChris Lattner { 54830fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 54930fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 55030fdc8d8SChris Lattner { 5518f92f0a3SGreg Clayton value_list.Append(ValueObjectSP (new ValueObjectRegisterSet (NULL, reg_ctx, set_idx))); 55230fdc8d8SChris Lattner } 55330fdc8d8SChris Lattner } 55430fdc8d8SChris Lattner } 555ceb6b139SCaroline Tice 556ceb6b139SCaroline Tice if (log) 5574838131bSGreg Clayton log->Printf ("SBFrame(%p)::Registers () => SBValueList(%p)", m_opaque_sp.get(), value_list.get()); 558ceb6b139SCaroline Tice 55930fdc8d8SChris Lattner return value_list; 56030fdc8d8SChris Lattner } 56130fdc8d8SChris Lattner 562dde9cff3SCaroline Tice bool 563dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 564dde9cff3SCaroline Tice { 565dde9cff3SCaroline Tice if (m_opaque_sp) 566dde9cff3SCaroline Tice { 567cfd1acedSGreg Clayton Stream &s = description.ref(); 568cfd1acedSGreg Clayton m_opaque_sp->DumpUsingSettingsFormat (&s); 569dde9cff3SCaroline Tice } 570dde9cff3SCaroline Tice else 571dde9cff3SCaroline Tice description.Printf ("No value"); 572dde9cff3SCaroline Tice 573dde9cff3SCaroline Tice return true; 574dde9cff3SCaroline Tice } 5751d3afba3SGreg Clayton 5761d3afba3SGreg Clayton lldb::SBValue 5771d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 5781d3afba3SGreg Clayton { 5792d4edfbcSGreg Clayton LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 5804838131bSGreg Clayton 581a162ebafSSean Callanan LogSP expr_log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); 582a162ebafSSean Callanan 583cfd1acedSGreg Clayton lldb::SBValue expr_result; 5844838131bSGreg Clayton if (log) 5854838131bSGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", m_opaque_sp.get(), expr); 5864838131bSGreg Clayton 5871d3afba3SGreg Clayton if (m_opaque_sp) 5881d3afba3SGreg Clayton { 5898b2fe6dcSGreg Clayton lldb::ExecutionResults exe_results; 5908b2fe6dcSGreg Clayton const bool unwind_on_error = true; 591322f529bSSean Callanan 5928b2fe6dcSGreg Clayton exe_results = m_opaque_sp->GetThread().GetProcess().GetTarget().EvaluateExpression(expr, m_opaque_sp.get(), unwind_on_error, *expr_result); 5931d3afba3SGreg Clayton } 5944838131bSGreg Clayton 595a162ebafSSean Callanan if (expr_log) 596a162ebafSSean Callanan expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", expr_result.GetValue(*this), expr_result.GetSummary(*this)); 597a162ebafSSean Callanan 5984838131bSGreg Clayton if (log) 599cfd1acedSGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p)", m_opaque_sp.get(), expr, expr_result.get()); 6004838131bSGreg Clayton 601cfd1acedSGreg Clayton return expr_result; 6021d3afba3SGreg Clayton } 603