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 { 174*da7bc7d0SGreg Clayton Stream &strm = description.ref(); 175*da7bc7d0SGreg Clayton 176dde9cff3SCaroline Tice if (m_opaque_ptr) 177dde9cff3SCaroline Tice { 178dde9cff3SCaroline Tice lldb::user_id_t id = m_opaque_ptr->GetID(); 179*da7bc7d0SGreg Clayton strm.Printf ("Block: {id: %llu} ", id); 180dde9cff3SCaroline Tice if (IsInlined()) 181dde9cff3SCaroline Tice { 182*da7bc7d0SGreg Clayton strm.Printf (" (inlined, '%s') ", GetInlinedName()); 183dde9cff3SCaroline Tice } 184dde9cff3SCaroline Tice lldb_private::SymbolContext sc; 185dde9cff3SCaroline Tice m_opaque_ptr->CalculateSymbolContext (&sc); 186dde9cff3SCaroline Tice if (sc.function) 187dde9cff3SCaroline Tice { 188*da7bc7d0SGreg Clayton m_opaque_ptr->DumpAddressRanges (&strm, 189dde9cff3SCaroline Tice sc.function->GetAddressRange().GetBaseAddress().GetFileAddress()); 190dde9cff3SCaroline Tice } 191dde9cff3SCaroline Tice } 192dde9cff3SCaroline Tice else 193*da7bc7d0SGreg Clayton strm.PutCString ("No value"); 19430fdc8d8SChris Lattner 195dde9cff3SCaroline Tice return true; 196dde9cff3SCaroline Tice } 1978f7180b1SGreg Clayton 1988f7180b1SGreg Clayton uint32_t 1998f7180b1SGreg Clayton SBBlock::GetNumRanges () 2008f7180b1SGreg Clayton { 2018f7180b1SGreg Clayton if (m_opaque_ptr) 2028f7180b1SGreg Clayton return m_opaque_ptr->GetNumRanges(); 2038f7180b1SGreg Clayton return 0; 2048f7180b1SGreg Clayton } 2058f7180b1SGreg Clayton 2068f7180b1SGreg Clayton lldb::SBAddress 2078f7180b1SGreg Clayton SBBlock::GetRangeStartAddress (uint32_t idx) 2088f7180b1SGreg Clayton { 2098f7180b1SGreg Clayton lldb::SBAddress sb_addr; 2108f7180b1SGreg Clayton if (m_opaque_ptr) 2118f7180b1SGreg Clayton { 2128f7180b1SGreg Clayton AddressRange range; 2138f7180b1SGreg Clayton if (m_opaque_ptr->GetRangeAtIndex(idx, range)) 2148f7180b1SGreg Clayton { 2158f7180b1SGreg Clayton sb_addr.ref() = range.GetBaseAddress(); 2168f7180b1SGreg Clayton } 2178f7180b1SGreg Clayton } 2188f7180b1SGreg Clayton return sb_addr; 2198f7180b1SGreg Clayton } 2208f7180b1SGreg Clayton 2218f7180b1SGreg Clayton lldb::SBAddress 2228f7180b1SGreg Clayton SBBlock::GetRangeEndAddress (uint32_t idx) 2238f7180b1SGreg Clayton { 2248f7180b1SGreg Clayton lldb::SBAddress sb_addr; 2258f7180b1SGreg Clayton if (m_opaque_ptr) 2268f7180b1SGreg Clayton { 2278f7180b1SGreg Clayton AddressRange range; 2288f7180b1SGreg Clayton if (m_opaque_ptr->GetRangeAtIndex(idx, range)) 2298f7180b1SGreg Clayton { 2308f7180b1SGreg Clayton sb_addr.ref() = range.GetBaseAddress(); 2318f7180b1SGreg Clayton sb_addr.ref().Slide(range.GetByteSize()); 2328f7180b1SGreg Clayton } 2338f7180b1SGreg Clayton } 2348f7180b1SGreg Clayton return sb_addr; 2358f7180b1SGreg Clayton } 2368f7180b1SGreg Clayton 2378f7180b1SGreg Clayton uint32_t 2388f7180b1SGreg Clayton SBBlock::GetRangeIndexForBlockAddress (lldb::SBAddress block_addr) 2398f7180b1SGreg Clayton { 2408f7180b1SGreg Clayton if (m_opaque_ptr && block_addr.IsValid()) 2418f7180b1SGreg Clayton { 242ea3e7d5cSGreg Clayton return m_opaque_ptr->GetRangeIndexContainingAddress (block_addr.ref()); 2438f7180b1SGreg Clayton } 2448f7180b1SGreg Clayton 2458f7180b1SGreg Clayton return UINT32_MAX; 2468f7180b1SGreg Clayton } 2478f7180b1SGreg Clayton 248