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();
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     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
91 
92     SBModule sb_module;
93     if (m_opaque_ap.get())
94         sb_module.SetModule(m_opaque_ap->module_sp);
95 
96     if (log)
97     {
98         SBStream sstr;
99         sb_module.GetDescription (sstr);
100         log->Printf ("SBSymbolContext(%p)::GetModule () => SBModule(%p): %s",
101                      m_opaque_ap.get(), sb_module.get(), sstr.GetData());
102     }
103 
104     return sb_module;
105 }
106 
107 SBCompileUnit
108 SBSymbolContext::GetCompileUnit ()
109 {
110     return SBCompileUnit (m_opaque_ap.get() ? m_opaque_ap->comp_unit : NULL);
111 }
112 
113 SBFunction
114 SBSymbolContext::GetFunction ()
115 {
116     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
117 
118     Function *function = NULL;
119 
120     if (m_opaque_ap.get())
121         function = m_opaque_ap->function;
122 
123     SBFunction sb_function (function);
124 
125     if (log)
126         log->Printf ("SBSymbolContext(%p)::GetFunction () => SBFunction(%p)",
127                      m_opaque_ap.get(), function);
128 
129     return sb_function;
130 }
131 
132 SBBlock
133 SBSymbolContext::GetBlock ()
134 {
135     return SBBlock (m_opaque_ap.get() ? m_opaque_ap->block : NULL);
136 }
137 
138 SBLineEntry
139 SBSymbolContext::GetLineEntry ()
140 {
141     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
142 
143     SBLineEntry sb_line_entry;
144     if (m_opaque_ap.get())
145         sb_line_entry.SetLineEntry (m_opaque_ap->line_entry);
146 
147     if (log)
148     {
149         log->Printf ("SBSymbolContext(%p)::GetLineEntry () => SBLineEntry(%p)",
150                      m_opaque_ap.get(), sb_line_entry.get());
151     }
152 
153     return sb_line_entry;
154 }
155 
156 SBSymbol
157 SBSymbolContext::GetSymbol ()
158 {
159     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
160 
161     Symbol *symbol = NULL;
162 
163     if (m_opaque_ap.get())
164         symbol = m_opaque_ap->symbol;
165 
166     SBSymbol sb_symbol (symbol);
167 
168     if (log)
169     {
170         log->Printf ("SBSymbolContext(%p)::GetSymbol () => SBSymbol(%p)",
171                      m_opaque_ap.get(), symbol);
172     }
173 
174     return sb_symbol;
175 }
176 
177 void
178 SBSymbolContext::SetModule (lldb::SBModule module)
179 {
180     ref().module_sp = module.get_sp();
181 }
182 
183 void
184 SBSymbolContext::SetCompileUnit (lldb::SBCompileUnit compile_unit)
185 {
186     ref().comp_unit = compile_unit.get();
187 }
188 
189 void
190 SBSymbolContext::SetFunction (lldb::SBFunction function)
191 {
192     ref().function = function.get();
193 }
194 
195 void
196 SBSymbolContext::SetBlock (lldb::SBBlock block)
197 {
198     ref().block = block.get();
199 }
200 
201 void
202 SBSymbolContext::SetLineEntry (lldb::SBLineEntry line_entry)
203 {
204     if (line_entry.IsValid())
205         ref().line_entry = line_entry.ref();
206     else
207         ref().line_entry.Clear();
208 }
209 
210 void
211 SBSymbolContext::SetSymbol (lldb::SBSymbol symbol)
212 {
213     ref().symbol = symbol.get();
214 }
215 
216 
217 lldb_private::SymbolContext*
218 SBSymbolContext::operator->() const
219 {
220     return m_opaque_ap.get();
221 }
222 
223 
224 const lldb_private::SymbolContext&
225 SBSymbolContext::operator*() const
226 {
227     assert (m_opaque_ap.get());
228     return *m_opaque_ap.get();
229 }
230 
231 
232 lldb_private::SymbolContext&
233 SBSymbolContext::operator*()
234 {
235     if (m_opaque_ap.get() == NULL)
236         m_opaque_ap.reset (new SymbolContext);
237     return *m_opaque_ap.get();
238 }
239 
240 lldb_private::SymbolContext&
241 SBSymbolContext::ref()
242 {
243     if (m_opaque_ap.get() == NULL)
244         m_opaque_ap.reset (new SymbolContext);
245     return *m_opaque_ap.get();
246 }
247 
248 lldb_private::SymbolContext *
249 SBSymbolContext::get() const
250 {
251     return m_opaque_ap.get();
252 }
253 
254 bool
255 SBSymbolContext::GetDescription (SBStream &description)
256 {
257     if (m_opaque_ap.get())
258     {
259         description.ref();
260         m_opaque_ap->GetDescription (description.get(), lldb::eDescriptionLevelFull, NULL);
261     }
262     else
263         description.Printf ("No value");
264 
265     return true;
266 }
267 
268 SBSymbolContext
269 SBSymbolContext::GetParentOfInlinedScope (const SBAddress &curr_frame_pc,
270                                           SBAddress &parent_frame_addr) const
271 {
272     SBSymbolContext sb_sc;
273     if (m_opaque_ap.get() && curr_frame_pc.IsValid())
274     {
275         if (m_opaque_ap->GetParentOfInlinedScope (curr_frame_pc.ref(), sb_sc.ref(), parent_frame_addr.ref()))
276             return sb_sc;
277     }
278     return SBSymbolContext();
279 }
280 
281