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"
118f7180b1SGreg Clayton #include "lldb/API/SBAddress.h"
1295897c6aSGreg Clayton #include "lldb/API/SBFileSpec.h"
13dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
148f7180b1SGreg Clayton #include "lldb/Core/AddressRange.h"
1530fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
1695897c6aSGreg Clayton #include "lldb/Symbol/Function.h"
17dde9cff3SCaroline Tice #include "lldb/Symbol/SymbolContext.h"
1830fdc8d8SChris Lattner 
1930fdc8d8SChris Lattner using namespace lldb;
2095897c6aSGreg Clayton using namespace lldb_private;
2130fdc8d8SChris Lattner 
2230fdc8d8SChris Lattner 
2330fdc8d8SChris Lattner SBBlock::SBBlock () :
246611103cSGreg Clayton     m_opaque_ptr (NULL)
2530fdc8d8SChris Lattner {
2630fdc8d8SChris Lattner }
2730fdc8d8SChris Lattner 
2830fdc8d8SChris Lattner SBBlock::SBBlock (lldb_private::Block *lldb_object_ptr) :
296611103cSGreg Clayton     m_opaque_ptr (lldb_object_ptr)
3030fdc8d8SChris Lattner {
3130fdc8d8SChris Lattner }
3230fdc8d8SChris Lattner 
33efabb123SGreg Clayton SBBlock::SBBlock(const SBBlock &rhs) :
34efabb123SGreg Clayton     m_opaque_ptr (rhs.m_opaque_ptr)
35efabb123SGreg Clayton {
36efabb123SGreg Clayton }
37efabb123SGreg Clayton 
38efabb123SGreg Clayton const SBBlock &
39efabb123SGreg Clayton SBBlock::operator = (const SBBlock &rhs)
40efabb123SGreg Clayton {
41efabb123SGreg Clayton     m_opaque_ptr = rhs.m_opaque_ptr;
42efabb123SGreg Clayton     return *this;
43efabb123SGreg Clayton }
44efabb123SGreg Clayton 
4530fdc8d8SChris Lattner SBBlock::~SBBlock ()
4630fdc8d8SChris Lattner {
476611103cSGreg Clayton     m_opaque_ptr = NULL;
4830fdc8d8SChris Lattner }
4930fdc8d8SChris Lattner 
5030fdc8d8SChris Lattner bool
5130fdc8d8SChris Lattner SBBlock::IsValid () const
5230fdc8d8SChris Lattner {
536611103cSGreg Clayton     return m_opaque_ptr != NULL;
5430fdc8d8SChris Lattner }
5530fdc8d8SChris Lattner 
5695897c6aSGreg Clayton bool
5795897c6aSGreg Clayton SBBlock::IsInlined () const
5895897c6aSGreg Clayton {
5995897c6aSGreg Clayton     if (m_opaque_ptr)
6095897c6aSGreg Clayton         return m_opaque_ptr->GetInlinedFunctionInfo () != NULL;
6195897c6aSGreg Clayton     return false;
6295897c6aSGreg Clayton }
6395897c6aSGreg Clayton 
6495897c6aSGreg Clayton const char *
6595897c6aSGreg Clayton SBBlock::GetInlinedName () const
6695897c6aSGreg Clayton {
6795897c6aSGreg Clayton     if (m_opaque_ptr)
6895897c6aSGreg Clayton     {
6995897c6aSGreg Clayton         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
7095897c6aSGreg Clayton         if (inlined_info)
7195897c6aSGreg Clayton             return inlined_info->GetName().AsCString (NULL);
7295897c6aSGreg Clayton     }
7395897c6aSGreg Clayton     return NULL;
7495897c6aSGreg Clayton }
7595897c6aSGreg Clayton 
7695897c6aSGreg Clayton SBFileSpec
7795897c6aSGreg Clayton SBBlock::GetInlinedCallSiteFile () const
7895897c6aSGreg Clayton {
7995897c6aSGreg Clayton     SBFileSpec sb_file;
8095897c6aSGreg Clayton     if (m_opaque_ptr)
8195897c6aSGreg Clayton     {
8295897c6aSGreg Clayton         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
8395897c6aSGreg Clayton         if (inlined_info)
8495897c6aSGreg Clayton             sb_file.SetFileSpec (inlined_info->GetCallSite().GetFile());
8595897c6aSGreg Clayton     }
8695897c6aSGreg Clayton     return sb_file;
8795897c6aSGreg Clayton }
8895897c6aSGreg Clayton 
8995897c6aSGreg Clayton uint32_t
9095897c6aSGreg Clayton SBBlock::GetInlinedCallSiteLine () const
9195897c6aSGreg Clayton {
9295897c6aSGreg Clayton     if (m_opaque_ptr)
9395897c6aSGreg Clayton     {
9495897c6aSGreg Clayton         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
9595897c6aSGreg Clayton         if (inlined_info)
9695897c6aSGreg Clayton             return inlined_info->GetCallSite().GetLine();
9795897c6aSGreg Clayton     }
9895897c6aSGreg Clayton     return 0;
9995897c6aSGreg Clayton }
10095897c6aSGreg Clayton 
10195897c6aSGreg Clayton uint32_t
10295897c6aSGreg Clayton SBBlock::GetInlinedCallSiteColumn () const
10395897c6aSGreg Clayton {
10495897c6aSGreg Clayton     if (m_opaque_ptr)
10595897c6aSGreg Clayton     {
10695897c6aSGreg Clayton         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
10795897c6aSGreg Clayton         if (inlined_info)
10895897c6aSGreg Clayton             return inlined_info->GetCallSite().GetColumn();
10995897c6aSGreg Clayton     }
11095897c6aSGreg Clayton     return 0;
11195897c6aSGreg Clayton }
11295897c6aSGreg Clayton 
11330fdc8d8SChris Lattner void
11430fdc8d8SChris Lattner SBBlock::AppendVariables (bool can_create, bool get_parent_variables, lldb_private::VariableList *var_list)
11530fdc8d8SChris Lattner {
11630fdc8d8SChris Lattner     if (IsValid())
11730fdc8d8SChris Lattner     {
1181b72fcb7SGreg Clayton         bool show_inline = true;
1191b72fcb7SGreg Clayton         m_opaque_ptr->AppendVariables (can_create, get_parent_variables, show_inline, var_list);
12030fdc8d8SChris Lattner     }
12130fdc8d8SChris Lattner }
12230fdc8d8SChris Lattner 
12395897c6aSGreg Clayton SBBlock
12495897c6aSGreg Clayton SBBlock::GetParent ()
12595897c6aSGreg Clayton {
12695897c6aSGreg Clayton     SBBlock sb_block;
12795897c6aSGreg Clayton     if (m_opaque_ptr)
12895897c6aSGreg Clayton         sb_block.m_opaque_ptr = m_opaque_ptr->GetParent();
12995897c6aSGreg Clayton     return sb_block;
13095897c6aSGreg Clayton }
13195897c6aSGreg Clayton 
1328f7180b1SGreg Clayton lldb::SBBlock
1338f7180b1SGreg Clayton SBBlock::GetContainingInlinedBlock  ()
1348f7180b1SGreg Clayton {
1358f7180b1SGreg Clayton     SBBlock sb_block;
1368f7180b1SGreg Clayton     if (m_opaque_ptr)
1378f7180b1SGreg Clayton         sb_block.m_opaque_ptr = m_opaque_ptr->GetContainingInlinedBlock ();
1388f7180b1SGreg Clayton     return sb_block;
1398f7180b1SGreg Clayton }
1408f7180b1SGreg Clayton 
14195897c6aSGreg Clayton SBBlock
14295897c6aSGreg Clayton SBBlock::GetSibling ()
14395897c6aSGreg Clayton {
14495897c6aSGreg Clayton     SBBlock sb_block;
14595897c6aSGreg Clayton     if (m_opaque_ptr)
14695897c6aSGreg Clayton         sb_block.m_opaque_ptr = m_opaque_ptr->GetSibling();
14795897c6aSGreg Clayton     return sb_block;
14895897c6aSGreg Clayton }
14995897c6aSGreg Clayton 
15095897c6aSGreg Clayton SBBlock
15195897c6aSGreg Clayton SBBlock::GetFirstChild ()
15295897c6aSGreg Clayton {
15395897c6aSGreg Clayton     SBBlock sb_block;
15495897c6aSGreg Clayton     if (m_opaque_ptr)
15595897c6aSGreg Clayton         sb_block.m_opaque_ptr = m_opaque_ptr->GetFirstChild();
15695897c6aSGreg Clayton     return sb_block;
15795897c6aSGreg Clayton }
15895897c6aSGreg Clayton 
1598f7180b1SGreg Clayton lldb_private::Block *
1608f7180b1SGreg Clayton SBBlock::get ()
1614838131bSGreg Clayton {
1624838131bSGreg Clayton     return m_opaque_ptr;
1634838131bSGreg Clayton }
1644838131bSGreg Clayton 
16572eff18aSGreg Clayton void
16672eff18aSGreg Clayton SBBlock::reset (lldb_private::Block *block)
16772eff18aSGreg Clayton {
16872eff18aSGreg Clayton     m_opaque_ptr = block;
16972eff18aSGreg Clayton }
17030fdc8d8SChris Lattner 
171dde9cff3SCaroline Tice bool
172dde9cff3SCaroline Tice SBBlock::GetDescription (SBStream &description)
173dde9cff3SCaroline Tice {
174dde9cff3SCaroline Tice     if (m_opaque_ptr)
175dde9cff3SCaroline Tice     {
176dde9cff3SCaroline Tice         lldb::user_id_t id = m_opaque_ptr->GetID();
177dde9cff3SCaroline Tice         description.Printf ("Block: {id: %d} ", id);
178dde9cff3SCaroline Tice         if (IsInlined())
179dde9cff3SCaroline Tice         {
180dde9cff3SCaroline Tice             description.Printf (" (inlined, '%s') ", GetInlinedName());
181dde9cff3SCaroline Tice         }
182dde9cff3SCaroline Tice         lldb_private::SymbolContext sc;
183dde9cff3SCaroline Tice         m_opaque_ptr->CalculateSymbolContext (&sc);
184dde9cff3SCaroline Tice         if (sc.function)
185dde9cff3SCaroline Tice         {
186dde9cff3SCaroline Tice             m_opaque_ptr->DumpAddressRanges (description.get(),
187dde9cff3SCaroline Tice                                              sc.function->GetAddressRange().GetBaseAddress().GetFileAddress());
188dde9cff3SCaroline Tice         }
189dde9cff3SCaroline Tice     }
190dde9cff3SCaroline Tice     else
191dde9cff3SCaroline Tice         description.Printf ("No value");
19230fdc8d8SChris Lattner 
193dde9cff3SCaroline Tice     return true;
194dde9cff3SCaroline Tice }
1958f7180b1SGreg Clayton 
1968f7180b1SGreg Clayton uint32_t
1978f7180b1SGreg Clayton SBBlock::GetNumRanges ()
1988f7180b1SGreg Clayton {
1998f7180b1SGreg Clayton     if (m_opaque_ptr)
2008f7180b1SGreg Clayton         return m_opaque_ptr->GetNumRanges();
2018f7180b1SGreg Clayton     return 0;
2028f7180b1SGreg Clayton }
2038f7180b1SGreg Clayton 
2048f7180b1SGreg Clayton lldb::SBAddress
2058f7180b1SGreg Clayton SBBlock::GetRangeStartAddress (uint32_t idx)
2068f7180b1SGreg Clayton {
2078f7180b1SGreg Clayton     lldb::SBAddress sb_addr;
2088f7180b1SGreg Clayton     if (m_opaque_ptr)
2098f7180b1SGreg Clayton     {
2108f7180b1SGreg Clayton         AddressRange range;
2118f7180b1SGreg Clayton         if (m_opaque_ptr->GetRangeAtIndex(idx, range))
2128f7180b1SGreg Clayton         {
2138f7180b1SGreg Clayton             sb_addr.ref() = range.GetBaseAddress();
2148f7180b1SGreg Clayton         }
2158f7180b1SGreg Clayton     }
2168f7180b1SGreg Clayton     return sb_addr;
2178f7180b1SGreg Clayton }
2188f7180b1SGreg Clayton 
2198f7180b1SGreg Clayton lldb::SBAddress
2208f7180b1SGreg Clayton SBBlock::GetRangeEndAddress (uint32_t idx)
2218f7180b1SGreg Clayton {
2228f7180b1SGreg Clayton     lldb::SBAddress sb_addr;
2238f7180b1SGreg Clayton     if (m_opaque_ptr)
2248f7180b1SGreg Clayton     {
2258f7180b1SGreg Clayton         AddressRange range;
2268f7180b1SGreg Clayton         if (m_opaque_ptr->GetRangeAtIndex(idx, range))
2278f7180b1SGreg Clayton         {
2288f7180b1SGreg Clayton             sb_addr.ref() = range.GetBaseAddress();
2298f7180b1SGreg Clayton             sb_addr.ref().Slide(range.GetByteSize());
2308f7180b1SGreg Clayton         }
2318f7180b1SGreg Clayton     }
2328f7180b1SGreg Clayton     return sb_addr;
2338f7180b1SGreg Clayton }
2348f7180b1SGreg Clayton 
2358f7180b1SGreg Clayton uint32_t
2368f7180b1SGreg Clayton SBBlock::GetRangeIndexForBlockAddress (lldb::SBAddress block_addr)
2378f7180b1SGreg Clayton {
2388f7180b1SGreg Clayton     if (m_opaque_ptr && block_addr.IsValid())
2398f7180b1SGreg Clayton     {
240*ea3e7d5cSGreg Clayton         return m_opaque_ptr->GetRangeIndexContainingAddress (block_addr.ref());
2418f7180b1SGreg Clayton     }
2428f7180b1SGreg Clayton 
2438f7180b1SGreg Clayton     return UINT32_MAX;
2448f7180b1SGreg Clayton }
2458f7180b1SGreg Clayton 
246