180814287SRaphael Isemann //===-- SBCompileUnit.cpp -------------------------------------------------===//
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"
10d51402acSJonas Devlieghere #include "lldb/Utility/ReproducerInstrumentation.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"
17465eae36SPavel Labath #include "lldb/Symbol/SymbolFile.h"
18f02500c7SGreg Clayton #include "lldb/Symbol/Type.h"
19f46e8974SPavel Labath #include "lldb/Symbol/TypeList.h"
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner using namespace lldb;
2230fdc8d8SChris Lattner using namespace lldb_private;
2330fdc8d8SChris Lattner 
249494c510SJonas Devlieghere SBCompileUnit::SBCompileUnit() {
25baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBCompileUnit);
26baf5664fSJonas Devlieghere }
2730fdc8d8SChris Lattner 
28b9c1b51eSKate Stone SBCompileUnit::SBCompileUnit(lldb_private::CompileUnit *lldb_object_ptr)
29b9c1b51eSKate Stone     : m_opaque_ptr(lldb_object_ptr) {}
3030fdc8d8SChris Lattner 
31b9c1b51eSKate Stone SBCompileUnit::SBCompileUnit(const SBCompileUnit &rhs)
32baf5664fSJonas Devlieghere     : m_opaque_ptr(rhs.m_opaque_ptr) {
33baf5664fSJonas Devlieghere   LLDB_RECORD_CONSTRUCTOR(SBCompileUnit, (const lldb::SBCompileUnit &), rhs);
34baf5664fSJonas Devlieghere }
3530fdc8d8SChris Lattner 
36b9c1b51eSKate Stone const SBCompileUnit &SBCompileUnit::operator=(const SBCompileUnit &rhs) {
37baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(const lldb::SBCompileUnit &,
38baf5664fSJonas Devlieghere                      SBCompileUnit, operator=,(const lldb::SBCompileUnit &),
39baf5664fSJonas Devlieghere                      rhs);
40baf5664fSJonas Devlieghere 
41efabb123SGreg Clayton   m_opaque_ptr = rhs.m_opaque_ptr;
42*d232abc3SJonas Devlieghere   return *this;
43efabb123SGreg Clayton }
44efabb123SGreg Clayton 
45248a1305SKonrad Kleine SBCompileUnit::~SBCompileUnit() { m_opaque_ptr = nullptr; }
46efabb123SGreg Clayton 
47b9c1b51eSKate Stone SBFileSpec SBCompileUnit::GetFileSpec() const {
48baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBCompileUnit,
49baf5664fSJonas Devlieghere                                    GetFileSpec);
50baf5664fSJonas Devlieghere 
5130fdc8d8SChris Lattner   SBFileSpec file_spec;
526611103cSGreg Clayton   if (m_opaque_ptr)
5338870af8SPavel Labath     file_spec.SetFileSpec(m_opaque_ptr->GetPrimaryFile());
54*d232abc3SJonas Devlieghere   return file_spec;
5530fdc8d8SChris Lattner }
5630fdc8d8SChris Lattner 
57b9c1b51eSKate Stone uint32_t SBCompileUnit::GetNumLineEntries() const {
58baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBCompileUnit, GetNumLineEntries);
59baf5664fSJonas Devlieghere 
60b9c1b51eSKate Stone   if (m_opaque_ptr) {
616611103cSGreg Clayton     LineTable *line_table = m_opaque_ptr->GetLineTable();
62b459f182SJason Molenda     if (line_table) {
6330fdc8d8SChris Lattner       return line_table->GetSize();
6430fdc8d8SChris Lattner     }
65b459f182SJason Molenda   }
6630fdc8d8SChris Lattner   return 0;
6730fdc8d8SChris Lattner }
6830fdc8d8SChris Lattner 
69b9c1b51eSKate Stone SBLineEntry SBCompileUnit::GetLineEntryAtIndex(uint32_t idx) const {
70baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(lldb::SBLineEntry, SBCompileUnit,
71baf5664fSJonas Devlieghere                            GetLineEntryAtIndex, (uint32_t), idx);
72baf5664fSJonas Devlieghere 
7330fdc8d8SChris Lattner   SBLineEntry sb_line_entry;
74b9c1b51eSKate Stone   if (m_opaque_ptr) {
756611103cSGreg Clayton     LineTable *line_table = m_opaque_ptr->GetLineTable();
76b9c1b51eSKate Stone     if (line_table) {
7730fdc8d8SChris Lattner       LineEntry line_entry;
7830fdc8d8SChris Lattner       if (line_table->GetLineEntryAtIndex(idx, line_entry))
7930fdc8d8SChris Lattner         sb_line_entry.SetLineEntry(line_entry);
8030fdc8d8SChris Lattner     }
8130fdc8d8SChris Lattner   }
82ceb6b139SCaroline Tice 
83*d232abc3SJonas Devlieghere   return sb_line_entry;
8430fdc8d8SChris Lattner }
8530fdc8d8SChris Lattner 
86b9c1b51eSKate Stone uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line,
87b9c1b51eSKate Stone                                            SBFileSpec *inline_file_spec) const {
88baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(uint32_t, SBCompileUnit, FindLineEntryIndex,
89baf5664fSJonas Devlieghere                            (uint32_t, uint32_t, lldb::SBFileSpec *), start_idx,
90baf5664fSJonas Devlieghere                            line, inline_file_spec);
91baf5664fSJonas Devlieghere 
9287df91b8SJim Ingham   const bool exact = true;
9387df91b8SJim Ingham   return FindLineEntryIndex(start_idx, line, inline_file_spec, exact);
9487df91b8SJim Ingham }
9587df91b8SJim Ingham 
96b9c1b51eSKate Stone uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line,
97b9c1b51eSKate Stone                                            SBFileSpec *inline_file_spec,
98b9c1b51eSKate Stone                                            bool exact) const {
99baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(uint32_t, SBCompileUnit, FindLineEntryIndex,
100baf5664fSJonas Devlieghere                            (uint32_t, uint32_t, lldb::SBFileSpec *, bool),
101baf5664fSJonas Devlieghere                            start_idx, line, inline_file_spec, exact);
102baf5664fSJonas Devlieghere 
103cfd1acedSGreg Clayton   uint32_t index = UINT32_MAX;
104b9c1b51eSKate Stone   if (m_opaque_ptr) {
10530fdc8d8SChris Lattner     FileSpec file_spec;
10630fdc8d8SChris Lattner     if (inline_file_spec && inline_file_spec->IsValid())
10730fdc8d8SChris Lattner       file_spec = inline_file_spec->ref();
10830fdc8d8SChris Lattner     else
10938870af8SPavel Labath       file_spec = m_opaque_ptr->GetPrimaryFile();
11030fdc8d8SChris Lattner 
1111b4d5b3bSMed Ismail Bennani     LineEntry line_entry;
112b9c1b51eSKate Stone     index = m_opaque_ptr->FindLineEntry(
113248a1305SKonrad Kleine         start_idx, line, inline_file_spec ? inline_file_spec->get() : nullptr,
1141b4d5b3bSMed Ismail Bennani         exact, &line_entry);
11530fdc8d8SChris Lattner   }
116ceb6b139SCaroline Tice 
117cfd1acedSGreg Clayton   return index;
11830fdc8d8SChris Lattner }
11930fdc8d8SChris Lattner 
120b9c1b51eSKate Stone uint32_t SBCompileUnit::GetNumSupportFiles() const {
121baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBCompileUnit, GetNumSupportFiles);
122baf5664fSJonas Devlieghere 
123833dba01SPavel Labath   if (m_opaque_ptr)
124833dba01SPavel Labath     return m_opaque_ptr->GetSupportFiles().GetSize();
125833dba01SPavel Labath 
126873a7a4bSJohnny Chen   return 0;
127873a7a4bSJohnny Chen }
128873a7a4bSJohnny Chen 
129b9c1b51eSKate Stone lldb::SBTypeList SBCompileUnit::GetTypes(uint32_t type_mask) {
130baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(lldb::SBTypeList, SBCompileUnit, GetTypes, (uint32_t),
131baf5664fSJonas Devlieghere                      type_mask);
132baf5664fSJonas Devlieghere 
133f02500c7SGreg Clayton   SBTypeList sb_type_list;
134f02500c7SGreg Clayton 
135117b1fa1SZachary Turner   if (!m_opaque_ptr)
136*d232abc3SJonas Devlieghere     return sb_type_list;
137117b1fa1SZachary Turner 
138f02500c7SGreg Clayton   ModuleSP module_sp(m_opaque_ptr->GetModule());
139117b1fa1SZachary Turner   if (!module_sp)
140*d232abc3SJonas Devlieghere     return sb_type_list;
141117b1fa1SZachary Turner 
142465eae36SPavel Labath   SymbolFile *symfile = module_sp->GetSymbolFile();
143465eae36SPavel Labath   if (!symfile)
144*d232abc3SJonas Devlieghere     return sb_type_list;
145117b1fa1SZachary Turner 
146117b1fa1SZachary Turner   TypeClass type_class = static_cast<TypeClass>(type_mask);
147f02500c7SGreg Clayton   TypeList type_list;
148465eae36SPavel Labath   symfile->GetTypes(m_opaque_ptr, type_class, type_list);
149d5b44036SJonas Devlieghere   sb_type_list.m_opaque_up->Append(type_list);
150*d232abc3SJonas Devlieghere   return sb_type_list;
151f02500c7SGreg Clayton }
152f02500c7SGreg Clayton 
153b9c1b51eSKate Stone SBFileSpec SBCompileUnit::GetSupportFileAtIndex(uint32_t idx) const {
154baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(lldb::SBFileSpec, SBCompileUnit,
155baf5664fSJonas Devlieghere                            GetSupportFileAtIndex, (uint32_t), idx);
156baf5664fSJonas Devlieghere 
157873a7a4bSJohnny Chen   SBFileSpec sb_file_spec;
158b9c1b51eSKate Stone   if (m_opaque_ptr) {
159833dba01SPavel Labath     FileSpec spec = m_opaque_ptr->GetSupportFiles().GetFileSpecAtIndex(idx);
160833dba01SPavel Labath     sb_file_spec.SetFileSpec(spec);
161873a7a4bSJohnny Chen   }
162873a7a4bSJohnny Chen 
163*d232abc3SJonas Devlieghere   return sb_file_spec;
164873a7a4bSJohnny Chen }
165873a7a4bSJohnny Chen 
166b9c1b51eSKate Stone uint32_t SBCompileUnit::FindSupportFileIndex(uint32_t start_idx,
167b9c1b51eSKate Stone                                              const SBFileSpec &sb_file,
168b9c1b51eSKate Stone                                              bool full) {
169baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(uint32_t, SBCompileUnit, FindSupportFileIndex,
170baf5664fSJonas Devlieghere                      (uint32_t, const lldb::SBFileSpec &, bool), start_idx,
171baf5664fSJonas Devlieghere                      sb_file, full);
172baf5664fSJonas Devlieghere 
173b9c1b51eSKate Stone   if (m_opaque_ptr) {
174833dba01SPavel Labath     const FileSpecList &support_files = m_opaque_ptr->GetSupportFiles();
175873a7a4bSJohnny Chen     return support_files.FindFileIndex(start_idx, sb_file.ref(), full);
176873a7a4bSJohnny Chen   }
177873a7a4bSJohnny Chen   return 0;
178873a7a4bSJohnny Chen }
179873a7a4bSJohnny Chen 
180b9c1b51eSKate Stone lldb::LanguageType SBCompileUnit::GetLanguage() {
181baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_NO_ARGS(lldb::LanguageType, SBCompileUnit, GetLanguage);
182baf5664fSJonas Devlieghere 
1836cd8e0c9SEnrico Granata   if (m_opaque_ptr)
1846cd8e0c9SEnrico Granata     return m_opaque_ptr->GetLanguage();
1856cd8e0c9SEnrico Granata   return lldb::eLanguageTypeUnknown;
1866cd8e0c9SEnrico Granata }
1876cd8e0c9SEnrico Granata 
188baf5664fSJonas Devlieghere bool SBCompileUnit::IsValid() const {
189baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBCompileUnit, IsValid);
1907f5237bcSPavel Labath   return this->operator bool();
1917f5237bcSPavel Labath }
1927f5237bcSPavel Labath SBCompileUnit::operator bool() const {
1937f5237bcSPavel Labath   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBCompileUnit, operator bool);
194baf5664fSJonas Devlieghere 
195248a1305SKonrad Kleine   return m_opaque_ptr != nullptr;
196baf5664fSJonas Devlieghere }
19730fdc8d8SChris Lattner 
198b9c1b51eSKate Stone bool SBCompileUnit::operator==(const SBCompileUnit &rhs) const {
199baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(
200baf5664fSJonas Devlieghere       bool, SBCompileUnit, operator==,(const lldb::SBCompileUnit &), rhs);
201baf5664fSJonas Devlieghere 
2026611103cSGreg Clayton   return m_opaque_ptr == rhs.m_opaque_ptr;
20330fdc8d8SChris Lattner }
20430fdc8d8SChris Lattner 
205b9c1b51eSKate Stone bool SBCompileUnit::operator!=(const SBCompileUnit &rhs) const {
206baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD_CONST(
207baf5664fSJonas Devlieghere       bool, SBCompileUnit, operator!=,(const lldb::SBCompileUnit &), rhs);
208baf5664fSJonas Devlieghere 
2096611103cSGreg Clayton   return m_opaque_ptr != rhs.m_opaque_ptr;
21030fdc8d8SChris Lattner }
21130fdc8d8SChris Lattner 
212b9c1b51eSKate Stone const lldb_private::CompileUnit *SBCompileUnit::operator->() const {
2136611103cSGreg Clayton   return m_opaque_ptr;
21430fdc8d8SChris Lattner }
21530fdc8d8SChris Lattner 
216b9c1b51eSKate Stone const lldb_private::CompileUnit &SBCompileUnit::operator*() const {
2176611103cSGreg Clayton   return *m_opaque_ptr;
21830fdc8d8SChris Lattner }
219dde9cff3SCaroline Tice 
220b9c1b51eSKate Stone lldb_private::CompileUnit *SBCompileUnit::get() { return m_opaque_ptr; }
22172eff18aSGreg Clayton 
222b9c1b51eSKate Stone void SBCompileUnit::reset(lldb_private::CompileUnit *lldb_object_ptr) {
22372eff18aSGreg Clayton   m_opaque_ptr = lldb_object_ptr;
22472eff18aSGreg Clayton }
22572eff18aSGreg Clayton 
226b9c1b51eSKate Stone bool SBCompileUnit::GetDescription(SBStream &description) {
227baf5664fSJonas Devlieghere   LLDB_RECORD_METHOD(bool, SBCompileUnit, GetDescription, (lldb::SBStream &),
228baf5664fSJonas Devlieghere                      description);
229baf5664fSJonas Devlieghere 
230da7bc7d0SGreg Clayton   Stream &strm = description.ref();
231da7bc7d0SGreg Clayton 
232b9c1b51eSKate Stone   if (m_opaque_ptr) {
233da7bc7d0SGreg Clayton     m_opaque_ptr->Dump(&strm, false);
234b9c1b51eSKate Stone   } else
235da7bc7d0SGreg Clayton     strm.PutCString("No value");
236dde9cff3SCaroline Tice 
237dde9cff3SCaroline Tice   return true;
238dde9cff3SCaroline Tice }
239