180814287SRaphael Isemann //===-- SBBlock.cpp -------------------------------------------------------===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 930fdc8d8SChris Lattner #include "lldb/API/SBBlock.h" 10d51402acSJonas Devlieghere #include "lldb/Utility/ReproducerInstrumentation.h" 118f7180b1SGreg Clayton #include "lldb/API/SBAddress.h" 1295897c6aSGreg Clayton #include "lldb/API/SBFileSpec.h" 135569e64eSGreg Clayton #include "lldb/API/SBFrame.h" 14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 155569e64eSGreg Clayton #include "lldb/API/SBValue.h" 168f7180b1SGreg Clayton #include "lldb/Core/AddressRange.h" 175569e64eSGreg Clayton #include "lldb/Core/ValueObjectVariable.h" 1830fdc8d8SChris Lattner #include "lldb/Symbol/Block.h" 1995897c6aSGreg Clayton #include "lldb/Symbol/Function.h" 20dde9cff3SCaroline Tice #include "lldb/Symbol/SymbolContext.h" 215569e64eSGreg Clayton #include "lldb/Symbol/VariableList.h" 22b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h" 235569e64eSGreg Clayton #include "lldb/Target/Target.h" 2430fdc8d8SChris Lattner 2530fdc8d8SChris Lattner using namespace lldb; 2695897c6aSGreg Clayton using namespace lldb_private; 2730fdc8d8SChris Lattner 289494c510SJonas Devlieghere SBBlock::SBBlock() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBBlock); } 2930fdc8d8SChris Lattner 30b9c1b51eSKate Stone SBBlock::SBBlock(lldb_private::Block *lldb_object_ptr) 31b9c1b51eSKate Stone : m_opaque_ptr(lldb_object_ptr) {} 3230fdc8d8SChris Lattner 33baf5664fSJonas Devlieghere SBBlock::SBBlock(const SBBlock &rhs) : m_opaque_ptr(rhs.m_opaque_ptr) { 34baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBBlock, (const lldb::SBBlock &), rhs); 35baf5664fSJonas Devlieghere } 3630fdc8d8SChris Lattner 37b9c1b51eSKate Stone const SBBlock &SBBlock::operator=(const SBBlock &rhs) { 38baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBBlock &, 39baf5664fSJonas Devlieghere SBBlock, operator=,(const lldb::SBBlock &), rhs); 40baf5664fSJonas Devlieghere 41efabb123SGreg Clayton m_opaque_ptr = rhs.m_opaque_ptr; 42*d232abc3SJonas Devlieghere return *this; 43efabb123SGreg Clayton } 44efabb123SGreg Clayton 45248a1305SKonrad Kleine SBBlock::~SBBlock() { m_opaque_ptr = nullptr; } 4630fdc8d8SChris Lattner 47baf5664fSJonas Devlieghere bool SBBlock::IsValid() const { 48baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBBlock, IsValid); 497f5237bcSPavel Labath return this->operator bool(); 507f5237bcSPavel Labath } 517f5237bcSPavel Labath SBBlock::operator bool() const { 527f5237bcSPavel Labath LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBBlock, operator bool); 53baf5664fSJonas Devlieghere 54248a1305SKonrad Kleine return m_opaque_ptr != nullptr; 55baf5664fSJonas Devlieghere } 5630fdc8d8SChris Lattner 57b9c1b51eSKate Stone bool SBBlock::IsInlined() const { 58baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBBlock, IsInlined); 59baf5664fSJonas Devlieghere 6095897c6aSGreg Clayton if (m_opaque_ptr) 61248a1305SKonrad Kleine return m_opaque_ptr->GetInlinedFunctionInfo() != nullptr; 6295897c6aSGreg Clayton return false; 6395897c6aSGreg Clayton } 6495897c6aSGreg Clayton 65b9c1b51eSKate Stone const char *SBBlock::GetInlinedName() const { 66baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBBlock, GetInlinedName); 67baf5664fSJonas Devlieghere 68b9c1b51eSKate Stone if (m_opaque_ptr) { 69b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 70b9c1b51eSKate Stone m_opaque_ptr->GetInlinedFunctionInfo(); 71b9c1b51eSKate Stone if (inlined_info) { 7222b04487SAlex Langford return inlined_info->GetName().AsCString(nullptr); 73ddaf6a72SGreg Clayton } 7495897c6aSGreg Clayton } 75248a1305SKonrad Kleine return nullptr; 7695897c6aSGreg Clayton } 7795897c6aSGreg Clayton 78b9c1b51eSKate Stone SBFileSpec SBBlock::GetInlinedCallSiteFile() const { 79baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBBlock, 80baf5664fSJonas Devlieghere GetInlinedCallSiteFile); 81baf5664fSJonas Devlieghere 8295897c6aSGreg Clayton SBFileSpec sb_file; 83b9c1b51eSKate Stone if (m_opaque_ptr) { 84b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 85b9c1b51eSKate Stone m_opaque_ptr->GetInlinedFunctionInfo(); 8695897c6aSGreg Clayton if (inlined_info) 8795897c6aSGreg Clayton sb_file.SetFileSpec(inlined_info->GetCallSite().GetFile()); 8895897c6aSGreg Clayton } 89*d232abc3SJonas Devlieghere return sb_file; 9095897c6aSGreg Clayton } 9195897c6aSGreg Clayton 92b9c1b51eSKate Stone uint32_t SBBlock::GetInlinedCallSiteLine() const { 93baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBBlock, GetInlinedCallSiteLine); 94baf5664fSJonas Devlieghere 95b9c1b51eSKate Stone if (m_opaque_ptr) { 96b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 97b9c1b51eSKate Stone m_opaque_ptr->GetInlinedFunctionInfo(); 9895897c6aSGreg Clayton if (inlined_info) 9995897c6aSGreg Clayton return inlined_info->GetCallSite().GetLine(); 10095897c6aSGreg Clayton } 10195897c6aSGreg Clayton return 0; 10295897c6aSGreg Clayton } 10395897c6aSGreg Clayton 104b9c1b51eSKate Stone uint32_t SBBlock::GetInlinedCallSiteColumn() const { 105baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBBlock, GetInlinedCallSiteColumn); 106baf5664fSJonas Devlieghere 107b9c1b51eSKate Stone if (m_opaque_ptr) { 108b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info = 109b9c1b51eSKate Stone m_opaque_ptr->GetInlinedFunctionInfo(); 11095897c6aSGreg Clayton if (inlined_info) 11195897c6aSGreg Clayton return inlined_info->GetCallSite().GetColumn(); 11295897c6aSGreg Clayton } 11395897c6aSGreg Clayton return 0; 11495897c6aSGreg Clayton } 11595897c6aSGreg Clayton 116b9c1b51eSKate Stone void SBBlock::AppendVariables(bool can_create, bool get_parent_variables, 117b9c1b51eSKate Stone lldb_private::VariableList *var_list) { 118b9c1b51eSKate Stone if (IsValid()) { 1191b72fcb7SGreg Clayton bool show_inline = true; 120b9c1b51eSKate Stone m_opaque_ptr->AppendVariables(can_create, get_parent_variables, show_inline, 121b9c1b51eSKate Stone [](Variable *) { return true; }, var_list); 12230fdc8d8SChris Lattner } 12330fdc8d8SChris Lattner } 12430fdc8d8SChris Lattner 125b9c1b51eSKate Stone SBBlock SBBlock::GetParent() { 126baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBBlock, SBBlock, GetParent); 127baf5664fSJonas Devlieghere 12895897c6aSGreg Clayton SBBlock sb_block; 12995897c6aSGreg Clayton if (m_opaque_ptr) 13095897c6aSGreg Clayton sb_block.m_opaque_ptr = m_opaque_ptr->GetParent(); 131*d232abc3SJonas Devlieghere return sb_block; 13295897c6aSGreg Clayton } 13395897c6aSGreg Clayton 134b9c1b51eSKate Stone lldb::SBBlock SBBlock::GetContainingInlinedBlock() { 135baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBBlock, SBBlock, GetContainingInlinedBlock); 136baf5664fSJonas Devlieghere 1378f7180b1SGreg Clayton SBBlock sb_block; 1388f7180b1SGreg Clayton if (m_opaque_ptr) 1398f7180b1SGreg Clayton sb_block.m_opaque_ptr = m_opaque_ptr->GetContainingInlinedBlock(); 140*d232abc3SJonas Devlieghere return sb_block; 1418f7180b1SGreg Clayton } 1428f7180b1SGreg Clayton 143b9c1b51eSKate Stone SBBlock SBBlock::GetSibling() { 144baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBBlock, SBBlock, GetSibling); 145baf5664fSJonas Devlieghere 14695897c6aSGreg Clayton SBBlock sb_block; 14795897c6aSGreg Clayton if (m_opaque_ptr) 14895897c6aSGreg Clayton sb_block.m_opaque_ptr = m_opaque_ptr->GetSibling(); 149*d232abc3SJonas Devlieghere return sb_block; 15095897c6aSGreg Clayton } 15195897c6aSGreg Clayton 152b9c1b51eSKate Stone SBBlock SBBlock::GetFirstChild() { 153baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBBlock, SBBlock, GetFirstChild); 154baf5664fSJonas Devlieghere 15595897c6aSGreg Clayton SBBlock sb_block; 15695897c6aSGreg Clayton if (m_opaque_ptr) 15795897c6aSGreg Clayton sb_block.m_opaque_ptr = m_opaque_ptr->GetFirstChild(); 158*d232abc3SJonas Devlieghere return sb_block; 15995897c6aSGreg Clayton } 16095897c6aSGreg Clayton 161b9c1b51eSKate Stone lldb_private::Block *SBBlock::GetPtr() { return m_opaque_ptr; } 1624838131bSGreg Clayton 163b9c1b51eSKate Stone void SBBlock::SetPtr(lldb_private::Block *block) { m_opaque_ptr = block; } 16430fdc8d8SChris Lattner 165b9c1b51eSKate Stone bool SBBlock::GetDescription(SBStream &description) { 166baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBBlock, GetDescription, (lldb::SBStream &), 167baf5664fSJonas Devlieghere description); 168baf5664fSJonas Devlieghere 169da7bc7d0SGreg Clayton Stream &strm = description.ref(); 170da7bc7d0SGreg Clayton 171b9c1b51eSKate Stone if (m_opaque_ptr) { 172dde9cff3SCaroline Tice lldb::user_id_t id = m_opaque_ptr->GetID(); 173d01b2953SDaniel Malea strm.Printf("Block: {id: %" PRIu64 "} ", id); 174b9c1b51eSKate Stone if (IsInlined()) { 175da7bc7d0SGreg Clayton strm.Printf(" (inlined, '%s') ", GetInlinedName()); 176dde9cff3SCaroline Tice } 177dde9cff3SCaroline Tice lldb_private::SymbolContext sc; 178dde9cff3SCaroline Tice m_opaque_ptr->CalculateSymbolContext(&sc); 179b9c1b51eSKate Stone if (sc.function) { 180b9c1b51eSKate Stone m_opaque_ptr->DumpAddressRanges( 181b9c1b51eSKate Stone &strm, 182dde9cff3SCaroline Tice sc.function->GetAddressRange().GetBaseAddress().GetFileAddress()); 183dde9cff3SCaroline Tice } 184b9c1b51eSKate Stone } else 185da7bc7d0SGreg Clayton strm.PutCString("No value"); 18630fdc8d8SChris Lattner 187dde9cff3SCaroline Tice return true; 188dde9cff3SCaroline Tice } 1898f7180b1SGreg Clayton 190b9c1b51eSKate Stone uint32_t SBBlock::GetNumRanges() { 191baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBBlock, GetNumRanges); 192baf5664fSJonas Devlieghere 1938f7180b1SGreg Clayton if (m_opaque_ptr) 1948f7180b1SGreg Clayton return m_opaque_ptr->GetNumRanges(); 1958f7180b1SGreg Clayton return 0; 1968f7180b1SGreg Clayton } 1978f7180b1SGreg Clayton 198b9c1b51eSKate Stone lldb::SBAddress SBBlock::GetRangeStartAddress(uint32_t idx) { 199baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBAddress, SBBlock, GetRangeStartAddress, (uint32_t), 200baf5664fSJonas Devlieghere idx); 201baf5664fSJonas Devlieghere 2028f7180b1SGreg Clayton lldb::SBAddress sb_addr; 203b9c1b51eSKate Stone if (m_opaque_ptr) { 2048f7180b1SGreg Clayton AddressRange range; 205b9c1b51eSKate Stone if (m_opaque_ptr->GetRangeAtIndex(idx, range)) { 2068f7180b1SGreg Clayton sb_addr.ref() = range.GetBaseAddress(); 2078f7180b1SGreg Clayton } 2088f7180b1SGreg Clayton } 209*d232abc3SJonas Devlieghere return sb_addr; 2108f7180b1SGreg Clayton } 2118f7180b1SGreg Clayton 212b9c1b51eSKate Stone lldb::SBAddress SBBlock::GetRangeEndAddress(uint32_t idx) { 213baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBAddress, SBBlock, GetRangeEndAddress, (uint32_t), 214baf5664fSJonas Devlieghere idx); 215baf5664fSJonas Devlieghere 2168f7180b1SGreg Clayton lldb::SBAddress sb_addr; 217b9c1b51eSKate Stone if (m_opaque_ptr) { 2188f7180b1SGreg Clayton AddressRange range; 219b9c1b51eSKate Stone if (m_opaque_ptr->GetRangeAtIndex(idx, range)) { 2208f7180b1SGreg Clayton sb_addr.ref() = range.GetBaseAddress(); 2218f7180b1SGreg Clayton sb_addr.ref().Slide(range.GetByteSize()); 2228f7180b1SGreg Clayton } 2238f7180b1SGreg Clayton } 224*d232abc3SJonas Devlieghere return sb_addr; 2258f7180b1SGreg Clayton } 2268f7180b1SGreg Clayton 227b9c1b51eSKate Stone uint32_t SBBlock::GetRangeIndexForBlockAddress(lldb::SBAddress block_addr) { 228baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(uint32_t, SBBlock, GetRangeIndexForBlockAddress, 229baf5664fSJonas Devlieghere (lldb::SBAddress), block_addr); 230baf5664fSJonas Devlieghere 231b9c1b51eSKate Stone if (m_opaque_ptr && block_addr.IsValid()) { 232ea3e7d5cSGreg Clayton return m_opaque_ptr->GetRangeIndexContainingAddress(block_addr.ref()); 2338f7180b1SGreg Clayton } 2348f7180b1SGreg Clayton 2358f7180b1SGreg Clayton return UINT32_MAX; 2368f7180b1SGreg Clayton } 2378f7180b1SGreg Clayton 238b9c1b51eSKate Stone lldb::SBValueList SBBlock::GetVariables(lldb::SBFrame &frame, bool arguments, 239b9c1b51eSKate Stone bool locals, bool statics, 240b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 241baf5664fSJonas Devlieghere LLDB_RECORD_METHOD( 242baf5664fSJonas Devlieghere lldb::SBValueList, SBBlock, GetVariables, 243baf5664fSJonas Devlieghere (lldb::SBFrame &, bool, bool, bool, lldb::DynamicValueType), frame, 244baf5664fSJonas Devlieghere arguments, locals, statics, use_dynamic); 245baf5664fSJonas Devlieghere 2465569e64eSGreg Clayton Block *block = GetPtr(); 2475569e64eSGreg Clayton SBValueList value_list; 248b9c1b51eSKate Stone if (block) { 249b57e4a1bSJason Molenda StackFrameSP frame_sp(frame.GetFrameSP()); 2505569e64eSGreg Clayton VariableListSP variable_list_sp(block->GetBlockVariableList(true)); 2515569e64eSGreg Clayton 252b9c1b51eSKate Stone if (variable_list_sp) { 2535569e64eSGreg Clayton const size_t num_variables = variable_list_sp->GetSize(); 254b9c1b51eSKate Stone if (num_variables) { 255b9c1b51eSKate Stone for (size_t i = 0; i < num_variables; ++i) { 2565569e64eSGreg Clayton VariableSP variable_sp(variable_list_sp->GetVariableAtIndex(i)); 257b9c1b51eSKate Stone if (variable_sp) { 2585569e64eSGreg Clayton bool add_variable = false; 259b9c1b51eSKate Stone switch (variable_sp->GetScope()) { 2605569e64eSGreg Clayton case eValueTypeVariableGlobal: 2615569e64eSGreg Clayton case eValueTypeVariableStatic: 26263a27afaSGreg Clayton case eValueTypeVariableThreadLocal: 2635569e64eSGreg Clayton add_variable = statics; 2645569e64eSGreg Clayton break; 2655569e64eSGreg Clayton 2665569e64eSGreg Clayton case eValueTypeVariableArgument: 2675569e64eSGreg Clayton add_variable = arguments; 2685569e64eSGreg Clayton break; 2695569e64eSGreg Clayton 2705569e64eSGreg Clayton case eValueTypeVariableLocal: 2715569e64eSGreg Clayton add_variable = locals; 2725569e64eSGreg Clayton break; 2735569e64eSGreg Clayton 2745569e64eSGreg Clayton default: 2755569e64eSGreg Clayton break; 2765569e64eSGreg Clayton } 277b9c1b51eSKate Stone if (add_variable) { 278b9c1b51eSKate Stone if (frame_sp) { 279b9c1b51eSKate Stone lldb::ValueObjectSP valobj_sp( 280b9c1b51eSKate Stone frame_sp->GetValueObjectForFrameVariable(variable_sp, 281b9c1b51eSKate Stone eNoDynamicValues)); 282e3e91517SEnrico Granata SBValue value_sb; 283e3e91517SEnrico Granata value_sb.SetSP(valobj_sp, use_dynamic); 284e3e91517SEnrico Granata value_list.Append(value_sb); 285e3e91517SEnrico Granata } 2865569e64eSGreg Clayton } 2875569e64eSGreg Clayton } 2885569e64eSGreg Clayton } 2895569e64eSGreg Clayton } 2905569e64eSGreg Clayton } 2915569e64eSGreg Clayton } 292*d232abc3SJonas Devlieghere return value_list; 2935569e64eSGreg Clayton } 2945569e64eSGreg Clayton 295b9c1b51eSKate Stone lldb::SBValueList SBBlock::GetVariables(lldb::SBTarget &target, bool arguments, 296b9c1b51eSKate Stone bool locals, bool statics) { 297baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBBlock, GetVariables, 298baf5664fSJonas Devlieghere (lldb::SBTarget &, bool, bool, bool), target, arguments, 299baf5664fSJonas Devlieghere locals, statics); 300baf5664fSJonas Devlieghere 3015569e64eSGreg Clayton Block *block = GetPtr(); 3025569e64eSGreg Clayton 3035569e64eSGreg Clayton SBValueList value_list; 304b9c1b51eSKate Stone if (block) { 3055569e64eSGreg Clayton TargetSP target_sp(target.GetSP()); 3065569e64eSGreg Clayton 3075569e64eSGreg Clayton VariableListSP variable_list_sp(block->GetBlockVariableList(true)); 3085569e64eSGreg Clayton 309b9c1b51eSKate Stone if (variable_list_sp) { 3105569e64eSGreg Clayton const size_t num_variables = variable_list_sp->GetSize(); 311b9c1b51eSKate Stone if (num_variables) { 312b9c1b51eSKate Stone for (size_t i = 0; i < num_variables; ++i) { 3135569e64eSGreg Clayton VariableSP variable_sp(variable_list_sp->GetVariableAtIndex(i)); 314b9c1b51eSKate Stone if (variable_sp) { 3155569e64eSGreg Clayton bool add_variable = false; 316b9c1b51eSKate Stone switch (variable_sp->GetScope()) { 3175569e64eSGreg Clayton case eValueTypeVariableGlobal: 3185569e64eSGreg Clayton case eValueTypeVariableStatic: 31963a27afaSGreg Clayton case eValueTypeVariableThreadLocal: 3205569e64eSGreg Clayton add_variable = statics; 3215569e64eSGreg Clayton break; 3225569e64eSGreg Clayton 3235569e64eSGreg Clayton case eValueTypeVariableArgument: 3245569e64eSGreg Clayton add_variable = arguments; 3255569e64eSGreg Clayton break; 3265569e64eSGreg Clayton 3275569e64eSGreg Clayton case eValueTypeVariableLocal: 3285569e64eSGreg Clayton add_variable = locals; 3295569e64eSGreg Clayton break; 3305569e64eSGreg Clayton 3315569e64eSGreg Clayton default: 3325569e64eSGreg Clayton break; 3335569e64eSGreg Clayton } 334b9c1b51eSKate Stone if (add_variable) { 3355569e64eSGreg Clayton if (target_sp) 336b9c1b51eSKate Stone value_list.Append( 337b9c1b51eSKate Stone ValueObjectVariable::Create(target_sp.get(), variable_sp)); 3385569e64eSGreg Clayton } 3395569e64eSGreg Clayton } 3405569e64eSGreg Clayton } 3415569e64eSGreg Clayton } 3425569e64eSGreg Clayton } 3435569e64eSGreg Clayton } 344*d232abc3SJonas Devlieghere return value_list; 3455569e64eSGreg Clayton } 346