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 {
1256611103cSGreg Clayton     SBModule sb_module (m_opaque_sp->GetSymbolContext (eSymbolContextModule).module_sp);
1262d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1274838131bSGreg Clayton     if (log)
1284838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBModule(%p)",
1294838131bSGreg Clayton                      m_opaque_sp.get(), sb_module.get());
1304838131bSGreg Clayton 
13130fdc8d8SChris Lattner     return sb_module;
13230fdc8d8SChris Lattner }
13330fdc8d8SChris Lattner 
13430fdc8d8SChris Lattner SBCompileUnit
13530fdc8d8SChris Lattner SBFrame::GetCompileUnit () const
13630fdc8d8SChris Lattner {
1376611103cSGreg Clayton     SBCompileUnit sb_comp_unit(m_opaque_sp->GetSymbolContext (eSymbolContextCompUnit).comp_unit);
138ceb6b139SCaroline Tice 
1392d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
140ceb6b139SCaroline Tice     if (log)
1414838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetModule () => SBCompileUnit(%p)",
1424838131bSGreg Clayton                      m_opaque_sp.get(), sb_comp_unit.get());
143ceb6b139SCaroline Tice 
14430fdc8d8SChris Lattner     return sb_comp_unit;
14530fdc8d8SChris Lattner }
14630fdc8d8SChris Lattner 
14730fdc8d8SChris Lattner SBFunction
14830fdc8d8SChris Lattner SBFrame::GetFunction () const
14930fdc8d8SChris Lattner {
1506611103cSGreg Clayton     SBFunction sb_function(m_opaque_sp->GetSymbolContext (eSymbolContextFunction).function);
1514838131bSGreg Clayton 
1522d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1534838131bSGreg Clayton     if (log)
1544838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFunction () => SBFunction(%p)",
1554838131bSGreg Clayton                      m_opaque_sp.get(), sb_function.get());
1564838131bSGreg Clayton 
15730fdc8d8SChris Lattner     return sb_function;
15830fdc8d8SChris Lattner }
15930fdc8d8SChris Lattner 
1603b06557eSGreg Clayton SBSymbol
1613b06557eSGreg Clayton SBFrame::GetSymbol () const
1623b06557eSGreg Clayton {
1633b06557eSGreg Clayton     SBSymbol sb_symbol(m_opaque_sp->GetSymbolContext (eSymbolContextSymbol).symbol);
1642d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1654838131bSGreg Clayton     if (log)
1664838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetSymbol () => SBSymbol(%p)",
1674838131bSGreg Clayton                      m_opaque_sp.get(), sb_symbol.get());
1683b06557eSGreg Clayton     return sb_symbol;
1693b06557eSGreg Clayton }
1703b06557eSGreg Clayton 
17130fdc8d8SChris Lattner SBBlock
17230fdc8d8SChris Lattner SBFrame::GetBlock () const
17330fdc8d8SChris Lattner {
1746611103cSGreg Clayton     SBBlock sb_block(m_opaque_sp->GetSymbolContext (eSymbolContextBlock).block);
1752d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1764838131bSGreg Clayton     if (log)
1774838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetBlock () => SBBlock(%p)",
1784838131bSGreg Clayton                      m_opaque_sp.get(), sb_block.get());
17930fdc8d8SChris Lattner     return sb_block;
18030fdc8d8SChris Lattner }
18130fdc8d8SChris Lattner 
18295897c6aSGreg Clayton SBBlock
18395897c6aSGreg Clayton SBFrame::GetFrameBlock () const
18495897c6aSGreg Clayton {
18595897c6aSGreg Clayton     SBBlock sb_block(m_opaque_sp->GetFrameBlock ());
1862d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1874838131bSGreg Clayton     if (log)
1884838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameBlock () => SBBlock(%p)",
1894838131bSGreg Clayton                      m_opaque_sp.get(), sb_block.get());
19095897c6aSGreg Clayton     return sb_block;
19195897c6aSGreg Clayton }
19295897c6aSGreg Clayton 
19330fdc8d8SChris Lattner SBLineEntry
19430fdc8d8SChris Lattner SBFrame::GetLineEntry () const
19530fdc8d8SChris Lattner {
1966611103cSGreg Clayton     SBLineEntry sb_line_entry(&m_opaque_sp->GetSymbolContext (eSymbolContextLineEntry).line_entry);
1972d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1984838131bSGreg Clayton     if (log)
1994838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetLineEntry () => SBLineEntry(%p)",
2004838131bSGreg Clayton                      m_opaque_sp.get(), sb_line_entry.get());
20130fdc8d8SChris Lattner     return sb_line_entry;
20230fdc8d8SChris Lattner }
20330fdc8d8SChris Lattner 
20430fdc8d8SChris Lattner uint32_t
20530fdc8d8SChris Lattner SBFrame::GetFrameID () const
20630fdc8d8SChris Lattner {
2074838131bSGreg Clayton     uint32_t frame_idx = m_opaque_sp ? m_opaque_sp->GetFrameIndex () : UINT32_MAX;
2084838131bSGreg Clayton 
2092d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2104838131bSGreg Clayton     if (log)
2114838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetFrameID () => %u",
2124838131bSGreg Clayton                      m_opaque_sp.get(), frame_idx);
2134838131bSGreg Clayton     return frame_idx;
21430fdc8d8SChris Lattner }
21530fdc8d8SChris Lattner 
21630fdc8d8SChris Lattner lldb::addr_t
21730fdc8d8SChris Lattner SBFrame::GetPC () const
21830fdc8d8SChris Lattner {
219ceb6b139SCaroline Tice 
220ceb6b139SCaroline Tice     lldb::addr_t addr = LLDB_INVALID_ADDRESS;
2216611103cSGreg Clayton     if (m_opaque_sp)
222ceb6b139SCaroline Tice         addr = m_opaque_sp->GetFrameCodeAddress().GetLoadAddress (&m_opaque_sp->GetThread().GetProcess().GetTarget());
223ceb6b139SCaroline Tice 
2242d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
225ceb6b139SCaroline Tice     if (log)
226cfd1acedSGreg Clayton         log->Printf ("SBFrame(%p)::GetPC () => 0x%llx", m_opaque_sp.get(), addr);
227ceb6b139SCaroline Tice 
228ceb6b139SCaroline Tice     return addr;
22930fdc8d8SChris Lattner }
23030fdc8d8SChris Lattner 
23130fdc8d8SChris Lattner bool
23230fdc8d8SChris Lattner SBFrame::SetPC (lldb::addr_t new_pc)
23330fdc8d8SChris Lattner {
234ceb6b139SCaroline Tice 
235ceb6b139SCaroline Tice     bool ret_val = false;
2366611103cSGreg Clayton     if (m_opaque_sp)
237ceb6b139SCaroline Tice         ret_val = m_opaque_sp->GetRegisterContext()->SetPC (new_pc);
238ceb6b139SCaroline Tice 
2392d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
240ceb6b139SCaroline Tice     if (log)
2414838131bSGreg Clayton         log->Printf ("SBFrame(%p)::SetPC (new_pc=0x%llx) => %i",
2424838131bSGreg Clayton                      m_opaque_sp.get(), new_pc, ret_val);
243ceb6b139SCaroline Tice 
244ceb6b139SCaroline Tice     return ret_val;
24530fdc8d8SChris Lattner }
24630fdc8d8SChris Lattner 
24730fdc8d8SChris Lattner lldb::addr_t
24830fdc8d8SChris Lattner SBFrame::GetSP () const
24930fdc8d8SChris Lattner {
2504838131bSGreg Clayton     addr_t addr = LLDB_INVALID_ADDRESS;
2516611103cSGreg Clayton     if (m_opaque_sp)
2524838131bSGreg Clayton         addr = m_opaque_sp->GetRegisterContext()->GetSP();
2532d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2544838131bSGreg Clayton     if (log)
255cfd1acedSGreg Clayton         log->Printf ("SBFrame(%p)::GetSP () => 0x%llx", m_opaque_sp.get(), addr);
2564838131bSGreg Clayton 
2574838131bSGreg Clayton     return addr;
25830fdc8d8SChris Lattner }
25930fdc8d8SChris Lattner 
26030fdc8d8SChris Lattner 
26130fdc8d8SChris Lattner lldb::addr_t
26230fdc8d8SChris Lattner SBFrame::GetFP () const
26330fdc8d8SChris Lattner {
264ceb6b139SCaroline Tice     lldb::addr_t addr = LLDB_INVALID_ADDRESS;
2656611103cSGreg Clayton     if (m_opaque_sp)
266ceb6b139SCaroline Tice         addr = m_opaque_sp->GetRegisterContext()->GetFP();
267ceb6b139SCaroline Tice 
2682d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
269ceb6b139SCaroline Tice     if (log)
270cfd1acedSGreg Clayton         log->Printf ("SBFrame(%p)::GetFP () => 0x%llx", m_opaque_sp.get(), addr);
271ceb6b139SCaroline Tice     return addr;
27230fdc8d8SChris Lattner }
27330fdc8d8SChris Lattner 
27430fdc8d8SChris Lattner 
27530fdc8d8SChris Lattner SBAddress
27630fdc8d8SChris Lattner SBFrame::GetPCAddress () const
27730fdc8d8SChris Lattner {
27830fdc8d8SChris Lattner     SBAddress sb_addr;
2796611103cSGreg Clayton     if (m_opaque_sp)
2809da7bd07SGreg Clayton         sb_addr.SetAddress (&m_opaque_sp->GetFrameCodeAddress());
2812d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
2824838131bSGreg Clayton     if (log)
2834838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetPCAddress () => SBAddress(%p)", m_opaque_sp.get(), sb_addr.get());
28430fdc8d8SChris Lattner     return sb_addr;
28530fdc8d8SChris Lattner }
28630fdc8d8SChris Lattner 
28730fdc8d8SChris Lattner void
28830fdc8d8SChris Lattner SBFrame::Clear()
28930fdc8d8SChris Lattner {
2906611103cSGreg Clayton     m_opaque_sp.reset();
29130fdc8d8SChris Lattner }
29230fdc8d8SChris Lattner 
29330fdc8d8SChris Lattner SBValue
29430fdc8d8SChris Lattner SBFrame::LookupVar (const char *var_name)
29530fdc8d8SChris Lattner {
29630fdc8d8SChris Lattner     lldb::VariableSP var_sp;
29730fdc8d8SChris Lattner     if (IsValid ())
29830fdc8d8SChris Lattner     {
29930fdc8d8SChris Lattner         lldb_private::VariableList variable_list;
30030fdc8d8SChris Lattner         SBSymbolContext sc = GetSymbolContext (eSymbolContextEverything);
30130fdc8d8SChris Lattner 
30230fdc8d8SChris Lattner         SBBlock block = sc.GetBlock();
30330fdc8d8SChris Lattner         if (block.IsValid())
30430fdc8d8SChris Lattner             block.AppendVariables (true, true, &variable_list);
30530fdc8d8SChris Lattner 
30630fdc8d8SChris Lattner         const uint32_t num_variables = variable_list.GetSize();
30730fdc8d8SChris Lattner 
30830fdc8d8SChris Lattner         bool found = false;
309c982c768SGreg Clayton         for (uint32_t i = 0; i < num_variables && !found; ++i)
31030fdc8d8SChris Lattner         {
31130fdc8d8SChris Lattner             var_sp = variable_list.GetVariableAtIndex(i);
31230fdc8d8SChris Lattner             if (var_sp
31330fdc8d8SChris Lattner                 && (var_sp.get()->GetName() == lldb_private::ConstString(var_name)))
31430fdc8d8SChris Lattner                 found = true;
31530fdc8d8SChris Lattner         }
31630fdc8d8SChris Lattner         if (!found)
31730fdc8d8SChris Lattner             var_sp.reset();
31830fdc8d8SChris Lattner     }
31930fdc8d8SChris Lattner 
320dde9cff3SCaroline Tice     SBValue sb_value;
3214838131bSGreg Clayton 
3224838131bSGreg Clayton     if (var_sp)
3234838131bSGreg Clayton         *sb_value = ValueObjectSP (new ValueObjectVariable (var_sp));
3244838131bSGreg Clayton 
3252d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3264838131bSGreg Clayton     if (log)
3274838131bSGreg Clayton         log->Printf ("SBFrame(%p)::LookupVar (name=\"%s\") => SBValue(%p)",
3284838131bSGreg Clayton                      m_opaque_sp.get(), var_name, sb_value.get());
3294838131bSGreg Clayton 
330dde9cff3SCaroline Tice     return sb_value;
331dde9cff3SCaroline Tice }
332dde9cff3SCaroline Tice 
33330fdc8d8SChris Lattner SBValue
33430fdc8d8SChris Lattner SBFrame::LookupVarInScope (const char *var_name, const char *scope)
33530fdc8d8SChris Lattner {
33630fdc8d8SChris Lattner     lldb::VariableSP var_sp;
33730fdc8d8SChris Lattner     if (IsValid())
33830fdc8d8SChris Lattner     {
33930fdc8d8SChris Lattner         std::string scope_str = scope;
34030fdc8d8SChris Lattner         lldb::ValueType var_scope = eValueTypeInvalid;
34130fdc8d8SChris Lattner         // Convert scope_str to be all lowercase;
34230fdc8d8SChris Lattner         std::transform (scope_str.begin(), scope_str.end(), scope_str.begin(), ::tolower);
34330fdc8d8SChris Lattner 
34430fdc8d8SChris Lattner         if (scope_str.compare ("global") == 0)
34530fdc8d8SChris Lattner             var_scope = eValueTypeVariableGlobal;
34630fdc8d8SChris Lattner         else if (scope_str.compare ("local") == 0)
34730fdc8d8SChris Lattner             var_scope = eValueTypeVariableLocal;
34830fdc8d8SChris Lattner         else if (scope_str.compare ("parameter") == 0)
34930fdc8d8SChris Lattner            var_scope = eValueTypeVariableArgument;
35030fdc8d8SChris Lattner 
35130fdc8d8SChris Lattner         if (var_scope != eValueTypeInvalid)
35230fdc8d8SChris Lattner         {
353beae523aSJohnny Chen             lldb_private::VariableList *variable_list = m_opaque_sp->GetVariableList(true);
354beae523aSJohnny Chen             if (variable_list)
355beae523aSJohnny Chen             {
356beae523aSJohnny Chen                 const uint32_t num_variables = variable_list->GetSize();
35730fdc8d8SChris Lattner                 bool found = false;
358c982c768SGreg Clayton                 for (uint32_t i = 0; i < num_variables && !found; ++i)
35930fdc8d8SChris Lattner                 {
360beae523aSJohnny Chen                     var_sp = variable_list->GetVariableAtIndex(i);
36130fdc8d8SChris Lattner                     if (var_sp
36230fdc8d8SChris Lattner                         && (var_sp.get()->GetName() == lldb_private::ConstString(var_name))
36330fdc8d8SChris Lattner                         && var_sp.get()->GetScope() == var_scope)
364beae523aSJohnny Chen                     {
36530fdc8d8SChris Lattner                         found = true;
366beae523aSJohnny Chen                         break;
367beae523aSJohnny Chen                     }
36830fdc8d8SChris Lattner                 }
36930fdc8d8SChris Lattner                 if (!found)
37030fdc8d8SChris Lattner                     var_sp.reset();
37130fdc8d8SChris Lattner             }
37230fdc8d8SChris Lattner         }
373beae523aSJohnny Chen     }
374dde9cff3SCaroline Tice 
375dde9cff3SCaroline Tice     SBValue sb_value;
3764838131bSGreg Clayton     if (var_sp)
3774838131bSGreg Clayton         *sb_value = ValueObjectSP (new ValueObjectVariable (var_sp));
3784838131bSGreg Clayton 
3792d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
3804838131bSGreg Clayton     if (log)
3814838131bSGreg Clayton         log->Printf ("SBFrame(%p)::LookupVarInScope (name=\"%s\", scope=%s) => SBValue(%p)",
3824838131bSGreg Clayton                      m_opaque_sp.get(), var_name, scope, sb_value.get());
3834838131bSGreg Clayton 
3844838131bSGreg Clayton 
385dde9cff3SCaroline Tice     return sb_value;
386dde9cff3SCaroline Tice }
387dde9cff3SCaroline Tice 
38830fdc8d8SChris Lattner bool
38930fdc8d8SChris Lattner SBFrame::operator == (const SBFrame &rhs) const
39030fdc8d8SChris Lattner {
3916611103cSGreg Clayton     return m_opaque_sp.get() == rhs.m_opaque_sp.get();
39230fdc8d8SChris Lattner }
39330fdc8d8SChris Lattner 
39430fdc8d8SChris Lattner bool
39530fdc8d8SChris Lattner SBFrame::operator != (const SBFrame &rhs) const
39630fdc8d8SChris Lattner {
3976611103cSGreg Clayton     return m_opaque_sp.get() != rhs.m_opaque_sp.get();
39830fdc8d8SChris Lattner }
39930fdc8d8SChris Lattner 
40030fdc8d8SChris Lattner lldb_private::StackFrame *
40130fdc8d8SChris Lattner SBFrame::operator->() const
40230fdc8d8SChris Lattner {
4036611103cSGreg Clayton     return m_opaque_sp.get();
40430fdc8d8SChris Lattner }
40530fdc8d8SChris Lattner 
40630fdc8d8SChris Lattner lldb_private::StackFrame *
40730fdc8d8SChris Lattner SBFrame::get() const
40830fdc8d8SChris Lattner {
4096611103cSGreg Clayton     return m_opaque_sp.get();
41030fdc8d8SChris Lattner }
41130fdc8d8SChris Lattner 
41230fdc8d8SChris Lattner 
41330fdc8d8SChris Lattner SBThread
41430fdc8d8SChris Lattner SBFrame::GetThread () const
41530fdc8d8SChris Lattner {
4162d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
417ceb6b139SCaroline Tice 
418750cd175SCaroline Tice     //if (log)
419750cd175SCaroline Tice     //    log->Printf ("SBFrame::GetThread ()");
420ceb6b139SCaroline Tice 
4216611103cSGreg Clayton     SBThread sb_thread (m_opaque_sp->GetThread().GetSP());
422ceb6b139SCaroline Tice 
423ceb6b139SCaroline Tice     if (log)
424750cd175SCaroline Tice     {
425750cd175SCaroline Tice         SBStream sstr;
426750cd175SCaroline Tice         sb_thread.GetDescription (sstr);
4274838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetThread () => SBThread(%p): %s", m_opaque_sp.get(),
4284838131bSGreg Clayton                      sb_thread.get(), sstr.GetData());
429750cd175SCaroline Tice     }
430ceb6b139SCaroline Tice 
43130fdc8d8SChris Lattner     return sb_thread;
43230fdc8d8SChris Lattner }
43330fdc8d8SChris Lattner 
43430fdc8d8SChris Lattner const char *
43530fdc8d8SChris Lattner SBFrame::Disassemble () const
43630fdc8d8SChris Lattner {
4374838131bSGreg Clayton     const char *disassembly = NULL;
4386611103cSGreg Clayton     if (m_opaque_sp)
4394838131bSGreg Clayton         disassembly = m_opaque_sp->Disassemble();
4402d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
4414838131bSGreg Clayton 
4424838131bSGreg Clayton     if (log)
4434838131bSGreg Clayton         log->Printf ("SBFrame(%p)::Disassemble () => %s", m_opaque_sp.get(), disassembly);
4444838131bSGreg Clayton 
4454838131bSGreg Clayton     return disassembly;
44630fdc8d8SChris Lattner }
44730fdc8d8SChris Lattner 
44830fdc8d8SChris Lattner 
44930fdc8d8SChris Lattner SBValueList
45030fdc8d8SChris Lattner SBFrame::GetVariables (bool arguments,
45130fdc8d8SChris Lattner                        bool locals,
45230fdc8d8SChris Lattner                        bool statics,
45330fdc8d8SChris Lattner                        bool in_scope_only)
45430fdc8d8SChris Lattner {
4552d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
456ceb6b139SCaroline Tice 
457ceb6b139SCaroline Tice     if (log)
4584838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (arguments=%i, locals=%i, statics=%i, in_scope_only=%i)",
459750cd175SCaroline Tice                      m_opaque_sp.get(),
4604838131bSGreg Clayton                      arguments,
4614838131bSGreg Clayton                      locals,
4624838131bSGreg Clayton                      statics,
4634838131bSGreg Clayton                      in_scope_only);
464ceb6b139SCaroline Tice 
46530fdc8d8SChris Lattner     SBValueList value_list;
4666611103cSGreg Clayton     if (m_opaque_sp)
46730fdc8d8SChris Lattner     {
46830fdc8d8SChris Lattner         size_t i;
469288bdf9cSGreg Clayton         VariableList *variable_list = m_opaque_sp->GetVariableList(true);
47030fdc8d8SChris Lattner         if (variable_list)
47130fdc8d8SChris Lattner         {
47230fdc8d8SChris Lattner             const size_t num_variables = variable_list->GetSize();
47330fdc8d8SChris Lattner             if (num_variables)
47430fdc8d8SChris Lattner             {
47530fdc8d8SChris Lattner                 for (i = 0; i < num_variables; ++i)
47630fdc8d8SChris Lattner                 {
47730fdc8d8SChris Lattner                     VariableSP variable_sp (variable_list->GetVariableAtIndex(i));
47830fdc8d8SChris Lattner                     if (variable_sp)
47930fdc8d8SChris Lattner                     {
48030fdc8d8SChris Lattner                         bool add_variable = false;
48130fdc8d8SChris Lattner                         switch (variable_sp->GetScope())
48230fdc8d8SChris Lattner                         {
48330fdc8d8SChris Lattner                         case eValueTypeVariableGlobal:
48430fdc8d8SChris Lattner                         case eValueTypeVariableStatic:
48530fdc8d8SChris Lattner                             add_variable = statics;
48630fdc8d8SChris Lattner                             break;
48730fdc8d8SChris Lattner 
48830fdc8d8SChris Lattner                         case eValueTypeVariableArgument:
48930fdc8d8SChris Lattner                             add_variable = arguments;
49030fdc8d8SChris Lattner                             break;
49130fdc8d8SChris Lattner 
49230fdc8d8SChris Lattner                         case eValueTypeVariableLocal:
49330fdc8d8SChris Lattner                             add_variable = locals;
49430fdc8d8SChris Lattner                             break;
495c982c768SGreg Clayton 
496c982c768SGreg Clayton                         default:
497c982c768SGreg Clayton                             break;
49830fdc8d8SChris Lattner                         }
49930fdc8d8SChris Lattner                         if (add_variable)
50030fdc8d8SChris Lattner                         {
5016611103cSGreg Clayton                             if (in_scope_only && !variable_sp->IsInScope(m_opaque_sp.get()))
50230fdc8d8SChris Lattner                                 continue;
50330fdc8d8SChris Lattner 
504288bdf9cSGreg Clayton                             value_list.Append(m_opaque_sp->GetValueObjectForFrameVariable (variable_sp));
50530fdc8d8SChris Lattner                         }
50630fdc8d8SChris Lattner                     }
50730fdc8d8SChris Lattner                 }
50830fdc8d8SChris Lattner             }
50930fdc8d8SChris Lattner         }
51030fdc8d8SChris Lattner     }
511ceb6b139SCaroline Tice 
512ceb6b139SCaroline Tice     if (log)
513ceb6b139SCaroline Tice     {
5144838131bSGreg Clayton         log->Printf ("SBFrame(%p)::GetVariables (...) => SBValueList(%p)", m_opaque_sp.get(),
515750cd175SCaroline Tice                      value_list.get());
516ceb6b139SCaroline Tice     }
517ceb6b139SCaroline Tice 
51830fdc8d8SChris Lattner     return value_list;
51930fdc8d8SChris Lattner }
52030fdc8d8SChris Lattner 
52130fdc8d8SChris Lattner lldb::SBValueList
52230fdc8d8SChris Lattner SBFrame::GetRegisters ()
52330fdc8d8SChris Lattner {
5242d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
525ceb6b139SCaroline Tice 
52630fdc8d8SChris Lattner     SBValueList value_list;
5276611103cSGreg Clayton     if (m_opaque_sp)
52830fdc8d8SChris Lattner     {
5296611103cSGreg Clayton         RegisterContext *reg_ctx = m_opaque_sp->GetRegisterContext();
53030fdc8d8SChris Lattner         if (reg_ctx)
53130fdc8d8SChris Lattner         {
53230fdc8d8SChris Lattner             const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
53330fdc8d8SChris Lattner             for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
53430fdc8d8SChris Lattner             {
5358f92f0a3SGreg Clayton                 value_list.Append(ValueObjectSP (new ValueObjectRegisterSet (NULL, reg_ctx, set_idx)));
53630fdc8d8SChris Lattner             }
53730fdc8d8SChris Lattner         }
53830fdc8d8SChris Lattner     }
539ceb6b139SCaroline Tice 
540ceb6b139SCaroline Tice     if (log)
5414838131bSGreg Clayton         log->Printf ("SBFrame(%p)::Registers () => SBValueList(%p)", m_opaque_sp.get(), value_list.get());
542ceb6b139SCaroline Tice 
54330fdc8d8SChris Lattner     return value_list;
54430fdc8d8SChris Lattner }
54530fdc8d8SChris Lattner 
546dde9cff3SCaroline Tice bool
547dde9cff3SCaroline Tice SBFrame::GetDescription (SBStream &description)
548dde9cff3SCaroline Tice {
549dde9cff3SCaroline Tice     if (m_opaque_sp)
550dde9cff3SCaroline Tice     {
551cfd1acedSGreg Clayton         Stream &s = description.ref();
552cfd1acedSGreg Clayton         m_opaque_sp->DumpUsingSettingsFormat (&s);
553dde9cff3SCaroline Tice     }
554dde9cff3SCaroline Tice     else
555dde9cff3SCaroline Tice         description.Printf ("No value");
556dde9cff3SCaroline Tice 
557dde9cff3SCaroline Tice     return true;
558dde9cff3SCaroline Tice }
5591d3afba3SGreg Clayton 
5601d3afba3SGreg Clayton lldb::SBValue
5611d3afba3SGreg Clayton SBFrame::EvaluateExpression (const char *expr)
5621d3afba3SGreg Clayton {
5632d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
5644838131bSGreg Clayton 
565a162ebafSSean Callanan     LogSP expr_log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS));
566a162ebafSSean Callanan 
567cfd1acedSGreg Clayton     lldb::SBValue expr_result;
5684838131bSGreg Clayton     if (log)
5694838131bSGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\")...", m_opaque_sp.get(), expr);
5704838131bSGreg Clayton 
5711d3afba3SGreg Clayton     if (m_opaque_sp)
5721d3afba3SGreg Clayton     {
573*8b2fe6dcSGreg Clayton         lldb::ExecutionResults exe_results;
574*8b2fe6dcSGreg Clayton         const bool unwind_on_error = true;
575322f529bSSean Callanan 
576*8b2fe6dcSGreg Clayton         exe_results = m_opaque_sp->GetThread().GetProcess().GetTarget().EvaluateExpression(expr, m_opaque_sp.get(), unwind_on_error, *expr_result);
5771d3afba3SGreg Clayton     }
5784838131bSGreg Clayton 
579a162ebafSSean Callanan     if (expr_log)
580a162ebafSSean Callanan         expr_log->Printf("** [SBFrame::EvaluateExpression] Expression result is %s, summary %s **", expr_result.GetValue(*this), expr_result.GetSummary(*this));
581a162ebafSSean Callanan 
5824838131bSGreg Clayton     if (log)
583cfd1acedSGreg Clayton         log->Printf ("SBFrame(%p)::EvaluateExpression (expr=\"%s\") => SBValue(%p)", m_opaque_sp.get(), expr, expr_result.get());
5844838131bSGreg Clayton 
585cfd1acedSGreg Clayton     return expr_result;
5861d3afba3SGreg Clayton }
587