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