1254721Semaste//===-- SBSymbolContext.cpp -------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include "lldb/API/SBSymbolContext.h"
11254721Semaste#include "lldb/API/SBStream.h"
12254721Semaste#include "lldb/Core/Log.h"
13254721Semaste#include "lldb/Core/Module.h"
14254721Semaste#include "lldb/Symbol/Function.h"
15254721Semaste#include "lldb/Symbol/Symbol.h"
16254721Semaste#include "lldb/Symbol/SymbolContext.h"
17254721Semaste
18254721Semasteusing namespace lldb;
19254721Semasteusing namespace lldb_private;
20254721Semaste
21254721Semaste
22254721Semaste
23254721SemasteSBSymbolContext::SBSymbolContext () :
24254721Semaste    m_opaque_ap ()
25254721Semaste{
26254721Semaste}
27254721Semaste
28254721SemasteSBSymbolContext::SBSymbolContext (const SymbolContext *sc_ptr) :
29254721Semaste    m_opaque_ap ()
30254721Semaste{
31254721Semaste    if (sc_ptr)
32254721Semaste        m_opaque_ap.reset (new SymbolContext (*sc_ptr));
33254721Semaste}
34254721Semaste
35254721SemasteSBSymbolContext::SBSymbolContext (const SBSymbolContext& rhs) :
36254721Semaste    m_opaque_ap ()
37254721Semaste{
38254721Semaste    if (rhs.IsValid())
39254721Semaste    {
40254721Semaste        if (m_opaque_ap.get())
41254721Semaste            *m_opaque_ap = *rhs.m_opaque_ap;
42254721Semaste        else
43254721Semaste            ref() = *rhs.m_opaque_ap;
44254721Semaste    }
45254721Semaste}
46254721Semaste
47254721SemasteSBSymbolContext::~SBSymbolContext ()
48254721Semaste{
49254721Semaste}
50254721Semaste
51254721Semasteconst SBSymbolContext &
52254721SemasteSBSymbolContext::operator = (const SBSymbolContext &rhs)
53254721Semaste{
54254721Semaste    if (this != &rhs)
55254721Semaste    {
56254721Semaste        if (rhs.IsValid())
57254721Semaste            m_opaque_ap.reset (new lldb_private::SymbolContext(*rhs.m_opaque_ap.get()));
58254721Semaste    }
59254721Semaste    return *this;
60254721Semaste}
61254721Semaste
62254721Semastevoid
63254721SemasteSBSymbolContext::SetSymbolContext (const SymbolContext *sc_ptr)
64254721Semaste{
65254721Semaste    if (sc_ptr)
66254721Semaste    {
67254721Semaste        if (m_opaque_ap.get())
68254721Semaste            *m_opaque_ap = *sc_ptr;
69254721Semaste        else
70254721Semaste            m_opaque_ap.reset (new SymbolContext (*sc_ptr));
71254721Semaste    }
72254721Semaste    else
73254721Semaste    {
74254721Semaste        if (m_opaque_ap.get())
75254721Semaste            m_opaque_ap->Clear(true);
76254721Semaste    }
77254721Semaste}
78254721Semaste
79254721Semastebool
80254721SemasteSBSymbolContext::IsValid () const
81254721Semaste{
82254721Semaste    return m_opaque_ap.get() != NULL;
83254721Semaste}
84254721Semaste
85254721Semaste
86254721Semaste
87254721SemasteSBModule
88254721SemasteSBSymbolContext::GetModule ()
89254721Semaste{
90254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
91254721Semaste
92254721Semaste    SBModule sb_module;
93254721Semaste    ModuleSP module_sp;
94254721Semaste    if (m_opaque_ap.get())
95254721Semaste    {
96254721Semaste        module_sp = m_opaque_ap->module_sp;
97254721Semaste        sb_module.SetSP (module_sp);
98254721Semaste    }
99254721Semaste
100254721Semaste    if (log)
101254721Semaste    {
102254721Semaste        SBStream sstr;
103254721Semaste        sb_module.GetDescription (sstr);
104254721Semaste        log->Printf ("SBSymbolContext(%p)::GetModule () => SBModule(%p): %s",
105254721Semaste                     m_opaque_ap.get(), module_sp.get(), sstr.GetData());
106254721Semaste    }
107254721Semaste
108254721Semaste    return sb_module;
109254721Semaste}
110254721Semaste
111254721SemasteSBCompileUnit
112254721SemasteSBSymbolContext::GetCompileUnit ()
113254721Semaste{
114254721Semaste    return SBCompileUnit (m_opaque_ap.get() ? m_opaque_ap->comp_unit : NULL);
115254721Semaste}
116254721Semaste
117254721SemasteSBFunction
118254721SemasteSBSymbolContext::GetFunction ()
119254721Semaste{
120254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
121254721Semaste
122254721Semaste    Function *function = NULL;
123254721Semaste
124254721Semaste    if (m_opaque_ap.get())
125254721Semaste        function = m_opaque_ap->function;
126254721Semaste
127254721Semaste    SBFunction sb_function (function);
128254721Semaste
129254721Semaste    if (log)
130254721Semaste        log->Printf ("SBSymbolContext(%p)::GetFunction () => SBFunction(%p)",
131254721Semaste                     m_opaque_ap.get(), function);
132254721Semaste
133254721Semaste    return sb_function;
134254721Semaste}
135254721Semaste
136254721SemasteSBBlock
137254721SemasteSBSymbolContext::GetBlock ()
138254721Semaste{
139254721Semaste    return SBBlock (m_opaque_ap.get() ? m_opaque_ap->block : NULL);
140254721Semaste}
141254721Semaste
142254721SemasteSBLineEntry
143254721SemasteSBSymbolContext::GetLineEntry ()
144254721Semaste{
145254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
146254721Semaste
147254721Semaste    SBLineEntry sb_line_entry;
148254721Semaste    if (m_opaque_ap.get())
149254721Semaste        sb_line_entry.SetLineEntry (m_opaque_ap->line_entry);
150254721Semaste
151254721Semaste    if (log)
152254721Semaste    {
153254721Semaste        log->Printf ("SBSymbolContext(%p)::GetLineEntry () => SBLineEntry(%p)",
154254721Semaste                     m_opaque_ap.get(), sb_line_entry.get());
155254721Semaste    }
156254721Semaste
157254721Semaste    return sb_line_entry;
158254721Semaste}
159254721Semaste
160254721SemasteSBSymbol
161254721SemasteSBSymbolContext::GetSymbol ()
162254721Semaste{
163254721Semaste    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
164254721Semaste
165254721Semaste    Symbol *symbol = NULL;
166254721Semaste
167254721Semaste    if (m_opaque_ap.get())
168254721Semaste        symbol = m_opaque_ap->symbol;
169254721Semaste
170254721Semaste    SBSymbol sb_symbol (symbol);
171254721Semaste
172254721Semaste    if (log)
173254721Semaste    {
174254721Semaste        log->Printf ("SBSymbolContext(%p)::GetSymbol () => SBSymbol(%p)",
175254721Semaste                     m_opaque_ap.get(), symbol);
176254721Semaste    }
177254721Semaste
178254721Semaste    return sb_symbol;
179254721Semaste}
180254721Semaste
181254721Semastevoid
182254721SemasteSBSymbolContext::SetModule (lldb::SBModule module)
183254721Semaste{
184254721Semaste    ref().module_sp = module.GetSP();
185254721Semaste}
186254721Semaste
187254721Semastevoid
188254721SemasteSBSymbolContext::SetCompileUnit (lldb::SBCompileUnit compile_unit)
189254721Semaste{
190254721Semaste    ref().comp_unit = compile_unit.get();
191254721Semaste}
192254721Semaste
193254721Semastevoid
194254721SemasteSBSymbolContext::SetFunction (lldb::SBFunction function)
195254721Semaste{
196254721Semaste    ref().function = function.get();
197254721Semaste}
198254721Semaste
199254721Semastevoid
200254721SemasteSBSymbolContext::SetBlock (lldb::SBBlock block)
201254721Semaste{
202254721Semaste    ref().block = block.GetPtr();
203254721Semaste}
204254721Semaste
205254721Semastevoid
206254721SemasteSBSymbolContext::SetLineEntry (lldb::SBLineEntry line_entry)
207254721Semaste{
208254721Semaste    if (line_entry.IsValid())
209254721Semaste        ref().line_entry = line_entry.ref();
210254721Semaste    else
211254721Semaste        ref().line_entry.Clear();
212254721Semaste}
213254721Semaste
214254721Semastevoid
215254721SemasteSBSymbolContext::SetSymbol (lldb::SBSymbol symbol)
216254721Semaste{
217254721Semaste    ref().symbol = symbol.get();
218254721Semaste}
219254721Semaste
220254721Semaste
221254721Semastelldb_private::SymbolContext*
222254721SemasteSBSymbolContext::operator->() const
223254721Semaste{
224254721Semaste    return m_opaque_ap.get();
225254721Semaste}
226254721Semaste
227254721Semaste
228254721Semasteconst lldb_private::SymbolContext&
229254721SemasteSBSymbolContext::operator*() const
230254721Semaste{
231254721Semaste    assert (m_opaque_ap.get());
232254721Semaste    return *m_opaque_ap.get();
233254721Semaste}
234254721Semaste
235254721Semaste
236254721Semastelldb_private::SymbolContext&
237254721SemasteSBSymbolContext::operator*()
238254721Semaste{
239254721Semaste    if (m_opaque_ap.get() == NULL)
240254721Semaste        m_opaque_ap.reset (new SymbolContext);
241254721Semaste    return *m_opaque_ap.get();
242254721Semaste}
243254721Semaste
244254721Semastelldb_private::SymbolContext&
245254721SemasteSBSymbolContext::ref()
246254721Semaste{
247254721Semaste    if (m_opaque_ap.get() == NULL)
248254721Semaste        m_opaque_ap.reset (new SymbolContext);
249254721Semaste    return *m_opaque_ap.get();
250254721Semaste}
251254721Semaste
252254721Semastelldb_private::SymbolContext *
253254721SemasteSBSymbolContext::get() const
254254721Semaste{
255254721Semaste    return m_opaque_ap.get();
256254721Semaste}
257254721Semaste
258254721Semastebool
259254721SemasteSBSymbolContext::GetDescription (SBStream &description)
260254721Semaste{
261254721Semaste    Stream &strm = description.ref();
262254721Semaste
263254721Semaste    if (m_opaque_ap.get())
264254721Semaste    {
265254721Semaste        m_opaque_ap->GetDescription (&strm, lldb::eDescriptionLevelFull, NULL);
266254721Semaste    }
267254721Semaste    else
268254721Semaste        strm.PutCString ("No value");
269254721Semaste
270254721Semaste    return true;
271254721Semaste}
272254721Semaste
273254721SemasteSBSymbolContext
274254721SemasteSBSymbolContext::GetParentOfInlinedScope (const SBAddress &curr_frame_pc,
275254721Semaste                                          SBAddress &parent_frame_addr) const
276254721Semaste{
277254721Semaste    SBSymbolContext sb_sc;
278254721Semaste    if (m_opaque_ap.get() && curr_frame_pc.IsValid())
279254721Semaste    {
280254721Semaste        if (m_opaque_ap->GetParentOfInlinedScope (curr_frame_pc.ref(), sb_sc.ref(), parent_frame_addr.ref()))
281254721Semaste            return sb_sc;
282254721Semaste    }
283254721Semaste    return SBSymbolContext();
284254721Semaste}
285254721Semaste
286