blob: 479b0f75bfe9f2d4f1ee492d87f62bab9e721492 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- 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"
Caroline Tice98f930f2010-09-20 05:20:02 +000011#include "lldb/API/SBStream.h"
Caroline Tice7826c882010-10-26 03:11:13 +000012#include "lldb/Core/Log.h"
Greg Clayton23b8abb2011-09-26 07:11:27 +000013#include "lldb/Core/Module.h"
Greg Clayton49ce6822010-10-31 03:01:06 +000014#include "lldb/Symbol/Function.h"
15#include "lldb/Symbol/Symbol.h"
16#include "lldb/Symbol/SymbolContext.h"
Chris Lattner24943d22010-06-08 16:52:24 +000017
18using namespace lldb;
19using namespace lldb_private;
20
21
22
23SBSymbolContext::SBSymbolContext () :
Greg Clayton63094e02010-06-23 01:19:29 +000024 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000025{
26}
27
28SBSymbolContext::SBSymbolContext (const SymbolContext *sc_ptr) :
Greg Clayton63094e02010-06-23 01:19:29 +000029 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000030{
31 if (sc_ptr)
Greg Clayton63094e02010-06-23 01:19:29 +000032 m_opaque_ap.reset (new SymbolContext (*sc_ptr));
Chris Lattner24943d22010-06-08 16:52:24 +000033}
34
35SBSymbolContext::SBSymbolContext (const SBSymbolContext& rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000036 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000037{
38 if (rhs.IsValid())
Caroline Ticee49ec182010-09-22 23:01:29 +000039 {
40 if (m_opaque_ap.get())
41 *m_opaque_ap = *rhs.m_opaque_ap;
42 else
43 ref() = *rhs.m_opaque_ap;
44 }
Chris Lattner24943d22010-06-08 16:52:24 +000045}
46
47SBSymbolContext::~SBSymbolContext ()
48{
49}
50
51const SBSymbolContext &
52SBSymbolContext::operator = (const SBSymbolContext &rhs)
53{
54 if (this != &rhs)
55 {
56 if (rhs.IsValid())
Greg Clayton63094e02010-06-23 01:19:29 +000057 m_opaque_ap.reset (new lldb_private::SymbolContext(*rhs.m_opaque_ap.get()));
Chris Lattner24943d22010-06-08 16:52:24 +000058 }
59 return *this;
60}
61
62void
63SBSymbolContext::SetSymbolContext (const SymbolContext *sc_ptr)
64{
65 if (sc_ptr)
66 {
Greg Clayton63094e02010-06-23 01:19:29 +000067 if (m_opaque_ap.get())
68 *m_opaque_ap = *sc_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +000069 else
Greg Clayton63094e02010-06-23 01:19:29 +000070 m_opaque_ap.reset (new SymbolContext (*sc_ptr));
Chris Lattner24943d22010-06-08 16:52:24 +000071 }
72 else
73 {
Greg Clayton63094e02010-06-23 01:19:29 +000074 if (m_opaque_ap.get())
Greg Claytona7e864c2013-02-23 04:12:47 +000075 m_opaque_ap->Clear(true);
Chris Lattner24943d22010-06-08 16:52:24 +000076 }
77}
78
79bool
80SBSymbolContext::IsValid () const
81{
Greg Clayton63094e02010-06-23 01:19:29 +000082 return m_opaque_ap.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +000083}
84
85
86
87SBModule
88SBSymbolContext::GetModule ()
89{
Greg Clayton952e9dc2013-03-27 23:08:40 +000090 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000091
Chris Lattner24943d22010-06-08 16:52:24 +000092 SBModule sb_module;
Greg Clayton0416bdf2012-01-30 09:04:36 +000093 ModuleSP module_sp;
Greg Clayton63094e02010-06-23 01:19:29 +000094 if (m_opaque_ap.get())
Greg Clayton0416bdf2012-01-30 09:04:36 +000095 {
96 module_sp = m_opaque_ap->module_sp;
97 sb_module.SetSP (module_sp);
98 }
Caroline Tice7826c882010-10-26 03:11:13 +000099
100 if (log)
101 {
102 SBStream sstr;
103 sb_module.GetDescription (sstr);
Greg Claytona66ba462010-10-30 04:51:46 +0000104 log->Printf ("SBSymbolContext(%p)::GetModule () => SBModule(%p): %s",
Greg Clayton0416bdf2012-01-30 09:04:36 +0000105 m_opaque_ap.get(), module_sp.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000106 }
107
Chris Lattner24943d22010-06-08 16:52:24 +0000108 return sb_module;
109}
110
111SBCompileUnit
112SBSymbolContext::GetCompileUnit ()
113{
Greg Clayton63094e02010-06-23 01:19:29 +0000114 return SBCompileUnit (m_opaque_ap.get() ? m_opaque_ap->comp_unit : NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000115}
116
117SBFunction
118SBSymbolContext::GetFunction ()
119{
Greg Clayton952e9dc2013-03-27 23:08:40 +0000120 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000121
Greg Clayton49ce6822010-10-31 03:01:06 +0000122 Function *function = NULL;
123
124 if (m_opaque_ap.get())
125 function = m_opaque_ap->function;
126
127 SBFunction sb_function (function);
Caroline Tice7826c882010-10-26 03:11:13 +0000128
129 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000130 log->Printf ("SBSymbolContext(%p)::GetFunction () => SBFunction(%p)",
131 m_opaque_ap.get(), function);
Caroline Tice7826c882010-10-26 03:11:13 +0000132
Greg Clayton49ce6822010-10-31 03:01:06 +0000133 return sb_function;
Chris Lattner24943d22010-06-08 16:52:24 +0000134}
135
136SBBlock
137SBSymbolContext::GetBlock ()
138{
Greg Clayton63094e02010-06-23 01:19:29 +0000139 return SBBlock (m_opaque_ap.get() ? m_opaque_ap->block : NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000140}
141
142SBLineEntry
143SBSymbolContext::GetLineEntry ()
144{
Greg Clayton952e9dc2013-03-27 23:08:40 +0000145 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000146
Chris Lattner24943d22010-06-08 16:52:24 +0000147 SBLineEntry sb_line_entry;
Greg Clayton63094e02010-06-23 01:19:29 +0000148 if (m_opaque_ap.get())
149 sb_line_entry.SetLineEntry (m_opaque_ap->line_entry);
Chris Lattner24943d22010-06-08 16:52:24 +0000150
Caroline Tice7826c882010-10-26 03:11:13 +0000151 if (log)
152 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000153 log->Printf ("SBSymbolContext(%p)::GetLineEntry () => SBLineEntry(%p)",
154 m_opaque_ap.get(), sb_line_entry.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000155 }
156
Chris Lattner24943d22010-06-08 16:52:24 +0000157 return sb_line_entry;
158}
159
160SBSymbol
161SBSymbolContext::GetSymbol ()
162{
Greg Clayton952e9dc2013-03-27 23:08:40 +0000163 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000164
Greg Clayton49ce6822010-10-31 03:01:06 +0000165 Symbol *symbol = NULL;
166
167 if (m_opaque_ap.get())
168 symbol = m_opaque_ap->symbol;
169
170 SBSymbol sb_symbol (symbol);
Caroline Tice7826c882010-10-26 03:11:13 +0000171
172 if (log)
173 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000174 log->Printf ("SBSymbolContext(%p)::GetSymbol () => SBSymbol(%p)",
175 m_opaque_ap.get(), symbol);
Caroline Tice7826c882010-10-26 03:11:13 +0000176 }
177
Greg Clayton49ce6822010-10-31 03:01:06 +0000178 return sb_symbol;
Chris Lattner24943d22010-06-08 16:52:24 +0000179}
180
Greg Clayton23b8abb2011-09-26 07:11:27 +0000181void
182SBSymbolContext::SetModule (lldb::SBModule module)
183{
Greg Clayton0416bdf2012-01-30 09:04:36 +0000184 ref().module_sp = module.GetSP();
Greg Clayton23b8abb2011-09-26 07:11:27 +0000185}
186
187void
188SBSymbolContext::SetCompileUnit (lldb::SBCompileUnit compile_unit)
189{
190 ref().comp_unit = compile_unit.get();
191}
192
193void
194SBSymbolContext::SetFunction (lldb::SBFunction function)
195{
196 ref().function = function.get();
197}
198
199void
200SBSymbolContext::SetBlock (lldb::SBBlock block)
201{
Greg Clayton7dd5c512012-02-06 01:44:54 +0000202 ref().block = block.GetPtr();
Greg Clayton23b8abb2011-09-26 07:11:27 +0000203}
204
205void
206SBSymbolContext::SetLineEntry (lldb::SBLineEntry line_entry)
207{
208 if (line_entry.IsValid())
209 ref().line_entry = line_entry.ref();
210 else
211 ref().line_entry.Clear();
212}
213
214void
215SBSymbolContext::SetSymbol (lldb::SBSymbol symbol)
216{
217 ref().symbol = symbol.get();
218}
219
220
Chris Lattner24943d22010-06-08 16:52:24 +0000221lldb_private::SymbolContext*
222SBSymbolContext::operator->() const
223{
Greg Clayton63094e02010-06-23 01:19:29 +0000224 return m_opaque_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000225}
226
Greg Clayton466f6c42010-09-10 18:31:35 +0000227
228const lldb_private::SymbolContext&
229SBSymbolContext::operator*() const
230{
231 assert (m_opaque_ap.get());
232 return *m_opaque_ap.get();
233}
234
235
236lldb_private::SymbolContext&
237SBSymbolContext::operator*()
238{
239 if (m_opaque_ap.get() == NULL)
240 m_opaque_ap.reset (new SymbolContext);
241 return *m_opaque_ap.get();
242}
243
Caroline Ticee49ec182010-09-22 23:01:29 +0000244lldb_private::SymbolContext&
245SBSymbolContext::ref()
246{
247 if (m_opaque_ap.get() == NULL)
248 m_opaque_ap.reset (new SymbolContext);
249 return *m_opaque_ap.get();
250}
251
Chris Lattner24943d22010-06-08 16:52:24 +0000252lldb_private::SymbolContext *
Greg Clayton466f6c42010-09-10 18:31:35 +0000253SBSymbolContext::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000254{
Greg Clayton63094e02010-06-23 01:19:29 +0000255 return m_opaque_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000256}
257
Caroline Tice98f930f2010-09-20 05:20:02 +0000258bool
259SBSymbolContext::GetDescription (SBStream &description)
260{
Greg Clayton96154be2011-11-13 06:57:31 +0000261 Stream &strm = description.ref();
262
Caroline Tice98f930f2010-09-20 05:20:02 +0000263 if (m_opaque_ap.get())
264 {
Greg Clayton96154be2011-11-13 06:57:31 +0000265 m_opaque_ap->GetDescription (&strm, lldb::eDescriptionLevelFull, NULL);
Caroline Tice98f930f2010-09-20 05:20:02 +0000266 }
267 else
Greg Clayton96154be2011-11-13 06:57:31 +0000268 strm.PutCString ("No value");
Chris Lattner24943d22010-06-08 16:52:24 +0000269
Caroline Tice98f930f2010-09-20 05:20:02 +0000270 return true;
271}
Greg Clayton23b8abb2011-09-26 07:11:27 +0000272
273SBSymbolContext
Greg Clayton2f57db02011-10-01 00:45:15 +0000274SBSymbolContext::GetParentOfInlinedScope (const SBAddress &curr_frame_pc,
275 SBAddress &parent_frame_addr) const
Greg Clayton23b8abb2011-09-26 07:11:27 +0000276{
277 SBSymbolContext sb_sc;
278 if (m_opaque_ap.get() && curr_frame_pc.IsValid())
279 {
Greg Clayton2f57db02011-10-01 00:45:15 +0000280 if (m_opaque_ap->GetParentOfInlinedScope (curr_frame_pc.ref(), sb_sc.ref(), parent_frame_addr.ref()))
Greg Clayton23b8abb2011-09-26 07:11:27 +0000281 return sb_sc;
282 }
283 return SBSymbolContext();
284}
285