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" 196f9e6901SZachary Turner #include "lldb/Utility/Log.h" 2030fdc8d8SChris Lattner 2130fdc8d8SChris Lattner using namespace lldb; 2230fdc8d8SChris Lattner using namespace lldb_private; 2330fdc8d8SChris Lattner 24baf5664fSJonas Devlieghere SBCompileUnit::SBCompileUnit() : m_opaque_ptr(NULL) { 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; 42efabb123SGreg Clayton return *this; 43efabb123SGreg Clayton } 44efabb123SGreg Clayton 45b9c1b51eSKate Stone SBCompileUnit::~SBCompileUnit() { m_opaque_ptr = NULL; } 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) 536611103cSGreg Clayton file_spec.SetFileSpec(*m_opaque_ptr); 54baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(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 60*b459f182SJason Molenda Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 61b9c1b51eSKate Stone if (m_opaque_ptr) { 626611103cSGreg Clayton LineTable *line_table = m_opaque_ptr->GetLineTable(); 63*b459f182SJason Molenda if (line_table) { 64*b459f182SJason Molenda if (log) 65*b459f182SJason Molenda log->Printf("SBCompileUnit(%p)::GetNumLineEntries() => %d", 66*b459f182SJason Molenda static_cast<void *>(m_opaque_ptr), 67*b459f182SJason Molenda (int)line_table->GetSize()); 6830fdc8d8SChris Lattner return line_table->GetSize(); 6930fdc8d8SChris Lattner } 70*b459f182SJason Molenda } 7130fdc8d8SChris Lattner return 0; 7230fdc8d8SChris Lattner } 7330fdc8d8SChris Lattner 74b9c1b51eSKate Stone SBLineEntry SBCompileUnit::GetLineEntryAtIndex(uint32_t idx) const { 75baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBLineEntry, SBCompileUnit, 76baf5664fSJonas Devlieghere GetLineEntryAtIndex, (uint32_t), idx); 77baf5664fSJonas Devlieghere 785160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 79ceb6b139SCaroline Tice 8030fdc8d8SChris Lattner SBLineEntry sb_line_entry; 81b9c1b51eSKate Stone if (m_opaque_ptr) { 826611103cSGreg Clayton LineTable *line_table = m_opaque_ptr->GetLineTable(); 83b9c1b51eSKate Stone if (line_table) { 8430fdc8d8SChris Lattner LineEntry line_entry; 8530fdc8d8SChris Lattner if (line_table->GetLineEntryAtIndex(idx, line_entry)) 8630fdc8d8SChris Lattner sb_line_entry.SetLineEntry(line_entry); 8730fdc8d8SChris Lattner } 8830fdc8d8SChris Lattner } 89ceb6b139SCaroline Tice 90b9c1b51eSKate Stone if (log) { 91ceb6b139SCaroline Tice SBStream sstr; 92ceb6b139SCaroline Tice sb_line_entry.GetDescription(sstr); 93b9c1b51eSKate Stone log->Printf("SBCompileUnit(%p)::GetLineEntryAtIndex (idx=%u) => " 94b9c1b51eSKate Stone "SBLineEntry(%p): '%s'", 95324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ptr), idx, 96324a1036SSaleem Abdulrasool static_cast<void *>(sb_line_entry.get()), sstr.GetData()); 97ceb6b139SCaroline Tice } 98ceb6b139SCaroline Tice 99baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_line_entry); 10030fdc8d8SChris Lattner } 10130fdc8d8SChris Lattner 102b9c1b51eSKate Stone uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line, 103b9c1b51eSKate Stone SBFileSpec *inline_file_spec) const { 104baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(uint32_t, SBCompileUnit, FindLineEntryIndex, 105baf5664fSJonas Devlieghere (uint32_t, uint32_t, lldb::SBFileSpec *), start_idx, 106baf5664fSJonas Devlieghere line, inline_file_spec); 107baf5664fSJonas Devlieghere 10887df91b8SJim Ingham const bool exact = true; 10987df91b8SJim Ingham return FindLineEntryIndex(start_idx, line, inline_file_spec, exact); 11087df91b8SJim Ingham } 11187df91b8SJim Ingham 112b9c1b51eSKate Stone uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line, 113b9c1b51eSKate Stone SBFileSpec *inline_file_spec, 114b9c1b51eSKate Stone bool exact) const { 115baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(uint32_t, SBCompileUnit, FindLineEntryIndex, 116baf5664fSJonas Devlieghere (uint32_t, uint32_t, lldb::SBFileSpec *, bool), 117baf5664fSJonas Devlieghere start_idx, line, inline_file_spec, exact); 118baf5664fSJonas Devlieghere 1195160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 120ceb6b139SCaroline Tice 121cfd1acedSGreg Clayton uint32_t index = UINT32_MAX; 122b9c1b51eSKate Stone if (m_opaque_ptr) { 12330fdc8d8SChris Lattner FileSpec file_spec; 12430fdc8d8SChris Lattner if (inline_file_spec && inline_file_spec->IsValid()) 12530fdc8d8SChris Lattner file_spec = inline_file_spec->ref(); 12630fdc8d8SChris Lattner else 1276611103cSGreg Clayton file_spec = *m_opaque_ptr; 12830fdc8d8SChris Lattner 129b9c1b51eSKate Stone index = m_opaque_ptr->FindLineEntry( 130b9c1b51eSKate Stone start_idx, line, inline_file_spec ? inline_file_spec->get() : NULL, 131b9c1b51eSKate Stone exact, NULL); 13230fdc8d8SChris Lattner } 133ceb6b139SCaroline Tice 134b9c1b51eSKate Stone if (log) { 135750cd175SCaroline Tice SBStream sstr; 136b9c1b51eSKate Stone if (index == UINT32_MAX) { 137b9c1b51eSKate Stone log->Printf("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, " 138b9c1b51eSKate Stone "line=%u, SBFileSpec(%p)) => NOT FOUND", 139324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ptr), start_idx, line, 140324a1036SSaleem Abdulrasool inline_file_spec 141324a1036SSaleem Abdulrasool ? static_cast<const void *>(inline_file_spec->get()) 142324a1036SSaleem Abdulrasool : NULL); 143b9c1b51eSKate Stone } else { 144b9c1b51eSKate Stone log->Printf("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, " 145b9c1b51eSKate Stone "line=%u, SBFileSpec(%p)) => %u", 146324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ptr), start_idx, line, 147324a1036SSaleem Abdulrasool inline_file_spec 148324a1036SSaleem Abdulrasool ? static_cast<const void *>(inline_file_spec->get()) 149324a1036SSaleem Abdulrasool : NULL, 150324a1036SSaleem Abdulrasool index); 151cfd1acedSGreg Clayton } 152750cd175SCaroline Tice } 153ceb6b139SCaroline Tice 154cfd1acedSGreg Clayton return index; 15530fdc8d8SChris Lattner } 15630fdc8d8SChris Lattner 157b9c1b51eSKate Stone uint32_t SBCompileUnit::GetNumSupportFiles() const { 158baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBCompileUnit, GetNumSupportFiles); 159baf5664fSJonas Devlieghere 160b9c1b51eSKate Stone if (m_opaque_ptr) { 161873a7a4bSJohnny Chen FileSpecList &support_files = m_opaque_ptr->GetSupportFiles(); 162873a7a4bSJohnny Chen return support_files.GetSize(); 163873a7a4bSJohnny Chen } 164873a7a4bSJohnny Chen return 0; 165873a7a4bSJohnny Chen } 166873a7a4bSJohnny Chen 167b9c1b51eSKate Stone lldb::SBTypeList SBCompileUnit::GetTypes(uint32_t type_mask) { 168baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTypeList, SBCompileUnit, GetTypes, (uint32_t), 169baf5664fSJonas Devlieghere type_mask); 170baf5664fSJonas Devlieghere 171f02500c7SGreg Clayton SBTypeList sb_type_list; 172f02500c7SGreg Clayton 173117b1fa1SZachary Turner if (!m_opaque_ptr) 174baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_type_list); 175117b1fa1SZachary Turner 176f02500c7SGreg Clayton ModuleSP module_sp(m_opaque_ptr->GetModule()); 177117b1fa1SZachary Turner if (!module_sp) 178baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_type_list); 179117b1fa1SZachary Turner 180f02500c7SGreg Clayton SymbolVendor *vendor = module_sp->GetSymbolVendor(); 181117b1fa1SZachary Turner if (!vendor) 182baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_type_list); 183117b1fa1SZachary Turner 184117b1fa1SZachary Turner TypeClass type_class = static_cast<TypeClass>(type_mask); 185f02500c7SGreg Clayton TypeList type_list; 186117b1fa1SZachary Turner vendor->GetTypes(m_opaque_ptr, type_class, type_list); 187d5b44036SJonas Devlieghere sb_type_list.m_opaque_up->Append(type_list); 188baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_type_list); 189f02500c7SGreg Clayton } 190f02500c7SGreg Clayton 191b9c1b51eSKate Stone SBFileSpec SBCompileUnit::GetSupportFileAtIndex(uint32_t idx) const { 192baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(lldb::SBFileSpec, SBCompileUnit, 193baf5664fSJonas Devlieghere GetSupportFileAtIndex, (uint32_t), idx); 194baf5664fSJonas Devlieghere 1955160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 196873a7a4bSJohnny Chen 197873a7a4bSJohnny Chen SBFileSpec sb_file_spec; 198b9c1b51eSKate Stone if (m_opaque_ptr) { 199873a7a4bSJohnny Chen FileSpecList &support_files = m_opaque_ptr->GetSupportFiles(); 200873a7a4bSJohnny Chen FileSpec file_spec = support_files.GetFileSpecAtIndex(idx); 201873a7a4bSJohnny Chen sb_file_spec.SetFileSpec(file_spec); 202873a7a4bSJohnny Chen } 203873a7a4bSJohnny Chen 204b9c1b51eSKate Stone if (log) { 205873a7a4bSJohnny Chen SBStream sstr; 206873a7a4bSJohnny Chen sb_file_spec.GetDescription(sstr); 207b9c1b51eSKate Stone log->Printf("SBCompileUnit(%p)::GetGetFileSpecAtIndex (idx=%u) => " 208b9c1b51eSKate Stone "SBFileSpec(%p): '%s'", 209324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ptr), idx, 210b9c1b51eSKate Stone static_cast<const void *>(sb_file_spec.get()), sstr.GetData()); 211873a7a4bSJohnny Chen } 212873a7a4bSJohnny Chen 213baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_file_spec); 214873a7a4bSJohnny Chen } 215873a7a4bSJohnny Chen 216b9c1b51eSKate Stone uint32_t SBCompileUnit::FindSupportFileIndex(uint32_t start_idx, 217b9c1b51eSKate Stone const SBFileSpec &sb_file, 218b9c1b51eSKate Stone bool full) { 219baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(uint32_t, SBCompileUnit, FindSupportFileIndex, 220baf5664fSJonas Devlieghere (uint32_t, const lldb::SBFileSpec &, bool), start_idx, 221baf5664fSJonas Devlieghere sb_file, full); 222baf5664fSJonas Devlieghere 223b9c1b51eSKate Stone if (m_opaque_ptr) { 224873a7a4bSJohnny Chen FileSpecList &support_files = m_opaque_ptr->GetSupportFiles(); 225873a7a4bSJohnny Chen return support_files.FindFileIndex(start_idx, sb_file.ref(), full); 226873a7a4bSJohnny Chen } 227873a7a4bSJohnny Chen return 0; 228873a7a4bSJohnny Chen } 229873a7a4bSJohnny Chen 230b9c1b51eSKate Stone lldb::LanguageType SBCompileUnit::GetLanguage() { 231baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::LanguageType, SBCompileUnit, GetLanguage); 232baf5664fSJonas Devlieghere 2336cd8e0c9SEnrico Granata if (m_opaque_ptr) 2346cd8e0c9SEnrico Granata return m_opaque_ptr->GetLanguage(); 2356cd8e0c9SEnrico Granata return lldb::eLanguageTypeUnknown; 2366cd8e0c9SEnrico Granata } 2376cd8e0c9SEnrico Granata 238baf5664fSJonas Devlieghere bool SBCompileUnit::IsValid() const { 239baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBCompileUnit, IsValid); 240baf5664fSJonas Devlieghere 241baf5664fSJonas Devlieghere return m_opaque_ptr != NULL; 242baf5664fSJonas Devlieghere } 24330fdc8d8SChris Lattner 244b9c1b51eSKate Stone bool SBCompileUnit::operator==(const SBCompileUnit &rhs) const { 245baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST( 246baf5664fSJonas Devlieghere bool, SBCompileUnit, operator==,(const lldb::SBCompileUnit &), rhs); 247baf5664fSJonas Devlieghere 2486611103cSGreg Clayton return m_opaque_ptr == rhs.m_opaque_ptr; 24930fdc8d8SChris Lattner } 25030fdc8d8SChris Lattner 251b9c1b51eSKate Stone bool SBCompileUnit::operator!=(const SBCompileUnit &rhs) const { 252baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST( 253baf5664fSJonas Devlieghere bool, SBCompileUnit, operator!=,(const lldb::SBCompileUnit &), rhs); 254baf5664fSJonas Devlieghere 2556611103cSGreg Clayton return m_opaque_ptr != rhs.m_opaque_ptr; 25630fdc8d8SChris Lattner } 25730fdc8d8SChris Lattner 258b9c1b51eSKate Stone const lldb_private::CompileUnit *SBCompileUnit::operator->() const { 2596611103cSGreg Clayton return m_opaque_ptr; 26030fdc8d8SChris Lattner } 26130fdc8d8SChris Lattner 262b9c1b51eSKate Stone const lldb_private::CompileUnit &SBCompileUnit::operator*() const { 2636611103cSGreg Clayton return *m_opaque_ptr; 26430fdc8d8SChris Lattner } 265dde9cff3SCaroline Tice 266b9c1b51eSKate Stone lldb_private::CompileUnit *SBCompileUnit::get() { return m_opaque_ptr; } 26772eff18aSGreg Clayton 268b9c1b51eSKate Stone void SBCompileUnit::reset(lldb_private::CompileUnit *lldb_object_ptr) { 26972eff18aSGreg Clayton m_opaque_ptr = lldb_object_ptr; 27072eff18aSGreg Clayton } 27172eff18aSGreg Clayton 272b9c1b51eSKate Stone bool SBCompileUnit::GetDescription(SBStream &description) { 273baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBCompileUnit, GetDescription, (lldb::SBStream &), 274baf5664fSJonas Devlieghere description); 275baf5664fSJonas Devlieghere 276da7bc7d0SGreg Clayton Stream &strm = description.ref(); 277da7bc7d0SGreg Clayton 278b9c1b51eSKate Stone if (m_opaque_ptr) { 279da7bc7d0SGreg Clayton m_opaque_ptr->Dump(&strm, false); 280b9c1b51eSKate Stone } else 281da7bc7d0SGreg Clayton strm.PutCString("No value"); 282dde9cff3SCaroline Tice 283dde9cff3SCaroline Tice return true; 284dde9cff3SCaroline Tice } 285