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