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
SBSymbolContext()23 SBSymbolContext::SBSymbolContext () :
24 m_opaque_ap ()
25 {
26 }
27
SBSymbolContext(const SymbolContext * sc_ptr)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
SBSymbolContext(const SBSymbolContext & rhs)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
~SBSymbolContext()47 SBSymbolContext::~SBSymbolContext ()
48 {
49 }
50
51 const SBSymbolContext &
operator =(const SBSymbolContext & rhs)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
SetSymbolContext(const SymbolContext * sc_ptr)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
IsValid() const80 SBSymbolContext::IsValid () const
81 {
82 return m_opaque_ap.get() != NULL;
83 }
84
85
86
87 SBModule
GetModule()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
GetCompileUnit()113 SBSymbolContext::GetCompileUnit ()
114 {
115 return SBCompileUnit (m_opaque_ap.get() ? m_opaque_ap->comp_unit : NULL);
116 }
117
118 SBFunction
GetFunction()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
GetBlock()139 SBSymbolContext::GetBlock ()
140 {
141 return SBBlock (m_opaque_ap.get() ? m_opaque_ap->block : NULL);
142 }
143
144 SBLineEntry
GetLineEntry()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
GetSymbol()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
SetModule(lldb::SBModule module)184 SBSymbolContext::SetModule (lldb::SBModule module)
185 {
186 ref().module_sp = module.GetSP();
187 }
188
189 void
SetCompileUnit(lldb::SBCompileUnit compile_unit)190 SBSymbolContext::SetCompileUnit (lldb::SBCompileUnit compile_unit)
191 {
192 ref().comp_unit = compile_unit.get();
193 }
194
195 void
SetFunction(lldb::SBFunction function)196 SBSymbolContext::SetFunction (lldb::SBFunction function)
197 {
198 ref().function = function.get();
199 }
200
201 void
SetBlock(lldb::SBBlock block)202 SBSymbolContext::SetBlock (lldb::SBBlock block)
203 {
204 ref().block = block.GetPtr();
205 }
206
207 void
SetLineEntry(lldb::SBLineEntry line_entry)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
SetSymbol(lldb::SBSymbol symbol)217 SBSymbolContext::SetSymbol (lldb::SBSymbol symbol)
218 {
219 ref().symbol = symbol.get();
220 }
221
222
223 lldb_private::SymbolContext*
operator ->() const224 SBSymbolContext::operator->() const
225 {
226 return m_opaque_ap.get();
227 }
228
229
230 const lldb_private::SymbolContext&
operator *() const231 SBSymbolContext::operator*() const
232 {
233 assert (m_opaque_ap.get());
234 return *m_opaque_ap.get();
235 }
236
237
238 lldb_private::SymbolContext&
operator *()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&
ref()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 *
get() const255 SBSymbolContext::get() const
256 {
257 return m_opaque_ap.get();
258 }
259
260 bool
GetDescription(SBStream & description)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
GetParentOfInlinedScope(const SBAddress & curr_frame_pc,SBAddress & parent_frame_addr) const276 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