15ffd83dbSDimitry Andric //===-- SBBlock.cpp -------------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/API/SBBlock.h"
100b57cec5SDimitry Andric #include "SBReproducerPrivate.h"
110b57cec5SDimitry Andric #include "lldb/API/SBAddress.h"
120b57cec5SDimitry Andric #include "lldb/API/SBFileSpec.h"
130b57cec5SDimitry Andric #include "lldb/API/SBFrame.h"
140b57cec5SDimitry Andric #include "lldb/API/SBStream.h"
150b57cec5SDimitry Andric #include "lldb/API/SBValue.h"
160b57cec5SDimitry Andric #include "lldb/Core/AddressRange.h"
170b57cec5SDimitry Andric #include "lldb/Core/ValueObjectVariable.h"
180b57cec5SDimitry Andric #include "lldb/Symbol/Block.h"
190b57cec5SDimitry Andric #include "lldb/Symbol/Function.h"
200b57cec5SDimitry Andric #include "lldb/Symbol/SymbolContext.h"
210b57cec5SDimitry Andric #include "lldb/Symbol/VariableList.h"
220b57cec5SDimitry Andric #include "lldb/Target/StackFrame.h"
230b57cec5SDimitry Andric #include "lldb/Target/Target.h"
240b57cec5SDimitry Andric 
250b57cec5SDimitry Andric using namespace lldb;
260b57cec5SDimitry Andric using namespace lldb_private;
270b57cec5SDimitry Andric 
SBBlock()28*5f7ddb14SDimitry Andric SBBlock::SBBlock() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBBlock); }
290b57cec5SDimitry Andric 
SBBlock(lldb_private::Block * lldb_object_ptr)300b57cec5SDimitry Andric SBBlock::SBBlock(lldb_private::Block *lldb_object_ptr)
310b57cec5SDimitry Andric     : m_opaque_ptr(lldb_object_ptr) {}
320b57cec5SDimitry Andric 
SBBlock(const SBBlock & rhs)330b57cec5SDimitry Andric SBBlock::SBBlock(const SBBlock &rhs) : m_opaque_ptr(rhs.m_opaque_ptr) {
340b57cec5SDimitry Andric   LLDB_RECORD_CONSTRUCTOR(SBBlock, (const lldb::SBBlock &), rhs);
350b57cec5SDimitry Andric }
360b57cec5SDimitry Andric 
operator =(const SBBlock & rhs)370b57cec5SDimitry Andric const SBBlock &SBBlock::operator=(const SBBlock &rhs) {
380b57cec5SDimitry Andric   LLDB_RECORD_METHOD(const lldb::SBBlock &,
390b57cec5SDimitry Andric                      SBBlock, operator=,(const lldb::SBBlock &), rhs);
400b57cec5SDimitry Andric 
410b57cec5SDimitry Andric   m_opaque_ptr = rhs.m_opaque_ptr;
420b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(*this);
430b57cec5SDimitry Andric }
440b57cec5SDimitry Andric 
~SBBlock()450b57cec5SDimitry Andric SBBlock::~SBBlock() { m_opaque_ptr = nullptr; }
460b57cec5SDimitry Andric 
IsValid() const470b57cec5SDimitry Andric bool SBBlock::IsValid() const {
480b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBBlock, IsValid);
490b57cec5SDimitry Andric   return this->operator bool();
500b57cec5SDimitry Andric }
operator bool() const510b57cec5SDimitry Andric SBBlock::operator bool() const {
520b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBBlock, operator bool);
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric   return m_opaque_ptr != nullptr;
550b57cec5SDimitry Andric }
560b57cec5SDimitry Andric 
IsInlined() const570b57cec5SDimitry Andric bool SBBlock::IsInlined() const {
580b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBBlock, IsInlined);
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric   if (m_opaque_ptr)
610b57cec5SDimitry Andric     return m_opaque_ptr->GetInlinedFunctionInfo() != nullptr;
620b57cec5SDimitry Andric   return false;
630b57cec5SDimitry Andric }
640b57cec5SDimitry Andric 
GetInlinedName() const650b57cec5SDimitry Andric const char *SBBlock::GetInlinedName() const {
660b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBBlock, GetInlinedName);
670b57cec5SDimitry Andric 
680b57cec5SDimitry Andric   if (m_opaque_ptr) {
690b57cec5SDimitry Andric     const InlineFunctionInfo *inlined_info =
700b57cec5SDimitry Andric         m_opaque_ptr->GetInlinedFunctionInfo();
710b57cec5SDimitry Andric     if (inlined_info) {
725ffd83dbSDimitry Andric       return inlined_info->GetName().AsCString(nullptr);
730b57cec5SDimitry Andric     }
740b57cec5SDimitry Andric   }
750b57cec5SDimitry Andric   return nullptr;
760b57cec5SDimitry Andric }
770b57cec5SDimitry Andric 
GetInlinedCallSiteFile() const780b57cec5SDimitry Andric SBFileSpec SBBlock::GetInlinedCallSiteFile() const {
790b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBBlock,
800b57cec5SDimitry Andric                                    GetInlinedCallSiteFile);
810b57cec5SDimitry Andric 
820b57cec5SDimitry Andric   SBFileSpec sb_file;
830b57cec5SDimitry Andric   if (m_opaque_ptr) {
840b57cec5SDimitry Andric     const InlineFunctionInfo *inlined_info =
850b57cec5SDimitry Andric         m_opaque_ptr->GetInlinedFunctionInfo();
860b57cec5SDimitry Andric     if (inlined_info)
870b57cec5SDimitry Andric       sb_file.SetFileSpec(inlined_info->GetCallSite().GetFile());
880b57cec5SDimitry Andric   }
890b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(sb_file);
900b57cec5SDimitry Andric }
910b57cec5SDimitry Andric 
GetInlinedCallSiteLine() const920b57cec5SDimitry Andric uint32_t SBBlock::GetInlinedCallSiteLine() const {
930b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBBlock, GetInlinedCallSiteLine);
940b57cec5SDimitry Andric 
950b57cec5SDimitry Andric   if (m_opaque_ptr) {
960b57cec5SDimitry Andric     const InlineFunctionInfo *inlined_info =
970b57cec5SDimitry Andric         m_opaque_ptr->GetInlinedFunctionInfo();
980b57cec5SDimitry Andric     if (inlined_info)
990b57cec5SDimitry Andric       return inlined_info->GetCallSite().GetLine();
1000b57cec5SDimitry Andric   }
1010b57cec5SDimitry Andric   return 0;
1020b57cec5SDimitry Andric }
1030b57cec5SDimitry Andric 
GetInlinedCallSiteColumn() const1040b57cec5SDimitry Andric uint32_t SBBlock::GetInlinedCallSiteColumn() const {
1050b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBBlock, GetInlinedCallSiteColumn);
1060b57cec5SDimitry Andric 
1070b57cec5SDimitry Andric   if (m_opaque_ptr) {
1080b57cec5SDimitry Andric     const InlineFunctionInfo *inlined_info =
1090b57cec5SDimitry Andric         m_opaque_ptr->GetInlinedFunctionInfo();
1100b57cec5SDimitry Andric     if (inlined_info)
1110b57cec5SDimitry Andric       return inlined_info->GetCallSite().GetColumn();
1120b57cec5SDimitry Andric   }
1130b57cec5SDimitry Andric   return 0;
1140b57cec5SDimitry Andric }
1150b57cec5SDimitry Andric 
AppendVariables(bool can_create,bool get_parent_variables,lldb_private::VariableList * var_list)1160b57cec5SDimitry Andric void SBBlock::AppendVariables(bool can_create, bool get_parent_variables,
1170b57cec5SDimitry Andric                               lldb_private::VariableList *var_list) {
1180b57cec5SDimitry Andric   if (IsValid()) {
1190b57cec5SDimitry Andric     bool show_inline = true;
1200b57cec5SDimitry Andric     m_opaque_ptr->AppendVariables(can_create, get_parent_variables, show_inline,
1210b57cec5SDimitry Andric                                   [](Variable *) { return true; }, var_list);
1220b57cec5SDimitry Andric   }
1230b57cec5SDimitry Andric }
1240b57cec5SDimitry Andric 
GetParent()1250b57cec5SDimitry Andric SBBlock SBBlock::GetParent() {
1260b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBBlock, SBBlock, GetParent);
1270b57cec5SDimitry Andric 
1280b57cec5SDimitry Andric   SBBlock sb_block;
1290b57cec5SDimitry Andric   if (m_opaque_ptr)
1300b57cec5SDimitry Andric     sb_block.m_opaque_ptr = m_opaque_ptr->GetParent();
1310b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(sb_block);
1320b57cec5SDimitry Andric }
1330b57cec5SDimitry Andric 
GetContainingInlinedBlock()1340b57cec5SDimitry Andric lldb::SBBlock SBBlock::GetContainingInlinedBlock() {
1350b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBBlock, SBBlock, GetContainingInlinedBlock);
1360b57cec5SDimitry Andric 
1370b57cec5SDimitry Andric   SBBlock sb_block;
1380b57cec5SDimitry Andric   if (m_opaque_ptr)
1390b57cec5SDimitry Andric     sb_block.m_opaque_ptr = m_opaque_ptr->GetContainingInlinedBlock();
1400b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(sb_block);
1410b57cec5SDimitry Andric }
1420b57cec5SDimitry Andric 
GetSibling()1430b57cec5SDimitry Andric SBBlock SBBlock::GetSibling() {
1440b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBBlock, SBBlock, GetSibling);
1450b57cec5SDimitry Andric 
1460b57cec5SDimitry Andric   SBBlock sb_block;
1470b57cec5SDimitry Andric   if (m_opaque_ptr)
1480b57cec5SDimitry Andric     sb_block.m_opaque_ptr = m_opaque_ptr->GetSibling();
1490b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(sb_block);
1500b57cec5SDimitry Andric }
1510b57cec5SDimitry Andric 
GetFirstChild()1520b57cec5SDimitry Andric SBBlock SBBlock::GetFirstChild() {
1530b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(lldb::SBBlock, SBBlock, GetFirstChild);
1540b57cec5SDimitry Andric 
1550b57cec5SDimitry Andric   SBBlock sb_block;
1560b57cec5SDimitry Andric   if (m_opaque_ptr)
1570b57cec5SDimitry Andric     sb_block.m_opaque_ptr = m_opaque_ptr->GetFirstChild();
1580b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(sb_block);
1590b57cec5SDimitry Andric }
1600b57cec5SDimitry Andric 
GetPtr()1610b57cec5SDimitry Andric lldb_private::Block *SBBlock::GetPtr() { return m_opaque_ptr; }
1620b57cec5SDimitry Andric 
SetPtr(lldb_private::Block * block)1630b57cec5SDimitry Andric void SBBlock::SetPtr(lldb_private::Block *block) { m_opaque_ptr = block; }
1640b57cec5SDimitry Andric 
GetDescription(SBStream & description)1650b57cec5SDimitry Andric bool SBBlock::GetDescription(SBStream &description) {
1660b57cec5SDimitry Andric   LLDB_RECORD_METHOD(bool, SBBlock, GetDescription, (lldb::SBStream &),
1670b57cec5SDimitry Andric                      description);
1680b57cec5SDimitry Andric 
1690b57cec5SDimitry Andric   Stream &strm = description.ref();
1700b57cec5SDimitry Andric 
1710b57cec5SDimitry Andric   if (m_opaque_ptr) {
1720b57cec5SDimitry Andric     lldb::user_id_t id = m_opaque_ptr->GetID();
1730b57cec5SDimitry Andric     strm.Printf("Block: {id: %" PRIu64 "} ", id);
1740b57cec5SDimitry Andric     if (IsInlined()) {
1750b57cec5SDimitry Andric       strm.Printf(" (inlined, '%s') ", GetInlinedName());
1760b57cec5SDimitry Andric     }
1770b57cec5SDimitry Andric     lldb_private::SymbolContext sc;
1780b57cec5SDimitry Andric     m_opaque_ptr->CalculateSymbolContext(&sc);
1790b57cec5SDimitry Andric     if (sc.function) {
1800b57cec5SDimitry Andric       m_opaque_ptr->DumpAddressRanges(
1810b57cec5SDimitry Andric           &strm,
1820b57cec5SDimitry Andric           sc.function->GetAddressRange().GetBaseAddress().GetFileAddress());
1830b57cec5SDimitry Andric     }
1840b57cec5SDimitry Andric   } else
1850b57cec5SDimitry Andric     strm.PutCString("No value");
1860b57cec5SDimitry Andric 
1870b57cec5SDimitry Andric   return true;
1880b57cec5SDimitry Andric }
1890b57cec5SDimitry Andric 
GetNumRanges()1900b57cec5SDimitry Andric uint32_t SBBlock::GetNumRanges() {
1910b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBBlock, GetNumRanges);
1920b57cec5SDimitry Andric 
1930b57cec5SDimitry Andric   if (m_opaque_ptr)
1940b57cec5SDimitry Andric     return m_opaque_ptr->GetNumRanges();
1950b57cec5SDimitry Andric   return 0;
1960b57cec5SDimitry Andric }
1970b57cec5SDimitry Andric 
GetRangeStartAddress(uint32_t idx)1980b57cec5SDimitry Andric lldb::SBAddress SBBlock::GetRangeStartAddress(uint32_t idx) {
1990b57cec5SDimitry Andric   LLDB_RECORD_METHOD(lldb::SBAddress, SBBlock, GetRangeStartAddress, (uint32_t),
2000b57cec5SDimitry Andric                      idx);
2010b57cec5SDimitry Andric 
2020b57cec5SDimitry Andric   lldb::SBAddress sb_addr;
2030b57cec5SDimitry Andric   if (m_opaque_ptr) {
2040b57cec5SDimitry Andric     AddressRange range;
2050b57cec5SDimitry Andric     if (m_opaque_ptr->GetRangeAtIndex(idx, range)) {
2060b57cec5SDimitry Andric       sb_addr.ref() = range.GetBaseAddress();
2070b57cec5SDimitry Andric     }
2080b57cec5SDimitry Andric   }
2090b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(sb_addr);
2100b57cec5SDimitry Andric }
2110b57cec5SDimitry Andric 
GetRangeEndAddress(uint32_t idx)2120b57cec5SDimitry Andric lldb::SBAddress SBBlock::GetRangeEndAddress(uint32_t idx) {
2130b57cec5SDimitry Andric   LLDB_RECORD_METHOD(lldb::SBAddress, SBBlock, GetRangeEndAddress, (uint32_t),
2140b57cec5SDimitry Andric                      idx);
2150b57cec5SDimitry Andric 
2160b57cec5SDimitry Andric   lldb::SBAddress sb_addr;
2170b57cec5SDimitry Andric   if (m_opaque_ptr) {
2180b57cec5SDimitry Andric     AddressRange range;
2190b57cec5SDimitry Andric     if (m_opaque_ptr->GetRangeAtIndex(idx, range)) {
2200b57cec5SDimitry Andric       sb_addr.ref() = range.GetBaseAddress();
2210b57cec5SDimitry Andric       sb_addr.ref().Slide(range.GetByteSize());
2220b57cec5SDimitry Andric     }
2230b57cec5SDimitry Andric   }
2240b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(sb_addr);
2250b57cec5SDimitry Andric }
2260b57cec5SDimitry Andric 
GetRangeIndexForBlockAddress(lldb::SBAddress block_addr)2270b57cec5SDimitry Andric uint32_t SBBlock::GetRangeIndexForBlockAddress(lldb::SBAddress block_addr) {
2280b57cec5SDimitry Andric   LLDB_RECORD_METHOD(uint32_t, SBBlock, GetRangeIndexForBlockAddress,
2290b57cec5SDimitry Andric                      (lldb::SBAddress), block_addr);
2300b57cec5SDimitry Andric 
2310b57cec5SDimitry Andric   if (m_opaque_ptr && block_addr.IsValid()) {
2320b57cec5SDimitry Andric     return m_opaque_ptr->GetRangeIndexContainingAddress(block_addr.ref());
2330b57cec5SDimitry Andric   }
2340b57cec5SDimitry Andric 
2350b57cec5SDimitry Andric   return UINT32_MAX;
2360b57cec5SDimitry Andric }
2370b57cec5SDimitry Andric 
GetVariables(lldb::SBFrame & frame,bool arguments,bool locals,bool statics,lldb::DynamicValueType use_dynamic)2380b57cec5SDimitry Andric lldb::SBValueList SBBlock::GetVariables(lldb::SBFrame &frame, bool arguments,
2390b57cec5SDimitry Andric                                         bool locals, bool statics,
2400b57cec5SDimitry Andric                                         lldb::DynamicValueType use_dynamic) {
2410b57cec5SDimitry Andric   LLDB_RECORD_METHOD(
2420b57cec5SDimitry Andric       lldb::SBValueList, SBBlock, GetVariables,
2430b57cec5SDimitry Andric       (lldb::SBFrame &, bool, bool, bool, lldb::DynamicValueType), frame,
2440b57cec5SDimitry Andric       arguments, locals, statics, use_dynamic);
2450b57cec5SDimitry Andric 
2460b57cec5SDimitry Andric   Block *block = GetPtr();
2470b57cec5SDimitry Andric   SBValueList value_list;
2480b57cec5SDimitry Andric   if (block) {
2490b57cec5SDimitry Andric     StackFrameSP frame_sp(frame.GetFrameSP());
2500b57cec5SDimitry Andric     VariableListSP variable_list_sp(block->GetBlockVariableList(true));
2510b57cec5SDimitry Andric 
2520b57cec5SDimitry Andric     if (variable_list_sp) {
2530b57cec5SDimitry Andric       const size_t num_variables = variable_list_sp->GetSize();
2540b57cec5SDimitry Andric       if (num_variables) {
2550b57cec5SDimitry Andric         for (size_t i = 0; i < num_variables; ++i) {
2560b57cec5SDimitry Andric           VariableSP variable_sp(variable_list_sp->GetVariableAtIndex(i));
2570b57cec5SDimitry Andric           if (variable_sp) {
2580b57cec5SDimitry Andric             bool add_variable = false;
2590b57cec5SDimitry Andric             switch (variable_sp->GetScope()) {
2600b57cec5SDimitry Andric             case eValueTypeVariableGlobal:
2610b57cec5SDimitry Andric             case eValueTypeVariableStatic:
2620b57cec5SDimitry Andric             case eValueTypeVariableThreadLocal:
2630b57cec5SDimitry Andric               add_variable = statics;
2640b57cec5SDimitry Andric               break;
2650b57cec5SDimitry Andric 
2660b57cec5SDimitry Andric             case eValueTypeVariableArgument:
2670b57cec5SDimitry Andric               add_variable = arguments;
2680b57cec5SDimitry Andric               break;
2690b57cec5SDimitry Andric 
2700b57cec5SDimitry Andric             case eValueTypeVariableLocal:
2710b57cec5SDimitry Andric               add_variable = locals;
2720b57cec5SDimitry Andric               break;
2730b57cec5SDimitry Andric 
2740b57cec5SDimitry Andric             default:
2750b57cec5SDimitry Andric               break;
2760b57cec5SDimitry Andric             }
2770b57cec5SDimitry Andric             if (add_variable) {
2780b57cec5SDimitry Andric               if (frame_sp) {
2790b57cec5SDimitry Andric                 lldb::ValueObjectSP valobj_sp(
2800b57cec5SDimitry Andric                     frame_sp->GetValueObjectForFrameVariable(variable_sp,
2810b57cec5SDimitry Andric                                                              eNoDynamicValues));
2820b57cec5SDimitry Andric                 SBValue value_sb;
2830b57cec5SDimitry Andric                 value_sb.SetSP(valobj_sp, use_dynamic);
2840b57cec5SDimitry Andric                 value_list.Append(value_sb);
2850b57cec5SDimitry Andric               }
2860b57cec5SDimitry Andric             }
2870b57cec5SDimitry Andric           }
2880b57cec5SDimitry Andric         }
2890b57cec5SDimitry Andric       }
2900b57cec5SDimitry Andric     }
2910b57cec5SDimitry Andric   }
2920b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(value_list);
2930b57cec5SDimitry Andric }
2940b57cec5SDimitry Andric 
GetVariables(lldb::SBTarget & target,bool arguments,bool locals,bool statics)2950b57cec5SDimitry Andric lldb::SBValueList SBBlock::GetVariables(lldb::SBTarget &target, bool arguments,
2960b57cec5SDimitry Andric                                         bool locals, bool statics) {
2970b57cec5SDimitry Andric   LLDB_RECORD_METHOD(lldb::SBValueList, SBBlock, GetVariables,
2980b57cec5SDimitry Andric                      (lldb::SBTarget &, bool, bool, bool), target, arguments,
2990b57cec5SDimitry Andric                      locals, statics);
3000b57cec5SDimitry Andric 
3010b57cec5SDimitry Andric   Block *block = GetPtr();
3020b57cec5SDimitry Andric 
3030b57cec5SDimitry Andric   SBValueList value_list;
3040b57cec5SDimitry Andric   if (block) {
3050b57cec5SDimitry Andric     TargetSP target_sp(target.GetSP());
3060b57cec5SDimitry Andric 
3070b57cec5SDimitry Andric     VariableListSP variable_list_sp(block->GetBlockVariableList(true));
3080b57cec5SDimitry Andric 
3090b57cec5SDimitry Andric     if (variable_list_sp) {
3100b57cec5SDimitry Andric       const size_t num_variables = variable_list_sp->GetSize();
3110b57cec5SDimitry Andric       if (num_variables) {
3120b57cec5SDimitry Andric         for (size_t i = 0; i < num_variables; ++i) {
3130b57cec5SDimitry Andric           VariableSP variable_sp(variable_list_sp->GetVariableAtIndex(i));
3140b57cec5SDimitry Andric           if (variable_sp) {
3150b57cec5SDimitry Andric             bool add_variable = false;
3160b57cec5SDimitry Andric             switch (variable_sp->GetScope()) {
3170b57cec5SDimitry Andric             case eValueTypeVariableGlobal:
3180b57cec5SDimitry Andric             case eValueTypeVariableStatic:
3190b57cec5SDimitry Andric             case eValueTypeVariableThreadLocal:
3200b57cec5SDimitry Andric               add_variable = statics;
3210b57cec5SDimitry Andric               break;
3220b57cec5SDimitry Andric 
3230b57cec5SDimitry Andric             case eValueTypeVariableArgument:
3240b57cec5SDimitry Andric               add_variable = arguments;
3250b57cec5SDimitry Andric               break;
3260b57cec5SDimitry Andric 
3270b57cec5SDimitry Andric             case eValueTypeVariableLocal:
3280b57cec5SDimitry Andric               add_variable = locals;
3290b57cec5SDimitry Andric               break;
3300b57cec5SDimitry Andric 
3310b57cec5SDimitry Andric             default:
3320b57cec5SDimitry Andric               break;
3330b57cec5SDimitry Andric             }
3340b57cec5SDimitry Andric             if (add_variable) {
3350b57cec5SDimitry Andric               if (target_sp)
3360b57cec5SDimitry Andric                 value_list.Append(
3370b57cec5SDimitry Andric                     ValueObjectVariable::Create(target_sp.get(), variable_sp));
3380b57cec5SDimitry Andric             }
3390b57cec5SDimitry Andric           }
3400b57cec5SDimitry Andric         }
3410b57cec5SDimitry Andric       }
3420b57cec5SDimitry Andric     }
3430b57cec5SDimitry Andric   }
3440b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(value_list);
3450b57cec5SDimitry Andric }
3460b57cec5SDimitry Andric 
3470b57cec5SDimitry Andric namespace lldb_private {
3480b57cec5SDimitry Andric namespace repro {
3490b57cec5SDimitry Andric 
3500b57cec5SDimitry Andric template <>
RegisterMethods(Registry & R)3510b57cec5SDimitry Andric void RegisterMethods<SBBlock>(Registry &R) {
3520b57cec5SDimitry Andric   LLDB_REGISTER_CONSTRUCTOR(SBBlock, ());
3530b57cec5SDimitry Andric   LLDB_REGISTER_CONSTRUCTOR(SBBlock, (const lldb::SBBlock &));
3540b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(const lldb::SBBlock &,
3550b57cec5SDimitry Andric                        SBBlock, operator=,(const lldb::SBBlock &));
3560b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBBlock, IsValid, ());
3570b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBBlock, operator bool, ());
3580b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBBlock, IsInlined, ());
3590b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(const char *, SBBlock, GetInlinedName, ());
3600b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBBlock,
3610b57cec5SDimitry Andric                              GetInlinedCallSiteFile, ());
3620b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(uint32_t, SBBlock, GetInlinedCallSiteLine, ());
3630b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(uint32_t, SBBlock, GetInlinedCallSiteColumn, ());
3640b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBBlock, SBBlock, GetParent, ());
3650b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBBlock, SBBlock, GetContainingInlinedBlock, ());
3660b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBBlock, SBBlock, GetSibling, ());
3670b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBBlock, SBBlock, GetFirstChild, ());
3680b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBBlock, GetDescription, (lldb::SBStream &));
3690b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(uint32_t, SBBlock, GetNumRanges, ());
3700b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBAddress, SBBlock, GetRangeStartAddress,
3710b57cec5SDimitry Andric                        (uint32_t));
3720b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBAddress, SBBlock, GetRangeEndAddress,
3730b57cec5SDimitry Andric                        (uint32_t));
3740b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(uint32_t, SBBlock, GetRangeIndexForBlockAddress,
3750b57cec5SDimitry Andric                        (lldb::SBAddress));
3760b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(
3770b57cec5SDimitry Andric       lldb::SBValueList, SBBlock, GetVariables,
3780b57cec5SDimitry Andric       (lldb::SBFrame &, bool, bool, bool, lldb::DynamicValueType));
3790b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(lldb::SBValueList, SBBlock, GetVariables,
3800b57cec5SDimitry Andric                        (lldb::SBTarget &, bool, bool, bool));
3810b57cec5SDimitry Andric }
3820b57cec5SDimitry Andric 
3830b57cec5SDimitry Andric }
3840b57cec5SDimitry Andric }
385