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