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/Module.h"
1430fdc8d8SChris Lattner #include "lldb/Symbol/CompileUnit.h"
1530fdc8d8SChris Lattner #include "lldb/Symbol/LineEntry.h"
1630fdc8d8SChris Lattner #include "lldb/Symbol/LineTable.h"
17f02500c7SGreg Clayton #include "lldb/Symbol/SymbolVendor.h"
18f02500c7SGreg Clayton #include "lldb/Symbol/Type.h"
19*6f9e6901SZachary Turner #include "lldb/Utility/Log.h"
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner using namespace lldb;
2230fdc8d8SChris Lattner using namespace lldb_private;
2330fdc8d8SChris Lattner 
24b9c1b51eSKate Stone SBCompileUnit::SBCompileUnit() : m_opaque_ptr(NULL) {}
2530fdc8d8SChris Lattner 
26b9c1b51eSKate Stone SBCompileUnit::SBCompileUnit(lldb_private::CompileUnit *lldb_object_ptr)
27b9c1b51eSKate Stone     : m_opaque_ptr(lldb_object_ptr) {}
2830fdc8d8SChris Lattner 
29b9c1b51eSKate Stone SBCompileUnit::SBCompileUnit(const SBCompileUnit &rhs)
30b9c1b51eSKate Stone     : m_opaque_ptr(rhs.m_opaque_ptr) {}
3130fdc8d8SChris Lattner 
32b9c1b51eSKate Stone const SBCompileUnit &SBCompileUnit::operator=(const SBCompileUnit &rhs) {
33efabb123SGreg Clayton   m_opaque_ptr = rhs.m_opaque_ptr;
34efabb123SGreg Clayton   return *this;
35efabb123SGreg Clayton }
36efabb123SGreg Clayton 
37b9c1b51eSKate Stone SBCompileUnit::~SBCompileUnit() { m_opaque_ptr = NULL; }
38efabb123SGreg Clayton 
39b9c1b51eSKate Stone SBFileSpec SBCompileUnit::GetFileSpec() const {
4030fdc8d8SChris Lattner   SBFileSpec file_spec;
416611103cSGreg Clayton   if (m_opaque_ptr)
426611103cSGreg Clayton     file_spec.SetFileSpec(*m_opaque_ptr);
4330fdc8d8SChris Lattner   return file_spec;
4430fdc8d8SChris Lattner }
4530fdc8d8SChris Lattner 
46b9c1b51eSKate Stone uint32_t SBCompileUnit::GetNumLineEntries() const {
47b9c1b51eSKate Stone   if (m_opaque_ptr) {
486611103cSGreg Clayton     LineTable *line_table = m_opaque_ptr->GetLineTable();
4930fdc8d8SChris Lattner     if (line_table)
5030fdc8d8SChris Lattner       return line_table->GetSize();
5130fdc8d8SChris Lattner   }
5230fdc8d8SChris Lattner   return 0;
5330fdc8d8SChris Lattner }
5430fdc8d8SChris Lattner 
55b9c1b51eSKate Stone SBLineEntry SBCompileUnit::GetLineEntryAtIndex(uint32_t idx) const {
565160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
57ceb6b139SCaroline Tice 
5830fdc8d8SChris Lattner   SBLineEntry sb_line_entry;
59b9c1b51eSKate Stone   if (m_opaque_ptr) {
606611103cSGreg Clayton     LineTable *line_table = m_opaque_ptr->GetLineTable();
61b9c1b51eSKate Stone     if (line_table) {
6230fdc8d8SChris Lattner       LineEntry line_entry;
6330fdc8d8SChris Lattner       if (line_table->GetLineEntryAtIndex(idx, line_entry))
6430fdc8d8SChris Lattner         sb_line_entry.SetLineEntry(line_entry);
6530fdc8d8SChris Lattner     }
6630fdc8d8SChris Lattner   }
67ceb6b139SCaroline Tice 
68b9c1b51eSKate Stone   if (log) {
69ceb6b139SCaroline Tice     SBStream sstr;
70ceb6b139SCaroline Tice     sb_line_entry.GetDescription(sstr);
71b9c1b51eSKate Stone     log->Printf("SBCompileUnit(%p)::GetLineEntryAtIndex (idx=%u) => "
72b9c1b51eSKate Stone                 "SBLineEntry(%p): '%s'",
73324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ptr), idx,
74324a1036SSaleem Abdulrasool                 static_cast<void *>(sb_line_entry.get()), sstr.GetData());
75ceb6b139SCaroline Tice   }
76ceb6b139SCaroline Tice 
7730fdc8d8SChris Lattner   return sb_line_entry;
7830fdc8d8SChris Lattner }
7930fdc8d8SChris Lattner 
80b9c1b51eSKate Stone uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line,
81b9c1b51eSKate Stone                                            SBFileSpec *inline_file_spec) const {
8287df91b8SJim Ingham   const bool exact = true;
8387df91b8SJim Ingham   return FindLineEntryIndex(start_idx, line, inline_file_spec, exact);
8487df91b8SJim Ingham }
8587df91b8SJim Ingham 
86b9c1b51eSKate Stone uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line,
87b9c1b51eSKate Stone                                            SBFileSpec *inline_file_spec,
88b9c1b51eSKate Stone                                            bool exact) const {
895160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
90ceb6b139SCaroline Tice 
91cfd1acedSGreg Clayton   uint32_t index = UINT32_MAX;
92b9c1b51eSKate Stone   if (m_opaque_ptr) {
9330fdc8d8SChris Lattner     FileSpec file_spec;
9430fdc8d8SChris Lattner     if (inline_file_spec && inline_file_spec->IsValid())
9530fdc8d8SChris Lattner       file_spec = inline_file_spec->ref();
9630fdc8d8SChris Lattner     else
976611103cSGreg Clayton       file_spec = *m_opaque_ptr;
9830fdc8d8SChris Lattner 
99b9c1b51eSKate Stone     index = m_opaque_ptr->FindLineEntry(
100b9c1b51eSKate Stone         start_idx, line, inline_file_spec ? inline_file_spec->get() : NULL,
101b9c1b51eSKate Stone         exact, NULL);
10230fdc8d8SChris Lattner   }
103ceb6b139SCaroline Tice 
104b9c1b51eSKate Stone   if (log) {
105750cd175SCaroline Tice     SBStream sstr;
106b9c1b51eSKate Stone     if (index == UINT32_MAX) {
107b9c1b51eSKate Stone       log->Printf("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, "
108b9c1b51eSKate Stone                   "line=%u, SBFileSpec(%p)) => NOT FOUND",
109324a1036SSaleem Abdulrasool                   static_cast<void *>(m_opaque_ptr), start_idx, line,
110324a1036SSaleem Abdulrasool                   inline_file_spec
111324a1036SSaleem Abdulrasool                       ? static_cast<const void *>(inline_file_spec->get())
112324a1036SSaleem Abdulrasool                       : NULL);
113b9c1b51eSKate Stone     } else {
114b9c1b51eSKate Stone       log->Printf("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, "
115b9c1b51eSKate Stone                   "line=%u, SBFileSpec(%p)) => %u",
116324a1036SSaleem Abdulrasool                   static_cast<void *>(m_opaque_ptr), start_idx, line,
117324a1036SSaleem Abdulrasool                   inline_file_spec
118324a1036SSaleem Abdulrasool                       ? static_cast<const void *>(inline_file_spec->get())
119324a1036SSaleem Abdulrasool                       : NULL,
120324a1036SSaleem Abdulrasool                   index);
121cfd1acedSGreg Clayton     }
122750cd175SCaroline Tice   }
123ceb6b139SCaroline Tice 
124cfd1acedSGreg Clayton   return index;
12530fdc8d8SChris Lattner }
12630fdc8d8SChris Lattner 
127b9c1b51eSKate Stone uint32_t SBCompileUnit::GetNumSupportFiles() const {
128b9c1b51eSKate Stone   if (m_opaque_ptr) {
129873a7a4bSJohnny Chen     FileSpecList &support_files = m_opaque_ptr->GetSupportFiles();
130873a7a4bSJohnny Chen     return support_files.GetSize();
131873a7a4bSJohnny Chen   }
132873a7a4bSJohnny Chen   return 0;
133873a7a4bSJohnny Chen }
134873a7a4bSJohnny Chen 
135b9c1b51eSKate Stone lldb::SBTypeList SBCompileUnit::GetTypes(uint32_t type_mask) {
136f02500c7SGreg Clayton   SBTypeList sb_type_list;
137f02500c7SGreg Clayton 
138b9c1b51eSKate Stone   if (m_opaque_ptr) {
139f02500c7SGreg Clayton     ModuleSP module_sp(m_opaque_ptr->GetModule());
140b9c1b51eSKate Stone     if (module_sp) {
141f02500c7SGreg Clayton       SymbolVendor *vendor = module_sp->GetSymbolVendor();
142b9c1b51eSKate Stone       if (vendor) {
143f02500c7SGreg Clayton         TypeList type_list;
144f02500c7SGreg Clayton         vendor->GetTypes(m_opaque_ptr, type_mask, type_list);
145f02500c7SGreg Clayton         sb_type_list.m_opaque_ap->Append(type_list);
146f02500c7SGreg Clayton       }
147f02500c7SGreg Clayton     }
148f02500c7SGreg Clayton   }
149f02500c7SGreg Clayton   return sb_type_list;
150f02500c7SGreg Clayton }
151f02500c7SGreg Clayton 
152b9c1b51eSKate Stone SBFileSpec SBCompileUnit::GetSupportFileAtIndex(uint32_t idx) const {
1535160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
154873a7a4bSJohnny Chen 
155873a7a4bSJohnny Chen   SBFileSpec sb_file_spec;
156b9c1b51eSKate Stone   if (m_opaque_ptr) {
157873a7a4bSJohnny Chen     FileSpecList &support_files = m_opaque_ptr->GetSupportFiles();
158873a7a4bSJohnny Chen     FileSpec file_spec = support_files.GetFileSpecAtIndex(idx);
159873a7a4bSJohnny Chen     sb_file_spec.SetFileSpec(file_spec);
160873a7a4bSJohnny Chen   }
161873a7a4bSJohnny Chen 
162b9c1b51eSKate Stone   if (log) {
163873a7a4bSJohnny Chen     SBStream sstr;
164873a7a4bSJohnny Chen     sb_file_spec.GetDescription(sstr);
165b9c1b51eSKate Stone     log->Printf("SBCompileUnit(%p)::GetGetFileSpecAtIndex (idx=%u) => "
166b9c1b51eSKate Stone                 "SBFileSpec(%p): '%s'",
167324a1036SSaleem Abdulrasool                 static_cast<void *>(m_opaque_ptr), idx,
168b9c1b51eSKate Stone                 static_cast<const void *>(sb_file_spec.get()), sstr.GetData());
169873a7a4bSJohnny Chen   }
170873a7a4bSJohnny Chen 
171873a7a4bSJohnny Chen   return sb_file_spec;
172873a7a4bSJohnny Chen }
173873a7a4bSJohnny Chen 
174b9c1b51eSKate Stone uint32_t SBCompileUnit::FindSupportFileIndex(uint32_t start_idx,
175b9c1b51eSKate Stone                                              const SBFileSpec &sb_file,
176b9c1b51eSKate Stone                                              bool full) {
177b9c1b51eSKate Stone   if (m_opaque_ptr) {
178873a7a4bSJohnny Chen     FileSpecList &support_files = m_opaque_ptr->GetSupportFiles();
179873a7a4bSJohnny Chen     return support_files.FindFileIndex(start_idx, sb_file.ref(), full);
180873a7a4bSJohnny Chen   }
181873a7a4bSJohnny Chen   return 0;
182873a7a4bSJohnny Chen }
183873a7a4bSJohnny Chen 
184b9c1b51eSKate Stone lldb::LanguageType SBCompileUnit::GetLanguage() {
1856cd8e0c9SEnrico Granata   if (m_opaque_ptr)
1866cd8e0c9SEnrico Granata     return m_opaque_ptr->GetLanguage();
1876cd8e0c9SEnrico Granata   return lldb::eLanguageTypeUnknown;
1886cd8e0c9SEnrico Granata }
1896cd8e0c9SEnrico Granata 
190b9c1b51eSKate Stone bool SBCompileUnit::IsValid() const { return m_opaque_ptr != NULL; }
19130fdc8d8SChris Lattner 
192b9c1b51eSKate Stone bool SBCompileUnit::operator==(const SBCompileUnit &rhs) const {
1936611103cSGreg Clayton   return m_opaque_ptr == rhs.m_opaque_ptr;
19430fdc8d8SChris Lattner }
19530fdc8d8SChris Lattner 
196b9c1b51eSKate Stone bool SBCompileUnit::operator!=(const SBCompileUnit &rhs) const {
1976611103cSGreg Clayton   return m_opaque_ptr != rhs.m_opaque_ptr;
19830fdc8d8SChris Lattner }
19930fdc8d8SChris Lattner 
200b9c1b51eSKate Stone const lldb_private::CompileUnit *SBCompileUnit::operator->() const {
2016611103cSGreg Clayton   return m_opaque_ptr;
20230fdc8d8SChris Lattner }
20330fdc8d8SChris Lattner 
204b9c1b51eSKate Stone const lldb_private::CompileUnit &SBCompileUnit::operator*() const {
2056611103cSGreg Clayton   return *m_opaque_ptr;
20630fdc8d8SChris Lattner }
207dde9cff3SCaroline Tice 
208b9c1b51eSKate Stone lldb_private::CompileUnit *SBCompileUnit::get() { return m_opaque_ptr; }
20972eff18aSGreg Clayton 
210b9c1b51eSKate Stone void SBCompileUnit::reset(lldb_private::CompileUnit *lldb_object_ptr) {
21172eff18aSGreg Clayton   m_opaque_ptr = lldb_object_ptr;
21272eff18aSGreg Clayton }
21372eff18aSGreg Clayton 
214b9c1b51eSKate Stone bool SBCompileUnit::GetDescription(SBStream &description) {
215da7bc7d0SGreg Clayton   Stream &strm = description.ref();
216da7bc7d0SGreg Clayton 
217b9c1b51eSKate Stone   if (m_opaque_ptr) {
218da7bc7d0SGreg Clayton     m_opaque_ptr->Dump(&strm, false);
219b9c1b51eSKate Stone   } else
220da7bc7d0SGreg Clayton     strm.PutCString("No value");
221dde9cff3SCaroline Tice 
222dde9cff3SCaroline Tice   return true;
223dde9cff3SCaroline Tice }
224