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/Log.h" 14f02500c7SGreg Clayton #include "lldb/Core/Module.h" 1530fdc8d8SChris Lattner #include "lldb/Symbol/CompileUnit.h" 1630fdc8d8SChris Lattner #include "lldb/Symbol/LineEntry.h" 1730fdc8d8SChris Lattner #include "lldb/Symbol/LineTable.h" 18f02500c7SGreg Clayton #include "lldb/Symbol/SymbolVendor.h" 19f02500c7SGreg Clayton #include "lldb/Symbol/Type.h" 2030fdc8d8SChris Lattner 2130fdc8d8SChris Lattner using namespace lldb; 2230fdc8d8SChris Lattner using namespace lldb_private; 2330fdc8d8SChris Lattner 2430fdc8d8SChris Lattner 2530fdc8d8SChris Lattner SBCompileUnit::SBCompileUnit () : 266611103cSGreg Clayton m_opaque_ptr (NULL) 2730fdc8d8SChris Lattner { 2830fdc8d8SChris Lattner } 2930fdc8d8SChris Lattner 3030fdc8d8SChris Lattner SBCompileUnit::SBCompileUnit (lldb_private::CompileUnit *lldb_object_ptr) : 316611103cSGreg Clayton m_opaque_ptr (lldb_object_ptr) 3230fdc8d8SChris Lattner { 3330fdc8d8SChris Lattner } 3430fdc8d8SChris Lattner 35efabb123SGreg Clayton SBCompileUnit::SBCompileUnit(const SBCompileUnit &rhs) : 36efabb123SGreg Clayton m_opaque_ptr (rhs.m_opaque_ptr) 37efabb123SGreg Clayton { 38efabb123SGreg Clayton } 39efabb123SGreg Clayton 40efabb123SGreg Clayton const SBCompileUnit & 41efabb123SGreg Clayton SBCompileUnit::operator = (const SBCompileUnit &rhs) 42efabb123SGreg Clayton { 43efabb123SGreg Clayton m_opaque_ptr = rhs.m_opaque_ptr; 44efabb123SGreg Clayton return *this; 45efabb123SGreg Clayton } 46efabb123SGreg Clayton 47efabb123SGreg Clayton 4830fdc8d8SChris Lattner SBCompileUnit::~SBCompileUnit () 4930fdc8d8SChris Lattner { 506611103cSGreg Clayton m_opaque_ptr = NULL; 5130fdc8d8SChris Lattner } 5230fdc8d8SChris Lattner 5330fdc8d8SChris Lattner SBFileSpec 5430fdc8d8SChris Lattner SBCompileUnit::GetFileSpec () const 5530fdc8d8SChris Lattner { 5630fdc8d8SChris Lattner SBFileSpec file_spec; 576611103cSGreg Clayton if (m_opaque_ptr) 586611103cSGreg Clayton file_spec.SetFileSpec(*m_opaque_ptr); 5930fdc8d8SChris Lattner return file_spec; 6030fdc8d8SChris Lattner } 6130fdc8d8SChris Lattner 6230fdc8d8SChris Lattner uint32_t 6330fdc8d8SChris Lattner SBCompileUnit::GetNumLineEntries () const 6430fdc8d8SChris Lattner { 656611103cSGreg Clayton if (m_opaque_ptr) 6630fdc8d8SChris Lattner { 676611103cSGreg Clayton LineTable *line_table = m_opaque_ptr->GetLineTable (); 6830fdc8d8SChris Lattner if (line_table) 6930fdc8d8SChris Lattner return line_table->GetSize(); 7030fdc8d8SChris Lattner } 7130fdc8d8SChris Lattner return 0; 7230fdc8d8SChris Lattner } 7330fdc8d8SChris Lattner 7430fdc8d8SChris Lattner SBLineEntry 7530fdc8d8SChris Lattner SBCompileUnit::GetLineEntryAtIndex (uint32_t idx) const 7630fdc8d8SChris Lattner { 775160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 78ceb6b139SCaroline Tice 7930fdc8d8SChris Lattner SBLineEntry sb_line_entry; 806611103cSGreg Clayton if (m_opaque_ptr) 8130fdc8d8SChris Lattner { 826611103cSGreg Clayton LineTable *line_table = m_opaque_ptr->GetLineTable (); 8330fdc8d8SChris Lattner if (line_table) 8430fdc8d8SChris Lattner { 8530fdc8d8SChris Lattner LineEntry line_entry; 8630fdc8d8SChris Lattner if (line_table->GetLineEntryAtIndex(idx, line_entry)) 8730fdc8d8SChris Lattner sb_line_entry.SetLineEntry(line_entry); 8830fdc8d8SChris Lattner } 8930fdc8d8SChris Lattner } 90ceb6b139SCaroline Tice 91ceb6b139SCaroline Tice if (log) 92ceb6b139SCaroline Tice { 93ceb6b139SCaroline Tice SBStream sstr; 94ceb6b139SCaroline Tice sb_line_entry.GetDescription (sstr); 95cfd1acedSGreg Clayton log->Printf ("SBCompileUnit(%p)::GetLineEntryAtIndex (idx=%u) => SBLineEntry(%p): '%s'", 96*324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_ptr), idx, 97*324a1036SSaleem Abdulrasool static_cast<void*>(sb_line_entry.get()), sstr.GetData()); 98ceb6b139SCaroline Tice } 99ceb6b139SCaroline Tice 10030fdc8d8SChris Lattner return sb_line_entry; 10130fdc8d8SChris Lattner } 10230fdc8d8SChris Lattner 10330fdc8d8SChris Lattner uint32_t 10430fdc8d8SChris Lattner SBCompileUnit::FindLineEntryIndex (uint32_t start_idx, uint32_t line, SBFileSpec *inline_file_spec) const 10530fdc8d8SChris Lattner { 10687df91b8SJim Ingham const bool exact = true; 10787df91b8SJim Ingham return FindLineEntryIndex (start_idx, line, inline_file_spec, exact); 10887df91b8SJim Ingham } 10987df91b8SJim Ingham 11087df91b8SJim Ingham uint32_t 11187df91b8SJim Ingham SBCompileUnit::FindLineEntryIndex (uint32_t start_idx, uint32_t line, SBFileSpec *inline_file_spec, bool exact) const 11287df91b8SJim Ingham { 1135160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 114ceb6b139SCaroline Tice 115cfd1acedSGreg Clayton uint32_t index = UINT32_MAX; 1166611103cSGreg Clayton if (m_opaque_ptr) 11730fdc8d8SChris Lattner { 11830fdc8d8SChris Lattner FileSpec file_spec; 11930fdc8d8SChris Lattner if (inline_file_spec && inline_file_spec->IsValid()) 12030fdc8d8SChris Lattner file_spec = inline_file_spec->ref(); 12130fdc8d8SChris Lattner else 1226611103cSGreg Clayton file_spec = *m_opaque_ptr; 12330fdc8d8SChris Lattner 124cfd1acedSGreg Clayton index = m_opaque_ptr->FindLineEntry (start_idx, 12530fdc8d8SChris Lattner line, 12630fdc8d8SChris Lattner inline_file_spec ? inline_file_spec->get() : NULL, 12787df91b8SJim Ingham exact, 12830fdc8d8SChris Lattner NULL); 12930fdc8d8SChris Lattner } 130ceb6b139SCaroline Tice 131ceb6b139SCaroline Tice if (log) 132750cd175SCaroline Tice { 133750cd175SCaroline Tice SBStream sstr; 134cfd1acedSGreg Clayton if (index == UINT32_MAX) 135cfd1acedSGreg Clayton { 136cfd1acedSGreg Clayton log->Printf ("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, line=%u, SBFileSpec(%p)) => NOT FOUND", 137*324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_ptr), start_idx, line, 138*324a1036SSaleem Abdulrasool inline_file_spec 139*324a1036SSaleem Abdulrasool ? static_cast<const void*>(inline_file_spec->get()) 140*324a1036SSaleem Abdulrasool : NULL); 141cfd1acedSGreg Clayton } 142cfd1acedSGreg Clayton else 143cfd1acedSGreg Clayton { 144cfd1acedSGreg Clayton log->Printf ("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, line=%u, SBFileSpec(%p)) => %u", 145*324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_ptr), start_idx, line, 146*324a1036SSaleem Abdulrasool inline_file_spec 147*324a1036SSaleem Abdulrasool ? static_cast<const void*>(inline_file_spec->get()) 148*324a1036SSaleem Abdulrasool : NULL, 149*324a1036SSaleem Abdulrasool index); 150cfd1acedSGreg Clayton } 151750cd175SCaroline Tice } 152ceb6b139SCaroline Tice 153cfd1acedSGreg Clayton return index; 15430fdc8d8SChris Lattner } 15530fdc8d8SChris Lattner 156873a7a4bSJohnny Chen uint32_t 157873a7a4bSJohnny Chen SBCompileUnit::GetNumSupportFiles () const 158873a7a4bSJohnny Chen { 159873a7a4bSJohnny Chen if (m_opaque_ptr) 160873a7a4bSJohnny Chen { 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 167f02500c7SGreg Clayton 168f02500c7SGreg Clayton 169f02500c7SGreg Clayton lldb::SBTypeList 170f02500c7SGreg Clayton SBCompileUnit::GetTypes (uint32_t type_mask) 171f02500c7SGreg Clayton { 172f02500c7SGreg Clayton SBTypeList sb_type_list; 173f02500c7SGreg Clayton 174f02500c7SGreg Clayton if (m_opaque_ptr) 175f02500c7SGreg Clayton { 176f02500c7SGreg Clayton ModuleSP module_sp (m_opaque_ptr->GetModule()); 177f02500c7SGreg Clayton if (module_sp) 178f02500c7SGreg Clayton { 179f02500c7SGreg Clayton SymbolVendor* vendor = module_sp->GetSymbolVendor(); 180f02500c7SGreg Clayton if (vendor) 181f02500c7SGreg Clayton { 182f02500c7SGreg Clayton TypeList type_list; 183f02500c7SGreg Clayton vendor->GetTypes (m_opaque_ptr, type_mask, type_list); 184f02500c7SGreg Clayton sb_type_list.m_opaque_ap->Append(type_list); 185f02500c7SGreg Clayton } 186f02500c7SGreg Clayton } 187f02500c7SGreg Clayton } 188f02500c7SGreg Clayton return sb_type_list; 189f02500c7SGreg Clayton } 190f02500c7SGreg Clayton 191f02500c7SGreg Clayton 192f02500c7SGreg Clayton 193f02500c7SGreg Clayton 194873a7a4bSJohnny Chen SBFileSpec 195873a7a4bSJohnny Chen SBCompileUnit::GetSupportFileAtIndex (uint32_t idx) const 196873a7a4bSJohnny Chen { 1975160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 198873a7a4bSJohnny Chen 199873a7a4bSJohnny Chen SBFileSpec sb_file_spec; 200873a7a4bSJohnny Chen if (m_opaque_ptr) 201873a7a4bSJohnny Chen { 202873a7a4bSJohnny Chen FileSpecList &support_files = m_opaque_ptr->GetSupportFiles (); 203873a7a4bSJohnny Chen FileSpec file_spec = support_files.GetFileSpecAtIndex(idx); 204873a7a4bSJohnny Chen sb_file_spec.SetFileSpec(file_spec); 205873a7a4bSJohnny Chen } 206873a7a4bSJohnny Chen 207873a7a4bSJohnny Chen if (log) 208873a7a4bSJohnny Chen { 209873a7a4bSJohnny Chen SBStream sstr; 210873a7a4bSJohnny Chen sb_file_spec.GetDescription (sstr); 211873a7a4bSJohnny Chen log->Printf ("SBCompileUnit(%p)::GetGetFileSpecAtIndex (idx=%u) => SBFileSpec(%p): '%s'", 212*324a1036SSaleem Abdulrasool static_cast<void*>(m_opaque_ptr), idx, 213*324a1036SSaleem Abdulrasool static_cast<const void*>(sb_file_spec.get()), 214*324a1036SSaleem Abdulrasool sstr.GetData()); 215873a7a4bSJohnny Chen } 216873a7a4bSJohnny Chen 217873a7a4bSJohnny Chen return sb_file_spec; 218873a7a4bSJohnny Chen } 219873a7a4bSJohnny Chen 220873a7a4bSJohnny Chen uint32_t 221873a7a4bSJohnny Chen SBCompileUnit::FindSupportFileIndex (uint32_t start_idx, const SBFileSpec &sb_file, bool full) 222873a7a4bSJohnny Chen { 223873a7a4bSJohnny Chen if (m_opaque_ptr) 224873a7a4bSJohnny Chen { 225873a7a4bSJohnny Chen FileSpecList &support_files = m_opaque_ptr->GetSupportFiles (); 226873a7a4bSJohnny Chen return support_files.FindFileIndex(start_idx, sb_file.ref(), full); 227873a7a4bSJohnny Chen } 228873a7a4bSJohnny Chen return 0; 229873a7a4bSJohnny Chen } 230873a7a4bSJohnny Chen 23130fdc8d8SChris Lattner bool 23230fdc8d8SChris Lattner SBCompileUnit::IsValid () const 23330fdc8d8SChris Lattner { 2346611103cSGreg Clayton return m_opaque_ptr != NULL; 23530fdc8d8SChris Lattner } 23630fdc8d8SChris Lattner 23730fdc8d8SChris Lattner bool 23830fdc8d8SChris Lattner SBCompileUnit::operator == (const SBCompileUnit &rhs) const 23930fdc8d8SChris Lattner { 2406611103cSGreg Clayton return m_opaque_ptr == rhs.m_opaque_ptr; 24130fdc8d8SChris Lattner } 24230fdc8d8SChris Lattner 24330fdc8d8SChris Lattner bool 24430fdc8d8SChris Lattner SBCompileUnit::operator != (const SBCompileUnit &rhs) const 24530fdc8d8SChris Lattner { 2466611103cSGreg Clayton return m_opaque_ptr != rhs.m_opaque_ptr; 24730fdc8d8SChris Lattner } 24830fdc8d8SChris Lattner 24930fdc8d8SChris Lattner const lldb_private::CompileUnit * 25030fdc8d8SChris Lattner SBCompileUnit::operator->() const 25130fdc8d8SChris Lattner { 2526611103cSGreg Clayton return m_opaque_ptr; 25330fdc8d8SChris Lattner } 25430fdc8d8SChris Lattner 25530fdc8d8SChris Lattner const lldb_private::CompileUnit & 25630fdc8d8SChris Lattner SBCompileUnit::operator*() const 25730fdc8d8SChris Lattner { 2586611103cSGreg Clayton return *m_opaque_ptr; 25930fdc8d8SChris Lattner } 260dde9cff3SCaroline Tice 2618f7180b1SGreg Clayton lldb_private::CompileUnit * 2628f7180b1SGreg Clayton SBCompileUnit::get () 263750cd175SCaroline Tice { 264750cd175SCaroline Tice return m_opaque_ptr; 265750cd175SCaroline Tice } 26672eff18aSGreg Clayton 26772eff18aSGreg Clayton void 26872eff18aSGreg Clayton SBCompileUnit::reset (lldb_private::CompileUnit *lldb_object_ptr) 26972eff18aSGreg Clayton { 27072eff18aSGreg Clayton m_opaque_ptr = lldb_object_ptr; 27172eff18aSGreg Clayton } 27272eff18aSGreg Clayton 273750cd175SCaroline Tice 274dde9cff3SCaroline Tice bool 275dde9cff3SCaroline Tice SBCompileUnit::GetDescription (SBStream &description) 276dde9cff3SCaroline Tice { 277da7bc7d0SGreg Clayton Stream &strm = description.ref(); 278da7bc7d0SGreg Clayton 279dde9cff3SCaroline Tice if (m_opaque_ptr) 280dde9cff3SCaroline Tice { 281da7bc7d0SGreg Clayton m_opaque_ptr->Dump (&strm, false); 282dde9cff3SCaroline Tice } 283dde9cff3SCaroline Tice else 284da7bc7d0SGreg Clayton strm.PutCString ("No value"); 285dde9cff3SCaroline Tice 286dde9cff3SCaroline Tice return true; 287dde9cff3SCaroline Tice } 288