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" 13*5569e64eSGreg Clayton #include "lldb/API/SBFrame.h" 14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 15*5569e64eSGreg Clayton #include "lldb/API/SBValue.h" 168f7180b1SGreg Clayton #include "lldb/Core/AddressRange.h" 17*5569e64eSGreg Clayton #include "lldb/Core/Log.h" 18*5569e64eSGreg Clayton #include "lldb/Core/ValueObjectVariable.h" 1930fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 2095897c6aSGreg Clayton #include "lldb/Symbol/Function.h" 21dde9cff3SCaroline Tice #include "lldb/Symbol/SymbolContext.h" 22*5569e64eSGreg Clayton #include "lldb/Symbol/VariableList.h" 23*5569e64eSGreg Clayton #include "lldb/Target/StackFrame.h" 24*5569e64eSGreg Clayton #include "lldb/Target/Target.h" 2530fdc8d8SChris Lattner 2630fdc8d8SChris Lattner using namespace lldb; 2795897c6aSGreg Clayton using namespace lldb_private; 2830fdc8d8SChris Lattner 2930fdc8d8SChris Lattner 3030fdc8d8SChris Lattner SBBlock::SBBlock () : 316611103cSGreg Clayton m_opaque_ptr (NULL) 3230fdc8d8SChris Lattner { 3330fdc8d8SChris Lattner } 3430fdc8d8SChris Lattner 3530fdc8d8SChris Lattner SBBlock::SBBlock (lldb_private::Block *lldb_object_ptr) : 366611103cSGreg Clayton m_opaque_ptr (lldb_object_ptr) 3730fdc8d8SChris Lattner { 3830fdc8d8SChris Lattner } 3930fdc8d8SChris Lattner 40efabb123SGreg Clayton SBBlock::SBBlock(const SBBlock &rhs) : 41efabb123SGreg Clayton m_opaque_ptr (rhs.m_opaque_ptr) 42efabb123SGreg Clayton { 43efabb123SGreg Clayton } 44efabb123SGreg Clayton 45efabb123SGreg Clayton const SBBlock & 46efabb123SGreg Clayton SBBlock::operator = (const SBBlock &rhs) 47efabb123SGreg Clayton { 48efabb123SGreg Clayton m_opaque_ptr = rhs.m_opaque_ptr; 49efabb123SGreg Clayton return *this; 50efabb123SGreg Clayton } 51efabb123SGreg Clayton 5230fdc8d8SChris Lattner SBBlock::~SBBlock () 5330fdc8d8SChris Lattner { 546611103cSGreg Clayton m_opaque_ptr = NULL; 5530fdc8d8SChris Lattner } 5630fdc8d8SChris Lattner 5730fdc8d8SChris Lattner bool 5830fdc8d8SChris Lattner SBBlock::IsValid () const 5930fdc8d8SChris Lattner { 606611103cSGreg Clayton return m_opaque_ptr != NULL; 6130fdc8d8SChris Lattner } 6230fdc8d8SChris Lattner 6395897c6aSGreg Clayton bool 6495897c6aSGreg Clayton SBBlock::IsInlined () const 6595897c6aSGreg Clayton { 6695897c6aSGreg Clayton if (m_opaque_ptr) 6795897c6aSGreg Clayton return m_opaque_ptr->GetInlinedFunctionInfo () != NULL; 6895897c6aSGreg Clayton return false; 6995897c6aSGreg Clayton } 7095897c6aSGreg Clayton 7195897c6aSGreg Clayton const char * 7295897c6aSGreg Clayton SBBlock::GetInlinedName () const 7395897c6aSGreg Clayton { 7495897c6aSGreg Clayton if (m_opaque_ptr) 7595897c6aSGreg Clayton { 7695897c6aSGreg Clayton const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo (); 7795897c6aSGreg Clayton if (inlined_info) 7895897c6aSGreg Clayton return inlined_info->GetName().AsCString (NULL); 7995897c6aSGreg Clayton } 8095897c6aSGreg Clayton return NULL; 8195897c6aSGreg Clayton } 8295897c6aSGreg Clayton 8395897c6aSGreg Clayton SBFileSpec 8495897c6aSGreg Clayton SBBlock::GetInlinedCallSiteFile () const 8595897c6aSGreg Clayton { 8695897c6aSGreg Clayton SBFileSpec sb_file; 8795897c6aSGreg Clayton if (m_opaque_ptr) 8895897c6aSGreg Clayton { 8995897c6aSGreg Clayton const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo (); 9095897c6aSGreg Clayton if (inlined_info) 9195897c6aSGreg Clayton sb_file.SetFileSpec (inlined_info->GetCallSite().GetFile()); 9295897c6aSGreg Clayton } 9395897c6aSGreg Clayton return sb_file; 9495897c6aSGreg Clayton } 9595897c6aSGreg Clayton 9695897c6aSGreg Clayton uint32_t 9795897c6aSGreg Clayton SBBlock::GetInlinedCallSiteLine () const 9895897c6aSGreg Clayton { 9995897c6aSGreg Clayton if (m_opaque_ptr) 10095897c6aSGreg Clayton { 10195897c6aSGreg Clayton const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo (); 10295897c6aSGreg Clayton if (inlined_info) 10395897c6aSGreg Clayton return inlined_info->GetCallSite().GetLine(); 10495897c6aSGreg Clayton } 10595897c6aSGreg Clayton return 0; 10695897c6aSGreg Clayton } 10795897c6aSGreg Clayton 10895897c6aSGreg Clayton uint32_t 10995897c6aSGreg Clayton SBBlock::GetInlinedCallSiteColumn () const 11095897c6aSGreg Clayton { 11195897c6aSGreg Clayton if (m_opaque_ptr) 11295897c6aSGreg Clayton { 11395897c6aSGreg Clayton const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo (); 11495897c6aSGreg Clayton if (inlined_info) 11595897c6aSGreg Clayton return inlined_info->GetCallSite().GetColumn(); 11695897c6aSGreg Clayton } 11795897c6aSGreg Clayton return 0; 11895897c6aSGreg Clayton } 11995897c6aSGreg Clayton 12030fdc8d8SChris Lattner void 12130fdc8d8SChris Lattner SBBlock::AppendVariables (bool can_create, bool get_parent_variables, lldb_private::VariableList *var_list) 12230fdc8d8SChris Lattner { 12330fdc8d8SChris Lattner if (IsValid()) 12430fdc8d8SChris Lattner { 1251b72fcb7SGreg Clayton bool show_inline = true; 1261b72fcb7SGreg Clayton m_opaque_ptr->AppendVariables (can_create, get_parent_variables, show_inline, var_list); 12730fdc8d8SChris Lattner } 12830fdc8d8SChris Lattner } 12930fdc8d8SChris Lattner 13095897c6aSGreg Clayton SBBlock 13195897c6aSGreg Clayton SBBlock::GetParent () 13295897c6aSGreg Clayton { 13395897c6aSGreg Clayton SBBlock sb_block; 13495897c6aSGreg Clayton if (m_opaque_ptr) 13595897c6aSGreg Clayton sb_block.m_opaque_ptr = m_opaque_ptr->GetParent(); 13695897c6aSGreg Clayton return sb_block; 13795897c6aSGreg Clayton } 13895897c6aSGreg Clayton 1398f7180b1SGreg Clayton lldb::SBBlock 1408f7180b1SGreg Clayton SBBlock::GetContainingInlinedBlock () 1418f7180b1SGreg Clayton { 1428f7180b1SGreg Clayton SBBlock sb_block; 1438f7180b1SGreg Clayton if (m_opaque_ptr) 1448f7180b1SGreg Clayton sb_block.m_opaque_ptr = m_opaque_ptr->GetContainingInlinedBlock (); 1458f7180b1SGreg Clayton return sb_block; 1468f7180b1SGreg Clayton } 1478f7180b1SGreg Clayton 14895897c6aSGreg Clayton SBBlock 14995897c6aSGreg Clayton SBBlock::GetSibling () 15095897c6aSGreg Clayton { 15195897c6aSGreg Clayton SBBlock sb_block; 15295897c6aSGreg Clayton if (m_opaque_ptr) 15395897c6aSGreg Clayton sb_block.m_opaque_ptr = m_opaque_ptr->GetSibling(); 15495897c6aSGreg Clayton return sb_block; 15595897c6aSGreg Clayton } 15695897c6aSGreg Clayton 15795897c6aSGreg Clayton SBBlock 15895897c6aSGreg Clayton SBBlock::GetFirstChild () 15995897c6aSGreg Clayton { 16095897c6aSGreg Clayton SBBlock sb_block; 16195897c6aSGreg Clayton if (m_opaque_ptr) 16295897c6aSGreg Clayton sb_block.m_opaque_ptr = m_opaque_ptr->GetFirstChild(); 16395897c6aSGreg Clayton return sb_block; 16495897c6aSGreg Clayton } 16595897c6aSGreg Clayton 1668f7180b1SGreg Clayton lldb_private::Block * 167*5569e64eSGreg Clayton SBBlock::GetPtr () 1684838131bSGreg Clayton { 1694838131bSGreg Clayton return m_opaque_ptr; 1704838131bSGreg Clayton } 1714838131bSGreg Clayton 17272eff18aSGreg Clayton void 173*5569e64eSGreg Clayton SBBlock::SetPtr (lldb_private::Block *block) 17472eff18aSGreg Clayton { 17572eff18aSGreg Clayton m_opaque_ptr = block; 17672eff18aSGreg Clayton } 17730fdc8d8SChris Lattner 178dde9cff3SCaroline Tice bool 179dde9cff3SCaroline Tice SBBlock::GetDescription (SBStream &description) 180dde9cff3SCaroline Tice { 181da7bc7d0SGreg Clayton Stream &strm = description.ref(); 182da7bc7d0SGreg Clayton 183dde9cff3SCaroline Tice if (m_opaque_ptr) 184dde9cff3SCaroline Tice { 185dde9cff3SCaroline Tice lldb::user_id_t id = m_opaque_ptr->GetID(); 186da7bc7d0SGreg Clayton strm.Printf ("Block: {id: %llu} ", id); 187dde9cff3SCaroline Tice if (IsInlined()) 188dde9cff3SCaroline Tice { 189da7bc7d0SGreg Clayton strm.Printf (" (inlined, '%s') ", GetInlinedName()); 190dde9cff3SCaroline Tice } 191dde9cff3SCaroline Tice lldb_private::SymbolContext sc; 192dde9cff3SCaroline Tice m_opaque_ptr->CalculateSymbolContext (&sc); 193dde9cff3SCaroline Tice if (sc.function) 194dde9cff3SCaroline Tice { 195da7bc7d0SGreg Clayton m_opaque_ptr->DumpAddressRanges (&strm, 196dde9cff3SCaroline Tice sc.function->GetAddressRange().GetBaseAddress().GetFileAddress()); 197dde9cff3SCaroline Tice } 198dde9cff3SCaroline Tice } 199dde9cff3SCaroline Tice else 200da7bc7d0SGreg Clayton strm.PutCString ("No value"); 20130fdc8d8SChris Lattner 202dde9cff3SCaroline Tice return true; 203dde9cff3SCaroline Tice } 2048f7180b1SGreg Clayton 2058f7180b1SGreg Clayton uint32_t 2068f7180b1SGreg Clayton SBBlock::GetNumRanges () 2078f7180b1SGreg Clayton { 2088f7180b1SGreg Clayton if (m_opaque_ptr) 2098f7180b1SGreg Clayton return m_opaque_ptr->GetNumRanges(); 2108f7180b1SGreg Clayton return 0; 2118f7180b1SGreg Clayton } 2128f7180b1SGreg Clayton 2138f7180b1SGreg Clayton lldb::SBAddress 2148f7180b1SGreg Clayton SBBlock::GetRangeStartAddress (uint32_t idx) 2158f7180b1SGreg Clayton { 2168f7180b1SGreg Clayton lldb::SBAddress sb_addr; 2178f7180b1SGreg Clayton if (m_opaque_ptr) 2188f7180b1SGreg Clayton { 2198f7180b1SGreg Clayton AddressRange range; 2208f7180b1SGreg Clayton if (m_opaque_ptr->GetRangeAtIndex(idx, range)) 2218f7180b1SGreg Clayton { 2228f7180b1SGreg Clayton sb_addr.ref() = range.GetBaseAddress(); 2238f7180b1SGreg Clayton } 2248f7180b1SGreg Clayton } 2258f7180b1SGreg Clayton return sb_addr; 2268f7180b1SGreg Clayton } 2278f7180b1SGreg Clayton 2288f7180b1SGreg Clayton lldb::SBAddress 2298f7180b1SGreg Clayton SBBlock::GetRangeEndAddress (uint32_t idx) 2308f7180b1SGreg Clayton { 2318f7180b1SGreg Clayton lldb::SBAddress sb_addr; 2328f7180b1SGreg Clayton if (m_opaque_ptr) 2338f7180b1SGreg Clayton { 2348f7180b1SGreg Clayton AddressRange range; 2358f7180b1SGreg Clayton if (m_opaque_ptr->GetRangeAtIndex(idx, range)) 2368f7180b1SGreg Clayton { 2378f7180b1SGreg Clayton sb_addr.ref() = range.GetBaseAddress(); 2388f7180b1SGreg Clayton sb_addr.ref().Slide(range.GetByteSize()); 2398f7180b1SGreg Clayton } 2408f7180b1SGreg Clayton } 2418f7180b1SGreg Clayton return sb_addr; 2428f7180b1SGreg Clayton } 2438f7180b1SGreg Clayton 2448f7180b1SGreg Clayton uint32_t 2458f7180b1SGreg Clayton SBBlock::GetRangeIndexForBlockAddress (lldb::SBAddress block_addr) 2468f7180b1SGreg Clayton { 2478f7180b1SGreg Clayton if (m_opaque_ptr && block_addr.IsValid()) 2488f7180b1SGreg Clayton { 249ea3e7d5cSGreg Clayton return m_opaque_ptr->GetRangeIndexContainingAddress (block_addr.ref()); 2508f7180b1SGreg Clayton } 2518f7180b1SGreg Clayton 2528f7180b1SGreg Clayton return UINT32_MAX; 2538f7180b1SGreg Clayton } 2548f7180b1SGreg Clayton 255*5569e64eSGreg Clayton 256*5569e64eSGreg Clayton lldb::SBValueList 257*5569e64eSGreg Clayton SBBlock::GetVariables (lldb::SBFrame& frame, 258*5569e64eSGreg Clayton bool arguments, 259*5569e64eSGreg Clayton bool locals, 260*5569e64eSGreg Clayton bool statics, 261*5569e64eSGreg Clayton lldb::DynamicValueType use_dynamic) 262*5569e64eSGreg Clayton { 263*5569e64eSGreg Clayton Block *block = GetPtr(); 264*5569e64eSGreg Clayton SBValueList value_list; 265*5569e64eSGreg Clayton if (block) 266*5569e64eSGreg Clayton { 267*5569e64eSGreg Clayton StackFrameSP frame_sp(frame.GetFrameSP()); 268*5569e64eSGreg Clayton VariableListSP variable_list_sp (block->GetBlockVariableList (true)); 269*5569e64eSGreg Clayton 270*5569e64eSGreg Clayton if (variable_list_sp) 271*5569e64eSGreg Clayton { 272*5569e64eSGreg Clayton const size_t num_variables = variable_list_sp->GetSize(); 273*5569e64eSGreg Clayton if (num_variables) 274*5569e64eSGreg Clayton { 275*5569e64eSGreg Clayton for (size_t i = 0; i < num_variables; ++i) 276*5569e64eSGreg Clayton { 277*5569e64eSGreg Clayton VariableSP variable_sp (variable_list_sp->GetVariableAtIndex(i)); 278*5569e64eSGreg Clayton if (variable_sp) 279*5569e64eSGreg Clayton { 280*5569e64eSGreg Clayton bool add_variable = false; 281*5569e64eSGreg Clayton switch (variable_sp->GetScope()) 282*5569e64eSGreg Clayton { 283*5569e64eSGreg Clayton case eValueTypeVariableGlobal: 284*5569e64eSGreg Clayton case eValueTypeVariableStatic: 285*5569e64eSGreg Clayton add_variable = statics; 286*5569e64eSGreg Clayton break; 287*5569e64eSGreg Clayton 288*5569e64eSGreg Clayton case eValueTypeVariableArgument: 289*5569e64eSGreg Clayton add_variable = arguments; 290*5569e64eSGreg Clayton break; 291*5569e64eSGreg Clayton 292*5569e64eSGreg Clayton case eValueTypeVariableLocal: 293*5569e64eSGreg Clayton add_variable = locals; 294*5569e64eSGreg Clayton break; 295*5569e64eSGreg Clayton 296*5569e64eSGreg Clayton default: 297*5569e64eSGreg Clayton break; 298*5569e64eSGreg Clayton } 299*5569e64eSGreg Clayton if (add_variable) 300*5569e64eSGreg Clayton { 301*5569e64eSGreg Clayton if (frame_sp) 302*5569e64eSGreg Clayton value_list.Append (frame_sp->GetValueObjectForFrameVariable (variable_sp, use_dynamic)); 303*5569e64eSGreg Clayton } 304*5569e64eSGreg Clayton } 305*5569e64eSGreg Clayton } 306*5569e64eSGreg Clayton } 307*5569e64eSGreg Clayton } 308*5569e64eSGreg Clayton } 309*5569e64eSGreg Clayton return value_list; 310*5569e64eSGreg Clayton } 311*5569e64eSGreg Clayton 312*5569e64eSGreg Clayton lldb::SBValueList 313*5569e64eSGreg Clayton SBBlock::GetVariables (lldb::SBTarget& target, 314*5569e64eSGreg Clayton bool arguments, 315*5569e64eSGreg Clayton bool locals, 316*5569e64eSGreg Clayton bool statics) 317*5569e64eSGreg Clayton { 318*5569e64eSGreg Clayton Block *block = GetPtr(); 319*5569e64eSGreg Clayton 320*5569e64eSGreg Clayton SBValueList value_list; 321*5569e64eSGreg Clayton if (block) 322*5569e64eSGreg Clayton { 323*5569e64eSGreg Clayton TargetSP target_sp(target.GetSP()); 324*5569e64eSGreg Clayton 325*5569e64eSGreg Clayton VariableListSP variable_list_sp (block->GetBlockVariableList (true)); 326*5569e64eSGreg Clayton 327*5569e64eSGreg Clayton if (variable_list_sp) 328*5569e64eSGreg Clayton { 329*5569e64eSGreg Clayton const size_t num_variables = variable_list_sp->GetSize(); 330*5569e64eSGreg Clayton if (num_variables) 331*5569e64eSGreg Clayton { 332*5569e64eSGreg Clayton for (size_t i = 0; i < num_variables; ++i) 333*5569e64eSGreg Clayton { 334*5569e64eSGreg Clayton VariableSP variable_sp (variable_list_sp->GetVariableAtIndex(i)); 335*5569e64eSGreg Clayton if (variable_sp) 336*5569e64eSGreg Clayton { 337*5569e64eSGreg Clayton bool add_variable = false; 338*5569e64eSGreg Clayton switch (variable_sp->GetScope()) 339*5569e64eSGreg Clayton { 340*5569e64eSGreg Clayton case eValueTypeVariableGlobal: 341*5569e64eSGreg Clayton case eValueTypeVariableStatic: 342*5569e64eSGreg Clayton add_variable = statics; 343*5569e64eSGreg Clayton break; 344*5569e64eSGreg Clayton 345*5569e64eSGreg Clayton case eValueTypeVariableArgument: 346*5569e64eSGreg Clayton add_variable = arguments; 347*5569e64eSGreg Clayton break; 348*5569e64eSGreg Clayton 349*5569e64eSGreg Clayton case eValueTypeVariableLocal: 350*5569e64eSGreg Clayton add_variable = locals; 351*5569e64eSGreg Clayton break; 352*5569e64eSGreg Clayton 353*5569e64eSGreg Clayton default: 354*5569e64eSGreg Clayton break; 355*5569e64eSGreg Clayton } 356*5569e64eSGreg Clayton if (add_variable) 357*5569e64eSGreg Clayton { 358*5569e64eSGreg Clayton if (target_sp) 359*5569e64eSGreg Clayton value_list.Append (ValueObjectVariable::Create (target_sp.get(), variable_sp)); 360*5569e64eSGreg Clayton } 361*5569e64eSGreg Clayton } 362*5569e64eSGreg Clayton } 363*5569e64eSGreg Clayton } 364*5569e64eSGreg Clayton } 365*5569e64eSGreg Clayton } 366*5569e64eSGreg Clayton return value_list; 367*5569e64eSGreg Clayton } 368*5569e64eSGreg Clayton 369