130fdc8d8SChris Lattner //===-- SBBlock.cpp ---------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "lldb/API/SBBlock.h"
118f7180b1SGreg Clayton #include "lldb/API/SBAddress.h"
1295897c6aSGreg Clayton #include "lldb/API/SBFileSpec.h"
13*5569e64eSGreg Clayton #include "lldb/API/SBFrame.h"
14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
15*5569e64eSGreg Clayton #include "lldb/API/SBValue.h"
168f7180b1SGreg Clayton #include "lldb/Core/AddressRange.h"
17*5569e64eSGreg Clayton #include "lldb/Core/Log.h"
18*5569e64eSGreg Clayton #include "lldb/Core/ValueObjectVariable.h"
1930fdc8d8SChris Lattner #include "lldb/Symbol/Block.h"
2095897c6aSGreg Clayton #include "lldb/Symbol/Function.h"
21dde9cff3SCaroline Tice #include "lldb/Symbol/SymbolContext.h"
22*5569e64eSGreg Clayton #include "lldb/Symbol/VariableList.h"
23*5569e64eSGreg Clayton #include "lldb/Target/StackFrame.h"
24*5569e64eSGreg Clayton #include "lldb/Target/Target.h"
2530fdc8d8SChris Lattner 
2630fdc8d8SChris Lattner using namespace lldb;
2795897c6aSGreg Clayton using namespace lldb_private;
2830fdc8d8SChris Lattner 
2930fdc8d8SChris Lattner 
3030fdc8d8SChris Lattner SBBlock::SBBlock () :
316611103cSGreg Clayton     m_opaque_ptr (NULL)
3230fdc8d8SChris Lattner {
3330fdc8d8SChris Lattner }
3430fdc8d8SChris Lattner 
3530fdc8d8SChris Lattner SBBlock::SBBlock (lldb_private::Block *lldb_object_ptr) :
366611103cSGreg Clayton     m_opaque_ptr (lldb_object_ptr)
3730fdc8d8SChris Lattner {
3830fdc8d8SChris Lattner }
3930fdc8d8SChris Lattner 
40efabb123SGreg Clayton SBBlock::SBBlock(const SBBlock &rhs) :
41efabb123SGreg Clayton     m_opaque_ptr (rhs.m_opaque_ptr)
42efabb123SGreg Clayton {
43efabb123SGreg Clayton }
44efabb123SGreg Clayton 
45efabb123SGreg Clayton const SBBlock &
46efabb123SGreg Clayton SBBlock::operator = (const SBBlock &rhs)
47efabb123SGreg Clayton {
48efabb123SGreg Clayton     m_opaque_ptr = rhs.m_opaque_ptr;
49efabb123SGreg Clayton     return *this;
50efabb123SGreg Clayton }
51efabb123SGreg Clayton 
5230fdc8d8SChris Lattner SBBlock::~SBBlock ()
5330fdc8d8SChris Lattner {
546611103cSGreg Clayton     m_opaque_ptr = NULL;
5530fdc8d8SChris Lattner }
5630fdc8d8SChris Lattner 
5730fdc8d8SChris Lattner bool
5830fdc8d8SChris Lattner SBBlock::IsValid () const
5930fdc8d8SChris Lattner {
606611103cSGreg Clayton     return m_opaque_ptr != NULL;
6130fdc8d8SChris Lattner }
6230fdc8d8SChris Lattner 
6395897c6aSGreg Clayton bool
6495897c6aSGreg Clayton SBBlock::IsInlined () const
6595897c6aSGreg Clayton {
6695897c6aSGreg Clayton     if (m_opaque_ptr)
6795897c6aSGreg Clayton         return m_opaque_ptr->GetInlinedFunctionInfo () != NULL;
6895897c6aSGreg Clayton     return false;
6995897c6aSGreg Clayton }
7095897c6aSGreg Clayton 
7195897c6aSGreg Clayton const char *
7295897c6aSGreg Clayton SBBlock::GetInlinedName () const
7395897c6aSGreg Clayton {
7495897c6aSGreg Clayton     if (m_opaque_ptr)
7595897c6aSGreg Clayton     {
7695897c6aSGreg Clayton         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
7795897c6aSGreg Clayton         if (inlined_info)
7895897c6aSGreg Clayton             return inlined_info->GetName().AsCString (NULL);
7995897c6aSGreg Clayton     }
8095897c6aSGreg Clayton     return NULL;
8195897c6aSGreg Clayton }
8295897c6aSGreg Clayton 
8395897c6aSGreg Clayton SBFileSpec
8495897c6aSGreg Clayton SBBlock::GetInlinedCallSiteFile () const
8595897c6aSGreg Clayton {
8695897c6aSGreg Clayton     SBFileSpec sb_file;
8795897c6aSGreg Clayton     if (m_opaque_ptr)
8895897c6aSGreg Clayton     {
8995897c6aSGreg Clayton         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
9095897c6aSGreg Clayton         if (inlined_info)
9195897c6aSGreg Clayton             sb_file.SetFileSpec (inlined_info->GetCallSite().GetFile());
9295897c6aSGreg Clayton     }
9395897c6aSGreg Clayton     return sb_file;
9495897c6aSGreg Clayton }
9595897c6aSGreg Clayton 
9695897c6aSGreg Clayton uint32_t
9795897c6aSGreg Clayton SBBlock::GetInlinedCallSiteLine () const
9895897c6aSGreg Clayton {
9995897c6aSGreg Clayton     if (m_opaque_ptr)
10095897c6aSGreg Clayton     {
10195897c6aSGreg Clayton         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
10295897c6aSGreg Clayton         if (inlined_info)
10395897c6aSGreg Clayton             return inlined_info->GetCallSite().GetLine();
10495897c6aSGreg Clayton     }
10595897c6aSGreg Clayton     return 0;
10695897c6aSGreg Clayton }
10795897c6aSGreg Clayton 
10895897c6aSGreg Clayton uint32_t
10995897c6aSGreg Clayton SBBlock::GetInlinedCallSiteColumn () const
11095897c6aSGreg Clayton {
11195897c6aSGreg Clayton     if (m_opaque_ptr)
11295897c6aSGreg Clayton     {
11395897c6aSGreg Clayton         const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
11495897c6aSGreg Clayton         if (inlined_info)
11595897c6aSGreg Clayton             return inlined_info->GetCallSite().GetColumn();
11695897c6aSGreg Clayton     }
11795897c6aSGreg Clayton     return 0;
11895897c6aSGreg Clayton }
11995897c6aSGreg Clayton 
12030fdc8d8SChris Lattner void
12130fdc8d8SChris Lattner SBBlock::AppendVariables (bool can_create, bool get_parent_variables, lldb_private::VariableList *var_list)
12230fdc8d8SChris Lattner {
12330fdc8d8SChris Lattner     if (IsValid())
12430fdc8d8SChris Lattner     {
1251b72fcb7SGreg Clayton         bool show_inline = true;
1261b72fcb7SGreg Clayton         m_opaque_ptr->AppendVariables (can_create, get_parent_variables, show_inline, var_list);
12730fdc8d8SChris Lattner     }
12830fdc8d8SChris Lattner }
12930fdc8d8SChris Lattner 
13095897c6aSGreg Clayton SBBlock
13195897c6aSGreg Clayton SBBlock::GetParent ()
13295897c6aSGreg Clayton {
13395897c6aSGreg Clayton     SBBlock sb_block;
13495897c6aSGreg Clayton     if (m_opaque_ptr)
13595897c6aSGreg Clayton         sb_block.m_opaque_ptr = m_opaque_ptr->GetParent();
13695897c6aSGreg Clayton     return sb_block;
13795897c6aSGreg Clayton }
13895897c6aSGreg Clayton 
1398f7180b1SGreg Clayton lldb::SBBlock
1408f7180b1SGreg Clayton SBBlock::GetContainingInlinedBlock  ()
1418f7180b1SGreg Clayton {
1428f7180b1SGreg Clayton     SBBlock sb_block;
1438f7180b1SGreg Clayton     if (m_opaque_ptr)
1448f7180b1SGreg Clayton         sb_block.m_opaque_ptr = m_opaque_ptr->GetContainingInlinedBlock ();
1458f7180b1SGreg Clayton     return sb_block;
1468f7180b1SGreg Clayton }
1478f7180b1SGreg Clayton 
14895897c6aSGreg Clayton SBBlock
14995897c6aSGreg Clayton SBBlock::GetSibling ()
15095897c6aSGreg Clayton {
15195897c6aSGreg Clayton     SBBlock sb_block;
15295897c6aSGreg Clayton     if (m_opaque_ptr)
15395897c6aSGreg Clayton         sb_block.m_opaque_ptr = m_opaque_ptr->GetSibling();
15495897c6aSGreg Clayton     return sb_block;
15595897c6aSGreg Clayton }
15695897c6aSGreg Clayton 
15795897c6aSGreg Clayton SBBlock
15895897c6aSGreg Clayton SBBlock::GetFirstChild ()
15995897c6aSGreg Clayton {
16095897c6aSGreg Clayton     SBBlock sb_block;
16195897c6aSGreg Clayton     if (m_opaque_ptr)
16295897c6aSGreg Clayton         sb_block.m_opaque_ptr = m_opaque_ptr->GetFirstChild();
16395897c6aSGreg Clayton     return sb_block;
16495897c6aSGreg Clayton }
16595897c6aSGreg Clayton 
1668f7180b1SGreg Clayton lldb_private::Block *
167*5569e64eSGreg Clayton SBBlock::GetPtr ()
1684838131bSGreg Clayton {
1694838131bSGreg Clayton     return m_opaque_ptr;
1704838131bSGreg Clayton }
1714838131bSGreg Clayton 
17272eff18aSGreg Clayton void
173*5569e64eSGreg Clayton SBBlock::SetPtr (lldb_private::Block *block)
17472eff18aSGreg Clayton {
17572eff18aSGreg Clayton     m_opaque_ptr = block;
17672eff18aSGreg Clayton }
17730fdc8d8SChris Lattner 
178dde9cff3SCaroline Tice bool
179dde9cff3SCaroline Tice SBBlock::GetDescription (SBStream &description)
180dde9cff3SCaroline Tice {
181da7bc7d0SGreg Clayton     Stream &strm = description.ref();
182da7bc7d0SGreg Clayton 
183dde9cff3SCaroline Tice     if (m_opaque_ptr)
184dde9cff3SCaroline Tice     {
185dde9cff3SCaroline Tice         lldb::user_id_t id = m_opaque_ptr->GetID();
186da7bc7d0SGreg Clayton         strm.Printf ("Block: {id: %llu} ", id);
187dde9cff3SCaroline Tice         if (IsInlined())
188dde9cff3SCaroline Tice         {
189da7bc7d0SGreg Clayton             strm.Printf (" (inlined, '%s') ", GetInlinedName());
190dde9cff3SCaroline Tice         }
191dde9cff3SCaroline Tice         lldb_private::SymbolContext sc;
192dde9cff3SCaroline Tice         m_opaque_ptr->CalculateSymbolContext (&sc);
193dde9cff3SCaroline Tice         if (sc.function)
194dde9cff3SCaroline Tice         {
195da7bc7d0SGreg Clayton             m_opaque_ptr->DumpAddressRanges (&strm,
196dde9cff3SCaroline Tice                                              sc.function->GetAddressRange().GetBaseAddress().GetFileAddress());
197dde9cff3SCaroline Tice         }
198dde9cff3SCaroline Tice     }
199dde9cff3SCaroline Tice     else
200da7bc7d0SGreg Clayton         strm.PutCString ("No value");
20130fdc8d8SChris Lattner 
202dde9cff3SCaroline Tice     return true;
203dde9cff3SCaroline Tice }
2048f7180b1SGreg Clayton 
2058f7180b1SGreg Clayton uint32_t
2068f7180b1SGreg Clayton SBBlock::GetNumRanges ()
2078f7180b1SGreg Clayton {
2088f7180b1SGreg Clayton     if (m_opaque_ptr)
2098f7180b1SGreg Clayton         return m_opaque_ptr->GetNumRanges();
2108f7180b1SGreg Clayton     return 0;
2118f7180b1SGreg Clayton }
2128f7180b1SGreg Clayton 
2138f7180b1SGreg Clayton lldb::SBAddress
2148f7180b1SGreg Clayton SBBlock::GetRangeStartAddress (uint32_t idx)
2158f7180b1SGreg Clayton {
2168f7180b1SGreg Clayton     lldb::SBAddress sb_addr;
2178f7180b1SGreg Clayton     if (m_opaque_ptr)
2188f7180b1SGreg Clayton     {
2198f7180b1SGreg Clayton         AddressRange range;
2208f7180b1SGreg Clayton         if (m_opaque_ptr->GetRangeAtIndex(idx, range))
2218f7180b1SGreg Clayton         {
2228f7180b1SGreg Clayton             sb_addr.ref() = range.GetBaseAddress();
2238f7180b1SGreg Clayton         }
2248f7180b1SGreg Clayton     }
2258f7180b1SGreg Clayton     return sb_addr;
2268f7180b1SGreg Clayton }
2278f7180b1SGreg Clayton 
2288f7180b1SGreg Clayton lldb::SBAddress
2298f7180b1SGreg Clayton SBBlock::GetRangeEndAddress (uint32_t idx)
2308f7180b1SGreg Clayton {
2318f7180b1SGreg Clayton     lldb::SBAddress sb_addr;
2328f7180b1SGreg Clayton     if (m_opaque_ptr)
2338f7180b1SGreg Clayton     {
2348f7180b1SGreg Clayton         AddressRange range;
2358f7180b1SGreg Clayton         if (m_opaque_ptr->GetRangeAtIndex(idx, range))
2368f7180b1SGreg Clayton         {
2378f7180b1SGreg Clayton             sb_addr.ref() = range.GetBaseAddress();
2388f7180b1SGreg Clayton             sb_addr.ref().Slide(range.GetByteSize());
2398f7180b1SGreg Clayton         }
2408f7180b1SGreg Clayton     }
2418f7180b1SGreg Clayton     return sb_addr;
2428f7180b1SGreg Clayton }
2438f7180b1SGreg Clayton 
2448f7180b1SGreg Clayton uint32_t
2458f7180b1SGreg Clayton SBBlock::GetRangeIndexForBlockAddress (lldb::SBAddress block_addr)
2468f7180b1SGreg Clayton {
2478f7180b1SGreg Clayton     if (m_opaque_ptr && block_addr.IsValid())
2488f7180b1SGreg Clayton     {
249ea3e7d5cSGreg Clayton         return m_opaque_ptr->GetRangeIndexContainingAddress (block_addr.ref());
2508f7180b1SGreg Clayton     }
2518f7180b1SGreg Clayton 
2528f7180b1SGreg Clayton     return UINT32_MAX;
2538f7180b1SGreg Clayton }
2548f7180b1SGreg Clayton 
255*5569e64eSGreg Clayton 
256*5569e64eSGreg Clayton lldb::SBValueList
257*5569e64eSGreg Clayton SBBlock::GetVariables (lldb::SBFrame& frame,
258*5569e64eSGreg Clayton                        bool arguments,
259*5569e64eSGreg Clayton                        bool locals,
260*5569e64eSGreg Clayton                        bool statics,
261*5569e64eSGreg Clayton                        lldb::DynamicValueType use_dynamic)
262*5569e64eSGreg Clayton {
263*5569e64eSGreg Clayton     Block *block = GetPtr();
264*5569e64eSGreg Clayton     SBValueList value_list;
265*5569e64eSGreg Clayton     if (block)
266*5569e64eSGreg Clayton     {
267*5569e64eSGreg Clayton         StackFrameSP frame_sp(frame.GetFrameSP());
268*5569e64eSGreg Clayton         VariableListSP variable_list_sp (block->GetBlockVariableList (true));
269*5569e64eSGreg Clayton 
270*5569e64eSGreg Clayton         if (variable_list_sp)
271*5569e64eSGreg Clayton         {
272*5569e64eSGreg Clayton             const size_t num_variables = variable_list_sp->GetSize();
273*5569e64eSGreg Clayton             if (num_variables)
274*5569e64eSGreg Clayton             {
275*5569e64eSGreg Clayton                 for (size_t i = 0; i < num_variables; ++i)
276*5569e64eSGreg Clayton                 {
277*5569e64eSGreg Clayton                     VariableSP variable_sp (variable_list_sp->GetVariableAtIndex(i));
278*5569e64eSGreg Clayton                     if (variable_sp)
279*5569e64eSGreg Clayton                     {
280*5569e64eSGreg Clayton                         bool add_variable = false;
281*5569e64eSGreg Clayton                         switch (variable_sp->GetScope())
282*5569e64eSGreg Clayton                         {
283*5569e64eSGreg Clayton                             case eValueTypeVariableGlobal:
284*5569e64eSGreg Clayton                             case eValueTypeVariableStatic:
285*5569e64eSGreg Clayton                                 add_variable = statics;
286*5569e64eSGreg Clayton                                 break;
287*5569e64eSGreg Clayton 
288*5569e64eSGreg Clayton                             case eValueTypeVariableArgument:
289*5569e64eSGreg Clayton                                 add_variable = arguments;
290*5569e64eSGreg Clayton                                 break;
291*5569e64eSGreg Clayton 
292*5569e64eSGreg Clayton                             case eValueTypeVariableLocal:
293*5569e64eSGreg Clayton                                 add_variable = locals;
294*5569e64eSGreg Clayton                                 break;
295*5569e64eSGreg Clayton 
296*5569e64eSGreg Clayton                             default:
297*5569e64eSGreg Clayton                                 break;
298*5569e64eSGreg Clayton                         }
299*5569e64eSGreg Clayton                         if (add_variable)
300*5569e64eSGreg Clayton                         {
301*5569e64eSGreg Clayton                             if (frame_sp)
302*5569e64eSGreg Clayton                                 value_list.Append (frame_sp->GetValueObjectForFrameVariable (variable_sp, use_dynamic));
303*5569e64eSGreg Clayton                         }
304*5569e64eSGreg Clayton                     }
305*5569e64eSGreg Clayton                 }
306*5569e64eSGreg Clayton             }
307*5569e64eSGreg Clayton         }
308*5569e64eSGreg Clayton     }
309*5569e64eSGreg Clayton     return value_list;
310*5569e64eSGreg Clayton }
311*5569e64eSGreg Clayton 
312*5569e64eSGreg Clayton lldb::SBValueList
313*5569e64eSGreg Clayton SBBlock::GetVariables (lldb::SBTarget& target,
314*5569e64eSGreg Clayton                        bool arguments,
315*5569e64eSGreg Clayton                        bool locals,
316*5569e64eSGreg Clayton                        bool statics)
317*5569e64eSGreg Clayton {
318*5569e64eSGreg Clayton     Block *block = GetPtr();
319*5569e64eSGreg Clayton 
320*5569e64eSGreg Clayton     SBValueList value_list;
321*5569e64eSGreg Clayton     if (block)
322*5569e64eSGreg Clayton     {
323*5569e64eSGreg Clayton         TargetSP target_sp(target.GetSP());
324*5569e64eSGreg Clayton 
325*5569e64eSGreg Clayton         VariableListSP variable_list_sp (block->GetBlockVariableList (true));
326*5569e64eSGreg Clayton 
327*5569e64eSGreg Clayton         if (variable_list_sp)
328*5569e64eSGreg Clayton         {
329*5569e64eSGreg Clayton             const size_t num_variables = variable_list_sp->GetSize();
330*5569e64eSGreg Clayton             if (num_variables)
331*5569e64eSGreg Clayton             {
332*5569e64eSGreg Clayton                 for (size_t i = 0; i < num_variables; ++i)
333*5569e64eSGreg Clayton                 {
334*5569e64eSGreg Clayton                     VariableSP variable_sp (variable_list_sp->GetVariableAtIndex(i));
335*5569e64eSGreg Clayton                     if (variable_sp)
336*5569e64eSGreg Clayton                     {
337*5569e64eSGreg Clayton                         bool add_variable = false;
338*5569e64eSGreg Clayton                         switch (variable_sp->GetScope())
339*5569e64eSGreg Clayton                         {
340*5569e64eSGreg Clayton                             case eValueTypeVariableGlobal:
341*5569e64eSGreg Clayton                             case eValueTypeVariableStatic:
342*5569e64eSGreg Clayton                                 add_variable = statics;
343*5569e64eSGreg Clayton                                 break;
344*5569e64eSGreg Clayton 
345*5569e64eSGreg Clayton                             case eValueTypeVariableArgument:
346*5569e64eSGreg Clayton                                 add_variable = arguments;
347*5569e64eSGreg Clayton                                 break;
348*5569e64eSGreg Clayton 
349*5569e64eSGreg Clayton                             case eValueTypeVariableLocal:
350*5569e64eSGreg Clayton                                 add_variable = locals;
351*5569e64eSGreg Clayton                                 break;
352*5569e64eSGreg Clayton 
353*5569e64eSGreg Clayton                             default:
354*5569e64eSGreg Clayton                                 break;
355*5569e64eSGreg Clayton                         }
356*5569e64eSGreg Clayton                         if (add_variable)
357*5569e64eSGreg Clayton                         {
358*5569e64eSGreg Clayton                             if (target_sp)
359*5569e64eSGreg Clayton                                 value_list.Append (ValueObjectVariable::Create (target_sp.get(), variable_sp));
360*5569e64eSGreg Clayton                         }
361*5569e64eSGreg Clayton                     }
362*5569e64eSGreg Clayton                 }
363*5569e64eSGreg Clayton             }
364*5569e64eSGreg Clayton         }
365*5569e64eSGreg Clayton     }
366*5569e64eSGreg Clayton     return value_list;
367*5569e64eSGreg Clayton }
368*5569e64eSGreg Clayton 
369