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 { 54*750cd175SCaroline 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); 60*750cd175SCaroline Tice log->Printf ("SBFrame::SBFrame (lldb_object_sp=%p) => this.sp = %p (%s)", lldb_object_sp.get(), 61*750cd175SCaroline Tice m_opaque_sp.get(), sstr.GetData()); 62*750cd175SCaroline 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 { 746611103cSGreg Clayton m_opaque_sp = lldb_object_sp; 7530fdc8d8SChris Lattner } 7630fdc8d8SChris Lattner 7730fdc8d8SChris Lattner 7830fdc8d8SChris Lattner bool 7930fdc8d8SChris Lattner SBFrame::IsValid() const 8030fdc8d8SChris Lattner { 816611103cSGreg Clayton return (m_opaque_sp.get() != NULL); 8230fdc8d8SChris Lattner } 8330fdc8d8SChris Lattner 8430fdc8d8SChris Lattner SBSymbolContext 8530fdc8d8SChris Lattner SBFrame::GetSymbolContext (uint32_t resolve_scope) const 8630fdc8d8SChris Lattner { 87ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 88ceb6b139SCaroline Tice 89*750cd175SCaroline Tice //if (log) 90*750cd175SCaroline Tice // log->Printf ("SBFrame::GetSymbolContext (this.sp=%p, resolve_scope=%d)", m_opaque_sp.get(), resolve_scope); 91ceb6b139SCaroline Tice 9230fdc8d8SChris Lattner SBSymbolContext sb_sym_ctx; 936611103cSGreg Clayton if (m_opaque_sp) 946611103cSGreg Clayton sb_sym_ctx.SetSymbolContext(&m_opaque_sp->GetSymbolContext (resolve_scope)); 95ceb6b139SCaroline Tice 96ceb6b139SCaroline Tice if (log) 97*750cd175SCaroline Tice log->Printf ("SBFrame::GetSymbolContext (this.sp=%p, resolve_scope=%d) => SBSymbolContext (this.ap = %p)", 98*750cd175SCaroline Tice m_opaque_sp.get(), resolve_scope, sb_sym_ctx.get()); 99ceb6b139SCaroline Tice 10030fdc8d8SChris Lattner return sb_sym_ctx; 10130fdc8d8SChris Lattner } 10230fdc8d8SChris Lattner 10330fdc8d8SChris Lattner SBModule 10430fdc8d8SChris Lattner SBFrame::GetModule () const 10530fdc8d8SChris Lattner { 1066611103cSGreg Clayton SBModule sb_module (m_opaque_sp->GetSymbolContext (eSymbolContextModule).module_sp); 10730fdc8d8SChris Lattner return sb_module; 10830fdc8d8SChris Lattner } 10930fdc8d8SChris Lattner 11030fdc8d8SChris Lattner SBCompileUnit 11130fdc8d8SChris Lattner SBFrame::GetCompileUnit () const 11230fdc8d8SChris Lattner { 113ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 114ceb6b139SCaroline Tice 115*750cd175SCaroline Tice //if (log) 116*750cd175SCaroline Tice // log->Printf ("SBFrame::GetCompileUnit()"); 117ceb6b139SCaroline Tice 1186611103cSGreg Clayton SBCompileUnit sb_comp_unit(m_opaque_sp->GetSymbolContext (eSymbolContextCompUnit).comp_unit); 119ceb6b139SCaroline Tice 120ceb6b139SCaroline Tice if (log) 121*750cd175SCaroline Tice log->Printf ("SBFrame::GetCompileUnit (this.sp=%p) => SBCompileUnit (this=%p)", m_opaque_sp.get(), 122*750cd175SCaroline Tice sb_comp_unit.get()); 123ceb6b139SCaroline Tice 12430fdc8d8SChris Lattner return sb_comp_unit; 12530fdc8d8SChris Lattner } 12630fdc8d8SChris Lattner 12730fdc8d8SChris Lattner SBFunction 12830fdc8d8SChris Lattner SBFrame::GetFunction () const 12930fdc8d8SChris Lattner { 1306611103cSGreg Clayton SBFunction sb_function(m_opaque_sp->GetSymbolContext (eSymbolContextFunction).function); 13130fdc8d8SChris Lattner return sb_function; 13230fdc8d8SChris Lattner } 13330fdc8d8SChris Lattner 1343b06557eSGreg Clayton SBSymbol 1353b06557eSGreg Clayton SBFrame::GetSymbol () const 1363b06557eSGreg Clayton { 1373b06557eSGreg Clayton SBSymbol sb_symbol(m_opaque_sp->GetSymbolContext (eSymbolContextSymbol).symbol); 1383b06557eSGreg Clayton return sb_symbol; 1393b06557eSGreg Clayton } 1403b06557eSGreg Clayton 14130fdc8d8SChris Lattner SBBlock 14230fdc8d8SChris Lattner SBFrame::GetBlock () const 14330fdc8d8SChris Lattner { 1446611103cSGreg Clayton SBBlock sb_block(m_opaque_sp->GetSymbolContext (eSymbolContextBlock).block); 14530fdc8d8SChris Lattner return sb_block; 14630fdc8d8SChris Lattner } 14730fdc8d8SChris Lattner 14895897c6aSGreg Clayton SBBlock 14995897c6aSGreg Clayton SBFrame::GetFrameBlock () const 15095897c6aSGreg Clayton { 15195897c6aSGreg Clayton SBBlock sb_block(m_opaque_sp->GetFrameBlock ()); 15295897c6aSGreg Clayton return sb_block; 15395897c6aSGreg Clayton } 15495897c6aSGreg Clayton 15530fdc8d8SChris Lattner SBLineEntry 15630fdc8d8SChris Lattner SBFrame::GetLineEntry () const 15730fdc8d8SChris Lattner { 1586611103cSGreg Clayton SBLineEntry sb_line_entry(&m_opaque_sp->GetSymbolContext (eSymbolContextLineEntry).line_entry); 15930fdc8d8SChris Lattner return sb_line_entry; 16030fdc8d8SChris Lattner } 16130fdc8d8SChris Lattner 16230fdc8d8SChris Lattner uint32_t 16330fdc8d8SChris Lattner SBFrame::GetFrameID () const 16430fdc8d8SChris Lattner { 1656611103cSGreg Clayton if (m_opaque_sp) 1661b72fcb7SGreg Clayton return m_opaque_sp->GetFrameIndex (); 16730fdc8d8SChris Lattner else 16830fdc8d8SChris Lattner return UINT32_MAX; 16930fdc8d8SChris Lattner } 17030fdc8d8SChris Lattner 17130fdc8d8SChris Lattner lldb::addr_t 17230fdc8d8SChris Lattner SBFrame::GetPC () const 17330fdc8d8SChris Lattner { 174ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 175ceb6b139SCaroline Tice 176*750cd175SCaroline Tice //if (log) 177*750cd175SCaroline Tice // log->Printf ("SBFrame::GetPC (this.sp=%p)", m_opaque_sp.get()); 178ceb6b139SCaroline Tice 179ceb6b139SCaroline Tice lldb::addr_t addr = LLDB_INVALID_ADDRESS; 1806611103cSGreg Clayton if (m_opaque_sp) 181ceb6b139SCaroline Tice addr = m_opaque_sp->GetFrameCodeAddress().GetLoadAddress (&m_opaque_sp->GetThread().GetProcess().GetTarget()); 182ceb6b139SCaroline Tice 183ceb6b139SCaroline Tice if (log) 184*750cd175SCaroline Tice log->Printf ("SBFrame::GetPC (this.sp=%p) => %p", m_opaque_sp.get(), addr); 185ceb6b139SCaroline Tice 186ceb6b139SCaroline Tice return addr; 18730fdc8d8SChris Lattner } 18830fdc8d8SChris Lattner 18930fdc8d8SChris Lattner bool 19030fdc8d8SChris Lattner SBFrame::SetPC (lldb::addr_t new_pc) 19130fdc8d8SChris Lattner { 192ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 193ceb6b139SCaroline Tice 194*750cd175SCaroline Tice //if (log) 195*750cd175SCaroline Tice // log->Printf ("SBFrame::SetPC (this.sp=%p, new_pc=%p)", m_opaque_sp.get(), new_pc); 196ceb6b139SCaroline Tice 197ceb6b139SCaroline Tice bool ret_val = false; 1986611103cSGreg Clayton if (m_opaque_sp) 199ceb6b139SCaroline Tice ret_val = m_opaque_sp->GetRegisterContext()->SetPC (new_pc); 200ceb6b139SCaroline Tice 201ceb6b139SCaroline Tice if (log) 202*750cd175SCaroline Tice log->Printf ("SBFrame::SetPC (this.sp=%p, new_pc=%p) => '%s'", m_opaque_sp.get(), new_pc, 203*750cd175SCaroline Tice (ret_val ? "true" : "false")); 204ceb6b139SCaroline Tice 205ceb6b139SCaroline Tice return ret_val; 20630fdc8d8SChris Lattner } 20730fdc8d8SChris Lattner 20830fdc8d8SChris Lattner lldb::addr_t 20930fdc8d8SChris Lattner SBFrame::GetSP () const 21030fdc8d8SChris Lattner { 2116611103cSGreg Clayton if (m_opaque_sp) 2126611103cSGreg Clayton return m_opaque_sp->GetRegisterContext()->GetSP(); 21330fdc8d8SChris Lattner return LLDB_INVALID_ADDRESS; 21430fdc8d8SChris Lattner } 21530fdc8d8SChris Lattner 21630fdc8d8SChris Lattner 21730fdc8d8SChris Lattner lldb::addr_t 21830fdc8d8SChris Lattner SBFrame::GetFP () const 21930fdc8d8SChris Lattner { 220ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 221ceb6b139SCaroline Tice 222*750cd175SCaroline Tice //if (log) 223*750cd175SCaroline Tice // log->Printf ("SBFrame::GetFP ()"); 224ceb6b139SCaroline Tice 225ceb6b139SCaroline Tice lldb::addr_t addr = LLDB_INVALID_ADDRESS; 2266611103cSGreg Clayton if (m_opaque_sp) 227ceb6b139SCaroline Tice addr = m_opaque_sp->GetRegisterContext()->GetFP(); 228ceb6b139SCaroline Tice 229ceb6b139SCaroline Tice if (log) 230*750cd175SCaroline Tice log->Printf ("SBFrame::GetFP (this.sp=%p) => %p", m_opaque_sp.get(), addr); 231ceb6b139SCaroline Tice 232ceb6b139SCaroline Tice return addr; 23330fdc8d8SChris Lattner } 23430fdc8d8SChris Lattner 23530fdc8d8SChris Lattner 23630fdc8d8SChris Lattner SBAddress 23730fdc8d8SChris Lattner SBFrame::GetPCAddress () const 23830fdc8d8SChris Lattner { 23930fdc8d8SChris Lattner SBAddress sb_addr; 2406611103cSGreg Clayton if (m_opaque_sp) 2419da7bd07SGreg Clayton sb_addr.SetAddress (&m_opaque_sp->GetFrameCodeAddress()); 24230fdc8d8SChris Lattner return sb_addr; 24330fdc8d8SChris Lattner } 24430fdc8d8SChris Lattner 24530fdc8d8SChris Lattner void 24630fdc8d8SChris Lattner SBFrame::Clear() 24730fdc8d8SChris Lattner { 2486611103cSGreg Clayton m_opaque_sp.reset(); 24930fdc8d8SChris Lattner } 25030fdc8d8SChris Lattner 25130fdc8d8SChris Lattner SBValue 25230fdc8d8SChris Lattner SBFrame::LookupVar (const char *var_name) 25330fdc8d8SChris Lattner { 25430fdc8d8SChris Lattner lldb::VariableSP var_sp; 25530fdc8d8SChris Lattner if (IsValid ()) 25630fdc8d8SChris Lattner { 25730fdc8d8SChris Lattner lldb_private::VariableList variable_list; 25830fdc8d8SChris Lattner SBSymbolContext sc = GetSymbolContext (eSymbolContextEverything); 25930fdc8d8SChris Lattner 26030fdc8d8SChris Lattner SBBlock block = sc.GetBlock(); 26130fdc8d8SChris Lattner if (block.IsValid()) 26230fdc8d8SChris Lattner block.AppendVariables (true, true, &variable_list); 26330fdc8d8SChris Lattner 26430fdc8d8SChris Lattner const uint32_t num_variables = variable_list.GetSize(); 26530fdc8d8SChris Lattner 26630fdc8d8SChris Lattner bool found = false; 267c982c768SGreg Clayton for (uint32_t i = 0; i < num_variables && !found; ++i) 26830fdc8d8SChris Lattner { 26930fdc8d8SChris Lattner var_sp = variable_list.GetVariableAtIndex(i); 27030fdc8d8SChris Lattner if (var_sp 27130fdc8d8SChris Lattner && (var_sp.get()->GetName() == lldb_private::ConstString(var_name))) 27230fdc8d8SChris Lattner found = true; 27330fdc8d8SChris Lattner } 27430fdc8d8SChris Lattner if (!found) 27530fdc8d8SChris Lattner var_sp.reset(); 27630fdc8d8SChris Lattner } 277dde9cff3SCaroline Tice if (var_sp) 278dde9cff3SCaroline Tice { 27930fdc8d8SChris Lattner SBValue sb_value (ValueObjectSP (new ValueObjectVariable (var_sp))); 28030fdc8d8SChris Lattner return sb_value; 28130fdc8d8SChris Lattner } 28230fdc8d8SChris Lattner 283dde9cff3SCaroline Tice SBValue sb_value; 284dde9cff3SCaroline Tice return sb_value; 285dde9cff3SCaroline Tice } 286dde9cff3SCaroline Tice 28730fdc8d8SChris Lattner SBValue 28830fdc8d8SChris Lattner SBFrame::LookupVarInScope (const char *var_name, const char *scope) 28930fdc8d8SChris Lattner { 29030fdc8d8SChris Lattner lldb::VariableSP var_sp; 29130fdc8d8SChris Lattner if (IsValid()) 29230fdc8d8SChris Lattner { 29330fdc8d8SChris Lattner std::string scope_str = scope; 29430fdc8d8SChris Lattner lldb::ValueType var_scope = eValueTypeInvalid; 29530fdc8d8SChris Lattner // Convert scope_str to be all lowercase; 29630fdc8d8SChris Lattner std::transform (scope_str.begin(), scope_str.end(), scope_str.begin(), ::tolower); 29730fdc8d8SChris Lattner 29830fdc8d8SChris Lattner if (scope_str.compare ("global") == 0) 29930fdc8d8SChris Lattner var_scope = eValueTypeVariableGlobal; 30030fdc8d8SChris Lattner else if (scope_str.compare ("local") == 0) 30130fdc8d8SChris Lattner var_scope = eValueTypeVariableLocal; 30230fdc8d8SChris Lattner else if (scope_str.compare ("parameter") == 0) 30330fdc8d8SChris Lattner var_scope = eValueTypeVariableArgument; 30430fdc8d8SChris Lattner 30530fdc8d8SChris Lattner if (var_scope != eValueTypeInvalid) 30630fdc8d8SChris Lattner { 30730fdc8d8SChris Lattner lldb_private::VariableList variable_list; 30830fdc8d8SChris Lattner SBSymbolContext sc = GetSymbolContext (eSymbolContextEverything); 30930fdc8d8SChris Lattner 31030fdc8d8SChris Lattner SBBlock block = sc.GetBlock(); 31130fdc8d8SChris Lattner if (block.IsValid()) 31230fdc8d8SChris Lattner block.AppendVariables (true, true, &variable_list); 31330fdc8d8SChris Lattner 31430fdc8d8SChris Lattner const uint32_t num_variables = variable_list.GetSize(); 31530fdc8d8SChris Lattner 31630fdc8d8SChris Lattner bool found = false; 317c982c768SGreg Clayton for (uint32_t i = 0; i < num_variables && !found; ++i) 31830fdc8d8SChris Lattner { 31930fdc8d8SChris Lattner var_sp = variable_list.GetVariableAtIndex(i); 32030fdc8d8SChris Lattner if (var_sp 32130fdc8d8SChris Lattner && (var_sp.get()->GetName() == lldb_private::ConstString(var_name)) 32230fdc8d8SChris Lattner && var_sp.get()->GetScope() == var_scope) 32330fdc8d8SChris Lattner found = true; 32430fdc8d8SChris Lattner } 32530fdc8d8SChris Lattner if (!found) 32630fdc8d8SChris Lattner var_sp.reset(); 32730fdc8d8SChris Lattner } 32830fdc8d8SChris Lattner } 329dde9cff3SCaroline Tice 330dde9cff3SCaroline Tice if (var_sp) 331dde9cff3SCaroline Tice { 33230fdc8d8SChris Lattner SBValue sb_value (ValueObjectSP (new ValueObjectVariable (var_sp))); 33330fdc8d8SChris Lattner return sb_value; 33430fdc8d8SChris Lattner } 33530fdc8d8SChris Lattner 336dde9cff3SCaroline Tice SBValue sb_value; 337dde9cff3SCaroline Tice return sb_value; 338dde9cff3SCaroline Tice } 339dde9cff3SCaroline Tice 34030fdc8d8SChris Lattner bool 34130fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const 34230fdc8d8SChris Lattner { 3436611103cSGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 34430fdc8d8SChris Lattner } 34530fdc8d8SChris Lattner 34630fdc8d8SChris Lattner bool 34730fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const 34830fdc8d8SChris Lattner { 3496611103cSGreg Clayton return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 35030fdc8d8SChris Lattner } 35130fdc8d8SChris Lattner 35230fdc8d8SChris Lattner lldb_private::StackFrame * 35330fdc8d8SChris Lattner SBFrame::operator->() const 35430fdc8d8SChris Lattner { 3556611103cSGreg Clayton return m_opaque_sp.get(); 35630fdc8d8SChris Lattner } 35730fdc8d8SChris Lattner 35830fdc8d8SChris Lattner lldb_private::StackFrame * 35930fdc8d8SChris Lattner SBFrame::get() const 36030fdc8d8SChris Lattner { 3616611103cSGreg Clayton return m_opaque_sp.get(); 36230fdc8d8SChris Lattner } 36330fdc8d8SChris Lattner 36430fdc8d8SChris Lattner 36530fdc8d8SChris Lattner SBThread 36630fdc8d8SChris Lattner SBFrame::GetThread () const 36730fdc8d8SChris Lattner { 368ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 369ceb6b139SCaroline Tice 370*750cd175SCaroline Tice //if (log) 371*750cd175SCaroline Tice // log->Printf ("SBFrame::GetThread ()"); 372ceb6b139SCaroline Tice 3736611103cSGreg Clayton SBThread sb_thread (m_opaque_sp->GetThread().GetSP()); 374ceb6b139SCaroline Tice 375ceb6b139SCaroline Tice if (log) 376*750cd175SCaroline Tice { 377*750cd175SCaroline Tice SBStream sstr; 378*750cd175SCaroline Tice sb_thread.GetDescription (sstr); 379*750cd175SCaroline Tice log->Printf ("SBFrame::GetThread (this.sp=%p) => SBThread : this.sp= %p, '%s'", m_opaque_sp.get(), 380*750cd175SCaroline Tice sb_thread.GetLLDBObjectPtr(), sstr.GetData()); 381*750cd175SCaroline Tice } 382ceb6b139SCaroline Tice 38330fdc8d8SChris Lattner return sb_thread; 38430fdc8d8SChris Lattner } 38530fdc8d8SChris Lattner 38630fdc8d8SChris Lattner const char * 38730fdc8d8SChris Lattner SBFrame::Disassemble () const 38830fdc8d8SChris Lattner { 389ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 390ceb6b139SCaroline Tice Log *verbose_log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API | LIBLLDB_LOG_VERBOSE); 391ceb6b139SCaroline Tice 392ceb6b139SCaroline Tice if (verbose_log) 393*750cd175SCaroline Tice verbose_log->Printf ("SBFrame::Disassemble (this.sp=%p) => %s", m_opaque_sp.get(), m_opaque_sp->Disassemble()); 394ceb6b139SCaroline Tice else if (log) 395*750cd175SCaroline Tice log->Printf ("SBFrame::Disassemble (this.sp=%p)", m_opaque_sp.get()); 396ceb6b139SCaroline Tice 3976611103cSGreg Clayton if (m_opaque_sp) 3986611103cSGreg Clayton return m_opaque_sp->Disassemble(); 39930fdc8d8SChris Lattner return NULL; 40030fdc8d8SChris Lattner } 40130fdc8d8SChris Lattner 40230fdc8d8SChris Lattner 40330fdc8d8SChris Lattner 40430fdc8d8SChris Lattner lldb_private::StackFrame * 40530fdc8d8SChris Lattner SBFrame::GetLLDBObjectPtr () 40630fdc8d8SChris Lattner { 4076611103cSGreg Clayton return m_opaque_sp.get(); 40830fdc8d8SChris Lattner } 40930fdc8d8SChris Lattner 41030fdc8d8SChris Lattner SBValueList 41130fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments, 41230fdc8d8SChris Lattner bool locals, 41330fdc8d8SChris Lattner bool statics, 41430fdc8d8SChris Lattner bool in_scope_only) 41530fdc8d8SChris Lattner { 416ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 417ceb6b139SCaroline Tice 418ceb6b139SCaroline Tice if (log) 419*750cd175SCaroline Tice log->Printf ("SBFrame::GetVariables (this_sp.get=%p, arguments=%s, locals=%s, statics=%s, in_scope_only=%s)", 420*750cd175SCaroline Tice m_opaque_sp.get(), 421ceb6b139SCaroline Tice (arguments ? "true" : "false"), 422ceb6b139SCaroline Tice (locals ? "true" : "false"), 423ceb6b139SCaroline Tice (statics ? "true" : "false"), 424ceb6b139SCaroline Tice (in_scope_only ? "true" : "false")); 425ceb6b139SCaroline Tice 42630fdc8d8SChris Lattner SBValueList value_list; 4276611103cSGreg Clayton if (m_opaque_sp) 42830fdc8d8SChris Lattner { 42930fdc8d8SChris Lattner size_t i; 430288bdf9cSGreg Clayton VariableList *variable_list = m_opaque_sp->GetVariableList(true); 43130fdc8d8SChris Lattner if (variable_list) 43230fdc8d8SChris Lattner { 43330fdc8d8SChris Lattner const size_t num_variables = variable_list->GetSize(); 43430fdc8d8SChris Lattner if (num_variables) 43530fdc8d8SChris Lattner { 43630fdc8d8SChris Lattner for (i = 0; i < num_variables; ++i) 43730fdc8d8SChris Lattner { 43830fdc8d8SChris Lattner VariableSP variable_sp (variable_list->GetVariableAtIndex(i)); 43930fdc8d8SChris Lattner if (variable_sp) 44030fdc8d8SChris Lattner { 44130fdc8d8SChris Lattner bool add_variable = false; 44230fdc8d8SChris Lattner switch (variable_sp->GetScope()) 44330fdc8d8SChris Lattner { 44430fdc8d8SChris Lattner case eValueTypeVariableGlobal: 44530fdc8d8SChris Lattner case eValueTypeVariableStatic: 44630fdc8d8SChris Lattner add_variable = statics; 44730fdc8d8SChris Lattner break; 44830fdc8d8SChris Lattner 44930fdc8d8SChris Lattner case eValueTypeVariableArgument: 45030fdc8d8SChris Lattner add_variable = arguments; 45130fdc8d8SChris Lattner break; 45230fdc8d8SChris Lattner 45330fdc8d8SChris Lattner case eValueTypeVariableLocal: 45430fdc8d8SChris Lattner add_variable = locals; 45530fdc8d8SChris Lattner break; 456c982c768SGreg Clayton 457c982c768SGreg Clayton default: 458c982c768SGreg Clayton break; 45930fdc8d8SChris Lattner } 46030fdc8d8SChris Lattner if (add_variable) 46130fdc8d8SChris Lattner { 4626611103cSGreg Clayton if (in_scope_only && !variable_sp->IsInScope(m_opaque_sp.get())) 46330fdc8d8SChris Lattner continue; 46430fdc8d8SChris Lattner 465288bdf9cSGreg Clayton value_list.Append(m_opaque_sp->GetValueObjectForFrameVariable (variable_sp)); 46630fdc8d8SChris Lattner } 46730fdc8d8SChris Lattner } 46830fdc8d8SChris Lattner } 46930fdc8d8SChris Lattner } 47030fdc8d8SChris Lattner } 47130fdc8d8SChris Lattner } 472ceb6b139SCaroline Tice 473ceb6b139SCaroline Tice if (log) 474ceb6b139SCaroline Tice { 475*750cd175SCaroline Tice log->Printf ("SBFrame::GetVariables (this.sp=%p,...) => SBValueList (this.ap = %p)", m_opaque_sp.get(), 476*750cd175SCaroline Tice value_list.get()); 477ceb6b139SCaroline Tice //uint32_t num_vars = value_list.GetSize(); 478ceb6b139SCaroline Tice //for (uint32_t i = 0; i < num_vars; ++i) 479ceb6b139SCaroline Tice //{ 480ceb6b139SCaroline Tice // SBValue value = value_list.GetValueAtIndex (i); 481ceb6b139SCaroline Tice // log->Printf (" %s : %s", value.GetName(), value.GetObjectDescription (*this)); 482ceb6b139SCaroline Tice //} 483ceb6b139SCaroline Tice } 484ceb6b139SCaroline Tice 48530fdc8d8SChris Lattner return value_list; 48630fdc8d8SChris Lattner } 48730fdc8d8SChris Lattner 48830fdc8d8SChris Lattner lldb::SBValueList 48930fdc8d8SChris Lattner SBFrame::GetRegisters () 49030fdc8d8SChris Lattner { 491ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 492ceb6b139SCaroline Tice 493*750cd175SCaroline Tice //if (log) 494*750cd175SCaroline Tice // log->Printf ("SBFrame::GetRegisters ()"); 495ceb6b139SCaroline Tice 49630fdc8d8SChris Lattner SBValueList value_list; 4976611103cSGreg Clayton if (m_opaque_sp) 49830fdc8d8SChris Lattner { 4996611103cSGreg Clayton RegisterContext *reg_ctx = m_opaque_sp->GetRegisterContext(); 50030fdc8d8SChris Lattner if (reg_ctx) 50130fdc8d8SChris Lattner { 50230fdc8d8SChris Lattner const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 50330fdc8d8SChris Lattner for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) 50430fdc8d8SChris Lattner { 5058f92f0a3SGreg Clayton value_list.Append(ValueObjectSP (new ValueObjectRegisterSet (NULL, reg_ctx, set_idx))); 50630fdc8d8SChris Lattner } 50730fdc8d8SChris Lattner } 50830fdc8d8SChris Lattner } 509ceb6b139SCaroline Tice 510ceb6b139SCaroline Tice if (log) 511ceb6b139SCaroline Tice { 512*750cd175SCaroline Tice log->Printf ("SBFrame::Registers (this.sp=%p) => SBValueList (this.ap = %p)", m_opaque_sp.get(), 513*750cd175SCaroline Tice value_list.get() ); 514ceb6b139SCaroline Tice //uint32_t num_vars = value_list.GetSize(); 515ceb6b139SCaroline Tice //for (uint32_t i = 0; i < num_vars; ++i) 516ceb6b139SCaroline Tice //{ 517ceb6b139SCaroline Tice // SBValue value = value_list.GetValueAtIndex (i); 518ceb6b139SCaroline Tice // log->Printf (" %s : %s", value.GetName(), value.GetObjectDescription (*this)); 519ceb6b139SCaroline Tice //} 520ceb6b139SCaroline Tice } 521ceb6b139SCaroline Tice 52230fdc8d8SChris Lattner return value_list; 52330fdc8d8SChris Lattner } 52430fdc8d8SChris Lattner 525dde9cff3SCaroline Tice bool 526dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description) 527dde9cff3SCaroline Tice { 528dde9cff3SCaroline Tice if (m_opaque_sp) 529dde9cff3SCaroline Tice { 53005faeb71SGreg Clayton description.Printf("SBFrame: idx = %u", m_opaque_sp->GetFrameIndex()); 531dde9cff3SCaroline Tice } 532dde9cff3SCaroline Tice else 533dde9cff3SCaroline Tice description.Printf ("No value"); 534dde9cff3SCaroline Tice 535dde9cff3SCaroline Tice return true; 536dde9cff3SCaroline Tice } 5371d3afba3SGreg Clayton 5381d3afba3SGreg Clayton lldb::SBValue 5391d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr) 5401d3afba3SGreg Clayton { 5411d3afba3SGreg Clayton lldb::SBValue expr_result_value; 5421d3afba3SGreg Clayton if (m_opaque_sp) 5431d3afba3SGreg Clayton { 544b71f3844SGreg Clayton ExecutionContext exe_ctx; 545b71f3844SGreg Clayton m_opaque_sp->CalculateExecutionContext (exe_ctx); 546b71f3844SGreg Clayton *expr_result_value = ClangUserExpression::Evaluate (exe_ctx, expr); 5471d3afba3SGreg Clayton } 5481d3afba3SGreg Clayton return expr_result_value; 5491d3afba3SGreg Clayton } 550