130fdc8d8SChris Lattner //===-- SBCompileUnit.cpp ---------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
930fdc8d8SChris Lattner #include "lldb/API/SBCompileUnit.h"
10baf5664fSJonas Devlieghere #include "SBReproducerPrivate.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"
1930fdc8d8SChris Lattner 
2030fdc8d8SChris Lattner using namespace lldb;
2130fdc8d8SChris Lattner using namespace lldb_private;
2230fdc8d8SChris Lattner 
23248a1305SKonrad Kleine SBCompileUnit::SBCompileUnit() : m_opaque_ptr(nullptr) {
24baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBCompileUnit);
25baf5664fSJonas Devlieghere }
2630fdc8d8SChris Lattner 
27b9c1b51eSKate Stone SBCompileUnit::SBCompileUnit(lldb_private::CompileUnit *lldb_object_ptr)
28b9c1b51eSKate Stone     : m_opaque_ptr(lldb_object_ptr) {}
2930fdc8d8SChris Lattner 
30b9c1b51eSKate Stone SBCompileUnit::SBCompileUnit(const SBCompileUnit &rhs)
31baf5664fSJonas Devlieghere     : m_opaque_ptr(rhs.m_opaque_ptr) {
32baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBCompileUnit, (const lldb::SBCompileUnit &), rhs);
33baf5664fSJonas Devlieghere }
3430fdc8d8SChris Lattner 
35b9c1b51eSKate Stone const SBCompileUnit &SBCompileUnit::operator=(const SBCompileUnit &rhs) {
36baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(const lldb::SBCompileUnit &,
37baf5664fSJonas Devlieghere                      SBCompileUnit, operator=,(const lldb::SBCompileUnit &),
38baf5664fSJonas Devlieghere                      rhs);
39baf5664fSJonas Devlieghere 
40efabb123SGreg Clayton   m_opaque_ptr = rhs.m_opaque_ptr;
41306809f2SJonas Devlieghere   return LLDB_RECORD_RESULT(*this);
42efabb123SGreg Clayton }
43efabb123SGreg Clayton 
44248a1305SKonrad Kleine SBCompileUnit::~SBCompileUnit() { m_opaque_ptr = nullptr; }
45efabb123SGreg Clayton 
46b9c1b51eSKate Stone SBFileSpec SBCompileUnit::GetFileSpec() const {
47baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBCompileUnit,
48baf5664fSJonas Devlieghere                                    GetFileSpec);
49baf5664fSJonas Devlieghere 
5030fdc8d8SChris Lattner   SBFileSpec file_spec;
516611103cSGreg Clayton   if (m_opaque_ptr)
526611103cSGreg Clayton     file_spec.SetFileSpec(*m_opaque_ptr);
53baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(file_spec);
5430fdc8d8SChris Lattner }
5530fdc8d8SChris Lattner 
56b9c1b51eSKate Stone uint32_t SBCompileUnit::GetNumLineEntries() const {
57baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBCompileUnit, GetNumLineEntries);
58baf5664fSJonas Devlieghere 
59b9c1b51eSKate Stone   if (m_opaque_ptr) {
606611103cSGreg Clayton     LineTable *line_table = m_opaque_ptr->GetLineTable();
61b459f182SJason Molenda     if (line_table) {
6230fdc8d8SChris Lattner       return line_table->GetSize();
6330fdc8d8SChris Lattner     }
64b459f182SJason Molenda   }
6530fdc8d8SChris Lattner   return 0;
6630fdc8d8SChris Lattner }
6730fdc8d8SChris Lattner 
68b9c1b51eSKate Stone SBLineEntry SBCompileUnit::GetLineEntryAtIndex(uint32_t idx) const {
69baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(lldb::SBLineEntry, SBCompileUnit,
70baf5664fSJonas Devlieghere                            GetLineEntryAtIndex, (uint32_t), idx);
71baf5664fSJonas Devlieghere 
7230fdc8d8SChris Lattner   SBLineEntry sb_line_entry;
73b9c1b51eSKate Stone   if (m_opaque_ptr) {
746611103cSGreg Clayton     LineTable *line_table = m_opaque_ptr->GetLineTable();
75b9c1b51eSKate Stone     if (line_table) {
7630fdc8d8SChris Lattner       LineEntry line_entry;
7730fdc8d8SChris Lattner       if (line_table->GetLineEntryAtIndex(idx, line_entry))
7830fdc8d8SChris Lattner         sb_line_entry.SetLineEntry(line_entry);
7930fdc8d8SChris Lattner     }
8030fdc8d8SChris Lattner   }
81ceb6b139SCaroline Tice 
82baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_line_entry);
8330fdc8d8SChris Lattner }
8430fdc8d8SChris Lattner 
85b9c1b51eSKate Stone uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line,
86b9c1b51eSKate Stone                                            SBFileSpec *inline_file_spec) const {
87baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(uint32_t, SBCompileUnit, FindLineEntryIndex,
88baf5664fSJonas Devlieghere                            (uint32_t, uint32_t, lldb::SBFileSpec *), start_idx,
89baf5664fSJonas Devlieghere                            line, inline_file_spec);
90baf5664fSJonas Devlieghere 
9187df91b8SJim Ingham   const bool exact = true;
9287df91b8SJim Ingham   return FindLineEntryIndex(start_idx, line, inline_file_spec, exact);
9387df91b8SJim Ingham }
9487df91b8SJim Ingham 
95b9c1b51eSKate Stone uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line,
96b9c1b51eSKate Stone                                            SBFileSpec *inline_file_spec,
97b9c1b51eSKate Stone                                            bool exact) const {
98baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(uint32_t, SBCompileUnit, FindLineEntryIndex,
99baf5664fSJonas Devlieghere                            (uint32_t, uint32_t, lldb::SBFileSpec *, bool),
100baf5664fSJonas Devlieghere                            start_idx, line, inline_file_spec, exact);
101baf5664fSJonas Devlieghere 
102cfd1acedSGreg Clayton   uint32_t index = UINT32_MAX;
103b9c1b51eSKate Stone   if (m_opaque_ptr) {
10430fdc8d8SChris Lattner     FileSpec file_spec;
10530fdc8d8SChris Lattner     if (inline_file_spec && inline_file_spec->IsValid())
10630fdc8d8SChris Lattner       file_spec = inline_file_spec->ref();
10730fdc8d8SChris Lattner     else
1086611103cSGreg Clayton       file_spec = *m_opaque_ptr;
10930fdc8d8SChris Lattner 
110b9c1b51eSKate Stone     index = m_opaque_ptr->FindLineEntry(
111248a1305SKonrad Kleine         start_idx, line, inline_file_spec ? inline_file_spec->get() : nullptr,
112248a1305SKonrad Kleine         exact, nullptr);
11330fdc8d8SChris Lattner   }
114ceb6b139SCaroline Tice 
115cfd1acedSGreg Clayton   return index;
11630fdc8d8SChris Lattner }
11730fdc8d8SChris Lattner 
118b9c1b51eSKate Stone uint32_t SBCompileUnit::GetNumSupportFiles() const {
119baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBCompileUnit, GetNumSupportFiles);
120baf5664fSJonas Devlieghere 
121*833dba01SPavel Labath   if (m_opaque_ptr)
122*833dba01SPavel Labath     return m_opaque_ptr->GetSupportFiles().GetSize();
123*833dba01SPavel Labath 
124873a7a4bSJohnny Chen   return 0;
125873a7a4bSJohnny Chen }
126873a7a4bSJohnny Chen 
127b9c1b51eSKate Stone lldb::SBTypeList SBCompileUnit::GetTypes(uint32_t type_mask) {
128baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeList, SBCompileUnit, GetTypes, (uint32_t),
129baf5664fSJonas Devlieghere                      type_mask);
130baf5664fSJonas Devlieghere 
131f02500c7SGreg Clayton   SBTypeList sb_type_list;
132f02500c7SGreg Clayton 
133117b1fa1SZachary Turner   if (!m_opaque_ptr)
134baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_type_list);
135117b1fa1SZachary Turner 
136f02500c7SGreg Clayton   ModuleSP module_sp(m_opaque_ptr->GetModule());
137117b1fa1SZachary Turner   if (!module_sp)
138baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_type_list);
139117b1fa1SZachary Turner 
140f02500c7SGreg Clayton   SymbolVendor *vendor = module_sp->GetSymbolVendor();
141117b1fa1SZachary Turner   if (!vendor)
142baf5664fSJonas Devlieghere     return LLDB_RECORD_RESULT(sb_type_list);
143117b1fa1SZachary Turner 
144117b1fa1SZachary Turner   TypeClass type_class = static_cast<TypeClass>(type_mask);
145f02500c7SGreg Clayton   TypeList type_list;
146117b1fa1SZachary Turner   vendor->GetTypes(m_opaque_ptr, type_class, type_list);
147d5b44036SJonas Devlieghere   sb_type_list.m_opaque_up->Append(type_list);
148baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_type_list);
149f02500c7SGreg Clayton }
150f02500c7SGreg Clayton 
151b9c1b51eSKate Stone SBFileSpec SBCompileUnit::GetSupportFileAtIndex(uint32_t idx) const {
152baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(lldb::SBFileSpec, SBCompileUnit,
153baf5664fSJonas Devlieghere                            GetSupportFileAtIndex, (uint32_t), idx);
154baf5664fSJonas Devlieghere 
155873a7a4bSJohnny Chen   SBFileSpec sb_file_spec;
156b9c1b51eSKate Stone   if (m_opaque_ptr) {
157*833dba01SPavel Labath     FileSpec spec = m_opaque_ptr->GetSupportFiles().GetFileSpecAtIndex(idx);
158*833dba01SPavel Labath     sb_file_spec.SetFileSpec(spec);
159873a7a4bSJohnny Chen   }
160873a7a4bSJohnny Chen 
161873a7a4bSJohnny Chen 
162baf5664fSJonas Devlieghere   return LLDB_RECORD_RESULT(sb_file_spec);
163873a7a4bSJohnny Chen }
164873a7a4bSJohnny Chen 
165b9c1b51eSKate Stone uint32_t SBCompileUnit::FindSupportFileIndex(uint32_t start_idx,
166b9c1b51eSKate Stone                                              const SBFileSpec &sb_file,
167b9c1b51eSKate Stone                                              bool full) {
168baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(uint32_t, SBCompileUnit, FindSupportFileIndex,
169baf5664fSJonas Devlieghere                      (uint32_t, const lldb::SBFileSpec &, bool), start_idx,
170baf5664fSJonas Devlieghere                      sb_file, full);
171baf5664fSJonas Devlieghere 
172b9c1b51eSKate Stone   if (m_opaque_ptr) {
173*833dba01SPavel Labath     const FileSpecList &support_files = m_opaque_ptr->GetSupportFiles();
174873a7a4bSJohnny Chen     return support_files.FindFileIndex(start_idx, sb_file.ref(), full);
175873a7a4bSJohnny Chen   }
176873a7a4bSJohnny Chen   return 0;
177873a7a4bSJohnny Chen }
178873a7a4bSJohnny Chen 
179b9c1b51eSKate Stone lldb::LanguageType SBCompileUnit::GetLanguage() {
180baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::LanguageType, SBCompileUnit, GetLanguage);
181baf5664fSJonas Devlieghere 
1826cd8e0c9SEnrico Granata   if (m_opaque_ptr)
1836cd8e0c9SEnrico Granata     return m_opaque_ptr->GetLanguage();
1846cd8e0c9SEnrico Granata   return lldb::eLanguageTypeUnknown;
1856cd8e0c9SEnrico Granata }
1866cd8e0c9SEnrico Granata 
187baf5664fSJonas Devlieghere bool SBCompileUnit::IsValid() const {
188baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBCompileUnit, IsValid);
1897f5237bcSPavel Labath   return this->operator bool();
1907f5237bcSPavel Labath }
1917f5237bcSPavel Labath SBCompileUnit::operator bool() const {
1927f5237bcSPavel Labath   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBCompileUnit, operator bool);
193baf5664fSJonas Devlieghere 
194248a1305SKonrad Kleine   return m_opaque_ptr != nullptr;
195baf5664fSJonas Devlieghere }
19630fdc8d8SChris Lattner 
197b9c1b51eSKate Stone bool SBCompileUnit::operator==(const SBCompileUnit &rhs) const {
198baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(
199baf5664fSJonas Devlieghere       bool, SBCompileUnit, operator==,(const lldb::SBCompileUnit &), rhs);
200baf5664fSJonas Devlieghere 
2016611103cSGreg Clayton   return m_opaque_ptr == rhs.m_opaque_ptr;
20230fdc8d8SChris Lattner }
20330fdc8d8SChris Lattner 
204b9c1b51eSKate Stone bool SBCompileUnit::operator!=(const SBCompileUnit &rhs) const {
205baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(
206baf5664fSJonas Devlieghere       bool, SBCompileUnit, operator!=,(const lldb::SBCompileUnit &), rhs);
207baf5664fSJonas Devlieghere 
2086611103cSGreg Clayton   return m_opaque_ptr != rhs.m_opaque_ptr;
20930fdc8d8SChris Lattner }
21030fdc8d8SChris Lattner 
211b9c1b51eSKate Stone const lldb_private::CompileUnit *SBCompileUnit::operator->() const {
2126611103cSGreg Clayton   return m_opaque_ptr;
21330fdc8d8SChris Lattner }
21430fdc8d8SChris Lattner 
215b9c1b51eSKate Stone const lldb_private::CompileUnit &SBCompileUnit::operator*() const {
2166611103cSGreg Clayton   return *m_opaque_ptr;
21730fdc8d8SChris Lattner }
218dde9cff3SCaroline Tice 
219b9c1b51eSKate Stone lldb_private::CompileUnit *SBCompileUnit::get() { return m_opaque_ptr; }
22072eff18aSGreg Clayton 
221b9c1b51eSKate Stone void SBCompileUnit::reset(lldb_private::CompileUnit *lldb_object_ptr) {
22272eff18aSGreg Clayton   m_opaque_ptr = lldb_object_ptr;
22372eff18aSGreg Clayton }
22472eff18aSGreg Clayton 
225b9c1b51eSKate Stone bool SBCompileUnit::GetDescription(SBStream &description) {
226baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBCompileUnit, GetDescription, (lldb::SBStream &),
227baf5664fSJonas Devlieghere                      description);
228baf5664fSJonas Devlieghere 
229da7bc7d0SGreg Clayton   Stream &strm = description.ref();
230da7bc7d0SGreg Clayton 
231b9c1b51eSKate Stone   if (m_opaque_ptr) {
232da7bc7d0SGreg Clayton     m_opaque_ptr->Dump(&strm, false);
233b9c1b51eSKate Stone   } else
234da7bc7d0SGreg Clayton     strm.PutCString("No value");
235dde9cff3SCaroline Tice 
236dde9cff3SCaroline Tice   return true;
237dde9cff3SCaroline Tice }
238ae211eceSMichal Gorny 
239ae211eceSMichal Gorny namespace lldb_private {
240ae211eceSMichal Gorny namespace repro {
241ae211eceSMichal Gorny 
242ae211eceSMichal Gorny template <>
243ae211eceSMichal Gorny void RegisterMethods<SBCompileUnit>(Registry &R) {
244ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBCompileUnit, ());
245ae211eceSMichal Gorny   LLDB_REGISTER_CONSTRUCTOR(SBCompileUnit, (const lldb::SBCompileUnit &));
246ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(
247ae211eceSMichal Gorny       const lldb::SBCompileUnit &,
248ae211eceSMichal Gorny       SBCompileUnit, operator=,(const lldb::SBCompileUnit &));
249ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBCompileUnit, GetFileSpec,
250ae211eceSMichal Gorny                              ());
251ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(uint32_t, SBCompileUnit, GetNumLineEntries, ());
252ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBLineEntry, SBCompileUnit,
253ae211eceSMichal Gorny                              GetLineEntryAtIndex, (uint32_t));
254ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(uint32_t, SBCompileUnit, FindLineEntryIndex,
255ae211eceSMichal Gorny                              (uint32_t, uint32_t, lldb::SBFileSpec *));
256ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(uint32_t, SBCompileUnit, FindLineEntryIndex,
257ae211eceSMichal Gorny                              (uint32_t, uint32_t, lldb::SBFileSpec *, bool));
258ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(uint32_t, SBCompileUnit, GetNumSupportFiles, ());
259ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::SBTypeList, SBCompileUnit, GetTypes, (uint32_t));
260ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBCompileUnit,
261ae211eceSMichal Gorny                              GetSupportFileAtIndex, (uint32_t));
262ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(uint32_t, SBCompileUnit, FindSupportFileIndex,
263ae211eceSMichal Gorny                        (uint32_t, const lldb::SBFileSpec &, bool));
264ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(lldb::LanguageType, SBCompileUnit, GetLanguage, ());
265ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBCompileUnit, IsValid, ());
266ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(bool, SBCompileUnit, operator bool, ());
267ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(
268ae211eceSMichal Gorny       bool, SBCompileUnit, operator==,(const lldb::SBCompileUnit &));
269ae211eceSMichal Gorny   LLDB_REGISTER_METHOD_CONST(
270ae211eceSMichal Gorny       bool, SBCompileUnit, operator!=,(const lldb::SBCompileUnit &));
271ae211eceSMichal Gorny   LLDB_REGISTER_METHOD(bool, SBCompileUnit, GetDescription,
272ae211eceSMichal Gorny                        (lldb::SBStream &));
273ae211eceSMichal Gorny }
274ae211eceSMichal Gorny 
275ae211eceSMichal Gorny }
276ae211eceSMichal Gorny }
277