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 { 54750cd175SCaroline Tice Log *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 6630fdc8d8SChris Lattner SBFrame::~SBFrame() 6730fdc8d8SChris Lattner { 6830fdc8d8SChris Lattner } 6930fdc8d8SChris Lattner 7030fdc8d8SChris Lattner 7130fdc8d8SChris Lattner void 7230fdc8d8SChris Lattner SBFrame::SetFrame (const lldb::StackFrameSP &lldb_object_sp) 7330fdc8d8SChris Lattner { 744838131bSGreg Clayton void *old_ptr = m_opaque_sp.get(); 756611103cSGreg Clayton m_opaque_sp = lldb_object_sp; 764838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 774838131bSGreg Clayton 784838131bSGreg Clayton if (log) 794838131bSGreg Clayton { 804838131bSGreg Clayton log->Printf ("SBFrame(%p)::SetFrame(sp=%p) := SBFrame(%p)", 814838131bSGreg Clayton old_ptr, lldb_object_sp.get(), m_opaque_sp.get()); 824838131bSGreg Clayton } 834838131bSGreg Clayton 8430fdc8d8SChris Lattner } 8530fdc8d8SChris Lattner 8630fdc8d8SChris Lattner 8730fdc8d8SChris Lattner bool 8830fdc8d8SChris Lattner SBFrame::IsValid() const 8930fdc8d8SChris Lattner { 906611103cSGreg Clayton return (m_opaque_sp.get() != NULL); 9130fdc8d8SChris Lattner } 9230fdc8d8SChris Lattner 9330fdc8d8SChris Lattner SBSymbolContext 9430fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const 9530fdc8d8SChris Lattner { 96ceb6b139SCaroline Tice 9730fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 986611103cSGreg Clayton if (m_opaque_sp) 996611103cSGreg Clayton sb_sym_ctx.SetSymbolContext(&m_opaque_sp->GetSymbolContext (resolve_scope)); 100ceb6b139SCaroline Tice 1014838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 102ceb6b139SCaroline Tice if (log) 1034838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbolContext (resolve_scope=0x%8.8x) => SBSymbolContext(%p)", 104750cd175SCaroline Tice m_opaque_sp.get(), resolve_scope, sb_sym_ctx.get()); 105ceb6b139SCaroline Tice 10630fdc8d8SChris Lattner return sb_sym_ctx; 10730fdc8d8SChris Lattner } 10830fdc8d8SChris Lattner 10930fdc8d8SChris Lattner SBModule 11030fdc8d8SChris Lattner SBFrame::GetModule () const 11130fdc8d8SChris Lattner { 1126611103cSGreg Clayton SBModule sb_module (m_opaque_sp->GetSymbolContext (eSymbolContextModule).module_sp); 1134838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 1144838131bSGreg Clayton if (log) 1154838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)", 1164838131bSGreg Clayton m_opaque_sp.get(), sb_module.get()); 1174838131bSGreg Clayton 11830fdc8d8SChris Lattner return sb_module; 11930fdc8d8SChris Lattner } 12030fdc8d8SChris Lattner 12130fdc8d8SChris Lattner SBCompileUnit 12230fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 12330fdc8d8SChris Lattner { 1246611103cSGreg Clayton SBCompileUnit sb_comp_unit(m_opaque_sp->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 125ceb6b139SCaroline Tice 1264838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 127ceb6b139SCaroline Tice if (log) 1284838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetModule () => SBCompileUnit(%p)", 1294838131bSGreg Clayton m_opaque_sp.get(), sb_comp_unit.get()); 130ceb6b139SCaroline Tice 13130fdc8d8SChris Lattner return sb_comp_unit; 13230fdc8d8SChris Lattner } 13330fdc8d8SChris Lattner 13430fdc8d8SChris Lattner SBFunction 13530fdc8d8SChris Lattner SBFrame::GetFunction () const 13630fdc8d8SChris Lattner { 1376611103cSGreg Clayton SBFunction sb_function(m_opaque_sp->GetSymbolContext (eSymbolContextFunction).function); 1384838131bSGreg Clayton 1394838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 1404838131bSGreg Clayton if (log) 1414838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)", 1424838131bSGreg Clayton m_opaque_sp.get(), sb_function.get()); 1434838131bSGreg Clayton 14430fdc8d8SChris Lattner return sb_function; 14530fdc8d8SChris Lattner } 14630fdc8d8SChris Lattner 1473b06557eSGreg Clayton SBSymbol 1483b06557eSGreg Clayton SBFrame::GetSymbol () const 1493b06557eSGreg Clayton { 1503b06557eSGreg Clayton SBSymbol sb_symbol(m_opaque_sp->GetSymbolContext (eSymbolContextSymbol).symbol); 1514838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 1524838131bSGreg Clayton if (log) 1534838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)", 1544838131bSGreg Clayton m_opaque_sp.get(), sb_symbol.get()); 1553b06557eSGreg Clayton return sb_symbol; 1563b06557eSGreg Clayton } 1573b06557eSGreg Clayton 15830fdc8d8SChris Lattner SBBlock 15930fdc8d8SChris Lattner SBFrame::GetBlock () const 16030fdc8d8SChris Lattner { 1616611103cSGreg Clayton SBBlock sb_block(m_opaque_sp->GetSymbolContext (eSymbolContextBlock).block); 1624838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 1634838131bSGreg Clayton if (log) 1644838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)", 1654838131bSGreg Clayton m_opaque_sp.get(), sb_block.get()); 16630fdc8d8SChris Lattner return sb_block; 16730fdc8d8SChris Lattner } 16830fdc8d8SChris Lattner 16995897c6aSGreg Clayton SBBlock 17095897c6aSGreg Clayton SBFrame::GetFrameBlock () const 17195897c6aSGreg Clayton { 17295897c6aSGreg Clayton SBBlock sb_block(m_opaque_sp->GetFrameBlock ()); 1734838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 1744838131bSGreg Clayton if (log) 1754838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)", 1764838131bSGreg Clayton m_opaque_sp.get(), sb_block.get()); 17795897c6aSGreg Clayton return sb_block; 17895897c6aSGreg Clayton } 17995897c6aSGreg Clayton 18030fdc8d8SChris Lattner SBLineEntry 18130fdc8d8SChris Lattner SBFrame::GetLineEntry () const 18230fdc8d8SChris Lattner { 1836611103cSGreg Clayton SBLineEntry sb_line_entry(&m_opaque_sp->GetSymbolContext (eSymbolContextLineEntry).line_entry); 1844838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 1854838131bSGreg Clayton if (log) 1864838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)", 1874838131bSGreg Clayton m_opaque_sp.get(), sb_line_entry.get()); 18830fdc8d8SChris Lattner return sb_line_entry; 18930fdc8d8SChris Lattner } 19030fdc8d8SChris Lattner 19130fdc8d8SChris Lattner uint32_t 19230fdc8d8SChris Lattner SBFrame::GetFrameID () const 19330fdc8d8SChris Lattner { 1944838131bSGreg Clayton uint32_t frame_idx = m_opaque_sp ? m_opaque_sp->GetFrameIndex () : UINT32_MAX; 1954838131bSGreg Clayton 1964838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 1974838131bSGreg Clayton if (log) 1984838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetFrameID () => %u", 1994838131bSGreg Clayton m_opaque_sp.get(), frame_idx); 2004838131bSGreg Clayton return frame_idx; 20130fdc8d8SChris Lattner } 20230fdc8d8SChris Lattner 20330fdc8d8SChris Lattner lldb::addr_t 20430fdc8d8SChris Lattner SBFrame::GetPC () const 20530fdc8d8SChris Lattner { 206ceb6b139SCaroline Tice 207ceb6b139SCaroline Tice lldb::addr_t addr = LLDB_INVALID_ADDRESS; 2086611103cSGreg Clayton if (m_opaque_sp) 209ceb6b139SCaroline Tice addr = m_opaque_sp->GetFrameCodeAddress().GetLoadAddress (&m_opaque_sp->GetThread().GetProcess().GetTarget()); 210ceb6b139SCaroline Tice 2114838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 212ceb6b139SCaroline Tice if (log) 213*cfd1acedSGreg Clayton log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", m_opaque_sp.get(), addr); 214ceb6b139SCaroline Tice 215ceb6b139SCaroline Tice return addr; 21630fdc8d8SChris Lattner } 21730fdc8d8SChris Lattner 21830fdc8d8SChris Lattner bool 21930fdc8d8SChris Lattner SBFrame::SetPC (lldb::addr_t new_pc) 22030fdc8d8SChris Lattner { 221ceb6b139SCaroline Tice 222ceb6b139SCaroline Tice bool ret_val = false; 2236611103cSGreg Clayton if (m_opaque_sp) 224ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetRegisterContext()->SetPC (new_pc); 225ceb6b139SCaroline Tice 2264838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 227ceb6b139SCaroline Tice if (log) 2284838131bSGreg Clayton log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i", 2294838131bSGreg Clayton m_opaque_sp.get(), new_pc, ret_val); 230ceb6b139SCaroline Tice 231ceb6b139SCaroline Tice return ret_val; 23230fdc8d8SChris Lattner } 23330fdc8d8SChris Lattner 23430fdc8d8SChris Lattner lldb::addr_t 23530fdc8d8SChris Lattner SBFrame::GetSP () const 23630fdc8d8SChris Lattner { 2374838131bSGreg Clayton addr_t addr = LLDB_INVALID_ADDRESS; 2386611103cSGreg Clayton if (m_opaque_sp) 2394838131bSGreg Clayton addr = m_opaque_sp->GetRegisterContext()->GetSP(); 2404838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 2414838131bSGreg Clayton if (log) 242*cfd1acedSGreg Clayton log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", m_opaque_sp.get(), addr); 2434838131bSGreg Clayton 2444838131bSGreg Clayton return addr; 24530fdc8d8SChris Lattner } 24630fdc8d8SChris Lattner 24730fdc8d8SChris Lattner 24830fdc8d8SChris Lattner lldb::addr_t 24930fdc8d8SChris Lattner SBFrame::GetFP () const 25030fdc8d8SChris Lattner { 251ceb6b139SCaroline Tice lldb::addr_t addr = LLDB_INVALID_ADDRESS; 2526611103cSGreg Clayton if (m_opaque_sp) 253ceb6b139SCaroline Tice addr = m_opaque_sp->GetRegisterContext()->GetFP(); 254ceb6b139SCaroline Tice 2554838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 256ceb6b139SCaroline Tice if (log) 257*cfd1acedSGreg Clayton log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", m_opaque_sp.get(), addr); 258ceb6b139SCaroline Tice return addr; 25930fdc8d8SChris Lattner } 26030fdc8d8SChris Lattner 26130fdc8d8SChris Lattner 26230fdc8d8SChris Lattner SBAddress 26330fdc8d8SChris Lattner SBFrame::GetPCAddress () const 26430fdc8d8SChris Lattner { 26530fdc8d8SChris Lattner SBAddress sb_addr; 2666611103cSGreg Clayton if (m_opaque_sp) 2679da7bd07SGreg Clayton sb_addr.SetAddress (&m_opaque_sp->GetFrameCodeAddress()); 2684838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 2694838131bSGreg Clayton if (log) 2704838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", m_opaque_sp.get(), sb_addr.get()); 27130fdc8d8SChris Lattner return sb_addr; 27230fdc8d8SChris Lattner } 27330fdc8d8SChris Lattner 27430fdc8d8SChris Lattner void 27530fdc8d8SChris Lattner SBFrame::Clear() 27630fdc8d8SChris Lattner { 2776611103cSGreg Clayton m_opaque_sp.reset(); 27830fdc8d8SChris Lattner } 27930fdc8d8SChris Lattner 28030fdc8d8SChris Lattner SBValue 28130fdc8d8SChris Lattner SBFrame::LookupVar (const char *var_name) 28230fdc8d8SChris Lattner { 28330fdc8d8SChris Lattner lldb::VariableSP var_sp; 28430fdc8d8SChris Lattner if (IsValid ()) 28530fdc8d8SChris Lattner { 28630fdc8d8SChris Lattner lldb_private::VariableList variable_list; 28730fdc8d8SChris Lattner SBSymbolContext sc = GetSymbolContext (eSymbolContextEverything); 28830fdc8d8SChris Lattner 28930fdc8d8SChris Lattner SBBlock block = sc.GetBlock(); 29030fdc8d8SChris Lattner if (block.IsValid()) 29130fdc8d8SChris Lattner block.AppendVariables (true, true, &variable_list); 29230fdc8d8SChris Lattner 29330fdc8d8SChris Lattner const uint32_t num_variables = variable_list.GetSize(); 29430fdc8d8SChris Lattner 29530fdc8d8SChris Lattner bool found = false; 296c982c768SGreg Clayton for (uint32_t i = 0; i < num_variables && !found; ++i) 29730fdc8d8SChris Lattner { 29830fdc8d8SChris Lattner var_sp = variable_list.GetVariableAtIndex(i); 29930fdc8d8SChris Lattner if (var_sp 30030fdc8d8SChris Lattner && (var_sp.get()->GetName() == lldb_private::ConstString(var_name))) 30130fdc8d8SChris Lattner found = true; 30230fdc8d8SChris Lattner } 30330fdc8d8SChris Lattner if (!found) 30430fdc8d8SChris Lattner var_sp.reset(); 30530fdc8d8SChris Lattner } 30630fdc8d8SChris Lattner 307dde9cff3SCaroline Tice SBValue sb_value; 3084838131bSGreg Clayton 3094838131bSGreg Clayton if (var_sp) 3104838131bSGreg Clayton *sb_value = ValueObjectSP (new ValueObjectVariable (var_sp)); 3114838131bSGreg Clayton 3124838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 3134838131bSGreg Clayton if (log) 3144838131bSGreg Clayton log->Printf ("SBFrame(%p)::LookupVar (name=\"%s\") => SBValue(%p)", 3154838131bSGreg Clayton m_opaque_sp.get(), var_name, sb_value.get()); 3164838131bSGreg Clayton 317dde9cff3SCaroline Tice return sb_value; 318dde9cff3SCaroline Tice } 319dde9cff3SCaroline Tice 32030fdc8d8SChris Lattner SBValue 32130fdc8d8SChris Lattner SBFrame::LookupVarInScope (const char *var_name, const char *scope) 32230fdc8d8SChris Lattner { 32330fdc8d8SChris Lattner lldb::VariableSP var_sp; 32430fdc8d8SChris Lattner if (IsValid()) 32530fdc8d8SChris Lattner { 32630fdc8d8SChris Lattner std::string scope_str = scope; 32730fdc8d8SChris Lattner lldb::ValueType var_scope = eValueTypeInvalid; 32830fdc8d8SChris Lattner // Convert scope_str to be all lowercase; 32930fdc8d8SChris Lattner std::transform (scope_str.begin(), scope_str.end(), scope_str.begin(), ::tolower); 33030fdc8d8SChris Lattner 33130fdc8d8SChris Lattner if (scope_str.compare ("global") == 0) 33230fdc8d8SChris Lattner var_scope = eValueTypeVariableGlobal; 33330fdc8d8SChris Lattner else if (scope_str.compare ("local") == 0) 33430fdc8d8SChris Lattner var_scope = eValueTypeVariableLocal; 33530fdc8d8SChris Lattner else if (scope_str.compare ("parameter") == 0) 33630fdc8d8SChris Lattner var_scope = eValueTypeVariableArgument; 33730fdc8d8SChris Lattner 33830fdc8d8SChris Lattner if (var_scope != eValueTypeInvalid) 33930fdc8d8SChris Lattner { 34030fdc8d8SChris Lattner lldb_private::VariableList variable_list; 34130fdc8d8SChris Lattner SBSymbolContext sc = GetSymbolContext (eSymbolContextEverything); 34230fdc8d8SChris Lattner 34330fdc8d8SChris Lattner SBBlock block = sc.GetBlock(); 34430fdc8d8SChris Lattner if (block.IsValid()) 34530fdc8d8SChris Lattner block.AppendVariables (true, true, &variable_list); 34630fdc8d8SChris Lattner 34730fdc8d8SChris Lattner const uint32_t num_variables = variable_list.GetSize(); 34830fdc8d8SChris Lattner 34930fdc8d8SChris Lattner bool found = false; 350c982c768SGreg Clayton for (uint32_t i = 0; i < num_variables && !found; ++i) 35130fdc8d8SChris Lattner { 35230fdc8d8SChris Lattner var_sp = variable_list.GetVariableAtIndex(i); 35330fdc8d8SChris Lattner if (var_sp 35430fdc8d8SChris Lattner && (var_sp.get()->GetName() == lldb_private::ConstString(var_name)) 35530fdc8d8SChris Lattner && var_sp.get()->GetScope() == var_scope) 35630fdc8d8SChris Lattner found = true; 35730fdc8d8SChris Lattner } 35830fdc8d8SChris Lattner if (!found) 35930fdc8d8SChris Lattner var_sp.reset(); 36030fdc8d8SChris Lattner } 36130fdc8d8SChris Lattner } 362dde9cff3SCaroline Tice 363dde9cff3SCaroline Tice SBValue sb_value; 3644838131bSGreg Clayton if (var_sp) 3654838131bSGreg Clayton *sb_value = ValueObjectSP (new ValueObjectVariable (var_sp)); 3664838131bSGreg Clayton 3674838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 3684838131bSGreg Clayton if (log) 3694838131bSGreg Clayton log->Printf ("SBFrame(%p)::LookupVarInScope (name=\"%s\", scope=%s) => SBValue(%p)", 3704838131bSGreg Clayton m_opaque_sp.get(), var_name, scope, sb_value.get()); 3714838131bSGreg Clayton 3724838131bSGreg Clayton 373dde9cff3SCaroline Tice return sb_value; 374dde9cff3SCaroline Tice } 375dde9cff3SCaroline Tice 37630fdc8d8SChris Lattner bool 37730fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 37830fdc8d8SChris Lattner { 3796611103cSGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 38030fdc8d8SChris Lattner } 38130fdc8d8SChris Lattner 38230fdc8d8SChris Lattner bool 38330fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 38430fdc8d8SChris Lattner { 3856611103cSGreg Clayton return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 38630fdc8d8SChris Lattner } 38730fdc8d8SChris Lattner 38830fdc8d8SChris Lattner lldb_private::StackFrame * 38930fdc8d8SChris Lattner SBFrame::operator->() const 39030fdc8d8SChris Lattner { 3916611103cSGreg Clayton return m_opaque_sp.get(); 39230fdc8d8SChris Lattner } 39330fdc8d8SChris Lattner 39430fdc8d8SChris Lattner lldb_private::StackFrame * 39530fdc8d8SChris Lattner SBFrame::get() const 39630fdc8d8SChris Lattner { 3976611103cSGreg Clayton return m_opaque_sp.get(); 39830fdc8d8SChris Lattner } 39930fdc8d8SChris Lattner 40030fdc8d8SChris Lattner 40130fdc8d8SChris Lattner SBThread 40230fdc8d8SChris Lattner SBFrame::GetThread () const 40330fdc8d8SChris Lattner { 404ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 405ceb6b139SCaroline Tice 406750cd175SCaroline Tice //if (log) 407750cd175SCaroline Tice // log->Printf ("SBFrame::GetThread ()"); 408ceb6b139SCaroline Tice 4096611103cSGreg Clayton SBThread sb_thread (m_opaque_sp->GetThread().GetSP()); 410ceb6b139SCaroline Tice 411ceb6b139SCaroline Tice if (log) 412750cd175SCaroline Tice { 413750cd175SCaroline Tice SBStream sstr; 414750cd175SCaroline Tice sb_thread.GetDescription (sstr); 4154838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", m_opaque_sp.get(), 4164838131bSGreg Clayton sb_thread.get(), sstr.GetData()); 417750cd175SCaroline Tice } 418ceb6b139SCaroline Tice 41930fdc8d8SChris Lattner return sb_thread; 42030fdc8d8SChris Lattner } 42130fdc8d8SChris Lattner 42230fdc8d8SChris Lattner const char * 42330fdc8d8SChris Lattner SBFrame::Disassemble () const 42430fdc8d8SChris Lattner { 4254838131bSGreg Clayton const char *disassembly = NULL; 4266611103cSGreg Clayton if (m_opaque_sp) 4274838131bSGreg Clayton disassembly = m_opaque_sp->Disassemble(); 4284838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 4294838131bSGreg Clayton 4304838131bSGreg Clayton if (log) 4314838131bSGreg Clayton log->Printf ("SBFrame(%p)::Disassemble () => %s", m_opaque_sp.get(), disassembly); 4324838131bSGreg Clayton 4334838131bSGreg Clayton return disassembly; 43430fdc8d8SChris Lattner } 43530fdc8d8SChris Lattner 43630fdc8d8SChris Lattner 43730fdc8d8SChris Lattner SBValueList 43830fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 43930fdc8d8SChris Lattner bool locals, 44030fdc8d8SChris Lattner bool statics, 44130fdc8d8SChris Lattner bool in_scope_only) 44230fdc8d8SChris Lattner { 443ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 444ceb6b139SCaroline Tice 445ceb6b139SCaroline Tice if (log) 4464838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)", 447750cd175SCaroline Tice m_opaque_sp.get(), 4484838131bSGreg Clayton arguments, 4494838131bSGreg Clayton locals, 4504838131bSGreg Clayton statics, 4514838131bSGreg Clayton in_scope_only); 452ceb6b139SCaroline Tice 45330fdc8d8SChris Lattner SBValueList value_list; 4546611103cSGreg Clayton if (m_opaque_sp) 45530fdc8d8SChris Lattner { 45630fdc8d8SChris Lattner size_t i; 457288bdf9cSGreg Clayton VariableList *variable_list = m_opaque_sp->GetVariableList(true); 45830fdc8d8SChris Lattner if (variable_list) 45930fdc8d8SChris Lattner { 46030fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 46130fdc8d8SChris Lattner if (num_variables) 46230fdc8d8SChris Lattner { 46330fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 46430fdc8d8SChris Lattner { 46530fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 46630fdc8d8SChris Lattner if (variable_sp) 46730fdc8d8SChris Lattner { 46830fdc8d8SChris Lattner bool add_variable = false; 46930fdc8d8SChris Lattner switch (variable_sp->GetScope()) 47030fdc8d8SChris Lattner { 47130fdc8d8SChris Lattner case eValueTypeVariableGlobal: 47230fdc8d8SChris Lattner case eValueTypeVariableStatic: 47330fdc8d8SChris Lattner add_variable = statics; 47430fdc8d8SChris Lattner break; 47530fdc8d8SChris Lattner 47630fdc8d8SChris Lattner case eValueTypeVariableArgument: 47730fdc8d8SChris Lattner add_variable = arguments; 47830fdc8d8SChris Lattner break; 47930fdc8d8SChris Lattner 48030fdc8d8SChris Lattner case eValueTypeVariableLocal: 48130fdc8d8SChris Lattner add_variable = locals; 48230fdc8d8SChris Lattner break; 483c982c768SGreg Clayton 484c982c768SGreg Clayton default: 485c982c768SGreg Clayton break; 48630fdc8d8SChris Lattner } 48730fdc8d8SChris Lattner if (add_variable) 48830fdc8d8SChris Lattner { 4896611103cSGreg Clayton if (in_scope_only && !variable_sp->IsInScope(m_opaque_sp.get())) 49030fdc8d8SChris Lattner continue; 49130fdc8d8SChris Lattner 492288bdf9cSGreg Clayton value_list.Append(m_opaque_sp->GetValueObjectForFrameVariable (variable_sp)); 49330fdc8d8SChris Lattner } 49430fdc8d8SChris Lattner } 49530fdc8d8SChris Lattner } 49630fdc8d8SChris Lattner } 49730fdc8d8SChris Lattner } 49830fdc8d8SChris Lattner } 499ceb6b139SCaroline Tice 500ceb6b139SCaroline Tice if (log) 501ceb6b139SCaroline Tice { 5024838131bSGreg Clayton log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", m_opaque_sp.get(), 503750cd175SCaroline Tice value_list.get()); 504ceb6b139SCaroline Tice } 505ceb6b139SCaroline Tice 50630fdc8d8SChris Lattner return value_list; 50730fdc8d8SChris Lattner } 50830fdc8d8SChris Lattner 50930fdc8d8SChris Lattner lldb::SBValueList 51030fdc8d8SChris Lattner SBFrame::GetRegisters () 51130fdc8d8SChris Lattner { 512ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 513ceb6b139SCaroline Tice 51430fdc8d8SChris Lattner SBValueList value_list; 5156611103cSGreg Clayton if (m_opaque_sp) 51630fdc8d8SChris Lattner { 5176611103cSGreg Clayton RegisterContext *reg_ctx = m_opaque_sp->GetRegisterContext(); 51830fdc8d8SChris Lattner if (reg_ctx) 51930fdc8d8SChris Lattner { 52030fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 52130fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 52230fdc8d8SChris Lattner { 5238f92f0a3SGreg Clayton value_list.Append(ValueObjectSP (new ValueObjectRegisterSet (NULL, reg_ctx, set_idx))); 52430fdc8d8SChris Lattner } 52530fdc8d8SChris Lattner } 52630fdc8d8SChris Lattner } 527ceb6b139SCaroline Tice 528ceb6b139SCaroline Tice if (log) 5294838131bSGreg Clayton log->Printf ("SBFrame(%p)::Registers () => SBValueList(%p)", m_opaque_sp.get(), value_list.get()); 530ceb6b139SCaroline Tice 53130fdc8d8SChris Lattner return value_list; 53230fdc8d8SChris Lattner } 53330fdc8d8SChris Lattner 534dde9cff3SCaroline Tice bool 535dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 536dde9cff3SCaroline Tice { 537dde9cff3SCaroline Tice if (m_opaque_sp) 538dde9cff3SCaroline Tice { 539*cfd1acedSGreg Clayton Stream &s = description.ref(); 540*cfd1acedSGreg Clayton m_opaque_sp->DumpUsingSettingsFormat (&s); 541dde9cff3SCaroline Tice } 542dde9cff3SCaroline Tice else 543dde9cff3SCaroline Tice description.Printf ("No value"); 544dde9cff3SCaroline Tice 545dde9cff3SCaroline Tice return true; 546dde9cff3SCaroline Tice } 5471d3afba3SGreg Clayton 5481d3afba3SGreg Clayton lldb::SBValue 5491d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 5501d3afba3SGreg Clayton { 5514838131bSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 5524838131bSGreg Clayton 553*cfd1acedSGreg Clayton lldb::SBValue expr_result; 5544838131bSGreg Clayton if (log) 5554838131bSGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", m_opaque_sp.get(), expr); 5564838131bSGreg Clayton 5571d3afba3SGreg Clayton if (m_opaque_sp) 5581d3afba3SGreg Clayton { 559b71f3844SGreg Clayton ExecutionContext exe_ctx; 560b71f3844SGreg Clayton m_opaque_sp->CalculateExecutionContext (exe_ctx); 561322f529bSSean Callanan 562322f529bSSean Callanan const char *prefix = NULL; 563322f529bSSean Callanan 564322f529bSSean Callanan if (exe_ctx.target) 565322f529bSSean Callanan prefix = exe_ctx.target->GetExpressionPrefixContentsAsCString(); 566322f529bSSean Callanan 567*cfd1acedSGreg Clayton *expr_result = ClangUserExpression::Evaluate (exe_ctx, expr, prefix); 5681d3afba3SGreg Clayton } 5694838131bSGreg Clayton 5704838131bSGreg Clayton if (log) 571*cfd1acedSGreg Clayton log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p)", m_opaque_sp.get(), expr, expr_result.get()); 5724838131bSGreg Clayton 573*cfd1acedSGreg Clayton return expr_result; 5741d3afba3SGreg Clayton } 575