1 //===-- SBCompileUnit.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/SBCompileUnit.h"
11 #include "lldb/API/SBLineEntry.h"
12 #include "lldb/API/SBStream.h"
13 #include "lldb/Core/Log.h"
14 #include "lldb/Core/Module.h"
15 #include "lldb/Symbol/CompileUnit.h"
16 #include "lldb/Symbol/LineEntry.h"
17 #include "lldb/Symbol/LineTable.h"
18 #include "lldb/Symbol/SymbolVendor.h"
19 #include "lldb/Symbol/Type.h"
20 
21 using namespace lldb;
22 using namespace lldb_private;
23 
24 
SBCompileUnit()25 SBCompileUnit::SBCompileUnit () :
26     m_opaque_ptr (NULL)
27 {
28 }
29 
SBCompileUnit(lldb_private::CompileUnit * lldb_object_ptr)30 SBCompileUnit::SBCompileUnit (lldb_private::CompileUnit *lldb_object_ptr) :
31     m_opaque_ptr (lldb_object_ptr)
32 {
33 }
34 
SBCompileUnit(const SBCompileUnit & rhs)35 SBCompileUnit::SBCompileUnit(const SBCompileUnit &rhs) :
36     m_opaque_ptr (rhs.m_opaque_ptr)
37 {
38 }
39 
40 const SBCompileUnit &
operator =(const SBCompileUnit & rhs)41 SBCompileUnit::operator = (const SBCompileUnit &rhs)
42 {
43     m_opaque_ptr = rhs.m_opaque_ptr;
44     return *this;
45 }
46 
47 
~SBCompileUnit()48 SBCompileUnit::~SBCompileUnit ()
49 {
50     m_opaque_ptr = NULL;
51 }
52 
53 SBFileSpec
GetFileSpec() const54 SBCompileUnit::GetFileSpec () const
55 {
56     SBFileSpec file_spec;
57     if (m_opaque_ptr)
58         file_spec.SetFileSpec(*m_opaque_ptr);
59     return file_spec;
60 }
61 
62 uint32_t
GetNumLineEntries() const63 SBCompileUnit::GetNumLineEntries () const
64 {
65     if (m_opaque_ptr)
66     {
67         LineTable *line_table = m_opaque_ptr->GetLineTable ();
68         if (line_table)
69             return line_table->GetSize();
70     }
71     return 0;
72 }
73 
74 SBLineEntry
GetLineEntryAtIndex(uint32_t idx) const75 SBCompileUnit::GetLineEntryAtIndex (uint32_t idx) const
76 {
77     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
78 
79     SBLineEntry sb_line_entry;
80     if (m_opaque_ptr)
81     {
82         LineTable *line_table = m_opaque_ptr->GetLineTable ();
83         if (line_table)
84         {
85             LineEntry line_entry;
86             if (line_table->GetLineEntryAtIndex(idx, line_entry))
87                 sb_line_entry.SetLineEntry(line_entry);
88         }
89     }
90 
91     if (log)
92     {
93         SBStream sstr;
94         sb_line_entry.GetDescription (sstr);
95         log->Printf ("SBCompileUnit(%p)::GetLineEntryAtIndex (idx=%u) => SBLineEntry(%p): '%s'",
96                      m_opaque_ptr, idx, sb_line_entry.get(), sstr.GetData());
97     }
98 
99     return sb_line_entry;
100 }
101 
102 uint32_t
FindLineEntryIndex(uint32_t start_idx,uint32_t line,SBFileSpec * inline_file_spec) const103 SBCompileUnit::FindLineEntryIndex (uint32_t start_idx, uint32_t line, SBFileSpec *inline_file_spec) const
104 {
105     const bool exact = true;
106     return FindLineEntryIndex (start_idx, line, inline_file_spec, exact);
107 }
108 
109 uint32_t
FindLineEntryIndex(uint32_t start_idx,uint32_t line,SBFileSpec * inline_file_spec,bool exact) const110 SBCompileUnit::FindLineEntryIndex (uint32_t start_idx, uint32_t line, SBFileSpec *inline_file_spec, bool exact) const
111 {
112     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
113 
114     uint32_t index = UINT32_MAX;
115     if (m_opaque_ptr)
116     {
117         FileSpec file_spec;
118         if (inline_file_spec && inline_file_spec->IsValid())
119             file_spec = inline_file_spec->ref();
120         else
121             file_spec = *m_opaque_ptr;
122 
123 
124         index = m_opaque_ptr->FindLineEntry (start_idx,
125                                              line,
126                                              inline_file_spec ? inline_file_spec->get() : NULL,
127                                              exact,
128                                              NULL);
129     }
130 
131     if (log)
132     {
133         SBStream sstr;
134         if (index == UINT32_MAX)
135         {
136             log->Printf ("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, line=%u, SBFileSpec(%p)) => NOT FOUND",
137                          m_opaque_ptr, start_idx, line, inline_file_spec ? inline_file_spec->get() : NULL);
138         }
139         else
140         {
141             log->Printf ("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, line=%u, SBFileSpec(%p)) => %u",
142                          m_opaque_ptr, start_idx, line, inline_file_spec ? inline_file_spec->get() : NULL, index);
143         }
144     }
145 
146     return index;
147 }
148 
149 uint32_t
GetNumSupportFiles() const150 SBCompileUnit::GetNumSupportFiles () const
151 {
152     if (m_opaque_ptr)
153     {
154         FileSpecList& support_files = m_opaque_ptr->GetSupportFiles ();
155         return support_files.GetSize();
156     }
157     return 0;
158 }
159 
160 
161 
162 lldb::SBTypeList
GetTypes(uint32_t type_mask)163 SBCompileUnit::GetTypes (uint32_t type_mask)
164 {
165     SBTypeList sb_type_list;
166 
167     if (m_opaque_ptr)
168     {
169         ModuleSP module_sp (m_opaque_ptr->GetModule());
170         if (module_sp)
171         {
172             SymbolVendor* vendor = module_sp->GetSymbolVendor();
173             if (vendor)
174             {
175                 TypeList type_list;
176                 vendor->GetTypes (m_opaque_ptr, type_mask, type_list);
177                 sb_type_list.m_opaque_ap->Append(type_list);
178             }
179         }
180     }
181     return sb_type_list;
182 }
183 
184 
185 
186 
187 SBFileSpec
GetSupportFileAtIndex(uint32_t idx) const188 SBCompileUnit::GetSupportFileAtIndex (uint32_t idx) const
189 {
190     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
191 
192     SBFileSpec sb_file_spec;
193     if (m_opaque_ptr)
194     {
195         FileSpecList &support_files = m_opaque_ptr->GetSupportFiles ();
196         FileSpec file_spec = support_files.GetFileSpecAtIndex(idx);
197         sb_file_spec.SetFileSpec(file_spec);
198     }
199 
200     if (log)
201     {
202         SBStream sstr;
203         sb_file_spec.GetDescription (sstr);
204         log->Printf ("SBCompileUnit(%p)::GetGetFileSpecAtIndex (idx=%u) => SBFileSpec(%p): '%s'",
205                      m_opaque_ptr, idx, sb_file_spec.get(), sstr.GetData());
206     }
207 
208     return sb_file_spec;
209 }
210 
211 uint32_t
FindSupportFileIndex(uint32_t start_idx,const SBFileSpec & sb_file,bool full)212 SBCompileUnit::FindSupportFileIndex (uint32_t start_idx, const SBFileSpec &sb_file, bool full)
213 {
214     if (m_opaque_ptr)
215     {
216 	FileSpecList &support_files = m_opaque_ptr->GetSupportFiles ();
217 	return support_files.FindFileIndex(start_idx, sb_file.ref(), full);
218     }
219     return 0;
220 }
221 
222 bool
IsValid() const223 SBCompileUnit::IsValid () const
224 {
225     return m_opaque_ptr != NULL;
226 }
227 
228 bool
operator ==(const SBCompileUnit & rhs) const229 SBCompileUnit::operator == (const SBCompileUnit &rhs) const
230 {
231     return m_opaque_ptr == rhs.m_opaque_ptr;
232 }
233 
234 bool
operator !=(const SBCompileUnit & rhs) const235 SBCompileUnit::operator != (const SBCompileUnit &rhs) const
236 {
237     return m_opaque_ptr != rhs.m_opaque_ptr;
238 }
239 
240 const lldb_private::CompileUnit *
operator ->() const241 SBCompileUnit::operator->() const
242 {
243     return m_opaque_ptr;
244 }
245 
246 const lldb_private::CompileUnit &
operator *() const247 SBCompileUnit::operator*() const
248 {
249     return *m_opaque_ptr;
250 }
251 
252 lldb_private::CompileUnit *
get()253 SBCompileUnit::get ()
254 {
255     return m_opaque_ptr;
256 }
257 
258 void
reset(lldb_private::CompileUnit * lldb_object_ptr)259 SBCompileUnit::reset (lldb_private::CompileUnit *lldb_object_ptr)
260 {
261     m_opaque_ptr = lldb_object_ptr;
262 }
263 
264 
265 bool
GetDescription(SBStream & description)266 SBCompileUnit::GetDescription (SBStream &description)
267 {
268     Stream &strm = description.ref();
269 
270     if (m_opaque_ptr)
271     {
272         m_opaque_ptr->Dump (&strm, false);
273     }
274     else
275         strm.PutCString ("No value");
276 
277     return true;
278 }
279