blob: 1ec79df1ac0b8a62a2404d5402354a55bce11f90 [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())
75 m_opaque_ap->Clear();
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 Claytone005f2c2010-11-06 01:53:30 +000090 LogSP 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 Clayton63094e02010-06-23 01:19:29 +000093 if (m_opaque_ap.get())
94 sb_module.SetModule(m_opaque_ap->module_sp);
Caroline Tice7826c882010-10-26 03:11:13 +000095
96 if (log)
97 {
98 SBStream sstr;
99 sb_module.GetDescription (sstr);
Greg Claytona66ba462010-10-30 04:51:46 +0000100 log->Printf ("SBSymbolContext(%p)::GetModule () => SBModule(%p): %s",
101 m_opaque_ap.get(), sb_module.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000102 }
103
Chris Lattner24943d22010-06-08 16:52:24 +0000104 return sb_module;
105}
106
107SBCompileUnit
108SBSymbolContext::GetCompileUnit ()
109{
Greg Clayton63094e02010-06-23 01:19:29 +0000110 return SBCompileUnit (m_opaque_ap.get() ? m_opaque_ap->comp_unit : NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000111}
112
113SBFunction
114SBSymbolContext::GetFunction ()
115{
Greg Claytone005f2c2010-11-06 01:53:30 +0000116 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000117
Greg Clayton49ce6822010-10-31 03:01:06 +0000118 Function *function = NULL;
119
120 if (m_opaque_ap.get())
121 function = m_opaque_ap->function;
122
123 SBFunction sb_function (function);
Caroline Tice7826c882010-10-26 03:11:13 +0000124
125 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000126 log->Printf ("SBSymbolContext(%p)::GetFunction () => SBFunction(%p)",
127 m_opaque_ap.get(), function);
Caroline Tice7826c882010-10-26 03:11:13 +0000128
Greg Clayton49ce6822010-10-31 03:01:06 +0000129 return sb_function;
Chris Lattner24943d22010-06-08 16:52:24 +0000130}
131
132SBBlock
133SBSymbolContext::GetBlock ()
134{
Greg Clayton63094e02010-06-23 01:19:29 +0000135 return SBBlock (m_opaque_ap.get() ? m_opaque_ap->block : NULL);
Chris Lattner24943d22010-06-08 16:52:24 +0000136}
137
138SBLineEntry
139SBSymbolContext::GetLineEntry ()
140{
Greg Claytone005f2c2010-11-06 01:53:30 +0000141 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000142
Chris Lattner24943d22010-06-08 16:52:24 +0000143 SBLineEntry sb_line_entry;
Greg Clayton63094e02010-06-23 01:19:29 +0000144 if (m_opaque_ap.get())
145 sb_line_entry.SetLineEntry (m_opaque_ap->line_entry);
Chris Lattner24943d22010-06-08 16:52:24 +0000146
Caroline Tice7826c882010-10-26 03:11:13 +0000147 if (log)
148 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000149 log->Printf ("SBSymbolContext(%p)::GetLineEntry () => SBLineEntry(%p)",
150 m_opaque_ap.get(), sb_line_entry.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000151 }
152
Chris Lattner24943d22010-06-08 16:52:24 +0000153 return sb_line_entry;
154}
155
156SBSymbol
157SBSymbolContext::GetSymbol ()
158{
Greg Claytone005f2c2010-11-06 01:53:30 +0000159 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000160
Greg Clayton49ce6822010-10-31 03:01:06 +0000161 Symbol *symbol = NULL;
162
163 if (m_opaque_ap.get())
164 symbol = m_opaque_ap->symbol;
165
166 SBSymbol sb_symbol (symbol);
Caroline Tice7826c882010-10-26 03:11:13 +0000167
168 if (log)
169 {
Greg Clayton49ce6822010-10-31 03:01:06 +0000170 log->Printf ("SBSymbolContext(%p)::GetSymbol () => SBSymbol(%p)",
171 m_opaque_ap.get(), symbol);
Caroline Tice7826c882010-10-26 03:11:13 +0000172 }
173
Greg Clayton49ce6822010-10-31 03:01:06 +0000174 return sb_symbol;
Chris Lattner24943d22010-06-08 16:52:24 +0000175}
176
Greg Clayton23b8abb2011-09-26 07:11:27 +0000177void
178SBSymbolContext::SetModule (lldb::SBModule module)
179{
180 ref().module_sp = module.get_sp();
181}
182
183void
184SBSymbolContext::SetCompileUnit (lldb::SBCompileUnit compile_unit)
185{
186 ref().comp_unit = compile_unit.get();
187}
188
189void
190SBSymbolContext::SetFunction (lldb::SBFunction function)
191{
192 ref().function = function.get();
193}
194
195void
196SBSymbolContext::SetBlock (lldb::SBBlock block)
197{
198 ref().block = block.get();
199}
200
201void
202SBSymbolContext::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
210void
211SBSymbolContext::SetSymbol (lldb::SBSymbol symbol)
212{
213 ref().symbol = symbol.get();
214}
215
216
Chris Lattner24943d22010-06-08 16:52:24 +0000217lldb_private::SymbolContext*
218SBSymbolContext::operator->() const
219{
Greg Clayton63094e02010-06-23 01:19:29 +0000220 return m_opaque_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000221}
222
Greg Clayton466f6c42010-09-10 18:31:35 +0000223
224const lldb_private::SymbolContext&
225SBSymbolContext::operator*() const
226{
227 assert (m_opaque_ap.get());
228 return *m_opaque_ap.get();
229}
230
231
232lldb_private::SymbolContext&
233SBSymbolContext::operator*()
234{
235 if (m_opaque_ap.get() == NULL)
236 m_opaque_ap.reset (new SymbolContext);
237 return *m_opaque_ap.get();
238}
239
Caroline Ticee49ec182010-09-22 23:01:29 +0000240lldb_private::SymbolContext&
241SBSymbolContext::ref()
242{
243 if (m_opaque_ap.get() == NULL)
244 m_opaque_ap.reset (new SymbolContext);
245 return *m_opaque_ap.get();
246}
247
Chris Lattner24943d22010-06-08 16:52:24 +0000248lldb_private::SymbolContext *
Greg Clayton466f6c42010-09-10 18:31:35 +0000249SBSymbolContext::get() const
Chris Lattner24943d22010-06-08 16:52:24 +0000250{
Greg Clayton63094e02010-06-23 01:19:29 +0000251 return m_opaque_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000252}
253
Caroline Tice98f930f2010-09-20 05:20:02 +0000254bool
255SBSymbolContext::GetDescription (SBStream &description)
256{
Greg Clayton96154be2011-11-13 06:57:31 +0000257 Stream &strm = description.ref();
258
Caroline Tice98f930f2010-09-20 05:20:02 +0000259 if (m_opaque_ap.get())
260 {
Greg Clayton96154be2011-11-13 06:57:31 +0000261 m_opaque_ap->GetDescription (&strm, lldb::eDescriptionLevelFull, NULL);
Caroline Tice98f930f2010-09-20 05:20:02 +0000262 }
263 else
Greg Clayton96154be2011-11-13 06:57:31 +0000264 strm.PutCString ("No value");
Chris Lattner24943d22010-06-08 16:52:24 +0000265
Caroline Tice98f930f2010-09-20 05:20:02 +0000266 return true;
267}
Greg Clayton23b8abb2011-09-26 07:11:27 +0000268
269SBSymbolContext
Greg Clayton2f57db02011-10-01 00:45:15 +0000270SBSymbolContext::GetParentOfInlinedScope (const SBAddress &curr_frame_pc,
271 SBAddress &parent_frame_addr) const
Greg Clayton23b8abb2011-09-26 07:11:27 +0000272{
273 SBSymbolContext sb_sc;
274 if (m_opaque_ap.get() && curr_frame_pc.IsValid())
275 {
Greg Clayton2f57db02011-10-01 00:45:15 +0000276 if (m_opaque_ap->GetParentOfInlinedScope (curr_frame_pc.ref(), sb_sc.ref(), parent_frame_addr.ref()))
Greg Clayton23b8abb2011-09-26 07:11:27 +0000277 return sb_sc;
278 }
279 return SBSymbolContext();
280}
281