blob: fdbbbc04527939da151d0549dcb3fed16579bb2e [file] [log] [blame]
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001//===-- SBBlock.cpp ---------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/API/SBBlock.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/Log.h"
18#include "lldb/Core/ValueObjectVariable.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000019#include "lldb/Symbol/Block.h"
Greg Clayton95897c62010-09-07 04:20:48 +000020#include "lldb/Symbol/Function.h"
Caroline Ticedde9cff2010-09-20 05:20:02 +000021#include "lldb/Symbol/SymbolContext.h"
Greg Clayton5569e642012-02-06 01:44:54 +000022#include "lldb/Symbol/VariableList.h"
Jason Molendab57e4a12013-11-04 09:33:30 +000023#include "lldb/Target/StackFrame.h"
Greg Clayton5569e642012-02-06 01:44:54 +000024#include "lldb/Target/Target.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
29
30SBBlock::SBBlock () :
Greg Clayton66111032010-06-23 01:19:29 +000031 m_opaque_ptr (NULL)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032{
33}
34
35SBBlock::SBBlock (lldb_private::Block *lldb_object_ptr) :
Greg Clayton66111032010-06-23 01:19:29 +000036 m_opaque_ptr (lldb_object_ptr)
Chris Lattner30fdc8d2010-06-08 16:52:24 +000037{
38}
39
Greg Claytonefabb122010-11-05 23:17:00 +000040SBBlock::SBBlock(const SBBlock &rhs) :
41 m_opaque_ptr (rhs.m_opaque_ptr)
42{
43}
44
45const SBBlock &
46SBBlock::operator = (const SBBlock &rhs)
47{
48 m_opaque_ptr = rhs.m_opaque_ptr;
49 return *this;
50}
51
Chris Lattner30fdc8d2010-06-08 16:52:24 +000052SBBlock::~SBBlock ()
53{
Greg Clayton66111032010-06-23 01:19:29 +000054 m_opaque_ptr = NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000055}
56
57bool
58SBBlock::IsValid () const
59{
Greg Clayton66111032010-06-23 01:19:29 +000060 return m_opaque_ptr != NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000061}
62
Greg Clayton95897c62010-09-07 04:20:48 +000063bool
64SBBlock::IsInlined () const
65{
66 if (m_opaque_ptr)
67 return m_opaque_ptr->GetInlinedFunctionInfo () != NULL;
68 return false;
69}
70
71const char *
72SBBlock::GetInlinedName () const
73{
74 if (m_opaque_ptr)
75 {
76 const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
77 if (inlined_info)
Greg Claytonddaf6a72015-07-08 22:32:23 +000078 {
79 Function *function = m_opaque_ptr->CalculateSymbolContextFunction();
80 LanguageType language;
81 if (function)
82 language = function->GetLanguage();
83 else
84 language = lldb::eLanguageTypeUnknown;
85 return inlined_info->GetName(language).AsCString (NULL);
86 }
Greg Clayton95897c62010-09-07 04:20:48 +000087 }
88 return NULL;
89}
90
91SBFileSpec
92SBBlock::GetInlinedCallSiteFile () const
93{
94 SBFileSpec sb_file;
95 if (m_opaque_ptr)
96 {
97 const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
98 if (inlined_info)
99 sb_file.SetFileSpec (inlined_info->GetCallSite().GetFile());
100 }
101 return sb_file;
102}
103
104uint32_t
105SBBlock::GetInlinedCallSiteLine () const
106{
107 if (m_opaque_ptr)
108 {
109 const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
110 if (inlined_info)
111 return inlined_info->GetCallSite().GetLine();
112 }
113 return 0;
114}
115
116uint32_t
117SBBlock::GetInlinedCallSiteColumn () const
118{
119 if (m_opaque_ptr)
120 {
121 const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
122 if (inlined_info)
123 return inlined_info->GetCallSite().GetColumn();
124 }
125 return 0;
126}
127
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000128void
129SBBlock::AppendVariables (bool can_create, bool get_parent_variables, lldb_private::VariableList *var_list)
130{
131 if (IsValid())
132 {
Greg Clayton1b72fcb2010-08-24 00:45:41 +0000133 bool show_inline = true;
134 m_opaque_ptr->AppendVariables (can_create, get_parent_variables, show_inline, var_list);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000135 }
136}
137
Greg Clayton95897c62010-09-07 04:20:48 +0000138SBBlock
139SBBlock::GetParent ()
140{
141 SBBlock sb_block;
142 if (m_opaque_ptr)
143 sb_block.m_opaque_ptr = m_opaque_ptr->GetParent();
144 return sb_block;
145}
146
Greg Clayton8f7180b2011-09-26 07:11:27 +0000147lldb::SBBlock
148SBBlock::GetContainingInlinedBlock ()
149{
150 SBBlock sb_block;
151 if (m_opaque_ptr)
152 sb_block.m_opaque_ptr = m_opaque_ptr->GetContainingInlinedBlock ();
153 return sb_block;
154}
155
Greg Clayton95897c62010-09-07 04:20:48 +0000156SBBlock
157SBBlock::GetSibling ()
158{
159 SBBlock sb_block;
160 if (m_opaque_ptr)
161 sb_block.m_opaque_ptr = m_opaque_ptr->GetSibling();
162 return sb_block;
163}
164
165SBBlock
166SBBlock::GetFirstChild ()
167{
168 SBBlock sb_block;
169 if (m_opaque_ptr)
170 sb_block.m_opaque_ptr = m_opaque_ptr->GetFirstChild();
171 return sb_block;
172}
173
Greg Clayton8f7180b2011-09-26 07:11:27 +0000174lldb_private::Block *
Greg Clayton5569e642012-02-06 01:44:54 +0000175SBBlock::GetPtr ()
Greg Clayton48381312010-10-30 04:51:46 +0000176{
177 return m_opaque_ptr;
178}
179
Greg Clayton72eff182010-12-14 04:58:53 +0000180void
Greg Clayton5569e642012-02-06 01:44:54 +0000181SBBlock::SetPtr (lldb_private::Block *block)
Greg Clayton72eff182010-12-14 04:58:53 +0000182{
183 m_opaque_ptr = block;
184}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000185
Caroline Ticedde9cff2010-09-20 05:20:02 +0000186bool
187SBBlock::GetDescription (SBStream &description)
188{
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000189 Stream &strm = description.ref();
190
Caroline Ticedde9cff2010-09-20 05:20:02 +0000191 if (m_opaque_ptr)
Caroline Tice201a8852010-09-20 16:21:41 +0000192 {
Caroline Ticedde9cff2010-09-20 05:20:02 +0000193 lldb::user_id_t id = m_opaque_ptr->GetID();
Daniel Malead01b2952012-11-29 21:49:15 +0000194 strm.Printf ("Block: {id: %" PRIu64 "} ", id);
Caroline Ticedde9cff2010-09-20 05:20:02 +0000195 if (IsInlined())
Caroline Tice201a8852010-09-20 16:21:41 +0000196 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000197 strm.Printf (" (inlined, '%s') ", GetInlinedName());
Caroline Tice201a8852010-09-20 16:21:41 +0000198 }
Caroline Ticedde9cff2010-09-20 05:20:02 +0000199 lldb_private::SymbolContext sc;
200 m_opaque_ptr->CalculateSymbolContext (&sc);
201 if (sc.function)
Caroline Tice201a8852010-09-20 16:21:41 +0000202 {
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000203 m_opaque_ptr->DumpAddressRanges (&strm,
Caroline Ticedde9cff2010-09-20 05:20:02 +0000204 sc.function->GetAddressRange().GetBaseAddress().GetFileAddress());
Caroline Tice201a8852010-09-20 16:21:41 +0000205 }
206 }
Caroline Ticedde9cff2010-09-20 05:20:02 +0000207 else
Greg Claytonda7bc7d2011-11-13 06:57:31 +0000208 strm.PutCString ("No value");
Caroline Ticedde9cff2010-09-20 05:20:02 +0000209
210 return true;
211}
Greg Clayton8f7180b2011-09-26 07:11:27 +0000212
213uint32_t
214SBBlock::GetNumRanges ()
215{
216 if (m_opaque_ptr)
217 return m_opaque_ptr->GetNumRanges();
218 return 0;
219}
220
221lldb::SBAddress
222SBBlock::GetRangeStartAddress (uint32_t idx)
223{
224 lldb::SBAddress sb_addr;
225 if (m_opaque_ptr)
226 {
227 AddressRange range;
228 if (m_opaque_ptr->GetRangeAtIndex(idx, range))
229 {
230 sb_addr.ref() = range.GetBaseAddress();
231 }
232 }
233 return sb_addr;
234}
235
236lldb::SBAddress
237SBBlock::GetRangeEndAddress (uint32_t idx)
238{
239 lldb::SBAddress sb_addr;
240 if (m_opaque_ptr)
241 {
242 AddressRange range;
243 if (m_opaque_ptr->GetRangeAtIndex(idx, range))
244 {
245 sb_addr.ref() = range.GetBaseAddress();
246 sb_addr.ref().Slide(range.GetByteSize());
247 }
248 }
249 return sb_addr;
250}
251
252uint32_t
253SBBlock::GetRangeIndexForBlockAddress (lldb::SBAddress block_addr)
254{
255 if (m_opaque_ptr && block_addr.IsValid())
256 {
Greg Claytonea3e7d52011-10-08 00:49:15 +0000257 return m_opaque_ptr->GetRangeIndexContainingAddress (block_addr.ref());
Greg Clayton8f7180b2011-09-26 07:11:27 +0000258 }
259
260 return UINT32_MAX;
261}
262
Greg Clayton5569e642012-02-06 01:44:54 +0000263
264lldb::SBValueList
265SBBlock::GetVariables (lldb::SBFrame& frame,
266 bool arguments,
267 bool locals,
268 bool statics,
269 lldb::DynamicValueType use_dynamic)
270{
271 Block *block = GetPtr();
272 SBValueList value_list;
273 if (block)
274 {
Jason Molendab57e4a12013-11-04 09:33:30 +0000275 StackFrameSP frame_sp(frame.GetFrameSP());
Greg Clayton5569e642012-02-06 01:44:54 +0000276 VariableListSP variable_list_sp (block->GetBlockVariableList (true));
277
278 if (variable_list_sp)
279 {
280 const size_t num_variables = variable_list_sp->GetSize();
281 if (num_variables)
282 {
283 for (size_t i = 0; i < num_variables; ++i)
284 {
285 VariableSP variable_sp (variable_list_sp->GetVariableAtIndex(i));
286 if (variable_sp)
287 {
288 bool add_variable = false;
289 switch (variable_sp->GetScope())
290 {
291 case eValueTypeVariableGlobal:
292 case eValueTypeVariableStatic:
293 add_variable = statics;
294 break;
295
296 case eValueTypeVariableArgument:
297 add_variable = arguments;
298 break;
299
300 case eValueTypeVariableLocal:
301 add_variable = locals;
302 break;
303
304 default:
305 break;
306 }
307 if (add_variable)
308 {
309 if (frame_sp)
Enrico Granatae3e91512012-10-22 18:18:36 +0000310 {
311 lldb::ValueObjectSP valobj_sp(frame_sp->GetValueObjectForFrameVariable (variable_sp,eNoDynamicValues));
312 SBValue value_sb;
313 value_sb.SetSP(valobj_sp, use_dynamic);
314 value_list.Append (value_sb);
315 }
Greg Clayton5569e642012-02-06 01:44:54 +0000316 }
317 }
318 }
319 }
320 }
321 }
322 return value_list;
323}
324
325lldb::SBValueList
326SBBlock::GetVariables (lldb::SBTarget& target,
327 bool arguments,
328 bool locals,
329 bool statics)
330{
331 Block *block = GetPtr();
332
333 SBValueList value_list;
334 if (block)
335 {
336 TargetSP target_sp(target.GetSP());
337
338 VariableListSP variable_list_sp (block->GetBlockVariableList (true));
339
340 if (variable_list_sp)
341 {
342 const size_t num_variables = variable_list_sp->GetSize();
343 if (num_variables)
344 {
345 for (size_t i = 0; i < num_variables; ++i)
346 {
347 VariableSP variable_sp (variable_list_sp->GetVariableAtIndex(i));
348 if (variable_sp)
349 {
350 bool add_variable = false;
351 switch (variable_sp->GetScope())
352 {
353 case eValueTypeVariableGlobal:
354 case eValueTypeVariableStatic:
355 add_variable = statics;
356 break;
357
358 case eValueTypeVariableArgument:
359 add_variable = arguments;
360 break;
361
362 case eValueTypeVariableLocal:
363 add_variable = locals;
364 break;
365
366 default:
367 break;
368 }
369 if (add_variable)
370 {
371 if (target_sp)
372 value_list.Append (ValueObjectVariable::Create (target_sp.get(), variable_sp));
373 }
374 }
375 }
376 }
377 }
378 }
379 return value_list;
380}
381