130fdc8d8SChris Lattner //===-- SBCompileUnit.cpp ---------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler 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" 16f02500c7SGreg Clayton #include "lldb/Symbol/SymbolVendor.h" 17f02500c7SGreg Clayton #include "lldb/Symbol/Type.h" 186f9e6901SZachary Turner #include "lldb/Utility/Log.h" 1930fdc8d8SChris Lattner 2030fdc8d8SChris Lattner using namespace lldb; 2130fdc8d8SChris Lattner using namespace lldb_private; 2230fdc8d8SChris Lattner 23b9c1b51eSKate Stone SBCompileUnit::SBCompileUnit() : m_opaque_ptr(NULL) {} 2430fdc8d8SChris Lattner 25b9c1b51eSKate Stone SBCompileUnit::SBCompileUnit(lldb_private::CompileUnit *lldb_object_ptr) 26b9c1b51eSKate Stone : m_opaque_ptr(lldb_object_ptr) {} 2730fdc8d8SChris Lattner 28b9c1b51eSKate Stone SBCompileUnit::SBCompileUnit(const SBCompileUnit &rhs) 29b9c1b51eSKate Stone : m_opaque_ptr(rhs.m_opaque_ptr) {} 3030fdc8d8SChris Lattner 31b9c1b51eSKate Stone const SBCompileUnit &SBCompileUnit::operator=(const SBCompileUnit &rhs) { 32efabb123SGreg Clayton m_opaque_ptr = rhs.m_opaque_ptr; 33efabb123SGreg Clayton return *this; 34efabb123SGreg Clayton } 35efabb123SGreg Clayton 36b9c1b51eSKate Stone SBCompileUnit::~SBCompileUnit() { m_opaque_ptr = NULL; } 37efabb123SGreg Clayton 38b9c1b51eSKate Stone SBFileSpec SBCompileUnit::GetFileSpec() const { 3930fdc8d8SChris Lattner SBFileSpec file_spec; 406611103cSGreg Clayton if (m_opaque_ptr) 416611103cSGreg Clayton file_spec.SetFileSpec(*m_opaque_ptr); 4230fdc8d8SChris Lattner return file_spec; 4330fdc8d8SChris Lattner } 4430fdc8d8SChris Lattner 45b9c1b51eSKate Stone uint32_t SBCompileUnit::GetNumLineEntries() const { 46b9c1b51eSKate Stone if (m_opaque_ptr) { 476611103cSGreg Clayton LineTable *line_table = m_opaque_ptr->GetLineTable(); 4830fdc8d8SChris Lattner if (line_table) 4930fdc8d8SChris Lattner return line_table->GetSize(); 5030fdc8d8SChris Lattner } 5130fdc8d8SChris Lattner return 0; 5230fdc8d8SChris Lattner } 5330fdc8d8SChris Lattner 54b9c1b51eSKate Stone SBLineEntry SBCompileUnit::GetLineEntryAtIndex(uint32_t idx) const { 555160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 56ceb6b139SCaroline Tice 5730fdc8d8SChris Lattner SBLineEntry sb_line_entry; 58b9c1b51eSKate Stone if (m_opaque_ptr) { 596611103cSGreg Clayton LineTable *line_table = m_opaque_ptr->GetLineTable(); 60b9c1b51eSKate Stone if (line_table) { 6130fdc8d8SChris Lattner LineEntry line_entry; 6230fdc8d8SChris Lattner if (line_table->GetLineEntryAtIndex(idx, line_entry)) 6330fdc8d8SChris Lattner sb_line_entry.SetLineEntry(line_entry); 6430fdc8d8SChris Lattner } 6530fdc8d8SChris Lattner } 66ceb6b139SCaroline Tice 67b9c1b51eSKate Stone if (log) { 68ceb6b139SCaroline Tice SBStream sstr; 69ceb6b139SCaroline Tice sb_line_entry.GetDescription(sstr); 70b9c1b51eSKate Stone log->Printf("SBCompileUnit(%p)::GetLineEntryAtIndex (idx=%u) => " 71b9c1b51eSKate Stone "SBLineEntry(%p): '%s'", 72324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ptr), idx, 73324a1036SSaleem Abdulrasool static_cast<void *>(sb_line_entry.get()), sstr.GetData()); 74ceb6b139SCaroline Tice } 75ceb6b139SCaroline Tice 7630fdc8d8SChris Lattner return sb_line_entry; 7730fdc8d8SChris Lattner } 7830fdc8d8SChris Lattner 79b9c1b51eSKate Stone uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line, 80b9c1b51eSKate Stone SBFileSpec *inline_file_spec) const { 8187df91b8SJim Ingham const bool exact = true; 8287df91b8SJim Ingham return FindLineEntryIndex(start_idx, line, inline_file_spec, exact); 8387df91b8SJim Ingham } 8487df91b8SJim Ingham 85b9c1b51eSKate Stone uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line, 86b9c1b51eSKate Stone SBFileSpec *inline_file_spec, 87b9c1b51eSKate Stone bool exact) const { 885160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 89ceb6b139SCaroline Tice 90cfd1acedSGreg Clayton uint32_t index = UINT32_MAX; 91b9c1b51eSKate Stone if (m_opaque_ptr) { 9230fdc8d8SChris Lattner FileSpec file_spec; 9330fdc8d8SChris Lattner if (inline_file_spec && inline_file_spec->IsValid()) 9430fdc8d8SChris Lattner file_spec = inline_file_spec->ref(); 9530fdc8d8SChris Lattner else 966611103cSGreg Clayton file_spec = *m_opaque_ptr; 9730fdc8d8SChris Lattner 98b9c1b51eSKate Stone index = m_opaque_ptr->FindLineEntry( 99b9c1b51eSKate Stone start_idx, line, inline_file_spec ? inline_file_spec->get() : NULL, 100b9c1b51eSKate Stone exact, NULL); 10130fdc8d8SChris Lattner } 102ceb6b139SCaroline Tice 103b9c1b51eSKate Stone if (log) { 104750cd175SCaroline Tice SBStream sstr; 105b9c1b51eSKate Stone if (index == UINT32_MAX) { 106b9c1b51eSKate Stone log->Printf("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, " 107b9c1b51eSKate Stone "line=%u, SBFileSpec(%p)) => NOT FOUND", 108324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ptr), start_idx, line, 109324a1036SSaleem Abdulrasool inline_file_spec 110324a1036SSaleem Abdulrasool ? static_cast<const void *>(inline_file_spec->get()) 111324a1036SSaleem Abdulrasool : NULL); 112b9c1b51eSKate Stone } else { 113b9c1b51eSKate Stone log->Printf("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, " 114b9c1b51eSKate Stone "line=%u, SBFileSpec(%p)) => %u", 115324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ptr), start_idx, line, 116324a1036SSaleem Abdulrasool inline_file_spec 117324a1036SSaleem Abdulrasool ? static_cast<const void *>(inline_file_spec->get()) 118324a1036SSaleem Abdulrasool : NULL, 119324a1036SSaleem Abdulrasool index); 120cfd1acedSGreg Clayton } 121750cd175SCaroline Tice } 122ceb6b139SCaroline Tice 123cfd1acedSGreg Clayton return index; 12430fdc8d8SChris Lattner } 12530fdc8d8SChris Lattner 126b9c1b51eSKate Stone uint32_t SBCompileUnit::GetNumSupportFiles() const { 127b9c1b51eSKate Stone if (m_opaque_ptr) { 128873a7a4bSJohnny Chen FileSpecList &support_files = m_opaque_ptr->GetSupportFiles(); 129873a7a4bSJohnny Chen return support_files.GetSize(); 130873a7a4bSJohnny Chen } 131873a7a4bSJohnny Chen return 0; 132873a7a4bSJohnny Chen } 133873a7a4bSJohnny Chen 134b9c1b51eSKate Stone lldb::SBTypeList SBCompileUnit::GetTypes(uint32_t type_mask) { 135f02500c7SGreg Clayton SBTypeList sb_type_list; 136f02500c7SGreg Clayton 137117b1fa1SZachary Turner if (!m_opaque_ptr) 138117b1fa1SZachary Turner return sb_type_list; 139117b1fa1SZachary Turner 140f02500c7SGreg Clayton ModuleSP module_sp(m_opaque_ptr->GetModule()); 141117b1fa1SZachary Turner if (!module_sp) 142117b1fa1SZachary Turner return sb_type_list; 143117b1fa1SZachary Turner 144f02500c7SGreg Clayton SymbolVendor *vendor = module_sp->GetSymbolVendor(); 145117b1fa1SZachary Turner if (!vendor) 146117b1fa1SZachary Turner return sb_type_list; 147117b1fa1SZachary Turner 148117b1fa1SZachary Turner TypeClass type_class = static_cast<TypeClass>(type_mask); 149f02500c7SGreg Clayton TypeList type_list; 150117b1fa1SZachary Turner vendor->GetTypes(m_opaque_ptr, type_class, type_list); 151f02500c7SGreg Clayton sb_type_list.m_opaque_ap->Append(type_list); 152f02500c7SGreg Clayton return sb_type_list; 153f02500c7SGreg Clayton } 154f02500c7SGreg Clayton 155b9c1b51eSKate Stone SBFileSpec SBCompileUnit::GetSupportFileAtIndex(uint32_t idx) const { 1565160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 157873a7a4bSJohnny Chen 158873a7a4bSJohnny Chen SBFileSpec sb_file_spec; 159b9c1b51eSKate Stone if (m_opaque_ptr) { 160873a7a4bSJohnny Chen FileSpecList &support_files = m_opaque_ptr->GetSupportFiles(); 161873a7a4bSJohnny Chen FileSpec file_spec = support_files.GetFileSpecAtIndex(idx); 162873a7a4bSJohnny Chen sb_file_spec.SetFileSpec(file_spec); 163873a7a4bSJohnny Chen } 164873a7a4bSJohnny Chen 165b9c1b51eSKate Stone if (log) { 166873a7a4bSJohnny Chen SBStream sstr; 167873a7a4bSJohnny Chen sb_file_spec.GetDescription(sstr); 168b9c1b51eSKate Stone log->Printf("SBCompileUnit(%p)::GetGetFileSpecAtIndex (idx=%u) => " 169b9c1b51eSKate Stone "SBFileSpec(%p): '%s'", 170324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ptr), idx, 171b9c1b51eSKate Stone static_cast<const void *>(sb_file_spec.get()), sstr.GetData()); 172873a7a4bSJohnny Chen } 173873a7a4bSJohnny Chen 174873a7a4bSJohnny Chen return sb_file_spec; 175873a7a4bSJohnny Chen } 176873a7a4bSJohnny Chen 177b9c1b51eSKate Stone uint32_t SBCompileUnit::FindSupportFileIndex(uint32_t start_idx, 178b9c1b51eSKate Stone const SBFileSpec &sb_file, 179b9c1b51eSKate Stone bool full) { 180b9c1b51eSKate Stone if (m_opaque_ptr) { 181873a7a4bSJohnny Chen FileSpecList &support_files = m_opaque_ptr->GetSupportFiles(); 182873a7a4bSJohnny Chen return support_files.FindFileIndex(start_idx, sb_file.ref(), full); 183873a7a4bSJohnny Chen } 184873a7a4bSJohnny Chen return 0; 185873a7a4bSJohnny Chen } 186873a7a4bSJohnny Chen 187b9c1b51eSKate Stone lldb::LanguageType SBCompileUnit::GetLanguage() { 1886cd8e0c9SEnrico Granata if (m_opaque_ptr) 1896cd8e0c9SEnrico Granata return m_opaque_ptr->GetLanguage(); 1906cd8e0c9SEnrico Granata return lldb::eLanguageTypeUnknown; 1916cd8e0c9SEnrico Granata } 1926cd8e0c9SEnrico Granata 193b9c1b51eSKate Stone bool SBCompileUnit::IsValid() const { return m_opaque_ptr != NULL; } 19430fdc8d8SChris Lattner 195b9c1b51eSKate Stone bool SBCompileUnit::operator==(const SBCompileUnit &rhs) const { 1966611103cSGreg Clayton return m_opaque_ptr == rhs.m_opaque_ptr; 19730fdc8d8SChris Lattner } 19830fdc8d8SChris Lattner 199b9c1b51eSKate Stone bool SBCompileUnit::operator!=(const SBCompileUnit &rhs) const { 2006611103cSGreg Clayton return m_opaque_ptr != rhs.m_opaque_ptr; 20130fdc8d8SChris Lattner } 20230fdc8d8SChris Lattner 203b9c1b51eSKate Stone const lldb_private::CompileUnit *SBCompileUnit::operator->() const { 2046611103cSGreg Clayton return m_opaque_ptr; 20530fdc8d8SChris Lattner } 20630fdc8d8SChris Lattner 207b9c1b51eSKate Stone const lldb_private::CompileUnit &SBCompileUnit::operator*() const { 2086611103cSGreg Clayton return *m_opaque_ptr; 20930fdc8d8SChris Lattner } 210dde9cff3SCaroline Tice 211b9c1b51eSKate Stone lldb_private::CompileUnit *SBCompileUnit::get() { return m_opaque_ptr; } 21272eff18aSGreg Clayton 213b9c1b51eSKate Stone void SBCompileUnit::reset(lldb_private::CompileUnit *lldb_object_ptr) { 21472eff18aSGreg Clayton m_opaque_ptr = lldb_object_ptr; 21572eff18aSGreg Clayton } 21672eff18aSGreg Clayton 217b9c1b51eSKate Stone bool SBCompileUnit::GetDescription(SBStream &description) { 218da7bc7d0SGreg Clayton Stream &strm = description.ref(); 219da7bc7d0SGreg Clayton 220b9c1b51eSKate Stone if (m_opaque_ptr) { 221da7bc7d0SGreg Clayton m_opaque_ptr->Dump(&strm, false); 222b9c1b51eSKate Stone } else 223da7bc7d0SGreg Clayton strm.PutCString("No value"); 224dde9cff3SCaroline Tice 225dde9cff3SCaroline Tice return true; 226dde9cff3SCaroline Tice } 227