blob: c8a665f7d6fb9672a309dab2ad59246b14296daa [file] [log] [blame]
Chris Lattner24943d22010-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 Clayton23b8abb2011-09-26 07:11:27 +000011#include "lldb/API/SBAddress.h"
Greg Clayton69aa5d92010-09-07 04:20:48 +000012#include "lldb/API/SBFileSpec.h"
Greg Clayton7dd5c512012-02-06 01:44:54 +000013#include "lldb/API/SBFrame.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000014#include "lldb/API/SBStream.h"
Greg Clayton7dd5c512012-02-06 01:44:54 +000015#include "lldb/API/SBValue.h"
Greg Clayton23b8abb2011-09-26 07:11:27 +000016#include "lldb/Core/AddressRange.h"
Greg Clayton7dd5c512012-02-06 01:44:54 +000017#include "lldb/Core/Log.h"
18#include "lldb/Core/ValueObjectVariable.h"
Chris Lattner24943d22010-06-08 16:52:24 +000019#include "lldb/Symbol/Block.h"
Greg Clayton69aa5d92010-09-07 04:20:48 +000020#include "lldb/Symbol/Function.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000021#include "lldb/Symbol/SymbolContext.h"
Greg Clayton7dd5c512012-02-06 01:44:54 +000022#include "lldb/Symbol/VariableList.h"
23#include "lldb/Target/StackFrame.h"
24#include "lldb/Target/Target.h"
Chris Lattner24943d22010-06-08 16:52:24 +000025
26using namespace lldb;
Greg Clayton69aa5d92010-09-07 04:20:48 +000027using namespace lldb_private;
Chris Lattner24943d22010-06-08 16:52:24 +000028
29
30SBBlock::SBBlock () :
Greg Clayton63094e02010-06-23 01:19:29 +000031 m_opaque_ptr (NULL)
Chris Lattner24943d22010-06-08 16:52:24 +000032{
33}
34
35SBBlock::SBBlock (lldb_private::Block *lldb_object_ptr) :
Greg Clayton63094e02010-06-23 01:19:29 +000036 m_opaque_ptr (lldb_object_ptr)
Chris Lattner24943d22010-06-08 16:52:24 +000037{
38}
39
Greg Clayton538eb822010-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 Lattner24943d22010-06-08 16:52:24 +000052SBBlock::~SBBlock ()
53{
Greg Clayton63094e02010-06-23 01:19:29 +000054 m_opaque_ptr = NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000055}
56
57bool
58SBBlock::IsValid () const
59{
Greg Clayton63094e02010-06-23 01:19:29 +000060 return m_opaque_ptr != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000061}
62
Greg Clayton69aa5d92010-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)
78 return inlined_info->GetName().AsCString (NULL);
79 }
80 return NULL;
81}
82
83SBFileSpec
84SBBlock::GetInlinedCallSiteFile () const
85{
86 SBFileSpec sb_file;
87 if (m_opaque_ptr)
88 {
89 const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
90 if (inlined_info)
91 sb_file.SetFileSpec (inlined_info->GetCallSite().GetFile());
92 }
93 return sb_file;
94}
95
96uint32_t
97SBBlock::GetInlinedCallSiteLine () const
98{
99 if (m_opaque_ptr)
100 {
101 const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
102 if (inlined_info)
103 return inlined_info->GetCallSite().GetLine();
104 }
105 return 0;
106}
107
108uint32_t
109SBBlock::GetInlinedCallSiteColumn () const
110{
111 if (m_opaque_ptr)
112 {
113 const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
114 if (inlined_info)
115 return inlined_info->GetCallSite().GetColumn();
116 }
117 return 0;
118}
119
Chris Lattner24943d22010-06-08 16:52:24 +0000120void
121SBBlock::AppendVariables (bool can_create, bool get_parent_variables, lldb_private::VariableList *var_list)
122{
123 if (IsValid())
124 {
Greg Clayton33ed1702010-08-24 00:45:41 +0000125 bool show_inline = true;
126 m_opaque_ptr->AppendVariables (can_create, get_parent_variables, show_inline, var_list);
Chris Lattner24943d22010-06-08 16:52:24 +0000127 }
128}
129
Greg Clayton69aa5d92010-09-07 04:20:48 +0000130SBBlock
131SBBlock::GetParent ()
132{
133 SBBlock sb_block;
134 if (m_opaque_ptr)
135 sb_block.m_opaque_ptr = m_opaque_ptr->GetParent();
136 return sb_block;
137}
138
Greg Clayton23b8abb2011-09-26 07:11:27 +0000139lldb::SBBlock
140SBBlock::GetContainingInlinedBlock ()
141{
142 SBBlock sb_block;
143 if (m_opaque_ptr)
144 sb_block.m_opaque_ptr = m_opaque_ptr->GetContainingInlinedBlock ();
145 return sb_block;
146}
147
Greg Clayton69aa5d92010-09-07 04:20:48 +0000148SBBlock
149SBBlock::GetSibling ()
150{
151 SBBlock sb_block;
152 if (m_opaque_ptr)
153 sb_block.m_opaque_ptr = m_opaque_ptr->GetSibling();
154 return sb_block;
155}
156
157SBBlock
158SBBlock::GetFirstChild ()
159{
160 SBBlock sb_block;
161 if (m_opaque_ptr)
162 sb_block.m_opaque_ptr = m_opaque_ptr->GetFirstChild();
163 return sb_block;
164}
165
Greg Clayton23b8abb2011-09-26 07:11:27 +0000166lldb_private::Block *
Greg Clayton7dd5c512012-02-06 01:44:54 +0000167SBBlock::GetPtr ()
Greg Claytona66ba462010-10-30 04:51:46 +0000168{
169 return m_opaque_ptr;
170}
171
Greg Claytondd62d722010-12-14 04:58:53 +0000172void
Greg Clayton7dd5c512012-02-06 01:44:54 +0000173SBBlock::SetPtr (lldb_private::Block *block)
Greg Claytondd62d722010-12-14 04:58:53 +0000174{
175 m_opaque_ptr = block;
176}
Chris Lattner24943d22010-06-08 16:52:24 +0000177
Caroline Tice98f930f2010-09-20 05:20:02 +0000178bool
179SBBlock::GetDescription (SBStream &description)
180{
Greg Clayton96154be2011-11-13 06:57:31 +0000181 Stream &strm = description.ref();
182
Caroline Tice98f930f2010-09-20 05:20:02 +0000183 if (m_opaque_ptr)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000184 {
Caroline Tice98f930f2010-09-20 05:20:02 +0000185 lldb::user_id_t id = m_opaque_ptr->GetID();
Daniel Malea5f35a4b2012-11-29 21:49:15 +0000186 strm.Printf ("Block: {id: %" PRIu64 "} ", id);
Caroline Tice98f930f2010-09-20 05:20:02 +0000187 if (IsInlined())
Caroline Ticee7a566e2010-09-20 16:21:41 +0000188 {
Greg Clayton96154be2011-11-13 06:57:31 +0000189 strm.Printf (" (inlined, '%s') ", GetInlinedName());
Caroline Ticee7a566e2010-09-20 16:21:41 +0000190 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000191 lldb_private::SymbolContext sc;
192 m_opaque_ptr->CalculateSymbolContext (&sc);
193 if (sc.function)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000194 {
Greg Clayton96154be2011-11-13 06:57:31 +0000195 m_opaque_ptr->DumpAddressRanges (&strm,
Caroline Tice98f930f2010-09-20 05:20:02 +0000196 sc.function->GetAddressRange().GetBaseAddress().GetFileAddress());
Caroline Ticee7a566e2010-09-20 16:21:41 +0000197 }
198 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000199 else
Greg Clayton96154be2011-11-13 06:57:31 +0000200 strm.PutCString ("No value");
Caroline Tice98f930f2010-09-20 05:20:02 +0000201
202 return true;
203}
Greg Clayton23b8abb2011-09-26 07:11:27 +0000204
205uint32_t
206SBBlock::GetNumRanges ()
207{
208 if (m_opaque_ptr)
209 return m_opaque_ptr->GetNumRanges();
210 return 0;
211}
212
213lldb::SBAddress
214SBBlock::GetRangeStartAddress (uint32_t idx)
215{
216 lldb::SBAddress sb_addr;
217 if (m_opaque_ptr)
218 {
219 AddressRange range;
220 if (m_opaque_ptr->GetRangeAtIndex(idx, range))
221 {
222 sb_addr.ref() = range.GetBaseAddress();
223 }
224 }
225 return sb_addr;
226}
227
228lldb::SBAddress
229SBBlock::GetRangeEndAddress (uint32_t idx)
230{
231 lldb::SBAddress sb_addr;
232 if (m_opaque_ptr)
233 {
234 AddressRange range;
235 if (m_opaque_ptr->GetRangeAtIndex(idx, range))
236 {
237 sb_addr.ref() = range.GetBaseAddress();
238 sb_addr.ref().Slide(range.GetByteSize());
239 }
240 }
241 return sb_addr;
242}
243
244uint32_t
245SBBlock::GetRangeIndexForBlockAddress (lldb::SBAddress block_addr)
246{
247 if (m_opaque_ptr && block_addr.IsValid())
248 {
Greg Claytonbc36a862011-10-08 00:49:15 +0000249 return m_opaque_ptr->GetRangeIndexContainingAddress (block_addr.ref());
Greg Clayton23b8abb2011-09-26 07:11:27 +0000250 }
251
252 return UINT32_MAX;
253}
254
Greg Clayton7dd5c512012-02-06 01:44:54 +0000255
256lldb::SBValueList
257SBBlock::GetVariables (lldb::SBFrame& frame,
258 bool arguments,
259 bool locals,
260 bool statics,
261 lldb::DynamicValueType use_dynamic)
262{
263 Block *block = GetPtr();
264 SBValueList value_list;
265 if (block)
266 {
267 StackFrameSP frame_sp(frame.GetFrameSP());
268 VariableListSP variable_list_sp (block->GetBlockVariableList (true));
269
270 if (variable_list_sp)
271 {
272 const size_t num_variables = variable_list_sp->GetSize();
273 if (num_variables)
274 {
275 for (size_t i = 0; i < num_variables; ++i)
276 {
277 VariableSP variable_sp (variable_list_sp->GetVariableAtIndex(i));
278 if (variable_sp)
279 {
280 bool add_variable = false;
281 switch (variable_sp->GetScope())
282 {
283 case eValueTypeVariableGlobal:
284 case eValueTypeVariableStatic:
285 add_variable = statics;
286 break;
287
288 case eValueTypeVariableArgument:
289 add_variable = arguments;
290 break;
291
292 case eValueTypeVariableLocal:
293 add_variable = locals;
294 break;
295
296 default:
297 break;
298 }
299 if (add_variable)
300 {
301 if (frame_sp)
Enrico Granata3d656c72012-10-22 18:18:36 +0000302 {
303 lldb::ValueObjectSP valobj_sp(frame_sp->GetValueObjectForFrameVariable (variable_sp,eNoDynamicValues));
304 SBValue value_sb;
305 value_sb.SetSP(valobj_sp, use_dynamic);
306 value_list.Append (value_sb);
307 }
Greg Clayton7dd5c512012-02-06 01:44:54 +0000308 }
309 }
310 }
311 }
312 }
313 }
314 return value_list;
315}
316
317lldb::SBValueList
318SBBlock::GetVariables (lldb::SBTarget& target,
319 bool arguments,
320 bool locals,
321 bool statics)
322{
323 Block *block = GetPtr();
324
325 SBValueList value_list;
326 if (block)
327 {
328 TargetSP target_sp(target.GetSP());
329
330 VariableListSP variable_list_sp (block->GetBlockVariableList (true));
331
332 if (variable_list_sp)
333 {
334 const size_t num_variables = variable_list_sp->GetSize();
335 if (num_variables)
336 {
337 for (size_t i = 0; i < num_variables; ++i)
338 {
339 VariableSP variable_sp (variable_list_sp->GetVariableAtIndex(i));
340 if (variable_sp)
341 {
342 bool add_variable = false;
343 switch (variable_sp->GetScope())
344 {
345 case eValueTypeVariableGlobal:
346 case eValueTypeVariableStatic:
347 add_variable = statics;
348 break;
349
350 case eValueTypeVariableArgument:
351 add_variable = arguments;
352 break;
353
354 case eValueTypeVariableLocal:
355 add_variable = locals;
356 break;
357
358 default:
359 break;
360 }
361 if (add_variable)
362 {
363 if (target_sp)
364 value_list.Append (ValueObjectVariable::Create (target_sp.get(), variable_sp));
365 }
366 }
367 }
368 }
369 }
370 }
371 return value_list;
372}
373