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"
108f7180b1SGreg Clayton #include "lldb/API/SBAddress.h"
1195897c6aSGreg Clayton #include "lldb/API/SBFileSpec.h"
125569e64eSGreg Clayton #include "lldb/API/SBFrame.h"
13dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
145569e64eSGreg Clayton #include "lldb/API/SBValue.h"
158f7180b1SGreg Clayton #include "lldb/Core/AddressRange.h"
165569e64eSGreg Clayton #include "lldb/Core/ValueObjectVariable.h"
1730fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
1895897c6aSGreg Clayton #include "lldb/Symbol/Function.h"
19dde9cff3SCaroline Tice #include "lldb/Symbol/SymbolContext.h"
205569e64eSGreg Clayton #include "lldb/Symbol/VariableList.h"
21b57e4a1bSJason Molenda #include "lldb/Target/StackFrame.h"
225569e64eSGreg Clayton #include "lldb/Target/Target.h"
23*1755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
2430fdc8d8SChris Lattner
2530fdc8d8SChris Lattner using namespace lldb;
2695897c6aSGreg Clayton using namespace lldb_private;
2730fdc8d8SChris Lattner
SBBlock()28*1755f5b1SJonas Devlieghere SBBlock::SBBlock() { LLDB_INSTRUMENT_VA(this); }
2930fdc8d8SChris Lattner
SBBlock(lldb_private::Block * lldb_object_ptr)30b9c1b51eSKate Stone SBBlock::SBBlock(lldb_private::Block *lldb_object_ptr)
31b9c1b51eSKate Stone : m_opaque_ptr(lldb_object_ptr) {}
3230fdc8d8SChris Lattner
SBBlock(const SBBlock & rhs)33baf5664fSJonas Devlieghere SBBlock::SBBlock(const SBBlock &rhs) : m_opaque_ptr(rhs.m_opaque_ptr) {
34*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
35baf5664fSJonas Devlieghere }
3630fdc8d8SChris Lattner
operator =(const SBBlock & rhs)37b9c1b51eSKate Stone const SBBlock &SBBlock::operator=(const SBBlock &rhs) {
38*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
39baf5664fSJonas Devlieghere
40efabb123SGreg Clayton m_opaque_ptr = rhs.m_opaque_ptr;
41d232abc3SJonas Devlieghere return *this;
42efabb123SGreg Clayton }
43efabb123SGreg Clayton
~SBBlock()44248a1305SKonrad Kleine SBBlock::~SBBlock() { m_opaque_ptr = nullptr; }
4530fdc8d8SChris Lattner
IsValid() const46baf5664fSJonas Devlieghere bool SBBlock::IsValid() const {
47*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
487f5237bcSPavel Labath return this->operator bool();
497f5237bcSPavel Labath }
operator bool() const507f5237bcSPavel Labath SBBlock::operator bool() const {
51*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
52baf5664fSJonas Devlieghere
53248a1305SKonrad Kleine return m_opaque_ptr != nullptr;
54baf5664fSJonas Devlieghere }
5530fdc8d8SChris Lattner
IsInlined() const56b9c1b51eSKate Stone bool SBBlock::IsInlined() const {
57*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
58baf5664fSJonas Devlieghere
5995897c6aSGreg Clayton if (m_opaque_ptr)
60248a1305SKonrad Kleine return m_opaque_ptr->GetInlinedFunctionInfo() != nullptr;
6195897c6aSGreg Clayton return false;
6295897c6aSGreg Clayton }
6395897c6aSGreg Clayton
GetInlinedName() const64b9c1b51eSKate Stone const char *SBBlock::GetInlinedName() const {
65*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
66baf5664fSJonas Devlieghere
67b9c1b51eSKate Stone if (m_opaque_ptr) {
68b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info =
69b9c1b51eSKate Stone m_opaque_ptr->GetInlinedFunctionInfo();
70b9c1b51eSKate Stone if (inlined_info) {
7122b04487SAlex Langford return inlined_info->GetName().AsCString(nullptr);
72ddaf6a72SGreg Clayton }
7395897c6aSGreg Clayton }
74248a1305SKonrad Kleine return nullptr;
7595897c6aSGreg Clayton }
7695897c6aSGreg Clayton
GetInlinedCallSiteFile() const77b9c1b51eSKate Stone SBFileSpec SBBlock::GetInlinedCallSiteFile() const {
78*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
79baf5664fSJonas Devlieghere
8095897c6aSGreg Clayton SBFileSpec sb_file;
81b9c1b51eSKate Stone if (m_opaque_ptr) {
82b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info =
83b9c1b51eSKate Stone m_opaque_ptr->GetInlinedFunctionInfo();
8495897c6aSGreg Clayton if (inlined_info)
8595897c6aSGreg Clayton sb_file.SetFileSpec(inlined_info->GetCallSite().GetFile());
8695897c6aSGreg Clayton }
87d232abc3SJonas Devlieghere return sb_file;
8895897c6aSGreg Clayton }
8995897c6aSGreg Clayton
GetInlinedCallSiteLine() const90b9c1b51eSKate Stone uint32_t SBBlock::GetInlinedCallSiteLine() const {
91*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
92baf5664fSJonas Devlieghere
93b9c1b51eSKate Stone if (m_opaque_ptr) {
94b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info =
95b9c1b51eSKate Stone m_opaque_ptr->GetInlinedFunctionInfo();
9695897c6aSGreg Clayton if (inlined_info)
9795897c6aSGreg Clayton return inlined_info->GetCallSite().GetLine();
9895897c6aSGreg Clayton }
9995897c6aSGreg Clayton return 0;
10095897c6aSGreg Clayton }
10195897c6aSGreg Clayton
GetInlinedCallSiteColumn() const102b9c1b51eSKate Stone uint32_t SBBlock::GetInlinedCallSiteColumn() const {
103*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
104baf5664fSJonas Devlieghere
105b9c1b51eSKate Stone if (m_opaque_ptr) {
106b9c1b51eSKate Stone const InlineFunctionInfo *inlined_info =
107b9c1b51eSKate Stone m_opaque_ptr->GetInlinedFunctionInfo();
10895897c6aSGreg Clayton if (inlined_info)
10995897c6aSGreg Clayton return inlined_info->GetCallSite().GetColumn();
11095897c6aSGreg Clayton }
11195897c6aSGreg Clayton return 0;
11295897c6aSGreg Clayton }
11395897c6aSGreg Clayton
AppendVariables(bool can_create,bool get_parent_variables,lldb_private::VariableList * var_list)114b9c1b51eSKate Stone void SBBlock::AppendVariables(bool can_create, bool get_parent_variables,
115b9c1b51eSKate Stone lldb_private::VariableList *var_list) {
116b9c1b51eSKate Stone if (IsValid()) {
1171b72fcb7SGreg Clayton bool show_inline = true;
118b9c1b51eSKate Stone m_opaque_ptr->AppendVariables(can_create, get_parent_variables, show_inline,
119b9c1b51eSKate Stone [](Variable *) { return true; }, var_list);
12030fdc8d8SChris Lattner }
12130fdc8d8SChris Lattner }
12230fdc8d8SChris Lattner
GetParent()123b9c1b51eSKate Stone SBBlock SBBlock::GetParent() {
124*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
125baf5664fSJonas Devlieghere
12695897c6aSGreg Clayton SBBlock sb_block;
12795897c6aSGreg Clayton if (m_opaque_ptr)
12895897c6aSGreg Clayton sb_block.m_opaque_ptr = m_opaque_ptr->GetParent();
129d232abc3SJonas Devlieghere return sb_block;
13095897c6aSGreg Clayton }
13195897c6aSGreg Clayton
GetContainingInlinedBlock()132b9c1b51eSKate Stone lldb::SBBlock SBBlock::GetContainingInlinedBlock() {
133*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
134baf5664fSJonas Devlieghere
1358f7180b1SGreg Clayton SBBlock sb_block;
1368f7180b1SGreg Clayton if (m_opaque_ptr)
1378f7180b1SGreg Clayton sb_block.m_opaque_ptr = m_opaque_ptr->GetContainingInlinedBlock();
138d232abc3SJonas Devlieghere return sb_block;
1398f7180b1SGreg Clayton }
1408f7180b1SGreg Clayton
GetSibling()141b9c1b51eSKate Stone SBBlock SBBlock::GetSibling() {
142*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
143baf5664fSJonas Devlieghere
14495897c6aSGreg Clayton SBBlock sb_block;
14595897c6aSGreg Clayton if (m_opaque_ptr)
14695897c6aSGreg Clayton sb_block.m_opaque_ptr = m_opaque_ptr->GetSibling();
147d232abc3SJonas Devlieghere return sb_block;
14895897c6aSGreg Clayton }
14995897c6aSGreg Clayton
GetFirstChild()150b9c1b51eSKate Stone SBBlock SBBlock::GetFirstChild() {
151*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
152baf5664fSJonas Devlieghere
15395897c6aSGreg Clayton SBBlock sb_block;
15495897c6aSGreg Clayton if (m_opaque_ptr)
15595897c6aSGreg Clayton sb_block.m_opaque_ptr = m_opaque_ptr->GetFirstChild();
156d232abc3SJonas Devlieghere return sb_block;
15795897c6aSGreg Clayton }
15895897c6aSGreg Clayton
GetPtr()159b9c1b51eSKate Stone lldb_private::Block *SBBlock::GetPtr() { return m_opaque_ptr; }
1604838131bSGreg Clayton
SetPtr(lldb_private::Block * block)161b9c1b51eSKate Stone void SBBlock::SetPtr(lldb_private::Block *block) { m_opaque_ptr = block; }
16230fdc8d8SChris Lattner
GetDescription(SBStream & description)163b9c1b51eSKate Stone bool SBBlock::GetDescription(SBStream &description) {
164*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, description);
165baf5664fSJonas Devlieghere
166da7bc7d0SGreg Clayton Stream &strm = description.ref();
167da7bc7d0SGreg Clayton
168b9c1b51eSKate Stone if (m_opaque_ptr) {
169dde9cff3SCaroline Tice lldb::user_id_t id = m_opaque_ptr->GetID();
170d01b2953SDaniel Malea strm.Printf("Block: {id: %" PRIu64 "} ", id);
171b9c1b51eSKate Stone if (IsInlined()) {
172da7bc7d0SGreg Clayton strm.Printf(" (inlined, '%s') ", GetInlinedName());
173dde9cff3SCaroline Tice }
174dde9cff3SCaroline Tice lldb_private::SymbolContext sc;
175dde9cff3SCaroline Tice m_opaque_ptr->CalculateSymbolContext(&sc);
176b9c1b51eSKate Stone if (sc.function) {
177b9c1b51eSKate Stone m_opaque_ptr->DumpAddressRanges(
178b9c1b51eSKate Stone &strm,
179dde9cff3SCaroline Tice sc.function->GetAddressRange().GetBaseAddress().GetFileAddress());
180dde9cff3SCaroline Tice }
181b9c1b51eSKate Stone } else
182da7bc7d0SGreg Clayton strm.PutCString("No value");
18330fdc8d8SChris Lattner
184dde9cff3SCaroline Tice return true;
185dde9cff3SCaroline Tice }
1868f7180b1SGreg Clayton
GetNumRanges()187b9c1b51eSKate Stone uint32_t SBBlock::GetNumRanges() {
188*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
189baf5664fSJonas Devlieghere
1908f7180b1SGreg Clayton if (m_opaque_ptr)
1918f7180b1SGreg Clayton return m_opaque_ptr->GetNumRanges();
1928f7180b1SGreg Clayton return 0;
1938f7180b1SGreg Clayton }
1948f7180b1SGreg Clayton
GetRangeStartAddress(uint32_t idx)195b9c1b51eSKate Stone lldb::SBAddress SBBlock::GetRangeStartAddress(uint32_t idx) {
196*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, idx);
197baf5664fSJonas Devlieghere
1988f7180b1SGreg Clayton lldb::SBAddress sb_addr;
199b9c1b51eSKate Stone if (m_opaque_ptr) {
2008f7180b1SGreg Clayton AddressRange range;
201b9c1b51eSKate Stone if (m_opaque_ptr->GetRangeAtIndex(idx, range)) {
2028f7180b1SGreg Clayton sb_addr.ref() = range.GetBaseAddress();
2038f7180b1SGreg Clayton }
2048f7180b1SGreg Clayton }
205d232abc3SJonas Devlieghere return sb_addr;
2068f7180b1SGreg Clayton }
2078f7180b1SGreg Clayton
GetRangeEndAddress(uint32_t idx)208b9c1b51eSKate Stone lldb::SBAddress SBBlock::GetRangeEndAddress(uint32_t idx) {
209*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, idx);
210baf5664fSJonas Devlieghere
2118f7180b1SGreg Clayton lldb::SBAddress sb_addr;
212b9c1b51eSKate Stone if (m_opaque_ptr) {
2138f7180b1SGreg Clayton AddressRange range;
214b9c1b51eSKate Stone if (m_opaque_ptr->GetRangeAtIndex(idx, range)) {
2158f7180b1SGreg Clayton sb_addr.ref() = range.GetBaseAddress();
2168f7180b1SGreg Clayton sb_addr.ref().Slide(range.GetByteSize());
2178f7180b1SGreg Clayton }
2188f7180b1SGreg Clayton }
219d232abc3SJonas Devlieghere return sb_addr;
2208f7180b1SGreg Clayton }
2218f7180b1SGreg Clayton
GetRangeIndexForBlockAddress(lldb::SBAddress block_addr)222b9c1b51eSKate Stone uint32_t SBBlock::GetRangeIndexForBlockAddress(lldb::SBAddress block_addr) {
223*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, block_addr);
224baf5664fSJonas Devlieghere
225b9c1b51eSKate Stone if (m_opaque_ptr && block_addr.IsValid()) {
226ea3e7d5cSGreg Clayton return m_opaque_ptr->GetRangeIndexContainingAddress(block_addr.ref());
2278f7180b1SGreg Clayton }
2288f7180b1SGreg Clayton
2298f7180b1SGreg Clayton return UINT32_MAX;
2308f7180b1SGreg Clayton }
2318f7180b1SGreg Clayton
GetVariables(lldb::SBFrame & frame,bool arguments,bool locals,bool statics,lldb::DynamicValueType use_dynamic)232b9c1b51eSKate Stone lldb::SBValueList SBBlock::GetVariables(lldb::SBFrame &frame, bool arguments,
233b9c1b51eSKate Stone bool locals, bool statics,
234b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) {
235*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, frame, arguments, locals, statics, use_dynamic);
236baf5664fSJonas Devlieghere
2375569e64eSGreg Clayton Block *block = GetPtr();
2385569e64eSGreg Clayton SBValueList value_list;
239b9c1b51eSKate Stone if (block) {
240b57e4a1bSJason Molenda StackFrameSP frame_sp(frame.GetFrameSP());
2415569e64eSGreg Clayton VariableListSP variable_list_sp(block->GetBlockVariableList(true));
2425569e64eSGreg Clayton
243b9c1b51eSKate Stone if (variable_list_sp) {
2445569e64eSGreg Clayton const size_t num_variables = variable_list_sp->GetSize();
245b9c1b51eSKate Stone if (num_variables) {
246b9c1b51eSKate Stone for (size_t i = 0; i < num_variables; ++i) {
2475569e64eSGreg Clayton VariableSP variable_sp(variable_list_sp->GetVariableAtIndex(i));
248b9c1b51eSKate Stone if (variable_sp) {
2495569e64eSGreg Clayton bool add_variable = false;
250b9c1b51eSKate Stone switch (variable_sp->GetScope()) {
2515569e64eSGreg Clayton case eValueTypeVariableGlobal:
2525569e64eSGreg Clayton case eValueTypeVariableStatic:
25363a27afaSGreg Clayton case eValueTypeVariableThreadLocal:
2545569e64eSGreg Clayton add_variable = statics;
2555569e64eSGreg Clayton break;
2565569e64eSGreg Clayton
2575569e64eSGreg Clayton case eValueTypeVariableArgument:
2585569e64eSGreg Clayton add_variable = arguments;
2595569e64eSGreg Clayton break;
2605569e64eSGreg Clayton
2615569e64eSGreg Clayton case eValueTypeVariableLocal:
2625569e64eSGreg Clayton add_variable = locals;
2635569e64eSGreg Clayton break;
2645569e64eSGreg Clayton
2655569e64eSGreg Clayton default:
2665569e64eSGreg Clayton break;
2675569e64eSGreg Clayton }
268b9c1b51eSKate Stone if (add_variable) {
269b9c1b51eSKate Stone if (frame_sp) {
270b9c1b51eSKate Stone lldb::ValueObjectSP valobj_sp(
271b9c1b51eSKate Stone frame_sp->GetValueObjectForFrameVariable(variable_sp,
272b9c1b51eSKate Stone eNoDynamicValues));
273e3e91517SEnrico Granata SBValue value_sb;
274e3e91517SEnrico Granata value_sb.SetSP(valobj_sp, use_dynamic);
275e3e91517SEnrico Granata value_list.Append(value_sb);
276e3e91517SEnrico Granata }
2775569e64eSGreg Clayton }
2785569e64eSGreg Clayton }
2795569e64eSGreg Clayton }
2805569e64eSGreg Clayton }
2815569e64eSGreg Clayton }
2825569e64eSGreg Clayton }
283d232abc3SJonas Devlieghere return value_list;
2845569e64eSGreg Clayton }
2855569e64eSGreg Clayton
GetVariables(lldb::SBTarget & target,bool arguments,bool locals,bool statics)286b9c1b51eSKate Stone lldb::SBValueList SBBlock::GetVariables(lldb::SBTarget &target, bool arguments,
287b9c1b51eSKate Stone bool locals, bool statics) {
288*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, target, arguments, locals, statics);
289baf5664fSJonas Devlieghere
2905569e64eSGreg Clayton Block *block = GetPtr();
2915569e64eSGreg Clayton
2925569e64eSGreg Clayton SBValueList value_list;
293b9c1b51eSKate Stone if (block) {
2945569e64eSGreg Clayton TargetSP target_sp(target.GetSP());
2955569e64eSGreg Clayton
2965569e64eSGreg Clayton VariableListSP variable_list_sp(block->GetBlockVariableList(true));
2975569e64eSGreg Clayton
298b9c1b51eSKate Stone if (variable_list_sp) {
2995569e64eSGreg Clayton const size_t num_variables = variable_list_sp->GetSize();
300b9c1b51eSKate Stone if (num_variables) {
301b9c1b51eSKate Stone for (size_t i = 0; i < num_variables; ++i) {
3025569e64eSGreg Clayton VariableSP variable_sp(variable_list_sp->GetVariableAtIndex(i));
303b9c1b51eSKate Stone if (variable_sp) {
3045569e64eSGreg Clayton bool add_variable = false;
305b9c1b51eSKate Stone switch (variable_sp->GetScope()) {
3065569e64eSGreg Clayton case eValueTypeVariableGlobal:
3075569e64eSGreg Clayton case eValueTypeVariableStatic:
30863a27afaSGreg Clayton case eValueTypeVariableThreadLocal:
3095569e64eSGreg Clayton add_variable = statics;
3105569e64eSGreg Clayton break;
3115569e64eSGreg Clayton
3125569e64eSGreg Clayton case eValueTypeVariableArgument:
3135569e64eSGreg Clayton add_variable = arguments;
3145569e64eSGreg Clayton break;
3155569e64eSGreg Clayton
3165569e64eSGreg Clayton case eValueTypeVariableLocal:
3175569e64eSGreg Clayton add_variable = locals;
3185569e64eSGreg Clayton break;
3195569e64eSGreg Clayton
3205569e64eSGreg Clayton default:
3215569e64eSGreg Clayton break;
3225569e64eSGreg Clayton }
323b9c1b51eSKate Stone if (add_variable) {
3245569e64eSGreg Clayton if (target_sp)
325b9c1b51eSKate Stone value_list.Append(
326b9c1b51eSKate Stone ValueObjectVariable::Create(target_sp.get(), variable_sp));
3275569e64eSGreg Clayton }
3285569e64eSGreg Clayton }
3295569e64eSGreg Clayton }
3305569e64eSGreg Clayton }
3315569e64eSGreg Clayton }
3325569e64eSGreg Clayton }
333d232abc3SJonas Devlieghere return value_list;
3345569e64eSGreg Clayton }
335