130fdc8d8SChris Lattner //===-- SBBlock.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 
1030fdc8d8SChris Lattner #include "lldb/API/SBBlock.h"
1195897c6aSGreg Clayton #include "lldb/API/SBFileSpec.h"
12dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1330fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
1495897c6aSGreg Clayton #include "lldb/Symbol/Function.h"
15dde9cff3SCaroline Tice #include "lldb/Symbol/SymbolContext.h"
1630fdc8d8SChris Lattner 
1730fdc8d8SChris Lattner using namespace lldb;
1895897c6aSGreg Clayton using namespace lldb_private;
1930fdc8d8SChris Lattner 
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner SBBlock::SBBlock () :
226611103cSGreg Clayton     m_opaque_ptr (NULL)
2330fdc8d8SChris Lattner {
2430fdc8d8SChris Lattner }
2530fdc8d8SChris Lattner 
2630fdc8d8SChris Lattner SBBlock::SBBlock (lldb_private::Block *lldb_object_ptr) :
276611103cSGreg Clayton     m_opaque_ptr (lldb_object_ptr)
2830fdc8d8SChris Lattner {
2930fdc8d8SChris Lattner }
3030fdc8d8SChris Lattner 
31efabb123SGreg Clayton SBBlock::SBBlock(const SBBlock &rhs) :
32efabb123SGreg Clayton     m_opaque_ptr (rhs.m_opaque_ptr)
33efabb123SGreg Clayton {
34efabb123SGreg Clayton }
35efabb123SGreg Clayton 
36efabb123SGreg Clayton const SBBlock &
37efabb123SGreg Clayton SBBlock::operator = (const SBBlock &rhs)
38efabb123SGreg Clayton {
39efabb123SGreg Clayton     m_opaque_ptr = rhs.m_opaque_ptr;
40efabb123SGreg Clayton     return *this;
41efabb123SGreg Clayton }
42efabb123SGreg Clayton 
4330fdc8d8SChris Lattner SBBlock::~SBBlock ()
4430fdc8d8SChris Lattner {
456611103cSGreg Clayton     m_opaque_ptr = NULL;
4630fdc8d8SChris Lattner }
4730fdc8d8SChris Lattner 
4830fdc8d8SChris Lattner bool
4930fdc8d8SChris Lattner SBBlock::IsValid () const
5030fdc8d8SChris Lattner {
516611103cSGreg Clayton     return m_opaque_ptr != NULL;
5230fdc8d8SChris Lattner }
5330fdc8d8SChris Lattner 
5495897c6aSGreg Clayton bool
5595897c6aSGreg Clayton SBBlock::IsInlined () const
5695897c6aSGreg Clayton {
5795897c6aSGreg Clayton     if (m_opaque_ptr)
5895897c6aSGreg Clayton         return m_opaque_ptr->GetInlinedFunctionInfo () != NULL;
5995897c6aSGreg Clayton     return false;
6095897c6aSGreg Clayton }
6195897c6aSGreg Clayton 
6295897c6aSGreg Clayton const char *
6395897c6aSGreg Clayton SBBlock::GetInlinedName () const
6495897c6aSGreg Clayton {
6595897c6aSGreg Clayton     if (m_opaque_ptr)
6695897c6aSGreg Clayton     {
6795897c6aSGreg Clayton         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
6895897c6aSGreg Clayton         if (inlined_info)
6995897c6aSGreg Clayton             return inlined_info->GetName().AsCString (NULL);
7095897c6aSGreg Clayton     }
7195897c6aSGreg Clayton     return NULL;
7295897c6aSGreg Clayton }
7395897c6aSGreg Clayton 
7495897c6aSGreg Clayton SBFileSpec
7595897c6aSGreg Clayton SBBlock::GetInlinedCallSiteFile () const
7695897c6aSGreg Clayton {
7795897c6aSGreg Clayton     SBFileSpec sb_file;
7895897c6aSGreg Clayton     if (m_opaque_ptr)
7995897c6aSGreg Clayton     {
8095897c6aSGreg Clayton         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
8195897c6aSGreg Clayton         if (inlined_info)
8295897c6aSGreg Clayton             sb_file.SetFileSpec (inlined_info->GetCallSite().GetFile());
8395897c6aSGreg Clayton     }
8495897c6aSGreg Clayton     return sb_file;
8595897c6aSGreg Clayton }
8695897c6aSGreg Clayton 
8795897c6aSGreg Clayton uint32_t
8895897c6aSGreg Clayton SBBlock::GetInlinedCallSiteLine () const
8995897c6aSGreg Clayton {
9095897c6aSGreg Clayton     if (m_opaque_ptr)
9195897c6aSGreg Clayton     {
9295897c6aSGreg Clayton         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
9395897c6aSGreg Clayton         if (inlined_info)
9495897c6aSGreg Clayton             return inlined_info->GetCallSite().GetLine();
9595897c6aSGreg Clayton     }
9695897c6aSGreg Clayton     return 0;
9795897c6aSGreg Clayton }
9895897c6aSGreg Clayton 
9995897c6aSGreg Clayton uint32_t
10095897c6aSGreg Clayton SBBlock::GetInlinedCallSiteColumn () const
10195897c6aSGreg Clayton {
10295897c6aSGreg Clayton     if (m_opaque_ptr)
10395897c6aSGreg Clayton     {
10495897c6aSGreg Clayton         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
10595897c6aSGreg Clayton         if (inlined_info)
10695897c6aSGreg Clayton             return inlined_info->GetCallSite().GetColumn();
10795897c6aSGreg Clayton     }
10895897c6aSGreg Clayton     return 0;
10995897c6aSGreg Clayton }
11095897c6aSGreg Clayton 
11130fdc8d8SChris Lattner void
11230fdc8d8SChris Lattner SBBlock::AppendVariables (bool can_create, bool get_parent_variables, lldb_private::VariableList *var_list)
11330fdc8d8SChris Lattner {
11430fdc8d8SChris Lattner     if (IsValid())
11530fdc8d8SChris Lattner     {
1161b72fcb7SGreg Clayton         bool show_inline = true;
1171b72fcb7SGreg Clayton         m_opaque_ptr->AppendVariables (can_create, get_parent_variables, show_inline, var_list);
11830fdc8d8SChris Lattner     }
11930fdc8d8SChris Lattner }
12030fdc8d8SChris Lattner 
12195897c6aSGreg Clayton SBBlock
12295897c6aSGreg Clayton SBBlock::GetParent ()
12395897c6aSGreg Clayton {
12495897c6aSGreg Clayton     SBBlock sb_block;
12595897c6aSGreg Clayton     if (m_opaque_ptr)
12695897c6aSGreg Clayton         sb_block.m_opaque_ptr = m_opaque_ptr->GetParent();
12795897c6aSGreg Clayton     return sb_block;
12895897c6aSGreg Clayton }
12995897c6aSGreg Clayton 
13095897c6aSGreg Clayton SBBlock
13195897c6aSGreg Clayton SBBlock::GetSibling ()
13295897c6aSGreg Clayton {
13395897c6aSGreg Clayton     SBBlock sb_block;
13495897c6aSGreg Clayton     if (m_opaque_ptr)
13595897c6aSGreg Clayton         sb_block.m_opaque_ptr = m_opaque_ptr->GetSibling();
13695897c6aSGreg Clayton     return sb_block;
13795897c6aSGreg Clayton }
13895897c6aSGreg Clayton 
13995897c6aSGreg Clayton SBBlock
14095897c6aSGreg Clayton SBBlock::GetFirstChild ()
14195897c6aSGreg Clayton {
14295897c6aSGreg Clayton     SBBlock sb_block;
14395897c6aSGreg Clayton     if (m_opaque_ptr)
14495897c6aSGreg Clayton         sb_block.m_opaque_ptr = m_opaque_ptr->GetFirstChild();
14595897c6aSGreg Clayton     return sb_block;
14695897c6aSGreg Clayton }
14795897c6aSGreg Clayton 
1484838131bSGreg Clayton const lldb_private::Block *
1494838131bSGreg Clayton SBBlock::get () const
1504838131bSGreg Clayton {
1514838131bSGreg Clayton     return m_opaque_ptr;
1524838131bSGreg Clayton }
1534838131bSGreg Clayton 
154*72eff18aSGreg Clayton void
155*72eff18aSGreg Clayton SBBlock::reset (lldb_private::Block *block)
156*72eff18aSGreg Clayton {
157*72eff18aSGreg Clayton     m_opaque_ptr = block;
158*72eff18aSGreg Clayton }
15930fdc8d8SChris Lattner 
160dde9cff3SCaroline Tice bool
161dde9cff3SCaroline Tice SBBlock::GetDescription (SBStream &description)
162dde9cff3SCaroline Tice {
163dde9cff3SCaroline Tice     if (m_opaque_ptr)
164dde9cff3SCaroline Tice     {
165dde9cff3SCaroline Tice         lldb::user_id_t id = m_opaque_ptr->GetID();
166dde9cff3SCaroline Tice         description.Printf ("Block: {id: %d} ", id);
167dde9cff3SCaroline Tice         if (IsInlined())
168dde9cff3SCaroline Tice         {
169dde9cff3SCaroline Tice             description.Printf (" (inlined, '%s') ", GetInlinedName());
170dde9cff3SCaroline Tice         }
171dde9cff3SCaroline Tice         lldb_private::SymbolContext sc;
172dde9cff3SCaroline Tice         m_opaque_ptr->CalculateSymbolContext (&sc);
173dde9cff3SCaroline Tice         if (sc.function)
174dde9cff3SCaroline Tice         {
175dde9cff3SCaroline Tice             m_opaque_ptr->DumpAddressRanges (description.get(),
176dde9cff3SCaroline Tice                                              sc.function->GetAddressRange().GetBaseAddress().GetFileAddress());
177dde9cff3SCaroline Tice         }
178dde9cff3SCaroline Tice     }
179dde9cff3SCaroline Tice     else
180dde9cff3SCaroline Tice         description.Printf ("No value");
18130fdc8d8SChris Lattner 
182dde9cff3SCaroline Tice     return true;
183dde9cff3SCaroline Tice }
184