1 //===-- SBSymbolContext.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/SBSymbolContext.h"
11 #include "lldb/API/SBStream.h"
12 #include "lldb/Core/Log.h"
13 #include "lldb/Core/Module.h"
14 #include "lldb/Symbol/Function.h"
15 #include "lldb/Symbol/Symbol.h"
16 #include "lldb/Symbol/SymbolContext.h"
17 
18 using namespace lldb;
19 using namespace lldb_private;
20 
21 
22 
23 SBSymbolContext::SBSymbolContext () :
24     m_opaque_ap ()
25 {
26 }
27 
28 SBSymbolContext::SBSymbolContext (const SymbolContext *sc_ptr) :
29     m_opaque_ap ()
30 {
31     if (sc_ptr)
32         m_opaque_ap.reset (new SymbolContext (*sc_ptr));
33 }
34 
35 SBSymbolContext::SBSymbolContext (const SBSymbolContext& rhs) :
36     m_opaque_ap ()
37 {
38     if (rhs.IsValid())
39     {
40         if (m_opaque_ap.get())
41             *m_opaque_ap = *rhs.m_opaque_ap;
42         else
43             ref() = *rhs.m_opaque_ap;
44     }
45 }
46 
47 SBSymbolContext::~SBSymbolContext ()
48 {
49 }
50 
51 const SBSymbolContext &
52 SBSymbolContext::operator = (const SBSymbolContext &rhs)
53 {
54     if (this != &rhs)
55     {
56         if (rhs.IsValid())
57             m_opaque_ap.reset (new lldb_private::SymbolContext(*rhs.m_opaque_ap.get()));
58     }
59     return *this;
60 }
61 
62 void
63 SBSymbolContext::SetSymbolContext (const SymbolContext *sc_ptr)
64 {
65     if (sc_ptr)
66     {
67         if (m_opaque_ap.get())
68             *m_opaque_ap = *sc_ptr;
69         else
70             m_opaque_ap.reset (new SymbolContext (*sc_ptr));
71     }
72     else
73     {
74         if (m_opaque_ap.get())
75             m_opaque_ap->Clear(true);
76     }
77 }
78 
79 bool
80 SBSymbolContext::IsValid () const
81 {
82     return m_opaque_ap.get() != NULL;
83 }
84 
85 
86 
87 SBModule
88 SBSymbolContext::GetModule ()
89 {
90     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
91 
92     SBModule sb_module;
93     ModuleSP module_sp;
94     if (m_opaque_ap.get())
95     {
96         module_sp = m_opaque_ap->module_sp;
97         sb_module.SetSP (module_sp);
98     }
99 
100     if (log)
101     {
102         SBStream sstr;
103         sb_module.GetDescription (sstr);
104         log->Printf ("SBSymbolContext(%p)::GetModule () => SBModule(%p): %s",
105                      static_cast<void*>(m_opaque_ap.get()),
106                      static_cast<void*>(module_sp.get()), sstr.GetData());
107     }
108 
109     return sb_module;
110 }
111 
112 SBCompileUnit
113 SBSymbolContext::GetCompileUnit ()
114 {
115     return SBCompileUnit (m_opaque_ap.get() ? m_opaque_ap->comp_unit : NULL);
116 }
117 
118 SBFunction
119 SBSymbolContext::GetFunction ()
120 {
121     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
122 
123     Function *function = NULL;
124 
125     if (m_opaque_ap.get())
126         function = m_opaque_ap->function;
127 
128     SBFunction sb_function (function);
129 
130     if (log)
131         log->Printf ("SBSymbolContext(%p)::GetFunction () => SBFunction(%p)",
132                      static_cast<void*>(m_opaque_ap.get()),
133                      static_cast<void*>(function));
134 
135     return sb_function;
136 }
137 
138 SBBlock
139 SBSymbolContext::GetBlock ()
140 {
141     return SBBlock (m_opaque_ap.get() ? m_opaque_ap->block : NULL);
142 }
143 
144 SBLineEntry
145 SBSymbolContext::GetLineEntry ()
146 {
147     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
148 
149     SBLineEntry sb_line_entry;
150     if (m_opaque_ap.get())
151         sb_line_entry.SetLineEntry (m_opaque_ap->line_entry);
152 
153     if (log)
154     {
155         log->Printf ("SBSymbolContext(%p)::GetLineEntry () => SBLineEntry(%p)",
156                      static_cast<void*>(m_opaque_ap.get()),
157                      static_cast<void*>(sb_line_entry.get()));
158     }
159 
160     return sb_line_entry;
161 }
162 
163 SBSymbol
164 SBSymbolContext::GetSymbol ()
165 {
166     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
167 
168     Symbol *symbol = NULL;
169 
170     if (m_opaque_ap.get())
171         symbol = m_opaque_ap->symbol;
172 
173     SBSymbol sb_symbol (symbol);
174 
175     if (log)
176         log->Printf ("SBSymbolContext(%p)::GetSymbol () => SBSymbol(%p)",
177                      static_cast<void*>(m_opaque_ap.get()),
178                      static_cast<void*>(symbol));
179 
180     return sb_symbol;
181 }
182 
183 void
184 SBSymbolContext::SetModule (lldb::SBModule module)
185 {
186     ref().module_sp = module.GetSP();
187 }
188 
189 void
190 SBSymbolContext::SetCompileUnit (lldb::SBCompileUnit compile_unit)
191 {
192     ref().comp_unit = compile_unit.get();
193 }
194 
195 void
196 SBSymbolContext::SetFunction (lldb::SBFunction function)
197 {
198     ref().function = function.get();
199 }
200 
201 void
202 SBSymbolContext::SetBlock (lldb::SBBlock block)
203 {
204     ref().block = block.GetPtr();
205 }
206 
207 void
208 SBSymbolContext::SetLineEntry (lldb::SBLineEntry line_entry)
209 {
210     if (line_entry.IsValid())
211         ref().line_entry = line_entry.ref();
212     else
213         ref().line_entry.Clear();
214 }
215 
216 void
217 SBSymbolContext::SetSymbol (lldb::SBSymbol symbol)
218 {
219     ref().symbol = symbol.get();
220 }
221 
222 
223 lldb_private::SymbolContext*
224 SBSymbolContext::operator->() const
225 {
226     return m_opaque_ap.get();
227 }
228 
229 
230 const lldb_private::SymbolContext&
231 SBSymbolContext::operator*() const
232 {
233     assert (m_opaque_ap.get());
234     return *m_opaque_ap.get();
235 }
236 
237 
238 lldb_private::SymbolContext&
239 SBSymbolContext::operator*()
240 {
241     if (m_opaque_ap.get() == NULL)
242         m_opaque_ap.reset (new SymbolContext);
243     return *m_opaque_ap.get();
244 }
245 
246 lldb_private::SymbolContext&
247 SBSymbolContext::ref()
248 {
249     if (m_opaque_ap.get() == NULL)
250         m_opaque_ap.reset (new SymbolContext);
251     return *m_opaque_ap.get();
252 }
253 
254 lldb_private::SymbolContext *
255 SBSymbolContext::get() const
256 {
257     return m_opaque_ap.get();
258 }
259 
260 bool
261 SBSymbolContext::GetDescription (SBStream &description)
262 {
263     Stream &strm = description.ref();
264 
265     if (m_opaque_ap.get())
266     {
267         m_opaque_ap->GetDescription (&strm, lldb::eDescriptionLevelFull, NULL);
268     }
269     else
270         strm.PutCString ("No value");
271 
272     return true;
273 }
274 
275 SBSymbolContext
276 SBSymbolContext::GetParentOfInlinedScope (const SBAddress &curr_frame_pc,
277                                           SBAddress &parent_frame_addr) const
278 {
279     SBSymbolContext sb_sc;
280     if (m_opaque_ap.get() && curr_frame_pc.IsValid())
281     {
282         if (m_opaque_ap->GetParentOfInlinedScope (curr_frame_pc.ref(), sb_sc.ref(), parent_frame_addr.ref()))
283             return sb_sc;
284     }
285     return SBSymbolContext();
286 }
287 
288