130fdc8d8SChris Lattner //===-- SBCompileUnit.cpp ---------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "lldb/API/SBCompileUnit.h"
1130fdc8d8SChris Lattner #include "lldb/API/SBLineEntry.h"
12dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
13f02500c7SGreg Clayton #include "lldb/Core/Log.h"
14f02500c7SGreg Clayton #include "lldb/Core/Module.h"
1530fdc8d8SChris Lattner #include "lldb/Symbol/CompileUnit.h"
1630fdc8d8SChris Lattner #include "lldb/Symbol/LineEntry.h"
1730fdc8d8SChris Lattner #include "lldb/Symbol/LineTable.h"
18f02500c7SGreg Clayton #include "lldb/Symbol/SymbolVendor.h"
19f02500c7SGreg Clayton #include "lldb/Symbol/Type.h"
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner using namespace lldb;
2230fdc8d8SChris Lattner using namespace lldb_private;
2330fdc8d8SChris Lattner 
2430fdc8d8SChris Lattner 
2530fdc8d8SChris Lattner SBCompileUnit::SBCompileUnit () :
266611103cSGreg Clayton     m_opaque_ptr (NULL)
2730fdc8d8SChris Lattner {
2830fdc8d8SChris Lattner }
2930fdc8d8SChris Lattner 
3030fdc8d8SChris Lattner SBCompileUnit::SBCompileUnit (lldb_private::CompileUnit *lldb_object_ptr) :
316611103cSGreg Clayton     m_opaque_ptr (lldb_object_ptr)
3230fdc8d8SChris Lattner {
3330fdc8d8SChris Lattner }
3430fdc8d8SChris Lattner 
35efabb123SGreg Clayton SBCompileUnit::SBCompileUnit(const SBCompileUnit &rhs) :
36efabb123SGreg Clayton     m_opaque_ptr (rhs.m_opaque_ptr)
37efabb123SGreg Clayton {
38efabb123SGreg Clayton }
39efabb123SGreg Clayton 
40efabb123SGreg Clayton const SBCompileUnit &
41efabb123SGreg Clayton SBCompileUnit::operator = (const SBCompileUnit &rhs)
42efabb123SGreg Clayton {
43efabb123SGreg Clayton     m_opaque_ptr = rhs.m_opaque_ptr;
44efabb123SGreg Clayton     return *this;
45efabb123SGreg Clayton }
46efabb123SGreg Clayton 
47efabb123SGreg Clayton 
4830fdc8d8SChris Lattner SBCompileUnit::~SBCompileUnit ()
4930fdc8d8SChris Lattner {
506611103cSGreg Clayton     m_opaque_ptr = NULL;
5130fdc8d8SChris Lattner }
5230fdc8d8SChris Lattner 
5330fdc8d8SChris Lattner SBFileSpec
5430fdc8d8SChris Lattner SBCompileUnit::GetFileSpec () const
5530fdc8d8SChris Lattner {
5630fdc8d8SChris Lattner     SBFileSpec file_spec;
576611103cSGreg Clayton     if (m_opaque_ptr)
586611103cSGreg Clayton         file_spec.SetFileSpec(*m_opaque_ptr);
5930fdc8d8SChris Lattner     return file_spec;
6030fdc8d8SChris Lattner }
6130fdc8d8SChris Lattner 
6230fdc8d8SChris Lattner uint32_t
6330fdc8d8SChris Lattner SBCompileUnit::GetNumLineEntries () const
6430fdc8d8SChris Lattner {
656611103cSGreg Clayton     if (m_opaque_ptr)
6630fdc8d8SChris Lattner     {
676611103cSGreg Clayton         LineTable *line_table = m_opaque_ptr->GetLineTable ();
6830fdc8d8SChris Lattner         if (line_table)
6930fdc8d8SChris Lattner             return line_table->GetSize();
7030fdc8d8SChris Lattner     }
7130fdc8d8SChris Lattner     return 0;
7230fdc8d8SChris Lattner }
7330fdc8d8SChris Lattner 
7430fdc8d8SChris Lattner SBLineEntry
7530fdc8d8SChris Lattner SBCompileUnit::GetLineEntryAtIndex (uint32_t idx) const
7630fdc8d8SChris Lattner {
775160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
78ceb6b139SCaroline Tice 
7930fdc8d8SChris Lattner     SBLineEntry sb_line_entry;
806611103cSGreg Clayton     if (m_opaque_ptr)
8130fdc8d8SChris Lattner     {
826611103cSGreg Clayton         LineTable *line_table = m_opaque_ptr->GetLineTable ();
8330fdc8d8SChris Lattner         if (line_table)
8430fdc8d8SChris Lattner         {
8530fdc8d8SChris Lattner             LineEntry line_entry;
8630fdc8d8SChris Lattner             if (line_table->GetLineEntryAtIndex(idx, line_entry))
8730fdc8d8SChris Lattner                 sb_line_entry.SetLineEntry(line_entry);
8830fdc8d8SChris Lattner         }
8930fdc8d8SChris Lattner     }
90ceb6b139SCaroline Tice 
91ceb6b139SCaroline Tice     if (log)
92ceb6b139SCaroline Tice     {
93ceb6b139SCaroline Tice         SBStream sstr;
94ceb6b139SCaroline Tice         sb_line_entry.GetDescription (sstr);
95cfd1acedSGreg Clayton         log->Printf ("SBCompileUnit(%p)::GetLineEntryAtIndex (idx=%u) => SBLineEntry(%p): '%s'",
96*324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_ptr), idx,
97*324a1036SSaleem Abdulrasool                      static_cast<void*>(sb_line_entry.get()), sstr.GetData());
98ceb6b139SCaroline Tice     }
99ceb6b139SCaroline Tice 
10030fdc8d8SChris Lattner     return sb_line_entry;
10130fdc8d8SChris Lattner }
10230fdc8d8SChris Lattner 
10330fdc8d8SChris Lattner uint32_t
10430fdc8d8SChris Lattner SBCompileUnit::FindLineEntryIndex (uint32_t start_idx, uint32_t line, SBFileSpec *inline_file_spec) const
10530fdc8d8SChris Lattner {
10687df91b8SJim Ingham     const bool exact = true;
10787df91b8SJim Ingham     return FindLineEntryIndex (start_idx, line, inline_file_spec, exact);
10887df91b8SJim Ingham }
10987df91b8SJim Ingham 
11087df91b8SJim Ingham uint32_t
11187df91b8SJim Ingham SBCompileUnit::FindLineEntryIndex (uint32_t start_idx, uint32_t line, SBFileSpec *inline_file_spec, bool exact) const
11287df91b8SJim Ingham {
1135160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
114ceb6b139SCaroline Tice 
115cfd1acedSGreg Clayton     uint32_t index = UINT32_MAX;
1166611103cSGreg Clayton     if (m_opaque_ptr)
11730fdc8d8SChris Lattner     {
11830fdc8d8SChris Lattner         FileSpec file_spec;
11930fdc8d8SChris Lattner         if (inline_file_spec && inline_file_spec->IsValid())
12030fdc8d8SChris Lattner             file_spec = inline_file_spec->ref();
12130fdc8d8SChris Lattner         else
1226611103cSGreg Clayton             file_spec = *m_opaque_ptr;
12330fdc8d8SChris Lattner 
124cfd1acedSGreg Clayton         index = m_opaque_ptr->FindLineEntry (start_idx,
12530fdc8d8SChris Lattner                                              line,
12630fdc8d8SChris Lattner                                              inline_file_spec ? inline_file_spec->get() : NULL,
12787df91b8SJim Ingham                                              exact,
12830fdc8d8SChris Lattner                                              NULL);
12930fdc8d8SChris Lattner     }
130ceb6b139SCaroline Tice 
131ceb6b139SCaroline Tice     if (log)
132750cd175SCaroline Tice     {
133750cd175SCaroline Tice         SBStream sstr;
134cfd1acedSGreg Clayton         if (index == UINT32_MAX)
135cfd1acedSGreg Clayton         {
136cfd1acedSGreg Clayton             log->Printf ("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, line=%u, SBFileSpec(%p)) => NOT FOUND",
137*324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_ptr), start_idx, line,
138*324a1036SSaleem Abdulrasool                          inline_file_spec
139*324a1036SSaleem Abdulrasool                             ? static_cast<const void*>(inline_file_spec->get())
140*324a1036SSaleem Abdulrasool                             : NULL);
141cfd1acedSGreg Clayton         }
142cfd1acedSGreg Clayton         else
143cfd1acedSGreg Clayton         {
144cfd1acedSGreg Clayton             log->Printf ("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, line=%u, SBFileSpec(%p)) => %u",
145*324a1036SSaleem Abdulrasool                          static_cast<void*>(m_opaque_ptr), start_idx, line,
146*324a1036SSaleem Abdulrasool                          inline_file_spec
147*324a1036SSaleem Abdulrasool                             ? static_cast<const void*>(inline_file_spec->get())
148*324a1036SSaleem Abdulrasool                             : NULL,
149*324a1036SSaleem Abdulrasool                          index);
150cfd1acedSGreg Clayton         }
151750cd175SCaroline Tice     }
152ceb6b139SCaroline Tice 
153cfd1acedSGreg Clayton     return index;
15430fdc8d8SChris Lattner }
15530fdc8d8SChris Lattner 
156873a7a4bSJohnny Chen uint32_t
157873a7a4bSJohnny Chen SBCompileUnit::GetNumSupportFiles () const
158873a7a4bSJohnny Chen {
159873a7a4bSJohnny Chen     if (m_opaque_ptr)
160873a7a4bSJohnny Chen     {
161873a7a4bSJohnny Chen         FileSpecList& support_files = m_opaque_ptr->GetSupportFiles ();
162873a7a4bSJohnny Chen         return support_files.GetSize();
163873a7a4bSJohnny Chen     }
164873a7a4bSJohnny Chen     return 0;
165873a7a4bSJohnny Chen }
166873a7a4bSJohnny Chen 
167f02500c7SGreg Clayton 
168f02500c7SGreg Clayton 
169f02500c7SGreg Clayton lldb::SBTypeList
170f02500c7SGreg Clayton SBCompileUnit::GetTypes (uint32_t type_mask)
171f02500c7SGreg Clayton {
172f02500c7SGreg Clayton     SBTypeList sb_type_list;
173f02500c7SGreg Clayton 
174f02500c7SGreg Clayton     if (m_opaque_ptr)
175f02500c7SGreg Clayton     {
176f02500c7SGreg Clayton         ModuleSP module_sp (m_opaque_ptr->GetModule());
177f02500c7SGreg Clayton         if (module_sp)
178f02500c7SGreg Clayton         {
179f02500c7SGreg Clayton             SymbolVendor* vendor = module_sp->GetSymbolVendor();
180f02500c7SGreg Clayton             if (vendor)
181f02500c7SGreg Clayton             {
182f02500c7SGreg Clayton                 TypeList type_list;
183f02500c7SGreg Clayton                 vendor->GetTypes (m_opaque_ptr, type_mask, type_list);
184f02500c7SGreg Clayton                 sb_type_list.m_opaque_ap->Append(type_list);
185f02500c7SGreg Clayton             }
186f02500c7SGreg Clayton         }
187f02500c7SGreg Clayton     }
188f02500c7SGreg Clayton     return sb_type_list;
189f02500c7SGreg Clayton }
190f02500c7SGreg Clayton 
191f02500c7SGreg Clayton 
192f02500c7SGreg Clayton 
193f02500c7SGreg Clayton 
194873a7a4bSJohnny Chen SBFileSpec
195873a7a4bSJohnny Chen SBCompileUnit::GetSupportFileAtIndex (uint32_t idx) const
196873a7a4bSJohnny Chen {
1975160ce5cSGreg Clayton     Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
198873a7a4bSJohnny Chen 
199873a7a4bSJohnny Chen     SBFileSpec sb_file_spec;
200873a7a4bSJohnny Chen     if (m_opaque_ptr)
201873a7a4bSJohnny Chen     {
202873a7a4bSJohnny Chen         FileSpecList &support_files = m_opaque_ptr->GetSupportFiles ();
203873a7a4bSJohnny Chen         FileSpec file_spec = support_files.GetFileSpecAtIndex(idx);
204873a7a4bSJohnny Chen         sb_file_spec.SetFileSpec(file_spec);
205873a7a4bSJohnny Chen     }
206873a7a4bSJohnny Chen 
207873a7a4bSJohnny Chen     if (log)
208873a7a4bSJohnny Chen     {
209873a7a4bSJohnny Chen         SBStream sstr;
210873a7a4bSJohnny Chen         sb_file_spec.GetDescription (sstr);
211873a7a4bSJohnny Chen         log->Printf ("SBCompileUnit(%p)::GetGetFileSpecAtIndex (idx=%u) => SBFileSpec(%p): '%s'",
212*324a1036SSaleem Abdulrasool                      static_cast<void*>(m_opaque_ptr), idx,
213*324a1036SSaleem Abdulrasool                      static_cast<const void*>(sb_file_spec.get()),
214*324a1036SSaleem Abdulrasool                      sstr.GetData());
215873a7a4bSJohnny Chen     }
216873a7a4bSJohnny Chen 
217873a7a4bSJohnny Chen     return sb_file_spec;
218873a7a4bSJohnny Chen }
219873a7a4bSJohnny Chen 
220873a7a4bSJohnny Chen uint32_t
221873a7a4bSJohnny Chen SBCompileUnit::FindSupportFileIndex (uint32_t start_idx, const SBFileSpec &sb_file, bool full)
222873a7a4bSJohnny Chen {
223873a7a4bSJohnny Chen     if (m_opaque_ptr)
224873a7a4bSJohnny Chen     {
225873a7a4bSJohnny Chen 	FileSpecList &support_files = m_opaque_ptr->GetSupportFiles ();
226873a7a4bSJohnny Chen 	return support_files.FindFileIndex(start_idx, sb_file.ref(), full);
227873a7a4bSJohnny Chen     }
228873a7a4bSJohnny Chen     return 0;
229873a7a4bSJohnny Chen }
230873a7a4bSJohnny Chen 
23130fdc8d8SChris Lattner bool
23230fdc8d8SChris Lattner SBCompileUnit::IsValid () const
23330fdc8d8SChris Lattner {
2346611103cSGreg Clayton     return m_opaque_ptr != NULL;
23530fdc8d8SChris Lattner }
23630fdc8d8SChris Lattner 
23730fdc8d8SChris Lattner bool
23830fdc8d8SChris Lattner SBCompileUnit::operator == (const SBCompileUnit &rhs) const
23930fdc8d8SChris Lattner {
2406611103cSGreg Clayton     return m_opaque_ptr == rhs.m_opaque_ptr;
24130fdc8d8SChris Lattner }
24230fdc8d8SChris Lattner 
24330fdc8d8SChris Lattner bool
24430fdc8d8SChris Lattner SBCompileUnit::operator != (const SBCompileUnit &rhs) const
24530fdc8d8SChris Lattner {
2466611103cSGreg Clayton     return m_opaque_ptr != rhs.m_opaque_ptr;
24730fdc8d8SChris Lattner }
24830fdc8d8SChris Lattner 
24930fdc8d8SChris Lattner const lldb_private::CompileUnit *
25030fdc8d8SChris Lattner SBCompileUnit::operator->() const
25130fdc8d8SChris Lattner {
2526611103cSGreg Clayton     return m_opaque_ptr;
25330fdc8d8SChris Lattner }
25430fdc8d8SChris Lattner 
25530fdc8d8SChris Lattner const lldb_private::CompileUnit &
25630fdc8d8SChris Lattner SBCompileUnit::operator*() const
25730fdc8d8SChris Lattner {
2586611103cSGreg Clayton     return *m_opaque_ptr;
25930fdc8d8SChris Lattner }
260dde9cff3SCaroline Tice 
2618f7180b1SGreg Clayton lldb_private::CompileUnit *
2628f7180b1SGreg Clayton SBCompileUnit::get ()
263750cd175SCaroline Tice {
264750cd175SCaroline Tice     return m_opaque_ptr;
265750cd175SCaroline Tice }
26672eff18aSGreg Clayton 
26772eff18aSGreg Clayton void
26872eff18aSGreg Clayton SBCompileUnit::reset (lldb_private::CompileUnit *lldb_object_ptr)
26972eff18aSGreg Clayton {
27072eff18aSGreg Clayton     m_opaque_ptr = lldb_object_ptr;
27172eff18aSGreg Clayton }
27272eff18aSGreg Clayton 
273750cd175SCaroline Tice 
274dde9cff3SCaroline Tice bool
275dde9cff3SCaroline Tice SBCompileUnit::GetDescription (SBStream &description)
276dde9cff3SCaroline Tice {
277da7bc7d0SGreg Clayton     Stream &strm = description.ref();
278da7bc7d0SGreg Clayton 
279dde9cff3SCaroline Tice     if (m_opaque_ptr)
280dde9cff3SCaroline Tice     {
281da7bc7d0SGreg Clayton         m_opaque_ptr->Dump (&strm, false);
282dde9cff3SCaroline Tice     }
283dde9cff3SCaroline Tice     else
284da7bc7d0SGreg Clayton         strm.PutCString ("No value");
285dde9cff3SCaroline Tice 
286dde9cff3SCaroline Tice     return true;
287dde9cff3SCaroline Tice }
288