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"
1330fdc8d8SChris Lattner #include "lldb/Symbol/CompileUnit.h"
1430fdc8d8SChris Lattner #include "lldb/Symbol/LineEntry.h"
1530fdc8d8SChris Lattner #include "lldb/Symbol/LineTable.h"
16ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
1730fdc8d8SChris Lattner 
1830fdc8d8SChris Lattner using namespace lldb;
1930fdc8d8SChris Lattner using namespace lldb_private;
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner 
2230fdc8d8SChris Lattner SBCompileUnit::SBCompileUnit () :
236611103cSGreg Clayton     m_opaque_ptr (NULL)
2430fdc8d8SChris Lattner {
2530fdc8d8SChris Lattner }
2630fdc8d8SChris Lattner 
2730fdc8d8SChris Lattner SBCompileUnit::SBCompileUnit (lldb_private::CompileUnit *lldb_object_ptr) :
286611103cSGreg Clayton     m_opaque_ptr (lldb_object_ptr)
2930fdc8d8SChris Lattner {
3030fdc8d8SChris Lattner }
3130fdc8d8SChris Lattner 
3230fdc8d8SChris Lattner SBCompileUnit::~SBCompileUnit ()
3330fdc8d8SChris Lattner {
346611103cSGreg Clayton     m_opaque_ptr = NULL;
3530fdc8d8SChris Lattner }
3630fdc8d8SChris Lattner 
3730fdc8d8SChris Lattner SBFileSpec
3830fdc8d8SChris Lattner SBCompileUnit::GetFileSpec () const
3930fdc8d8SChris Lattner {
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 
4630fdc8d8SChris Lattner uint32_t
4730fdc8d8SChris Lattner SBCompileUnit::GetNumLineEntries () const
4830fdc8d8SChris Lattner {
496611103cSGreg Clayton     if (m_opaque_ptr)
5030fdc8d8SChris Lattner     {
516611103cSGreg Clayton         LineTable *line_table = m_opaque_ptr->GetLineTable ();
5230fdc8d8SChris Lattner         if (line_table)
5330fdc8d8SChris Lattner             return line_table->GetSize();
5430fdc8d8SChris Lattner     }
5530fdc8d8SChris Lattner     return 0;
5630fdc8d8SChris Lattner }
5730fdc8d8SChris Lattner 
5830fdc8d8SChris Lattner SBLineEntry
5930fdc8d8SChris Lattner SBCompileUnit::GetLineEntryAtIndex (uint32_t idx) const
6030fdc8d8SChris Lattner {
61ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
62ceb6b139SCaroline Tice 
6330fdc8d8SChris Lattner     SBLineEntry sb_line_entry;
646611103cSGreg Clayton     if (m_opaque_ptr)
6530fdc8d8SChris Lattner     {
666611103cSGreg Clayton         LineTable *line_table = m_opaque_ptr->GetLineTable ();
6730fdc8d8SChris Lattner         if (line_table)
6830fdc8d8SChris Lattner         {
6930fdc8d8SChris Lattner             LineEntry line_entry;
7030fdc8d8SChris Lattner             if (line_table->GetLineEntryAtIndex(idx, line_entry))
7130fdc8d8SChris Lattner                 sb_line_entry.SetLineEntry(line_entry);
7230fdc8d8SChris Lattner         }
7330fdc8d8SChris Lattner     }
74ceb6b139SCaroline Tice 
75ceb6b139SCaroline Tice     if (log)
76ceb6b139SCaroline Tice     {
77ceb6b139SCaroline Tice         SBStream sstr;
78ceb6b139SCaroline Tice         sb_line_entry.GetDescription (sstr);
79*cfd1acedSGreg Clayton         log->Printf ("SBCompileUnit(%p)::GetLineEntryAtIndex (idx=%u) => SBLineEntry(%p): '%s'",
80*cfd1acedSGreg Clayton                      m_opaque_ptr, idx, sb_line_entry.get(), sstr.GetData());
81ceb6b139SCaroline Tice     }
82ceb6b139SCaroline Tice 
8330fdc8d8SChris Lattner     return sb_line_entry;
8430fdc8d8SChris Lattner }
8530fdc8d8SChris Lattner 
8630fdc8d8SChris Lattner uint32_t
8730fdc8d8SChris Lattner SBCompileUnit::FindLineEntryIndex (uint32_t start_idx, uint32_t line, SBFileSpec *inline_file_spec) const
8830fdc8d8SChris Lattner {
89ceb6b139SCaroline Tice     Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
90ceb6b139SCaroline Tice 
91*cfd1acedSGreg Clayton     uint32_t index = UINT32_MAX;
926611103cSGreg Clayton     if (m_opaque_ptr)
9330fdc8d8SChris Lattner     {
9430fdc8d8SChris Lattner         FileSpec file_spec;
9530fdc8d8SChris Lattner         if (inline_file_spec && inline_file_spec->IsValid())
9630fdc8d8SChris Lattner             file_spec = inline_file_spec->ref();
9730fdc8d8SChris Lattner         else
986611103cSGreg Clayton             file_spec = *m_opaque_ptr;
9930fdc8d8SChris Lattner 
100ceb6b139SCaroline Tice 
101*cfd1acedSGreg Clayton         index = m_opaque_ptr->FindLineEntry (start_idx,
10230fdc8d8SChris Lattner                                              line,
10330fdc8d8SChris Lattner                                              inline_file_spec ? inline_file_spec->get() : NULL,
10430fdc8d8SChris Lattner                                              NULL);
10530fdc8d8SChris Lattner     }
106ceb6b139SCaroline Tice 
107ceb6b139SCaroline Tice     if (log)
108750cd175SCaroline Tice     {
109750cd175SCaroline Tice         SBStream sstr;
110*cfd1acedSGreg Clayton         if (index == UINT32_MAX)
111*cfd1acedSGreg Clayton         {
112*cfd1acedSGreg Clayton             log->Printf ("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, line=%u, SBFileSpec(%p)) => NOT FOUND",
113*cfd1acedSGreg Clayton                          m_opaque_ptr, start_idx, line, inline_file_spec ? inline_file_spec->get() : NULL);
114*cfd1acedSGreg Clayton         }
115*cfd1acedSGreg Clayton         else
116*cfd1acedSGreg Clayton         {
117*cfd1acedSGreg Clayton             log->Printf ("SBCompileUnit(%p)::FindLineEntryIndex (start_idx=%u, line=%u, SBFileSpec(%p)) => %u",
118*cfd1acedSGreg Clayton                          m_opaque_ptr, start_idx, line, inline_file_spec ? inline_file_spec->get() : NULL, index);
119*cfd1acedSGreg Clayton         }
120750cd175SCaroline Tice     }
121ceb6b139SCaroline Tice 
122*cfd1acedSGreg Clayton     return index;
12330fdc8d8SChris Lattner }
12430fdc8d8SChris Lattner 
12530fdc8d8SChris Lattner bool
12630fdc8d8SChris Lattner SBCompileUnit::IsValid () const
12730fdc8d8SChris Lattner {
1286611103cSGreg Clayton     return m_opaque_ptr != NULL;
12930fdc8d8SChris Lattner }
13030fdc8d8SChris Lattner 
13130fdc8d8SChris Lattner bool
13230fdc8d8SChris Lattner SBCompileUnit::operator == (const SBCompileUnit &rhs) const
13330fdc8d8SChris Lattner {
1346611103cSGreg Clayton     return m_opaque_ptr == rhs.m_opaque_ptr;
13530fdc8d8SChris Lattner }
13630fdc8d8SChris Lattner 
13730fdc8d8SChris Lattner bool
13830fdc8d8SChris Lattner SBCompileUnit::operator != (const SBCompileUnit &rhs) const
13930fdc8d8SChris Lattner {
1406611103cSGreg Clayton     return m_opaque_ptr != rhs.m_opaque_ptr;
14130fdc8d8SChris Lattner }
14230fdc8d8SChris Lattner 
14330fdc8d8SChris Lattner const lldb_private::CompileUnit *
14430fdc8d8SChris Lattner SBCompileUnit::operator->() const
14530fdc8d8SChris Lattner {
1466611103cSGreg Clayton     return m_opaque_ptr;
14730fdc8d8SChris Lattner }
14830fdc8d8SChris Lattner 
14930fdc8d8SChris Lattner const lldb_private::CompileUnit &
15030fdc8d8SChris Lattner SBCompileUnit::operator*() const
15130fdc8d8SChris Lattner {
1526611103cSGreg Clayton     return *m_opaque_ptr;
15330fdc8d8SChris Lattner }
154dde9cff3SCaroline Tice 
155750cd175SCaroline Tice const lldb_private::CompileUnit *
156750cd175SCaroline Tice SBCompileUnit::get () const
157750cd175SCaroline Tice {
158750cd175SCaroline Tice     return m_opaque_ptr;
159750cd175SCaroline Tice }
160750cd175SCaroline Tice 
161dde9cff3SCaroline Tice bool
162dde9cff3SCaroline Tice SBCompileUnit::GetDescription (SBStream &description)
163dde9cff3SCaroline Tice {
164dde9cff3SCaroline Tice     if (m_opaque_ptr)
165dde9cff3SCaroline Tice     {
166dac97f31SCaroline Tice         description.ref();
167dde9cff3SCaroline Tice         m_opaque_ptr->Dump (description.get(), false);
168dde9cff3SCaroline Tice     }
169dde9cff3SCaroline Tice     else
170dde9cff3SCaroline Tice         description.Printf ("No Value");
171dde9cff3SCaroline Tice 
172dde9cff3SCaroline Tice     return true;
173dde9cff3SCaroline Tice }
174