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"
1030fdc8d8SChris Lattner #include "lldb/API/SBLineEntry.h"
11dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
12f02500c7SGreg Clayton #include "lldb/Core/Module.h"
1330fdc8d8SChris Lattner #include "lldb/Symbol/CompileUnit.h"
1430fdc8d8SChris Lattner #include "lldb/Symbol/LineEntry.h"
1530fdc8d8SChris Lattner #include "lldb/Symbol/LineTable.h"
16465eae36SPavel Labath #include "lldb/Symbol/SymbolFile.h"
17f02500c7SGreg Clayton #include "lldb/Symbol/Type.h"
18f46e8974SPavel Labath #include "lldb/Symbol/TypeList.h"
191755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
2030fdc8d8SChris Lattner
2130fdc8d8SChris Lattner using namespace lldb;
2230fdc8d8SChris Lattner using namespace lldb_private;
2330fdc8d8SChris Lattner
SBCompileUnit()241755f5b1SJonas Devlieghere SBCompileUnit::SBCompileUnit() { LLDB_INSTRUMENT_VA(this); }
2530fdc8d8SChris Lattner
SBCompileUnit(lldb_private::CompileUnit * lldb_object_ptr)26b9c1b51eSKate Stone SBCompileUnit::SBCompileUnit(lldb_private::CompileUnit *lldb_object_ptr)
27b9c1b51eSKate Stone : m_opaque_ptr(lldb_object_ptr) {}
2830fdc8d8SChris Lattner
SBCompileUnit(const SBCompileUnit & rhs)29b9c1b51eSKate Stone SBCompileUnit::SBCompileUnit(const SBCompileUnit &rhs)
30baf5664fSJonas Devlieghere : m_opaque_ptr(rhs.m_opaque_ptr) {
311755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
32baf5664fSJonas Devlieghere }
3330fdc8d8SChris Lattner
operator =(const SBCompileUnit & rhs)34b9c1b51eSKate Stone const SBCompileUnit &SBCompileUnit::operator=(const SBCompileUnit &rhs) {
351755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
36baf5664fSJonas Devlieghere
37efabb123SGreg Clayton m_opaque_ptr = rhs.m_opaque_ptr;
38d232abc3SJonas Devlieghere return *this;
39efabb123SGreg Clayton }
40efabb123SGreg Clayton
~SBCompileUnit()41248a1305SKonrad Kleine SBCompileUnit::~SBCompileUnit() { m_opaque_ptr = nullptr; }
42efabb123SGreg Clayton
GetFileSpec() const43b9c1b51eSKate Stone SBFileSpec SBCompileUnit::GetFileSpec() const {
441755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
45baf5664fSJonas Devlieghere
4630fdc8d8SChris Lattner SBFileSpec file_spec;
476611103cSGreg Clayton if (m_opaque_ptr)
4838870af8SPavel Labath file_spec.SetFileSpec(m_opaque_ptr->GetPrimaryFile());
49d232abc3SJonas Devlieghere return file_spec;
5030fdc8d8SChris Lattner }
5130fdc8d8SChris Lattner
GetNumLineEntries() const52b9c1b51eSKate Stone uint32_t SBCompileUnit::GetNumLineEntries() const {
531755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
54baf5664fSJonas Devlieghere
55b9c1b51eSKate Stone if (m_opaque_ptr) {
566611103cSGreg Clayton LineTable *line_table = m_opaque_ptr->GetLineTable();
57b459f182SJason Molenda if (line_table) {
5830fdc8d8SChris Lattner return line_table->GetSize();
5930fdc8d8SChris Lattner }
60b459f182SJason Molenda }
6130fdc8d8SChris Lattner return 0;
6230fdc8d8SChris Lattner }
6330fdc8d8SChris Lattner
GetLineEntryAtIndex(uint32_t idx) const64b9c1b51eSKate Stone SBLineEntry SBCompileUnit::GetLineEntryAtIndex(uint32_t idx) const {
651755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, idx);
66baf5664fSJonas Devlieghere
6730fdc8d8SChris Lattner SBLineEntry sb_line_entry;
68b9c1b51eSKate Stone if (m_opaque_ptr) {
696611103cSGreg Clayton LineTable *line_table = m_opaque_ptr->GetLineTable();
70b9c1b51eSKate Stone if (line_table) {
7130fdc8d8SChris Lattner LineEntry line_entry;
7230fdc8d8SChris Lattner if (line_table->GetLineEntryAtIndex(idx, line_entry))
7330fdc8d8SChris Lattner sb_line_entry.SetLineEntry(line_entry);
7430fdc8d8SChris Lattner }
7530fdc8d8SChris Lattner }
76ceb6b139SCaroline Tice
77d232abc3SJonas Devlieghere return sb_line_entry;
7830fdc8d8SChris Lattner }
7930fdc8d8SChris Lattner
FindLineEntryIndex(lldb::SBLineEntry & line_entry,bool exact) const80*174cf2f7SMed Ismail Bennani uint32_t SBCompileUnit::FindLineEntryIndex(lldb::SBLineEntry &line_entry,
81a6926d57SMed Ismail Bennani bool exact) const {
82a6926d57SMed Ismail Bennani LLDB_INSTRUMENT_VA(this, line_entry, exact);
83a6926d57SMed Ismail Bennani
84a6926d57SMed Ismail Bennani if (!m_opaque_ptr || !line_entry.IsValid())
85a6926d57SMed Ismail Bennani return UINT32_MAX;
86a6926d57SMed Ismail Bennani
87a6926d57SMed Ismail Bennani LineEntry found_line_entry;
88a6926d57SMed Ismail Bennani
89a6926d57SMed Ismail Bennani return m_opaque_ptr->FindLineEntry(0, line_entry.GetLine(),
90a6926d57SMed Ismail Bennani line_entry.GetFileSpec().get(), exact,
91a6926d57SMed Ismail Bennani &line_entry.ref());
92a6926d57SMed Ismail Bennani }
93a6926d57SMed Ismail Bennani
FindLineEntryIndex(uint32_t start_idx,uint32_t line,SBFileSpec * inline_file_spec) const94b9c1b51eSKate Stone uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line,
95b9c1b51eSKate Stone SBFileSpec *inline_file_spec) const {
961755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, start_idx, line, inline_file_spec);
97baf5664fSJonas Devlieghere
9887df91b8SJim Ingham const bool exact = true;
9987df91b8SJim Ingham return FindLineEntryIndex(start_idx, line, inline_file_spec, exact);
10087df91b8SJim Ingham }
10187df91b8SJim Ingham
FindLineEntryIndex(uint32_t start_idx,uint32_t line,SBFileSpec * inline_file_spec,bool exact) const102b9c1b51eSKate Stone uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line,
103b9c1b51eSKate Stone SBFileSpec *inline_file_spec,
104b9c1b51eSKate Stone bool exact) const {
1051755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, start_idx, line, inline_file_spec, exact);
106baf5664fSJonas Devlieghere
107cfd1acedSGreg Clayton uint32_t index = UINT32_MAX;
108b9c1b51eSKate Stone if (m_opaque_ptr) {
10930fdc8d8SChris Lattner FileSpec file_spec;
11030fdc8d8SChris Lattner if (inline_file_spec && inline_file_spec->IsValid())
11130fdc8d8SChris Lattner file_spec = inline_file_spec->ref();
11230fdc8d8SChris Lattner else
11338870af8SPavel Labath file_spec = m_opaque_ptr->GetPrimaryFile();
11430fdc8d8SChris Lattner
1151b4d5b3bSMed Ismail Bennani LineEntry line_entry;
116b9c1b51eSKate Stone index = m_opaque_ptr->FindLineEntry(
117248a1305SKonrad Kleine start_idx, line, inline_file_spec ? inline_file_spec->get() : nullptr,
1181b4d5b3bSMed Ismail Bennani exact, &line_entry);
11930fdc8d8SChris Lattner }
120ceb6b139SCaroline Tice
121cfd1acedSGreg Clayton return index;
12230fdc8d8SChris Lattner }
12330fdc8d8SChris Lattner
GetNumSupportFiles() const124b9c1b51eSKate Stone uint32_t SBCompileUnit::GetNumSupportFiles() const {
1251755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
126baf5664fSJonas Devlieghere
127833dba01SPavel Labath if (m_opaque_ptr)
128833dba01SPavel Labath return m_opaque_ptr->GetSupportFiles().GetSize();
129833dba01SPavel Labath
130873a7a4bSJohnny Chen return 0;
131873a7a4bSJohnny Chen }
132873a7a4bSJohnny Chen
GetTypes(uint32_t type_mask)133b9c1b51eSKate Stone lldb::SBTypeList SBCompileUnit::GetTypes(uint32_t type_mask) {
1341755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, type_mask);
135baf5664fSJonas Devlieghere
136f02500c7SGreg Clayton SBTypeList sb_type_list;
137f02500c7SGreg Clayton
138117b1fa1SZachary Turner if (!m_opaque_ptr)
139d232abc3SJonas Devlieghere return sb_type_list;
140117b1fa1SZachary Turner
141f02500c7SGreg Clayton ModuleSP module_sp(m_opaque_ptr->GetModule());
142117b1fa1SZachary Turner if (!module_sp)
143d232abc3SJonas Devlieghere return sb_type_list;
144117b1fa1SZachary Turner
145465eae36SPavel Labath SymbolFile *symfile = module_sp->GetSymbolFile();
146465eae36SPavel Labath if (!symfile)
147d232abc3SJonas Devlieghere return sb_type_list;
148117b1fa1SZachary Turner
149117b1fa1SZachary Turner TypeClass type_class = static_cast<TypeClass>(type_mask);
150f02500c7SGreg Clayton TypeList type_list;
151465eae36SPavel Labath symfile->GetTypes(m_opaque_ptr, type_class, type_list);
152d5b44036SJonas Devlieghere sb_type_list.m_opaque_up->Append(type_list);
153d232abc3SJonas Devlieghere return sb_type_list;
154f02500c7SGreg Clayton }
155f02500c7SGreg Clayton
GetSupportFileAtIndex(uint32_t idx) const156b9c1b51eSKate Stone SBFileSpec SBCompileUnit::GetSupportFileAtIndex(uint32_t idx) const {
1571755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, idx);
158baf5664fSJonas Devlieghere
159873a7a4bSJohnny Chen SBFileSpec sb_file_spec;
160b9c1b51eSKate Stone if (m_opaque_ptr) {
161833dba01SPavel Labath FileSpec spec = m_opaque_ptr->GetSupportFiles().GetFileSpecAtIndex(idx);
162833dba01SPavel Labath sb_file_spec.SetFileSpec(spec);
163873a7a4bSJohnny Chen }
164873a7a4bSJohnny Chen
165d232abc3SJonas Devlieghere return sb_file_spec;
166873a7a4bSJohnny Chen }
167873a7a4bSJohnny Chen
FindSupportFileIndex(uint32_t start_idx,const SBFileSpec & sb_file,bool full)168b9c1b51eSKate Stone uint32_t SBCompileUnit::FindSupportFileIndex(uint32_t start_idx,
169b9c1b51eSKate Stone const SBFileSpec &sb_file,
170b9c1b51eSKate Stone bool full) {
1711755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, start_idx, 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
GetLanguage()180b9c1b51eSKate Stone lldb::LanguageType SBCompileUnit::GetLanguage() {
1811755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
182baf5664fSJonas Devlieghere
1836cd8e0c9SEnrico Granata if (m_opaque_ptr)
1846cd8e0c9SEnrico Granata return m_opaque_ptr->GetLanguage();
1856cd8e0c9SEnrico Granata return lldb::eLanguageTypeUnknown;
1866cd8e0c9SEnrico Granata }
1876cd8e0c9SEnrico Granata
IsValid() const188baf5664fSJonas Devlieghere bool SBCompileUnit::IsValid() const {
1891755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
1907f5237bcSPavel Labath return this->operator bool();
1917f5237bcSPavel Labath }
operator bool() const1927f5237bcSPavel Labath SBCompileUnit::operator bool() const {
1931755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
194baf5664fSJonas Devlieghere
195248a1305SKonrad Kleine return m_opaque_ptr != nullptr;
196baf5664fSJonas Devlieghere }
19730fdc8d8SChris Lattner
operator ==(const SBCompileUnit & rhs) const198b9c1b51eSKate Stone bool SBCompileUnit::operator==(const SBCompileUnit &rhs) const {
1991755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
200baf5664fSJonas Devlieghere
2016611103cSGreg Clayton return m_opaque_ptr == rhs.m_opaque_ptr;
20230fdc8d8SChris Lattner }
20330fdc8d8SChris Lattner
operator !=(const SBCompileUnit & rhs) const204b9c1b51eSKate Stone bool SBCompileUnit::operator!=(const SBCompileUnit &rhs) const {
2051755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
206baf5664fSJonas Devlieghere
2076611103cSGreg Clayton return m_opaque_ptr != rhs.m_opaque_ptr;
20830fdc8d8SChris Lattner }
20930fdc8d8SChris Lattner
operator ->() const210b9c1b51eSKate Stone const lldb_private::CompileUnit *SBCompileUnit::operator->() const {
2116611103cSGreg Clayton return m_opaque_ptr;
21230fdc8d8SChris Lattner }
21330fdc8d8SChris Lattner
operator *() const214b9c1b51eSKate Stone const lldb_private::CompileUnit &SBCompileUnit::operator*() const {
2156611103cSGreg Clayton return *m_opaque_ptr;
21630fdc8d8SChris Lattner }
217dde9cff3SCaroline Tice
get()218b9c1b51eSKate Stone lldb_private::CompileUnit *SBCompileUnit::get() { return m_opaque_ptr; }
21972eff18aSGreg Clayton
reset(lldb_private::CompileUnit * lldb_object_ptr)220b9c1b51eSKate Stone void SBCompileUnit::reset(lldb_private::CompileUnit *lldb_object_ptr) {
22172eff18aSGreg Clayton m_opaque_ptr = lldb_object_ptr;
22272eff18aSGreg Clayton }
22372eff18aSGreg Clayton
GetDescription(SBStream & description)224b9c1b51eSKate Stone bool SBCompileUnit::GetDescription(SBStream &description) {
2251755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, description);
226baf5664fSJonas Devlieghere
227da7bc7d0SGreg Clayton Stream &strm = description.ref();
228da7bc7d0SGreg Clayton
229b9c1b51eSKate Stone if (m_opaque_ptr) {
230da7bc7d0SGreg Clayton m_opaque_ptr->Dump(&strm, false);
231b9c1b51eSKate Stone } else
232da7bc7d0SGreg Clayton strm.PutCString("No value");
233dde9cff3SCaroline Tice
234dde9cff3SCaroline Tice return true;
235dde9cff3SCaroline Tice }
236