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