blob: ce5a4e4ceb0a500f55a61dd8bd8e89feb46cdbc4 [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBBlock.cpp ---------------------------------------------*- C++ -*-===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "lldb/API/SBBlock.h"
Jonas Devliegherebaf56642019-03-06 00:06:00 +000010#include "SBReproducerPrivate.h"
Greg Clayton8f7180b2011-09-26 07:11:27 +000011#include "lldb/API/SBAddress.h"
Greg Clayton95897c62010-09-07 04:20:48 +000012#include "lldb/API/SBFileSpec.h"
Greg Clayton5569e642012-02-06 01:44:54 +000013#include "lldb/API/SBFrame.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000014#include "lldb/API/SBStream.h"
Greg Clayton5569e642012-02-06 01:44:54 +000015#include "lldb/API/SBValue.h"
Greg Clayton8f7180b2011-09-26 07:11:27 +000016#include "lldb/Core/AddressRange.h"
Greg Clayton5569e642012-02-06 01:44:54 +000017#include "lldb/Core/ValueObjectVariable.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000018#include "lldb/Symbol/Block.h"
Greg Clayton95897c62010-09-07 04:20:48 +000019#include "lldb/Symbol/Function.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000020#include "lldb/Symbol/SymbolContext.h"
Greg Clayton5569e642012-02-06 01:44:54 +000021#include "lldb/Symbol/VariableList.h"
Jason Molendab57e4a12013-11-04 09:33:30 +000022#include "lldb/Target/StackFrame.h"
Greg Clayton5569e642012-02-06 01:44:54 +000023#include "lldb/Target/Target.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000024#include "lldb/Utility/Log.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000025
26using namespace lldb;
Greg Clayton95897c62010-09-07 04:20:48 +000027using namespace lldb_private;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000028
Jonas Devliegherebaf56642019-03-06 00:06:00 +000029SBBlock::SBBlock() : m_opaque_ptr(NULL) {
30 LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBBlock);
31}
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032
Kate Stoneb9c1b512016-09-06 20:57:50 +000033SBBlock::SBBlock(lldb_private::Block *lldb_object_ptr)
34 : m_opaque_ptr(lldb_object_ptr) {}
35
Jonas Devliegherebaf56642019-03-06 00:06:00 +000036SBBlock::SBBlock(const SBBlock &rhs) : m_opaque_ptr(rhs.m_opaque_ptr) {
37 LLDB_RECORD_CONSTRUCTOR(SBBlock, (const lldb::SBBlock &), rhs);
38}
Kate Stoneb9c1b512016-09-06 20:57:50 +000039
40const SBBlock &SBBlock::operator=(const SBBlock &rhs) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000041 LLDB_RECORD_METHOD(const lldb::SBBlock &,
42 SBBlock, operator=,(const lldb::SBBlock &), rhs);
43
Kate Stoneb9c1b512016-09-06 20:57:50 +000044 m_opaque_ptr = rhs.m_opaque_ptr;
45 return *this;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000046}
47
Kate Stoneb9c1b512016-09-06 20:57:50 +000048SBBlock::~SBBlock() { m_opaque_ptr = NULL; }
49
Jonas Devliegherebaf56642019-03-06 00:06:00 +000050bool SBBlock::IsValid() const {
51 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBBlock, IsValid);
52
53 return m_opaque_ptr != NULL;
54}
Kate Stoneb9c1b512016-09-06 20:57:50 +000055
56bool SBBlock::IsInlined() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000057 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBBlock, IsInlined);
58
Kate Stoneb9c1b512016-09-06 20:57:50 +000059 if (m_opaque_ptr)
60 return m_opaque_ptr->GetInlinedFunctionInfo() != NULL;
61 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000062}
63
Kate Stoneb9c1b512016-09-06 20:57:50 +000064const char *SBBlock::GetInlinedName() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000065 LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBBlock, GetInlinedName);
66
Kate Stoneb9c1b512016-09-06 20:57:50 +000067 if (m_opaque_ptr) {
68 const InlineFunctionInfo *inlined_info =
69 m_opaque_ptr->GetInlinedFunctionInfo();
70 if (inlined_info) {
71 Function *function = m_opaque_ptr->CalculateSymbolContextFunction();
72 LanguageType language;
73 if (function)
74 language = function->GetLanguage();
75 else
76 language = lldb::eLanguageTypeUnknown;
77 return inlined_info->GetName(language).AsCString(NULL);
Greg Clayton95897c62010-09-07 04:20:48 +000078 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000079 }
80 return NULL;
Greg Clayton95897c62010-09-07 04:20:48 +000081}
82
Kate Stoneb9c1b512016-09-06 20:57:50 +000083SBFileSpec SBBlock::GetInlinedCallSiteFile() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000084 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBBlock,
85 GetInlinedCallSiteFile);
86
Kate Stoneb9c1b512016-09-06 20:57:50 +000087 SBFileSpec sb_file;
88 if (m_opaque_ptr) {
89 const InlineFunctionInfo *inlined_info =
90 m_opaque_ptr->GetInlinedFunctionInfo();
91 if (inlined_info)
92 sb_file.SetFileSpec(inlined_info->GetCallSite().GetFile());
93 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +000094 return LLDB_RECORD_RESULT(sb_file);
Kate Stoneb9c1b512016-09-06 20:57:50 +000095}
96
97uint32_t SBBlock::GetInlinedCallSiteLine() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +000098 LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBBlock, GetInlinedCallSiteLine);
99
Kate Stoneb9c1b512016-09-06 20:57:50 +0000100 if (m_opaque_ptr) {
101 const InlineFunctionInfo *inlined_info =
102 m_opaque_ptr->GetInlinedFunctionInfo();
103 if (inlined_info)
104 return inlined_info->GetCallSite().GetLine();
105 }
106 return 0;
107}
108
109uint32_t SBBlock::GetInlinedCallSiteColumn() const {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000110 LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBBlock, GetInlinedCallSiteColumn);
111
Kate Stoneb9c1b512016-09-06 20:57:50 +0000112 if (m_opaque_ptr) {
113 const InlineFunctionInfo *inlined_info =
114 m_opaque_ptr->GetInlinedFunctionInfo();
115 if (inlined_info)
116 return inlined_info->GetCallSite().GetColumn();
117 }
118 return 0;
119}
120
121void SBBlock::AppendVariables(bool can_create, bool get_parent_variables,
122 lldb_private::VariableList *var_list) {
123 if (IsValid()) {
124 bool show_inline = true;
125 m_opaque_ptr->AppendVariables(can_create, get_parent_variables, show_inline,
126 [](Variable *) { return true; }, var_list);
127 }
128}
129
130SBBlock SBBlock::GetParent() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000131 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBBlock, SBBlock, GetParent);
132
Kate Stoneb9c1b512016-09-06 20:57:50 +0000133 SBBlock sb_block;
134 if (m_opaque_ptr)
135 sb_block.m_opaque_ptr = m_opaque_ptr->GetParent();
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000136 return LLDB_RECORD_RESULT(sb_block);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000137}
138
139lldb::SBBlock SBBlock::GetContainingInlinedBlock() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000140 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBBlock, SBBlock, GetContainingInlinedBlock);
141
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142 SBBlock sb_block;
143 if (m_opaque_ptr)
144 sb_block.m_opaque_ptr = m_opaque_ptr->GetContainingInlinedBlock();
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000145 return LLDB_RECORD_RESULT(sb_block);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000146}
147
148SBBlock SBBlock::GetSibling() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000149 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBBlock, SBBlock, GetSibling);
150
Kate Stoneb9c1b512016-09-06 20:57:50 +0000151 SBBlock sb_block;
152 if (m_opaque_ptr)
153 sb_block.m_opaque_ptr = m_opaque_ptr->GetSibling();
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000154 return LLDB_RECORD_RESULT(sb_block);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000155}
156
157SBBlock SBBlock::GetFirstChild() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000158 LLDB_RECORD_METHOD_NO_ARGS(lldb::SBBlock, SBBlock, GetFirstChild);
159
Kate Stoneb9c1b512016-09-06 20:57:50 +0000160 SBBlock sb_block;
161 if (m_opaque_ptr)
162 sb_block.m_opaque_ptr = m_opaque_ptr->GetFirstChild();
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000163 return LLDB_RECORD_RESULT(sb_block);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000164}
165
166lldb_private::Block *SBBlock::GetPtr() { return m_opaque_ptr; }
167
168void SBBlock::SetPtr(lldb_private::Block *block) { m_opaque_ptr = block; }
169
170bool SBBlock::GetDescription(SBStream &description) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000171 LLDB_RECORD_METHOD(bool, SBBlock, GetDescription, (lldb::SBStream &),
172 description);
173
Kate Stoneb9c1b512016-09-06 20:57:50 +0000174 Stream &strm = description.ref();
175
176 if (m_opaque_ptr) {
177 lldb::user_id_t id = m_opaque_ptr->GetID();
178 strm.Printf("Block: {id: %" PRIu64 "} ", id);
179 if (IsInlined()) {
180 strm.Printf(" (inlined, '%s') ", GetInlinedName());
Greg Clayton95897c62010-09-07 04:20:48 +0000181 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000182 lldb_private::SymbolContext sc;
183 m_opaque_ptr->CalculateSymbolContext(&sc);
184 if (sc.function) {
185 m_opaque_ptr->DumpAddressRanges(
186 &strm,
187 sc.function->GetAddressRange().GetBaseAddress().GetFileAddress());
Greg Clayton95897c62010-09-07 04:20:48 +0000188 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000189 } else
190 strm.PutCString("No value");
191
192 return true;
Greg Clayton95897c62010-09-07 04:20:48 +0000193}
194
Kate Stoneb9c1b512016-09-06 20:57:50 +0000195uint32_t SBBlock::GetNumRanges() {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000196 LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBBlock, GetNumRanges);
197
Kate Stoneb9c1b512016-09-06 20:57:50 +0000198 if (m_opaque_ptr)
199 return m_opaque_ptr->GetNumRanges();
200 return 0;
201}
202
203lldb::SBAddress SBBlock::GetRangeStartAddress(uint32_t idx) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000204 LLDB_RECORD_METHOD(lldb::SBAddress, SBBlock, GetRangeStartAddress, (uint32_t),
205 idx);
206
Kate Stoneb9c1b512016-09-06 20:57:50 +0000207 lldb::SBAddress sb_addr;
208 if (m_opaque_ptr) {
209 AddressRange range;
210 if (m_opaque_ptr->GetRangeAtIndex(idx, range)) {
211 sb_addr.ref() = range.GetBaseAddress();
Greg Clayton95897c62010-09-07 04:20:48 +0000212 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000213 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000214 return LLDB_RECORD_RESULT(sb_addr);
Greg Clayton95897c62010-09-07 04:20:48 +0000215}
216
Kate Stoneb9c1b512016-09-06 20:57:50 +0000217lldb::SBAddress SBBlock::GetRangeEndAddress(uint32_t idx) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000218 LLDB_RECORD_METHOD(lldb::SBAddress, SBBlock, GetRangeEndAddress, (uint32_t),
219 idx);
220
Kate Stoneb9c1b512016-09-06 20:57:50 +0000221 lldb::SBAddress sb_addr;
222 if (m_opaque_ptr) {
223 AddressRange range;
224 if (m_opaque_ptr->GetRangeAtIndex(idx, range)) {
225 sb_addr.ref() = range.GetBaseAddress();
226 sb_addr.ref().Slide(range.GetByteSize());
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000227 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000228 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000229 return LLDB_RECORD_RESULT(sb_addr);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000230}
231
Kate Stoneb9c1b512016-09-06 20:57:50 +0000232uint32_t SBBlock::GetRangeIndexForBlockAddress(lldb::SBAddress block_addr) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000233 LLDB_RECORD_METHOD(uint32_t, SBBlock, GetRangeIndexForBlockAddress,
234 (lldb::SBAddress), block_addr);
235
Kate Stoneb9c1b512016-09-06 20:57:50 +0000236 if (m_opaque_ptr && block_addr.IsValid()) {
237 return m_opaque_ptr->GetRangeIndexContainingAddress(block_addr.ref());
238 }
239
240 return UINT32_MAX;
Greg Clayton95897c62010-09-07 04:20:48 +0000241}
242
Kate Stoneb9c1b512016-09-06 20:57:50 +0000243lldb::SBValueList SBBlock::GetVariables(lldb::SBFrame &frame, bool arguments,
244 bool locals, bool statics,
245 lldb::DynamicValueType use_dynamic) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000246 LLDB_RECORD_METHOD(
247 lldb::SBValueList, SBBlock, GetVariables,
248 (lldb::SBFrame &, bool, bool, bool, lldb::DynamicValueType), frame,
249 arguments, locals, statics, use_dynamic);
250
Kate Stoneb9c1b512016-09-06 20:57:50 +0000251 Block *block = GetPtr();
252 SBValueList value_list;
253 if (block) {
254 StackFrameSP frame_sp(frame.GetFrameSP());
255 VariableListSP variable_list_sp(block->GetBlockVariableList(true));
Greg Clayton8f7180b2011-09-26 07:11:27 +0000256
Kate Stoneb9c1b512016-09-06 20:57:50 +0000257 if (variable_list_sp) {
258 const size_t num_variables = variable_list_sp->GetSize();
259 if (num_variables) {
260 for (size_t i = 0; i < num_variables; ++i) {
261 VariableSP variable_sp(variable_list_sp->GetVariableAtIndex(i));
262 if (variable_sp) {
263 bool add_variable = false;
264 switch (variable_sp->GetScope()) {
265 case eValueTypeVariableGlobal:
266 case eValueTypeVariableStatic:
267 case eValueTypeVariableThreadLocal:
268 add_variable = statics;
269 break;
Greg Clayton95897c62010-09-07 04:20:48 +0000270
Kate Stoneb9c1b512016-09-06 20:57:50 +0000271 case eValueTypeVariableArgument:
272 add_variable = arguments;
273 break;
Greg Clayton95897c62010-09-07 04:20:48 +0000274
Kate Stoneb9c1b512016-09-06 20:57:50 +0000275 case eValueTypeVariableLocal:
276 add_variable = locals;
277 break;
Greg Clayton48381312010-10-30 04:51:46 +0000278
Kate Stoneb9c1b512016-09-06 20:57:50 +0000279 default:
280 break;
Greg Clayton5569e642012-02-06 01:44:54 +0000281 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000282 if (add_variable) {
283 if (frame_sp) {
284 lldb::ValueObjectSP valobj_sp(
285 frame_sp->GetValueObjectForFrameVariable(variable_sp,
286 eNoDynamicValues));
287 SBValue value_sb;
288 value_sb.SetSP(valobj_sp, use_dynamic);
289 value_list.Append(value_sb);
290 }
Greg Clayton5569e642012-02-06 01:44:54 +0000291 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000292 }
Greg Clayton5569e642012-02-06 01:44:54 +0000293 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000294 }
295 }
296 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000297 return LLDB_RECORD_RESULT(value_list);
Greg Clayton5569e642012-02-06 01:44:54 +0000298}
299
Kate Stoneb9c1b512016-09-06 20:57:50 +0000300lldb::SBValueList SBBlock::GetVariables(lldb::SBTarget &target, bool arguments,
301 bool locals, bool statics) {
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000302 LLDB_RECORD_METHOD(lldb::SBValueList, SBBlock, GetVariables,
303 (lldb::SBTarget &, bool, bool, bool), target, arguments,
304 locals, statics);
305
Kate Stoneb9c1b512016-09-06 20:57:50 +0000306 Block *block = GetPtr();
307
308 SBValueList value_list;
309 if (block) {
310 TargetSP target_sp(target.GetSP());
311
312 VariableListSP variable_list_sp(block->GetBlockVariableList(true));
313
314 if (variable_list_sp) {
315 const size_t num_variables = variable_list_sp->GetSize();
316 if (num_variables) {
317 for (size_t i = 0; i < num_variables; ++i) {
318 VariableSP variable_sp(variable_list_sp->GetVariableAtIndex(i));
319 if (variable_sp) {
320 bool add_variable = false;
321 switch (variable_sp->GetScope()) {
322 case eValueTypeVariableGlobal:
323 case eValueTypeVariableStatic:
324 case eValueTypeVariableThreadLocal:
325 add_variable = statics;
326 break;
327
328 case eValueTypeVariableArgument:
329 add_variable = arguments;
330 break;
331
332 case eValueTypeVariableLocal:
333 add_variable = locals;
334 break;
335
336 default:
337 break;
338 }
339 if (add_variable) {
340 if (target_sp)
341 value_list.Append(
342 ValueObjectVariable::Create(target_sp.get(), variable_sp));
343 }
344 }
345 }
346 }
347 }
348 }
Jonas Devliegherebaf56642019-03-06 00:06:00 +0000349 return LLDB_RECORD_RESULT(value_list);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000350}