130fdc8d8SChris Lattner //===-- SBCompileUnit.cpp ---------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 1030fdc8d8SChris Lattner #include "lldb/API/SBCompileUnit.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" 19*6f9e6901SZachary Turner #include "lldb/Utility/Log.h" 2030fdc8d8SChris Lattner 2130fdc8d8SChris Lattner using namespace lldb; 2230fdc8d8SChris Lattner using namespace lldb_private; 2330fdc8d8SChris Lattner 24b9c1b51eSKate Stone SBCompileUnit::SBCompileUnit() : m_opaque_ptr(NULL) {} 2530fdc8d8SChris Lattner 26b9c1b51eSKate Stone SBCompileUnit::SBCompileUnit(lldb_private::CompileUnit *lldb_object_ptr) 27b9c1b51eSKate Stone : m_opaque_ptr(lldb_object_ptr) {} 2830fdc8d8SChris Lattner 29b9c1b51eSKate Stone SBCompileUnit::SBCompileUnit(const SBCompileUnit &rhs) 30b9c1b51eSKate Stone : m_opaque_ptr(rhs.m_opaque_ptr) {} 3130fdc8d8SChris Lattner 32b9c1b51eSKate Stone const SBCompileUnit &SBCompileUnit::operator=(const SBCompileUnit &rhs) { 33efabb123SGreg Clayton m_opaque_ptr = rhs.m_opaque_ptr; 34efabb123SGreg Clayton return *this; 35efabb123SGreg Clayton } 36efabb123SGreg Clayton 37b9c1b51eSKate Stone SBCompileUnit::~SBCompileUnit() { m_opaque_ptr = NULL; } 38efabb123SGreg Clayton 39b9c1b51eSKate Stone SBFileSpec SBCompileUnit::GetFileSpec() const { 4030fdc8d8SChris Lattner SBFileSpec file_spec; 416611103cSGreg Clayton if (m_opaque_ptr) 426611103cSGreg Clayton file_spec.SetFileSpec(*m_opaque_ptr); 4330fdc8d8SChris Lattner return file_spec; 4430fdc8d8SChris Lattner } 4530fdc8d8SChris Lattner 46b9c1b51eSKate Stone uint32_t SBCompileUnit::GetNumLineEntries() const { 47b9c1b51eSKate Stone if (m_opaque_ptr) { 486611103cSGreg Clayton LineTable *line_table = m_opaque_ptr->GetLineTable(); 4930fdc8d8SChris Lattner if (line_table) 5030fdc8d8SChris Lattner return line_table->GetSize(); 5130fdc8d8SChris Lattner } 5230fdc8d8SChris Lattner return 0; 5330fdc8d8SChris Lattner } 5430fdc8d8SChris Lattner 55b9c1b51eSKate Stone SBLineEntry SBCompileUnit::GetLineEntryAtIndex(uint32_t idx) const { 565160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 57ceb6b139SCaroline Tice 5830fdc8d8SChris Lattner SBLineEntry sb_line_entry; 59b9c1b51eSKate Stone if (m_opaque_ptr) { 606611103cSGreg Clayton LineTable *line_table = m_opaque_ptr->GetLineTable(); 61b9c1b51eSKate Stone if (line_table) { 6230fdc8d8SChris Lattner LineEntry line_entry; 6330fdc8d8SChris Lattner if (line_table->GetLineEntryAtIndex(idx, line_entry)) 6430fdc8d8SChris Lattner sb_line_entry.SetLineEntry(line_entry); 6530fdc8d8SChris Lattner } 6630fdc8d8SChris Lattner } 67ceb6b139SCaroline Tice 68b9c1b51eSKate Stone if (log) { 69ceb6b139SCaroline Tice SBStream sstr; 70ceb6b139SCaroline Tice sb_line_entry.GetDescription(sstr); 71b9c1b51eSKate Stone log->Printf("SBCompileUnit(%p)::GetLineEntryAtIndex (idx=%u) => " 72b9c1b51eSKate Stone "SBLineEntry(%p): '%s'", 73324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ptr), idx, 74324a1036SSaleem Abdulrasool static_cast<void *>(sb_line_entry.get()), sstr.GetData()); 75ceb6b139SCaroline Tice } 76ceb6b139SCaroline Tice 7730fdc8d8SChris Lattner return sb_line_entry; 7830fdc8d8SChris Lattner } 7930fdc8d8SChris Lattner 80b9c1b51eSKate Stone uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line, 81b9c1b51eSKate Stone SBFileSpec *inline_file_spec) const { 8287df91b8SJim Ingham const bool exact = true; 8387df91b8SJim Ingham return FindLineEntryIndex(start_idx, line, inline_file_spec, exact); 8487df91b8SJim Ingham } 8587df91b8SJim Ingham 86b9c1b51eSKate Stone uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line, 87b9c1b51eSKate Stone SBFileSpec *inline_file_spec, 88b9c1b51eSKate Stone bool exact) const { 895160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 90ceb6b139SCaroline Tice 91cfd1acedSGreg Clayton uint32_t index = UINT32_MAX; 92b9c1b51eSKate Stone if (m_opaque_ptr) { 9330fdc8d8SChris Lattner FileSpec file_spec; 9430fdc8d8SChris Lattner if (inline_file_spec && inline_file_spec->IsValid()) 9530fdc8d8SChris Lattner file_spec = inline_file_spec->ref(); 9630fdc8d8SChris Lattner else 976611103cSGreg Clayton file_spec = *m_opaque_ptr; 9830fdc8d8SChris Lattner 99b9c1b51eSKate Stone index = m_opaque_ptr->FindLineEntry( 100b9c1b51eSKate Stone start_idx, line, inline_file_spec ? inline_file_spec->get() : NULL, 101b9c1b51eSKate Stone exact, NULL); 10230fdc8d8SChris Lattner } 103ceb6b139SCaroline Tice 104b9c1b51eSKate Stone if (log) { 105750cd175SCaroline Tice SBStream sstr; 106b9c1b51eSKate Stone if (index == UINT32_MAX) { 107b9c1b51eSKate Stone log->Printf("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, " 108b9c1b51eSKate Stone "line=%u, SBFileSpec(%p)) => NOT FOUND", 109324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ptr), start_idx, line, 110324a1036SSaleem Abdulrasool inline_file_spec 111324a1036SSaleem Abdulrasool ? static_cast<const void *>(inline_file_spec->get()) 112324a1036SSaleem Abdulrasool : NULL); 113b9c1b51eSKate Stone } else { 114b9c1b51eSKate Stone log->Printf("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, " 115b9c1b51eSKate Stone "line=%u, SBFileSpec(%p)) => %u", 116324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ptr), start_idx, line, 117324a1036SSaleem Abdulrasool inline_file_spec 118324a1036SSaleem Abdulrasool ? static_cast<const void *>(inline_file_spec->get()) 119324a1036SSaleem Abdulrasool : NULL, 120324a1036SSaleem Abdulrasool index); 121cfd1acedSGreg Clayton } 122750cd175SCaroline Tice } 123ceb6b139SCaroline Tice 124cfd1acedSGreg Clayton return index; 12530fdc8d8SChris Lattner } 12630fdc8d8SChris Lattner 127b9c1b51eSKate Stone uint32_t SBCompileUnit::GetNumSupportFiles() const { 128b9c1b51eSKate Stone if (m_opaque_ptr) { 129873a7a4bSJohnny Chen FileSpecList &support_files = m_opaque_ptr->GetSupportFiles(); 130873a7a4bSJohnny Chen return support_files.GetSize(); 131873a7a4bSJohnny Chen } 132873a7a4bSJohnny Chen return 0; 133873a7a4bSJohnny Chen } 134873a7a4bSJohnny Chen 135b9c1b51eSKate Stone lldb::SBTypeList SBCompileUnit::GetTypes(uint32_t type_mask) { 136f02500c7SGreg Clayton SBTypeList sb_type_list; 137f02500c7SGreg Clayton 138b9c1b51eSKate Stone if (m_opaque_ptr) { 139f02500c7SGreg Clayton ModuleSP module_sp(m_opaque_ptr->GetModule()); 140b9c1b51eSKate Stone if (module_sp) { 141f02500c7SGreg Clayton SymbolVendor *vendor = module_sp->GetSymbolVendor(); 142b9c1b51eSKate Stone if (vendor) { 143f02500c7SGreg Clayton TypeList type_list; 144f02500c7SGreg Clayton vendor->GetTypes(m_opaque_ptr, type_mask, type_list); 145f02500c7SGreg Clayton sb_type_list.m_opaque_ap->Append(type_list); 146f02500c7SGreg Clayton } 147f02500c7SGreg Clayton } 148f02500c7SGreg Clayton } 149f02500c7SGreg Clayton return sb_type_list; 150f02500c7SGreg Clayton } 151f02500c7SGreg Clayton 152b9c1b51eSKate Stone SBFileSpec SBCompileUnit::GetSupportFileAtIndex(uint32_t idx) const { 1535160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 154873a7a4bSJohnny Chen 155873a7a4bSJohnny Chen SBFileSpec sb_file_spec; 156b9c1b51eSKate Stone if (m_opaque_ptr) { 157873a7a4bSJohnny Chen FileSpecList &support_files = m_opaque_ptr->GetSupportFiles(); 158873a7a4bSJohnny Chen FileSpec file_spec = support_files.GetFileSpecAtIndex(idx); 159873a7a4bSJohnny Chen sb_file_spec.SetFileSpec(file_spec); 160873a7a4bSJohnny Chen } 161873a7a4bSJohnny Chen 162b9c1b51eSKate Stone if (log) { 163873a7a4bSJohnny Chen SBStream sstr; 164873a7a4bSJohnny Chen sb_file_spec.GetDescription(sstr); 165b9c1b51eSKate Stone log->Printf("SBCompileUnit(%p)::GetGetFileSpecAtIndex (idx=%u) => " 166b9c1b51eSKate Stone "SBFileSpec(%p): '%s'", 167324a1036SSaleem Abdulrasool static_cast<void *>(m_opaque_ptr), idx, 168b9c1b51eSKate Stone static_cast<const void *>(sb_file_spec.get()), sstr.GetData()); 169873a7a4bSJohnny Chen } 170873a7a4bSJohnny Chen 171873a7a4bSJohnny Chen return sb_file_spec; 172873a7a4bSJohnny Chen } 173873a7a4bSJohnny Chen 174b9c1b51eSKate Stone uint32_t SBCompileUnit::FindSupportFileIndex(uint32_t start_idx, 175b9c1b51eSKate Stone const SBFileSpec &sb_file, 176b9c1b51eSKate Stone bool full) { 177b9c1b51eSKate Stone if (m_opaque_ptr) { 178873a7a4bSJohnny Chen FileSpecList &support_files = m_opaque_ptr->GetSupportFiles(); 179873a7a4bSJohnny Chen return support_files.FindFileIndex(start_idx, sb_file.ref(), full); 180873a7a4bSJohnny Chen } 181873a7a4bSJohnny Chen return 0; 182873a7a4bSJohnny Chen } 183873a7a4bSJohnny Chen 184b9c1b51eSKate Stone lldb::LanguageType SBCompileUnit::GetLanguage() { 1856cd8e0c9SEnrico Granata if (m_opaque_ptr) 1866cd8e0c9SEnrico Granata return m_opaque_ptr->GetLanguage(); 1876cd8e0c9SEnrico Granata return lldb::eLanguageTypeUnknown; 1886cd8e0c9SEnrico Granata } 1896cd8e0c9SEnrico Granata 190b9c1b51eSKate Stone bool SBCompileUnit::IsValid() const { return m_opaque_ptr != NULL; } 19130fdc8d8SChris Lattner 192b9c1b51eSKate Stone bool SBCompileUnit::operator==(const SBCompileUnit &rhs) const { 1936611103cSGreg Clayton return m_opaque_ptr == rhs.m_opaque_ptr; 19430fdc8d8SChris Lattner } 19530fdc8d8SChris Lattner 196b9c1b51eSKate Stone bool SBCompileUnit::operator!=(const SBCompileUnit &rhs) const { 1976611103cSGreg Clayton return m_opaque_ptr != rhs.m_opaque_ptr; 19830fdc8d8SChris Lattner } 19930fdc8d8SChris Lattner 200b9c1b51eSKate Stone const lldb_private::CompileUnit *SBCompileUnit::operator->() const { 2016611103cSGreg Clayton return m_opaque_ptr; 20230fdc8d8SChris Lattner } 20330fdc8d8SChris Lattner 204b9c1b51eSKate Stone const lldb_private::CompileUnit &SBCompileUnit::operator*() const { 2056611103cSGreg Clayton return *m_opaque_ptr; 20630fdc8d8SChris Lattner } 207dde9cff3SCaroline Tice 208b9c1b51eSKate Stone lldb_private::CompileUnit *SBCompileUnit::get() { return m_opaque_ptr; } 20972eff18aSGreg Clayton 210b9c1b51eSKate Stone void SBCompileUnit::reset(lldb_private::CompileUnit *lldb_object_ptr) { 21172eff18aSGreg Clayton m_opaque_ptr = lldb_object_ptr; 21272eff18aSGreg Clayton } 21372eff18aSGreg Clayton 214b9c1b51eSKate Stone bool SBCompileUnit::GetDescription(SBStream &description) { 215da7bc7d0SGreg Clayton Stream &strm = description.ref(); 216da7bc7d0SGreg Clayton 217b9c1b51eSKate Stone if (m_opaque_ptr) { 218da7bc7d0SGreg Clayton m_opaque_ptr->Dump(&strm, false); 219b9c1b51eSKate Stone } else 220da7bc7d0SGreg Clayton strm.PutCString("No value"); 221dde9cff3SCaroline Tice 222dde9cff3SCaroline Tice return true; 223dde9cff3SCaroline Tice } 224