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"
12*dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
1330fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
1495897c6aSGreg Clayton #include "lldb/Symbol/Function.h"
15*dde9cff3SCaroline 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 
3130fdc8d8SChris Lattner SBBlock::~SBBlock ()
3230fdc8d8SChris Lattner {
336611103cSGreg Clayton     m_opaque_ptr = NULL;
3430fdc8d8SChris Lattner }
3530fdc8d8SChris Lattner 
3630fdc8d8SChris Lattner bool
3730fdc8d8SChris Lattner SBBlock::IsValid () const
3830fdc8d8SChris Lattner {
396611103cSGreg Clayton     return m_opaque_ptr != NULL;
4030fdc8d8SChris Lattner }
4130fdc8d8SChris Lattner 
4295897c6aSGreg Clayton bool
4395897c6aSGreg Clayton SBBlock::IsInlined () const
4495897c6aSGreg Clayton {
4595897c6aSGreg Clayton     if (m_opaque_ptr)
4695897c6aSGreg Clayton         return m_opaque_ptr->GetInlinedFunctionInfo () != NULL;
4795897c6aSGreg Clayton     return false;
4895897c6aSGreg Clayton }
4995897c6aSGreg Clayton 
5095897c6aSGreg Clayton const char *
5195897c6aSGreg Clayton SBBlock::GetInlinedName () const
5295897c6aSGreg Clayton {
5395897c6aSGreg Clayton     if (m_opaque_ptr)
5495897c6aSGreg Clayton     {
5595897c6aSGreg Clayton         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
5695897c6aSGreg Clayton         if (inlined_info)
5795897c6aSGreg Clayton             return inlined_info->GetName().AsCString (NULL);
5895897c6aSGreg Clayton     }
5995897c6aSGreg Clayton     return NULL;
6095897c6aSGreg Clayton }
6195897c6aSGreg Clayton 
6295897c6aSGreg Clayton SBFileSpec
6395897c6aSGreg Clayton SBBlock::GetInlinedCallSiteFile () const
6495897c6aSGreg Clayton {
6595897c6aSGreg Clayton     SBFileSpec sb_file;
6695897c6aSGreg Clayton     if (m_opaque_ptr)
6795897c6aSGreg Clayton     {
6895897c6aSGreg Clayton         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
6995897c6aSGreg Clayton         if (inlined_info)
7095897c6aSGreg Clayton             sb_file.SetFileSpec (inlined_info->GetCallSite().GetFile());
7195897c6aSGreg Clayton     }
7295897c6aSGreg Clayton     return sb_file;
7395897c6aSGreg Clayton }
7495897c6aSGreg Clayton 
7595897c6aSGreg Clayton uint32_t
7695897c6aSGreg Clayton SBBlock::GetInlinedCallSiteLine () const
7795897c6aSGreg Clayton {
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             return inlined_info->GetCallSite().GetLine();
8395897c6aSGreg Clayton     }
8495897c6aSGreg Clayton     return 0;
8595897c6aSGreg Clayton }
8695897c6aSGreg Clayton 
8795897c6aSGreg Clayton uint32_t
8895897c6aSGreg Clayton SBBlock::GetInlinedCallSiteColumn () 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().GetColumn();
9595897c6aSGreg Clayton     }
9695897c6aSGreg Clayton     return 0;
9795897c6aSGreg Clayton }
9895897c6aSGreg Clayton 
9930fdc8d8SChris Lattner void
10030fdc8d8SChris Lattner SBBlock::AppendVariables (bool can_create, bool get_parent_variables, lldb_private::VariableList *var_list)
10130fdc8d8SChris Lattner {
10230fdc8d8SChris Lattner     if (IsValid())
10330fdc8d8SChris Lattner     {
1041b72fcb7SGreg Clayton         bool show_inline = true;
1051b72fcb7SGreg Clayton         m_opaque_ptr->AppendVariables (can_create, get_parent_variables, show_inline, var_list);
10630fdc8d8SChris Lattner     }
10730fdc8d8SChris Lattner }
10830fdc8d8SChris Lattner 
10995897c6aSGreg Clayton SBBlock
11095897c6aSGreg Clayton SBBlock::GetParent ()
11195897c6aSGreg Clayton {
11295897c6aSGreg Clayton     SBBlock sb_block;
11395897c6aSGreg Clayton     if (m_opaque_ptr)
11495897c6aSGreg Clayton         sb_block.m_opaque_ptr = m_opaque_ptr->GetParent();
11595897c6aSGreg Clayton     return sb_block;
11695897c6aSGreg Clayton }
11795897c6aSGreg Clayton 
11895897c6aSGreg Clayton SBBlock
11995897c6aSGreg Clayton SBBlock::GetSibling ()
12095897c6aSGreg Clayton {
12195897c6aSGreg Clayton     SBBlock sb_block;
12295897c6aSGreg Clayton     if (m_opaque_ptr)
12395897c6aSGreg Clayton         sb_block.m_opaque_ptr = m_opaque_ptr->GetSibling();
12495897c6aSGreg Clayton     return sb_block;
12595897c6aSGreg Clayton }
12695897c6aSGreg Clayton 
12795897c6aSGreg Clayton SBBlock
12895897c6aSGreg Clayton SBBlock::GetFirstChild ()
12995897c6aSGreg Clayton {
13095897c6aSGreg Clayton     SBBlock sb_block;
13195897c6aSGreg Clayton     if (m_opaque_ptr)
13295897c6aSGreg Clayton         sb_block.m_opaque_ptr = m_opaque_ptr->GetFirstChild();
13395897c6aSGreg Clayton     return sb_block;
13495897c6aSGreg Clayton }
13595897c6aSGreg Clayton 
13630fdc8d8SChris Lattner 
137*dde9cff3SCaroline Tice bool
138*dde9cff3SCaroline Tice SBBlock::GetDescription (SBStream &description)
139*dde9cff3SCaroline Tice {
140*dde9cff3SCaroline Tice     if (m_opaque_ptr)
141*dde9cff3SCaroline Tice       {
142*dde9cff3SCaroline Tice         lldb::user_id_t id = m_opaque_ptr->GetID();
143*dde9cff3SCaroline Tice         description.Printf ("Block: {id: %d} ", id);
144*dde9cff3SCaroline Tice         if (IsInlined())
145*dde9cff3SCaroline Tice           {
146*dde9cff3SCaroline Tice             description.Printf (" (inlined, '%s') ", GetInlinedName());
147*dde9cff3SCaroline Tice           }
148*dde9cff3SCaroline Tice         lldb_private::SymbolContext sc;
149*dde9cff3SCaroline Tice         m_opaque_ptr->CalculateSymbolContext (&sc);
150*dde9cff3SCaroline Tice         if (sc.function)
151*dde9cff3SCaroline Tice           {
152*dde9cff3SCaroline Tice             m_opaque_ptr->DumpAddressRanges (description.get(),
153*dde9cff3SCaroline Tice                                              sc.function->GetAddressRange().GetBaseAddress().GetFileAddress());
154*dde9cff3SCaroline Tice           }
155*dde9cff3SCaroline Tice       }
156*dde9cff3SCaroline Tice     else
157*dde9cff3SCaroline Tice         description.Printf ("No value");
15830fdc8d8SChris Lattner 
159*dde9cff3SCaroline Tice     return true;
160*dde9cff3SCaroline Tice }
161*dde9cff3SCaroline Tice 
162*dde9cff3SCaroline Tice PyObject *
163*dde9cff3SCaroline Tice SBBlock::__repr__ ()
164*dde9cff3SCaroline Tice {
165*dde9cff3SCaroline Tice     SBStream description;
166*dde9cff3SCaroline Tice     description.ref();
167*dde9cff3SCaroline Tice     GetDescription (description);
168*dde9cff3SCaroline Tice     return PyString_FromString (description.GetData());
169*dde9cff3SCaroline Tice }
170