blob: 32f102181f21688d3989244ce752c0e3b73b763f [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 Clayton69aa5d92010-09-07 04:20:48 +000011#include "lldb/API/SBFileSpec.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000012#include "lldb/API/SBStream.h"
Chris Lattner24943d22010-06-08 16:52:24 +000013#include "lldb/Symbol/Block.h"
Greg Clayton69aa5d92010-09-07 04:20:48 +000014#include "lldb/Symbol/Function.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000015#include "lldb/Symbol/SymbolContext.h"
Chris Lattner24943d22010-06-08 16:52:24 +000016
17using namespace lldb;
Greg Clayton69aa5d92010-09-07 04:20:48 +000018using namespace lldb_private;
Chris Lattner24943d22010-06-08 16:52:24 +000019
20
21SBBlock::SBBlock () :
Greg Clayton63094e02010-06-23 01:19:29 +000022 m_opaque_ptr (NULL)
Chris Lattner24943d22010-06-08 16:52:24 +000023{
24}
25
26SBBlock::SBBlock (lldb_private::Block *lldb_object_ptr) :
Greg Clayton63094e02010-06-23 01:19:29 +000027 m_opaque_ptr (lldb_object_ptr)
Chris Lattner24943d22010-06-08 16:52:24 +000028{
29}
30
Greg Clayton538eb822010-11-05 23:17:00 +000031SBBlock::SBBlock(const SBBlock &rhs) :
32 m_opaque_ptr (rhs.m_opaque_ptr)
33{
34}
35
36const SBBlock &
37SBBlock::operator = (const SBBlock &rhs)
38{
39 m_opaque_ptr = rhs.m_opaque_ptr;
40 return *this;
41}
42
Chris Lattner24943d22010-06-08 16:52:24 +000043SBBlock::~SBBlock ()
44{
Greg Clayton63094e02010-06-23 01:19:29 +000045 m_opaque_ptr = NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000046}
47
48bool
49SBBlock::IsValid () const
50{
Greg Clayton63094e02010-06-23 01:19:29 +000051 return m_opaque_ptr != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000052}
53
Greg Clayton69aa5d92010-09-07 04:20:48 +000054bool
55SBBlock::IsInlined () const
56{
57 if (m_opaque_ptr)
58 return m_opaque_ptr->GetInlinedFunctionInfo () != NULL;
59 return false;
60}
61
62const char *
63SBBlock::GetInlinedName () const
64{
65 if (m_opaque_ptr)
66 {
67 const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
68 if (inlined_info)
69 return inlined_info->GetName().AsCString (NULL);
70 }
71 return NULL;
72}
73
74SBFileSpec
75SBBlock::GetInlinedCallSiteFile () const
76{
77 SBFileSpec sb_file;
78 if (m_opaque_ptr)
79 {
80 const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
81 if (inlined_info)
82 sb_file.SetFileSpec (inlined_info->GetCallSite().GetFile());
83 }
84 return sb_file;
85}
86
87uint32_t
88SBBlock::GetInlinedCallSiteLine () const
89{
90 if (m_opaque_ptr)
91 {
92 const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
93 if (inlined_info)
94 return inlined_info->GetCallSite().GetLine();
95 }
96 return 0;
97}
98
99uint32_t
100SBBlock::GetInlinedCallSiteColumn () const
101{
102 if (m_opaque_ptr)
103 {
104 const InlineFunctionInfo* inlined_info = m_opaque_ptr->GetInlinedFunctionInfo ();
105 if (inlined_info)
106 return inlined_info->GetCallSite().GetColumn();
107 }
108 return 0;
109}
110
Chris Lattner24943d22010-06-08 16:52:24 +0000111void
112SBBlock::AppendVariables (bool can_create, bool get_parent_variables, lldb_private::VariableList *var_list)
113{
114 if (IsValid())
115 {
Greg Clayton33ed1702010-08-24 00:45:41 +0000116 bool show_inline = true;
117 m_opaque_ptr->AppendVariables (can_create, get_parent_variables, show_inline, var_list);
Chris Lattner24943d22010-06-08 16:52:24 +0000118 }
119}
120
Greg Clayton69aa5d92010-09-07 04:20:48 +0000121SBBlock
122SBBlock::GetParent ()
123{
124 SBBlock sb_block;
125 if (m_opaque_ptr)
126 sb_block.m_opaque_ptr = m_opaque_ptr->GetParent();
127 return sb_block;
128}
129
130SBBlock
131SBBlock::GetSibling ()
132{
133 SBBlock sb_block;
134 if (m_opaque_ptr)
135 sb_block.m_opaque_ptr = m_opaque_ptr->GetSibling();
136 return sb_block;
137}
138
139SBBlock
140SBBlock::GetFirstChild ()
141{
142 SBBlock sb_block;
143 if (m_opaque_ptr)
144 sb_block.m_opaque_ptr = m_opaque_ptr->GetFirstChild();
145 return sb_block;
146}
147
Greg Claytona66ba462010-10-30 04:51:46 +0000148const lldb_private::Block *
149SBBlock::get () const
150{
151 return m_opaque_ptr;
152}
153
Chris Lattner24943d22010-06-08 16:52:24 +0000154
Caroline Tice98f930f2010-09-20 05:20:02 +0000155bool
156SBBlock::GetDescription (SBStream &description)
157{
158 if (m_opaque_ptr)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000159 {
Caroline Tice98f930f2010-09-20 05:20:02 +0000160 lldb::user_id_t id = m_opaque_ptr->GetID();
161 description.Printf ("Block: {id: %d} ", id);
162 if (IsInlined())
Caroline Ticee7a566e2010-09-20 16:21:41 +0000163 {
Caroline Tice98f930f2010-09-20 05:20:02 +0000164 description.Printf (" (inlined, '%s') ", GetInlinedName());
Caroline Ticee7a566e2010-09-20 16:21:41 +0000165 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000166 lldb_private::SymbolContext sc;
167 m_opaque_ptr->CalculateSymbolContext (&sc);
168 if (sc.function)
Caroline Ticee7a566e2010-09-20 16:21:41 +0000169 {
Caroline Tice98f930f2010-09-20 05:20:02 +0000170 m_opaque_ptr->DumpAddressRanges (description.get(),
171 sc.function->GetAddressRange().GetBaseAddress().GetFileAddress());
Caroline Ticee7a566e2010-09-20 16:21:41 +0000172 }
173 }
Caroline Tice98f930f2010-09-20 05:20:02 +0000174 else
175 description.Printf ("No value");
176
177 return true;
178}